Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/world_entities/world_entity.h @ 10095

Last change on this file since 10095 was 10088, checked in by patrick, 19 years ago

added the track subsystem to the buildprocess again, integrated it into the new basobject framework and commented out big regions of code because it didn't compile.
@beni: your work now can begin :D

File size: 9.7 KB
Line 
1/*!
2 * @file world_entity.h
3 * Definition of the basic WorldEntity
4 */
5
6#ifndef _WORLD_ENTITY_H
7#define _WORLD_ENTITY_H
8
9#include "p_node.h"
10#include "synchronizeable.h"
11#include "model.h"
12
13#include "cr_engine.h"
14#include "object_manager.h"
15#include "glincl.h"
16#include <vector>
17
18#include "aabb_tree_node.h"
19
20#include "physics_interface.h"
21
22
23
24// FORWARD DECLARATION
25namespace OrxSound { class SoundBuffer; class SoundSource; }
26namespace OrxGui { class GLGuiWidget; class GLGuiBar; class GLGuiEnergyWidget; };
27
28class BVTree;
29class BoundingVolume;
30class AABBTreeNode;
31class Model;
32class CollisionHandle;
33class Collision;
34class Track;
35class TiXmlElement;
36
37
38//class CharacterAttributes;
39
40
41
42//! Basis-class all interactive stuff in the world is derived from
43class WorldEntity : public PNode
44{
45  ObjectListDeclaration(WorldEntity);
46public:
47  WorldEntity();
48  virtual ~WorldEntity ();
49
50  virtual void loadParams(const TiXmlElement* root);
51
52  void loadModel(const std::string& fileName, float scaling = 1.0f, unsigned int modelNumber = 0, unsigned int obbTreeDepth = 4);
53  void loadModel2(const std::string& fileN, float scal = 1.0f){this->loadModel(fileN,scal,0,4);}
54  void setModel(Model* model, unsigned int modelNumber = 0);
55Model* getModel(unsigned int modelNumber = 0) const { return (this->models.size() > modelNumber)? this->models[modelNumber] : NULL; };
56
57  inline void loadMD2Texture(const std::string& fileName) { this->md2TextureFileName = fileName; }
58
59  /** @param visibility if the Entity should be visible (been draw) */
60  void setVisibiliy (bool visibility) { this->bVisible = visibility; };
61  /** @returns true if the entity is visible, false otherwise */
62  inline bool isVisible() const { return this->bVisible; };
63
64  virtual void reset();
65
66  virtual void postSpawn ();
67  virtual void leaveWorld ();
68
69  virtual void tick (float time);
70  virtual void draw () const;
71
72  /* --- Collision Detection Block  --- */
73  bool buildObbTree(int depth);
74  virtual void collidesWith (WorldEntity* entity, const Vector& location);
75  virtual void collidesWithGround(const Vector& location);
76  virtual void collidesWithGround(const Vector& feet, const Vector& ray_1, const Vector& ray_2);
77
78
79  /** @returns a reference to the obb tree of this worldentity */
80  inline BVTree* getOBBTree() const { return this->obbTree; };
81  inline void setOBBTree(OBBTree* tree) { /*if( this->obbTree != NULL) delete this->obbTree;*/ this->obbTree = (BVTree*)tree; }
82  void drawBVTree(int depth, int drawMode) const;
83  inline AABB* getModelAABB() const { return (this->aabbNode)?this->aabbNode->getAABB():NULL;}
84
85  /* --- Collision Reaction Block --- */
86  void subscribeReaction(CREngine::CRType type);
87  void subscribeReaction(CREngine::CRType type, const ClassID& target1);
88  void subscribeReaction(CREngine::CRType type, const ClassID& target1, const ClassID& target2);
89  void subscribeReaction(CREngine::CRType type, const ClassID& target1, const ClassID& target2, const ClassID& target3);
90  void subscribeReaction(CREngine::CRType type, const ClassID& target1, const ClassID& target2, const ClassID& target3, const ClassID& target4);
91
92  void unsubscribeReaction(CREngine::CRType type);
93  void unsubscribeReaction();
94
95  bool registerCollision(WorldEntity* entityA, WorldEntity* entityB, BoundingVolume* bvA, BoundingVolume* bvB);
96  bool registerCollision(int type, WorldEntity* entity, WorldEntity* groundEntity, Vector normal, Vector position, bool bInWall = false);
97  /** @return true if there is at least on collision reaction subscribed */
98  inline bool isReactive() const { return this->bReactive; }
99
100  CollisionHandle* getCollisionHandle(CREngine::CRType type) const { return this->collisionHandles[type]; }
101
102  /** @returns true if this entity is standing on ground (BSP model) */
103  bool isOnGround() const { return this->bOnGround; }
104  /** @param flag: marks if this entity is standing on ground */
105  void setOnGround(bool flag) { this->bOnGround = flag; }
106
107  virtual void hit(float damage, WorldEntity* killer);
108
109  virtual void destroy( WorldEntity* killer );
110
111
112  /* @returns the Count of Faces on this WorldEntity */
113  //unsigned int getFaceCount () const { return (this->model != NULL)?this->model->getFaceCount():0; };
114  //  void addAbility(Ability* ability);
115  //  void removeAbility(Ability* ability);
116  //  void setCharacterAttributes(CharacterAttributes* charAttr);
117  //  CharacterAttributes* getCharacterAttributes();
118
119  /* --- Object Manager Block --- */
120  void toList(OM_LIST list);
121  void toListS(const std::string& listName);
122
123  void toReflectionList();
124  void removeFromReflectionList();
125
126  /** @returns a Reference to the objectListNumber to set. */
127  OM_LIST& getOMListNumber() { return this->objectListNumber; }
128  /** @returns a Reference to the Iterator */
129  ObjectManager::EntityList::iterator& getEntityIterator() { return this->objectListIterator; }
130
131  void hide() { if( this->objectListNumber != OM_DEAD) this->lastObjectListNumber = this->objectListNumber; this->toList(OM_DEAD); }
132void unhide() { if( this->objectListNumber != this->lastObjectListNumber) this->toList(this->lastObjectListNumber); }
133
134
135  /* --- Character Attribute Block --- */
136  /** @returns the scaling of the model */
137float getScaling(){return this->scaling;}
138  /** @returns the damage dealt by this world entity */
139  float getDamage() const { return this->damage; }
140  /** sets the damage dealt to @param damage damage per second */
141  void setDamage(float damage) { this->damage = damage; }
142  /** @returns the Energy of the entity */
143  float getHealth() const { return this->health; };
144  /** @returns the Maximum energy this entity can be charged with */
145  float getHealthMax() const { return this->healthMax; }
146  float increaseHealth(float health);
147  float decreaseHealth(float health);
148  void increaseHealthMax(float increaseHealth);
149  OrxGui::GLGuiWidget* getHealthWidget();
150  bool hasHealthWidget() const { return this->healthWidget; };
151
152  virtual void varChangeHandler( std::list<int> & id );
153
154
155  //FIXME: the PhysicsInterface and the whole PEngine should probably be reviewed. Here its just used to store the vars
156  /* --- Physics Interface --- */
157  inline PhysicsInterface getPhysicsInterface() const { return this->physicsInterface; }
158  inline float getMass() const { return this->physicsInterface.getMass(); }
159  inline float getTotalMass() const { return this->physicsInterface.getTotalMass(); }
160  inline void setVelocity(const Vector& vel) { this->velocity = vel; }
161
162
163  /* --- Misc Stuff Block --- */
164  void debugWE() { this->debugEntity(); }
165  ;  ///FIXME
166  void debugEntity() const;
167
168
169protected:
170  void setHealth(float health) { this->health = health; this->updateHealthWidget();};
171  void setHealthWidgetVisibilit(bool visibility);
172  void setHealthMax(float healthMax);
173  void createHealthWidget();
174
175  //  CharacterAttributes*    charAttr;         //!< the character attributes of a world_entity
176private:
177  void updateHealthWidget();
178  void addTrack(const TiXmlElement* root);
179
180private:
181  /// TODO maybe we will move the following three entries and the corresponding functions to Playable AND NPC
182  float                   damage;             //!< the damage dealt to other objects by colliding.
183  float                   health;             //!< The Energy of this Entity, if the Entity has any energy at all.
184  float                   healthMax;          //!< The Maximal energy this entity can take.
185  OrxGui::GLGuiEnergyWidget* healthWidget;    //!< The Slider (if wanted).
186
187  std::vector<Model*>     models;             //!< The model that should be loaded for this entity.
188  std::string             md2TextureFileName; //!< the file name of the md2 model texture, only if this
189  std::string             modelLODName;       //!< the name of the model lod file
190  BVTree*                 obbTree;            //!< this is the obb tree reference needed for collision detection
191  AABBTreeNode*           aabbNode;           //!< the tree node of the first level of a axis aligned bounding boxes tree: model dimension
192
193  bool                    bCollide;           //!< If it should be considered for the collisiontest.
194  bool                    bVisible;           //!< If it should be visible.
195
196  OM_LIST                 objectListNumber;                //!< The ObjectList from ObjectManager this Entity is in.
197  ObjectManager::EntityList::iterator objectListIterator;  //!< The iterator position of this Entity in the given list of the ObjectManager.
198  OM_LIST                 lastObjectListNumber;            //!< the last ObjectList from the ObjectManager this Entity was is in
199
200
201
202  float                   scaling;                         //!< model's scaling factor
203  int                     scaling_handle;                  //!< handle for syncing var
204
205  std::string             modelFileName;                   //!< model's file name
206  int                     modelFileName_handle;            //!< handle for syncing var
207
208  int                     list_write;                      //!< entity's list
209  int                     list_handle;                     //!< handle for list changes
210
211  float                   health_write;
212  int                     health_handle;
213
214  float                   healthMax_write;
215  int                     healthMax_handle;
216
217  CollisionHandle*        collisionHandles[CREngine::CR_NUMBER];  //!< the list of the collision reactions
218  bool                    bReactive;                              //!< true if there is at least one collision reaction subscibed
219
220  PhysicsInterface        physicsInterface;                //!< the physics object of the WorldEntity
221  bool                    bOnGround;                       //!< true if this entity is standing on the ground
222
223
224  Track*                  entityTrack;                     //!< this is the track this entity follows (or NULL if none)
225
226protected:
227  Vector                  velocity;                        //!< speed of the entity
228
229};
230
231#endif /* _WORLD_ENTITY_H */
Note: See TracBrowser for help on using the repository browser.