home *** CD-ROM | disk | FTP | other *** search
/ Enter 2005 March / ENTER.ISO / files / fwp-0.0.6-win32-installer.exe / WeaponEffectsParticleClusters.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-01-14  |  13.9 KB  |  520 lines

  1. #include "WeaponEffectsParticleClusters.h"
  2.  
  3. #include "Game.h"
  4. #include "random.h"
  5. #include "Network.h"
  6. #include "matrixmath.h"
  7.  
  8. ChaingunMuzzleFlashParticleCluster::ChaingunMuzzleFlashParticleCluster(ChaingunShot* shot):ParticleCluster(20) {
  9.     importance = 1;
  10.  
  11.     clientId = shot->clientId;
  12.     weaponId = shot->weaponId;
  13.  
  14.     vectorCopy3d(shot->pos, this->pos);
  15.     vectorCopy3d(shot->dir, this->dir);
  16.     vectorCopy3d(shot->up, this->up);
  17.     vectorCrossP3d(up, dir, left);
  18.     model = Game::preloadedGameMedia.chaingunMuzzleFlashModel;
  19.  
  20.  
  21.     boundingSphereRadius = 1.0f;
  22. }
  23.  
  24. ChaingunMuzzleFlashParticleCluster::~ChaingunMuzzleFlashParticleCluster(){
  25. }
  26.  
  27. void ChaingunMuzzleFlashParticleCluster::render(){
  28.     // to make sure the flash appears on the muzzle
  29.     if( Network::server->clients[clientId] != NULL && Network::server->clients[clientId]->vehicle != NULL && Network::server->clients[clientId]->vehicle->weapons[weaponId] != NULL){
  30.         Weapon* weapon = Network::server->clients[clientId]->vehicle->weapons[weaponId];
  31.         vectorCopy3d(weapon->vehicle->dir, this->dir);
  32.         vectorCopy3d(weapon->vehicle->up, this->up);
  33.         vectorCrossP3d(up, dir, left);
  34.  
  35.         vec4_t p;
  36.         vectorAdd3d(weapon->mountPoint, weapon->muzzlePoint, p);
  37.         float m[] = {    left[0], left[1], left[2], 0.0f,
  38.                         up[0], up[1], up[2], 0.0f,
  39.                         dir[0], dir[1], dir[2], 0.0f,
  40.                         weapon->vehicle->pos[0], weapon->vehicle->pos[1], weapon->vehicle->pos[2], 1.0f
  41.                     };
  42.         p[3] = 1.0f;
  43.         matrixMultVector(m, p, 4, p);
  44.         vectorCopy3d(p, this->pos);
  45.     }
  46.     
  47.     glPushMatrix();
  48.     float m[] = {    left[0], left[1], left[2], 0.0f,
  49.                     up[0], up[1], up[2], 0.0f,
  50.                     dir[0], dir[1], dir[2], 0.0f,
  51.                     pos[0], pos[1], pos[2], 1.0f
  52.                 };
  53.     glMultMatrixf(m);
  54.  
  55.     Renderer::renderModel(model);
  56.     glPopMatrix();
  57. }
  58.  
  59.  
  60.  
  61. ChaingunImpactParticleCluster::ChaingunImpactParticleCluster(ChaingunShot* shot, vec3_t pos):ParticleCluster(150) {
  62.     importance = 1;
  63.     vectorCopy3d(pos, this->pos);
  64.     shader = Game::preloadedGameMedia.chaingunImpactShader;
  65.  
  66.     boundingSphereRadius = 0.5f;
  67. }
  68.  
  69. ChaingunImpactParticleCluster::~ChaingunImpactParticleCluster(){
  70. }
  71.  
  72. void ChaingunImpactParticleCluster::render(){
  73.     if( Renderer::info.var.useTransparentPolysList ){
  74.         Renderer::addBillboardToTransparentPolys(pos, 0.2f, 0.2f, shader, SDL_GetTicks() - spawntimeMillis);
  75.     }else{
  76.         shader->setup(SDL_GetTicks() - spawntimeMillis);
  77.         Renderer::renderBillboard(pos, 0.2f, 0.2f, shader, SDL_GetTicks() - spawntimeMillis);
  78.         shader->setdown();
  79.     }
  80. }
  81.  
  82.  
  83.  
  84. ChaingunRicochetParticleCluster::ChaingunRicochetParticleCluster(vec3_t pos1, vec3_t pos2):ParticleCluster(10) {
  85.     importance = 2;
  86.     vectorCopy3d(pos1, this->pos);
  87.     vectorCopy3d(pos2, this->pos2);
  88.     vectorSub3d(pos2, pos, dir);
  89.  
  90.     shader = Game::preloadedGameMedia.chaingunRicochetShader;
  91.  
  92.     boundingSphereRadius = vectorLength3d(dir);
  93.     vectorNormalize3d(dir, dir);
  94. }
  95.  
  96. ChaingunRicochetParticleCluster::~ChaingunRicochetParticleCluster(){
  97. }
  98.  
  99. void ChaingunRicochetParticleCluster::render(){
  100.     shader->setup(SDL_GetTicks() - spawntimeMillis);
  101.  
  102.     vec3_t toCam, up;
  103.     vectorSub3d(Game::cam.pos, pos, toCam);
  104.     vectorCrossP3d(toCam, dir, up);
  105.     vectorNormalize3d(up, up);
  106.  
  107.     vec3_t p1, p2, p3, p4;
  108.     vectorMA3d(pos, -0.02f, up, p1);
  109.     vectorMA3d(pos2, -0.02f, up, p2);
  110.     vectorMA3d(pos2, 0.02f, up, p3);
  111.     vectorMA3d(pos, 0.02f, up, p4);
  112.     Renderer::renderQuad(p1, p2, p3, p4);
  113.  
  114.     shader->setdown();
  115. }
  116.  
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123. ChaingunMarkParticleCluster::ChaingunMarkParticleCluster(vec3_t pos, Face* face):ParticleCluster(6000) {
  124.     importance = 3;
  125.     vectorMA3d(pos, 0.01f, face->normal, this->pos);
  126.  
  127.     shader = Game::preloadedGameMedia.chaingunMarkShaders[face->material->surfaceType];
  128.  
  129.     vec3_t d1, d2;
  130.     vectorSub3d(&face->vertices[0], pos, d1);
  131.     vectorNormalize3d(d1, d1);
  132.     vectorCrossP3d(face->normal, d1, d2);
  133.     vectorNormalize3d(d2, d2);
  134.  
  135.     vectorMA3d(this->pos, 0.07f, d1, p1);
  136.     vectorMA3d(this->pos, 0.07f, d2, p2);
  137.     vectorMA3d(this->pos, -0.07f, d1, p3);
  138.     vectorMA3d(this->pos, -0.07f, d2, p4);
  139.  
  140.     boundingSphereRadius = 0.5f;
  141. }
  142.  
  143. ChaingunMarkParticleCluster::~ChaingunMarkParticleCluster(){
  144. }
  145.  
  146. void ChaingunMarkParticleCluster::render(){
  147.     shader->setup(SDL_GetTicks() - spawntimeMillis);
  148.  
  149.     Renderer::renderQuad(p1, p2, p3, p4);
  150.  
  151.     shader->setdown();
  152. }
  153.  
  154.  
  155.  
  156.  
  157.  
  158. PlasmagunImpactParticleCluster::PlasmagunImpactParticleCluster(PlasmagunShot* shot, vec3_t pos):ParticleCluster(300) {
  159.     importance = 1;
  160.     vectorCopy3d(pos, this->pos);
  161.     shader = Game::preloadedGameMedia.plasmagunImpactShader;
  162.  
  163.     boundingSphereRadius = 0.5f;
  164. }
  165.  
  166. PlasmagunImpactParticleCluster::~PlasmagunImpactParticleCluster(){
  167. }
  168.  
  169. void PlasmagunImpactParticleCluster::render(){
  170.     if( Renderer::info.var.useTransparentPolysList ){
  171.         Renderer::addBillboardToTransparentPolys(pos, 0.8f, 0.8f, shader, SDL_GetTicks() - spawntimeMillis);
  172.     }else{
  173.         Renderer::renderBillboard(pos, 0.8f, 0.8f, shader, SDL_GetTicks() - spawntimeMillis);
  174.     }
  175. }
  176.  
  177. PlasmagunMarkParticleCluster::PlasmagunMarkParticleCluster(vec3_t pos, Face* face):ParticleCluster(6000) {
  178.     importance = 3;
  179.     vectorMA3d(pos, 0.01f, face->normal, this->pos);
  180.  
  181.     shader = Game::preloadedGameMedia.plasmagunMarkShader;
  182.  
  183.     vec3_t d1, d2;
  184.     vectorSub3d(&face->vertices[0], pos, d1);
  185.     vectorNormalize3d(d1, d1);
  186.     vectorCrossP3d(face->normal, d1, d2);
  187.     vectorNormalize3d(d2, d2);
  188.  
  189.     vectorMA3d(this->pos, 0.15f, d1, p1);
  190.     vectorMA3d(this->pos, 0.15f, d2, p2);
  191.     vectorMA3d(this->pos, -0.15f, d1, p3);
  192.     vectorMA3d(this->pos, -0.15f, d2, p4);
  193.  
  194.     boundingSphereRadius = 0.5f;
  195. }
  196.  
  197. PlasmagunMarkParticleCluster::~PlasmagunMarkParticleCluster(){
  198. }
  199.  
  200. void PlasmagunMarkParticleCluster::render(){
  201.     shader->setup(SDL_GetTicks() - spawntimeMillis);
  202.  
  203.     Renderer::renderQuad(p1, p2, p3, p4);
  204.  
  205.     shader->setdown();
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214. LaserMarkParticleCluster::LaserMarkParticleCluster(vec3_t pos, Face* face):ParticleCluster(6000) {
  215.     importance = 3;
  216.     vectorMA3d(pos, 0.01f, face->normal, this->pos);
  217.  
  218.     shader = Game::preloadedGameMedia.laserMarkShader;
  219.  
  220.     vec3_t d1, d2;
  221.     vectorSub3d(&face->vertices[0], pos, d1);
  222.     vectorNormalize3d(d1, d1);
  223.     vectorCrossP3d(face->normal, d1, d2);
  224.     vectorNormalize3d(d2, d2);
  225.  
  226.     vectorMA3d(this->pos, 0.1f, d1, p1);
  227.     vectorMA3d(this->pos, 0.1f, d2, p2);
  228.     vectorMA3d(this->pos, -0.1f, d1, p3);
  229.     vectorMA3d(this->pos, -0.1f, d2, p4);
  230.  
  231.     boundingSphereRadius = 0.5f;
  232. }
  233.  
  234. LaserMarkParticleCluster::~LaserMarkParticleCluster(){
  235. }
  236.  
  237. void LaserMarkParticleCluster::render(){
  238.     shader->setup(SDL_GetTicks() - spawntimeMillis);
  239.  
  240.     Renderer::renderQuad(p1, p2, p3, p4);
  241.  
  242.     shader->setdown();
  243. }
  244.  
  245.  
  246.  
  247.  
  248. RailgunTrailParticleCluster::RailgunTrailParticleCluster(vec3_t pos1, vec3_t pos2):ParticleCluster(500) {
  249.     importance = 2;
  250.     vectorCopy3d(pos1, this->pos);
  251.     vectorCopy3d(pos2, this->pos2);
  252.     vectorSub3d(pos2, pos, dir);
  253.  
  254.     shader = Game::preloadedGameMedia.railgunTrailShader;
  255.  
  256.     boundingSphereRadius = vectorLength3d(dir);
  257.     vectorNormalize3d(dir, dir);
  258. }
  259.  
  260. RailgunTrailParticleCluster::~RailgunTrailParticleCluster(){
  261. }
  262.  
  263. void RailgunTrailParticleCluster::render(){
  264.     unsigned long t = SDL_GetTicks() - spawntimeMillis;
  265.  
  266.     float w = 0.01f + 0.06*( t / (float)lifetimeMillis );
  267.  
  268.     vec3_t toCam, up;
  269.     vectorSub3d(Game::cam.pos, pos, toCam);
  270.     vectorCrossP3d(toCam, dir, up);
  271.     vectorNormalize3d(up, up);
  272.  
  273.     vec3_t p1, p2, p3, p4;
  274.     vectorMA3d(pos, -w, up, p1);
  275.     vectorMA3d(pos2, -w, up, p2);
  276.     vectorMA3d(pos2, w, up, p3);
  277.     vectorMA3d(pos, w, up, p4);
  278.  
  279.     shader->setup(t);
  280.     Renderer::renderQuad(p1, p2, p3, p4);
  281.     shader->setdown();
  282. }
  283.  
  284.  
  285.  
  286. RailgunImpactParticleCluster::RailgunImpactParticleCluster(vec3_t pos, Face* face):ParticleCluster(200) {
  287.     importance = 2;
  288.     vectorCopy3d(pos, this->pos);
  289.     this->face = face;
  290.  
  291.     shader = Game::preloadedGameMedia.railgunImpactShader;
  292.  
  293.     boundingSphereRadius = 0.5f;
  294. }
  295.  
  296. RailgunImpactParticleCluster::~RailgunImpactParticleCluster(){
  297. }
  298.  
  299. void RailgunImpactParticleCluster::render(){
  300.     unsigned long t = SDL_GetTicks() - spawntimeMillis;
  301.     float r = 0.1f + 0.5*(t / (float)lifetimeMillis);
  302.  
  303.     if( face != NULL ){
  304.         vec3_t d1, d2;
  305.         vec3_t p1, p2, p3, p4;
  306.         vectorSub3d(&face->vertices[0], pos, d1);
  307.         vectorNormalize3d(d1, d1);
  308.         vectorCrossP3d(face->normal, d1, d2);
  309.         vectorNormalize3d(d2, d2);
  310.  
  311.         vectorMA3d(this->pos, r, d1, p1);
  312.         vectorMA3d(this->pos, r, d2, p2);
  313.         vectorMA3d(this->pos, -r, d1, p3);
  314.         vectorMA3d(this->pos, -r, d2, p4);
  315.  
  316.         shader->setup(t);
  317.         Renderer::renderQuad(p1, p2, p3, p4);
  318.         shader->setdown();
  319.     }else{
  320.         if( Renderer::info.var.useTransparentPolysList ){
  321.             Renderer::addBillboardToTransparentPolys(pos, r, r, shader, t);
  322.         }else{
  323.             Renderer::renderBillboard(pos, r, r, shader, t);
  324.         }
  325.     }
  326.  
  327. }
  328.  
  329.  
  330. RailgunMarkParticleCluster::RailgunMarkParticleCluster(vec3_t pos, Face* face):ParticleCluster(6000) {
  331.     importance = 3;
  332.     vectorMA3d(pos, 0.01f, face->normal, this->pos);
  333.  
  334.     shader = Game::preloadedGameMedia.railgunMarkShader;
  335.  
  336.     vec3_t d1, d2;
  337.     vectorSub3d(&face->vertices[0], pos, d1);
  338.     vectorNormalize3d(d1, d1);
  339.     vectorCrossP3d(face->normal, d1, d2);
  340.     vectorNormalize3d(d2, d2);
  341.  
  342.     vectorMA3d(this->pos, 0.1f, d1, p1);
  343.     vectorMA3d(this->pos, 0.1f, d2, p2);
  344.     vectorMA3d(this->pos, -0.1f, d1, p3);
  345.     vectorMA3d(this->pos, -0.1f, d2, p4);
  346.  
  347.     boundingSphereRadius = 0.5f;
  348. }
  349.  
  350. RailgunMarkParticleCluster::~RailgunMarkParticleCluster(){
  351. }
  352.  
  353. void RailgunMarkParticleCluster::render(){
  354.     shader->setup(SDL_GetTicks() - spawntimeMillis);
  355.  
  356.     Renderer::renderQuad(p1, p2, p3, p4);
  357.  
  358.     shader->setdown();
  359. }
  360.  
  361.  
  362.  
  363.  
  364. TinyExplosionParticleCluster::TinyExplosionParticleCluster(vec3_t pos):ParticleCluster(320) {
  365.     importance = 1;
  366.     vectorCopy3d(pos, this->pos);
  367.     shader = Game::preloadedGameMedia.tinyExplosionShader;
  368.  
  369.     boundingSphereRadius = 1.0f;
  370.  
  371.  
  372.     if( Renderer::info.var.useDynamicLighting ){
  373.         vec3_t col;
  374.         vectorInit3d(0.8f, 0.7f, 0.5f, col);
  375.         Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 3.0f, 100) );
  376.     }
  377.  
  378.     if( Sound::info.var.enabled && Sound::info.var.playSamples ){
  379.         Sound::playEffect(pos, Game::preloadedGameMedia.tinyExplosionSound, 0);
  380.     }
  381. }
  382.  
  383. TinyExplosionParticleCluster::~TinyExplosionParticleCluster(){
  384. }
  385.  
  386. void TinyExplosionParticleCluster::render(){
  387.     if( Renderer::info.var.useTransparentPolysList ){
  388.         Renderer::addBillboardToTransparentPolys(pos, 0.5f, 0.5f, shader, SDL_GetTicks() - spawntimeMillis);
  389.     }else{
  390.         Renderer::renderBillboard(pos, 0.5f, 0.5f, shader, SDL_GetTicks() - spawntimeMillis);
  391.     }
  392. }
  393.  
  394.  
  395.  
  396. SmallExplosionParticleCluster::SmallExplosionParticleCluster(vec3_t pos):ParticleCluster(300) {
  397.     importance = 1;
  398.     vectorCopy3d(pos, this->pos);
  399.     shader = Game::preloadedGameMedia.smallExplosionShader;
  400.  
  401.     boundingSphereRadius = 2.0f;
  402.  
  403.  
  404.     if( Renderer::info.var.useDynamicLighting ){
  405.         vec3_t col;
  406.         vectorInit3d(0.8f, 0.7f, 0.5f, col);
  407.         Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 5.0f, 100) );
  408.     }
  409.  
  410.     if( Sound::info.var.enabled && Sound::info.var.playSamples ){
  411.         Sound::playEffect(pos, Game::preloadedGameMedia.smallExplosionSound, 0);
  412.     }
  413. }
  414.  
  415. SmallExplosionParticleCluster::~SmallExplosionParticleCluster(){
  416. }
  417.  
  418. void SmallExplosionParticleCluster::render(){
  419.     if( Renderer::info.var.useTransparentPolysList ){
  420.         Renderer::addBillboardToTransparentPolys(pos, 1.0f, 1.0f, shader, SDL_GetTicks() - spawntimeMillis);
  421.     }else{
  422.         Renderer::renderBillboard(pos, 1.0f, 1.0f, shader, SDL_GetTicks() - spawntimeMillis);
  423.     }
  424. }
  425.  
  426.  
  427.  
  428.  
  429. MediumExplosionParticleCluster::MediumExplosionParticleCluster(vec3_t pos):ParticleCluster(720) {
  430.     importance = 1;
  431.     vectorCopy3d(pos, this->pos);
  432.     shader = Game::preloadedGameMedia.mediumExplosionShader;
  433.  
  434.     boundingSphereRadius = 4.0f;
  435.  
  436.  
  437.     if( Renderer::info.var.useDynamicLighting ){
  438.         vec3_t col;
  439.         vectorInit3d(0.8f, 0.7f, 0.5f, col);
  440.         Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 7.0f, 300) );
  441.     }
  442.     if( Sound::info.var.enabled && Sound::info.var.playSamples ){
  443.         Sound::playEffect(pos, Game::preloadedGameMedia.mediumExplosionSound, 0);
  444.     }
  445.  
  446. }
  447.  
  448. MediumExplosionParticleCluster::~MediumExplosionParticleCluster(){
  449. }
  450.  
  451. void MediumExplosionParticleCluster::render(){
  452.     if( Renderer::info.var.useTransparentPolysList ){
  453.         Renderer::addBillboardToTransparentPolys(pos, 2.0f, 2.0f, shader, SDL_GetTicks() - spawntimeMillis);
  454.     }else{
  455.         Renderer::renderBillboard(pos, 2.0f, 2.0f, shader, SDL_GetTicks() - spawntimeMillis);
  456.     }
  457. }
  458.  
  459.  
  460.  
  461. BigExplosionParticleCluster::BigExplosionParticleCluster(vec3_t pos):ParticleCluster(800) {
  462.     importance = 1;
  463.     vectorCopy3d(pos, this->pos);
  464.     shader = Game::preloadedGameMedia.bigExplosionShader;
  465.  
  466.     boundingSphereRadius = 5.0f;
  467.  
  468.  
  469.     if( Renderer::info.var.useDynamicLighting ){
  470.         vec3_t col;
  471.         vectorInit3d(0.8f, 0.7f, 0.5f, col);
  472.         Renderer::particleSystem.linkParticleCluster( new DynamicLightParticleCluster(pos, col, 10.0f, 400) );
  473.     }
  474.  
  475.     if( Sound::info.var.enabled && Sound::info.var.playSamples ){
  476.         Sound::playEffect(pos, Game::preloadedGameMedia.bigExplosionSound, 0);
  477.     }
  478. }
  479.  
  480. BigExplosionParticleCluster::~BigExplosionParticleCluster(){
  481. }
  482.  
  483. void BigExplosionParticleCluster::render(){
  484.     if( Renderer::info.var.useTransparentPolysList ){
  485.         Renderer::addBillboardToTransparentPolys(pos, 4.0f, 4.0f, shader, SDL_GetTicks() - spawntimeMillis);
  486.     }else{
  487.         Renderer::renderBillboard(pos, 4.0f, 4.0f, shader, SDL_GetTicks() - spawntimeMillis);
  488.     }
  489. }
  490.  
  491.  
  492.  
  493.  
  494. SmallSmokePuffParticleCluster::SmallSmokePuffParticleCluster(vec3_t pos):ParticleCluster(300) {
  495.     importance = 2;
  496.     vectorCopy3d(pos, this->pos);
  497.     shader = Game::preloadedGameMedia.smallSmokePuffShader;
  498.  
  499.     boundingSphereRadius = 1.0f;
  500. }
  501.  
  502. SmallSmokePuffParticleCluster::~SmallSmokePuffParticleCluster(){
  503. }
  504.  
  505. void SmallSmokePuffParticleCluster::render(){
  506.     unsigned long t = SDL_GetTicks() - spawntimeMillis;
  507.     float r = 0.2f + 0.2*(t / (float)lifetimeMillis);
  508.  
  509.     if( Renderer::info.var.useTransparentPolysList ){
  510.         Renderer::addBillboardToTransparentPolys(pos, r, r, shader, t);
  511.     }else{
  512. //        shader->setup(SDL_GetTicks() - spawntimeMillis);
  513.         Renderer::renderBillboard(pos, r, r, shader, t);
  514. //        shader->setdown();
  515.     }
  516. }
  517.  
  518.  
  519.  
  520.