[Orxonox-commit 1474] r6192 - in code/branches/presentation2/src: libraries/network libraries/network/packet libraries/network/synchronisable libraries/util orxonox/infos
scheusso at orxonox.net
scheusso at orxonox.net
Wed Dec 2 11:35:24 CET 2009
Author: scheusso
Date: 2009-12-02 11:35:24 +0100 (Wed, 02 Dec 2009)
New Revision: 6192
Removed:
code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableSpecialisations.cc
Modified:
code/branches/presentation2/src/libraries/network/NetworkPrereqs.h
code/branches/presentation2/src/libraries/network/packet/DeleteObjects.cc
code/branches/presentation2/src/libraries/network/synchronisable/CMakeLists.txt
code/branches/presentation2/src/libraries/network/synchronisable/NetworkCallback.h
code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.cc
code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.h
code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableVariable.h
code/branches/presentation2/src/libraries/util/Serialise.h
code/branches/presentation2/src/orxonox/infos/PlayerInfo.cc
Log:
some cleaning up and improvements in synchronisation of vector2,3,4 and quaternions
Modified: code/branches/presentation2/src/libraries/network/NetworkPrereqs.h
===================================================================
--- code/branches/presentation2/src/libraries/network/NetworkPrereqs.h 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/NetworkPrereqs.h 2009-12-02 10:35:24 UTC (rev 6192)
@@ -143,6 +143,8 @@
// synchronisable
template <class T>
class NetworkCallback;
+ template <class T, class U>
+ class NetworkCallbackNotify;
class NetworkCallbackBase;
class NetworkCallbackManager;
class Synchronisable;
Modified: code/branches/presentation2/src/libraries/network/packet/DeleteObjects.cc
===================================================================
--- code/branches/presentation2/src/libraries/network/packet/DeleteObjects.cc 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/packet/DeleteObjects.cc 2009-12-02 10:35:24 UTC (rev 6192)
@@ -70,7 +70,6 @@
tdata += sizeof(uint32_t);
for(unsigned int i=0; i<number; i++){
unsigned int temp = Synchronisable::popDeletedObject();
-// assert(temp<10000); //ugly hack
*reinterpret_cast<uint32_t*>(tdata) = temp;
COUT(4) << temp << " ";
tdata += sizeof(uint32_t);
Modified: code/branches/presentation2/src/libraries/network/synchronisable/CMakeLists.txt
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/CMakeLists.txt 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/CMakeLists.txt 2009-12-02 10:35:24 UTC (rev 6192)
@@ -1,7 +1,6 @@
ADD_SOURCE_FILES(NETWORK_SRC_FILES
NetworkCallbackManager.cc
Synchronisable.cc
- SynchronisableSpecialisations.cc
SynchronisableVariable.cc
)
Modified: code/branches/presentation2/src/libraries/network/synchronisable/NetworkCallback.h
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/NetworkCallback.h 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/NetworkCallback.h 2009-12-02 10:35:24 UTC (rev 6192)
@@ -32,9 +32,12 @@
#include "network/NetworkPrereqs.h"
#include "NetworkCallbackManager.h"
+// #include "util/MultiType.h"
namespace orxonox{
+ struct EmptyType{};
+
class _NetworkExport NetworkCallbackBase
{
public:
@@ -56,6 +59,22 @@
T* object_;
void (T::*function_) (void);
};
+
+ template <class T, class U>
+ class NetworkCallbackNotify: public NetworkCallbackBase
+ {
+ public:
+ NetworkCallbackNotify(T* object, void (T::*function) (const U&)) : object_(object), function_(function) {}
+ NetworkCallbackNotify() {}
+ virtual ~NetworkCallbackNotify() {}
+ virtual void call()
+ { (this->object_->*function_)( this->oldValue_ ); }
+ void setOldValue(const U& value){ this->oldValue_ = value; }
+ private:
+ T* object_;
+ U oldValue_;
+ void (T::*function_) (const U&);
+ };
}
Modified: code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.cc
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.cc 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.cc 2009-12-02 10:35:24 UTC (rev 6192)
@@ -389,5 +389,16 @@
this->objectMode_=mode;
}
+ template <> void Synchronisable::registerVariable( std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
+ {
+ SynchronisableVariableBase* sv;
+ if (bidirectional)
+ sv = new SynchronisableVariableBidirectional<std::string>(variable, mode, cb);
+ else
+ sv = new SynchronisableVariable<std::string>(variable, mode, cb);
+ syncList.push_back(sv);
+ stringList.push_back(sv);
+ }
+
}
Modified: code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.h
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.h 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/Synchronisable.h 2009-12-02 10:35:24 UTC (rev 6192)
@@ -137,6 +137,7 @@
protected:
Synchronisable(BaseObject* creator);
template <class T> void registerVariable(T& variable, uint8_t mode=0x1, NetworkCallbackBase *cb=0, bool bidirectional=false);
+
void setPriority(unsigned int freq){ objectFrequency_ = freq; }
@@ -165,22 +166,6 @@
static std::queue<uint32_t> deletedObjects_;
};
- // ================= Specialisation declarations
-
-// template <> _NetworkExport void Synchronisable::registerVariable( const std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( const ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( const Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( const Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( const Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( mbool& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( const Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
- template <> _NetworkExport void Synchronisable::registerVariable( Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);
-
template <class T> void Synchronisable::registerVariable(T& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
{
if (bidirectional)
@@ -195,6 +180,8 @@
this->dataSize_ += syncList.back()->getSize(state_);
}
}
+
+ template <> void Synchronisable::registerVariable( std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional);
}
Deleted: code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableSpecialisations.cc
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableSpecialisations.cc 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableSpecialisations.cc 2009-12-02 10:35:24 UTC (rev 6192)
@@ -1,111 +0,0 @@
-/*
- * ORXONOX - the hottest 3D action shooter ever to exist
- * > www.orxonox.net <
- *
- *
- * License notice:
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Author:
- * Dumeni Manatschal, (C) 2007
- * Oliver Scheuss, (C) 2007
- * Co-authors:
- * ...
- *
- */
-
-#include <string>
-#include "util/Math.h"
-#include "Synchronisable.h"
-#include "SynchronisableVariable.h"
-
-// ================ template spezialisation
-
-
-namespace orxonox{
-
- template <> void Synchronisable::registerVariable( std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional)
- {
- SynchronisableVariableBase* sv;
- if (bidirectional)
- sv = new SynchronisableVariableBidirectional<const std::string>(variable, mode, cb);
- else
- sv = new SynchronisableVariable<const std::string>(variable, mode, cb);
- syncList.push_back(sv);
- stringList.push_back(sv);
- }
-
- template <> void Synchronisable::registerVariable( const ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.r, mode, cb, bidirectional);
- registerVariable(variable.g, mode, cb, bidirectional);
- registerVariable(variable.b, mode, cb, bidirectional);
- registerVariable(variable.a, mode, cb, bidirectional);
- }
- template <> void Synchronisable::registerVariable( ColourValue& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- return Synchronisable::registerVariable( (const ColourValue&)variable, mode, cb, bidirectional);
- }
-
- template <> void Synchronisable::registerVariable( const Vector2& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.x, mode, cb, bidirectional);
- registerVariable(variable.y, mode, cb, bidirectional);
- }
-
- template <> void Synchronisable::registerVariable( const Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.x, mode, cb, bidirectional);
- registerVariable(variable.y, mode, cb, bidirectional);
- registerVariable(variable.z, mode, cb, bidirectional);
- }
- template <> void Synchronisable::registerVariable( Vector3& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable( (const Vector3&)variable, mode, cb, bidirectional);
- }
-
- template <> void Synchronisable::registerVariable( const Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.x, mode, cb, bidirectional);
- registerVariable(variable.y, mode, cb, bidirectional);
- registerVariable(variable.z, mode, cb, bidirectional);
- registerVariable(variable.w, mode, cb, bidirectional);
- }
- template <> void Synchronisable::registerVariable( Vector4& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable( (const Vector4&)variable, mode, cb, bidirectional);
- }
-
- template <> void Synchronisable::registerVariable( mbool& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.getMemory(), mode, cb, bidirectional);
- }
-
- template <> void Synchronisable::registerVariable( const Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable(variable.x, mode, cb, bidirectional);
- registerVariable(variable.y, mode, cb, bidirectional);
- registerVariable(variable.z, mode, cb, bidirectional);
- registerVariable(variable.w, mode, cb, bidirectional);
- }
- template <> void Synchronisable::registerVariable( Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional)
- {
- registerVariable( (const Quaternion&)variable, mode, cb, bidirectional);
- }
-
-
-
-} //namespace
Modified: code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableVariable.h
===================================================================
--- code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableVariable.h 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/network/synchronisable/SynchronisableVariable.h 2009-12-02 10:35:24 UTC (rev 6192)
@@ -80,10 +80,9 @@
virtual inline uint32_t getSize(uint8_t mode);
virtual inline void* getReference(){ return static_cast<void*>(const_cast<typename Loki::TypeTraits<T>::UnqualifiedType*>(&this->variable_)); }
protected:
-
- T& variable_;
- uint8_t mode_;
- NetworkCallbackBase *callback_;
+ T& variable_;
+ uint8_t mode_;
+ NetworkCallbackBase *callback_;
};
template <class T>
@@ -115,7 +114,7 @@
template <class T> SynchronisableVariable<T>::~SynchronisableVariable()
{
- if (this->callback_ != 0)
+ if (this->callback_)
{
NetworkCallbackManager::deleteCallback(this->callback_); //safe call for deletion
// this is neccessary because for example for a Vector3 all 3 components of the vector use the same callback
@@ -140,15 +139,17 @@
if ( mode == this->mode_ ) //don't do anything
return;
// check whether we need to consider a callback
- if ( this->callback_ != 0 )
+ if ( this->callback_ )
{
callback = forceCallback || !checkEquality( this->variable_, mem );
}
- // write the data
- loadAndIncrease( this->variable_, mem );
// now do a callback if neccessary
if ( callback )
+ {
NetworkCallbackManager::triggerCallback( this->callback_ );
+ }
+ // write the data
+ loadAndIncrease( this->variable_, mem );
}
template <class T> inline uint32_t SynchronisableVariable<T>::getSize(uint8_t mode)
@@ -214,7 +215,7 @@
{
mem += sizeof(varReference_);
memcpy(static_cast<void*>(const_cast<typename Loki::TypeTraits<T>::UnqualifiedType*>(&this->varBuffer_)), &this->variable_, sizeof(T));
- if ( this->callback_ != 0 )
+ if ( this->callback_ )
callback = true;
}
}
@@ -233,16 +234,18 @@
if ( checkEquality( this->variable_, mem ) == false )
{
// value changed so remark for callback
- if ( this->callback_ != 0 )
+ if ( this->callback_ )
callback = true;
}
}
}
- // now write the data
- loadAndIncrease(this->variable_, mem);
// now do a callback if neccessary
if ( callback )
+ {
NetworkCallbackManager::triggerCallback( this->callback_ );
+ }
+ // now write the data
+ loadAndIncrease(this->variable_, mem);
}
template <class T> inline uint32_t SynchronisableVariableBidirectional<T>::getSize(uint8_t mode)
Modified: code/branches/presentation2/src/libraries/util/Serialise.h
===================================================================
--- code/branches/presentation2/src/libraries/util/Serialise.h 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/libraries/util/Serialise.h 2009-12-02 10:35:24 UTC (rev 6192)
@@ -36,6 +36,7 @@
#include <cstring>
#include "util/Math.h"
+#include "util/mbool.h"
namespace orxonox{
@@ -373,7 +374,7 @@
{
double temp;
memcpy(&temp, mem, sizeof(uint64_t));
- *(long double*)( &variable ) = static_cast<const long double>(temp);
+ *(long double*)( &variable ) = static_cast<long double>(temp);
mem += returnSize( variable );
}
@@ -468,6 +469,169 @@
Ogre::Real* r = (Ogre::Real*)mem;
return variable==Degree(*r);
}
+
+ // =========== Vector2
+
+ template <> inline uint32_t returnSize( const Vector2& variable )
+ {
+ return returnSize( variable.x )+returnSize( variable.y );
+ }
+
+ template <> inline void saveAndIncrease( const Vector2& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( variable.x, mem );
+ saveAndIncrease( variable.y, mem );
+ }
+
+ template <> inline void loadAndIncrease( const Vector2& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( variable.x, mem );
+ loadAndIncrease( variable.y, mem );
+ }
+
+ template <> inline bool checkEquality( const Vector2& variable, uint8_t* mem )
+ {
+ return checkEquality(variable.x, mem) && checkEquality(variable.y, mem+returnSize(variable.x));
+ }
+
+ // =========== Vector3
+
+ template <> inline uint32_t returnSize( const Vector3& variable )
+ {
+ return returnSize( variable.x )+returnSize( variable.y )+returnSize( variable.z );
+ }
+
+ template <> inline void saveAndIncrease( const Vector3& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( variable.x, mem );
+ saveAndIncrease( variable.y, mem );
+ saveAndIncrease( variable.z, mem );
+ }
+
+ template <> inline void loadAndIncrease( const Vector3& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( variable.x, mem );
+ loadAndIncrease( variable.y, mem );
+ loadAndIncrease( variable.z, mem );
+ }
+
+ template <> inline bool checkEquality( const Vector3& variable, uint8_t* mem )
+ {
+ return checkEquality(variable.x, mem) && checkEquality(variable.y, mem+returnSize(variable.x)) &&
+ checkEquality(variable.z, mem+returnSize(variable.x)+returnSize(variable.y));
+ }
+
+ // =========== Vector4
+
+ template <> inline uint32_t returnSize( const Vector4& variable )
+ {
+ return returnSize( variable.w )+returnSize( variable.x )+returnSize( variable.y )+returnSize( variable.z );
+ }
+
+ template <> inline void saveAndIncrease( const Vector4& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( variable.w, mem );
+ saveAndIncrease( variable.x, mem );
+ saveAndIncrease( variable.y, mem );
+ saveAndIncrease( variable.z, mem );
+ }
+
+ template <> inline void loadAndIncrease( const Vector4& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( variable.w, mem );
+ loadAndIncrease( variable.x, mem );
+ loadAndIncrease( variable.y, mem );
+ loadAndIncrease( variable.z, mem );
+ }
+
+ template <> inline bool checkEquality( const Vector4& variable, uint8_t* mem )
+ {
+ return checkEquality(variable.w, mem) && checkEquality(variable.x, mem+returnSize(variable.w)) &&
+ checkEquality(variable.y, mem+returnSize(variable.w)+returnSize(variable.x)) &&
+ checkEquality(variable.y, mem+returnSize(variable.w)+returnSize(variable.x)+returnSize(variable.y));
+ }
+
+ // =========== Quaternion
+
+ template <> inline uint32_t returnSize( const Quaternion& variable )
+ {
+ return returnSize( variable.w )+returnSize( variable.x )+returnSize( variable.y )+returnSize( variable.z );
+ }
+
+ template <> inline void saveAndIncrease( const Quaternion& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( variable.w, mem );
+ saveAndIncrease( variable.x, mem );
+ saveAndIncrease( variable.y, mem );
+ saveAndIncrease( variable.z, mem );
+ }
+
+ template <> inline void loadAndIncrease( const Quaternion& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( variable.w, mem );
+ loadAndIncrease( variable.x, mem );
+ loadAndIncrease( variable.y, mem );
+ loadAndIncrease( variable.z, mem );
+ }
+
+ template <> inline bool checkEquality( const Quaternion& variable, uint8_t* mem )
+ {
+ return checkEquality(variable.w, mem) && checkEquality(variable.x, mem+returnSize(variable.w)) &&
+ checkEquality(variable.y, mem+returnSize(variable.w)+returnSize(variable.x)) &&
+ checkEquality(variable.y, mem+returnSize(variable.w)+returnSize(variable.x)+returnSize(variable.y));
+ }
+
+ // =========== ColourValue
+
+ template <> inline uint32_t returnSize( const ColourValue& variable )
+ {
+ return returnSize( variable.r )+returnSize( variable.g )+returnSize( variable.b )+returnSize( variable.a );
+ }
+
+ template <> inline void saveAndIncrease( const ColourValue& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( variable.r, mem );
+ saveAndIncrease( variable.g, mem );
+ saveAndIncrease( variable.b, mem );
+ saveAndIncrease( variable.a, mem );
+ }
+
+ template <> inline void loadAndIncrease( const ColourValue& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( variable.r, mem );
+ loadAndIncrease( variable.g, mem );
+ loadAndIncrease( variable.b, mem );
+ loadAndIncrease( variable.a, mem );
+ }
+
+ template <> inline bool checkEquality( const ColourValue& variable, uint8_t* mem )
+ {
+ return checkEquality(variable.r, mem) && checkEquality(variable.g, mem+returnSize(variable.r)) &&
+ checkEquality(variable.b, mem+returnSize(variable.r)+returnSize(variable.g)) &&
+ checkEquality(variable.a, mem+returnSize(variable.r)+returnSize(variable.g)+returnSize(variable.b));
+ }
+
+ // =========== mbool
+
+ template <> inline uint32_t returnSize( const mbool& variable )
+ {
+ return returnSize( (unsigned char&)((mbool&)variable).getMemory() );
+ }
+
+ template <> inline void saveAndIncrease( const mbool& variable, uint8_t*& mem )
+ {
+ saveAndIncrease( (unsigned char&)((mbool&)variable).getMemory(), mem );
+ }
+
+ template <> inline void loadAndIncrease( const mbool& variable, uint8_t*& mem )
+ {
+ loadAndIncrease( (unsigned char&)((mbool&)variable).getMemory(), mem );
+ }
+
+ template <> inline bool checkEquality( const mbool& variable, uint8_t* mem )
+ {
+ return checkEquality( (unsigned char&)((mbool&)variable).getMemory(), mem );
+ }
}
Modified: code/branches/presentation2/src/orxonox/infos/PlayerInfo.cc
===================================================================
--- code/branches/presentation2/src/orxonox/infos/PlayerInfo.cc 2009-12-02 08:06:19 UTC (rev 6191)
+++ code/branches/presentation2/src/orxonox/infos/PlayerInfo.cc 2009-12-02 10:35:24 UTC (rev 6192)
@@ -217,7 +217,8 @@
{
ControllableEntity* entity = this->controllableEntity_;
- if (!entity || !this->oldControllableEntity_)
+ assert( this->controllableEntity_ && this->oldControllableEntity_ );
+ if( !entity || !this->oldControllableEntity_ )
return;
this->controllableEntity_ = this->oldControllableEntity_;
More information about the Orxonox-commit
mailing list