home *** CD-ROM | disk | FTP | other *** search
- #include "VehicleEffectsParticleClusters.h"
-
- #include "WeaponEffectsParticleClusters.h"
- #include "random.h"
- #include "Game.h"
-
-
-
- SpawnEffectParticleCluster::SpawnEffectParticleCluster(vec3_t pos):ParticleCluster(1500) {
- importance = 1;
- vectorCopy3d(pos, this->pos);
- model = Game::preloadedGameMedia.spawnEffectSpheresModel;
- // printf("const\n");
-
- if( Renderer::info.var.useDynamicLighting ){
- vec3_t col;
- vectorInit3d(0.4f, 0.8f, 0.4f, col);
- Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 10.0f, 1000) );
- }
- if( Sound::info.var.enabled && Sound::info.var.playSamples ){
- Sound::playEffect(pos, Game::preloadedGameMedia.spawnEffectSound, 0);
- }
-
- boundingSphereRadius = 5.0f;
- }
-
-
- SpawnEffectParticleCluster::~SpawnEffectParticleCluster(){
- // printf("dest\n");
- }
-
- void SpawnEffectParticleCluster::move(){
- // printf("move\n");
- }
-
- void SpawnEffectParticleCluster::render(){
- glPushMatrix();
- glTranslatef(pos[0], pos[1], pos[2]);
- float scale = 1.0f;
- float t = (SDL_GetTicks()-spawntimeMillis)/(float)lifetimeMillis;
- if( t > 0.75f ){
- scale = 4.0f - 4.0f*t;
- }
- glScalef(scale, scale, scale);
- Renderer::renderModel(model);
- glPopMatrix();
- }
-
-
-
-
- ExplodingVehicleParticleCluster::ExplodingVehicleParticleCluster(Vehicle* vehicle): ParticleCluster(2000) {
- importance = 1;
-
- vectorCopy3d(vehicle->pos, this->pos);
- boundingSphereRadius = 5.0f;
- nextExplosionMillis = 0;
-
- this->vehicle = Vehicle::createVehicleForClient(vehicle->client);
- bigExplosionLinked = false;
-
- Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(pos) );
- }
-
- ExplodingVehicleParticleCluster::~ExplodingVehicleParticleCluster(){
- delete vehicle;
- }
-
- void ExplodingVehicleParticleCluster::move(){
- unsigned long currentMillis = SDL_GetTicks();
-
- vectorCopy3d(vehicle->pos, this->pos);
-
- if( currentMillis > nextExplosionMillis ){
- vec3_t p;
- vectorInit3d(pos[0]+frand(-1.0f, 1.0f), pos[1]+frand(-1.0f, 1.0f), pos[2]+frand(-1.0f, 1.0f), p);
- float r = frand();
- if( r < 0.1f ){
- Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(p) );
- }else if( r < 0.5f ){
- Renderer::particleSystem.linkParticleCluster( new MediumExplosionParticleCluster(p) );
- }else{
- Renderer::particleSystem.linkParticleCluster( new SmallExplosionParticleCluster(p) );
- }
-
- nextExplosionMillis = currentMillis + 300 + irand(300);
- }
-
- if( currentMillis > spawntimeMillis + lifetimeMillis*0.8 && !bigExplosionLinked){ // link the final blow
- for(int i=0;i<4;i++){
- vec3_t p;
- vectorInit3d(pos[0]+frand(-1.0f, 1.0f), pos[1]+frand(-1.0f, 1.0f), pos[2]+frand(-1.0f, 1.0f), p);
- Renderer::particleSystem.linkParticleCluster( new BigExplosionParticleCluster(p) );
- }
-
- Renderer::particleSystem.linkParticleCluster( new ShockwaveParticleCluster(pos) );
-
- bigExplosionLinked = true;
- }
-
- if( !bigExplosionLinked ){
- float deltaT = (currentMillis - vehicle->lastMoveMillis)/1000.0f;
- vehicle->turnLeft(deltaT); // to simulate loss of control
- vehicle->moveDown(deltaT);
-
- vehicle->move();
- }
- }
-
- void ExplodingVehicleParticleCluster::render(){
- if( !bigExplosionLinked ){
- vehicle->render();
- }
- }
-
-
- ShockwaveParticleCluster::ShockwaveParticleCluster(vec3_t pos): ParticleCluster(200) {
- importance = 2;
- vectorCopy3d(pos, this->pos);
-
- shader = Game::preloadedGameMedia.shockwaveShader;
-
- boundingSphereRadius = 0.0f;
- }
-
- ShockwaveParticleCluster::~ShockwaveParticleCluster(){
- }
-
- void ShockwaveParticleCluster::render(){
- unsigned long t = SDL_GetTicks() - spawntimeMillis;
- float r = 1.0f + 10.0f*(t / (float)lifetimeMillis);
-
- vec3_t p1, p2, p3, p4;
-
- vectorMA3d(this->pos, r, e1, p1);
- vectorMA3d(this->pos, r, e3, p2);
- vectorMA3d(this->pos, -r, e1, p3);
- vectorMA3d(this->pos, -r, e3, p4);
-
- shader->setup(t);
- Renderer::renderQuad(p1, p2, p3, p4);
- shader->setdown();
- }
-
-