Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/old.we/src/world_entities/world_entity.cc @ 5837

Last change on this file since 5837 was 5558, checked in by bensch, 19 years ago

orxonox/branches/world_entities: merged the Trunk to the world_entities branche
merged with command
svn merge -r5516:HEAD ../trunk/ world_entities/
no conflicts

File size: 6.2 KB
Line 
1
2
3/*
4   orxonox - the future of 3D-vertical-scrollers
5
6   Copyright (C) 2004 orx
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2, or (at your option)
11   any later version.
12
13   ### File Specific:
14   main-programmer: Patrick Boenzli
15   co-programmer: Christian Meyer
16*/
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19#include "world_entity.h"
20#include "shell_command.h"
21
22#include "model.h"
23#include "resource_manager.h"
24#include "load_param.h"
25#include "list.h"
26#include "vector.h"
27#include "obb_tree.h"
28
29using namespace std;
30
31SHELL_COMMAND(model, WorldEntity, loadModel)
32    ->describe("sets the Model of the WorldEntity")
33    ->defaultValues(2, "models/ships/fighter.obj", 1.0);
34
35
36/**
37 *  Loads the WordEntity-specific Part of any derived Class
38 *
39 * @param root: Normally NULL, as the Derived Entities define a loadParams Function themeselves,
40 *              that can calls WorldEntities loadParams for itself.
41 */
42WorldEntity::WorldEntity(const TiXmlElement* root)
43{
44  this->setClassID(CL_WORLD_ENTITY, "WorldEntity");
45
46  this->model = NULL;
47  this->obbTree = NULL;
48
49  if (root)
50    this->loadParams(root);
51
52  this->setVisibiliy(true);
53}
54
55/**
56 *  standard destructor
57*/
58WorldEntity::~WorldEntity ()
59{
60  // Delete the model (unregister it with the ResourceManager)
61  if (likely(this->model != NULL))
62    ResourceManager::getInstance()->unload(this->model);
63  // Delete the obbTree
64  if( this->obbTree != NULL)
65    delete this->obbTree;
66}
67
68/**
69 * loads the WorldEntity Specific Parameters.
70 * @param root: the XML-Element to load the Data From
71 */
72void WorldEntity::loadParams(const TiXmlElement* root)
73{
74  // Do the PNode loading stuff
75  static_cast<PNode*>(this)->loadParams(root);
76
77  // Model Loading
78  LoadParam<WorldEntity>(root, "model", this, &WorldEntity::loadModel, false, NULL, 1.0f)
79      .describe("the fileName of the model, that should be loaded onto this world-entity. (must be relative to the data-dir)") ;
80
81}
82
83/**
84 * loads a Model onto a WorldEntity
85 * @param fileName the name of the model to load
86 * @param scaling the Scaling of the model
87 *
88 * @todo fix this, so it only has one loadModel-Function.
89*/
90void WorldEntity::loadModel(const char* fileName, float scaling)
91{
92  if (this->model)
93    ResourceManager::getInstance()->unload(this->model, RP_LEVEL);
94  if (fileName != NULL)
95  {
96    PRINTF(4)("fetching %s\n", fileName);
97    if (scaling == 1.0)
98      this->model = (Model*)ResourceManager::getInstance()->load(fileName, OBJ, RP_CAMPAIGN);
99    else
100      this->model = (Model*)ResourceManager::getInstance()->load(fileName, OBJ, RP_CAMPAIGN, &scaling);
101
102    this->buildObbTree(4);
103  }
104  else
105    this->model = NULL;
106}
107
108/**
109 * builds the obb-tree
110 * @param depth the depth to calculate
111 */
112bool WorldEntity::buildObbTree(unsigned int depth)
113{
114  if (this->obbTree)
115    delete this->obbTree;
116
117  if (this->model != NULL)
118  {
119    PRINTF(4)("creating obb tree\n");
120    this->obbTree = new OBBTree(depth, (sVec3D*)this->model->getVertexArray(), this->model->getVertexCount());
121    return true;
122  }
123  else
124  {
125    PRINTF(2)("could not create obb-tree, because no model was loaded yet\n");
126    this->obbTree = NULL;
127    return false;
128  }
129}
130
131
132/**
133 * sets the character attributes of a worldentity
134 * @param character attributes
135 *
136 * these attributes don't have to be set, only use them, if you need them
137*/
138//void WorldEntity::setCharacterAttributes(CharacterAttributes* charAttr)
139//{}
140
141
142/**
143 *  this function is called, when two entities collide
144 * @param entity: the world entity with whom it collides
145 *
146 * Implement behaviour like damage application or other miscellaneous collision stuff in this function
147 */
148void WorldEntity::collidesWith(WorldEntity* entity, const Vector& location)
149{
150  /**
151   * THIS IS A DEFAULT COLLISION-Effect.
152   * IF YOU WANT TO CREATE A SPECIFIC COLLISION ON EACH OBJECT
153   * USE::
154   * if (entity->isA(CL_WHAT_YOU_ARE_LOOKING_FOR)) { printf "dothings"; };
155   *
156   * You can always define a default Action.... don't be affraid just test it :)
157   */
158//  PRINTF(3)("collision %s vs %s @ (%f,%f,%f)\n", this->getClassName(), entity->getClassName(), location.x, location.y, location.z);
159}
160
161
162/**
163 *  this is called immediately after the Entity has been constructed, initialized and then Spawned into the World
164 *
165 */
166void WorldEntity::postSpawn ()
167{
168}
169
170
171/**
172 *  this method is called by the world if the WorldEntity leaves valid gamespace
173 *
174 * For free entities this means it left the Track boundaries. With bound entities it means its Location adresses a
175 * place that is not in the world anymore. In both cases you might have to take extreme measures (a.k.a. call destroy).
176 *
177 * NOT YET IMPLEMENTED
178 */
179void WorldEntity::leftWorld ()
180{
181}
182
183
184/**
185 *  this method is called every frame
186 * @param time: the time in seconds that has passed since the last tick
187 *
188 * Handle all stuff that should update with time inside this method (movement, animation, etc.)
189*/
190void WorldEntity::tick(float time)
191{
192}
193
194
195/**
196 *  the entity is drawn onto the screen with this function
197 *
198 * This is a central function of an entity: call it to let the entity painted to the screen.
199 * Just override this function with whatever you want to be drawn.
200*/
201void WorldEntity::draw() const
202{
203  glMatrixMode(GL_MODELVIEW);
204  glPushMatrix();
205  float matrix[4][4];
206
207  /* translate */
208  glTranslatef (this->getAbsCoor ().x,
209                this->getAbsCoor ().y,
210                this->getAbsCoor ().z);
211  /* rotate */ // FIXME: devise a new Way to rotate this
212  this->getAbsDir ().matrix (matrix);
213  glMultMatrixf((float*)matrix);
214
215  if (this->model)
216    this->model->draw();
217  glPopMatrix();
218}
219
220/**
221 * DEBUG-DRAW OF THE BV-Tree.
222 * @param depth What depth to draw
223 * @param drawMode the mode to draw this entity under
224 */
225void WorldEntity::drawBVTree(unsigned int depth, int drawMode) const
226{
227  glMatrixMode(GL_MODELVIEW);
228  glPushMatrix();
229  /* translate */
230  glTranslatef (this->getAbsCoor ().x,
231                this->getAbsCoor ().y,
232                this->getAbsCoor ().z);
233  /* rotate */
234  Vector tmpRot = this->getAbsDir().getSpacialAxis();
235  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
236
237  if (this->obbTree)
238    this->obbTree->drawBV(depth, drawMode);
239  glPopMatrix();
240}
Note: See TracBrowser for help on using the repository browser.