00001 /* 00002 Copyright (C) 2005-2007 Feeling Software Inc. 00003 Portions of the code are: 00004 Copyright (C) 2005-2007 Sony Computer Entertainment America 00005 00006 MIT License: http://www.opensource.org/licenses/mit-license.php 00007 */ 00008 00014 #ifndef _FCD_CONTROLLER_INSTANCE_H_ 00015 #define _FCD_CONTROLLER_INSTANCE_H_ 00016 00017 #ifndef _FCD_GEOMETRY_ENTITY_H_ 00018 #include "FCDocument/FCDGeometryInstance.h" 00019 #endif // _FCD_GEOMETRY_ENTITY_H_ 00020 00021 #ifndef _FU_URI_H_ 00022 #include "FUtils/FUUri.h" 00023 #endif // _FU_URI_H_ 00024 00025 class FCDSkinController; 00026 class FCDSceneNode; 00027 typedef fm::pvector<FCDSceneNode> FCDSceneNodeList; 00028 typedef FUTrackedList<FCDSceneNode> FCDSceneNodeTrackList; 00047 class FCOLLADA_EXPORT FCDControllerInstance : public FCDGeometryInstance 00048 { 00049 private: 00050 DeclareObjectType(FCDGeometryInstance); 00051 00052 friend class FCDEntityInstanceFactory; 00053 00054 FUUriList skeletonRoots; 00055 DeclareParameterTrackList(FCDSceneNode, joints, FC("Skeleton Joints")); 00056 00057 protected: 00064 FCDControllerInstance(FCDocument* document, FCDSceneNode* parent, FCDEntity::Type entityType = FCDEntity::CONTROLLER); 00065 00066 public: 00068 virtual ~FCDControllerInstance(); 00069 00074 virtual Type GetType() const { return CONTROLLER; } 00075 00081 virtual FCDEntityInstance* Clone(FCDEntityInstance* clone = NULL) const; 00082 00085 const FUUriList& GetSkeletonRoots() const { return skeletonRoots; } 00086 FUUriList& GetSkeletonRoots() { return skeletonRoots; } 00087 00092 void FindSkeletonNodes(FCDSceneNodeList& skeletonNodes) const; 00093 00095 void CalculateRootIds(); 00096 00101 size_t GetJointCount() const { return joints.size(); } 00102 00104 void ResetJoints() { joints.clear(); skeletonRoots.clear(); } 00105 00109 inline FCDSceneNode* GetJoint(size_t index) { FUAssert(index < GetJointCount(), return NULL); return joints.at(index); } 00110 inline const FCDSceneNode* GetJoint(size_t index) const { FUAssert(index < GetJointCount(), return NULL); return joints.at(index); } 00114 bool AddJoint(FCDSceneNode* j); 00115 00119 bool FindJoint(const FCDSceneNode* joint) const; 00124 size_t FindJointIndex(const FCDSceneNode* joint) const; 00125 00128 inline void RemoveJoint(size_t index) { joints.erase(index); } 00129 00132 inline void RemoveJoint(FCDSceneNode* joint) { joints.erase(joint); } 00133 00134 private: 00135 void AppendJoint(FCDSceneNode* j); 00136 00137 const FCDSkinController* FindSkin(const FCDEntity* entity) const; 00138 inline FCDSkinController* FindSkin(FCDEntity* entity) { return const_cast<FCDSkinController*>(const_cast<const FCDControllerInstance*>(this)->FindSkin(entity)); } 00139 }; 00140 00141 #endif // _FCD_CONTROLLER_INSTANCE_H_ 00142