diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/entity.cc | 2 | ||||
-rw-r--r-- | src/core/entity.h | 7 | ||||
-rw-r--r-- | src/core/model.cc | 42 | ||||
-rw-r--r-- | src/core/model.h | 9 | ||||
-rw-r--r-- | src/render/draw.cc | 10 |
5 files changed, 67 insertions, 3 deletions
diff --git a/src/core/entity.cc b/src/core/entity.cc index b186c64..ea5b9bc 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -102,6 +102,7 @@ Entity::Entity(unsigned int flags) : entity_name.clear(); entity_renderstate = 0; + entity_renderfuzz = math::randomf(); add(this); } @@ -140,6 +141,7 @@ Entity::Entity(std::istream & is) entity_dirty = false; entity_renderstate = 0; + entity_renderfuzz = math::randomf(); add(this, entity_id); } diff --git a/src/core/entity.h b/src/core/entity.h index 05ca641..e71b034 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -61,6 +61,12 @@ public: /// core type id virtual inline unsigned int type() const { return Default; } + /// client state + inline unsigned int state() const { return entity_renderstate; } + + /// client render fuzz factor + inline float fuzz() const { return entity_renderfuzz; }; + /// entity flags inline unsigned int flags() const { return entity_flags; } @@ -150,6 +156,7 @@ public: bool entity_destroyed; unsigned int entity_renderstate; + float entity_renderfuzz; private: /// add an entity to the registry diff --git a/src/core/model.cc b/src/core/model.cc index a09c7fd..e956612 100644 --- a/src/core/model.cc +++ b/src/core/model.cc @@ -181,6 +181,9 @@ Light::Light(math::Vector3f const & location, math::Color const & color, bool st light_color(color) { light_strobe = strobe; + light_radius = 1.0f; + light_frequency = 1.0f; + light_offset = 0.0f; } Light::~Light() @@ -245,6 +248,9 @@ Model::Model(std::string const & name) : float class_angle = 0; math::Color class_color; unsigned int class_spawnflags = 0; + float class_light = 100; + float class_frequency = 1.0f; + float class_offset = 0; bool brush_detail = false; while (ifs) { @@ -263,6 +269,9 @@ Model::Model(std::string const & name) : class_origin = math::Vector3f(0,0,0); class_color = math::Color(1, 1, 1); class_spawnflags = 0; + class_light = 100; + class_offset = 0; + class_frequency = 1.0f; brush_detail = false; } level ++; @@ -290,7 +299,11 @@ Model::Model(std::string const & name) : //con_debug << " engine at " << class_origin << "\n"; add_engine(new Engine(class_origin * model_scale)); } else if ((level == 1) && (class_name == "light")) { - add_light(new Light(class_origin * model_scale, class_color, (class_spawnflags & 1) == 1)); + 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; + add_light(light); } if (level == 1) { @@ -360,6 +373,33 @@ Model::Model(std::string const & name) : is >> class_spawnflags; //con_debug << " spawnflags '" << class_spawnflags << "'" << std::endl; + } else if (firstword == "\"light\"") { + std::string tmp; + char c; + while ((linestream.get(c)) && (c != '"')); + while ((linestream.get(c)) && (c != '"')) + tmp += c; + std::istringstream is(tmp); + is >> class_light; + + } else if (firstword == "\"frequency\"") { + std::string tmp; + char c; + while ((linestream.get(c)) && (c != '"')); + while ((linestream.get(c)) && (c != '"')) + tmp += c; + std::istringstream is(tmp); + is >> class_frequency; + + } else if (firstword == "\"offset\"") { + std::string tmp; + char c; + while ((linestream.get(c)) && (c != '"')); + while ((linestream.get(c)) && (c != '"')) + tmp += c; + std::istringstream is(tmp); + is >> class_offset; + } else if (firstword == "(") { if ((level == 2) && (class_name == "worldspawn")) { //cout << " BRUSH PLANE" << std::endl; diff --git a/src/core/model.h b/src/core/model.h index 60746ae..1c56982 100644 --- a/src/core/model.h +++ b/src/core/model.h @@ -120,10 +120,19 @@ public: inline math::Color const & color() const { return light_color; }; inline bool strobe() const { return light_strobe; } + + inline float radius() const { return light_radius; } + + inline float offset() const { return light_offset; } + + inline float frequency() const { return light_frequency; } math::Vector3f light_location; math::Color light_color; bool light_strobe; + float light_radius; + float light_frequency; + float light_offset; }; diff --git a/src/render/draw.cc b/src/render/draw.cc index d125420..741eb3d 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -392,7 +392,7 @@ void draw_pass_model_lights() gl::begin(gl::Quads); - const float light_size = 0.0625; + for (std::map<unsigned int, core::Entity *>::iterator it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { core::Entity *entity = (*it).second; @@ -400,9 +400,15 @@ void draw_pass_model_lights() if ( test_drawfx_distance(entity) && (entity->model()->model_light.size())) { for (std::list<core::Light *>::iterator lit = entity->model()->model_light.begin(); lit != entity->model()->model_light.end(); lit++) { - if (!(*lit)->strobe() || (( core::application()->time() - floorf(core::application()->time()) ) < 0.5f)) { + // strobe frequency + float t = 1.0f; + if ((*lit)->strobe()) + t = (core::application()->time() + entity->fuzz() + (*lit)->offset()) * (*lit)->frequency(); + + if (!(*lit)->strobe() || (( t - floorf(t)) < 0.5f)) { 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()); |