Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/orxonox/objects/WorldEntity.cc @ 952

Last change on this file since 952 was 871, checked in by landauf, 17 years ago

merged core branch to trunk

File size: 8.3 KB
RevLine 
[513]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:
[670]22 *      Fabian 'x3n' Landau
[513]23 *   Co-authors:
24 *      ...
25 *
26 */
27
[786]28#include "OrxonoxStableHeaders.h"
[784]29
[715]30#include <string>
[497]31#include <sstream>
32
[742]33#include "util/tinyxml/tinyxml.h"
34#include "util/Tokenizer.h"
35#include "util/String2Number.h"
[497]36#include "../core/CoreIncludes.h"
[614]37#include "../Orxonox.h"
[708]38#include "WorldEntity.h"
[871]39#include "core/XMLPort.h"
[497]40
41namespace orxonox
42{
43    CreateFactory(WorldEntity);
44
45    unsigned int WorldEntity::worldEntityCounter_s = 0;
46
47    WorldEntity::WorldEntity()
48    {
49        RegisterObject(WorldEntity);
50
[554]51        if (Orxonox::getSingleton()->getSceneManager())
[497]52        {
53            std::ostringstream name;
54            name << (WorldEntity::worldEntityCounter_s++);
55            this->setName("WorldEntity" + name.str());
[633]56            this->node_ = Orxonox::getSingleton()->getSceneManager()->getRootSceneNode()->createChildSceneNode(this->getName());
[497]57        }
[633]58        else
59        {
60            this->node_ = 0;
61        }
[497]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_);
[643]80            this->translate(dt * this->velocity_, Ogre::Node::TS_LOCAL);
[497]81
82            this->rotationRate_ += (dt * this->momentum_);
83            this->rotate(this->rotationAxis_, dt * this->rotationRate_);
84        }
85    }
[583]86
87    void WorldEntity::loadParams(TiXmlElement* xmlElem)
88    {
[871]89
[583]90        BaseObject::loadParams(xmlElem);
[871]91/*
[622]92        if (xmlElem->Attribute("position"))
93        {
[715]94            std::vector<std::string> pos = tokenize(xmlElem->Attribute("position"),",");
[622]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        }
[589]101
[622]102        if (xmlElem->Attribute("direction"))
103        {
[715]104            std::vector<std::string> pos = tokenize(xmlElem->Attribute("direction"),",");
[622]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        }
[589]111
[595]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
[622]129        if (xmlElem->Attribute("scale"))
130        {
[715]131            std::string scaleStr = xmlElem->Attribute("scale");
[622]132            float scale;
133            String2Number<float>(scale, scaleStr);
134            this->setScale(scale);
135        }
136
137        if (xmlElem->Attribute("rotationAxis"))
138        {
[715]139            std::vector<std::string> pos = tokenize(xmlElem->Attribute("rotationAxis"),",");
[622]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
[630]156        create();
[871]157*/
158    }
[643]159
[871]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);
[583]165    }
166
[871]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);
185    }
186
[630]187    bool WorldEntity::create(){
[631]188      registerAllVariables();
[630]189      return true;
190    }
[643]191
[583]192    void WorldEntity::registerAllVariables()
193    {
[871]194/*      // register coordinates
[630]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);
[871]202      registerVar( (void*) &(this->getOrientation().z), sizeof(this->getOrientation().z), network::DATA);*/
[630]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);*/
[565]213    }
[871]214
215    void WorldEntity::attachWorldEntity(WorldEntity* entity)
216    {
217        this->attachedWorldEntities_.push_back(entity);
218    }
219
220    const WorldEntity* WorldEntity::getAttachedWorldEntity(unsigned int index)
221    {
222        if (index < this->attachedWorldEntities_.size())
223            return this->attachedWorldEntities_[index];
224        else
225            return 0;
226    }
[497]227}
Note: See TracBrowser for help on using the repository browser.