Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/core2/src/orxonox/objects/WorldEntity.cc @ 878

Last change on this file since 878 was 878, checked in by landauf, 16 years ago

added boolean bApplyLoaderMask to the XMLPortObject macro to determine whether the ClassTreeMask from the Loader should be applied or not (the idea is: objects included in excluded objects are excluded too, no matter what the mask sais. but objects included in a namespace or directly in a level-file are filtered by the mask.)

File size: 8.3 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *
4 *
5 *   License notice:
6 *
7 *   This program is free software; you can redistribute it and/or
8 *   modify it under the terms of the GNU General Public License
9 *   as published by the Free Software Foundation; either version 2
10 *   of the License, or (at your option) any later version.
11 *
12 *   This program is distributed in the hope that it will be useful,
13 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *   GNU General Public License for more details.
16 *
17 *   You should have received a copy of the GNU General Public License
18 *   along with this program; if not, write to the Free Software
19 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 *
21 *   Author:
22 *      Fabian 'x3n' Landau
23 *   Co-authors:
24 *      ...
25 *
26 */
27
28#include "OrxonoxStableHeaders.h"
29
30#include <string>
31#include <sstream>
32
33#include "util/tinyxml/tinyxml.h"
34#include "util/Tokenizer.h"
35#include "util/String2Number.h"
36#include "../core/CoreIncludes.h"
37#include "../Orxonox.h"
38#include "WorldEntity.h"
39#include "core/XMLPort.h"
40
41namespace orxonox
42{
43    CreateFactory(WorldEntity);
44
45    unsigned int WorldEntity::worldEntityCounter_s = 0;
46
47    WorldEntity::WorldEntity()
48    {
49        RegisterObject(WorldEntity);
50
51        if (Orxonox::getSingleton()->getSceneManager())
52        {
53            std::ostringstream name;
54            name << (WorldEntity::worldEntityCounter_s++);
55            this->setName("WorldEntity" + name.str());
56            this->node_ = Orxonox::getSingleton()->getSceneManager()->getRootSceneNode()->createChildSceneNode(this->getName());
57        }
58        else
59        {
60            this->node_ = 0;
61        }
62
63        this->bStatic_ = true;
64        this->velocity_ = Vector3(0, 0, 0);
65        this->acceleration_ = Vector3(0, 0, 0);
66        this->rotationAxis_ = Vector3(0, 1, 0);
67        this->rotationRate_ = 0;
68        this->momentum_ = 0;
69    }
70
71    WorldEntity::~WorldEntity()
72    {
73    }
74
75    void WorldEntity::tick(float dt)
76    {
77        if (!this->bStatic_)
78        {
79            this->velocity_ += (dt * this->acceleration_);
80            this->translate(dt * this->velocity_, Ogre::Node::TS_LOCAL);
81
82            this->rotationRate_ += (dt * this->momentum_);
83            this->rotate(this->rotationAxis_, dt * this->rotationRate_);
84        }
85    }
86
87    void WorldEntity::loadParams(TiXmlElement* xmlElem)
88    {
89
90        BaseObject::loadParams(xmlElem);
91/*
92        if (xmlElem->Attribute("position"))
93        {
94            std::vector<std::string> pos = tokenize(xmlElem->Attribute("position"),",");
95            float x, y, z;
96            String2Number<float>(x, pos[0]);
97            String2Number<float>(y, pos[1]);
98            String2Number<float>(z, pos[2]);
99            this->setPosition(x, y, z);
100        }
101
102        if (xmlElem->Attribute("direction"))
103        {
104            std::vector<std::string> pos = tokenize(xmlElem->Attribute("direction"),",");
105            float x, y, z;
106            String2Number<float>(x, pos[0]);
107            String2Number<float>(y, pos[1]);
108            String2Number<float>(z, pos[2]);
109            this->setDirection(x, y, z);
110        }
111
112        if (xmlElem->Attribute("yaw") || xmlElem->Attribute("pitch") || xmlElem->Attribute("roll"))
113        {
114            float yaw = 0.0, pitch = 0.0, roll = 0.0;
115            if (xmlElem->Attribute("yaw"))
116                String2Number<float>(yaw,xmlElem->Attribute("yaw"));
117
118            if (xmlElem->Attribute("pitch"))
119                String2Number<float>(pitch,xmlElem->Attribute("pitch"));
120
121            if (xmlElem->Attribute("roll"))
122                String2Number<float>(roll,xmlElem->Attribute("roll"));
123
124            this->yaw(Degree(yaw));
125            this->pitch(Degree(pitch));
126            this->roll(Degree(roll));
127        }
128
129        if (xmlElem->Attribute("scale"))
130        {
131            std::string scaleStr = xmlElem->Attribute("scale");
132            float scale;
133            String2Number<float>(scale, scaleStr);
134            this->setScale(scale);
135        }
136
137        if (xmlElem->Attribute("rotationAxis"))
138        {
139            std::vector<std::string> pos = tokenize(xmlElem->Attribute("rotationAxis"),",");
140            float x, y, z;
141            String2Number<float>(x, pos[0]);
142            String2Number<float>(y, pos[1]);
143            String2Number<float>(z, pos[2]);
144            this->setRotationAxis(x, y, z);
145        }
146
147        if (xmlElem->Attribute("rotationRate"))
148        {
149            float rotationRate;
150            String2Number<float>(rotationRate, xmlElem->Attribute("rotationRate"));
151            this->setRotationRate(Degree(rotationRate));
152            if (rotationRate != 0)
153                this->setStatic(false);
154        }
155
156        create();
157*/
158    }
159
160    void WorldEntity::setYawPitchRoll(const Degree& yaw, const Degree& pitch, const Degree& roll)
161    {
162        this->yaw(yaw);
163        this->pitch(pitch);
164        this->roll(roll);
165    }
166
167    /**
168        @brief XML loading and saving.
169        @param xmlelement The XML-element
170        @param loading Loading (true) or saving (false)
171        @return The XML-element
172    */
173    void WorldEntity::XMLPort(Element& xmlelement, bool loading)
174    {
175        BaseObject::XMLPort(xmlelement, loading);
176
177        XMLPortParam(WorldEntity, "position", setPositionLoader2, getPosition, xmlelement, loading);
178        XMLPortParamLoadOnly(WorldEntity, "direction", setDirectionLoader, xmlelement, loading);
179        XMLPortParamLoadOnly(WorldEntity, "yawpitchroll", setYawPitchRoll, xmlelement, loading);
180        XMLPortParam(WorldEntity, "scale", setTotalScale, getScale, xmlelement, loading);
181        XMLPortParam(WorldEntity, "rotationAxis", setRotationAxisLoader, getRotationAxis, xmlelement, loading);
182        XMLPortParam(WorldEntity, "rotationRate", setRotationRate, getRotationRate, xmlelement, loading);
183
184        XMLPortObject(WorldEntity, WorldEntity, "attached", attachWorldEntity, getAttachedWorldEntity, xmlelement, loading, false);
185    }
186
187    bool WorldEntity::create(){
188      registerAllVariables();
189      return true;
190    }
191
192    void WorldEntity::registerAllVariables()
193    {
194/*      // register coordinates
195      registerVar( (void*) &(this->getPosition().x), sizeof(this->getPosition().x), network::DATA);
196      registerVar( (void*) &(this->getPosition().y), sizeof(this->getPosition().y), network::DATA);
197      registerVar( (void*) &(this->getPosition().z), sizeof(this->getPosition().z), network::DATA);
198      // register orientation
199      registerVar( (void*) &(this->getOrientation().w), sizeof(this->getOrientation().w), network::DATA);
200      registerVar( (void*) &(this->getOrientation().x), sizeof(this->getOrientation().x), network::DATA);
201      registerVar( (void*) &(this->getOrientation().y), sizeof(this->getOrientation().y), network::DATA);
202      registerVar( (void*) &(this->getOrientation().z), sizeof(this->getOrientation().z), network::DATA);*/
203      // not needed at the moment, because we don't have prediction yet
204      /*// register velocity_
205      registerVar( (void*) &(this->getVelocity().x), sizeof(this->getVelocity().x), network::DATA);
206      registerVar( (void*) &(this->getVelocity().y), sizeof(this->getVelocity().y), network::DATA);
207      registerVar( (void*) &(this->getVelocity().z), sizeof(this->getVelocity().z), network::DATA);
208      // register rotationAxis/rate
209      registerVar( (void*) &(this->getRotationRate()), sizeof(this->getRotationRate()), network::DATA);
210      registerVar( (void*) &(this->getRotationAxis().x), sizeof(this->getRotationAxis().x), network::DATA);
211      registerVar( (void*) &(this->getRotationAxis().y), sizeof(this->getRotationAxis().y), network::DATA);
212      registerVar( (void*) &(this->getRotationAxis().z), sizeof(this->getRotationAxis().z), network::DATA);*/
213    }
214
215    void WorldEntity::attachWorldEntity(WorldEntity* entity)
216    {
217        this->attachedWorldEntities_.push_back(entity);
218    }
219
220    const WorldEntity* WorldEntity::getAttachedWorldEntity(unsigned int index) const
221    {
222        if (index < this->attachedWorldEntities_.size())
223            return this->attachedWorldEntities_[index];
224        else
225            return 0;
226    }
227}
Note: See TracBrowser for help on using the repository browser.