home *** CD-ROM | disk | FTP | other *** search
/ Enter 2005 March / ENTER.ISO / files / fwp-0.0.6-win32-installer.exe / VehicleEffectsParticleClusters.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-12-24  |  3.9 KB  |  145 lines

  1. #include "VehicleEffectsParticleClusters.h"
  2.  
  3. #include "WeaponEffectsParticleClusters.h"
  4. #include "random.h"
  5. #include "Game.h"
  6.  
  7.  
  8.  
  9. SpawnEffectParticleCluster::SpawnEffectParticleCluster(vec3_t pos):ParticleCluster(1500) {
  10.     importance = 1;
  11.     vectorCopy3d(pos, this->pos);
  12.     model = Game::preloadedGameMedia.spawnEffectSpheresModel;
  13. //    printf("const\n");
  14.  
  15.     if( Renderer::info.var.useDynamicLighting ){
  16.         vec3_t col;
  17.         vectorInit3d(0.4f, 0.8f, 0.4f, col);
  18.         Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 10.0f, 1000) );
  19.     }
  20.     if( Sound::info.var.enabled && Sound::info.var.playSamples ){
  21.         Sound::playEffect(pos, Game::preloadedGameMedia.spawnEffectSound, 0);
  22.     }
  23.  
  24.     boundingSphereRadius = 5.0f;
  25. }
  26.  
  27.  
  28. SpawnEffectParticleCluster::~SpawnEffectParticleCluster(){
  29. //    printf("dest\n");
  30. }
  31.  
  32. void SpawnEffectParticleCluster::move(){
  33. //    printf("move\n");
  34. }
  35.  
  36. void SpawnEffectParticleCluster::render(){
  37.     glPushMatrix();
  38.     glTranslatef(pos[0], pos[1], pos[2]);
  39.     float scale = 1.0f;
  40.     float t = (SDL_GetTicks()-spawntimeMillis)/(float)lifetimeMillis;
  41.     if( t > 0.75f ){
  42.         scale = 4.0f - 4.0f*t;
  43.     }
  44.     glScalef(scale, scale, scale);
  45.     Renderer::renderModel(model);
  46.     glPopMatrix();
  47. }
  48.  
  49.  
  50.  
  51.  
  52. ExplodingVehicleParticleCluster::ExplodingVehicleParticleCluster(Vehicle* vehicle): ParticleCluster(2000) {
  53.     importance = 1;
  54.  
  55.     vectorCopy3d(vehicle->pos, this->pos);
  56.     boundingSphereRadius = 5.0f;
  57.     nextExplosionMillis = 0;
  58.  
  59.     this->vehicle = Vehicle::createVehicleForClient(vehicle->client);
  60.     bigExplosionLinked = false;
  61.  
  62.     Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(pos) );
  63. }
  64.  
  65. ExplodingVehicleParticleCluster::~ExplodingVehicleParticleCluster(){
  66.     delete vehicle;
  67. }
  68.  
  69. void ExplodingVehicleParticleCluster::move(){
  70.     unsigned long currentMillis = SDL_GetTicks();
  71.  
  72.     vectorCopy3d(vehicle->pos, this->pos);
  73.  
  74.     if( currentMillis > nextExplosionMillis ){
  75.         vec3_t p;
  76.         vectorInit3d(pos[0]+frand(-1.0f, 1.0f), pos[1]+frand(-1.0f, 1.0f), pos[2]+frand(-1.0f, 1.0f), p);
  77.         float r = frand();
  78.         if( r < 0.1f ){
  79.             Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(p) );
  80.         }else if( r < 0.5f ){
  81.             Renderer::particleSystem.linkParticleCluster( new MediumExplosionParticleCluster(p) );
  82.         }else{
  83.             Renderer::particleSystem.linkParticleCluster( new SmallExplosionParticleCluster(p) );
  84.         }
  85.  
  86.         nextExplosionMillis = currentMillis + 300 + irand(300);
  87.     }
  88.  
  89.     if( currentMillis > spawntimeMillis + lifetimeMillis*0.8 && !bigExplosionLinked){    // link the final blow
  90.         for(int i=0;i<4;i++){
  91.             vec3_t p;
  92.             vectorInit3d(pos[0]+frand(-1.0f, 1.0f), pos[1]+frand(-1.0f, 1.0f), pos[2]+frand(-1.0f, 1.0f), p);
  93.             Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(p) );
  94.         }
  95.  
  96.         Renderer::particleSystem.linkParticleCluster( new ShockwaveParticleCluster(pos) );
  97.  
  98.         bigExplosionLinked = true;
  99.     }
  100.  
  101.     if( !bigExplosionLinked ){
  102.         float deltaT = (currentMillis - vehicle->lastMoveMillis)/1000.0f;
  103.         vehicle->turnLeft(deltaT);    // to simulate loss of control
  104.         vehicle->moveDown(deltaT);
  105.  
  106.         vehicle->move();
  107.     }
  108. }
  109.  
  110. void ExplodingVehicleParticleCluster::render(){
  111.     if( !bigExplosionLinked ){
  112.         vehicle->render();
  113.     }
  114. }
  115.  
  116.  
  117. ShockwaveParticleCluster::ShockwaveParticleCluster(vec3_t pos): ParticleCluster(200) {
  118.     importance = 2;
  119.     vectorCopy3d(pos, this->pos);
  120.  
  121.     shader = Game::preloadedGameMedia.shockwaveShader;
  122.  
  123.     boundingSphereRadius = 0.0f;
  124. }
  125.  
  126. ShockwaveParticleCluster::~ShockwaveParticleCluster(){
  127. }
  128.  
  129. void ShockwaveParticleCluster::render(){
  130.     unsigned long t = SDL_GetTicks() - spawntimeMillis;
  131.     float r = 1.0f + 10.0f*(t / (float)lifetimeMillis);
  132.  
  133.     vec3_t p1, p2, p3, p4;
  134.  
  135.     vectorMA3d(this->pos, r, e1, p1);
  136.     vectorMA3d(this->pos, r, e3, p2);
  137.     vectorMA3d(this->pos, -r, e1, p3);
  138.     vectorMA3d(this->pos, -r, e3, p4);
  139.  
  140.     shader->setup(t);
  141.     Renderer::renderQuad(p1, p2, p3, p4);
  142.     shader->setdown();
  143. }
  144.  
  145.