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