From 3dedab035c98772fd9607480bddc8ffd9d7dc799 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 2 May 2008 13:05:03 +0000 Subject: additional light properties --- src/client/input.cc | 13 ++++++++----- src/core/model.cc | 25 +++++++++++++++++++++---- src/core/model.h | 8 ++++++++ src/game/game.cc | 8 ++++++++ src/render/draw.cc | 40 +++++++++++++++++----------------------- 5 files changed, 62 insertions(+), 32 deletions(-) diff --git a/src/client/input.cc b/src/client/input.cc index 87492c4..533ea64 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -66,21 +66,24 @@ void keyreleased(const SDL_keysym &keysym) case SDLK_SPACE: camera::next_mode(); + local_roll = 0; + local_pitch = 0; + local_turn = 0; break; - case SDLK_KP8: // down + case SDLK_KP8: // turn down local_pitch = 0.0f; break; - case SDLK_KP2: // up + case SDLK_KP2: // turn up local_pitch = 0.0f; break; - case SDLK_KP4: // left + case SDLK_KP4: // turn left local_turn = 0.0f; break; - case SDLK_KP6: // right + case SDLK_KP6: // turn right local_turn = 0.0f; break; @@ -88,7 +91,7 @@ void keyreleased(const SDL_keysym &keysym) local_roll = 0.0f; break; - case SDLK_KP_MULTIPLY: // roll light + case SDLK_KP_MULTIPLY: // roll right local_roll = 0.0f; break; diff --git a/src/core/model.cc b/src/core/model.cc index e956612..c38749b 100644 --- a/src/core/model.cc +++ b/src/core/model.cc @@ -184,6 +184,7 @@ Light::Light(math::Vector3f const & location, math::Color const & color, bool st light_radius = 1.0f; light_frequency = 1.0f; light_offset = 0.0f; + light_time = 0.5f; } Light::~Light() @@ -251,6 +252,7 @@ Model::Model(std::string const & name) : float class_light = 100; float class_frequency = 1.0f; float class_offset = 0; + float class_time = 0.0f; bool brush_detail = false; while (ifs) { @@ -272,6 +274,7 @@ Model::Model(std::string const & name) : class_light = 100; class_offset = 0; class_frequency = 1.0f; + class_time = 0.0f; brush_detail = false; } level ++; @@ -302,7 +305,10 @@ Model::Model(std::string const & name) : Light *light = new Light(class_origin * model_scale, class_color, (class_spawnflags & 1) == 1); light->light_radius = class_light / 100.0f; light->light_offset = class_offset; - light->light_frequency = class_frequency; + if (class_frequency > 0 ) + light->light_frequency = class_frequency; + if (class_time > 0 ) + light->light_time = class_time; add_light(light); } @@ -399,6 +405,15 @@ Model::Model(std::string const & name) : tmp += c; std::istringstream is(tmp); is >> class_offset; + + } else if (firstword == "\"time\"") { + std::string tmp; + char c; + while ((linestream.get(c)) && (c != '"')); + while ((linestream.get(c)) && (c != '"')) + tmp += c; + std::istringstream is(tmp); + is >> class_time; } else if (firstword == "(") { if ((level == 2) && (class_name == "worldspawn")) { @@ -408,6 +423,7 @@ Model::Model(std::string const & name) : Vector3f p3; std::string tmp; std::string texture; + int n; linestream >> p1; linestream >> tmp; // ) @@ -423,9 +439,10 @@ Model::Model(std::string const & name) : for (int i=0; i < 5; i++) linestream >> tmp; - if (linestream >> tmp) - brush_detail = true; - + if (linestream >> n) { + if (n > 0) + brush_detail = true; + } //cout << data << std::endl; //cout << "(" << p1 << ") (" << p2 << ") (" << p3 << ") " << texture << std::endl; diff --git a/src/core/model.h b/src/core/model.h index 1c56982..6175ec7 100644 --- a/src/core/model.h +++ b/src/core/model.h @@ -119,13 +119,20 @@ public: inline math::Color const & color() const { return light_color; }; + /// true if this is a strobe light inline bool strobe() const { return light_strobe; } + /// size if the light, default is 1.0f inline float radius() const { return light_radius; } + /// strobe time offset, in seconds inline float offset() const { return light_offset; } + /// frequency in strobes per second inline float frequency() const { return light_frequency; } + + /// fraction a strobe light will be on, default is 0.5f + inline float time() const { return light_time; } math::Vector3f light_location; math::Color light_color; @@ -133,6 +140,7 @@ public: float light_radius; float light_frequency; float light_offset; + float light_time; }; diff --git a/src/game/game.cc b/src/game/game.cc index 07327d9..74aa2d9 100644 --- a/src/game/game.cc +++ b/src/game/game.cc @@ -129,6 +129,8 @@ void Game::init() core::Entity *entity = 0; float direction; + float pitch; + float roll; while (worldini.getline()) { if (worldini.got_key()) { @@ -168,6 +170,12 @@ void Game::init() else if (worldini.got_key_angle("direction", direction)) { entity->axis().change_direction(direction); continue; + } else if (worldini.got_key_angle("pitch", pitch)) { + entity->axis().change_pitch(pitch); + continue; + } else if (worldini.got_key_angle("roll", roll)) { + entity->axis().change_roll(roll); + continue; } else if (worldini.got_key_angle("radius", entity->entity_radius)) continue; else if (worldini.got_key_vector3f("location", entity->entity_location)) diff --git a/src/render/draw.cc b/src/render/draw.cc index 741eb3d..3fe64a5 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -287,9 +287,6 @@ void draw_pass_default() if (!entity->model()) { gl::push(); gl::translate(entity->location()); - - // FIXME - //gl::rotate(entity->direction(), 0.0f, 0.0f, 1.0f ); gl::multmatrix(entity->axis()); if ((entity->flags() & core::Entity::Bright) == core::Entity::Bright) @@ -392,12 +389,10 @@ void draw_pass_model_lights() gl::begin(gl::Quads); - - for (std::map::iterator it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { core::Entity *entity = (*it).second; - if ( test_drawfx_distance(entity) && (entity->model()->model_light.size())) { + if (test_drawfx_distance(entity) && (entity->model()->model_light.size())) { for (std::list::iterator lit = entity->model()->model_light.begin(); lit != entity->model()->model_light.end(); lit++) { // strobe frequency @@ -405,27 +400,26 @@ void draw_pass_model_lights() if ((*lit)->strobe()) t = (core::application()->time() + entity->fuzz() + (*lit)->offset()) * (*lit)->frequency(); - if (!(*lit)->strobe() || (( t - floorf(t)) < 0.5f)) { + if (!(*lit)->strobe() || (( t - floorf(t)) <= (*lit)->time())) { math::Vector3f location = entity->location() + (entity->axis() * (*lit)->location()); - float n = dotproduct(camera_axis.forward(), (camera_eye-location)); float light_size = 0.0625 * (*lit)->radius(); - if (n < 0) { - math::Color color((*lit)->color()); - color.a = fabs(-atanf(n) * 2 / M_PI); - gl::color(color); + + math::Color color((*lit)->color()); + color.a = 0.8; + gl::color(color); + + glTexCoord2f(0,1); + gl::vertex(location + (camera_axis.up() - camera_axis.left()) * light_size); + glTexCoord2f(0,0); + gl::vertex(location + (camera_axis.up() + camera_axis.left()) * light_size); + glTexCoord2f(-1,0); + 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++; - glTexCoord2f(0,1); - gl::vertex(location + (camera_axis.up() - camera_axis.left()) * light_size); - glTexCoord2f(0,0); - gl::vertex(location + (camera_axis.up() + camera_axis.left()) * light_size); - glTexCoord2f(-1,0); - 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++; - } } } } -- cgit v1.2.3