Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

bullet.cpp

Go to the documentation of this file.
00001 #include <windows.h>
00002 #include "bullet.h"
00003 #include "decal.h"
00004 #include "vector.h"
00005 #include "vertex.h"
00006 #include "polygon.h"
00007 #include "texture.h"
00008 #include "listnode.h"
00009 #include "collision.h"
00010 #include "general.h"
00011 #include "camera.h"
00012 #include "bsp.h"
00013 #include "particle.h"
00014 #include "mmgr.h"
00015 
00016 extern VERTEX* vertex;
00017 extern TEXTURE* texture;
00018 extern int numBullets;
00019 extern BULLET* bullet;
00020 extern int numBulletsActive;
00021 extern int numleaves;
00022 extern LinkedList<BSP_node> LeafList;
00023 extern LinkedList<BSP_node> PartitionList;
00024 extern BSP_node* listnode;
00025 extern CAMERA* camera;
00026 extern int currentCamera;
00027 extern int bulletspeed;
00028 extern int bullettype;
00029 extern BSP_node* root;
00030 extern int maxDecals;
00031 extern DECAL muzzleflashdecal;
00032 extern DECAL impactflashdecal;
00033 
00034 BULLET::BULLET()
00035 {
00036 }
00037 
00038 BULLET::~BULLET()
00039 {
00040 }
00041 
00042 void BULLET::Reset()
00043 {
00044     Orientation.Reset();
00045     Position.Reset();
00046         Delta_x = 0.0;
00047         Delta_y = 0.0;
00048         Delta_z = 0.0;
00049         Matrix.LoadIdentity();
00050 }
00051 
00052 void BULLET::Initialize()
00053 {
00054     modelvertlist = new VERTEX[numverts];
00055     modelpolylist = new POLYGON[numpolys];
00056 }
00057 
00058 void BULLET::Draw()
00059 {
00060     glPushMatrix();
00061     glTranslatef(Position.x,Position.y,Position.z);
00062     Matrix.QuatToMatrix(Orientation);
00063     glMultMatrixf(Matrix.Element);
00064 /*
00065     float mat_ambient[] = { 0.3, 0.3, 0.3, 1.0 };
00066     float mat_diffuse[] = { 0.3, 0.3, 0.3, 1.0 };
00067     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
00068     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
00069 */
00070     glDisable(GL_TEXTURE_2D);
00071     for (int loop = 0; loop < numpolys; loop++)
00072     {
00073         glBegin(GL_TRIANGLES);
00074             glNormal3fv(&modelpolylist[loop].Vertex[0].normal.x);
00075             glTexCoord2f(modelpolylist[loop].Vertex[0].u, modelpolylist[loop].Vertex[0].v);
00076             glVertex3fv(&modelpolylist[loop].Vertex[0].coords.x);
00077             glTexCoord2f(modelpolylist[loop].Vertex[1].u, modelpolylist[loop].Vertex[1].v);
00078             glVertex3fv(&modelpolylist[loop].Vertex[1].coords.x);
00079             glTexCoord2f(modelpolylist[loop].Vertex[2].u, modelpolylist[loop].Vertex[2].v);
00080             glVertex3fv(&modelpolylist[loop].Vertex[2].coords.x);
00081         glEnd();
00082     }
00083     glEnable(GL_TEXTURE_2D);
00084     glPopMatrix();
00085 }
00086 
00087 
00088 void BULLET::Delete()
00089 {
00090     delete[] modelvertlist;
00091     delete[] modelpolylist;
00092 }
00093 
00094 void InitializeBullets()
00095 {
00096     VERTEX tempVertices[8];
00097 
00098     tempVertices[0].coords.x = -0.05;
00099     tempVertices[0].coords.y = 0.05;
00100     tempVertices[0].coords.z = 0.0;
00101 
00102     tempVertices[1].coords.x = 0.05;
00103     tempVertices[1].coords.y = 0.05;
00104     tempVertices[1].coords.z = 0.0;
00105 
00106     tempVertices[2].coords.x = 0.05;
00107     tempVertices[2].coords.y = 0.05;
00108     tempVertices[2].coords.z = -0.2;
00109 
00110     tempVertices[3].coords.x = -0.05;
00111     tempVertices[3].coords.y = 0.05;
00112     tempVertices[3].coords.z = -0.2;
00113 
00114     tempVertices[4].coords.x = -0.05;
00115     tempVertices[4].coords.y = -0.05;
00116     tempVertices[4].coords.z = 0.0;
00117 
00118     tempVertices[5].coords.x = 0.05;
00119     tempVertices[5].coords.y = -0.05;
00120     tempVertices[5].coords.z = 0.0;
00121 
00122     tempVertices[6].coords.x = 0.05;
00123     tempVertices[6].coords.y = -0.05;
00124     tempVertices[6].coords.z = -0.2;
00125 
00126     tempVertices[7].coords.x = -0.05;
00127     tempVertices[7].coords.y = -0.05;
00128     tempVertices[7].coords.z = -0.2;
00129 
00130     for (int loop = 0; loop < numBullets; loop++)
00131     {
00132         bullet[loop].numverts = 8;
00133         bullet[loop].numpolys = 12;
00134         bullet[loop].Initialize();
00135         bullet[loop].active = 0;
00136 
00137         for (int innerloop = 0; innerloop < bullet[loop].numpolys; innerloop++)
00138         {
00139             bullet[loop].modelpolylist[innerloop].numVertices = 3;
00140             bullet[loop].modelpolylist[innerloop].removable = 0;
00141         }
00142 
00143         bullet[loop].modelpolylist[0].Scale[0] = 1.0;
00144         bullet[loop].modelpolylist[0].Scale[1] = 1.0;
00145         bullet[loop].modelpolylist[0].Shift[0] = 0.0;
00146         bullet[loop].modelpolylist[0].Shift[1] = 0.0;
00147         bullet[loop].modelpolylist[0].Rotate = 0.0;
00148         bullet[loop].modelpolylist[0].Vertex[0] = tempVertices[0];
00149         bullet[loop].modelpolylist[0].Vertex[1] = tempVertices[2];
00150         bullet[loop].modelpolylist[0].Vertex[2] = tempVertices[3];
00151         bullet[loop].modelpolylist[0].Texture = texture[4].TexID;
00152         bullet[loop].modelpolylist[0].Vertex[0].u = 0.0;
00153         bullet[loop].modelpolylist[0].Vertex[0].v = 0.0;
00154         bullet[loop].modelpolylist[0].Vertex[1].u = 1.0;
00155         bullet[loop].modelpolylist[0].Vertex[1].v = 1.0;
00156         bullet[loop].modelpolylist[0].Vertex[2].u = 0.0;
00157         bullet[loop].modelpolylist[0].Vertex[2].v = 1.0;
00158 
00159         bullet[loop].modelpolylist[1].Scale[0] = 1.0;
00160         bullet[loop].modelpolylist[1].Scale[1] = 1.0;
00161         bullet[loop].modelpolylist[1].Shift[0] = 0.0;
00162         bullet[loop].modelpolylist[1].Shift[1] = 0.0;
00163         bullet[loop].modelpolylist[1].Rotate = 0.0;
00164         bullet[loop].modelpolylist[1].Vertex[0] = tempVertices[0];
00165         bullet[loop].modelpolylist[1].Vertex[1] = tempVertices[1];
00166         bullet[loop].modelpolylist[1].Vertex[2] = tempVertices[2];
00167         bullet[loop].modelpolylist[1].Texture = texture[4].TexID;
00168         bullet[loop].modelpolylist[1].Vertex[0].u = 0.0;
00169         bullet[loop].modelpolylist[1].Vertex[0].v = 0.0;
00170         bullet[loop].modelpolylist[1].Vertex[1].u = 1.0;
00171         bullet[loop].modelpolylist[1].Vertex[1].v = 0.0;
00172         bullet[loop].modelpolylist[1].Vertex[2].u = 1.0;
00173         bullet[loop].modelpolylist[1].Vertex[2].v = 1.0;
00174 
00175         bullet[loop].modelpolylist[2].Scale[0] = 1.0;
00176         bullet[loop].modelpolylist[2].Scale[1] = 1.0;
00177         bullet[loop].modelpolylist[2].Shift[0] = 0.0;
00178         bullet[loop].modelpolylist[2].Shift[1] = 0.0;
00179         bullet[loop].modelpolylist[2].Rotate = 0.0;
00180         bullet[loop].modelpolylist[2].Vertex[0] = tempVertices[5];
00181         bullet[loop].modelpolylist[2].Vertex[1] = tempVertices[7];
00182         bullet[loop].modelpolylist[2].Vertex[2] = tempVertices[6];
00183         bullet[loop].modelpolylist[2].Texture = texture[4].TexID;
00184         bullet[loop].modelpolylist[2].Vertex[0].u = 0.0;
00185         bullet[loop].modelpolylist[2].Vertex[0].v = 0.0;
00186         bullet[loop].modelpolylist[2].Vertex[1].u = 1.0;
00187         bullet[loop].modelpolylist[2].Vertex[1].v = 1.0;
00188         bullet[loop].modelpolylist[2].Vertex[2].u = 0.0;
00189         bullet[loop].modelpolylist[2].Vertex[2].v = 1.0;
00190 
00191         bullet[loop].modelpolylist[3].Scale[0] = 1.0;
00192         bullet[loop].modelpolylist[3].Scale[1] = 1.0;
00193         bullet[loop].modelpolylist[3].Shift[0] = 0.0;
00194         bullet[loop].modelpolylist[3].Shift[1] = 0.0;
00195         bullet[loop].modelpolylist[3].Rotate = 0.0;
00196         bullet[loop].modelpolylist[3].Vertex[0] = tempVertices[5];
00197         bullet[loop].modelpolylist[3].Vertex[1] = tempVertices[4];
00198         bullet[loop].modelpolylist[3].Vertex[2] = tempVertices[7];
00199         bullet[loop].modelpolylist[3].Texture = texture[4].TexID;
00200         bullet[loop].modelpolylist[3].Vertex[0].u = 0.0;
00201         bullet[loop].modelpolylist[3].Vertex[0].v = 0.0;
00202         bullet[loop].modelpolylist[3].Vertex[1].u = 1.0;
00203         bullet[loop].modelpolylist[3].Vertex[1].v = 0.0;
00204         bullet[loop].modelpolylist[3].Vertex[2].u = 1.0;
00205         bullet[loop].modelpolylist[3].Vertex[2].v = 1.0;
00206 
00207         bullet[loop].modelpolylist[4].Scale[0] = 1.0;
00208         bullet[loop].modelpolylist[4].Scale[1] = 1.0;
00209         bullet[loop].modelpolylist[4].Shift[0] = 0.0;
00210         bullet[loop].modelpolylist[4].Shift[1] = 0.0;
00211         bullet[loop].modelpolylist[4].Rotate = 0.0;
00212         bullet[loop].modelpolylist[4].Vertex[0] = tempVertices[4];
00213         bullet[loop].modelpolylist[4].Vertex[1] = tempVertices[1];
00214         bullet[loop].modelpolylist[4].Vertex[2] = tempVertices[0];
00215         bullet[loop].modelpolylist[4].Texture = texture[4].TexID;
00216         bullet[loop].modelpolylist[4].Vertex[0].u = 0.0;
00217         bullet[loop].modelpolylist[4].Vertex[0].v = 0.0;
00218         bullet[loop].modelpolylist[4].Vertex[1].u = 1.0;
00219         bullet[loop].modelpolylist[4].Vertex[1].v = 1.0;
00220         bullet[loop].modelpolylist[4].Vertex[2].u = 0.0;
00221         bullet[loop].modelpolylist[4].Vertex[2].v = 1.0;
00222 
00223         bullet[loop].modelpolylist[5].Scale[0] = 1.0;
00224         bullet[loop].modelpolylist[5].Scale[1] = 1.0;
00225         bullet[loop].modelpolylist[5].Shift[0] = 0.0;
00226         bullet[loop].modelpolylist[5].Shift[1] = 0.0;
00227         bullet[loop].modelpolylist[5].Rotate = 0.0;
00228         bullet[loop].modelpolylist[5].Vertex[0] = tempVertices[4];
00229         bullet[loop].modelpolylist[5].Vertex[1] = tempVertices[5];
00230         bullet[loop].modelpolylist[5].Vertex[2] = tempVertices[1];
00231         bullet[loop].modelpolylist[5].Texture = texture[4].TexID;
00232         bullet[loop].modelpolylist[5].Vertex[0].u = 0.0;
00233         bullet[loop].modelpolylist[5].Vertex[0].v = 0.0;
00234         bullet[loop].modelpolylist[5].Vertex[1].u = 1.0;
00235         bullet[loop].modelpolylist[5].Vertex[1].v = 0.0;
00236         bullet[loop].modelpolylist[5].Vertex[2].u = 1.0;
00237         bullet[loop].modelpolylist[5].Vertex[2].v = 1.0;
00238 
00239         bullet[loop].modelpolylist[6].Scale[0] = 1.0;
00240         bullet[loop].modelpolylist[6].Scale[1] = 1.0;
00241         bullet[loop].modelpolylist[6].Shift[0] = 0.0;
00242         bullet[loop].modelpolylist[6].Shift[1] = 0.0;
00243         bullet[loop].modelpolylist[6].Rotate = 0.0;
00244         bullet[loop].modelpolylist[6].Vertex[0] = tempVertices[6];
00245         bullet[loop].modelpolylist[6].Vertex[1] = tempVertices[3];
00246         bullet[loop].modelpolylist[6].Vertex[2] = tempVertices[2];
00247         bullet[loop].modelpolylist[6].Texture = texture[4].TexID;
00248         bullet[loop].modelpolylist[6].Vertex[0].u = 0.0;
00249         bullet[loop].modelpolylist[6].Vertex[0].v = 0.0;
00250         bullet[loop].modelpolylist[6].Vertex[1].u = 1.0;
00251         bullet[loop].modelpolylist[6].Vertex[1].v = 1.0;
00252         bullet[loop].modelpolylist[6].Vertex[2].u = 0.0;
00253         bullet[loop].modelpolylist[6].Vertex[2].v = 1.0;
00254 
00255         bullet[loop].modelpolylist[7].Scale[0] = 1.0;
00256         bullet[loop].modelpolylist[7].Scale[1] = 1.0;
00257         bullet[loop].modelpolylist[7].Shift[0] = 0.0;
00258         bullet[loop].modelpolylist[7].Shift[1] = 0.0;
00259         bullet[loop].modelpolylist[7].Rotate = 0.0;
00260         bullet[loop].modelpolylist[7].Vertex[0] = tempVertices[6];
00261         bullet[loop].modelpolylist[7].Vertex[1] = tempVertices[7];
00262         bullet[loop].modelpolylist[7].Vertex[2] = tempVertices[3];
00263         bullet[loop].modelpolylist[7].Texture = texture[4].TexID;
00264         bullet[loop].modelpolylist[7].Vertex[0].u = 0.0;
00265         bullet[loop].modelpolylist[7].Vertex[0].v = 0.0;
00266         bullet[loop].modelpolylist[7].Vertex[1].u = 1.0;
00267         bullet[loop].modelpolylist[7].Vertex[1].v = 0.0;
00268         bullet[loop].modelpolylist[7].Vertex[2].u = 1.0;
00269         bullet[loop].modelpolylist[7].Vertex[2].v = 1.0;
00270 
00271         bullet[loop].modelpolylist[8].Scale[0] = 1.0;
00272         bullet[loop].modelpolylist[8].Scale[1] = 1.0;
00273         bullet[loop].modelpolylist[8].Shift[0] = 0.0;
00274         bullet[loop].modelpolylist[8].Shift[1] = 0.0;
00275         bullet[loop].modelpolylist[8].Rotate = 0.0;
00276         bullet[loop].modelpolylist[8].Vertex[0] = tempVertices[7];
00277         bullet[loop].modelpolylist[8].Vertex[1] = tempVertices[0];
00278         bullet[loop].modelpolylist[8].Vertex[2] = tempVertices[3];
00279         bullet[loop].modelpolylist[8].Texture = texture[4].TexID;
00280         bullet[loop].modelpolylist[8].Vertex[0].u = 0.0;
00281         bullet[loop].modelpolylist[8].Vertex[0].v = 0.0;
00282         bullet[loop].modelpolylist[8].Vertex[1].u = 1.0;
00283         bullet[loop].modelpolylist[8].Vertex[1].v = 1.0;
00284         bullet[loop].modelpolylist[8].Vertex[2].u = 0.0;
00285         bullet[loop].modelpolylist[8].Vertex[2].v = 1.0;
00286 
00287         bullet[loop].modelpolylist[9].Scale[0] = 1.0;
00288         bullet[loop].modelpolylist[9].Scale[1] = 1.0;
00289         bullet[loop].modelpolylist[9].Shift[0] = 0.0;
00290         bullet[loop].modelpolylist[9].Shift[1] = 0.0;
00291         bullet[loop].modelpolylist[9].Rotate = 0.0;
00292         bullet[loop].modelpolylist[9].Vertex[0] = tempVertices[7];
00293         bullet[loop].modelpolylist[9].Vertex[1] = tempVertices[4];
00294         bullet[loop].modelpolylist[9].Vertex[2] = tempVertices[0];
00295         bullet[loop].modelpolylist[9].Texture = texture[4].TexID;
00296         bullet[loop].modelpolylist[9].Vertex[0].u = 0.0;
00297         bullet[loop].modelpolylist[9].Vertex[0].v = 0.0;
00298         bullet[loop].modelpolylist[9].Vertex[1].u = 1.0;
00299         bullet[loop].modelpolylist[9].Vertex[1].v = 0.0;
00300         bullet[loop].modelpolylist[9].Vertex[2].u = 1.0;
00301         bullet[loop].modelpolylist[9].Vertex[2].v = 1.0;
00302 
00303         bullet[loop].modelpolylist[10].Scale[0] = 1.0;
00304         bullet[loop].modelpolylist[10].Scale[1] = 1.0;
00305         bullet[loop].modelpolylist[10].Shift[0] = 0.0;
00306         bullet[loop].modelpolylist[10].Shift[1] = 0.0;
00307         bullet[loop].modelpolylist[10].Rotate = 0.0;
00308         bullet[loop].modelpolylist[10].Vertex[0] = tempVertices[5];
00309         bullet[loop].modelpolylist[10].Vertex[1] = tempVertices[2];
00310         bullet[loop].modelpolylist[10].Vertex[2] = tempVertices[1];
00311         bullet[loop].modelpolylist[10].Texture = texture[4].TexID;
00312         bullet[loop].modelpolylist[10].Vertex[0].u = 0.0;
00313         bullet[loop].modelpolylist[10].Vertex[0].v = 0.0;
00314         bullet[loop].modelpolylist[10].Vertex[1].u = 1.0;
00315         bullet[loop].modelpolylist[10].Vertex[1].v = 1.0;
00316         bullet[loop].modelpolylist[10].Vertex[2].u = 0.0;
00317         bullet[loop].modelpolylist[10].Vertex[2].v = 1.0;
00318 
00319         bullet[loop].modelpolylist[11].Scale[0] = 1.0;
00320         bullet[loop].modelpolylist[11].Scale[1] = 1.0;
00321         bullet[loop].modelpolylist[11].Shift[0] = 0.0;
00322         bullet[loop].modelpolylist[11].Shift[1] = 0.0;
00323         bullet[loop].modelpolylist[11].Rotate = 0.0;
00324         bullet[loop].modelpolylist[11].Vertex[0] = tempVertices[5];
00325         bullet[loop].modelpolylist[11].Vertex[1] = tempVertices[6];
00326         bullet[loop].modelpolylist[11].Vertex[2] = tempVertices[2];
00327         bullet[loop].modelpolylist[11].Texture = texture[4].TexID;
00328         bullet[loop].modelpolylist[11].Vertex[0].u = 0.0;
00329         bullet[loop].modelpolylist[11].Vertex[0].v = 0.0;
00330         bullet[loop].modelpolylist[11].Vertex[1].u = 1.0;
00331         bullet[loop].modelpolylist[11].Vertex[1].v = 0.0;
00332         bullet[loop].modelpolylist[11].Vertex[2].u = 1.0;
00333         bullet[loop].modelpolylist[11].Vertex[2].v = 1.0;
00334 
00335         for (int innerloop = 0; innerloop < bullet[loop].numpolys; innerloop++)
00336         {
00337             bullet[loop].modelpolylist[innerloop].SetNormal();
00338         }
00339     }
00340 }
00341 
00342 void UpdateBullets()
00343 {
00344     // Update Bullets
00345     int Pos, CollisionNode, CollisionPoly;
00346     VECTOR EndPos, p0, pN, a, b, c;
00347     BSP_node* tempNode;
00348     DECAL* tempDecal;
00349     float magnitudedistance, shortestdistance;
00350     VECTOR distance, CollisionPoint;
00351     // Loop through maximum number of bullets
00352     for (int loop = 0; loop < numBullets; loop++)
00353     {
00354         // Set to a distance further than any in the map
00355         shortestdistance = 1000000.0;
00356         // If the bullet is active
00357         if (bullet[loop].active == true)
00358         {
00359             // If it has just been fired
00360             if (bullet[loop].flag == true)
00361             {
00362                 // Loop through all leaves
00363                 for (CollisionNode = 1; CollisionNode <= numleaves; CollisionNode++)
00364                 {
00365                     // Get the leaf node
00366                     tempNode = LeafList.Get(CollisionNode);
00367                     // If the node is marked as visible
00368                     if (tempNode->visible == true)
00369                     {
00370                         // Loop through all polygons in the leaf
00371                         for (CollisionPoly = 0; CollisionPoly < tempNode->numpolys; CollisionPoly++)
00372                         {
00373                             // Get a point on the polygon
00374                             p0 = tempNode->nodepolylist[CollisionPoly].Vertex[0].coords;
00375                             // Get the normal of the polygon
00376                             pN = tempNode->nodepolylist[CollisionPoly].Vertex[0].normal;
00377                             // If the bullet isn't in front of the polygon then continue
00378                             if (ClassifyPoint(bullet[loop].Position, p0, pN) != 1)
00379                                 continue;
00380                             // Find the bullets final position
00381                             EndPos.x = bullet[loop].Position.x - bullet[loop].VelocityVector.x * 500.0;
00382                             EndPos.y = bullet[loop].Position.y - bullet[loop].VelocityVector.y * 500.0;
00383                             EndPos.z = bullet[loop].Position.z - bullet[loop].VelocityVector.z * 500.0;
00384                             // Find collision point on the plane
00385                             CollisionPoint = line_plane_collision(&bullet[loop].Position, &EndPos, &tempNode->nodepolylist[CollisionPoly]);
00386                             // If the collision point is outside the frustum then continue (stops collisions behind the player)
00387                             if (!CheckClipPlanes(camera[currentCamera], CollisionPoint))
00388                                 continue;
00389                             a = tempNode->nodepolylist[CollisionPoly].Vertex[0].coords;
00390                             b = tempNode->nodepolylist[CollisionPoly].Vertex[1].coords;
00391                             c = tempNode->nodepolylist[CollisionPoly].Vertex[2].coords;
00392                             // If collision point is within the polygon
00393                             if (CheckPointInTriangle(CollisionPoint, a, b, c))
00394                             {
00395                                 // Get the collision distance
00396                                 distance = CollisionPoint - bullet[loop].Position;
00397                                 magnitudedistance = distance.GetMagnitude();
00398                                 // If collision distance is shorter than previous distance
00399                                 if (magnitudedistance < shortestdistance)
00400                                 {
00401                                     // Bullet has been processed so set first time flag to false
00402                                     bullet[loop].flag = false;
00403                                     // Set new shortest distance
00404                                     shortestdistance = magnitudedistance;
00405                                     // Set collision details
00406                                     bullet[loop].CollisionVector = CollisionPoint;
00407                                     bullet[loop].collisionnode = CollisionNode;
00408                                     bullet[loop].collisionpoly = CollisionPoly;
00409                                 }
00410                             }
00411                         }
00412                     }
00413                 }
00414             }
00415             // Set bullet speed
00416             float bulletFactor;
00417             if (bulletspeed == 0)
00418                 bulletFactor = 1200.0;
00419             else
00420                 bulletFactor = 10.0;
00421             // Set the previous position
00422             bullet[loop].PreviousPosition = bullet[loop].Position;
00423             // Get the present position
00424             bullet[loop].Position.x -= bullet[loop].VelocityVector.x * bulletFactor * bullet[loop].Multiplier;
00425             bullet[loop].Position.y -= bullet[loop].VelocityVector.y * bulletFactor * bullet[loop].Multiplier;
00426             bullet[loop].Position.z -= bullet[loop].VelocityVector.z * bulletFactor * bullet[loop].Multiplier;
00427             // Find the leaf node of the bullets position (to determine when to render it)
00428             bullet[loop].leaf = FindCurrentLeaf(bullet[loop].Position, root);
00429             // Get the bullets collision node
00430             tempNode = LeafList.Get(bullet[loop].collisionnode);
00431             // Get a point on the collision polygon and it's normal
00432             p0 = tempNode->nodepolylist[bullet[loop].collisionpoly].Vertex[0].coords;
00433             pN = tempNode->nodepolylist[bullet[loop].collisionpoly].Vertex[0].normal;
00434             // Classify the bullet position with respect to the collision polygon
00435             Pos = ClassifyPoint(bullet[loop].Position, p0, pN);
00436             // If the bullet is on or behind the collision polygon
00437             if (Pos != 1)
00438             {
00439                 // Set the bullet to inactive
00440                 bullet[loop].active = false;
00441                 // Decrease the active bullet count
00442                 numBulletsActive--;
00443                 // Create the particles
00444                 VECTOR CollisionPoint = line_plane_collision(&bullet[loop].PreviousPosition, &bullet[loop].Position, &tempNode->nodepolylist[bullet[loop].collisionpoly]);
00445                 CreateSparks(bullet[loop].PreviousPosition, CollisionPoint, pN);
00446                 // If we have not reached the maximum decals for this node
00447                 if (tempNode->numdecals < maxDecals)
00448                 {
00449                     // Create a new decal and set it's properties
00450                     tempNode->numdecals++;
00451                     tempDecal = new DECAL;
00452                     // Set the decal to the current global type of decal selected
00453                     tempDecal->type = bullettype;
00454                     // Set the decal's size accordingly
00455                     if (tempDecal->type == 0)
00456                         tempDecal->Size = 0.5;
00457                     else
00458                         tempDecal->Size = 1.0;
00459                     tempDecal->linkPosition = tempNode->numdecals;
00460                     tempDecal->CollisionVector = bullet[loop].CollisionVector;
00461                     // Set persistence counter (decreased with each render)
00462                     tempDecal->counter = 2000;
00463 
00464                     CreateDecal(tempDecal->CollisionVector, &tempNode->nodepolylist[bullet[loop].collisionpoly], tempDecal);
00465                     tempNode->decallist.Insert(tempDecal);
00466 
00467                     // Set impact-flash decal properties
00468                     impactflashdecal.CollisionVector = bullet[loop].CollisionVector;
00469                     CreateDecal(impactflashdecal.CollisionVector, &tempNode->nodepolylist[bullet[loop].collisionpoly], &impactflashdecal);
00470                     impactflashdecal.active = true;
00471                     impactflashdecal.Size = 1;
00472                 }
00473             }
00474             // Find distance of bullet from camera
00475             distance = bullet[loop].Position - camera[currentCamera].Position;
00476             magnitudedistance = distance.GetMagnitude();
00477             // If the distance is greater than 500 units then make bullet inactive
00478             if (magnitudedistance > 500)
00479             {
00480                 bullet[loop].active = 0;
00481                 numBulletsActive--;
00482             }
00483         }
00484     }
00485 }
00486 
00487 void DeleteBullets()
00488 {
00489     // Call the delete method for all bullets
00490     for (int loop = 0; loop < numBullets; loop++)
00491         bullet[loop].Delete();
00492     // Delete the array of bullets
00493     delete[] bullet;
00494 }

Generated on Fri Dec 23 05:15:46 2005 for Constructive Solid Geometry by doxygen1.2.15