00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00017 #ifndef _FCD_SCENE_NODE_
00018 #define _FCD_SCENE_NODE_
00019
00020 #include "FCDocument/FCDEntity.h"
00021 #include "FCDocument/FCDTransform.h"
00022 #include "FCDocument/FCDEntityInstance.h"
00024 class FCDocument;
00025 class FCDEntityInstance;
00026 class FCDSceneNode;
00027 class FCDTransform;
00028 class FCDExtra;
00029 class FCDTRotation;
00030 class FCDTTranslation;
00031 class FCDTScale;
00032 class FCDTSkew;
00033 class FCDTLookAt;
00034 class FCDTMatrix;
00035
00036 typedef vector<FCDSceneNode*> FCDSceneNodeList;
00037 typedef vector<FCDEntityInstance*> FCDEntityInstanceList;
00038 typedef vector<FCDTransform*> FCDTransformList;
00053 class FCOLLADA_EXPORT FCDSceneNode : public FCDEntity
00054 {
00055 private:
00056 DeclareObjectType;
00057 FCDSceneNodeList parents;
00058 FCDSceneNodeList children;
00059 FCDTransformList transforms;
00060 FCDEntityInstanceList instances;
00061
00062
00063 float visibility;
00064
00065
00066 uint32 targetCount;
00067
00068
00069 bool isJoint;
00070
00071 public:
00077 FCDSceneNode(FCDocument* document);
00078
00082 virtual ~FCDSceneNode();
00083
00086 inline virtual Type GetType() const { return SCENE_NODE; }
00087
00090 inline size_t GetParentCount() const { return parents.size(); };
00091
00096 inline FCDSceneNode* GetParent(size_t index = 0) { FUAssert(index == 0 || index < parents.size(), return NULL); return (!parents.empty()) ? parents.at(index) : NULL; }
00097 inline const FCDSceneNode* GetParent(size_t index = 0) const { FUAssert(index == 0 || index < parents.size(), return NULL); return (!parents.empty()) ? parents.at(index) : NULL; }
00101 inline size_t GetChildrenCount() const { return children.size(); };
00102
00107 inline FCDSceneNode* GetChild(size_t index) { FUAssert(index < children.size(), return NULL); return children.at(index); }
00108 inline const FCDSceneNode* GetChild(size_t index) const { FUAssert(index < children.size(), return NULL); return children.at(index); }
00112 inline FCDSceneNodeList& GetChildren() { return children; }
00113 inline const FCDSceneNodeList& GetChildren() const { return children; }
00117 FCDSceneNode* AddChildNode();
00118
00124 bool AddChildNode(FCDSceneNode* sceneNode);
00125
00128 inline size_t GetInstanceCount() const { return instances.size(); };
00129
00134 inline FCDEntityInstance* GetInstance(size_t index) { FUAssert(index < instances.size(), return NULL); return instances.at(index); }
00135 inline const FCDEntityInstance* GetInstance(size_t index) const { FUAssert(index < instances.size(), return NULL); return instances.at(index); }
00139 inline FCDEntityInstanceList& GetInstances() { return instances; }
00140 inline const FCDEntityInstanceList& GetInstances() const { return instances; }
00150 FCDEntityInstance* AddInstance(FCDEntity* entity);
00151
00154 void ReleaseInstance(FCDEntityInstance* instance);
00155
00158 inline size_t GetTransformCount() const { return transforms.size(); };
00159
00164 inline FCDTransform* GetTransform(size_t index) { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); }
00165 inline const FCDTransform* GetTransform(size_t index) const { FUAssert(index < transforms.size(), return NULL); return transforms.at(index); }
00169 inline FCDTransformList& GetTransforms() { return transforms; }
00170 inline const FCDTransformList& GetTransforms() const { return transforms; }
00181 FCDTransform* AddTransform(FCDTransform::Type type, size_t index = (size_t)-1);
00182
00185 void ReleaseTransform(FCDTransform* transform);
00186
00187
00194 virtual FCDEntity* FindDaeId(const string& daeId);
00195
00201 inline float& GetVisibility() { return visibility; }
00202 inline const float& GetVisibility() const { return visibility; }
00208 inline void SetVisibility(bool isVisible) { visibility = isVisible; }
00209
00212 inline bool IsTarget() const { return targetCount > 0; }
00213
00217 bool IsJoint() const { return isJoint; }
00218
00222 void SetJointFlag(bool _isJoint) { isJoint = _isJoint; }
00223
00227 FMMatrix44 ToMatrix() const;
00228
00233 void GenerateSampledMatrixAnimation(FloatList& keys, FMMatrix44List& values);
00234
00237 inline void IncrementTargetCount() { ++targetCount; }
00238
00241 inline void DecrementTargetCount() { if (targetCount > 0) --targetCount; }
00242
00247 virtual FUStatus LoadFromXML(xmlNode* sceneNode);
00248
00252 virtual xmlNode* WriteToXML(xmlNode* parentNode) const;
00253
00254 private:
00255 FUStatus LoadFromExtra();
00256 void BindMaterial(xmlNode* node);
00257 void WriteToNodeXML(xmlNode* node, bool isVisualScene) const;
00258 };
00259
00260 #endif // _FCD_SCENE_NODE_