FCDocument/FCDSceneNode.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 2005-2006 Feeling Software Inc.
00003     MIT License: http://www.opensource.org/licenses/mit-license.php
00004 */
00005 /*
00006     Based on the FS Import classes:
00007     Copyright (C) 2005-2006 Feeling Software Inc
00008     Copyright (C) 2005-2006 Autodesk Media Entertainment
00009     MIT License: http://www.opensource.org/licenses/mit-license.php
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     // Visibility parameter. Should be a boolean, but is animated
00063     float visibility; // Maya-specific
00064 
00065     // The number of entities that target this node
00066     uint32 targetCount;
00067 
00068     // Whether this node is a joint.
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_

Generated on Fri May 12 16:44:39 2006 for FCollada by  doxygen 1.4.6-NO