update Entities::preparePhysics - ticks are delta-based now
This commit is contained in:
parent
eedce588b1
commit
e008832ebb
@ -56,7 +56,7 @@ void Entity::setRig(const rigging::SkeletonConfig* rigConfig) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Entities::Entities(Level* level) : level(level) {
|
Entities::Entities(Level* level) : level(level), sensorsTickClock(20, 3) {
|
||||||
}
|
}
|
||||||
|
|
||||||
template<void(*callback)(const Entity&, size_t, entityid_t)>
|
template<void(*callback)(const Entity&, size_t, entityid_t)>
|
||||||
@ -350,52 +350,60 @@ void Entities::clean() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entities::preparePhysics() {
|
void Entities::updateSensors(
|
||||||
static uint64_t frameid = 0;
|
Rigidbody& body, const Transform& tsf, std::vector<Sensor*>& sensors
|
||||||
frameid++;
|
) {
|
||||||
auto view = registry.view<EntityId, Transform, Rigidbody>();
|
for (size_t i = 0; i < body.sensors.size(); i++) {
|
||||||
auto physics = level->physics.get();
|
auto& sensor = body.sensors[i];
|
||||||
std::vector<Sensor*> sensors;
|
for (auto oid : sensor.prevEntered) {
|
||||||
for (auto [entity, eid, transform, rigidbody] : view.each()) {
|
if (sensor.nextEntered.find(oid) == sensor.nextEntered.end()) {
|
||||||
if (!rigidbody.enabled) {
|
sensor.exitCallback(sensor.entity, i, oid);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// TODO: temporary optimization until threaded solution
|
|
||||||
if ((eid.uid + frameid) % 3 != 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (size_t i = 0; i < rigidbody.sensors.size(); i++) {
|
|
||||||
auto& sensor = rigidbody.sensors[i];
|
|
||||||
for (auto oid : sensor.prevEntered) {
|
|
||||||
if (sensor.nextEntered.find(oid) == sensor.nextEntered.end()) {
|
|
||||||
sensor.exitCallback(sensor.entity, i, oid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
sensor.prevEntered = sensor.nextEntered;
|
}
|
||||||
sensor.nextEntered.clear();
|
sensor.prevEntered = sensor.nextEntered;
|
||||||
|
sensor.nextEntered.clear();
|
||||||
|
|
||||||
switch (sensor.type) {
|
switch (sensor.type) {
|
||||||
case SensorType::AABB:
|
case SensorType::AABB:
|
||||||
sensor.calculated.aabb = sensor.params.aabb;
|
sensor.calculated.aabb = sensor.params.aabb;
|
||||||
sensor.calculated.aabb.transform(transform.combined);
|
sensor.calculated.aabb.transform(tsf.combined);
|
||||||
break;
|
break;
|
||||||
case SensorType::RADIUS:
|
case SensorType::RADIUS:
|
||||||
sensor.calculated.radial = glm::vec4(
|
sensor.calculated.radial = glm::vec4(
|
||||||
rigidbody.hitbox.position.x,
|
body.hitbox.position.x,
|
||||||
rigidbody.hitbox.position.y,
|
body.hitbox.position.y,
|
||||||
rigidbody.hitbox.position.z,
|
body.hitbox.position.z,
|
||||||
sensor.params.radial.w*
|
sensor.params.radial.w*
|
||||||
sensor.params.radial.w);
|
sensor.params.radial.w);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
sensors.push_back(&sensor);
|
|
||||||
}
|
}
|
||||||
|
sensors.push_back(&sensor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Entities::preparePhysics(float delta) {
|
||||||
|
if (sensorsTickClock.update(delta)) {
|
||||||
|
auto part = sensorsTickClock.getPart();
|
||||||
|
auto parts = sensorsTickClock.getParts();
|
||||||
|
|
||||||
|
auto view = registry.view<EntityId, Transform, Rigidbody>();
|
||||||
|
auto physics = level->physics.get();
|
||||||
|
std::vector<Sensor*> sensors;
|
||||||
|
for (auto [entity, eid, transform, rigidbody] : view.each()) {
|
||||||
|
if (!rigidbody.enabled) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((eid.uid + part) % parts != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
updateSensors(rigidbody, transform, sensors);
|
||||||
|
}
|
||||||
|
physics->setSensors(std::move(sensors));
|
||||||
}
|
}
|
||||||
physics->setSensors(std::move(sensors));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entities::updatePhysics(float delta) {
|
void Entities::updatePhysics(float delta) {
|
||||||
preparePhysics();
|
preparePhysics(delta);
|
||||||
|
|
||||||
auto view = registry.view<EntityId, Transform, Rigidbody>();
|
auto view = registry.view<EntityId, Transform, Rigidbody>();
|
||||||
auto physics = level->physics.get();
|
auto physics = level->physics.get();
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
#include "../typedefs.hpp"
|
#include "../typedefs.hpp"
|
||||||
#include "../physics/Hitbox.hpp"
|
#include "../physics/Hitbox.hpp"
|
||||||
#include "../data/dynamic.hpp"
|
#include "../data/dynamic.hpp"
|
||||||
|
#include "../util/Clock.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -161,8 +162,12 @@ class Entities {
|
|||||||
std::unordered_map<entityid_t, entt::entity> entities;
|
std::unordered_map<entityid_t, entt::entity> entities;
|
||||||
std::unordered_map<entt::entity, entityid_t> uids;
|
std::unordered_map<entt::entity, entityid_t> uids;
|
||||||
entityid_t nextID = 1;
|
entityid_t nextID = 1;
|
||||||
|
util::Clock sensorsTickClock;
|
||||||
|
|
||||||
void preparePhysics();
|
void updateSensors(
|
||||||
|
Rigidbody& body, const Transform& tsf, std::vector<Sensor*>& sensors
|
||||||
|
);
|
||||||
|
void preparePhysics(float delta);
|
||||||
public:
|
public:
|
||||||
struct RaycastResult {
|
struct RaycastResult {
|
||||||
entityid_t entity;
|
entityid_t entity;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user