diff --git a/res/content/base/entities/drop.json b/res/content/base/entities/drop.json index e895490b..c0b8db42 100644 --- a/res/content/base/entities/drop.json +++ b/res/content/base/entities/drop.json @@ -1,3 +1,3 @@ { - "hitbox": [0.2, 0.15, 0.2] + "hitbox": [0.2, 0.2, 0.2] } diff --git a/res/content/base/models/item.mtl b/res/content/base/models/item.mtl new file mode 100644 index 00000000..379df14c --- /dev/null +++ b/res/content/base/models/item.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material +Ns 96.078431 +Ka 1.000000 1.000000 1.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.000000 +d 1.000000 +illum 2 diff --git a/res/content/base/models/item.obj b/res/content/base/models/item.obj new file mode 100644 index 00000000..ec28ab68 --- /dev/null +++ b/res/content/base/models/item.obj @@ -0,0 +1,62 @@ +# Blender v2.79 (sub 0) OBJ File: '' +# www.blender.org +mtllib item.mtl +o Cube +v -0.282501 -0.015663 -0.282501 +v -0.282501 -0.015663 0.282500 +v 0.282500 -0.015663 0.282501 +v 0.282501 -0.015663 -0.282500 +v 0.282501 0.021634 -0.282500 +v 0.282500 0.021634 0.282501 +v -0.282501 0.021634 0.282500 +v -0.282501 0.021634 -0.282501 +v -0.282501 0.021634 -0.282501 +v -0.282501 0.021634 0.282500 +v 0.282500 0.021634 0.282501 +v 0.282501 0.021634 -0.282500 +v 0.282501 -0.015663 -0.282500 +v 0.282500 -0.015663 0.282501 +v -0.282501 -0.015663 0.282500 +v -0.282501 -0.015663 -0.282501 +v 0.282501 0.002840 -0.282500 +v 0.282500 0.002840 0.282501 +v -0.282501 0.002840 0.282500 +v -0.282501 0.002840 -0.282501 +v -0.282501 0.002840 -0.282501 +v -0.282501 0.002840 0.282500 +v 0.282500 0.002840 0.282501 +v 0.282501 0.002840 -0.282500 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +usemtl items/bazalt_breaker +s off +f 4/1/1 1/2/1 2/3/1 3/4/1 +f 5/5/1 8/6/1 7/7/1 6/8/1 +f 12/9/2 11/10/2 10/11/2 9/12/2 +f 13/13/2 14/14/2 15/15/2 16/16/2 +f 17/17/1 20/18/1 19/19/1 18/20/1 +f 24/21/2 23/22/2 22/23/2 21/24/2 diff --git a/res/content/base/preload.json b/res/content/base/preload.json index 238cab00..be5d5bec 100644 --- a/res/content/base/preload.json +++ b/res/content/base/preload.json @@ -4,6 +4,7 @@ "blocks/door_close" ], "models": [ - "cube" + "cube", + "item" ] } diff --git a/res/content/base/scripts/components/drop.lua b/res/content/base/scripts/components/drop.lua index a1ab5aa2..d432a2fb 100644 --- a/res/content/base/scripts/components/drop.lua +++ b/res/content/base/scripts/components/drop.lua @@ -22,7 +22,7 @@ end function on_update() if inair then - tsf:set_rot(mat4.rotate(tsf:get_rot(), {0, 1, 0}, math.random()*12)) - tsf:set_rot(mat4.rotate(tsf:get_rot(), {0, 0, 1}, math.random()*12)) + tsf:set_rot(mat4.rotate(tsf:get_rot(), {0, 1, 0}, math.random()*4)) + tsf:set_rot(mat4.rotate(tsf:get_rot(), {0, 0, 1}, math.random()*4)) end end diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index 3feb9db7..f43c25a4 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -78,31 +78,42 @@ void Entities::clean() { } } -void Entities::updatePhysics(float delta){ +void Entities::preparePhysics() { + static uint64_t frameid = 0; + frameid++; auto view = registry.view(); auto physics = level->physics.get(); - { - std::vector triggers; - for (auto [entity, eid, transform, rigidbody] : view.each()) { - if (!rigidbody.enabled) { - 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); - } - } - trigger.prevEntered = trigger.nextEntered; - trigger.nextEntered.clear(); - trigger.calculated = trigger.aabb; - trigger.calculated.transform(transform.combined); - triggers.push_back(&trigger); - } + std::vector triggers; + for (auto [entity, eid, transform, rigidbody] : view.each()) { + if (!rigidbody.enabled) { + continue; + } + // TODO: temporary optimization until threaded solution + 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); + } + } + trigger.prevEntered = trigger.nextEntered; + trigger.nextEntered.clear(); + trigger.calculated = trigger.aabb; + trigger.calculated.transform(transform.combined); + triggers.push_back(&trigger); } - physics->setTriggers(std::move(triggers)); } + physics->setTriggers(std::move(triggers)); +} + +void Entities::updatePhysics(float delta) { + preparePhysics(); + + auto view = registry.view(); + auto physics = level->physics.get(); for (auto [entity, eid, transform, rigidbody] : view.each()) { if (!rigidbody.enabled) { continue; @@ -110,11 +121,15 @@ void Entities::updatePhysics(float delta){ auto& hitbox = rigidbody.hitbox; auto prevVel = hitbox.velocity; bool grounded = hitbox.grounded; + + float vel = glm::length(prevVel); + int substeps = static_cast(delta * vel * 20); + substeps = std::min(100, std::max(2, substeps)); physics->step( level->chunks.get(), &hitbox, delta, - 10, + substeps, false, 1.0f, true, @@ -139,7 +154,7 @@ void Entities::update() { } } -void Entities::renderDebug(LineBatch& batch, Frustum& frustum) { +void Entities::renderDebug(LineBatch& batch, const Frustum& frustum) { batch.lineWidth(1.0f); auto view = registry.view(); for (auto [entity, transform, rigidbody] : view.each()) { @@ -157,9 +172,12 @@ void Entities::renderDebug(LineBatch& batch, Frustum& frustum) { } } -void Entities::render(Assets* assets, ModelBatch& batch, Frustum& frustum) { +void Entities::render(Assets* assets, ModelBatch& batch, const Frustum& frustum) { auto view = registry.view(); auto model = assets->get("cube"); + if (model == nullptr) { + return; + } for (auto [entity, transform] : view.each()) { const auto& pos = transform.pos; const auto& size = transform.size; diff --git a/src/objects/Entities.hpp b/src/objects/Entities.hpp index 7403c645..0860e6a4 100644 --- a/src/objects/Entities.hpp +++ b/src/objects/Entities.hpp @@ -104,6 +104,8 @@ class Entities { Level* level; std::unordered_map entities; entityid_t nextID = 1; + + void preparePhysics(); public: Entities(Level* level); @@ -111,8 +113,8 @@ public: void updatePhysics(float delta); void update(); - void renderDebug(LineBatch& batch, Frustum& frustum); - void render(Assets* assets, ModelBatch& batch, Frustum& frustum); + void renderDebug(LineBatch& batch, const Frustum& frustum); + void render(Assets* assets, ModelBatch& batch, const Frustum& frustum); entityid_t spawn(EntityDef& def, glm::vec3 pos);