Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/world_entity.h @ 10498

Last change on this file since 10498 was 10498, checked in by bknecht, 17 years ago

use pauseCamera in scripts to pause the track of the camera. this works also with pause on NPCs and spaceships with tracks

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