update Entities::preparePhysics - ticks are delta-based now

This commit is contained in:
MihailRis 2024-07-19 21:23:58 +03:00
parent eedce588b1
commit e008832ebb
2 changed files with 54 additions and 41 deletions

View File

@ -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();

View File

@ -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;