Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/new_class_id/src/lib/graphics/effects/lense_flare.cc @ 9727

Last change on this file since 9727 was 9727, checked in by bensch, 18 years ago

orxonox/new_class_id: new Executor construct, that is much more typesafe, faster, and easier to extend…

Also changed the LoadParam process, and adapted ScriptEngine calls

Then at the end, some missing headers appeared, and appended them to all the cc-files again.

File size: 5.8 KB
Line 
1
2
3/*
4   orxonox - the future of 3D-vertical-scrollers
5
6   Copyright (C) 2004 orx
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13### File Specific:
14   main-programmer: Patrick Boenzli
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS
18
19#include "lense_flare.h"
20
21#include "util/loading/load_param.h"
22#include "util/loading/factory.h"
23
24#include "glincl.h"
25#include "texture.h"
26
27#include "light.h"
28#include "state.h"
29#include "debug.h"
30
31#include "render2D/image_plane.h"
32
33#include "light.h"
34#include "camera.h"
35
36#include "class_id_DEPRECATED.h"
37
38ObjectListDefinitionID(LenseFlare, CL_LENSE_FLARE);
39CREATE_FACTORY(LenseFlare);
40
41/**
42 * @brief default constructor
43 * @param root The XML-element to load the LenseFlare from
44 */
45LenseFlare::LenseFlare(const TiXmlElement* root) {
46  this->registerObject(this, LenseFlare::_objectList);
47
48    /*          length                      image scale */
49    this->flareMatrix[0] = 1.0f;
50    this->flareMatrix[1] = 1.0f;
51    this->flareMatrix[2] = 0.5f;
52    this->flareMatrix[3] = 0.5f;
53    this->flareMatrix[4] = 0.33f;
54    this->flareMatrix[5] = 0.25f;
55    this->flareMatrix[6] = 0.125f;
56    this->flareMatrix[7] = 1.0f;
57    this->flareMatrix[8] = -0.5f;
58    this->flareMatrix[9] = 0.5f;
59    this->flareMatrix[10] = -0.25f;
60    this->flareMatrix[11] = 0.15f;
61    this->flareMatrix[12] = -1.82f;
62    this->flareMatrix[13] = 0.25f;
63
64    this->lightSource = (LightManager::getInstance())->getLight(0);
65    PRINTF(4)("light is: %p\n", this->lightSource);
66
67    if (root != NULL) {
68        this->loadParams(root);
69        this->activate();
70    }
71
72    this->bVisible = true;
73    this->setSourceVisibility(false);
74
75}
76
77
78/**
79 *  destroys a LenseFlare
80 */
81LenseFlare::~LenseFlare() {
82    std::vector<ImagePlane*>::iterator it;
83    for( it = flares.begin(); it != flares.end(); it++)
84        delete (*it);
85}
86
87
88/**
89 * @param root The XML-element to load the LenseFlare from
90 */
91void LenseFlare::loadParams(const TiXmlElement* root) {
92    GraphicsEffect::loadParams(root);
93
94    LOAD_PARAM_START_CYCLE(root, element);
95    {
96        LoadParam_CYCLE(element, "add-flare-texture", this, LenseFlare, addFlare)
97        .describe("adds a lensflare texture to the engine");
98    }
99    LOAD_PARAM_END_CYCLE(element);
100}
101
102
103/**
104 * initializes the fog effect
105 */
106void LenseFlare::init() {}
107
108
109/**
110 * activates the fog effect
111 */
112void LenseFlare::activate() {
113    this->bActivated = true;
114}
115
116
117/**
118 * deactivates the fog effect
119 */
120void LenseFlare::deactivate() {
121    this->bActivated = false;
122}
123
124
125/**
126 * @brief converts a gl mode char to a GLint
127 * @param mode the mode character
128 */
129GLint LenseFlare::stringToFogMode(const std::string& mode) {
130    return 0;
131}
132
133
134/**
135 * @brief adds a texture flare
136 * @param textureName the name of the flare texture
137 *
138 *  1st: Texture of the Sun/Light source itself
139 *  2nd: Texture of the fist halo
140 *  3rd: Texture of small burst
141 *  4th: Texture of the second halo
142 *  5th: Texutre of the second burst
143 *  6th: Texture of the third halo
144 *  7th: Texture of the third burst
145 */
146void LenseFlare::addFlare(const std::string& textureName) {
147    if( this->flares.size() > LF_MAX_FLARES) {
148        PRINTF(2)("You tried to add more than %i lense flares, ignoring\n", LF_MAX_FLARES);
149        return;
150    }
151
152    ImagePlane* bb = new ImagePlane(NULL);
153    if (this->flares.empty())
154        bb->setLayer(E2D_LAYER_BELOW_ALL);
155    bb->setTexture(textureName);
156    bb->setSize(50, 50);
157    this->flares.push_back(bb);
158    bb->setVisibility(true);
159
160    PRINTF(4)("Added a Lenseflare ImagePlane with texture %s\n", textureName.c_str());
161
162    // the first flare belongs to the light source
163    if( this->flares.size() == 1 && this->lightSource != NULL) {
164        bb->setBindNode(static_cast<PNode*>(this->lightSource));
165    }
166
167    PRINTF(4)("Finished adding\n");
168}
169
170
171void LenseFlare::setSourceVisibility(bool visibility) {
172    if (this->bVisible == visibility)
173        return;
174
175    std::vector<ImagePlane*>::const_iterator it;
176    for(it = ++flares.begin(); it != flares.end(); it++)
177        (*it)->setVisibility(visibility);
178    this->bVisible = visibility;
179}
180
181
182/**
183 * tick the effect
184 */
185void LenseFlare::tick(float dt) {
186    if( unlikely(!this->bActivated || this->flares.size() == 0))
187        return;
188
189    // refetch light source information if needed
190    if( unlikely( this->lightSource == NULL)) {
191        this->lightSource = (LightManager::getInstance())->getLight(0);
192        if( this->flares.size() > 0)
193            this->flares[0]->setBindNode(static_cast<PNode*>(this->lightSource));
194    }
195
196    //set the frustum plane
197    if (!flares.empty())
198        this->setSourceVisibility(this->flares[0]->isVisible());
199
200
201    // always update the screen center, it could be, that the window is resized
202    this->screenCenter = Vector2D(State::getResX()/2.0f, State::getResY()/2.0f);
203
204    // flare vector is the direction from the center to the light source
205    this->flareVector = this->flares[0]->getAbsCoor2D() - this->screenCenter;
206    this->distance = this->flareVector.len();
207    this->flareVector.normalize();
208
209    // now calculate the new coordinates of the billboards
210    std::vector<ImagePlane*>::iterator it;
211    int i;
212    for( it = flares.begin(), i = 0; it != flares.end(); it++, i++) {
213        // set the new position
214        if( i == 0)
215            continue;
216
217        (*it)->setAbsCoor2D( this->screenCenter + this->flareVector * this->flareMatrix[i * 2] * this->distance);
218        (*it)->setSize2D(50.0f * this->flareMatrix[i * 2 + 1], 50.0f * this->flareMatrix[i * 2 + 1]);
219        PRINTF(5)("Tick flare %i @ (%f, %f)\n", i, (*it)->getAbsCoor2D().x, (*it)->getAbsCoor2D().y);
220    }
221}
222
223
224/**
225 * draws the LenseFlares
226 */
227void LenseFlare::draw() const {
228    if( !this->bActivated)
229        return;
230}
Note: See TracBrowser for help on using the repository browser.