Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

trunk: fixed most -Wall warnings… but there are still many missing :/

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