Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 6980 was 6980, checked in by patrick, 18 years ago

trunk: lenseflares loadable

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