Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/physics: threads work :)

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