blob: ffe462f1c728273e08af31a3e4bb3693325ab668 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
/*
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 <sstream>
#include <iomanip>
#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<core::EntityGlobe *>(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<core::EntityDynamic *>(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
|