etqw-sdk/source/game/vehicles/VehicleIK.h

246 lines
6.3 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __GAME_VEHICLES_VEHICLEIK_H__
#define __GAME_VEHICLES_VEHICLEIK_H__
#include "../IK.h"
#include "../script/ScriptEntityHelpers.h"
/*
===============================================================================
IK controller for wheel based vehicle suspension
===============================================================================
*/
class sdVehicleRigidBodyWheel;
class sdTransport_RB;
class sdMotorSound;
class sdIK_WheeledVehicle : public idIK {
public:
CLASS_PROTOTYPE( sdIK_WheeledVehicle );
sdIK_WheeledVehicle( void );
virtual ~sdIK_WheeledVehicle( void );
void AddWheel( sdVehicleRigidBodyWheel& wheel );
void ClearWheels( void );
virtual bool Evaluate( void );
virtual void ClearJointMods( void );
bool Init( sdTransport_RB* self, const char *anim, const idVec3 &modelOffset );
int GetNumWheels( void ) const { return wheels.Num(); }
protected:
idList< sdVehicleRigidBodyWheel* > wheels;
sdTransport_RB* rbParent;
};
class sdIK_Walker : public idIK {
public:
CLASS_PROTOTYPE( sdIK_Walker );
sdIK_Walker( void );
virtual ~sdIK_Walker( void );
virtual bool Init( idEntity *self, const char *anim, const idVec3 &modelOffset );
virtual bool Evaluate( void );
virtual void ClearJointMods( void );
float FindSmallest( float size1, float min2, float max2, float& sizeMin2, float& sizeMax2 );
float FindSmallest( float min1, float max1, float min2, float max2, float& sizeMin1, float& sizeMax1, float& sizeMin2, float& sizeMax2 );
void SetCompressionScale( float scale, float length );
bool GetStability( void ) const { return isStable; }
virtual bool IsInitialized( void ) const { return initialized; }
protected:
idClipModel* footModel;
jointHandle_t waistJoint;
struct currentLegInfo_t {
float floorHeight;
idVec3 jointWorldOrigin;
idMat3 hipAxis;
idMat3 kneeAxis;
idMat3 ankleAxis;
idMat3 midAxis;
};
struct leg_t {
jointHandle_t footJoint;
jointHandle_t ankleJoint;
jointHandle_t midJoint;
jointHandle_t kneeJoint;
jointHandle_t hipJoint;
idVec3 hipForward;
idVec3 midForward;
idVec3 midSide;
idVec3 kneeForward;
float upperLegLength;
float midLegLength;
float lowerLegLength;
idMat3 upperLegToHipJoint;
idMat3 midToUpperLegJoint;
idMat3 lowerLegToKneeJoint;
idMat3 lastAnkleAxes;
float oldAnkleHeight;
currentLegInfo_t current;
};
idList< leg_t > legs;
float smoothing;
float downsmoothing;
float waistSmoothing;
float footShift;
float waistShift;
float minWaistFloorDist;
float minWaistAnkleDist;
float footUpTrace;
float footDownTrace;
float invertedLegDirOffset;
bool tiltWaist;
bool usePivot;
bool isStable;
idInterpolate< float > compressionInterpolate;
// state
int pivotFoot;
float pivotYaw;
idVec3 pivotPos;
bool oldHeightsValid;
float oldWaistHeight;
idVec3 waistOffset;
};
class sdTransport;
class sdVehiclePosition;
class idPlayer;
class sdDeclStringMap;
class sdVehicleWeapon;
class sdVehicleIKSystem : public idClass {
public:
ABSTRACT_PROTOTYPE( sdVehicleIKSystem );
virtual ~sdVehicleIKSystem( void ) { }
void InitClamp( const angleClamp_t& yaw, const angleClamp_t& pitch );
void SetPosition( sdVehiclePosition* _position ) { position = _position; }
virtual idPlayer* GetPlayer( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
virtual void Update( void ) = 0;
protected:
sdTransport* vehicle;
angleClamp_t clampYaw;
angleClamp_t clampPitch;
sdVehiclePosition* position;
sdVehicleWeapon* weapon;
};
class sdVehicleIKArms : public sdVehicleIKSystem {
public:
CLASS_PROTOTYPE( sdVehicleIKArms );
virtual void Update( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
protected:
typedef enum armJoints_e {
ARM_JOINT_INDEX_SHOULDER,
ARM_JOINT_INDEX_ELBOW,
ARM_JOINT_INDEX_WRIST,
ARM_JOINT_INDEX_MUZZLE,
ARM_JOINT_NUM_JOINTS
} armJoints_t;
sdMotorSound* pitchSound;
sdMotorSound* yawSound;
jointHandle_t ikJoints[ ARM_JOINT_NUM_JOINTS ];
idVec3 baseJointPositions[ ARM_JOINT_NUM_JOINTS ];
idMat3 baseJointAxes[ ARM_JOINT_NUM_JOINTS ];
idAngles jointAngles;
idMat3 oldParentAxis;
int pitchAxis;
bool requireTophat;
};
class sdVehicleSwivel : public sdVehicleIKSystem {
public:
CLASS_PROTOTYPE( sdVehicleSwivel );
virtual void Update( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
protected:
sdMotorSound* yawSound;
idAngles angles;
idMat3 baseAxis;
jointHandle_t joint;
};
class sdVehicleWeaponAimer : public sdVehicleIKSystem {
public:
CLASS_PROTOTYPE( sdVehicleWeaponAimer );
virtual void Update( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
protected:
sdScriptedEntityHelper_Aimer aimer;
};
class sdVehicleJointAimer : public sdVehicleIKSystem {
public:
CLASS_PROTOTYPE( sdVehicleJointAimer );
virtual void Update( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
virtual idPlayer* GetPlayer( void );
protected:
sdMotorSound* yawSound;
sdMotorSound* pitchSound;
idAngles angles;
idMat3 baseAxis;
jointHandle_t joint;
sdVehicleWeapon* weapon2;
};
class sdVehicleIK_Steering : public sdVehicleIKSystem {
public:
CLASS_PROTOTYPE( sdVehicleIK_Steering );
sdVehicleIK_Steering( void );
virtual ~sdVehicleIK_Steering( void );
virtual void Update( void );
virtual bool Setup( sdTransport* _vehicle, const angleClamp_t& yaw, const angleClamp_t& pitch, const idDict& ikParms );
private:
sdPlayerArmIK ik;
};
#endif // __GAME_VEHICLES_VEHICLEIK_H__