00001
00012 #ifndef _OBJECT_H
00013 #define _OBJECT_H
00014
00015 class cObject;
00016 class cPad;
00017 class cController;
00018
00019 #include "cWorld.h"
00020 #include <string>
00021 #include <vector>
00022 #include <bitset>
00023
00028 float collideParticleWithSphere(
00029 float* particle3fv,
00030 float* center3fv,
00031 float radius,
00032 float* projection3fv
00033 );
00034
00035 float collideParticleWithCylinder(
00036 float* particle3fv,
00037 float* base3fv,
00038 float radius,
00039 float height,
00040 float* projection3fv
00041 );
00042
00043 float collideParticleWithAABB(
00044 float* particle3fv,
00045 float* min3fv,
00046 float* max3fv,
00047 float* projection3fv
00048 );
00049
00054 float collideLineWithBillboard(
00055 float* start3fv,
00056 float* dir3fv,
00057 float* base3fv,
00058 float radius,
00059 float height,
00060 float* impactpoint3fv,
00061 float* impactnormal3fv);
00062
00063 float collideLineWithCylinder(
00064 float* start3fv,
00065 float* dir3fv,
00066 float* base3fv,
00067 float radius,
00068 float height,
00069 float* impactpoint3fv,
00070 float* impactnormal3fv);
00071
00072 float collideLineWithAABB(
00073 float* start3fv,
00074 float* dir3fv,
00075 float* min3fv,
00076 float* max3fv,
00077 float* impactpoint3fv,
00078 float* impactnormal3fv);
00079
00091 class cObject {
00092 public:
00093 friend class cWorld;
00094
00096 static int ENABLE_TEXTURE_3D;
00097
00101 enum Parts {
00102 BODY = 0,
00103 LEGS,
00104 LEFT,
00105 RIGHT,
00106 MAX_PARTS
00107 };
00108
00112 enum Roles {
00113
00114 NAMEABLE,
00115 SOCIALISED,
00116 TRACEABLE,
00117 COLLIDEABLE,
00118 DAMAGEABLE,
00119 ENTITY,
00120
00121
00122 MECH,
00123 BUILDING,
00124 TREE,
00125 IMMOBILE,
00126
00127
00128 RED,
00129 BLUE,
00130 GREEN,
00131 YELLOW,
00132 CIVIL,
00133
00134
00135 WOUNDED,
00136 SERIOUS,
00137 CRITICAL,
00138 DEAD,
00139
00140
00141 HUMANPLAYER,
00142 FRAGGED,
00143
00144 MAX_ROLES
00145 };
00146
00147 public:
00148
00149
00151 OID mSerial;
00153 std::bitset<MAX_ROLES> mRoles;
00155 double mSeconds;
00156
00157
00158
00160 std::string mName;
00162 std::string mDescription;
00164 unsigned int mDesignation;
00165
00166
00167
00169 std::bitset<MAX_ROLES> mAllies;
00171 std::bitset<MAX_ROLES> mEnemies;
00172
00173
00174
00176 std::vector<float> mAcc;
00178 std::vector<float> mVel;
00180 std::vector<float> mPos;
00182 std::vector<float> mOld;
00184 std::vector<float> mRot;
00186 std::vector<float> mOri;
00188 float mRadius;
00189
00190
00191
00193 float mHp[MAX_PARTS];
00194
00195
00196
00197
00198
00200 OID mTarget;
00202 std::vector<float> mDestination;
00204 cPad* mPad;
00206 cController* mController;
00207
00208 public:
00209 cObject();
00210 cObject(cObject* source);
00211
00212 virtual ~cObject() {
00213 }
00214
00215
00216
00218
00219 bool hasRole(Roles role) {
00220 return mRoles[role];
00221 }
00222
00224
00225 void addRole(Roles role) {
00226 mRoles[role] = true;
00227 }
00228
00230
00231 void remRole(Roles role) {
00232 mRoles[role] = false;
00233 }
00234
00235
00236
00238
00239 bool hasAllied(Roles role) {
00240 return mAllies[role];
00241 }
00242
00244
00245 void addAllied(Roles role) {
00246 mAllies[role] = true;
00247 }
00248
00250
00251 void remAllied(Roles role) {
00252 mAllies[role] = false;
00253 }
00254
00255
00256
00258
00259 bool hasEnemy(Roles role) {
00260 return mEnemies[role];
00261 }
00262
00264
00265 void addEnemy(Roles role) {
00266 mEnemies[role] = true;
00267 }
00268
00270
00271 void remEnemy(Roles role) {
00272 mEnemies[role] = false;
00273 }
00274
00276
00277 virtual void onSpawn() {
00278 }
00279
00281
00282 virtual void onFrag() {
00283 }
00284
00286
00287 virtual void multEyeMatrix() {
00288 }
00289
00291
00292 virtual void setAsAudioListener() {
00293 }
00294
00296
00297 virtual void animate(float spf) {
00298 mSeconds += spf;
00299 }
00300
00302
00303 virtual void transform() {
00304 }
00305
00307
00308 virtual void drawSolid() {
00309 }
00310
00312
00313 virtual void drawEffect() {
00314 }
00315
00317
00318 virtual void drawHUD() {
00319 }
00320
00321
00322
00326 struct rImpact {
00328 float pos[3];
00330 float nrm[3];
00331 };
00332
00339 virtual rImpact* damageByBeam(float* a, float* dir, float radius, float damage, bool all) {
00340 return NULL;
00341 }
00342
00343 virtual void damageByParticle(float* localpos, float damage) {
00344
00345 }
00346
00347 virtual float constrainParticle(float* worldpos, float radius = 0.0f, float* localpos = NULL) {
00348 return 0;
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00362 virtual float checkRelHeight();
00363
00369 virtual float checkAhead(float seconds);
00370
00371
00372
00373
00374
00375
00377
00378 virtual OID enemyNearby() {
00379 return 0;
00380 }
00381
00382
00383
00385
00386 virtual float inDestinationRange() {
00387 return 0.0f;
00388 }
00389
00391
00392 virtual float inMeeleRange() {
00393 return 0.0f;
00394 }
00395
00397
00398 virtual float inWeaponRange() {
00399 return 0.0f;
00400 }
00401
00403
00404 virtual float inTargetRange() {
00405 return 0.0f;
00406 }
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00426
00427 virtual void do_moveTowards() {
00428 }
00429
00431
00432 virtual void do_moveNear() {
00433 }
00434
00436
00437 virtual void do_aimAt() {
00438 }
00439
00441
00442 virtual void do_fireAt() {
00443 }
00444
00446
00447 virtual void do_idle() {
00448 }
00449
00451
00452 virtual void do_aimFor(OID target) {
00453 }
00454
00456
00457 virtual void do_moveFor(float* dest) {
00458 }
00459 };
00460
00461 #endif