/* render/renderext.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include "math/functions.h" #include "core/range.h" #include "model/model.h" #include "render/renderext.h" #include "render/render.h" #include "render/textures.h" namespace render { RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Render, entity) { state_visible = false; state_detailvisible = false; state_fuzz = math::randomf(); state_engine_trail_offset = 0; using namespace model; if (entity->model()) { model::Model *model = entity->model(); for (Model::Lights::iterator lit = model->lights().begin(); lit != model->lights().end(); lit++) { Light *light = (*lit); // load light texture std::stringstream flarename; flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << light->flare(); light->render_texture = Textures::load(flarename.str()); } for(Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { Engine *engine = (*eit); if (!engine->flare()) engine->engine_flare = 1; // load engine texture std::stringstream flarename; flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << engine->flare(); engine->render_texture = Textures::load(flarename.str()); } for (Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { Flare *flare = (*flit); // load flare texture std::stringstream flarename; flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare(); flare->render_texture = Textures::load(flarename.str()); } } else if (entity->type() == core::Entity::Globe) { core::EntityGlobe *globe = static_cast(entity); // load globe textures if (!globe->render_texture && globe->texture().size()) { std::stringstream texname; texname << "textures/" << globe->texture(); globe->render_texture = Textures::load(texname.str()); if (!globe->render_texture) globe->entity_texture.clear(); } } } RenderExt::~RenderExt() { } void RenderExt::frame(float elapsed) { state_distance = math::distance(Camera::eye(), entity()->location()); state_visible = entity()->visible(); state_detailvisible = false; if ((entity()->type() == core::Entity::Controlable)) { if (static_cast(entity())->eventstate() == core::Entity::Docked) { state_visible = false; } } if (state_visible && entity()->model()) { float r = entity()->model()->radius(); math::clamp(r, 1.0f, farplane / drawfxdistance); if (distance() < drawfxdistance * r) { // entity within detail range state_visible = true; state_detailvisible = true; } else if ((distance() < drawdistance * r) && (distance() < core::range::max)) { // entity within drawing distance, outside detail range state_visible = true; state_detailvisible = false; } else { // entity out of range state_visible = false; state_detailvisible = false; } } } } // namespace render