From 4ca453e2272beed121b957244408a61b0b0d8b9b Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 15 Aug 2009 08:18:13 +0000 Subject: don't render entites behind the camera --- src/render/renderext.cc | 55 +++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 22 deletions(-) (limited to 'src/render/renderext.cc') diff --git a/src/render/renderext.cc b/src/render/renderext.cc index b0462d4..b743686 100644 --- a/src/render/renderext.cc +++ b/src/render/renderext.cc @@ -41,7 +41,7 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re // load light texture std::stringstream flarename; flarename << "textures/fx/flare" << std::setfill('0') << std::setw(2) << light->flare(); - light->render_texture = Textures::load(flarename.str()); + light->set_texture(Textures::load(flarename.str())); } for (model::Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { @@ -50,7 +50,7 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re // load flare texture std::stringstream flarename; flarename << "textures/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare(); - flare->render_texture = Textures::load(flarename.str()); + flare->set_texture(Textures::load(flarename.str())); } for(model::Model::ParticleSystems::iterator pit = model->particles().begin(); pit != model->particles().end(); pit++) { @@ -103,6 +103,10 @@ void RenderExt::frame(float elapsed) state_visible = entity()->visible(); state_detailvisible = false; + state_behind = false; + + if (!state_visible) + return; if ((entity()->type() == core::Entity::Controlable)) { if (static_cast(entity())->state() == core::Entity::Docked) { @@ -111,37 +115,44 @@ void RenderExt::frame(float elapsed) } } - if (state_visible && entity()->model()) { + if (!entity()->model()) + return; - if (distance() < core::range::fxdistance) { - // entity within detail range - state_visible = true; - state_detailvisible = true; + if (distance() < core::range::fxdistance) { + // entity within detail range + state_visible = true; + state_detailvisible = true; + + } else if (distance() < core::range::maxdistance) { + + // funky radius factor + float r = entity()->model()->radius(); + math::clamp(r, entity()->model()->radius(), core::range::maxdistance / core::range::fxdistance); - } else if (distance() < core::range::maxvisible) { + if (distance() < core::range::fxdistance * r) { // entity within drawing distance, outside detail range state_visible = true; state_detailvisible = false; - } else if (distance() < core::range::maxdistance) { - - if ((entity()->type() == core::Entity::Controlable)) { - // controlable entity out of range - state_visible = false; - state_detailvisible = false; - } else { - // entity within drawing distance, outside detail range - state_visible = true; - state_detailvisible = false; - - } } else { - // entity out of range - state_visible = false; + // entity within drawing distance, outside detail range + state_visible = true; state_detailvisible = false; } + + } else { + // entity out of range + state_visible = false; + state_detailvisible = false; + return; } + if (math::dotproduct(Camera::axis().forward(), entity()->location() + Camera::axis().forward() * entity()->radius() - Camera::eye()) < 0.0f) { + state_behind = true; + } + + + } } // namespace render -- cgit v1.2.3