diff options
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/draw.cc | 66 | ||||
-rw-r--r-- | src/render/particles.cc | 2 | ||||
-rw-r--r-- | src/render/particles.h | 5 |
3 files changed, 66 insertions, 7 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc index fbf5058..3806672 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -744,9 +744,14 @@ void draw_pass_model_fx(float elapsed) math::Axis flare_axis; - size_t current_texture = Textures::bind("textures/fx/flare00"); + // disable culling by default + gl::disable(GL_CULL_FACE); + model::Cull current_cull = model::CullNone; + // default light texture + size_t current_texture = Textures::bind("textures/fx/flare00"); gl::enable(GL_TEXTURE_2D); + gl::begin(gl::Quads); for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) { @@ -775,6 +780,7 @@ void draw_pass_model_fx(float elapsed) location.assign(entity->location() + (entity->axis() * light->location())); light_size = 0.0625 * light->radius(); + // track stat changes if (current_texture != light->texture()) { gl::end(); current_texture = Textures::bind(light->texture()); @@ -826,9 +832,32 @@ void draw_pass_model_fx(float elapsed) location.assign(entity->location() + (entity->axis() * flare->location())); light_size = 0.0625 * flare->radius(); - if (current_texture != flare->texture()) { + if ((current_cull != flare->cull()) || (current_texture != flare->texture())) { gl::end(); - current_texture = Textures::bind(flare->texture()); + + if (current_texture != flare->texture()) { + current_texture = Textures::bind(flare->texture()); + } + + if (current_cull != flare->cull()) { + if (flare->cull() == model::CullNone) { + gl::disable(GL_CULL_FACE); + current_cull = model::CullNone; + } else { + if (current_cull == model::CullNone) { + gl::enable(GL_CULL_FACE); + } + + if (flare->cull() == model::CullBack) { + gl::cullface(GL_BACK); + current_cull = model::CullBack; + } else { + gl::cullface(GL_FRONT); + current_cull = model::CullFront; + } + } + } + gl::begin(gl::Quads); } @@ -870,23 +899,48 @@ void draw_pass_model_fx(float elapsed) // draw particle systems if (r_particles->value() && ext_render(entity)->particles().size()) { gl::end(); - gl::disable(GL_CULL_FACE); - + for (RenderExt::ParticleSystems::iterator it = ext_render(entity)->particles().begin(); it != ext_render(entity)->particles().end(); it++) { ParticleSystem *particlesystem = (*it); + + if (current_cull != particlesystem->cull()) { + if (particlesystem->cull() == model::CullNone) { + gl::disable(GL_CULL_FACE); + current_cull = model::CullNone; + } else { + if (current_cull == model::CullNone) { + gl::enable(GL_CULL_FACE); + } + + if (particlesystem->cull() == model::CullBack) { + gl::cullface(GL_BACK); + current_cull = model::CullBack; + } else { + gl::cullface(GL_FRONT); + current_cull = model::CullFront; + } + } + } + particlesystem->draw(elapsed); } - gl::enable(GL_CULL_FACE); current_texture = Textures::bind("textures/fx/flare00"); gl::begin(gl::Quads); } + + if (current_cull != model::CullNone) { + gl::disable(GL_CULL_FACE); + current_cull = model::CullNone; + } } } gl::end(); gl::disable(GL_TEXTURE_2D); + gl::cullface(GL_BACK); + gl::enable(GL_CULL_FACE); } diff --git a/src/render/particles.cc b/src/render/particles.cc index 07a8dc1..ef6886a 100644 --- a/src/render/particles.cc +++ b/src/render/particles.cc @@ -183,6 +183,7 @@ ParticleSystem::ParticleSystem(ParticleScript *script, core::Entity *entity, mod particlesystem_script = script; particlesystem_texture = 0; + particlesystem_cull = model::CullNone; particlesystem_modelclass = modelclass; @@ -207,6 +208,7 @@ ParticleSystem::ParticleSystem(ParticleScript *script, core::Entity *entity, mod color.assign(entity->model()->enginecolor()); } particlesystem_axis.assign(modelclass->axis()); +// particlesystem_cull = particlesystem_modelclass->cull(); } } diff --git a/src/render/particles.h b/src/render/particles.h index 096833c..a36b142 100644 --- a/src/render/particles.h +++ b/src/render/particles.h @@ -111,7 +111,9 @@ public: /// axis of the particle system within the entity inline const math::Axis &axis() const { return particlesystem_axis; } - + + inline const model::Cull cull() const { return particlesystem_cull; } + virtual void draw(float elapsed); void set_timeout(float timeout); @@ -146,6 +148,7 @@ protected: math::Color color; model::Particles *particlesystem_modelclass; + model::Cull particlesystem_cull; }; /* ---- class Flame ------------------------------------------------ */ |