00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright (c) 2000-2012 Torus Knot Software Ltd 00008 00009 Permission is hereby granted, free of charge, to any person obtaining a copy 00010 of this software and associated documentation files (the "Software"), to deal 00011 in the Software without restriction, including without limitation the rights 00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00013 copies of the Software, and to permit persons to whom the Software is 00014 furnished to do so, subject to the following conditions: 00015 00016 The above copyright notice and this permission notice shall be included in 00017 all copies or substantial portions of the Software. 00018 00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00025 THE SOFTWARE. 00026 ----------------------------------------------------------------------------- 00027 */ 00028 #ifndef _Node_H__ 00029 #define _Node_H__ 00030 00031 #include "OgrePrerequisites.h" 00032 00033 #include "OgreCommon.h" 00034 #include "OgreMatrix3.h" 00035 #include "OgreMatrix4.h" 00036 #include "OgreQuaternion.h" 00037 #include "OgreString.h" 00038 #include "OgreRenderable.h" 00039 #include "OgreIteratorWrappers.h" 00040 #include "OgreMesh.h" 00041 #include "OgreUserObjectBindings.h" 00042 00043 namespace Ogre { 00044 00045 00062 class _OgreExport Node : public NodeAlloc 00063 { 00064 public: 00067 enum TransformSpace 00068 { 00070 TS_LOCAL, 00072 TS_PARENT, 00074 TS_WORLD 00075 }; 00076 typedef HashMap<String, Node*> ChildNodeMap; 00077 typedef MapIterator<ChildNodeMap> ChildNodeIterator; 00078 typedef ConstMapIterator<ChildNodeMap> ConstChildNodeIterator; 00079 00082 class _OgreExport Listener 00083 { 00084 public: 00085 Listener() {} 00086 virtual ~Listener() {} 00094 virtual void nodeUpdated(const Node*) {} 00096 virtual void nodeDestroyed(const Node*) {} 00098 virtual void nodeAttached(const Node*) {} 00100 virtual void nodeDetached(const Node*) {} 00101 }; 00102 00104 class DebugRenderable : public Renderable, public NodeAlloc 00105 { 00106 protected: 00107 Node* mParent; 00108 MeshPtr mMeshPtr; 00109 MaterialPtr mMat; 00110 Real mScaling; 00111 public: 00112 DebugRenderable(Node* parent); 00113 ~DebugRenderable(); 00114 const MaterialPtr& getMaterial(void) const; 00115 void getRenderOperation(RenderOperation& op); 00116 void getWorldTransforms(Matrix4* xform) const; 00117 Real getSquaredViewDepth(const Camera* cam) const; 00118 const LightList& getLights(void) const; 00119 void setScaling(Real s) { mScaling = s; } 00120 00121 }; 00122 00123 protected: 00125 Node* mParent; 00127 ChildNodeMap mChildren; 00128 00129 typedef set<Node*>::type ChildUpdateSet; 00131 mutable ChildUpdateSet mChildrenToUpdate; 00133 mutable bool mNeedParentUpdate; 00135 mutable bool mNeedChildUpdate; 00137 mutable bool mParentNotified ; 00139 mutable bool mQueuedForUpdate; 00140 00142 String mName; 00143 00145 static NameGenerator msNameGenerator; 00146 00148 Quaternion mOrientation; 00149 00151 Vector3 mPosition; 00152 00154 Vector3 mScale; 00155 00157 bool mInheritOrientation; 00158 00160 bool mInheritScale; 00161 00163 virtual void setParent(Node* parent); 00164 00172 mutable Quaternion mDerivedOrientation; 00173 00181 mutable Vector3 mDerivedPosition; 00182 00190 mutable Vector3 mDerivedScale; 00191 00198 virtual void _updateFromParent(void) const; 00199 00206 virtual void updateFromParentImpl(void) const; 00207 00208 00210 virtual Node* createChildImpl(void) = 0; 00211 00213 virtual Node* createChildImpl(const String& name) = 0; 00214 00216 Vector3 mInitialPosition; 00218 Quaternion mInitialOrientation; 00220 Vector3 mInitialScale; 00221 00223 mutable Matrix4 mCachedTransform; 00224 mutable bool mCachedTransformOutOfDate; 00225 00227 Listener* mListener; 00228 00229 typedef vector<Node*>::type QueuedUpdates; 00230 static QueuedUpdates msQueuedUpdates; 00231 00232 DebugRenderable* mDebug; 00233 00235 UserObjectBindings mUserObjectBindings; 00236 00237 public: 00242 Node(); 00247 Node(const String& name); 00248 00249 virtual ~Node(); 00250 00252 const String& getName(void) const; 00253 00256 virtual Node* getParent(void) const; 00257 00260 virtual const Quaternion & getOrientation() const; 00261 00275 virtual void setOrientation( const Quaternion& q ); 00276 00290 virtual void setOrientation( Real w, Real x, Real y, Real z); 00291 00305 virtual void resetOrientation(void); 00306 00309 virtual void setPosition(const Vector3& pos); 00310 00313 virtual void setPosition(Real x, Real y, Real z); 00314 00317 virtual const Vector3 & getPosition(void) const; 00318 00331 virtual void setScale(const Vector3& scale); 00332 00345 virtual void setScale(Real x, Real y, Real z); 00346 00349 virtual const Vector3 & getScale(void) const; 00350 00364 virtual void setInheritOrientation(bool inherit); 00365 00379 virtual bool getInheritOrientation(void) const; 00380 00393 virtual void setInheritScale(bool inherit); 00394 00399 virtual bool getInheritScale(void) const; 00400 00410 virtual void scale(const Vector3& scale); 00411 00421 virtual void scale(Real x, Real y, Real z); 00422 00432 virtual void translate(const Vector3& d, TransformSpace relativeTo = TS_PARENT); 00446 virtual void translate(Real x, Real y, Real z, TransformSpace relativeTo = TS_PARENT); 00466 virtual void translate(const Matrix3& axes, const Vector3& move, TransformSpace relativeTo = TS_PARENT); 00486 virtual void translate(const Matrix3& axes, Real x, Real y, Real z, TransformSpace relativeTo = TS_PARENT); 00487 00490 virtual void roll(const Radian& angle, TransformSpace relativeTo = TS_LOCAL); 00491 00494 virtual void pitch(const Radian& angle, TransformSpace relativeTo = TS_LOCAL); 00495 00498 virtual void yaw(const Radian& angle, TransformSpace relativeTo = TS_LOCAL); 00499 00502 virtual void rotate(const Vector3& axis, const Radian& angle, TransformSpace relativeTo = TS_LOCAL); 00503 00506 virtual void rotate(const Quaternion& q, TransformSpace relativeTo = TS_LOCAL); 00507 00510 virtual Matrix3 getLocalAxes(void) const; 00511 00518 virtual Node* createChild( 00519 const Vector3& translate = Vector3::ZERO, 00520 const Quaternion& rotate = Quaternion::IDENTITY ); 00521 00531 virtual Node* createChild(const String& name, const Vector3& translate = Vector3::ZERO, const Quaternion& rotate = Quaternion::IDENTITY); 00532 00537 virtual void addChild(Node* child); 00538 00541 virtual unsigned short numChildren(void) const; 00542 00547 virtual Node* getChild(unsigned short index) const; 00548 00551 virtual Node* getChild(const String& name) const; 00552 00563 virtual ChildNodeIterator getChildIterator(void); 00564 00575 virtual ConstChildNodeIterator getChildIterator(void) const; 00576 00584 virtual Node* removeChild(unsigned short index); 00592 virtual Node* removeChild(Node* child); 00593 00599 virtual Node* removeChild(const String& name); 00603 virtual void removeAllChildren(void); 00604 00609 virtual void _setDerivedPosition(const Vector3& pos); 00610 00616 virtual void _setDerivedOrientation(const Quaternion& q); 00617 00620 virtual const Quaternion & _getDerivedOrientation(void) const; 00621 00624 virtual const Vector3 & _getDerivedPosition(void) const; 00625 00628 virtual const Vector3 & _getDerivedScale(void) const; 00629 00639 virtual const Matrix4& _getFullTransform(void) const; 00640 00653 virtual void _update(bool updateChildren, bool parentHasChanged); 00654 00660 virtual void setListener(Listener* listener) { mListener = listener; } 00661 00664 virtual Listener* getListener(void) const { return mListener; } 00665 00666 00677 virtual void setInitialState(void); 00678 00680 virtual void resetToInitialState(void); 00681 00686 virtual const Vector3& getInitialPosition(void) const; 00687 00689 virtual Vector3 convertWorldToLocalPosition( const Vector3 &worldPos ); 00690 00693 virtual Vector3 convertLocalToWorldPosition( const Vector3 &localPos ); 00694 00696 virtual Quaternion convertWorldToLocalOrientation( const Quaternion &worldOrientation ); 00697 00700 virtual Quaternion convertLocalToWorldOrientation( const Quaternion &localOrientation ); 00701 00703 virtual const Quaternion& getInitialOrientation(void) const; 00704 00706 virtual const Vector3& getInitialScale(void) const; 00707 00709 virtual Real getSquaredViewDepth(const Camera* cam) const; 00710 00718 virtual void needUpdate(bool forceParentUpdate = false); 00723 virtual void requestUpdate(Node* child, bool forceParentUpdate = false); 00725 virtual void cancelUpdate(Node* child); 00726 00728 virtual DebugRenderable* getDebugRenderable(Real scaling); 00729 00737 static void queueNeedUpdate(Node* n); 00739 static void processQueuedUpdates(void); 00740 00741 00749 virtual void setUserAny(const Any& anything) { getUserObjectBindings().setUserAny(anything); } 00750 00754 virtual const Any& getUserAny(void) const { return getUserObjectBindings().getUserAny(); } 00755 00760 UserObjectBindings& getUserObjectBindings() { return mUserObjectBindings; } 00761 00766 const UserObjectBindings& getUserObjectBindings() const { return mUserObjectBindings; } 00767 00768 }; 00772 } //namespace 00773 00774 #endif
Copyright © 2012 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:25 2012