00001
00002 #ifndef CAR_H
00003 #define CAR_H
00004
00005 #include "newcoll.h"
00006 #include "particle.h"
00007 #include "body.h"
00008 #include "model.h"
00009 #include "aerial.h"
00010 #include "Wheel.h"
00011
00012 #ifdef _PC
00013 #ifndef _CARCONV
00014 #include "sfx.h"
00015 #include "play.h"
00016 #endif
00017
00018 #endif
00019
00020
00021
00022 #define MAX_CAR_FILENAME 64
00023
00024 #define MAX_CARS 15
00025 #define MAX_CAR_LOD 5
00026 #define CAR_LOD_BIAS 384
00027 #define CAR_RADIUS 70
00028 #define CAR_SQUARE_RADIUS (CAR_RADIUS * CAR_RADIUS)
00029
00030 #define CAR_MODEL_SPRING 1
00031 #define CAR_MODEL_AXLE 2
00032 #define CAR_MODEL_PIN 4
00033
00034 #define CAR_MODEL_SPINNER 1
00035 #define CAR_MODEL_AERIAL 2
00036
00037 #define CAR_MODEL_NONE -1
00038
00039 #define CAR_NWHEELS 4
00040 #define CAR_NRESPONSE 100
00041 #define CAR_NAMELEN 64
00042
00043 #define CAR_REMOTE_QUAT_SCALE 100.0f
00044 #define CAR_REMOTE_VEL_SCALE 3.0f
00045 #define CAR_REMOTE_ANGVEL_SCALE 1000.0f
00046
00047 #define CLOSE_WHEEL_COLL_ANGLE 0.5f
00048
00049
00050
00051
00052 #define CAR_ACTIVE 1
00053
00054 #define FL 0
00055 #define FR 1
00056 #define BL 2
00057 #define BR 3
00058
00059 typedef long CAR_TYPE;
00060
00061
00062
00063
00064 enum {
00065 CAR_MODEL_BODY,
00066 CAR_MODEL_WHEEL1,
00067 CAR_MODEL_WHEEL2,
00068 CAR_MODEL_WHEEL3,
00069 CAR_MODEL_WHEEL4,
00070 CAR_MODEL_SPRING1,
00071 CAR_MODEL_SPRING2,
00072 CAR_MODEL_SPRING3,
00073 CAR_MODEL_SPRING4,
00074 CAR_MODEL_AXLE1,
00075 CAR_MODEL_AXLE2,
00076 CAR_MODEL_AXLE3,
00077 CAR_MODEL_AXLE4,
00078 CAR_MODEL_PIN1,
00079 CAR_MODEL_PIN2,
00080 CAR_MODEL_PIN3,
00081 CAR_MODEL_PIN4,
00082 CAR_MODEL_AERIAL_SEC1,
00083 CAR_MODEL_AERIAL_TOP1,
00084 MAX_CAR_MODEL_TYPES
00085 };
00086
00087
00088 #ifndef _PSX
00089
00090 typedef struct
00091 {
00092 char WheelPartsFlag[4];
00093 char BodyPartsFlag;
00094
00095 VEC OffBody;
00096
00097 VEC OffWheel[4];
00098 VEC OffSpring[4];
00099 VEC OffAxle[4];
00100 VEC OffPin[4];
00101 VEC OffWheelColl[4];
00102 VEC OffSpinner;
00103 VEC OffAerial;
00104 VEC DirAerial;
00105
00106 REAL WheelRad[4];
00107 REAL SpringLen[4];
00108 REAL AxleLen[4];
00109 REAL PinLen[4];
00110 REAL AerialLen;
00111
00112 MODEL Model[MAX_CAR_MODEL_TYPES][MAX_CAR_LOD];
00113
00114 MODEL *Body;
00115 MODEL *Wheel[4];
00116 MODEL *Spring[4];
00117 MODEL *Axle[4];
00118 MODEL *Pin[4];
00119 MODEL *Spinner;
00120 MODEL *Aerial[2];
00121
00122 long EnvRGB;
00123
00124 COLLSKIN_INFO CollSkin;
00125 } CAR_MODEL;
00126
00127
00128 #endif
00129
00130
00131
00132
00133
00134
00135
00136
00137 typedef struct {
00138 long ModelNum;
00139 VEC Offset;
00140 REAL Mass;
00141 MAT Inertia;
00142 REAL Gravity;
00143 REAL Hardness;
00144 REAL Resistance;
00145 REAL AngResistance;
00146 REAL ResModifier;
00147 REAL Grip;
00148 REAL StaticFriction;
00149 REAL KineticFriction;
00150 } BODY_INFO;
00151
00152 typedef struct {
00153 long ModelNum;
00154 VEC Offset;
00155 REAL Length;
00156 } AXLE_INFO;
00157
00158 typedef struct {
00159 long ModelNum;
00160 VEC Offset;
00161 REAL Length;
00162 } PIN_INFO;
00163
00164 typedef struct {
00165 long SecModelNum;
00166 long TopModelNum;
00167 VEC Offset;
00168 VEC Direction;
00169 REAL SecLen;
00170 REAL Stiffness;
00171 REAL Damping;
00172 } AERIAL_INFO;
00173
00174 typedef struct SpinnerInfoStruct {
00175 long ModelNum;
00176 VEC Offset;
00177 VEC Axis;
00178 REAL AngVel;
00179 } SPINNER_INFO;
00180
00181
00182 typedef struct
00183 {
00184 #ifdef _N64
00185 FIL_ID TextureFile[MAX_CAR_MODEL_TYPES];
00186 FIL_ID ModelFile[MAX_CAR_MODEL_TYPES];
00187 FIL_ID CollFile;
00188 #else
00189 char ModelFile[MAX_CAR_MODEL_TYPES][MAX_CAR_FILENAME];
00190 char TPageFile[MAX_CAR_FILENAME];
00191 char CollFile[MAX_CAR_FILENAME];
00192 #endif
00193
00194 long EnvRGB;
00195 char Name[CAR_NAMELEN];
00196
00197 REAL SteerRate;
00198 REAL SteerModifier;
00199 REAL EngineRate;
00200 REAL TopSpeed;
00201 REAL MaxRevs;
00202 REAL DownForceMod;
00203 VEC CoMOffset;
00204 bool AllowedBestTime;
00205 bool Selectable;
00206 VEC WeaponOffset;
00207
00208 BODY_INFO Body;
00209 WHEEL_INFO Wheel[CAR_NWHEELS];
00210 SPRING_INFO Spring[CAR_NWHEELS];
00211 AXLE_INFO Axle[CAR_NWHEELS];
00212 PIN_INFO Pin[CAR_NWHEELS];
00213 SPINNER_INFO Spinner;
00214 AERIAL_INFO Aerial;
00215
00216 } CAR_INFO;
00217
00218
00219
00220 typedef struct
00221 {
00222 REAL SpringLen;
00223 REAL AxleLen;
00224 REAL PinLen;
00225
00226 VEC SpringOffset;
00227 VEC AxleOffset;
00228 VEC FixOffset;
00229
00230 VEC SpringWorldPos;
00231 VEC AxleWorldPos;
00232 VEC PinWorldPos;
00233
00234 MAT SpringCarMatrix;
00235 MAT AxleCarMatrix;
00236 MAT PinCarMatrix;
00237 } SUSPENSION;
00238
00239
00240 typedef struct SpinnerStruct {
00241 MAT CarMatrix;
00242 MAT Matrix;
00243 VEC WorldPos;
00244 VEC Axis;
00245 REAL AngVel;
00246 } SPINNER;
00247
00248
00250
00251
00252
00253
00254 #define REMOTE_POS 1l
00255 #define REMOTE_VEL 2l
00256 #define REMOTE_ANGVEL 4l
00257 #define REMOTE_QUAT 8l
00258 #define REMOTE_WHLANG 16l
00259 #define REMOTE_WHLPOS 32l
00260 #define REMOTE_TIME 64l
00261 #define REMOTE_CONTROL 128l
00262
00263 typedef struct RemoteDataStruct {
00264
00265 long PacketInfo;
00266
00267 bool NewData;
00268
00269 VEC Pos;
00270 VEC Vel;
00271 VEC AngVel;
00272 QUATERNION Quat;
00273
00274 char dx, dy;
00275
00276 } REMOTE_DATA;
00277
00278 #define RemoteTimePresent(info) ((info)->PacketInfo & REMOTE_TIME)
00279 #define RemotePosPresent(info) ((info)->PacketInfo & REMOTE_POS)
00280 #define RemoteVelPresent(info) ((info)->PacketInfo & REMOTE_VEL)
00281 #define RemoteAngVelPresent(info) ((info)->PacketInfo & REMOTE_ANGVEL)
00282 #define RemoteQuatPresent(info) ((info)->PacketInfo & REMOTE_QUAT)
00283 #define RemoteWhlAngPresent(info) ((info)->PacketInfo & REMOTE_WHLANG)
00284 #define RemoteWhlPosPresent(info) ((info)->PacketInfo & REMOTE_WHLPOS)
00285
00286
00287
00288 typedef struct {
00289 REAL xoff, zoff, rotoff;
00290 } GRID_POS;
00291
00292
00293
00294
00295
00296
00297
00298 typedef struct CarStruct {
00299
00300 SUSPENSION Sus[4];
00301
00302
00303
00304
00305 long CarID;
00306
00307 VEC BodyWorldPos;
00308 MAT EnvMatrix;
00309
00310 CAR_MODEL *Models;
00311
00312 REAL SteerAngle;
00313 REAL SteerRate;
00314 REAL SteerModifier;
00315 REAL EngineVolt;
00316 REAL EngineRate;
00317 REAL TopSpeed;
00318 REAL DefaultTopSpeed;
00319 REAL DownForceMod;
00320
00321 NEWBODY *Body;
00322 AERIAL Aerial;
00323 WHEEL Wheel[CAR_NWHEELS];
00324 SPRING Spring[CAR_NWHEELS];
00325 SPINNER Spinner;
00326
00327 BBOX BBox;
00328
00329 VEC BodyOffset;
00330 VEC WheelOffset[CAR_NWHEELS];
00331 VEC WheelCentre[CAR_NWHEELS];
00332 VEC SuspOffset[CAR_NWHEELS];
00333 VEC AxleOffset[CAR_NWHEELS];
00334 VEC SpinnerOffset;
00335 VEC AerialOffset;
00336 VEC WeaponOffset;
00337
00338 long Rendered;
00339
00340 long NextSplit;
00341 long Laps;
00342 long CurrentLapTime;
00343 long LastLapTime;
00344 long BestLapTime;
00345 long LastRaceTime;
00346 long BestRaceTime;
00347 long SplitTime[MAX_SPLIT_TIMES];
00348
00349 REAL Current0to15;
00350 REAL Best0to15;
00351 REAL Current0to25;
00352 REAL Best0to25;
00353
00354 unsigned long CurrentLapStartTime;
00355
00356 REAL Revs;
00357 REAL MaxRevs;
00358
00359 REAL PowerTimer;
00360 long AddLit;
00361 REAL DrawScale;
00362 long IsBomb;
00363 long WillDetonate;
00364 REAL NoReturnTimer;
00365
00366
00367 VEC DestPos;
00368 QUATERNION DestQuat;
00369
00370 VEC FieldVec;
00371
00372
00373 COLLINFO_WHEEL *WheelCollHead;
00374 int NWheelColls;
00375
00376 int NWheelsInContact;
00377 int NWheelFloorContacts;
00378
00379 #ifdef _PC
00380 #ifndef _CARCONV
00381 SAMPLE_3D *SfxEngine;
00382 SAMPLE_3D *SfxScrape;
00383 SAMPLE_3D *SfxScreech;
00384 long ScrapeMaterial;
00385
00386 REMOTE_DATA RemoteData[3];
00387 int OldDat, Dat, NewDat;
00388 #endif
00389 #endif
00390
00391
00392 #ifdef _PSX
00393 MATRIX Matrix;
00394 SVECTOR Pos, LastPos;
00395 VEC AerialPos[5];
00396 short Type;
00397 short sPad;
00398 #endif
00399
00400 bool AllowedBestTime;
00401 bool Selectable;
00402 bool Righting;
00403 bool RightingCollide;
00404 bool RightingReachDest;
00405 bool Timing0to15;
00406 bool Timing0to25;
00407 bool bPad;
00408
00409
00410 } CAR;
00411
00412 #define SetCarHasSpring(car, i) ((car)->Models->WheelPartsFlag[i] |= CAR_MODEL_SPRING)
00413 #define SetCarHasAxle(car, i) ((car)->Models->WheelPartsFlag[i] |= CAR_MODEL_AXLE)
00414 #define SetCarHasPin(car, i) ((car)->Models->WheelPartsFlag[i] |= CAR_MODEL_PIN)
00415 #define CarHasSpring(car, i) ((car)->Models->WheelPartsFlag[i] & CAR_MODEL_SPRING)
00416 #define CarHasAxle(car, i) ((car)->Models->WheelPartsFlag[i] & CAR_MODEL_AXLE)
00417 #define CarHasPin(car, i) ((car)->Models->WheelPartsFlag[i] & CAR_MODEL_PIN)
00418
00419 #define SetCarHasSpinner(car) ((car)->Models->BodyPartsFlag[i] != CAR_MODEL_SPINNER)
00420 #define CarHasSpinner(car) ((car)->Models->BodyPartsFlag & CAR_MODEL_SPINNER)
00421 #define SetCarHasAerial(car) ((car)->Models->BodyPartsFlag[i] != CAR_MODEL_AERIAL)
00422 #define CarHasAerial(car) ((car)->Models->BodyPartsFlag & CAR_MODEL_AERIAL)
00423
00424
00425
00426
00427
00428 struct PlayerStruct;
00429
00430 extern CAR_INFO *CreateCarInfo(long nInfo);
00431 extern void DestroyCarInfo();
00432 extern CAR_MODEL *CreateCarModels(long nModels);
00433 extern void DestroyCarModels(CAR_MODEL *models);
00434
00435
00436 extern void InitCar(CAR *car);
00437 extern void SetupCar(struct PlayerStruct *player, int carType);
00438 extern void FreeCar(struct PlayerStruct *player);
00439 extern void GetCarGrid(long position, VEC *pos, MAT *mat);
00440 extern void SetCarPos(CAR *car, VEC *pos, MAT *mat);
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450 extern void SetCarAerialPos(CAR *car);
00451 extern void UpdateCarAerial2(CAR *car, REAL dt);
00452 extern void ResetCarWheelPos(CAR *car, int iWheel);
00453 extern void UpdateCarWheel(CAR *car, int iWheel, REAL dt);
00454
00455 extern void DetectCarWorldColls(CAR *car);
00456 extern int DetectCarBodyColls(CAR *car, NEWBODY *body);
00457 extern int DetectCarCarColls(CAR *car1, CAR *car2);
00458 extern void DetectCarWheelColls(CAR *car, int iWheel, COLLSKIN *worldSkin);
00459 extern void DetectCarWheelColls2(CAR *car, int iWheel, NEWCOLLPOLY *worldPoly);
00460
00461 extern void PreProcessCarWheelColls(CAR *car);
00462 extern void ProcessCarWheelColls(CAR *car);
00463 extern void PostProcessCarWheelColls(CAR *car);
00464 extern void SetAllCarCoMs(void);
00465 extern void MoveCarCoM(CAR_INFO *carInfo, VEC *dR);
00466 extern void CarWheelImpulse(CAR *car, COLLINFO_WHEEL *collInfo, VEC *impulse);
00467 extern void CarWheelImpulse2(CAR *car, COLLINFO_WHEEL *collInfo, VEC *impulse);
00468 extern void SetCarAngResistance(CAR *car);
00469 extern void CAR_AllCarColls();
00470 extern REMOTE_DATA *NextRemoteData(CAR *car);
00471 extern REMOTE_DATA *NextRemoteData(CAR *car);
00472 extern void SendLocalCarData(void);
00473 extern void UpdateRemotePlayer(struct PlayerStruct *player);
00474 extern void LoadOneCarModelSet(struct PlayerStruct *player, long car);
00475 extern void FreeOneCarModelSet(struct PlayerStruct *player);
00476 extern int NextValidCarID(int currentID);
00477 extern int PrevValidCarID(int currentID);
00478 extern void CheckCarSituation(CAR *car);
00479 extern void CarAccTimings(CAR *car);
00480 extern void CarDownForce(CAR *car);
00481 extern void RemoveWheelColl(CAR *car, COLLINFO_WHEEL *collInfo);
00482 extern COLLINFO_WHEEL *AddWheelColl(CAR *car, COLLINFO_WHEEL *newHead);
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492 extern CAR_INFO *CarInfo;
00493 extern long NCarTypes;
00494
00495 extern bool CAR_DrawCarBBoxes;
00496 extern bool CAR_DrawCarAxes;
00497 extern bool CAR_WheelsHaveSuspension;
00498
00499 extern GRID_POS CarGridStarts[][MAX_NUM_PLAYERS];
00500
00501 #endif