Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
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