00001
00009 #ifndef _CMECH_H
00010 #define _CMECH_H
00011
00012 class cMech;
00013
00014 #include "psi3d/md5frmt.h"
00015
00016 #include "cObject.h"
00017 #include "cWeapon.h"
00018 #include "cComcom.h"
00019
00020 #include <vector>
00021 #include <map>
00022
00023 class cWeapon;
00024
00025
00026 #define MECH_CHASSIS_LR_AXIS AX_LR1
00027 #define MECH_TURRET_LR_AXIS AX_LR2
00028 #define MECH_TURRET_UD_AXIS AX_UD2
00029 #define MECH_THROTTLE_AXIS AX_UD1
00030
00031 #define MECH_FIRE_BUTTON BT_R2
00032
00033 #define MECH_JET_BUTTON BT_L2
00034 #define MECH_CAMERA_BUTTON BT_DELTA
00035
00040 class cMech : public cObject {
00041 friend class cWepcom;
00042 friend class cForcom;
00043 protected:
00044
00045
00047
00048 enum {
00049 MAX_CAMERAMODES = 6
00050 };
00051
00052
00053 protected:
00054
00056 static int sInstances;
00057
00059 static long sTextures[1];
00060
00061 protected:
00062 std::vector<cWeapon*> mWeapons;
00063
00064 int mCurrentWeapon;
00065
00066 cExplosion mExplosion;
00067
00068
00069 float mBse[3];
00070
00071
00072 float mTwr[3];
00073
00074
00075 float mJetOn;
00076
00077
00078 float mThrottle;
00079
00081 int mCameraState;
00082
00083 struct rComputerised {
00084 cComcom* comcom;
00085 cTarcom* tarcom;
00086 cSyscom* syscom;
00087 cWepcom* wepcom;
00088 cForcom* forcom;
00089 cNavcom* navcom;
00091 rComputerised(cObject * o);
00093 ~rComputerised();
00095 void process(float dt);
00096 };
00097
00098 rComputerised* computerised;
00099
00100 struct rRigged {
00102 float scale;
00104 MD5Format::model* model;
00106 MD5Format::joint* joints;
00108 std::map<int, int> jointpoints;
00110 std::map<int, std::map<int, float> > rotators;
00111
00112 float mHead[16];
00113 float mCTMount[16];
00114 float mBKMount[16];
00115 float mRSMount[16];
00116 float mRAMount[16];
00117 float mLSMount[16];
00118 float mLAMount[16];
00120
00121 enum Jointpoints {
00122 EYE, HEAD, NECK,
00123 CTMOUNT, LAMOUNT, RAMOUNT, LSMOUNT, RSMOUNT, BKMOUNT,
00124 JET0, JET1, JET2, JET3, JET4,
00125 SPINE, TORSOR, LEFTLEG, RIGHTLEG, LEFTCALF, RIGHTCALF, MAX_JOINTPOINTS
00126 };
00127
00129
00130 rRigged() : scale(1.0f), model(NULL), joints(NULL) {
00131 }
00133
00134 ~rRigged() {
00135 delete model;
00136 delete joints;
00137 }
00138
00139 std::string getJointname(unsigned int num) {
00140 const char* names[] = {
00141 "EYE", "HEAD", "NECK",
00142 "CTMOUNT", "LAMOUNT", "RAMOUNT", "LSMOUNT", "RSMOUNT", "BKMOUNT",
00143 "JET0", "JET1", "JET2", "JET3", "JET4",
00144 "SPINE", "TORSOR", "LEFTLEG", "RIGHTLEG", "LEFTCALF", "RIGHTCALF"
00145 };
00146 if (num >= MAX_JOINTPOINTS) return string("");
00147 return string(names[num]);
00148 }
00149 };
00150
00151 rRigged* rigged;
00152
00153
00154 public:
00155 cMech(float* pos = NULL, float* rot = NULL);
00156 ~cMech();
00157
00158
00159 virtual void onMessage(void* message);
00160 virtual void onSpawn();
00161
00162
00163 void multEyeMatrix();
00164 void setAsAudioListener();
00165
00166
00167 void animatePhysics(float spf);
00168 void poseRunning(float spf);
00169 void poseJumping(float spf);
00170
00171
00172 void ChassisLR(float radians);
00173 void ChassisUD(float radians);
00174 float TowerLR(float radians);
00175 void TowerUD(float radians);
00176
00177
00178 void fireAllWeapons();
00179 void fireWeapon(unsigned n);
00180 void mountWeapon(char* point, cWeapon *weapon, bool add = true);
00181
00182
00183 virtual void animate(float spf);
00184 virtual void transform();
00185 virtual void drawSolid();
00186 virtual void drawEffect();
00187 virtual void drawHUD();
00188
00189
00190 virtual void damageByParticle(float* localpos, float damage, cObject* enactor = NULL);
00191 virtual float constrainParticle(float* worldpos, float radius = 0.0f, float* localpos = NULL);
00192 float constrainParticleToWorld(float* worldpos, float radius = 0.0f);
00193 public:
00194
00195 virtual OID enemyNearby();
00196 virtual OID disturbedBy();
00197
00198
00199 virtual float inDestinationRange();
00200 virtual float inMeeleRange();
00201 virtual float inWeaponRange();
00202 virtual float inTargetRange();
00203
00204
00205 virtual void do_moveTowards();
00206 virtual void do_moveNear();
00207 virtual void do_aimAt();
00208 virtual void do_fireAt();
00209 virtual void do_idle();
00210 virtual void do_aimFor(OID target);
00211 virtual void do_moveFor(float* dest);
00212 };
00213
00214
00215 #endif
00216