From 4e5343ce9aa83a5c0b04bf744dd287fb56ff39fc Mon Sep 17 00:00:00 2001
From: Stijn Buys <ingar@osirion.org>
Date: Thu, 1 May 2008 16:02:51 +0000
Subject: various silly fixes

---
 src/client/client.cc       | 34 ++++++++---------
 src/core/entity.h          |  3 ++
 src/core/gameconnection.cc | 22 +++--------
 src/core/netserver.cc      |  2 +-
 src/math/vector3f.h        |  4 +-
 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
-- 
cgit v1.2.3