Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/branches/physics: all options in

File size: 15.0 KB
RevLine 
[3140]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
[2931]16#include "framework.h"
[3427]17
[4293]18#include "physics_engine.h"
19#include "particle_engine.h"
[3427]20
[4316]21#include "gui_gtk.h"
[4294]22#include "p_node.h"
23#include "null_parent.h"
24#include "state.h"
[4272]25#include "debug.h"
26#include "graphics_engine.h"
[4300]27#include "light.h"
[4295]28#include "resource_manager.h"
[4297]29#include "camera.h"
[3657]30
[4316]31#include <pthread.h>
32
[3398]33int verbose;
[4293]34
[4305]35void Framework::initModule()
36{
37  // Creating a Test Particle System
38  ParticleSystem* system = new ParticleSystem(100000, PARTICLE_SPRITE);
39  system->setLifeSpan(5);
[4314]40  system->setConserve(.999);
[4305]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
[4297]54bool Framework::mainLoop()
[2748]55{
[4293]56  while(true)
57    {
[4297]58      // keyhandler returns false if sdl gets quit by some event
[4303]59      if (!this->keyHandler())
[4293]60        return false;
[2939]61
[4297]62      // tick the scene
[4303]63      float dt = this->tick();
[4297]64
[4293]65      // Draw the scene
[4303]66      this->draw(dt);
[4293]67    }
68}
69
70
[4297]71bool Framework::draw(float dt)
[4293]72{
[2748]73  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
74  glLoadIdentity(); // Reset the view
75 
[4294]76  ParticleEngine::getInstance()->draw(dt);
[4297]77
78  camera->apply();
[4294]79 
[2748]80  SDL_GL_SwapBuffers(); // Swap the buffers
81}
[4300]82
83
[4297]84float Framework::tick()
[2748]85{
[4293]86  currFrame = SDL_GetTicks();
[4300]87  float dt = (float)(currFrame - lastFrame) / 1000.0;
88  lastFrame = currFrame;
[3398]89
[4293]90  ParticleEngine::getInstance()->tick(dt);
[2963]91
[4294]92  NullParent::getInstance()->update(dt);
93  return dt;
[4293]94}
[2952]95
[2931]96
[4297]97bool Framework::keyHandler()
[4293]98{
[2748]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;
[4305]103    while(SDL_PollEvent(&event))
[4303]104    {
[2748]105      switch (event.type) {
[2931]106      case SDL_MOUSEMOTION:
[4306]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);
[4300]120           
[4306]121        }
[2931]122        break;
123      case SDL_MOUSEBUTTONDOWN:
[4306]124        switch (event.button.button)
[2933]125          {
[4306]126          case 4:
[3656]127            PRINTF(4)("MouseWheel up\n");
[4310]128            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
[4306]129            break;
130          case 5:
[3656]131            PRINTF(4)("MouseWheel down\n");
[4310]132            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
[4306]133            break;
134          case 1:
135          case 2:
136          case 3:
137            mouseDown[event.button.button] = true;
138            break;
[2933]139          }
[2932]140           
[2931]141        break;
[2952]142      case SDL_MOUSEBUTTONUP:
[4306]143        switch (event.button.button)
144          {
145          case 1:
146          case 2:
147          case 3:
148            mouseDown[event.button.button] = false;
149            break;
150          }
[2931]151        break;
[4302]152      case SDL_VIDEORESIZE:
153        GraphicsEngine::getInstance()->resolutionChanged(&event.resize);
154        break;
[3211]155      case SDL_KEYDOWN:
156        switch (event.key.keysym.sym)
157          {
158          case SDLK_x:
[4298]159           
[3211]160            break;
161          case SDLK_c:
[4293]162
[3211]163            break;
[4296]164          case SDLK_i:
165            ParticleEngine::getInstance()->debug();
166            break;
[3418]167          case SDLK_a:
[4310]168            camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
[3418]169            break;
170          case SDLK_z:
[4310]171            camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1);
[4300]172            break;
[4307]173          case SDLK_h:
174            this->printHelp();
175            break;
[4308]176
177          case SDLK_1:
[4309]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            }
[4308]186            break;
[4309]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
[3211]273          }
274        break;
[2952]275           
[2748]276        // If a quit event was recieved
[2863]277      case SDL_QUIT:
278        // then we're done and we'll end this program
[4293]279        return false;
280        break;
[2863]281      default:
[4293]282        break;
[2748]283      }
[2952]284
[2748]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
[4293]291    if(keys[SDLK_ESCAPE]) return false;
[2748]292  }
[4293]293  return true;
294}
[2748]295
[4317]296Framework* Framework::singletonRef = NULL;
[4293]297
[4317]298Framework* Framework::getInstance(void)
299{
300  if (Framework::singletonRef == NULL)
301    Framework::singletonRef = new Framework();
302  return Framework::singletonRef;
303}
304
[4300]305Framework::Framework()
[4293]306{
[4304]307  this->lastFrame = 0;
[4293]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
[4300]312  LightManager::getInstance();
313  glEnable(GL_TEXTURE_2D);
[4293]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
[4306]319  for (int i = 0; i <MOUSE_BUTTON_COUNT; i++)
320    mouseDown[i] = false;
321
[4295]322  ResourceManager::getInstance()->setDataDir(DATA_DIRECTORY);
[4294]323 
324
[4305]325  initModule();
[4294]326
[4297]327  camera = new Camera();
[4294]328
[4305]329  State::getInstance()->setCamera(camera, camera->getTarget());
[4294]330
331  camera->setAbsCoor(Vector(10, 10, 0));
332
[4297]333}
334
335Framework::~Framework()
336{
337  delete GraphicsEngine::getInstance();
338
339}
340
[4307]341
342
343void Framework::printHelp(void) const
344{
[4309]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");
[4307]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
[4323]360int changeOption(GtkWidget* nonInterest, void* widget)
361{
362  Option* option = (Option*) widget;
363  const char* name = option->getTitle();
364  char* valueC = option->save();
365  float value = atof(valueC);
[4307]366
[4323]367  ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1);
368  if (tmpEmit)
369    {
370      if (!strcmp(name, "EmissionRate"))
[4327]371        {
372          tmpEmit->setEmissionRate(value);
373          PRINT(3)("EmissionRate set to %f\n", value);
374        }
[4325]375      else if (!strcmp(name, "Velocity"))
[4327]376        {
377          tmpEmit->setEmissionVelocity(value);
378          PRINT(3)("Velocity set to %f\n", value);
379        }
380      else if(!strcmp(name, "SpreadAngle"))
381        {
382          tmpEmit->setSpread(value);
383          PRINT(3)("SpreadAngle set to %f\n", value);
384        }
385      else if(!strcmp(name, "EmitterType"))
386        {
387          if (!strcmp(valueC, "EMITTER_DOT"))
388            tmpEmit->setType(EMITTER_DOT);
389          else if (!strcmp(valueC, "EMITTER_PLANE"))
390            tmpEmit->setType(EMITTER_PLANE);
391          else if (!strcmp(valueC, "EMITTER_CUBE"))
392            tmpEmit->setType(EMITTER_CUBE);
393          PRINT(3)("EmitterType set to %s\n", valueC);   
394        }
395      else if(!strcmp(name, "EmitterSize"))
396        {
397          tmpEmit->setSize(value);
398          PRINT(3)("EmitterSize set to %f\n", value);
399        }
[4323]400    }
401
[4327]402  ParticleSystem* tmpSys = ParticleEngine::getInstance()->getSystemByNumber(1);
403  if (tmpSys)
404    {
405      if (!strcmp(name, "StartRadius"))
406        {
407          tmpSys->setRadius(value, tmpSys->getEndRadius());
408          PRINT(3)("ParticleStartRadius set to %f\n", value);
409        }
410      else if (!strcmp(name, "EndRadius"))
411        {
412          tmpSys->setRadius( tmpSys->getStartRadius(), value);
413          PRINT(3)("ParticleEndRadius set to %f\n", value);
414        }
415
416      else if (!strcmp(name, "LifeSpan"))
417        {
418          tmpSys->setLifeSpan(value);
419          PRINT(3)("ParticleLifeSpan set to %f\n", value);
420        }
421
422      else if (!strcmp(name, "ConserveFactor"))
423        {
424          tmpSys->setConserve(value);
425          PRINT(3)("ParticleConserveFactor set to %f\n", value);
426        }
427
428      else if (!strcmp(name, "ParticleType"))
429        {
430          if (!strcmp(valueC, "PARTICLE_DOT"))
431            tmpSys->setType(PARTICLE_DOT);
432          else if (!strcmp(valueC, "PARTICLE_SPARK"))
433            tmpSys->setType(PARTICLE_SPARK);
434          else if (!strcmp(valueC, "PARTICLE_SPRITE"))
435            tmpSys->setType(PARTICLE_SPRITE);
436
437          PRINT(3)("ParticleType set to %f\n", valueC);
438        }
439
440      else if (!strcmp(name, "InheritSpeed"))
441        {
442          tmpSys->setInheritSpeed(value);
443          PRINT(3)("ParticleInheritSpeed set to %f\n", value);
444        }
445
446    }
447
448  delete valueC;
[4323]449}
450
451
[4316]452void* Framework::initGui(void* argv)
453{
454  Window* guiMainWindow = NULL;
455 
456  initGUI(0, NULL);
457 
458  guiMainWindow = new Window("ParticlesFUN");
[4317]459  {
460    Box* windowBox = new Box('v');
461    {
[4327]462      Frame* emitterFrame = new Frame("emitter-settings");
463      {
464        Box* emitterBox = new Box('v');
465        {
466          emitterBox->fill(new Label("EmissionRate"));
467          Slider* EmissionRate = new Slider("EmissionRate", 0, 1000);
468          EmissionRate->connectSignal("value_changed", (void*)EmissionRate, changeOption );
469          emitterBox->fill(EmissionRate);
470         
471          emitterBox->fill(new Label("Velocity"));
472          Slider* velocity = new Slider("Velocity", 0, 2);
473          velocity->setExactness(3);
474          velocity->connectSignal("value_changed", (void*)velocity, changeOption );
475          emitterBox->fill(velocity);
476         
477          emitterBox->fill(new Label("SpreadAngle"));
478          Slider* SpreadAngle = new Slider("SpreadAngle", 0, M_PI);
479          SpreadAngle->setExactness(3);
480          SpreadAngle->connectSignal("value_changed", (void*)SpreadAngle, changeOption );
481          emitterBox->fill(SpreadAngle);
[4323]482
[4327]483          emitterBox->fill(new Label("EmitterType"));
484          Menu* EmitterType = new Menu("EmitterType");
485          EmitterType->addItem("EMITTER_DOT");
486          EmitterType->addItem("EMITTER_PLANE");
487          EmitterType->addItem("EMITTER_CUBE");
488          EmitterType->connectSignal("changed", (void*)EmitterType, changeOption );       
489          emitterBox->fill(EmitterType);
[4325]490
[4327]491          emitterBox->fill(new Label("EmitterSize"));
492          Slider* EmitterSize = new Slider("EmitterSize", 0, 100);
493          EmitterSize->setExactness(1);
494          EmitterSize->connectSignal("value_changed", (void*)EmitterSize, changeOption );
495          emitterBox->fill(EmitterSize);
496        }
497        emitterFrame->fill(emitterBox);
498      }
499      windowBox->fill(emitterFrame);
[4325]500     
[4327]501      Frame* systemFrame = new Frame("system-settings");
502      {
503        Box* systemBox = new Box('v');
504        {
505          systemBox->fill(new Label("StartRadius"));
506          Slider* StartRadius = new Slider("StartRadius", 0, 10);
507          StartRadius->setExactness(3);
508          StartRadius->connectSignal("value_changed", (void*)StartRadius, changeOption );
509          systemBox->fill(StartRadius);
[4325]510
[4327]511          systemBox->fill(new Label("EndRadius"));
512          Slider* EndRadius = new Slider("EndRadius", 0, 10);
513          EndRadius->setExactness(3);
514          EndRadius->connectSignal("value_changed", (void*)EndRadius, changeOption );
515          systemBox->fill(EndRadius);
[4323]516
[4327]517          systemBox->fill(new Label("LifeSpan"));
518          Slider* LifeSpan = new Slider("LifeSpan", 0, 10);
519          LifeSpan->setExactness(3);
520          LifeSpan->connectSignal("value_changed", (void*)LifeSpan, changeOption );
521          systemBox->fill(LifeSpan);
522         
523          systemBox->fill(new Label("ConserveFactor"));
524          Slider* ConserveFactor = new Slider("ConserveFactor", 0, 1);
525          ConserveFactor->setExactness(3);
526          ConserveFactor->connectSignal("value_changed", (void*)ConserveFactor, changeOption );
527          systemBox->fill(ConserveFactor);
[4323]528
[4327]529          systemBox->fill(new Label("ParticleType"));
530          Menu* ParticleType = new Menu("ParticleType");
531          ParticleType->addItem("PARTICLE_DOT");
532          ParticleType->addItem("PARTICLE_SPARK");
533          ParticleType->addItem("PARTICLE_SPRITE");
534          ParticleType->connectSignal("changed", (void*)ParticleType, changeOption );     
535          systemBox->fill(ParticleType);
536         
537          systemBox->fill(new Label("InheritSpeed"));
538          Slider* InheritSpeed = new Slider("InheritSpeed", 0, 1);
539          InheritSpeed->setExactness(3);
540          InheritSpeed->connectSignal("value_changed", (void*)InheritSpeed, changeOption );
541          systemBox->fill(InheritSpeed);
542
543
544        }
545        systemFrame->fill(systemBox);
546      }
547      windowBox->fill(systemFrame);
548     
549      Button* quitButton = new Button("quit");
550     
551     
[4317]552      windowBox->fill(quitButton);
553    }
554    guiMainWindow->fill(windowBox);
555  }
[4316]556  Window::mainWindow->showall();
[4327]557  Window::mainWindow->setSize(300, 500);
[4316]558  mainloopGUI();
559}
[4307]560
[4316]561
562
[4297]563int main(int argc, char *argv[])
564{
565  verbose = 3;
[4316]566  pthread_t guiThread;
567
[4317]568  Framework* framework = Framework::getInstance();
[4316]569
570  pthread_create(&guiThread, NULL, Framework::initGui,(void*) argv);
571  //  framework->initGui(argv);
572
[4297]573  framework->mainLoop();
574
575  delete framework;
[2748]576  // Kill the GL & SDL screens
577  // And quit
578  return 0;
579}
Note: See TracBrowser for help on using the repository browser.