00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #ifndef __NEWCOLL_H__
00013 #define __NEWCOLL_H__
00014
00015 #include "Units.h"
00016
00017
00018 #define USE_CONVEX_HULLS FALSE
00019
00020 #define COLL_EPSILON TO_LENGTH(Real(2.0f))
00021 #define COLL_HALFEPSILON (COLL_EPSILON / 2 )
00022
00023 #ifndef _PSX
00024 #define SMALL_IMPULSE_COMPONENT TO_IMP(Real(0.005))
00025 #else
00026 #define SMALL_IMPULSE_COMPONENT 10
00027 #define SMALL_TORQUE 10
00028 #endif
00029
00030 #define QUAD (0x1)
00031 #define TWOSIDED (0x2)
00032 #define OBJECT_ONLY (0x4)
00033 #define CAMERA_ONLY (0x8)
00034 #define NON_PLANAR (0x10)
00035
00036
00037 #ifdef _PC
00038 #define MAX_COLLS_BODY 500
00039 #define MAX_COLLS_PER_BODY 32
00040 #define MAX_COLLS_WHEEL 100
00041 #else
00042 #define MAX_COLLS_BODY 64
00043 #define MAX_COLLS_PER_BODY 16
00044 #define MAX_COLLS_WHEEL 32
00045 #endif
00046
00047
00049
00050
00051 enum {
00052 COLL_TYPE_NONE,
00053 COLL_TYPE_BODY,
00054 COLL_TYPE_CAR,
00055
00056 MAX_COLL_TYPES
00057 };
00058
00061
00062
00063
00066
00067
00068 typedef VEC VERTEX;
00069
00070
00072
00074 typedef struct {
00075
00076 INDEX Vtx[2];
00077
00078 } EDGE;
00079
00081
00083 typedef struct {
00084
00085 REAL XMin, XMax;
00086 REAL YMin, YMax;
00087 REAL ZMin, ZMax;
00088
00089 } BBOX;
00090
00091
00093
00095
00096 typedef struct MaterialStruct {
00097 long Type;
00098 REAL Roughness;
00099 REAL Gripiness;
00100 REAL Hardness;
00101 long SkidColour;
00102 long Corrugation;
00103 long DustType;
00104 VEC Vel;
00105 } MATERIAL;
00106
00107 typedef struct CorrugationStruct {
00108 REAL Amp;
00109 REAL Lx, Ly;
00110 } CORRUGATION;
00111
00112 typedef struct DustStruct {
00113 long SparkType;
00114 REAL SparkProbability;
00115 REAL SparkVar;
00116 } DUST;
00117
00118 #define MATERIAL_SPARK 1
00119 #define MATERIAL_SKID 2
00120 #define MATERIAL_OUTOFBOUNDS 4
00121 #define MATERIAL_CORRUGATED 8
00122 #define MATERIAL_MOVES 16
00123 #define MATERIAL_DUSTY 32
00124
00125 #define MaterialAllowsSkids(material) ((material)->Type & MATERIAL_SKID)
00126 #define SetMaterialAllowsSkids(material) ((material)->Type |= MATERIAL_SKID)
00127 #define MaterialAllowsSparks(material) ((material)->Type & MATERIAL_SPARK)
00128 #define SetMaterialAllowsSparks(material) ((material)->Type |= MATERIAL_SPARK)
00129 #define MaterialOutOfBounds(material) ((material)->Type & MATERIAL_OUTOFBOUNDS)
00130 #define SetMaterialOutOfBounds(material) ((material)->Type |= MATERIAL_OUTOFBOUNDS)
00131 #define MaterialCorrugated(material) ((material)->Type & MATERIAL_CORRUGATED)
00132 #define SetMaterialCorrugated(material) ((material)->Type |= MATERIAL_CORRUGATED)
00133 #define MaterialMoves(material) ((material)->Type & MATERIAL_MOVES)
00134 #define SetMaterialMoves(material) ((material)->Type |= MATERIAL_MOVES)
00135 #define MaterialDusty(material) ((material)->Type & MATERIAL_DUSTY)
00136 #define SetMaterialDusty(material) ((material)->Type |= MATERIAL_DUSTY)
00137
00138 enum MaterialEnum {
00139 MATERIAL_NONE = -1,
00140 MATERIAL_DEFAULT = 0,
00141 MATERIAL_MARBLE,
00142 MATERIAL_STONE,
00143 MATERIAL_WOOD,
00144 MATERIAL_SAND,
00145 MATERIAL_PLASTIC,
00146 MATERIAL_CARPETTILE,
00147 MATERIAL_CARPETSHAG,
00148 MATERIAL_BOUNDARY,
00149 MATERIAL_GLASS,
00150 MATERIAL_ICE1,
00151 MATERIAL_METAL,
00152 MATERIAL_GRASS,
00153 MATERIAL_BUMPMETAL,
00154 MATERIAL_PEBBLES,
00155 MATERIAL_GRAVEL,
00156 MATERIAL_CONVEYOR1,
00157 MATERIAL_CONVEYOR2,
00158 MATERIAL_DIRT1,
00159 MATERIAL_DIRT2,
00160 MATERIAL_DIRT3,
00161 MATERIAL_ICE2,
00162 MATERIAL_ICE3,
00163
00164 MATERIAL_NTYPES
00165 };
00166
00167 enum CorrugationEnum {
00168 CORRUG_NONE,
00169 CORRUG_PEBBLES,
00170 CORRUG_GRAVEL,
00171 CORRUG_STEEL,
00172 CORRUG_CONVEYOR,
00173 CORRUG_DIRT1,
00174 CORRUG_DIRT2,
00175 CORRUG_DIRT3,
00176
00177 CORRUG_NTYPES
00178 };
00179
00180 enum DustEnum {
00181 DUST_NONE,
00182 DUST_GRAVEL,
00183 DUST_SAND,
00184 DUST_MUD,
00185 DUST_DIRT,
00186
00187 DUST_NTYPES
00188 };
00189
00191
00193
00194 struct NewBodyStruct;
00195 struct CarStruct;
00196
00197 typedef struct BodyCollInfoStruct {
00198 bool Active;
00199
00200 struct NewBodyStruct *Body1;
00201 VEC Pos1;
00202 struct NewBodyStruct *Body2;
00203 VEC Pos2;
00204
00205 VEC WorldPos;
00206 VEC Vel;
00207 PLANE Plane;
00208 REAL Depth;
00209 REAL Time;
00210 REAL Grip;
00211 REAL StaticFriction;
00212 REAL KineticFriction;
00213 REAL Restitution;
00214 MATERIAL *Material;
00215
00216 struct BodyCollInfoStruct *Next;
00217 struct BodyCollInfoStruct *Prev;
00218
00219
00220 } COLLINFO_BODY;
00221
00222 typedef struct WheelCollInfoStruct {
00223
00224 struct CarStruct *Car;
00225 int IWheel;
00226 struct NewBodyStruct *Body2;
00227 VEC Pos;
00228 VEC Pos2;
00229 VEC WorldPos;
00230 VEC Vel;
00231 PLANE Plane;
00232 REAL Depth;
00233 REAL Time;
00234 REAL Grip;
00235 REAL StaticFriction;
00236 REAL KineticFriction;
00237 REAL Restitution;
00238 MATERIAL *Material;
00239
00240 struct WheelCollInfoStruct *Next;
00241 struct WheelCollInfoStruct *Prev;
00242
00243 } COLLINFO_WHEEL;
00244
00246
00248
00249 typedef struct CollPolyStruct {
00250
00251 long Type;
00252 long Material;
00253
00254 PLANE Plane;
00255 PLANE EdgePlane[4];
00256 BBOX BBox;
00257
00258 } NEWCOLLPOLY;
00259
00261
00263 typedef struct {
00264 INDEX NSkins;
00265 } COLLSKIN_FILEHDR;
00266
00267 typedef struct {
00268 INDEX NVertices;
00269 INDEX NEdges;
00270 INDEX NFaces;
00271 } COLLSKIN_COLLHDR;
00272
00273 typedef struct ConvexStruct{
00274
00275 INDEX NPts;
00276 INDEX NEdges;
00277 INDEX NFaces;
00278
00279 BBOX BBox;
00280
00281
00282 VERTEX *Pts;
00283 EDGE *Edges;
00284 PLANE *Faces;
00285
00286 } CONVEX;
00287
00288 typedef struct CollSkinStruct {
00289
00290 CONVEX *Convex;
00291 CONVEX *WorldConvex;
00292 CONVEX *OldWorldConvex;
00293 INDEX NConvex;
00294
00295 SPHERE *Sphere;
00296 SPHERE *WorldSphere;
00297 SPHERE *OldWorldSphere;
00298 INDEX NSpheres;
00299
00300 NEWCOLLPOLY *CollPoly;
00301 INDEX NCollPolys;
00302
00303 BBOX TightBBox;
00304 BBOX BBox;
00305 REAL Radius;
00306
00307 long CollType;
00308 bool AllowWorldColls;
00309 bool AllowObjColls;
00310
00311 } COLLSKIN;
00312
00313 typedef COLLSKIN COLLSKIN_INFO;
00314
00315
00317
00319 typedef struct {
00320
00321 short NPolys;
00322
00323 } NEWCOLLPOLYHDR;
00324
00325
00326
00328
00330
00331 typedef struct {
00332 REAL XStart, ZStart;
00333 REAL XNum, ZNum;
00334 REAL GridSize;
00335 } COLLGRID_DATA;
00336
00337 typedef struct {
00338 #ifndef _PSX
00339 long NCollPolys;
00340 long NWorldPolys;
00341 NEWCOLLPOLY **CollPolyPtr;
00342 #else
00343 short NCollPolys;
00344 short NWorldPolys;
00345 short *CollPolyIndices;
00346 #endif
00347 } COLLGRID;
00348
00349
00352
00353
00354
00357
00358
00360
00362 #define SetBBox(bBox, xMin, xMax, yMin, yMax, zMin, zMax) \
00363 { \
00364 (bBox)->XMin = xMin; \
00365 (bBox)->XMax = xMax; \
00366 (bBox)->YMin = yMin; \
00367 (bBox)->YMax = yMax; \
00368 (bBox)->ZMin = zMin; \
00369 (bBox)->ZMax = zMax; \
00370 }
00371
00372 #define CopyBBox(src, dest) \
00373 { \
00374 (dest)->XMin = (src)->XMin; \
00375 (dest)->XMax = (src)->XMax; \
00376 (dest)->YMin = (src)->YMin; \
00377 (dest)->YMax = (src)->YMax; \
00378 (dest)->ZMin = (src)->ZMin; \
00379 (dest)->ZMax = (src)->ZMax; \
00380 }
00381
00383
00384
00386
00387 #define BBTestXZY(bBox1, bBox2) \
00388 (( ((bBox1)->XMin > (bBox2)->XMax) || \
00389 ((bBox1)->XMax < (bBox2)->XMin) || \
00390 ((bBox1)->ZMin > (bBox2)->ZMax) || \
00391 ((bBox1)->ZMax < (bBox2)->ZMin) || \
00392 ((bBox1)->YMin > (bBox2)->YMax) || \
00393 ((bBox1)->YMax < (bBox2)->YMin) ) ? FALSE: TRUE)
00394
00395 #define BBTestYXZ(bBox1, bBox2) \
00396 (( ((bBox1)->YMin > (bBox2)->YMax) || \
00397 ((bBox1)->YMax < (bBox2)->YMin) || \
00398 ((bBox1)->XMin > (bBox2)->XMax) || \
00399 ((bBox1)->XMax < (bBox2)->XMin) || \
00400 ((bBox1)->ZMin > (bBox2)->ZMax) || \
00401 ((bBox1)->ZMax < (bBox2)->ZMin) ) ? FALSE: TRUE)
00402
00404
00406 #define PointInBBox(pos, bBox) \
00407 (( ((bBox)->XMin > (pos)->v[X]) || \
00408 ((bBox)->XMax < (pos)->v[X]) || \
00409 ((bBox)->ZMin > (pos)->v[Z]) || \
00410 ((bBox)->ZMax < (pos)->v[Z]) || \
00411 ((bBox)->YMin > (pos)->v[Y]) || \
00412 ((bBox)->YMax < (pos)->v[Y]) ) ? FALSE: TRUE)
00413
00414
00416
00418 #define AddSphereToBBox(bBox, sphere) AddPosRadToBBox((bBox), &(sphere)->Pos, (sphere)->Radius)
00419
00420
00422
00423
00424
00425
00426 #define IsPolyTwoSided(poly) ((poly)->Type & TWOSIDED)
00427 #define IsPolyQuad(poly) ((poly)->Type & QUAD)
00428 #define IsPolyTriangle(poly) (!((poly)->Type & QUAD))
00429 #define PolyObjectOnly(poly) ((poly)->Type & OBJECT_ONLY)
00430 #define PolyCameraOnly(poly) ((poly)->Type & CAMERA_ONLY)
00431
00432 #define SetPolyTwoSided(poly) ((poly)->Type |= TWOSIDED)
00433 #define SetPolyQuad(poly) ((poly)->Type |= QUAD)
00434 #define SetPolyTriangle(poly) ((poly)->Type &= !QUAD)
00435
00436
00437 #ifndef _PSX
00438 extern NEWCOLLPOLY *CreateCollPolys(short nPolys);
00439 #else
00440 extern short *CreateCollPolyIndices(int nPolys);
00441 #endif
00442
00443 extern void DestroyCollPolys(NEWCOLLPOLY *polys);
00444 extern void DestroyCollGrids();
00445 extern COLLGRID *PosToCollGrid(VEC *pos);
00446 extern long PosToCollGridCoords(VEC *pos, long *offsetX, long *offsetZ);
00447 extern long PosToCollGridNum(VEC *pos);
00448 #ifdef _N64
00449 extern NEWCOLLPOLY *LoadNewCollPolys(FIL *Fil, short *nPolys);
00450 extern bool LoadGridInfo(FIL *Fil);
00451 extern CONVEX *LoadConvex(FIL *fp, INDEX *nSkins, int extraPtsPerEdge);
00452 extern SPHERE *LoadSpheres(FIL *fp, INDEX *nSpheres);
00453 #else
00454 extern NEWCOLLPOLY *LoadNewCollPolys(FILE *fp, short *nPolys);
00455 extern bool LoadGridInfo(FILE *fp);
00456 extern CONVEX *LoadConvex(FILE *fp, INDEX *nSkins, int extraPtsPerEdge);
00457 extern SPHERE *LoadSpheres(FILE *fp, INDEX *nSpheres);
00458 #endif
00459
00460 extern bool PointInCollPolyBounds(VEC *pt, NEWCOLLPOLY *poly);
00461 extern bool SphereInCollPolyBounds(VEC *pt, REAL radius, NEWCOLLPOLY *poly);
00462 extern bool SphereCollPoly(VEC *oldPos, VEC *newPos, REAL radius, NEWCOLLPOLY *collPoly, PLANE *plane, VEC *relPos, VEC *worldPos, REAL *depth, REAL *time);
00463
00464
00465
00466
00467 extern void FreeCollSkin(COLLSKIN *collSkin);
00468
00469 extern CONVEX *CreateConvex(INDEX nConvex);
00470 extern bool SetupConvex(CONVEX *skin, INDEX nPts, INDEX extraPts, INDEX nEdges, INDEX nFaces);
00471 extern void DestroyConvex(CONVEX *skin, int nSkins);
00472 extern bool CreateCopyCollSkin(COLLSKIN *collSkin);
00473 extern void BuildWorldSkin(COLLSKIN *bodySkin, VEC *pos, MAT *mat);
00474 extern void DestroySpheres(SPHERE *spheres);
00475
00476
00477 extern bool PointInConvex(VEC *pt, CONVEX *skin, PLANE *plane, REAL *depth);
00478 extern bool SphereConvex(VEC *spherePos, REAL sphereRad, CONVEX *convex, VEC *collPos, PLANE *collPlane, REAL *collDepth);
00479 extern PLANE *LineToConvexColl(VEC *sPos, VEC *ePos, CONVEX *convex, REAL *penDepth, REAL *time);
00480
00481
00482 extern void ModifyShift(VEC *shift, REAL shiftMag, VEC *normal);
00483 extern bool LinePlaneIntersect(VEC *lStart, VEC *lEnd, PLANE *plane, REAL *t, REAL *depth);
00484 extern bool PosDirPlaneIntersect(VEC *lStart, VEC *dir, PLANE *plane, REAL *t);
00485 extern void RotTransCollPolys(NEWCOLLPOLY *collPoly, int nPolys, MAT *rMat, VEC *dPos);
00486 extern void TransCollPolys(NEWCOLLPOLY *collPoly, int nPolys, VEC *dPos);
00487
00488
00489 extern void ExpandBBox(BBOX *bBox, REAL delta);
00490 extern void MakeTightLocalBBox(COLLSKIN *collSkin);
00491 extern void RotTransBBox(BBOX *bBoxIn, MAT *rotMat, VEC *dR, BBOX *bBoxOut);
00492
00493 extern bool LineOfSight(VEC *dest, VEC *src);
00494 extern bool LineOfSightDist(VEC *src, VEC *dest, REAL *minT, PLANE **plane);
00495 #ifdef _PC
00496 extern bool LineOfSightObj(VEC *src, VEC *dest, REAL *minT);
00497 #endif
00498
00499 extern COLLINFO_BODY *NextBodyCollInfo();
00500 extern COLLINFO_WHEEL *NextWheelCollInfo();
00501 extern void AdjustBodyColl(COLLINFO_BODY *collInfo, MATERIAL *material);
00502 extern void AdjustWheelColl(COLLINFO_WHEEL *collInfo, MATERIAL *material);
00503 extern int GetCollPolyVertices(NEWCOLLPOLY *poly, VEC *v0, VEC *v1, VEC *v2, VEC *v3);
00504
00505 extern void AddPosRadToBBox(BBOX *bBox, VEC *pos, REAL radius);
00506 extern void AddPointToBBox(BBOX *bBox, VEC *pos);
00507
00508 struct object_def;
00509
00510 extern void COL_DoObjectCollisions(void);
00511 extern void COL_BodyCollHandler(struct object_def *obj);
00512 extern void COL_CarCollHandler(struct object_def *obj);
00513
00515
00516
00517
00518
00519 extern NEWCOLLPOLY *COL_WorldCollPoly;
00520 extern INDEX COL_NWorldCollPolys;
00521 extern NEWCOLLPOLY *COL_InstanceCollPoly;
00522 extern INDEX COL_NInstanceCollPolys;
00523 extern COLLGRID_DATA COL_CollGridData;
00524 extern COLLGRID *COL_CollGrid;
00525 extern long COL_NCollGrids;
00526
00527
00528
00529 extern int COL_NWheelColls;
00530 extern int COL_NWheelDone;
00531
00532
00533 extern int COL_NBodyColls;
00534 extern int COL_NBodyDone;
00535
00536
00537
00538
00539 extern int COL_NCollsTested;
00540
00541 extern MATERIAL COL_MaterialInfo[MATERIAL_NTYPES];
00542 extern CORRUGATION COL_CorrugationInfo[CORRUG_NTYPES];
00543 extern DUST COL_DustInfo[DUST_NTYPES];
00544
00545 #endif