00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __SCENENODE__H__
00013 #define __SCENENODE__H__
00014
00015 #include <list>
00016 #include <wx/string.h>
00017 #include "rwlock.h"
00018 #include "flexilog.h"
00019 #include "common.h"
00020 #include "moddefs.h"
00021
00022
00023 namespace VRUT
00024 {
00026 class SceneNode : public ReadWriteMutex
00027 {
00028 public:
00029 typedef std::list<NODE_ID> NodeIDList;
00030
00031 enum SCENENODE_TYPE
00032 {
00033 ASSEMBLY = 0,
00034 ROOT = 1,
00035 CAMERA = 2,
00036 GEOMETRY = 4,
00037 LIGHT = 8
00038 };
00039
00040 private:
00042 wxString uid;
00044 wxString name;
00046 NODE_ID id;
00048 SCENENODE_TYPE type;
00049
00051 MATRIX localTransMatrix;
00053 MATRIX worldTransMatrix;
00055 bool valid;
00056
00058 bool active;
00059
00061 NodeIDList children;
00063 NODE_ID parent;
00064
00065 public:
00067 SceneNode(const wxString & _uid, const wxString & _name, SCENENODE_TYPE _type)
00068 : uid(CloneWxString(_uid)), name(CloneWxString(_name)), type(_type)
00069 {
00070 wxASSERT_MSG(IsOk(), wxT("<SceneNode>Failed to create mutex"));
00071 active = true;
00072 valid = false;
00073 id = parent = NODE_ID_NONE;
00074 }
00075
00077 SceneNode(const SceneNode & n)
00078 : ReadWriteMutex(), uid(CloneWxString(n.uid)), name(CloneWxString(n.name)), id(n.id), type(n.type),
00079 localTransMatrix(n.localTransMatrix), worldTransMatrix(n.worldTransMatrix),
00080 valid(n.valid), active(n.active), parent(n.parent)
00081 {
00082 children.assign(n.children.begin(), n.children.end());
00083 }
00084
00086 virtual ~SceneNode()
00087 {
00088 }
00089
00091 const wxString & GetUid() const
00092 {
00093 return uid;
00094 }
00095
00097 const wxString & GetName() const
00098 {
00099 return name;
00100 }
00101
00103 NODE_ID GetID() const
00104 {
00105 return id;
00106 }
00107
00109 const MATRIX * GetLocalTransMatrix() const
00110 {
00111 return &localTransMatrix;
00112 }
00113
00116 const MATRIX * GetWorldTransMatrix() const
00117 {
00118 if (!valid)
00119 LOGWARNING(wxT("<SceneNode>Getting invalid world transformation matrix - update first"));
00120 return &worldTransMatrix;
00121 }
00122
00124 const NodeIDList * GetChildren() const
00125 {
00126 return &children;
00127 }
00128
00130 NODE_ID GetParent() const
00131 {
00132 return parent;
00133 }
00134
00136 bool IsValid() const
00137 {
00138 return valid;
00139 }
00140
00142 bool IsActive() const
00143 {
00144 return active;
00145 }
00146
00148 void SetActive(const bool _active)
00149 {
00150 active=_active;
00151 }
00152
00154 SCENENODE_TYPE GetType() const
00155 {
00156 return type;
00157 }
00158
00160 bool IsOfType(SCENENODE_TYPE _type) const
00161 {
00162 return ( type == _type );
00163 }
00164
00166 virtual wxString ToString() const
00167 {
00168 return wxString::Format(wxT("ID: %i\nName: %s\nType: %i\nLocal:\n%sWorld:\n%s"),
00169 unsigned(GetID()),
00170 GetName().c_str(),
00171 type,
00172 GetLocalTransMatrix()->ToString().c_str(),
00173 ( IsValid() ? GetWorldTransMatrix()->ToString().c_str() : wxT("invalid\n") ));
00174 }
00176 virtual SceneNode * Clone() const
00177 {
00178 return new SceneNode(*this);
00179 }
00180
00181 friend class Scene;
00182 };
00183 };
00184
00185 #endif