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

Generated on Fri Dec 23 05:19:54 2005 for Particles by doxygen1.2.15