Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/physics: more threading capabilities

File size: 13.2 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
35pthread_mutex_t mutex;
36
37
38
39void Framework::initModule()
40{
41  // Creating a Test Particle System
42  ParticleSystem* system = new ParticleSystem(100000, PARTICLE_SPRITE);
43  system->setLifeSpan(5);
44  system->setConserve(.999);
45  system->setRadius(4, 3, 1, 2);
46  system->setColor(.5,0,0,.5, 1,1,0,1, 0,0,0,0);
47
48  // Creating a Test Particle Emitter
49  ParticleEmitter* emitter = new ParticleEmitter(Vector(0 , 1, 0), M_PI_4, 20, .1);
50  emitter->setType(EMITTER_DOT  );
51  emitter->setSize(0);
52  emitter->setRelCoor(Vector(0,0,0));
53 
54  // Add the Flow from the Emitter into the System
55  ParticleEngine::getInstance()->addConnection(emitter, system);
56}
57
58void* Framework::mainLoop(void* tmp)
59{
60  Framework* framework = Framework::getInstance();
61  while(true)
62    {
63      // keyhandler returns false if sdl gets quit by some event
64      if (!framework->keyHandler())
65        pthread_exit(NULL);
66
67      // tick the scene
68      float dt = framework->tick();
69
70      // Draw the scene
71      pthread_mutex_lock (&mutex); 
72      framework->draw(dt);
73      pthread_mutex_unlock (&mutex);
74    }
75}
76
77
78bool Framework::draw(float dt)
79{
80  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
81  glLoadIdentity(); // Reset the view
82 
83  ParticleEngine::getInstance()->draw(dt);
84
85  camera->apply();
86 
87  SDL_GL_SwapBuffers(); // Swap the buffers
88}
89
90
91float Framework::tick()
92{
93  currFrame = SDL_GetTicks();
94  float dt = (float)(currFrame - lastFrame) / 1000.0;
95  lastFrame = currFrame;
96
97  ParticleEngine::getInstance()->tick(dt);
98
99  NullParent::getInstance()->update(dt);
100  return dt;
101}
102
103
104bool Framework::keyHandler()
105{
106  // This is the main loop for the entire program and it will run until done==TRUE
107  {
108    // And poll for events
109    SDL_Event event;
110    while(SDL_PollEvent(&event))
111    {
112      switch (event.type) {
113      case SDL_MOUSEMOTION:
114        {
115          Vector view = camera->getTarget()->getAbsCoor() - camera->getAbsCoor();
116          Vector up = Vector(0, 1, 0);
117          up = camera->getAbsDir().apply(up);
118          Vector h = up.cross(view);
119          Vector v = h.cross(view);
120          h.normalize();
121          v.normalize();
122
123          if (mouseDown[1])
124            camera->setRelCoor(camera->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05);
125          if (mouseDown[3])
126            camera->getTarget()->setRelCoor(camera->getTarget()->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05);
127           
128        }
129        break;
130      case SDL_MOUSEBUTTONDOWN:
131        switch (event.button.button)
132          {
133          case 4:
134            PRINTF(4)("MouseWheel up\n");
135            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
136            break;
137          case 5:
138            PRINTF(4)("MouseWheel down\n");
139            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
140            break;
141          case 1:
142          case 2:
143          case 3:
144            mouseDown[event.button.button] = true;
145            break;
146          }
147           
148        break;
149      case SDL_MOUSEBUTTONUP:
150        switch (event.button.button)
151          {
152          case 1:
153          case 2:
154          case 3:
155            mouseDown[event.button.button] = false;
156            break;
157          }
158        break;
159      case SDL_VIDEORESIZE:
160        GraphicsEngine::getInstance()->resolutionChanged(&event.resize);
161        break;
162      case SDL_KEYDOWN:
163        switch (event.key.keysym.sym)
164          {
165          case SDLK_x:
166           
167            break;
168          case SDLK_c:
169
170            break;
171          case SDLK_i:
172            ParticleEngine::getInstance()->debug();
173            break;
174          case SDLK_a:
175            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
176            break;
177          case SDLK_z:
178            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
179            break;
180          case SDLK_h:
181            this->printHelp();
182            break;
183          }
184        break;
185           
186        // If a quit event was recieved
187      case SDL_QUIT:
188        // then we're done and we'll end this program
189        return false;
190        break;
191      default:
192        break;
193      }
194
195    }
196
197    // Get the state of the keyboard keys
198    keys = SDL_GetKeyState(NULL);
199
200    // and check if ESCAPE has been pressed. If so then quit
201    if(keys[SDLK_ESCAPE]) return false;
202  }
203  return true;
204}
205
206Framework* Framework::singletonRef = NULL;
207
208Framework* Framework::getInstance(void)
209{
210  if (Framework::singletonRef == NULL)
211    Framework::singletonRef = new Framework();
212  return Framework::singletonRef;
213}
214
215Framework::Framework()
216{
217  this->lastFrame = 0;
218  // Create a new OpenGL window with the title "Cone3D Basecode" at
219  // 640x480x32, fullscreen and check for errors along the way
220  GraphicsEngine::getInstance();
221
222  LightManager::getInstance();
223  glEnable(GL_TEXTURE_2D);
224
225  // Build the font from a TGA image font.tga in the data directory
226  // Hide the mouse cursor
227  SDL_ShowCursor(2);
228
229  for (int i = 0; i <MOUSE_BUTTON_COUNT; i++)
230    mouseDown[i] = false;
231
232  ResourceManager::getInstance()->setDataDir(DATA_DIRECTORY);
233 
234
235  initModule();
236
237  camera = new Camera();
238
239  State::getInstance()->setCamera(camera, camera->getTarget());
240
241  camera->setAbsCoor(Vector(10, 10, 0));
242
243}
244
245Framework::~Framework()
246{
247  delete GraphicsEngine::getInstance();
248
249}
250
251
252
253void Framework::printHelp(void) const
254{
255  PRINT(0)(" Help for the frameWork\n");
256  PRINT(0)("========================\n");
257  PRINT(0)("h - print thisHelp\n");
258  PRINT(0)("i - state Information\n\n");
259  PRINT(0)("\n");
260
261
262}
263
264int emitterChange(GtkWidget* nonInterest, void* widget)
265{
266  Option* option = (Option*) widget;
267  const char* name = option->getTitle();
268  char* valueC = option->save();
269  float value = atof(valueC);
270
271  ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
272  if (tmpEmit)
273    {
274      if (!strcmp(name, "EmissionRate"))
275        {
276          tmpEmit->setEmissionRate(value);
277          PRINT(3)("EmissionRate set to %f\n", value);
278        }
279      else if (!strcmp(name, "Velocity"))
280        {
281          tmpEmit->setEmissionVelocity(value);
282          PRINT(3)("Velocity set to %f\n", value);
283        }
284      else if(!strcmp(name, "SpreadAngle"))
285        {
286          tmpEmit->setSpread(value);
287          PRINT(3)("SpreadAngle set to %f\n", value);
288        }
289      else if(!strcmp(name, "EmitterType"))
290        {
291          if (!strcmp(valueC, "EMITTER_DOT"))
292            tmpEmit->setType(EMITTER_DOT);
293          else if (!strcmp(valueC, "EMITTER_PLANE"))
294            tmpEmit->setType(EMITTER_PLANE);
295          else if (!strcmp(valueC, "EMITTER_CUBE"))
296            tmpEmit->setType(EMITTER_CUBE);
297          PRINT(3)("EmitterType set to %s\n", valueC);   
298        }
299      else if(!strcmp(name, "EmitterSize"))
300        {
301          tmpEmit->setSize(value);
302          PRINT(3)("EmitterSize set to %f\n", value);
303        }
304    }
305  delete valueC;
306}
307
308
309int systemChange(GtkWidget* nonInterest, void* widget)
310{
311  Option* option = (Option*) widget;
312  const char* name = option->getTitle();
313  char* valueC = option->save();
314  float value = atof(valueC);
315
316  ParticleSystem* tmpSys = ParticleEngine::getInstance()->getSystemByNumber(1);
317  if (tmpSys)
318    {
319      if (!strcmp(name, "StartRadius"))
320        {
321          tmpSys->setRadius(value, tmpSys->getEndRadius());
322          PRINT(3)("ParticleStartRadius set to %f\n", value);
323        }
324      else if (!strcmp(name, "EndRadius"))
325        {
326          tmpSys->setRadius( tmpSys->getStartRadius(), value);
327          PRINT(3)("ParticleEndRadius set to %f\n", value);
328        }
329
330      else if (!strcmp(name, "LifeSpan"))
331        {
332          tmpSys->setLifeSpan(value);
333          PRINT(3)("ParticleLifeSpan set to %f\n", value);
334        }
335
336      else if (!strcmp(name, "ConserveFactor"))
337        {
338          tmpSys->setConserve(value);
339          PRINT(3)("ParticleConserveFactor set to %f\n", value);
340        }
341
342      else if (!strcmp(name, "ParticleType"))
343        {
344          if (!strcmp(valueC, "PARTICLE_DOT"))
345            tmpSys->setType(PARTICLE_DOT);
346          else if (!strcmp(valueC, "PARTICLE_SPARK"))
347            tmpSys->setType(PARTICLE_SPARK);
348          else if (!strcmp(valueC, "PARTICLE_SPRITE"))
349            tmpSys->setType(PARTICLE_SPRITE);
350
351          PRINT(3)("ParticleType set to %s\n", valueC);
352        }
353
354      else if (!strcmp(name, "InheritSpeed"))
355        {
356          tmpSys->setInheritSpeed(value);
357          PRINT(3)("ParticleInheritSpeed set to %f\n", value);
358        }
359
360    }
361  delete valueC;
362}
363
364
365int quitGui(GtkWidget* widget, void* data)
366{
367#ifdef HAVE_GTK2
368  gtk_main_quit();
369  while(gtk_events_pending()) gtk_main_iteration();
370#endif /* HAVE_GTK2 */
371}
372
373void* Framework::initGui(void* argv)
374{
375  Window* guiMainWindow = NULL;
376 
377  initGUI(0, NULL);
378 
379  guiMainWindow = new Window("ParticlesFUN");
380  {
381    Box* windowBox = new Box('v');
382    {
383      Frame* emitterFrame = new Frame("emitter-settings");
384      {
385        Box* emitterBox = new Box('v');
386        {
387          emitterBox->fill(new Label("EmissionRate"));
388          Slider* EmissionRate = new Slider("EmissionRate", 0, 1000);
389          EmissionRate->connectSignal("value_changed", (void*)EmissionRate, emitterChange );
390          emitterBox->fill(EmissionRate);
391         
392          emitterBox->fill(new Label("Velocity"));
393          Slider* velocity = new Slider("Velocity", 0, 2);
394          velocity->setExactness(3);
395          velocity->connectSignal("value_changed", (void*)velocity, emitterChange );
396          emitterBox->fill(velocity);
397         
398          emitterBox->fill(new Label("SpreadAngle"));
399          Slider* SpreadAngle = new Slider("SpreadAngle", 0, M_PI);
400          SpreadAngle->setExactness(3);
401          SpreadAngle->connectSignal("value_changed", (void*)SpreadAngle, emitterChange );
402          emitterBox->fill(SpreadAngle);
403
404          emitterBox->fill(new Label("EmitterType"));
405          Menu* EmitterType = new Menu("EmitterType");
406          EmitterType->addItem("EMITTER_DOT");
407          EmitterType->addItem("EMITTER_PLANE");
408          EmitterType->addItem("EMITTER_CUBE");
409          EmitterType->connectSignal("changed", (void*)EmitterType, emitterChange );     
410          emitterBox->fill(EmitterType);
411
412          emitterBox->fill(new Label("EmitterSize"));
413          Slider* EmitterSize = new Slider("EmitterSize", 0, 100);
414          EmitterSize->setExactness(1);
415          EmitterSize->connectSignal("value_changed", (void*)EmitterSize, emitterChange );
416          emitterBox->fill(EmitterSize);
417        }
418        emitterFrame->fill(emitterBox);
419      }
420      windowBox->fill(emitterFrame);
421     
422      Frame* systemFrame = new Frame("system-settings");
423      {
424        Box* systemBox = new Box('v');
425        {
426          systemBox->fill(new Label("StartRadius"));
427          Slider* StartRadius = new Slider("StartRadius", 0, 10);
428          StartRadius->setExactness(3);
429          StartRadius->connectSignal("value_changed", (void*)StartRadius, systemChange );
430          systemBox->fill(StartRadius);
431
432          systemBox->fill(new Label("EndRadius"));
433          Slider* EndRadius = new Slider("EndRadius", 0, 10);
434          EndRadius->setExactness(3);
435          EndRadius->connectSignal("value_changed", (void*)EndRadius, systemChange );
436          systemBox->fill(EndRadius);
437
438          systemBox->fill(new Label("LifeSpan"));
439          Slider* LifeSpan = new Slider("LifeSpan", 0, 10);
440          LifeSpan->setExactness(3);
441          LifeSpan->connectSignal("value_changed", (void*)LifeSpan, systemChange );
442          systemBox->fill(LifeSpan);
443         
444          systemBox->fill(new Label("ConserveFactor"));
445          Slider* ConserveFactor = new Slider("ConserveFactor", 0, 1);
446          ConserveFactor->setExactness(3);
447          ConserveFactor->connectSignal("value_changed", (void*)ConserveFactor, systemChange );
448          systemBox->fill(ConserveFactor);
449
450          systemBox->fill(new Label("ParticleType"));
451          Menu* ParticleType = new Menu("ParticleType");
452          ParticleType->addItem("PARTICLE_DOT");
453          ParticleType->addItem("PARTICLE_SPARK");
454          ParticleType->addItem("PARTICLE_SPRITE");
455          ParticleType->connectSignal("changed", (void*)ParticleType, systemChange );     
456          systemBox->fill(ParticleType);
457         
458          systemBox->fill(new Label("InheritSpeed"));
459          Slider* InheritSpeed = new Slider("InheritSpeed", 0, 1);
460          InheritSpeed->setExactness(3);
461          InheritSpeed->connectSignal("value_changed", (void*)InheritSpeed, systemChange );
462          systemBox->fill(InheritSpeed);
463
464
465        }
466        systemFrame->fill(systemBox);
467      }
468      windowBox->fill(systemFrame);
469     
470      Button* quitButton = new Button("quit");
471     
472      quitButton->connectSignal("clicked", NULL, quitGui);
473      //  Window::mainWindow->connectSignal("remove", this, GuiExec::quitGui);
474      Window::mainWindow->connectSignal("destroy", NULL, quitGui);
475     
476      windowBox->fill(quitButton);
477    }
478    guiMainWindow->fill(windowBox);
479  }
480  Window::mainWindow->showall();
481  Window::mainWindow->setSize(300, 500);
482}
483
484void* Framework::mainloopGui(void* tmp)
485{
486  mainloopGUI();
487}
488
489
490
491int main(int argc, char *argv[])
492{
493  verbose = 3;
494  pthread_t guiThread;
495  pthread_t openglThread;
496  pthread_attr_t attr;
497  int status;
498 
499  pthread_mutex_init(&mutex, NULL);
500 
501  /* Create threads to perform the dotproduct  */
502  pthread_attr_init(&attr);
503  pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
504
505
506
507
508  Framework* framework = Framework::getInstance();
509
510  framework->initGui((void*)argv);
511  pthread_create(&guiThread, &attr, Framework::mainloopGui ,(void*) argv);
512  //  framework->initGui(argv);
513
514  pthread_create(&openglThread, &attr, Framework::mainLoop, NULL);
515
516  pthread_attr_destroy(&attr);
517
518  pthread_join( guiThread, (void **)&status);   
519  pthread_join( openglThread, (void **)&status);       
520
521  delete framework;
522  // Kill the GL & SDL screens
523  // And quit
524  return 0;
525}
Note: See TracBrowser for help on using the repository browser.