Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/graphics/render2D/render_2d.cc @ 5400

Last change on this file since 5400 was 5400, checked in by bensch, 19 years ago

orxonox/trunk: a new Function to List.
This gives the ability to remove entities from the end of the List.
This is good, if you have an entity just added, and then deleted right afterwards

File size: 4.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_GRAPHICS
17
18#include "render_2d.h"
19
20#include "graphics_engine.h"
21#include "class_list.h"
22#include "list.h"
23#include "element_2d.h"
24
25#include <math.h>
26
27using namespace std;
28
29/**
30 * standard constructor
31 */
32Render2D::Render2D ()
33{
34   this->setClassID(CL_RENDER_2D, "Render2D");
35   this->setName("Render2D");
36
37   for (int i = 0; i < E2D_LAYER_COUNT; i++)
38     this->element2DList[i] = new tList<Element2D>;
39}
40
41/**
42 *  the singleton reference to this class
43 */
44Render2D* Render2D::singletonRef = NULL;
45
46/**
47 * standard deconstructor
48 */
49Render2D::~Render2D ()
50{
51  delete NullElement2D::getInstance();
52
53  for (int i = 0; i < E2D_LAYER_COUNT; i++)
54    delete this->element2DList[i];
55
56  Render2D::singletonRef = NULL;
57}
58
59
60/**
61 * registers a 2D-element to the 2D-Renderer
62 * @param element2D the element to registers
63 *
64 * do not use this function by yourself, because this is used by Element2D's constructor
65 */
66void Render2D::registerElement2D(Element2D* element2D)
67{
68  if (likely(element2D != NULL) && element2D->getLayer() < E2D_LAYER_COUNT && element2D->getLayer() != E2D_LAYER_EXTERN)
69    this->element2DList[element2D->getLayer()]->add(element2D);
70  // DEBUG printf("::::%p, %d %d \n", element2D, element2D->getLayer(), this->element2DList[element2D->getLayer()]->getSize());
71}
72
73
74/**
75 * unregisters a 2D-element from the 2D-Renderer
76 * @param element2D The element to unregister
77 *
78 * do not use this function by yourself, because this is used by Element2D's destructor
79 */
80void Render2D::unregisterElement2D(Element2D* element2D)
81{
82  if (likely(element2D != NULL) && element2D->getLayer() < E2D_LAYER_COUNT && element2D->getLayer() != E2D_LAYER_EXTERN)
83    this->element2DList[element2D->getLayer()]->remove(element2D);
84    // DEBUG  printf(":::%s layer: %d, %d\n", element2D->getClassName(), element2D->getLayer(), this->element2DList[element2D->getLayer()]->getSize());
85}
86
87
88/**
89 * moves an 2D-Element to another Layer
90 * @param element2D the Element to move
91 * @param to which layer to move it to.
92 */
93void Render2D::moveToLayer(Element2D* element2D, E2D_LAYER to)
94{
95  if (element2D == NULL)
96    return;
97
98  if (E2D_LAYER_COUNT  < to)
99    to = E2D_DEFAULT_LAYER;
100  if (likely(element2D->getLayer() != to))
101  {
102    if (element2D->getLayer() != E2D_LAYER_EXTERN)
103      this->element2DList[element2D->getLayer()]->removeFromLast(element2D);
104    if (to != E2D_LAYER_EXTERN)
105      this->element2DList[to]->add(element2D);
106  }
107}
108
109
110/**
111 * ticks all the 2d-elements
112 * @param dt the timestep since last dt
113 */
114void Render2D::tick(float dt)
115{
116  for (int i = 0; i < E2D_LAYER_COUNT; i++)
117  {
118    tIterator<Element2D>* iterator = this->element2DList[i]->getIterator();
119    Element2D* elem = iterator->firstElement();
120    while (elem != NULL)
121    {
122      if (elem->isActive())
123        elem->tick(dt);
124      elem = iterator->nextElement();
125    }
126    delete iterator;
127  }
128}
129
130/**
131 * renders all the Elements of the Render2D-engine's layer
132 * @param layer the Layer to draw (if E2D_LAYER_ALL then all layers will be drawn)
133 */
134void Render2D::draw(E2D_LAYER layer) const
135{
136  GraphicsEngine::enter2DMode();
137
138  if (layer != E2D_LAYER_ALL)
139  {
140    if (likely(layer != E2D_LAYER_EXTERN && this->element2DList[layer]->getSize() > 0))
141    {
142      tIterator<Element2D>* iterator = this->element2DList[layer]->getIterator();
143      Element2D* elem = iterator->firstElement();
144      while (elem != NULL)
145      {
146        if (elem->isVisible())
147          elem->draw();
148        elem = iterator->nextElement();
149      }
150      delete iterator;
151    }
152  }
153  else  // if (layer != E2D_LAYER_ALL)
154  {
155    for (int i = 0; i < E2D_LAYER_COUNT; i++)
156    {
157      if (this->element2DList[i]->getSize() > 0)
158      {
159        tIterator<Element2D>* iterator = this->element2DList[i]->getIterator();
160        Element2D* elem = iterator->firstElement();
161        while (elem != NULL)
162        {
163          if (elem->isVisible())
164            elem->draw();
165          elem = iterator->nextElement();
166        }
167        delete iterator;
168      }
169    }
170  }
171  GraphicsEngine::leave2DMode();
172}
173
174
Note: See TracBrowser for help on using the repository browser.