Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/draw.cc69
1 files changed, 65 insertions, 4 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc
index f84abe7..351b1a6 100644
--- a/src/render/draw.cc
+++ b/src/render/draw.cc
@@ -239,6 +239,16 @@ void pass_prepare(float seconds)
flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << light->flare();
light->render_texture = Textures::load(flarename.str());
}
+
+ for (std::list<model::Flare *>::iterator flit = entity->model()->model_flare.begin(); flit != entity->model()->model_flare.end(); flit++) {
+ model::Flare *flare = (*flit);
+
+ // load flare texture
+ // FIXME optimize
+ std::stringstream flarename;
+ flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare();
+ flare->render_texture = Textures::load(flarename.str());
+ }
}
}
@@ -487,6 +497,57 @@ void draw_pass_model_fx()
}
}
+ // draw flares
+ for (std::list<model::Flare *>::iterator flit = entity->model()->model_flare.begin(); flit != entity->model()->model_flare.end(); flit++) {
+
+ model::Flare *flare = (*flit);
+
+ // strobe frequency
+ t = 1.0f;
+ if (flare->strobe())
+ t = (core::application()->time() + entity->state()->fuzz() - flare->offset()) * flare->frequency();
+
+ if (!flare->strobe() || (( t - floorf(t)) <= flare->time())) {
+ math::Axis flare_axis(entity->state()->axis());
+ if (flare->angle())
+ flare_axis.change_direction(flare->angle());
+
+ math::Vector3f location = entity->state()->location() + (entity->state()->axis() * flare->location());
+ float light_size = 0.0625 * flare->radius();
+
+ if (flare->render_texture != flare_texture) {
+ gl::end();
+ flare_texture = Textures::bind(flare->render_texture);
+ gl::begin(gl::Quads);
+ }
+
+ math::Color color;
+ if (flare->entity()) {
+ color.assign(entity->color());
+ } else {
+ color.assign(flare->color());
+ }
+
+ float a = dotproduct(flare_axis.forward(), camera_axis.forward());
+ if (a < -0.1f) {
+ color.a = -a - 0.1f;
+ gl::color(color);
+
+ glTexCoord2f(0,1);
+ gl::vertex(location + (flare_axis.up() + flare_axis.left()) * light_size);
+ glTexCoord2f(0,0);
+ gl::vertex(location + (flare_axis.up() - flare_axis.left()) * light_size);
+ glTexCoord2f(1,0);
+ gl::vertex(location + (flare_axis.up() * -1 - flare_axis.left()) * light_size);
+ glTexCoord2f(1,1);
+ gl::vertex(location + (flare_axis.up() * -1 + flare_axis.left()) * light_size);
+
+ Stats::quads++;
+ }
+
+ }
+ }
+
// draw model engines for Controlable entities
if (entity->type() == core::Entity::Controlable && entity->model()->model_engine.size()) {
@@ -513,13 +574,13 @@ void draw_pass_model_fx()
gl::color(color);
glTexCoord2f(0,1);
- gl::vertex(location + (camera_axis.up() - camera_axis.left()) * engine_size);
+ gl::vertex(location + (entity->state()->axis().up() - entity->state()->axis().left()) * engine_size);
glTexCoord2f(0,0);
- gl::vertex(location + (camera_axis.up() + camera_axis.left()) * engine_size);
+ gl::vertex(location + (entity->state()->axis().up() + entity->state()->axis().left()) * engine_size);
glTexCoord2f(1,0);
- gl::vertex(location + (camera_axis.up() * -1 + camera_axis.left()) * engine_size);
+ gl::vertex(location + (entity->state()->axis().up() * -1 + entity->state()->axis().left()) * engine_size);
glTexCoord2f(1,1);
- gl::vertex(location + (camera_axis.up() * -1 - camera_axis.left()) * engine_size);
+ gl::vertex(location + (entity->state()->axis().up() * -1 - entity->state()->axis().left()) * engine_size);
Stats::quads++;
}