From 930db4020b9af2ccd999cb3a8c980cc9d527f8cf Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 10 May 2008 10:19:16 +0000 Subject: client-side axis interpolation --- src/core/gameinterface.cc | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'src/core/gameinterface.cc') diff --git a/src/core/gameinterface.cc b/src/core/gameinterface.cc index d1bc1c3..99f884d 100644 --- a/src/core/gameinterface.cc +++ b/src/core/gameinterface.cc @@ -120,6 +120,95 @@ void GameInterface::update_clientstate(float seconds) if (game_clientframetime > game_serverframetime) game_clientframetime = game_serverframetime; + + std::map::iterator it; + for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { + + Entity *entity = (*it).second; + + // update client state + if (!entity->state()) { + entity->entity_clientstate = new core::ClientState(entity); + } + + if (!(entity->flags() & core::Entity::Static)) { + + // clientstate location + entity->state()->state_location = entity->state()->previouslocation() + + (entity->location() - entity->state()->previouslocation()) * core::game()->timeoffset(); + + if (core::game()->clientframetime() < core::game()->serverframetime()) { + + // http://local.wasp.uwa.edu.au/~pbourke/geometry/planeline/ + float side; + float u; + + // clientstate axis: direction + + side = entity->state()->axis().left().x * entity->axis().forward().x + + entity->state()->axis().left().y * entity->axis().forward().y + + entity->state()->axis().left().z * entity->axis().forward().z; + + if (fabs(side) < 0.9999) { + // project entity->axis().forward() into the plane with entity->state()->axis().up() normal + math::Vector3f const & n = entity->state()->axis().up(); + math::Vector3f p(entity->axis().forward()); + u = p[0]*n[0] + p[1]*n[1] + p[2]*n[2] / (-n[0]*n[0] - n[1]*n[1] - n[2] * n[2]); + p = entity->axis().forward() + u * n; + + float cosangle = math::dotproduct(p, entity->state()->axis().forward()); + float angle = acos(cosangle) * 180.0f / M_PI; + angle = math::sgnf(side) * angle * seconds / + (core::game()->serverframetime() - core::game()->clientframetime()); + + if (angle > 0.001) + entity->state()->state_axis.change_direction(angle); + } + + // clientstate axis: pitch + side = entity->state()->axis().forward().x * entity->axis().up().x + + entity->state()->axis().forward().y * entity->axis().up().y + + entity->state()->axis().forward().z * entity->axis().up().z; + + if (fabs(side) < 0.9999) { + // project entity->axis().up() into the plane with entity->state()->axis()->left() normal + math::Vector3f const & n = entity->state()->axis().left(); + math::Vector3f p(entity->axis().up()); + u = p[0]*n[0] + p[1]*n[1] + p[2]*n[2] / (-n[0]*n[0] - n[1]*n[1] - n[2] * n[2]); + p = entity->axis().up() + u * n; + + float cosangle = math::dotproduct(p, entity->state()->axis().up()); + float angle = acos(cosangle) * 180.0f / M_PI; + angle = math::sgnf(side) * angle * seconds / + (core::game()->serverframetime() - core::game()->clientframetime()); + + if (angle > 0.001) + entity->state()->state_axis.change_pitch(-angle); + } + + + /* + // clientstate axis: roll + side = entity->state()->axis().left().x * entity->axis().up().x + + entity->state()->axis().left().y * entity->axis().up().y + + entity->state()->axis().left().z * entity->axis().up().z; + + if (fabs(side) < 0.9999) { + float cosangle = math::dotproduct(entity->axis().up(), entity->state()->axis().up()); + float angle = acos(cosangle) * 180.0f / M_PI; + angle = math::sgnf(side) * angle * seconds / + (core::game()->serverframetime() - core::game()->clientframetime()); + + if (angle > 0.001) + entity->state()->state_axis.change_roll(-angle); + } + */ + + } + + } + + } } float GameInterface::timeoffset() { -- cgit v1.2.3