Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network/src/orxonox/objects/WorldEntity.cc @ 1494

Last change on this file since 1494 was 1494, checked in by rgrieder, 16 years ago
  • set the svn:eol-style property to all files so, that where ever you check out, you'll get the right line endings (had to change every file with mixed endings to windows in order to set the property)
  • Property svn:eol-style set to native
File size: 7.1 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "OrxonoxStableHeaders.h"
30#include "WorldEntity.h"
31
32#include <string>
33#include <sstream>
34
35#include "tinyxml/tinyxml.h"
36#include "util/SubString.h"
37#include "core/CoreIncludes.h"
38#include "GraphicsEngine.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      velocity_    (0, 0, 0),
49      acceleration_(0, 0, 0),
50      rotationAxis_(0, 1, 0),
51      rotationRate_(0),
52      momentum_    (0),
53      node_        (0),
54      bStatic_     (true)
55    {
56        RegisterObject(WorldEntity);
57
58        if (GraphicsEngine::getSingleton().getSceneManager())
59        {
60          std::ostringstream name;
61          name << (WorldEntity::worldEntityCounter_s++);
62          this->setName("WorldEntity" + name.str());
63          this->node_ = GraphicsEngine::getSingleton().getSceneManager()->getRootSceneNode()->createChildSceneNode(this->getName());
64
65          registerAllVariables();
66        }
67    }
68   
69
70    WorldEntity::~WorldEntity()
71    {
72      // just to make sure we clean out all scene nodes
73      if(this->getNode())
74        this->getNode()->removeAndDestroyAllChildren();
75    }
76
77    void WorldEntity::tick(float dt)
78    {
79        if (!this->bStatic_)
80        {
81//             COUT(4) << "acceleration: " << this->acceleration_ << " velocity: " << this->velocity_ << std::endl;
82            this->velocity_ += (dt * this->acceleration_);
83            this->translate(dt * this->velocity_, Ogre::Node::TS_LOCAL);
84
85            this->rotationRate_ += (dt * this->momentum_);
86            this->rotate(this->rotationAxis_, dt * this->rotationRate_);
87            //COUT(3) << "rotationrate: " << this->rotationRate_.valueDegrees() << " momentum: " << this->momentum_.valueDegrees() << std::endl;
88        }
89    }
90
91    void WorldEntity::loadParams(TiXmlElement* xmlElem)
92    {
93
94        BaseObject::loadParams(xmlElem);
95        create();
96    }
97   
98
99    void WorldEntity::setYawPitchRoll(const Degree& yaw, const Degree& pitch, const Degree& roll)
100    {
101        this->yaw(yaw);
102        this->pitch(pitch);
103        this->roll(roll);
104    }
105
106    /**
107        @brief XML loading and saving.
108        @param xmlelement The XML-element
109        @param loading Loading (true) or saving (false)
110        @return The XML-element
111    */
112    void WorldEntity::XMLPort(Element& xmlelement, XMLPort::Mode mode)
113    {
114        BaseObject::XMLPort(xmlelement, mode);
115
116        XMLPortParam(WorldEntity, "position", setPositionLoader2, getPosition, xmlelement, mode);
117        XMLPortParamLoadOnly(WorldEntity, "direction", setDirectionLoader, xmlelement, mode);
118        XMLPortParamLoadOnly(WorldEntity, "yawpitchroll", setYawPitchRoll, xmlelement, mode);
119        XMLPortParam(WorldEntity, "scale", setTotalScale, getScale, xmlelement, mode);
120        XMLPortParam(WorldEntity, "rotationAxis", setRotationAxisLoader, getRotationAxis, xmlelement, mode);
121        XMLPortParam(WorldEntity, "rotationRate", setRotationRate, getRotationRate, xmlelement, mode);
122
123        XMLPortObject(WorldEntity, WorldEntity, "attached", attachWorldEntity, getAttachedWorldEntity, xmlelement, mode, false, true);
124       
125        WorldEntity::create();
126    }
127
128
129    void WorldEntity::registerAllVariables()
130    {
131      // register coordinates
132      registerVar( (void*) &(this->getPosition().x), sizeof(this->getPosition().x), network::DATA, 0x3);
133      registerVar( (void*) &(this->getPosition().y), sizeof(this->getPosition().y), network::DATA, 0x3);
134      registerVar( (void*) &(this->getPosition().z), sizeof(this->getPosition().z), network::DATA, 0x3);
135      // register orientation
136      registerVar( (void*) &(this->getOrientation().w), sizeof(this->getOrientation().w), network::DATA, 0x3);
137      registerVar( (void*) &(this->getOrientation().x), sizeof(this->getOrientation().x), network::DATA, 0x3);
138      registerVar( (void*) &(this->getOrientation().y), sizeof(this->getOrientation().y), network::DATA, 0x3);
139      registerVar( (void*) &(this->getOrientation().z), sizeof(this->getOrientation().z), network::DATA, 0x3);
140      // register velocity_
141      registerVar( (void*) &(this->getVelocity().x), sizeof(this->getVelocity().x), network::DATA, 0x3);
142      registerVar( (void*) &(this->getVelocity().y), sizeof(this->getVelocity().y), network::DATA, 0x3);
143      registerVar( (void*) &(this->getVelocity().z), sizeof(this->getVelocity().z), network::DATA, 0x3);
144      // register rotationAxis/rate
145      registerVar( (void*) &(this->getRotationRate()), sizeof(this->getRotationRate()), network::DATA, 0x3);
146      registerVar( (void*) &(this->getRotationAxis().x), sizeof(this->getRotationAxis().x), network::DATA, 0x3);
147      registerVar( (void*) &(this->getRotationAxis().y), sizeof(this->getRotationAxis().y), network::DATA, 0x3);
148      registerVar( (void*) &(this->getRotationAxis().z), sizeof(this->getRotationAxis().z), network::DATA, 0x3);
149      // register scale of node
150      registerVar( (void*) &(this->getScale().x), sizeof(this->getScale().x), network::DATA, 0x3);
151      registerVar( (void*) &(this->getScale().y), sizeof(this->getScale().y), network::DATA, 0x3);
152      registerVar( (void*) &(this->getScale().z), sizeof(this->getScale().z), network::DATA, 0x3);
153      //register staticity
154      registerVar( (void*) &(this->bStatic_), sizeof(this->bStatic_), network::DATA, 0x3);
155      //register acceleration & momentum
156//       registerVar( (void*) &(this->getAcceleration().x), sizeof(this->getAcceleration().x), network::DATA, 0x2);
157//       registerVar( (void*) &(this->getAcceleration().y), sizeof(this->getAcceleration().y), network::DATA, 0x2);
158//       registerVar( (void*) &(this->getAcceleration().z), sizeof(this->getAcceleration().z), network::DATA, 0x2);
159//       registerVar( (void*) &(this->getMomentum()), sizeof(this->getMomentum()), network::DATA, 0x2); // only backsync
160    }
161
162    void WorldEntity::attachWorldEntity(WorldEntity* entity)
163    {
164        this->attachedWorldEntities_.push_back(entity);
165    }
166
167    const WorldEntity* WorldEntity::getAttachedWorldEntity(unsigned int index) const
168    {
169        if (index < this->attachedWorldEntities_.size())
170            return this->attachedWorldEntities_[index];
171        else
172            return 0;
173    }
174}
Note: See TracBrowser for help on using the repository browser.