Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/physics: no more threading

File size: 12.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 "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
32int verbose;
33
34int quitGui(GtkWidget* widget, void* data);
35
36
37void Framework::initModule()
38{
39  // Creating a Test Particle System
40  ParticleSystem* system = new ParticleSystem(100000, PARTICLE_SPRITE);
41
42  // Creating a Test Particle Emitter
43  ParticleEmitter* emitter = new ParticleEmitter(Vector(0 , 1, 0));
44  // Add the Flow from the Emitter into the System
45  ParticleEngine::getInstance()->addConnection(emitter, system);
46}
47
48void* Framework::mainLoop(void* tmp)
49{
50  Framework* framework = Framework::getInstance();
51  while(!framework->isFinished)
52    {
53      while(gtk_events_pending()) 
54        gtk_main_iteration();
55
56      // keyhandler returns false if sdl gets quit by some event
57      framework->keyHandler();
58
59      // tick the scene
60      float dt = framework->tick();
61
62      // Draw the scene
63      framework->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_q:
156          case SDLK_ESCAPE:
157            quitGui(NULL, NULL);
158            break;
159          case SDLK_c:
160
161            break;
162          case SDLK_i:
163            ParticleEngine::getInstance()->debug();
164            break;
165          case SDLK_a:
166            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
167            break;
168          case SDLK_z:
169            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
170            break;
171          case SDLK_h:
172            this->printHelp();
173            break;
174          }
175        break;
176           
177        // If a quit event was recieved
178      case SDL_QUIT:
179        // then we're done and we'll end this program
180        quitGui(NULL, NULL);
181        break;
182      default:
183        break;
184      }
185
186    }
187
188    // Get the state of the keyboard keys
189    keys = SDL_GetKeyState(NULL);
190
191    // and check if ESCAPE has been pressed. If so then quit
192    if(keys[SDLK_ESCAPE]) return false;
193  }
194  return true;
195}
196
197void Framework::quit(void)
198{
199  this->isFinished = true;
200}
201
202Framework* Framework::singletonRef = NULL;
203
204Framework* Framework::getInstance(void)
205{
206  if (Framework::singletonRef == NULL)
207    Framework::singletonRef = new Framework();
208  return Framework::singletonRef;
209}
210
211Framework::Framework()
212{
213  this->isFinished = false;
214
215  this->lastFrame = 0;
216  // Create a new OpenGL window with the title "Cone3D Basecode" at
217  // 640x480x32, fullscreen and check for errors along the way
218  GraphicsEngine::getInstance();
219
220  LightManager::getInstance();
221  glEnable(GL_TEXTURE_2D);
222
223  // Build the font from a TGA image font.tga in the data directory
224  // Hide the mouse cursor
225  SDL_ShowCursor(2);
226
227  for (int i = 0; i <MOUSE_BUTTON_COUNT; i++)
228    mouseDown[i] = false;
229
230  ResourceManager::getInstance()->setDataDir(DATA_DIRECTORY);
231 
232
233  initModule();
234
235  camera = new Camera();
236
237  State::getInstance()->setCamera(camera, camera->getTarget());
238
239  camera->setAbsCoor(Vector(10, 10, 0));
240
241}
242
243Framework::~Framework()
244{
245  delete GraphicsEngine::getInstance();
246
247}
248
249
250
251void Framework::printHelp(void) const
252{
253  PRINT(0)(" Help for the frameWork\n");
254  PRINT(0)("========================\n");
255  PRINT(0)("h - print thisHelp\n");
256  PRINT(0)("i - state Information\n\n");
257  PRINT(0)("\n");
258
259
260}
261
262int emitterChange(GtkWidget* nonInterest, void* widget)
263{
264  Option* option = (Option*) widget;
265  const char* name = option->getTitle();
266  char* valueC = option->save();
267  float value = atof(valueC);
268
269  ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
270  if (tmpEmit)
271    {
272      if (!strcmp(name, "EmissionRate"))
273        {
274          tmpEmit->setEmissionRate(value);
275          PRINT(3)("EmissionRate set to %f\n", value);
276        }
277      else if (!strcmp(name, "Velocity"))
278        {
279          tmpEmit->setEmissionVelocity(value);
280          PRINT(3)("Velocity set to %f\n", value);
281        }
282      else if(!strcmp(name, "SpreadAngle"))
283        {
284          tmpEmit->setSpread(value);
285          PRINT(3)("SpreadAngle set to %f\n", value);
286        }
287      else if(!strcmp(name, "EmitterType"))
288        {
289          if (!strcmp(valueC, "EMITTER_DOT"))
290            tmpEmit->setType(EMITTER_DOT);
291          else if (!strcmp(valueC, "EMITTER_PLANE"))
292            tmpEmit->setType(EMITTER_PLANE);
293          else if (!strcmp(valueC, "EMITTER_CUBE"))
294            tmpEmit->setType(EMITTER_CUBE);
295          PRINT(3)("EmitterType set to %s\n", valueC);   
296        }
297      else if(!strcmp(name, "EmitterSize"))
298        {
299          tmpEmit->setSize(value);
300          PRINT(3)("EmitterSize set to %f\n", value);
301        }
302    }
303  delete valueC;
304}
305
306
307int systemChange(GtkWidget* nonInterest, void* widget)
308{
309  Option* option = (Option*) widget;
310  const char* name = option->getTitle();
311  char* valueC = option->save();
312  float value = atof(valueC);
313
314  ParticleSystem* tmpSys = ParticleEngine::getInstance()->getSystemByNumber(1);
315  if (tmpSys)
316    {
317      if (!strcmp(name, "StartRadius"))
318        {
319          tmpSys->setRadius(value, tmpSys->getEndRadius());
320          PRINT(3)("ParticleStartRadius set to %f\n", value);
321        }
322      else if (!strcmp(name, "EndRadius"))
323        {
324          tmpSys->setRadius( tmpSys->getStartRadius(), value);
325          PRINT(3)("ParticleEndRadius set to %f\n", value);
326        }
327
328      else if (!strcmp(name, "LifeSpan"))
329        {
330          tmpSys->setLifeSpan(value);
331          PRINT(3)("ParticleLifeSpan set to %f\n", value);
332        }
333
334      else if (!strcmp(name, "ConserveFactor"))
335        {
336          tmpSys->setConserve(value);
337          PRINT(3)("ParticleConserveFactor set to %f\n", value);
338        }
339
340      else if (!strcmp(name, "ParticleType"))
341        {
342          if (!strcmp(valueC, "PARTICLE_DOT"))
343            tmpSys->setType(PARTICLE_DOT);
344          else if (!strcmp(valueC, "PARTICLE_SPARK"))
345            tmpSys->setType(PARTICLE_SPARK);
346          else if (!strcmp(valueC, "PARTICLE_SPRITE"))
347            tmpSys->setType(PARTICLE_SPRITE);
348
349          PRINT(3)("ParticleType set to %s\n", valueC);
350        }
351
352      else if (!strcmp(name, "InheritSpeed"))
353        {
354          tmpSys->setInheritSpeed(value);
355          PRINT(3)("ParticleInheritSpeed set to %f\n", value);
356        }
357
358    }
359  delete valueC;
360}
361
362
363int quitGui(GtkWidget* widget, void* data)
364{
365#ifdef HAVE_GTK2
366  gtk_main_quit();
367  while(gtk_events_pending()) gtk_main_iteration();
368  Framework::getInstance()->quit();
369#endif /* HAVE_GTK2 */
370}
371
372void* Framework::initGui(void* argv)
373{
374  Window* guiMainWindow = NULL;
375 
376  initGUI(0, NULL);
377 
378  guiMainWindow = new Window("ParticlesFUN");
379  {
380    Box* windowBox = new Box('v');
381    {
382      Frame* emitterFrame = new Frame("emitter-settings");
383      {
384        Box* emitterBox = new Box('v');
385        {
386          emitterBox->fill(new Label("EmissionRate"));
387          Slider* EmissionRate = new Slider("EmissionRate", 0, 1000);
388          EmissionRate->connectSignal("value_changed", (void*)EmissionRate, emitterChange );
389          emitterBox->fill(EmissionRate);
390         
391          emitterBox->fill(new Label("Velocity"));
392          Slider* velocity = new Slider("Velocity", 0, 2);
393          velocity->setExactness(3);
394          velocity->connectSignal("value_changed", (void*)velocity, emitterChange );
395          emitterBox->fill(velocity);
396         
397          emitterBox->fill(new Label("SpreadAngle"));
398          Slider* SpreadAngle = new Slider("SpreadAngle", 0, M_PI);
399          SpreadAngle->setExactness(3);
400          SpreadAngle->connectSignal("value_changed", (void*)SpreadAngle, emitterChange );
401          emitterBox->fill(SpreadAngle);
402
403          emitterBox->fill(new Label("EmitterType"));
404          Menu* EmitterType = new Menu("EmitterType");
405          EmitterType->addItem("EMITTER_DOT");
406          EmitterType->addItem("EMITTER_PLANE");
407          EmitterType->addItem("EMITTER_CUBE");
408          EmitterType->connectSignal("changed", (void*)EmitterType, emitterChange );     
409          emitterBox->fill(EmitterType);
410
411          emitterBox->fill(new Label("EmitterSize"));
412          Slider* EmitterSize = new Slider("EmitterSize", 0, 100);
413          EmitterSize->setExactness(1);
414          EmitterSize->connectSignal("value_changed", (void*)EmitterSize, emitterChange );
415          emitterBox->fill(EmitterSize);
416        }
417        emitterFrame->fill(emitterBox);
418      }
419      windowBox->fill(emitterFrame);
420     
421      Frame* systemFrame = new Frame("system-settings");
422      {
423        Box* systemBox = new Box('v');
424        {
425          systemBox->fill(new Label("StartRadius"));
426          Slider* StartRadius = new Slider("StartRadius", 0, 10);
427          StartRadius->setExactness(3);
428          StartRadius->connectSignal("value_changed", (void*)StartRadius, systemChange );
429          systemBox->fill(StartRadius);
430
431          systemBox->fill(new Label("EndRadius"));
432          Slider* EndRadius = new Slider("EndRadius", 0, 10);
433          EndRadius->setExactness(3);
434          EndRadius->connectSignal("value_changed", (void*)EndRadius, systemChange );
435          systemBox->fill(EndRadius);
436
437          systemBox->fill(new Label("LifeSpan"));
438          Slider* LifeSpan = new Slider("LifeSpan", 0, 10);
439          LifeSpan->setExactness(3);
440          LifeSpan->connectSignal("value_changed", (void*)LifeSpan, systemChange );
441          systemBox->fill(LifeSpan);
442         
443          systemBox->fill(new Label("ConserveFactor"));
444          Slider* ConserveFactor = new Slider("ConserveFactor", 0, 1);
445          ConserveFactor->setExactness(3);
446          ConserveFactor->connectSignal("value_changed", (void*)ConserveFactor, systemChange );
447          systemBox->fill(ConserveFactor);
448
449          systemBox->fill(new Label("ParticleType"));
450          Menu* ParticleType = new Menu("ParticleType");
451          ParticleType->addItem("PARTICLE_DOT");
452          ParticleType->addItem("PARTICLE_SPARK");
453          ParticleType->addItem("PARTICLE_SPRITE");
454          ParticleType->connectSignal("changed", (void*)ParticleType, systemChange );     
455          systemBox->fill(ParticleType);
456         
457          systemBox->fill(new Label("InheritSpeed"));
458          Slider* InheritSpeed = new Slider("InheritSpeed", 0, 1);
459          InheritSpeed->setExactness(3);
460          InheritSpeed->connectSignal("value_changed", (void*)InheritSpeed, systemChange );
461          systemBox->fill(InheritSpeed);
462
463
464        }
465        systemFrame->fill(systemBox);
466      }
467      windowBox->fill(systemFrame);
468     
469      Button* quitButton = new Button("quit");
470     
471      quitButton->connectSignal("clicked", NULL, quitGui);
472      //  Window::mainWindow->connectSignal("remove", this, GuiExec::quitGui);
473      Window::mainWindow->connectSignal("destroy", NULL, quitGui);
474     
475      windowBox->fill(quitButton);
476    }
477    guiMainWindow->fill(windowBox);
478  }
479  Window::mainWindow->showall();
480  Window::mainWindow->setSize(300, 500);
481}
482
483void* Framework::mainloopGui(void* tmp)
484{
485  mainloopGUI();
486}
487
488
489
490int main(int argc, char *argv[])
491{
492  verbose = 3;
493 
494  Framework* framework = Framework::getInstance();
495
496  framework->initGui((void*)argv);
497  //  framework->mainloopGui(NULL);
498
499  framework->mainLoop(NULL);
500
501
502  delete framework;
503  // Kill the GL & SDL screens
504  // And quit
505  return 0;
506}
Note: See TracBrowser for help on using the repository browser.