From: Daniel Karbach Date: Thu, 29 Oct 2015 13:04:29 +0000 (+0100) Subject: more transform caching X-Git-Url: https://git.localhorst.tv/?a=commitdiff_plain;h=52154f309e569c913520dd004e9fafcbc4671e6f;p=blank.git more transform caching --- diff --git a/src/client/client.cpp b/src/client/client.cpp index d20a98c..8bd0ae3 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -189,9 +189,7 @@ void InteractiveState::Update(int dt) { } void InteractiveState::Render(Viewport &viewport) { - viewport.WorldPosition( - player.GetEntity().Transform(player.GetEntity().ChunkCoords()) - * player.GetEntity().GetModel().EyesTransform()); + viewport.WorldPosition(player.GetEntity().ViewTransform(player.GetEntity().ChunkCoords())); if (master.GetConfig().video.world) { chunk_renderer.Render(viewport); world.Render(viewport); diff --git a/src/standalone/MasterState.cpp b/src/standalone/MasterState.cpp index 5ade4f1..71117e2 100644 --- a/src/standalone/MasterState.cpp +++ b/src/standalone/MasterState.cpp @@ -158,9 +158,7 @@ void MasterState::Update(int dt) { } void MasterState::Render(Viewport &viewport) { - viewport.WorldPosition( - player.GetEntity().Transform(player.GetEntity().ChunkCoords()) - * player.GetEntity().GetModel().EyesTransform()); + viewport.WorldPosition(player.GetEntity().ViewTransform(player.GetEntity().ChunkCoords())); if (config.video.world) { chunk_renderer.Render(viewport); world.Render(viewport); diff --git a/src/world/Entity.hpp b/src/world/Entity.hpp index 69fb0eb..7c10395 100644 --- a/src/world/Entity.hpp +++ b/src/world/Entity.hpp @@ -117,7 +117,7 @@ public: private: void UpdateModel() noexcept; - void UpdateView() noexcept; + void UpdateTransforms() noexcept; void UpdateHeading() noexcept; private: @@ -130,10 +130,12 @@ private: AABB bounds; EntityState state; - /// local transform of eyes + /// chunk to model space + glm::mat4 model_transform; + /// model to view space /// if this entity has no model, the eyes are assumed to - /// be at local origin and oriented towards -Z - glm::mat4 view_local; + /// be at origin and oriented towards pitch of model space + glm::mat4 view_transform; float speed; glm::vec3 heading; diff --git a/src/world/world.cpp b/src/world/world.cpp index ffd30c0..3f5740e 100644 --- a/src/world/world.cpp +++ b/src/world/world.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +52,10 @@ Entity::Entity(const Entity &other) noexcept , name(other.name) , bounds(other.bounds) , state(other.state) +, model_transform(1.0f) +, view_transform(1.0f) +, speed(0.0f) +, heading(0.0f, 0.0f, -1.0f) , max_vel(other.max_vel) , max_force(other.max_force) , ref_count(0) @@ -109,13 +114,11 @@ void Entity::SetHead(float p, float y) noexcept { } glm::mat4 Entity::Transform(const glm::ivec3 &reference) const noexcept { - return state.Transform(reference); + return glm::translate(glm::vec3((state.chunk_pos - reference) * Chunk::Extent())) * model_transform; } glm::mat4 Entity::ViewTransform(const glm::ivec3 &reference) const noexcept { - glm::mat4 transform = view_local; - transform[3] += glm::vec4(state.RelativePosition(reference), 0.0f); - return transform; + return Transform(reference) * view_transform; } Ray Entity::Aim(const Chunk::Pos &chunk_offset) const noexcept { @@ -138,21 +141,23 @@ void Entity::UpdateModel() noexcept { } void Entity::Update(float dt) { - UpdateView(); + UpdateTransforms(); UpdateHeading(); if (HasController()) { GetController().Update(*this, dt); } } -void Entity::UpdateView() noexcept { - // create local transform - view_local = Transform(ChunkCoords()); - // clear the translation part - view_local[3] = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f); - // add the model's eyes translation, if any +void Entity::UpdateTransforms() noexcept { + // model transform is the one given by current state + model_transform = state.Transform(state.chunk_pos); + // view transform is either the model's eyes transform or, + // should the entity have no model, the pitch (yaw already is + // in model transform) if (model) { - view_local *= model.EyesTransform(); + view_transform = model.EyesTransform(); + } else { + view_transform = glm::eulerAngleX(state.pitch); } } @@ -163,7 +168,7 @@ void Entity::UpdateHeading() noexcept { } else { speed = 0.0f; // use -Z (forward axis) of local view transform - heading = -glm::vec3(view_local[2]); + heading = -glm::vec3(view_transform[2]); } } @@ -502,10 +507,10 @@ bool World::Intersection( void World::Update(int dt) { float fdt(dt * 0.001f); for (Entity &entity : entities) { - entity.Update(fdt); + Update(entity, fdt); } for (Entity &entity : entities) { - Update(entity, fdt); + entity.Update(fdt); } for (Player &player : players) { player.Update(dt);