2011-02-18 14:31:32 +00:00
|
|
|
/*
|
|
|
|
===========================================================================
|
|
|
|
Copyright (C) 1999-2005 Id Software, Inc.
|
2021-03-24 20:13:01 +00:00
|
|
|
Copyright (C) 2002-2021 Q3Rally Team (Per Thormann - q3rally@gmail.com)
|
2011-02-18 14:31:32 +00:00
|
|
|
|
|
|
|
This file is part of q3rally source code.
|
|
|
|
|
|
|
|
q3rally source code is free software; you can redistribute it
|
|
|
|
and/or modify it under the terms of the GNU General Public License as
|
|
|
|
published by the Free Software Foundation; either version 2 of the License,
|
|
|
|
or (at your option) any later version.
|
|
|
|
|
|
|
|
q3rally source code is distributed in the hope that it will be
|
|
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with q3rally; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
===========================================================================
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// damage stuff
|
|
|
|
#define DAMAGE_RADIUS 0x00000001 // damage was indirect
|
|
|
|
#define DAMAGE_NO_ARMOR 0x00000002 // armour does not protect from this damage
|
|
|
|
#define DAMAGE_NO_KNOCKBACK 0x00000004 // do not affect velocity, just view angles
|
|
|
|
#define DAMAGE_NO_PROTECTION 0x00000008 // armor, shields, invulnerability, and godmode have no effect
|
|
|
|
#ifdef MISSIONPACK
|
|
|
|
#define DAMAGE_NO_TEAM_PROTECTION 0x00000010 // armor, shields, invulnerability, and godmode have no effect
|
|
|
|
#endif
|
|
|
|
#define DAMAGE_WEAPON 0x00000020
|
|
|
|
|
|
|
|
|
|
|
|
// SKWID( car movement code )
|
|
|
|
//=========================================================================================
|
|
|
|
#define WHEEL_FORWARD 31.0f
|
|
|
|
#define WHEEL_RIGHT 18.0f
|
|
|
|
#define WHEEL_UP -10.0f
|
|
|
|
// END
|
|
|
|
|
|
|
|
#define BODY_RADIUS 13.0f
|
|
|
|
#define WHEEL_RADIUS 8.0f
|
|
|
|
#define WHEEL_CIRC 2.0f * M_PI * WHEEL_RADIUS
|
|
|
|
|
|
|
|
#define CAR_WIDTH 50.0f
|
|
|
|
#define CAR_HEIGHT 44.0f
|
|
|
|
#define CAR_LENGTH 100.0f
|
|
|
|
|
|
|
|
extern float CP_CURRENT_GRAVITY;
|
|
|
|
#define CP_GRAVITY_FTPS 32.2f // gravity in feet per second
|
|
|
|
#define CP_GRAVITY 350.0f // gravity in qunits per second
|
|
|
|
|
|
|
|
#define CP_FT_2_QU (CP_GRAVITY / CP_GRAVITY_FTPS) // 10.87
|
|
|
|
#define CP_FT_2_M 0.3048f
|
|
|
|
extern float CP_M_2_QU;
|
|
|
|
//static float CP_M_2_QU = CP_FT_2_QU / 0.3048f; // 35.66
|
|
|
|
|
|
|
|
#define CP_FRAME_MASS 300.0f // 350
|
|
|
|
#define CP_WHEEL_MASS 50.0f // 100
|
|
|
|
#define CP_CAR_MASS ( CP_FRAME_MASS * 4 + CP_WHEEL_MASS * 4 )
|
|
|
|
|
|
|
|
#define CP_BODY_ELASTICITY 0.05f
|
|
|
|
#define CP_WHEEL_ELASTICITY 0.05f
|
|
|
|
|
|
|
|
#define CP_SPRING_MINLEN 5.0f
|
|
|
|
// #define CP_SPRING_MAXLEN 10.0f
|
|
|
|
#define CP_SPRING_MAXLEN 15.0f
|
|
|
|
|
|
|
|
#define CP_MAX_SHOCK_FORCE 400000.0f
|
|
|
|
|
|
|
|
// Used to fit the spring lengths into the 8 bit numbers that
|
|
|
|
// are used to transfer them over the net.
|
|
|
|
// Should be less than 255 / ( CP_SPRING_MAXLEN - CP_SPRING_MINLEN )
|
|
|
|
#define CP_SPRING_SCALE 24.0f
|
|
|
|
|
|
|
|
|
|
|
|
// strength of the fake spring that returns the wheel to perpendicular
|
|
|
|
extern float CP_WR_STRENGTH;
|
|
|
|
extern float CP_SPRING_STRENGTH;
|
|
|
|
extern float CP_SHOCK_STRENGTH;
|
|
|
|
extern float CP_SWAYBAR_STRENGTH;
|
|
|
|
/*
|
|
|
|
extern float CP_TORQUE_SLOPE;
|
|
|
|
extern float CP_GEAR_RATIOS[];
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define CP_AIR_COF 0.31f
|
|
|
|
#define CP_FRAC_TO_DF 0.50f
|
|
|
|
#define CP_ENGINE_TIRE_COF 1000.0f
|
|
|
|
|
|
|
|
#define CP_SCOF 1.5f // dry asphalt
|
|
|
|
#define CP_KCOF 1.0f
|
|
|
|
#define CP_ICE_SCOF 0.3f // ice
|
|
|
|
#define CP_ICE_KCOF 0.2f
|
|
|
|
#define CP_DIRT_SCOF 1.2f // loose dirt
|
|
|
|
#define CP_DIRT_KCOF 0.8f
|
|
|
|
#define CP_GRASS_SCOF 1.05f // short grass
|
|
|
|
#define CP_GRASS_KCOF 0.7f
|
2021-04-03 23:31:23 +00:00
|
|
|
#define CP_GRAVEL_SCOF 1.22f // gravel
|
|
|
|
#define CP_GRAVEL_KCOF 0.85f
|
|
|
|
#define CP_SNOW_SCOF 0.4f // packed snow
|
|
|
|
#define CP_SNOW_KCOF 0.27f
|
|
|
|
//#define CP_SNOW_SCOF 0.7f // packed snow
|
|
|
|
//#define CP_SNOW_KCOF 0.5f
|
2011-02-18 14:31:32 +00:00
|
|
|
#define CP_OIL_SCOF 0.3f // oil
|
|
|
|
#define CP_OIL_KCOF 0.2f
|
|
|
|
|
|
|
|
#define CP_WET_SCALE 0.75f
|
|
|
|
|
|
|
|
#define CP_AIR_DENSITY 1.185f // 1.288075f
|
|
|
|
#define CP_WATER_DENSITY 1000.0f
|
|
|
|
#define CP_LAVA_DENSITY 60000.0f
|
|
|
|
#define CP_SLIME_DENSITY 20000.0f
|
|
|
|
|
|
|
|
#define CP_AXLEGEAR 3.07f
|
|
|
|
#define CP_GEARR -2.80f
|
|
|
|
#define CP_GEARN 0.00f
|
|
|
|
/*
|
|
|
|
#define CP_GEAR1 2.82f
|
|
|
|
#define CP_GEAR2 1.78f
|
|
|
|
#define CP_GEAR3 1.27f
|
|
|
|
#define CP_GEAR4 0.92f
|
|
|
|
#define CP_GEAR5 0.60f
|
2018-09-07 23:39:04 +00:00
|
|
|
|
2011-02-18 14:31:32 +00:00
|
|
|
#define CP_GEAR1 3.02f
|
|
|
|
#define CP_GEAR2 2.01f
|
|
|
|
#define CP_GEAR3 1.34f
|
|
|
|
#define CP_GEAR4 0.89f
|
|
|
|
#define CP_GEAR5 0.60f
|
2018-09-07 23:39:04 +00:00
|
|
|
*/
|
|
|
|
#define CP_GEAR1 2.75f
|
|
|
|
#define CP_GEAR2 1.67f
|
|
|
|
#define CP_GEAR3 1.19f
|
|
|
|
#define CP_GEAR4 0.82f
|
|
|
|
#define CP_GEAR5 0.49f
|
|
|
|
|
2011-02-18 14:31:32 +00:00
|
|
|
|
|
|
|
#define CP_RPM_MAX 6250
|
|
|
|
#define CP_RPM_MIN 1000
|
|
|
|
|
|
|
|
// #define CP_HP_PEAK 191.0f
|
|
|
|
// #define CP_RPM_HP_PEAK 4600.0f
|
|
|
|
#define CP_HP_PEAK 320.0f
|
|
|
|
#define CP_RPM_HP_PEAK 5000.0f
|
|
|
|
// #define CP_TORQUE_PEAK 230.0f
|
|
|
|
// #define CP_RPM_TORQUE_PEAK 3800.0f
|
|
|
|
#define CP_TORQUE_PEAK 400.0f
|
|
|
|
#define CP_RPM_TORQUE_PEAK 2800.0f
|
|
|
|
|
|
|
|
#define HTYPE_NO_HIT 0
|
|
|
|
#define HTYPE_BOTTOMED_OUT 1
|
|
|
|
#define HTYPE_MAXED_OUT 2
|
|
|
|
|
|
|
|
#define CF_REVERSE 1
|
|
|
|
#define CF_BRAKE 2
|
|
|
|
|
|
|
|
// assign sign bit of b to a, floats only
|
|
|
|
// #define SetSign(a,b) (*(DWORD *)&(a)) = ((*(DWORD *)&(b)) & 0x80000000) | ((*(DWORD *)&(a)) & 0x7FFFFFFF)
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
GRAVITY,
|
|
|
|
NORMAL,
|
|
|
|
SHOCK,
|
|
|
|
SPRING,
|
|
|
|
SWAY_BAR,
|
|
|
|
ROAD,
|
|
|
|
INTERNAL,
|
|
|
|
AIR_FRICTION,
|
|
|
|
NUM_CAR_FORCES
|
|
|
|
} carForces_t;
|
|
|
|
|
|
|
|
|
|
|
|
#define FIRST_FW_POINT 0
|
|
|
|
#define LAST_FW_POINT 2
|
|
|
|
#define FIRST_RW_POINT 2
|
|
|
|
#define LAST_RW_POINT 4
|
|
|
|
|
|
|
|
#define FIRST_FRAME_POINT 4
|
|
|
|
#define LAST_FRAME_POINT 8
|
|
|
|
typedef enum {
|
|
|
|
// these are the points that store wheel info
|
|
|
|
FL_WHEEL,
|
|
|
|
FR_WHEEL,
|
|
|
|
RL_WHEEL,
|
|
|
|
RR_WHEEL,
|
|
|
|
|
|
|
|
// these points hold position info of the suspension used in suspension force calculations
|
|
|
|
FL_FRAME,
|
|
|
|
FR_FRAME,
|
|
|
|
RL_FRAME,
|
|
|
|
RR_FRAME,
|
|
|
|
|
|
|
|
// these are used for collision detection of the body of the car
|
|
|
|
FL_BODY,
|
|
|
|
FR_BODY,
|
|
|
|
ML_BODY,
|
|
|
|
MR_BODY,
|
|
|
|
RL_BODY,
|
|
|
|
RR_BODY,
|
|
|
|
|
|
|
|
ML_ROOF,
|
|
|
|
MR_ROOF,
|
|
|
|
|
|
|
|
NUM_CAR_POINTS
|
|
|
|
} carPointNumbers_t;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
vec3_t r;
|
|
|
|
vec3_t v;
|
|
|
|
// vec3_t lastNoZeroVelocity;
|
|
|
|
|
|
|
|
float w;
|
|
|
|
|
|
|
|
vec3_t forces[NUM_CAR_FORCES];
|
|
|
|
vec3_t netForce;
|
|
|
|
float netMoment;
|
|
|
|
|
|
|
|
vec3_t normals[3];
|
|
|
|
|
|
|
|
float mass;
|
|
|
|
float elasticity;
|
|
|
|
float radius;
|
|
|
|
|
|
|
|
float kcof;
|
|
|
|
float scof;
|
|
|
|
|
|
|
|
float fluidDensity;
|
|
|
|
|
|
|
|
int onGroundTime;
|
|
|
|
int offGroundTime;
|
|
|
|
|
|
|
|
qboolean onGround;
|
|
|
|
qboolean slipping;
|
|
|
|
} carPoint_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
float damage;
|
|
|
|
int mod;
|
|
|
|
int dflags;
|
|
|
|
int otherEnt;
|
|
|
|
vec3_t origin;
|
|
|
|
vec3_t dir;
|
|
|
|
} collisionDamage_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
float inverseWorldInertiaTensor[3][3];
|
|
|
|
|
|
|
|
vec3_t r;
|
|
|
|
vec3_t v;
|
|
|
|
|
|
|
|
// vec4_t q;
|
|
|
|
float t[3][3];
|
|
|
|
|
|
|
|
vec3_t w;
|
|
|
|
vec3_t L;
|
|
|
|
|
|
|
|
vec3_t netForce;
|
|
|
|
vec3_t netMoment;
|
|
|
|
// vec3_t normalForce;
|
|
|
|
|
|
|
|
vec3_t CoM;
|
|
|
|
|
|
|
|
// FIXME: use the t components instead of these
|
|
|
|
vec3_t forward;
|
|
|
|
vec3_t right;
|
|
|
|
vec3_t up;
|
|
|
|
|
|
|
|
float curSpringLengths[FIRST_FRAME_POINT];
|
|
|
|
|
|
|
|
float mass;
|
|
|
|
float elasticity;
|
|
|
|
} carBody_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
vec3_t v;
|
|
|
|
vec3_t netForce;
|
|
|
|
float netMoment;
|
|
|
|
} pointHistory_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
vec3_t v;
|
|
|
|
vec3_t w;
|
|
|
|
vec3_t netForce;
|
|
|
|
vec3_t netMoment;
|
|
|
|
} bodyHistory_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
float inverseBodyInertiaTensor[3][3];
|
|
|
|
|
|
|
|
carPoint_t sPoints[NUM_CAR_POINTS];
|
|
|
|
carBody_t sBody;
|
|
|
|
|
|
|
|
carPoint_t tPoints[NUM_CAR_POINTS];
|
|
|
|
carBody_t tBody;
|
|
|
|
|
|
|
|
// pointHistory_t oldPoints[3][LAST_RW_POINT];
|
|
|
|
// bodyHistory_t oldBodies[3];
|
|
|
|
|
|
|
|
// FIXME: remove these to save memory if i can
|
|
|
|
|
|
|
|
float springStrength;
|
|
|
|
float springMaxLength;
|
|
|
|
float springMinLength;
|
|
|
|
// float shockStrength;
|
|
|
|
// float swayBarStrength;
|
|
|
|
|
|
|
|
float wheelAngle;
|
|
|
|
float throttle;
|
|
|
|
|
|
|
|
int wheelOnGroundTime;
|
|
|
|
int onGroundTime;
|
|
|
|
|
|
|
|
int wheelsOffGroundTime;
|
|
|
|
int offGroundTime;
|
|
|
|
|
|
|
|
int gear; // -1 reverse, 0 neutral, 1+ forward gears
|
|
|
|
float rpm;
|
|
|
|
|
|
|
|
qboolean initializeOnNextMove;
|
|
|
|
|
|
|
|
// float aCOF;
|
|
|
|
// float dfCOF;
|
|
|
|
// float ewCOF;
|
|
|
|
} car_t;
|
|
|
|
|
|
|
|
// internal functions that are in different files
|
|
|
|
void PM_AddRoadForces(car_t *car, carBody_t *body, carPoint_t *points, float sec);
|
|
|
|
void PM_CalculateNetForce( carPoint_t *point, int pointIndex );
|
|
|
|
void PM_DriveMove( car_t *car, float time, qboolean includeBodies );
|
|
|
|
|
|
|
|
// used externally
|
|
|
|
void PM_ApplyForce( carBody_t *body, vec3_t force, vec3_t at );
|
|
|
|
void PM_InitializeVehicle( car_t *car, vec3_t origin, vec3_t angles, vec3_t velocity );
|
|
|
|
void PM_CalculateSecondaryQuantities( car_t *car, carBody_t *body, carPoint_t *points );
|
|
|
|
void PM_SetCoM( carBody_t *body, carPoint_t *points );
|