Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-05-10 10:19:16 +0000
committerStijn Buys <ingar@osirion.org>2008-05-10 10:19:16 +0000
commit930db4020b9af2ccd999cb3a8c980cc9d527f8cf (patch)
tree1767c67dbe94615c02d529f3ed04e614cb948921 /src/core/gameinterface.cc
parent421fc71813f08bfe359f9ac7596933a7e4cea6e0 (diff)
client-side axis interpolation
Diffstat (limited to 'src/core/gameinterface.cc')
-rw-r--r--src/core/gameinterface.cc89
1 files changed, 89 insertions, 0 deletions
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<unsigned int, Entity *>::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() {