diff options
-rw-r--r-- | src/client/client.cc | 34 | ||||
-rw-r--r-- | src/core/entity.h | 3 | ||||
-rw-r--r-- | src/core/gameconnection.cc | 22 | ||||
-rw-r--r-- | src/core/netserver.cc | 2 | ||||
-rw-r--r-- | src/math/vector3f.h | 4 | ||||
-rw-r--r-- | src/render/draw.cc | 92 |
6 files changed, 65 insertions, 92 deletions
diff --git a/src/client/client.cc b/src/client/client.cc index 2079c71..c607c64 100644 --- a/src/client/client.cc +++ b/src/client/client.cc @@ -4,6 +4,12 @@ the terms and conditions of the GNU General Public License version 2 */ +#include <SDL/SDL.h> + +#include <iostream> +#include <cmath> +#include <iomanip> + #include "client/chat.h" #include "client/client.h" #include "client/video.h" @@ -13,13 +19,6 @@ #include "client/view.h" #include "core/core.h" -// SDL headers -#include <SDL/SDL.h> - -// C++ headers -#include <iostream> -#include <cmath> - namespace client { @@ -128,26 +127,27 @@ void Client::run() Uint32 client_framerate = (Uint32)(1000/120); Uint32 elapsed = 0; - + while (true) { - if (cl_framerate->value()) - client_framerate = (Uint32) (1000.0f / cl_framerate->value()); - Uint32 chrono = SDL_GetTicks(); core::Application::frame((float)elapsed / 1000.0f); video::frame((float)elapsed / 1000.0f); input::frame((float)elapsed / 1000.0f); - // sleep Uint32 current = SDL_GetTicks(); - elapsed = current - chrono; - if (elapsed < client_framerate) { - SDL_Delay(client_framerate - elapsed); - elapsed = client_framerate; - } + if (cl_framerate->value()) { + client_framerate = (Uint32) (1000.0f / cl_framerate->value()); + if (client_framerate && (elapsed < client_framerate)) { + SDL_Delay(client_framerate - elapsed); + elapsed = client_framerate; + } + }; + + //con_debug << "tick " << std::setw(8) << chrono << " " << std::setw(8) << current << " " << elapsed; + } } diff --git a/src/core/entity.h b/src/core/entity.h index 46dd36c..05ca641 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -32,6 +32,9 @@ public: /// Entity flags enum Flags {Static=1, Solid=2, Bright=4}; + /// Entity render state flags + enum State {InRange=1, InCloseRange=2}; + /// Entity type constants enum Type {Default=0, Dynamic=1, Controlable=2, Globe=3}; diff --git a/src/core/gameconnection.cc b/src/core/gameconnection.cc index 923d9a3..4f410d5 100644 --- a/src/core/gameconnection.cc +++ b/src/core/gameconnection.cc @@ -88,29 +88,18 @@ void GameConnection::frame(float seconds) return; } - + connection_frametime += seconds; + float f = 0; - if (core::Cvar::sv_framerate->value()) { - connection_frametime += seconds; + if (core::Cvar::sv_framerate->value()) { f = 1.0f / core::Cvar::sv_framerate->value(); if (connection_frametime < f) { - /* - // run client prediction - std::map<unsigned int, Entity *>::iterator it; - for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { - Entity *entity = (*it).second; - if ((entity->type() == Entity::Controlable) || (entity->type() == Entity::Dynamic)) { - entity->frame(seconds); - } - } - */ return; } - } else { - connection_frametime = seconds; } - + connection_network->frame(connection_frametime); + connection_frametime = 0; if (localcontrol() && localcontrol()->dirty()) { std::ostringstream netmsg; @@ -135,7 +124,6 @@ void GameConnection::frame(float seconds) } connection_network->transmit(); - connection_frametime += f; } } diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 064229b..50702ac 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -178,7 +178,7 @@ void NetServer::receive() timeval timeout; timeout.tv_sec = 0; - timeout.tv_usec = 25000; + timeout.tv_usec = 500; fd_set readset = serverset; int nb = select(fd()+1, &readset, NULL, NULL, &timeout); diff --git a/src/math/vector3f.h b/src/math/vector3f.h index 1b4028f..25fcbff 100644 --- a/src/math/vector3f.h +++ b/src/math/vector3f.h @@ -93,7 +93,7 @@ public: /*! WARNING: range is not checked * @param index the index of the element to assign to ( 0 <= index < 3 ) */ - inline float& operator[](const unsigned int index) { + inline float& operator[](const size_t index) { return coord[index]; } @@ -101,7 +101,7 @@ public: /*! WARNING: range is not checked * @param index the index of the element to return ( 0 <= index < 3 ) */ - inline float operator[](const unsigned int index) const { + inline float operator[](const size_t index) const { return coord[index]; } diff --git a/src/render/draw.cc b/src/render/draw.cc index 5697cae..d125420 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -45,14 +45,12 @@ float angle = 0; inline bool test_draw_distance(core::Entity *entity) { - return (entity->model() && - (math::distancesquared(camera_eye, entity->location()) <= (drawdistance*drawdistance*entity->model()->radius()))); + return (entity->entity_renderstate > 0); } inline bool test_drawfx_distance(core::Entity *entity) { - return (entity->model() && - (math::distancesquared(camera_eye, entity->location()) <= (drawfxdistance*drawfxdistance*entity->model()->radius()))); + return ((entity->entity_renderstate & core::Entity::InCloseRange) == core::Entity::InCloseRange); } @@ -247,6 +245,37 @@ void draw_model_shield(core::EntityControlable *entity) /* ----- Render passes --------------------------------------------- */ +/* calculate entity visibility */ +void pass_visibility() +{ + std::map<unsigned int, core::Entity *>::iterator it; + for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { + + core::Entity *entity = (*it).second; + entity->entity_renderstate = 0; + + // load entity models if necessary + if (!entity->model() && entity->modelname().size()) { + entity->entity_model = core::Model::get(entity->modelname()); + + if (!entity->model()) + entity->entity_modelname.clear(); + } + + if (entity->model()) { + float dq = math::distancesquared(camera_eye, entity->location()); + + if (dq <= drawfxdistance*drawfxdistance*entity->model()->radius()) { + // entites withint drawfxdistance + entity->entity_renderstate = core::Entity::InCloseRange; + } else if (dq <= drawdistance*drawdistance*entity->model()->radius()) { + // entities within drawdistance + entity->entity_renderstate = core::Entity::InRange; + } + } + } +} + /* Draw entities without model */ void draw_pass_default() { @@ -298,21 +327,9 @@ void draw_pass_model_vertex() for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { core::Entity *entity = (*it).second; - - // load entity models if necessary - if (!entity->model() && entity->modelname().size()) { - entity->entity_model = core::Model::get(entity->modelname()); - - if (!entity->model()) - entity->entity_modelname.clear(); - } - - if (test_draw_distance(entity)) { gl::push(); gl::translate(entity->location()); - // FIXME - //gl::rotate(entity->direction(), 0.0f, 0.0f, 1.0f ); gl::multmatrix(entity->axis()); draw_model_vertex(entity); @@ -333,8 +350,6 @@ void draw_pass_model_evertex() if (test_draw_distance(entity)) { gl::push(); gl::translate(entity->location()); - // FIXME - //gl::rotate(entity->direction(), 0.0f, 0.0f, 1.0f ); gl::multmatrix(entity->axis()); draw_model_evertex(entity); @@ -369,7 +384,6 @@ void draw_pass_model_fx() { } /* draw model lights */ - void draw_pass_model_lights() { //glPointSize(10); @@ -403,6 +417,8 @@ void draw_pass_model_lights() gl::vertex(location + (camera_axis.up() * -1 + camera_axis.left()) * light_size); glTexCoord2f(-1,1); gl::vertex(location + (camera_axis.up() * -1 - camera_axis.left()) * light_size); + + Stats::quads++; } } } @@ -472,42 +488,6 @@ void draw_pass_spacegrid() gl::pop(); } -void draw_local_axis() -{ - if (!core::localcontrol()) - return; - - gl::push(); - gl::translate(core::localcontrol()->location()); - - gl::begin(gl::Lines); - gl::color(0.5f, 0.0f,0.0f); - gl::vertex(core::localcontrol()->axis()[0] * -1.0f); - gl::color(1.0f, 0.0f, 0.0f); - gl::vertex(core::localcontrol()->axis()[0]); - - gl::color(0.5f, 0.5f,0.0f); - gl::vertex(core::localcontrol()->axis()[1] * -1.0f); - gl::color(1.0f, 1.0f, 0.0f); - gl::vertex(0.0f, 0.0f, 0.0f); - - gl::color(0.5f, 0.5f,0.0f); - gl::vertex(core::localcontrol()->axis()[1]); - gl::color(1.0f, 1.0f, 0.0f); - gl::vertex(0.0f, 0.0f, 0.0f); - - gl::color(0.0f, 0.5f,0.0f); - gl::vertex(core::localcontrol()->axis()[2] * -1.0f); - gl::color(0.0f, 1.0f, 0.0f); - gl::vertex(0.0f, 0.0f, 0.0f); - - gl::color(0.0f, 0.5f,0.0f); - gl::vertex(core::localcontrol()->axis()[2]); - gl::color(0.0f, 1.0f, 0.0f); - gl::vertex(0.0f, 0.0f, 0.0f); - - gl::pop(); -} /* ----- Main draw routine ----------------------------------------- */ void draw(math::Axis const &axis, math::Vector3f const &eye, math::Vector3f const &target, float seconds) @@ -523,6 +503,8 @@ void draw(math::Axis const &axis, math::Vector3f const &eye, math::Vector3f cons camera_target.assign(target); camera_eye.assign(eye); camera_axis.assign(axis); + + pass_visibility(); gl::enable(GL_DEPTH_TEST); // enable depth buffer writing gl::enable(GL_CULL_FACE); // enable culling |