diff --git a/res/content/base/entities/drop.json b/res/content/base/entities/drop.json index 9bf3dac7..348bffd2 100644 --- a/res/content/base/entities/drop.json +++ b/res/content/base/entities/drop.json @@ -3,7 +3,7 @@ "drop" ], "hitbox": [0.2, 0.125, 0.2], - "triggers": [ + "sensors": [ ["aabb", -0.2, -0.2, -0.2, 0.2, 0.2, 0.2], ["radius", 1.6] ], diff --git a/res/content/base/scripts/components/drop.lua b/res/content/base/scripts/components/drop.lua index 494a5345..95f74cf9 100644 --- a/res/content/base/scripts/components/drop.lua +++ b/res/content/base/scripts/components/drop.lua @@ -71,7 +71,7 @@ function on_fall() inair = true end -function on_trigger_enter(index, oid) +function on_sensor_enter(index, oid) local playerentity = player.get_entity(hud.get_player()):get_uid() if ready and oid == playerentity and index == 0 then entity:despawn() @@ -83,7 +83,7 @@ function on_trigger_enter(index, oid) end end -function on_trigger_exit(index, oid) +function on_sensor_exit(index, oid) if oid == target and index == 1 then target = -1 end diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 2e0cb4de..1bcebf4d 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -317,20 +317,20 @@ void ContentLoader::loadEntity(EntityDef& def, const std::string& name, const fs if (auto boxarr = root->list("hitbox")) { def.hitbox = glm::vec3(boxarr->num(0), boxarr->num(1), boxarr->num(2)); } - if (auto triggersarr = root->list("triggers")) { - for (size_t i = 0; i < triggersarr->size(); i++) { - if (auto triggerarr = triggersarr->list(i)) { - auto triggerType = triggerarr->str(0); - if (triggerType == "aabb") { - def.boxTriggers.push_back({i, { - {triggerarr->num(1), triggerarr->num(2), triggerarr->num(3)}, - {triggerarr->num(4), triggerarr->num(5), triggerarr->num(6)} + if (auto sensorsarr = root->list("sensors")) { + for (size_t i = 0; i < sensorsarr->size(); i++) { + if (auto sensorarr = sensorsarr->list(i)) { + auto sensorType = sensorarr->str(0); + if (sensorType == "aabb") { + def.boxSensors.push_back({i, { + {sensorarr->num(1), sensorarr->num(2), sensorarr->num(3)}, + {sensorarr->num(4), sensorarr->num(5), sensorarr->num(6)} }}); - } else if (triggerType == "radius") { - def.radialTriggers.push_back({i, triggerarr->num(1)}); + } else if (sensorType == "radius") { + def.radialSensors.push_back({i, sensorarr->num(1)}); } else { - logger.error() << name << ": trigger #" << i << " - unknown type " - << util::quote(triggerType); + logger.error() << name << ": sensor #" << i << " - unknown type " + << util::quote(sensorType); } } } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 6191d909..692a6cf8 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -318,8 +318,8 @@ void scripting::on_entity_spawn( funcsset.on_grounded = lua::hasfield(L, "on_grounded"); funcsset.on_fall = lua::hasfield(L, "on_fall"); funcsset.on_despawn = lua::hasfield(L, "on_despawn"); - funcsset.on_trigger_enter = lua::hasfield(L, "on_trigger_enter"); - funcsset.on_trigger_exit = lua::hasfield(L, "on_trigger_exit"); + funcsset.on_sensor_enter = lua::hasfield(L, "on_sensor_enter"); + funcsset.on_sensor_exit = lua::hasfield(L, "on_sensor_exit"); funcsset.on_save = lua::hasfield(L, "on_save"); lua::pop(L, 2); @@ -391,11 +391,11 @@ bool scripting::on_entity_save(const Entity& entity) { return true; } -void scripting::on_trigger_enter(const Entity& entity, size_t index, entityid_t oid) { +void scripting::on_sensor_enter(const Entity& entity, size_t index, entityid_t oid) { const auto& script = entity.getScripting(); for (auto& component : script.components) { - if (component->funcsset.on_trigger_enter) { - process_entity_callback(component->env, "on_trigger_enter", [index, oid](auto L) { + if (component->funcsset.on_sensor_enter) { + process_entity_callback(component->env, "on_sensor_enter", [index, oid](auto L) { lua::pushinteger(L, index); lua::pushinteger(L, oid); return 2; @@ -404,11 +404,11 @@ void scripting::on_trigger_enter(const Entity& entity, size_t index, entityid_t } } -void scripting::on_trigger_exit(const Entity& entity, size_t index, entityid_t oid) { +void scripting::on_sensor_exit(const Entity& entity, size_t index, entityid_t oid) { const auto& script = entity.getScripting(); for (auto& component : script.components) { - if (component->funcsset.on_trigger_exit) { - process_entity_callback(component->env, "on_trigger_exit", [index, oid](auto L) { + if (component->funcsset.on_sensor_exit) { + process_entity_callback(component->env, "on_sensor_exit", [index, oid](auto L) { lua::pushinteger(L, index); lua::pushinteger(L, oid); return 2; diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index dfbda4b3..d3e2354b 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -90,8 +90,8 @@ namespace scripting { bool on_entity_save(const Entity& entity); void on_entities_update(); void on_entities_render(); - void on_trigger_enter(const Entity& entity, size_t index, entityid_t oid); - void on_trigger_exit(const Entity& entity, size_t index, entityid_t oid); + void on_sensor_enter(const Entity& entity, size_t index, entityid_t oid); + void on_sensor_exit(const Entity& entity, size_t index, entityid_t oid); /// @brief Called on UI view show void on_ui_open( diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 675df87f..83ccb181 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -53,7 +53,7 @@ Entities::Entities(Level* level) : level(level) { } template -static triggercallback create_trigger_callback(Entities* entities) { +static sensorcallback create_sensor_callback(Entities* entities) { return [=](auto entityid, auto index, auto otherid) { if (auto entity = entities->get(entityid)) { if (entity->isValid()) { @@ -85,24 +85,24 @@ entityid_t Entities::spawn( const auto& tsf = registry.emplace( entity, position, glm::vec3(1.0f), glm::mat3(1.0f), glm::mat4(1.0f), true); auto& body = registry.emplace( - entity, true, Hitbox {def.bodyType, position, def.hitbox}, std::vector{}); + entity, true, Hitbox {def.bodyType, position, def.hitbox}, std::vector{}); - body.triggers.resize(def.radialTriggers.size() + def.boxTriggers.size()); - for (auto& [i, box] : def.boxTriggers) { - TriggerParams params {}; + body.sensors.resize(def.radialSensors.size() + def.boxSensors.size()); + for (auto& [i, box] : def.boxSensors) { + SensorParams params {}; params.aabb = box; - body.triggers[i] = Trigger { - true, TriggerType::AABB, i, id, params, params, {}, {}, - create_trigger_callback(this), - create_trigger_callback(this)}; + body.sensors[i] = Sensor { + true, SensorType::AABB, i, id, params, params, {}, {}, + create_sensor_callback(this), + create_sensor_callback(this)}; } - for (auto& [i, radius] : def.radialTriggers) { - TriggerParams params {}; + for (auto& [i, radius] : def.radialSensors) { + SensorParams params {}; params.radial = glm::vec4(radius); - body.triggers[i] = Trigger { - true, TriggerType::RADIUS, i, id, params, params, {}, {}, - create_trigger_callback(this), - create_trigger_callback(this)}; + body.sensors[i] = Sensor { + true, SensorType::RADIUS, i, id, params, params, {}, {}, + create_sensor_callback(this), + create_sensor_callback(this)}; } auto& scripting = registry.emplace(entity); entities[id] = entity; @@ -247,7 +247,7 @@ void Entities::preparePhysics() { frameid++; auto view = registry.view(); auto physics = level->physics.get(); - std::vector triggers; + std::vector sensors; for (auto [entity, eid, transform, rigidbody] : view.each()) { if (!rigidbody.enabled) { continue; @@ -256,34 +256,34 @@ void Entities::preparePhysics() { if ((eid.uid + frameid) % 3 != 0) { continue; } - for (size_t i = 0; i < rigidbody.triggers.size(); i++) { - auto& trigger = rigidbody.triggers[i]; - for (auto oid : trigger.prevEntered) { - if (trigger.nextEntered.find(oid) == trigger.nextEntered.end()) { - trigger.exitCallback(trigger.entity, i, oid); + 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); } } - trigger.prevEntered = trigger.nextEntered; - trigger.nextEntered.clear(); + sensor.prevEntered = sensor.nextEntered; + sensor.nextEntered.clear(); - switch (trigger.type) { - case TriggerType::AABB: - trigger.calculated.aabb = trigger.params.aabb; - trigger.calculated.aabb.transform(transform.combined); + switch (sensor.type) { + case SensorType::AABB: + sensor.calculated.aabb = sensor.params.aabb; + sensor.calculated.aabb.transform(transform.combined); break; - case TriggerType::RADIUS: - trigger.calculated.radial = glm::vec4( + case SensorType::RADIUS: + sensor.calculated.radial = glm::vec4( rigidbody.hitbox.position.x, rigidbody.hitbox.position.y, rigidbody.hitbox.position.z, - trigger.params.radial.w* - trigger.params.radial.w); + sensor.params.radial.w* + sensor.params.radial.w); break; } - triggers.push_back(&trigger); + sensors.push_back(&sensor); } } - physics->setTriggers(std::move(triggers)); + physics->setSensors(std::move(sensors)); } void Entities::updatePhysics(float delta) { @@ -337,12 +337,12 @@ void Entities::renderDebug(LineBatch& batch, const Frustum& frustum) { } batch.box(hitbox.position, hitbox.halfsize * 2.0f, glm::vec4(1.0f)); - for (auto& trigger : rigidbody.triggers) { - if (trigger.type != TriggerType::AABB) + for (auto& sensor : rigidbody.sensors) { + if (sensor.type != SensorType::AABB) continue; batch.box( - trigger.calculated.aabb.center(), - trigger.calculated.aabb.size(), + sensor.calculated.aabb.center(), + sensor.calculated.aabb.size(), glm::vec4(1.0f, 1.0f, 0.0f, 1.0f)); } } diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index f54ebcda..969403da 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -19,8 +19,8 @@ struct entity_funcs_set { bool on_despawn : 1; bool on_grounded : 1; bool on_fall : 1; - bool on_trigger_enter : 1; - bool on_trigger_exit : 1; + bool on_sensor_enter : 1; + bool on_sensor_exit : 1; bool on_save : 1; }; @@ -64,7 +64,7 @@ struct Transform { struct Rigidbody { bool enabled = true; Hitbox hitbox; - std::vector triggers; + std::vector sensors; }; struct UserComponent { diff --git a/src/objects/EntityDef.hpp b/src/objects/EntityDef.hpp index 5ac16de1..83bf579c 100644 --- a/src/objects/EntityDef.hpp +++ b/src/objects/EntityDef.hpp @@ -21,8 +21,8 @@ struct EntityDef { BodyType bodyType = BodyType::DYNAMIC; glm::vec3 hitbox {0.5f}; - std::vector> boxTriggers {}; - std::vector> radialTriggers {}; + std::vector> boxSensors {}; + std::vector> radialSensors {}; std::string rigName = name; struct { diff --git a/src/physics/Hitbox.hpp b/src/physics/Hitbox.hpp index 3cc355c8..18351c29 100644 --- a/src/physics/Hitbox.hpp +++ b/src/physics/Hitbox.hpp @@ -10,32 +10,32 @@ #include #include -enum class TriggerType { +enum class SensorType { AABB, RADIUS, }; -union TriggerParams { +union SensorParams { AABB aabb; glm::vec4 radial; // x,y,z calculated entity coords + w - radius - constexpr TriggerParams() : aabb() { + constexpr SensorParams() : aabb() { } }; -using triggercallback = std::function; +using sensorcallback = std::function; -struct Trigger { +struct Sensor { bool enabled = true; - TriggerType type; + SensorType type; size_t index; entityid_t entity; - TriggerParams params; - TriggerParams calculated; + SensorParams params; + SensorParams calculated; std::set prevEntered; std::set nextEntered; - triggercallback enterCallback; - triggercallback exitCallback; + sensorcallback enterCallback; + sensorcallback exitCallback; }; enum class BodyType { diff --git a/src/physics/PhysicsSolver.cpp b/src/physics/PhysicsSolver.cpp index d513e0e7..e5bbff38 100644 --- a/src/physics/PhysicsSolver.cpp +++ b/src/physics/PhysicsSolver.cpp @@ -87,28 +87,28 @@ void PhysicsSolver::step( AABB aabb; aabb.a = hitbox->position - hitbox->halfsize; aabb.b = hitbox->position + hitbox->halfsize; - for (size_t i = 0; i < triggers.size(); i++) { - auto& trigger = *triggers[i]; - if (trigger.entity == entity) { + for (size_t i = 0; i < sensors.size(); i++) { + auto& sensor = *sensors[i]; + if (sensor.entity == entity) { continue; } bool triggered = false; - switch (trigger.type) { - case TriggerType::AABB: - triggered = aabb.intersect(trigger.calculated.aabb); + switch (sensor.type) { + case SensorType::AABB: + triggered = aabb.intersect(sensor.calculated.aabb); break; - case TriggerType::RADIUS: + case SensorType::RADIUS: triggered = glm::distance2( - hitbox->position, glm::vec3(trigger.calculated.radial)) - < trigger.calculated.radial.w; + hitbox->position, glm::vec3(sensor.calculated.radial)) + < sensor.calculated.radial.w; break; } if (triggered) { - if (trigger.prevEntered.find(entity) == trigger.prevEntered.end()) { - trigger.enterCallback(trigger.entity, trigger.index, entity); + if (sensor.prevEntered.find(entity) == sensor.prevEntered.end()) { + sensor.enterCallback(sensor.entity, sensor.index, entity); } - trigger.nextEntered.insert(entity); + sensor.nextEntered.insert(entity); } } } diff --git a/src/physics/PhysicsSolver.hpp b/src/physics/PhysicsSolver.hpp index bb8e31a9..ab0c964c 100644 --- a/src/physics/PhysicsSolver.hpp +++ b/src/physics/PhysicsSolver.hpp @@ -11,11 +11,11 @@ class Block; class Chunks; -struct Trigger; +struct Sensor; class PhysicsSolver { glm::vec3 gravity; - std::vector triggers; + std::vector sensors; public: PhysicsSolver(glm::vec3 gravity); void step( @@ -36,8 +36,8 @@ public: bool isBlockInside(int x, int y, int z, Hitbox* hitbox); bool isBlockInside(int x, int y, int z, Block* def, blockstate state, Hitbox* hitbox); - void setTriggers(std::vector triggers) { - this->triggers = std::move(triggers); + void setSensors(std::vector sensors) { + this->sensors = std::move(sensors); } };