Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/physics/src/subprojects/particles/framework.cc @ 4314

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

orxonox/branches/physics: nicer fog trailing our little ship

File size: 8.6 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#include "framework.h"
17
18#include "physics_engine.h"
19#include "particle_engine.h"
20
21#include "p_node.h"
22#include "null_parent.h"
23#include "state.h"
24#include "debug.h"
25#include "graphics_engine.h"
26#include "light.h"
27#include "resource_manager.h"
28#include "camera.h"
29
30int verbose;
31
32void Framework::initModule()
33{
34  // Creating a Test Particle System
35  ParticleSystem* system = new ParticleSystem(100000, PARTICLE_SPRITE);
36  system->setLifeSpan(5);
37  system->setConserve(.999);
38  system->setRadius(4, 3, 1, 2);
39  system->setColor(.5,0,0,.5, 1,1,0,1, 0,0,0,0);
40
41  // Creating a Test Particle Emitter
42  ParticleEmitter* emitter = new ParticleEmitter(Vector(0 , 1, 0), M_PI_4, 20, .1);
43  emitter->setType(EMITTER_DOT  );
44  emitter->setSize(0);
45  emitter->setRelCoor(Vector(0,0,0));
46 
47  // Add the Flow from the Emitter into the System
48  ParticleEngine::getInstance()->addConnection(emitter, system);
49}
50
51bool Framework::mainLoop()
52{
53  while(true)
54    {
55      // keyhandler returns false if sdl gets quit by some event
56      if (!this->keyHandler())
57        return false;
58
59      // tick the scene
60      float dt = this->tick();
61
62      // Draw the scene
63      this->draw(dt);
64    }
65}
66
67
68bool Framework::draw(float dt)
69{
70  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
71  glLoadIdentity(); // Reset the view
72 
73  ParticleEngine::getInstance()->draw(dt);
74
75  camera->apply();
76 
77  SDL_GL_SwapBuffers(); // Swap the buffers
78}
79
80
81float Framework::tick()
82{
83  currFrame = SDL_GetTicks();
84  float dt = (float)(currFrame - lastFrame) / 1000.0;
85  lastFrame = currFrame;
86
87  ParticleEngine::getInstance()->tick(dt);
88
89  NullParent::getInstance()->update(dt);
90  return dt;
91}
92
93
94bool Framework::keyHandler()
95{
96  // This is the main loop for the entire program and it will run until done==TRUE
97  {
98    // And poll for events
99    SDL_Event event;
100    while(SDL_PollEvent(&event))
101    {
102      switch (event.type) {
103      case SDL_MOUSEMOTION:
104        {
105          Vector view = camera->getTarget()->getAbsCoor() - camera->getAbsCoor();
106          Vector up = Vector(0, 1, 0);
107          up = camera->getAbsDir().apply(up);
108          Vector h = up.cross(view);
109          Vector v = h.cross(view);
110          h.normalize();
111          v.normalize();
112
113          if (mouseDown[1])
114            camera->setRelCoor(camera->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05);
115          if (mouseDown[3])
116            camera->getTarget()->setRelCoor(camera->getTarget()->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05);
117           
118        }
119        break;
120      case SDL_MOUSEBUTTONDOWN:
121        switch (event.button.button)
122          {
123          case 4:
124            PRINTF(4)("MouseWheel up\n");
125            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
126            break;
127          case 5:
128            PRINTF(4)("MouseWheel down\n");
129            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
130            break;
131          case 1:
132          case 2:
133          case 3:
134            mouseDown[event.button.button] = true;
135            break;
136          }
137           
138        break;
139      case SDL_MOUSEBUTTONUP:
140        switch (event.button.button)
141          {
142          case 1:
143          case 2:
144          case 3:
145            mouseDown[event.button.button] = false;
146            break;
147          }
148        break;
149      case SDL_VIDEORESIZE:
150        GraphicsEngine::getInstance()->resolutionChanged(&event.resize);
151        break;
152      case SDL_KEYDOWN:
153        switch (event.key.keysym.sym)
154          {
155          case SDLK_x:
156           
157            break;
158          case SDLK_c:
159
160            break;
161          case SDLK_i:
162            ParticleEngine::getInstance()->debug();
163            break;
164          case SDLK_a:
165            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
166            break;
167          case SDLK_z:
168            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
169            break;
170          case SDLK_h:
171            this->printHelp();
172            break;
173
174          case SDLK_1:
175            {
176              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
177              if (tmpEmit)
178                {
179                  tmpEmit->setEmissionRate(tmpEmit->getEmissionRate() +1.0);
180                  PRINT(3)("emissionRate set to %f\n", tmpEmit->getEmissionRate());
181                }
182            }
183            break;
184          case SDLK_2:
185            {
186              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
187              if (tmpEmit)
188                {
189                  tmpEmit->setEmissionRate(tmpEmit->getEmissionRate() -1.0);
190                  PRINT(3)("emissionRate set to %f\n", tmpEmit->getEmissionRate());
191                }
192            }
193            break;
194          case SDLK_3:
195            {
196              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
197              if (tmpEmit)
198                {
199                  tmpEmit->setEmissionVelocity(tmpEmit->getEmissionVelocity() -.01);
200                  PRINT(3)("emissionVelocity set to %f\n", tmpEmit->getEmissionVelocity());
201                }
202            }
203            break;
204          case SDLK_4:
205            {
206              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
207              if (tmpEmit)
208                {
209                  tmpEmit->setEmissionVelocity(tmpEmit->getEmissionVelocity() + .01);
210                  PRINT(3)("emissionVelocity set to %f\n", tmpEmit->getEmissionVelocity());
211                }
212            }
213            break;
214          case SDLK_5:
215            {
216              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
217              if (tmpEmit)
218                {
219                  tmpEmit->setSpread(tmpEmit->getSpread() +.1);
220                  PRINT(3)("emissionSpreadAngle set to %f\n", tmpEmit->getSpread());
221                }
222            }
223            break;
224          case SDLK_6:
225            {
226              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
227              if (tmpEmit)
228                {
229                  tmpEmit->setSpread(tmpEmit->getSpread() -.1);
230                  PRINT(3)("emissionSpreadAngle set to %f\n", tmpEmit->getSpread());
231                }
232            }
233            break;
234          case SDLK_7:
235            {
236              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
237              if (tmpEmit)
238                {
239                  tmpEmit->setSize(tmpEmit->getSize() - 1.0);
240                  PRINT(3)("EmitterSize set to %f\n", tmpEmit->getSize());
241                }
242            }
243            break;
244          case SDLK_8:
245            {
246              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
247              if (tmpEmit)
248                {
249                  tmpEmit->setSize(tmpEmit->getSize() +1.0);
250                  PRINT(3)("EmitterSize set to %f\n", tmpEmit->getSize());
251                }
252            }
253            break;
254          case SDLK_9:
255            {
256              ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
257              if (tmpEmit)
258                {
259                  if (tmpEmit->getType() == EMITTER_DOT)
260                    tmpEmit->setType(EMITTER_PLANE);
261                  else if (tmpEmit->getType() == EMITTER_PLANE)
262                    tmpEmit->setType(EMITTER_CUBE);
263                  else if (tmpEmit->getType() == EMITTER_CUBE)
264                    tmpEmit->setType(EMITTER_DOT);
265                  PRINT(3)("EmitterType set to %d\n", tmpEmit->getType());
266                }
267            }
268            break;
269
270          }
271        break;
272           
273        // If a quit event was recieved
274      case SDL_QUIT:
275        // then we're done and we'll end this program
276        return false;
277        break;
278      default:
279        break;
280      }
281
282    }
283
284    // Get the state of the keyboard keys
285    keys = SDL_GetKeyState(NULL);
286
287    // and check if ESCAPE has been pressed. If so then quit
288    if(keys[SDLK_ESCAPE]) return false;
289  }
290  return true;
291}
292
293
294Framework::Framework()
295{
296  this->lastFrame = 0;
297  // Create a new OpenGL window with the title "Cone3D Basecode" at
298  // 640x480x32, fullscreen and check for errors along the way
299  GraphicsEngine::getInstance();
300
301  LightManager::getInstance();
302  glEnable(GL_TEXTURE_2D);
303
304  // Build the font from a TGA image font.tga in the data directory
305  // Hide the mouse cursor
306  SDL_ShowCursor(2);
307
308  for (int i = 0; i <MOUSE_BUTTON_COUNT; i++)
309    mouseDown[i] = false;
310
311  ResourceManager::getInstance()->setDataDir(DATA_DIRECTORY);
312 
313
314  initModule();
315
316  camera = new Camera();
317
318  State::getInstance()->setCamera(camera, camera->getTarget());
319
320  camera->setAbsCoor(Vector(10, 10, 0));
321
322}
323
324Framework::~Framework()
325{
326  delete GraphicsEngine::getInstance();
327
328}
329
330
331
332void Framework::printHelp(void) const
333{
334  PRINT(0)(" Help for the frameWork\n");
335  PRINT(0)("========================\n");
336  PRINT(0)("h - print thisHelp\n");
337  PRINT(0)("i - state Information\n\n");
338  PRINT(0)("Emitter Properties\n");
339  PRINT(0)("1,2 - increase/decrease emissionRate\n");
340  PRINT(0)("3,4 - increase/decrease emission velocity\n");
341  PRINT(0)("5,6 - increase/decrease spread angle\n");
342  PRINT(0)("7,8 - increase-decrease emitter-size\n");
343  PRINT(0)("9 - swap emitterType\n");
344  PRINT(0)("\n");
345
346
347}
348
349
350
351int main(int argc, char *argv[])
352{
353  verbose = 3;
354  Framework* framework = new Framework();
355  framework->mainLoop();
356
357  delete framework;
358  // Kill the GL & SDL screens
359  // And quit
360  return 0;
361}
Note: See TracBrowser for help on using the repository browser.