diff --git a/include/Cubed/gameplay/ecs/animation.hpp b/include/Cubed/gameplay/ecs/animation.hpp index 4b02337..4d27d5a 100644 --- a/include/Cubed/gameplay/ecs/animation.hpp +++ b/include/Cubed/gameplay/ecs/animation.hpp @@ -10,4 +10,5 @@ struct WalkPose { // for sound play float moving_time = 0.0f; }; + } // namespace Cubed \ No newline at end of file diff --git a/include/Cubed/gameplay/ecs/transform.hpp b/include/Cubed/gameplay/ecs/transform.hpp index 2cda29d..f1554d8 100644 --- a/include/Cubed/gameplay/ecs/transform.hpp +++ b/include/Cubed/gameplay/ecs/transform.hpp @@ -21,4 +21,10 @@ struct Transform { Direction direction{}; }; +struct RenderTransform { + Position position{}; + Orientation orientation{}; + Direction direction{}; +}; + } // namespace Cubed \ No newline at end of file diff --git a/src/gameplay/client_entity_manager.cpp b/src/gameplay/client_entity_manager.cpp index c9db176..e10df75 100644 --- a/src/gameplay/client_entity_manager.cpp +++ b/src/gameplay/client_entity_manager.cpp @@ -20,7 +20,7 @@ void ClientEntityManager::init() { BaseClientCreature c; c.model = ModelManager::instance().get_model_id("cubed:pig"); create_entity_in_registry(id, Entity{id}, EntityInfo{"cubed:pig", ""}, - std::move(c), PigTag{}); + std::move(c), PigTag{}, RenderTransform{}); }); } // not thread safe @@ -34,6 +34,9 @@ void ClientEntityManager::handle_entity_create(EntityID id, auto* c = m_registry.try_get(a->second); ASSERT(c); c->transform.position.value = pos; + auto* r = m_registry.try_get(a->second); + ASSERT(r); + r->position.value = pos; } void ClientEntityManager::handle_entity_update(UpdateInfo& info) { @@ -50,6 +53,13 @@ void ClientEntityManager::handle_entity_update(UpdateInfo& info) { ASSERT(creature); creature->transform.position.value = info.pos; creature->transform.direction.value = info.direction; + + auto r = m_registry.try_get(e); + ASSERT(r); + r->direction.value = + glm::mix(r->direction.value, creature->transform.direction.value, 0.15); + r->position.value = + glm::mix(r->position.value, creature->transform.position.value, 0.15); } void ClientEntityManager::receive_entity_create(S2CEntityCreate& s2c) { diff --git a/src/render/world_renderer.cpp b/src/render/world_renderer.cpp index 7bc33fc..82d6686 100644 --- a/src/render/world_renderer.cpp +++ b/src/render/world_renderer.cpp @@ -297,15 +297,15 @@ void WorldRenderer::shadow_entity(ClientWorld& world, shader.set_loc("lightSpaceMatrix", light_matrix); glEnable(GL_DEPTH_TEST); auto& registry = world.entity_manager().get_registry(); - auto view = registry.view(); + auto view = registry.view(); for (auto entity : view) { auto& creature = view.get(entity); - float yaw = std::atan2(creature.transform.direction.value.x, - creature.transform.direction.value.z); + auto& t = view.get(entity); + float yaw = std::atan2(t.direction.value.x, t.direction.value.z); - m_renderer.model_renderer().shadow_pass( - creature.model, creature.transform.position.value, yaw, - world.world_scene().camera()); + m_renderer.model_renderer().shadow_pass(creature.model, + t.position.value, yaw, + world.world_scene().camera()); } m_player_renderer.render(shader, world, true); } @@ -721,14 +721,14 @@ void WorldRenderer::render_entity(ClientWorld& world) { glEnable(GL_DEPTH_TEST); auto& registry = world.entity_manager().get_registry(); - auto view = registry.view(); + auto view = registry.view(); for (auto entity : view) { auto& creature = view.get(entity); - float yaw = std::atan2(creature.transform.direction.value.x, - creature.transform.direction.value.z); - m_renderer.model_renderer().render_model( - creature.model, creature.transform.position.value, yaw, - world.world_scene().camera()); + auto& t = view.get(entity); + float yaw = std::atan2(t.direction.value.x, t.direction.value.z); + m_renderer.model_renderer().render_model(creature.model, + t.position.value, yaw, + world.world_scene().camera()); } m_player_renderer.render(shader, world, false);