1 #pragma once 2 3 #ifndef IKSKELETON_H 4 #define IKSKELETON_H 5 6 #include "tgeometry.h" 7 #include "iknode.h" 8 9 #undef DVAPI 10 #undef DVVAR 11 #ifdef TOONZLIB_EXPORTS 12 #define DVAPI DV_EXPORT_API 13 #define DVVAR DV_EXPORT_VAR 14 #else 15 #define DVAPI DV_IMPORT_API 16 #define DVVAR DV_IMPORT_VAR 17 #endif 18 19 class DVAPI IKSkeleton { 20 std::vector<IKNode *> m_nodes; 21 int numEffector; 22 int numJoint; 23 24 public: IKSkeleton()25 IKSkeleton() { 26 numEffector = 0; 27 numJoint = 0; 28 } ~IKSkeleton()29 ~IKSkeleton() { clear(); } 30 31 void compute(); clear()32 void clear() { 33 std::vector<IKNode *>::iterator it; 34 for (it = m_nodes.begin(); it != m_nodes.end(); ++it) delete *it; 35 m_nodes.clear(); 36 numEffector = 0; 37 numJoint = 0; 38 } addNode(IKNode * node)39 void addNode(IKNode *node) { m_nodes.push_back(node); } getNodeCount()40 int getNodeCount() const { return (int)m_nodes.size(); } getNode(int index)41 IKNode *getNode(int index) const { 42 assert(0 <= index && index < getNodeCount()); 43 return m_nodes[index]; 44 } getRoot()45 IKNode *getRoot() const { return m_nodes[0]; } 46 getNumNode()47 int getNumNode() const { return (numJoint + numEffector); } getNumEffector()48 int getNumEffector() const { return numEffector; } getNumJoint()49 int getNumJoint() const { return numJoint; } 50 setRoot(int nodeIndex)51 void setRoot(int nodeIndex) { 52 m_nodes[nodeIndex]->setR(m_nodes[nodeIndex]->getPos()); 53 } setNode(int nodeIndex,const TPointD & pos,IKNode::Purpose purpose)54 void setNode(int nodeIndex, const TPointD &pos, IKNode::Purpose purpose) { 55 assert(0 <= nodeIndex && nodeIndex < getNodeCount()); 56 m_nodes[nodeIndex]->setPos(pos); 57 m_nodes[nodeIndex]->setS(pos); 58 m_nodes[nodeIndex]->setPurpose(purpose); 59 m_nodes[nodeIndex]->unFreeze(); 60 m_nodes[nodeIndex]->setIndex(nodeIndex); 61 } 62 void setPurpose(int nodeIndex, IKNode::Purpose purpose); setParent(int nodeIndex,int parentIndex)63 void setParent(int nodeIndex, int parentIndex) { 64 assert(0 <= nodeIndex && nodeIndex < getNodeCount()); 65 assert(0 <= parentIndex && parentIndex < getNodeCount()); 66 m_nodes[nodeIndex]->setParent(m_nodes[parentIndex]); 67 // Setto la posizione relativa 68 m_nodes[nodeIndex]->setR(m_nodes[nodeIndex]->getPos() - 69 m_nodes[parentIndex]->getPos()); 70 } 71 getParent(const IKNode * node)72 IKNode *getParent(const IKNode *node) { 73 // assert(0<=nodeIndex && nodeIndex<getNodeCount()); 74 return node->getParent(); 75 } 76 77 private: 78 void computeSkeleton(IKNode *); 79 }; 80 81 #endif // IKSKELETON_H 82