Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/effects/lense_flare.cc @ 8495

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

merged the branche atmos back. no conflicts

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