IK
[blender.git] / intern / iksolver / intern / IK_QJacobianSolver.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Original Author: Laurence
28  * Contributor(s): Brecht
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifndef NAN_INCLUDED_IK_QJacobianSolver_h
34
35 #define NAN_INCLUDED_IK_QJacobianSolver_h
36
37 /**
38  * @author Laurence Bourn
39  * @date 28/6/2001
40  */
41
42 #include <vector>
43 #include <list>
44
45 #include "MT_Vector3.h"
46 #include "MT_Transform.h"
47 #include "IK_QJacobian.h"
48 #include "IK_QSegment.h"
49 #include "IK_QTask.h"
50
51 class IK_QJacobianSolver
52 {
53 public:
54         IK_QJacobianSolver();
55         ~IK_QJacobianSolver() {};
56
57         // setup pole vector constraint
58         void SetPoleVectorConstraint(IK_QSegment *tip, MT_Vector3& goal,
59                 MT_Vector3& polegoal, float poleangle, bool getangle);
60         float GetPoleAngle() { return m_poleangle; };
61
62         // call setup once before solving, if it fails don't solve
63         bool Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks);
64
65         // returns true if converged, false if max number of iterations was used
66         bool Solve(
67                 IK_QSegment *root,
68                 std::list<IK_QTask*> tasks,
69                 const MT_Scalar tolerance,
70                 const int max_iterations
71         );
72
73 private:
74         void AddSegmentList(IK_QSegment *seg);
75         bool UpdateAngles(MT_Scalar& norm);
76         void ConstrainPoleVector(IK_QSegment *root, std::list<IK_QTask*>& tasks);
77
78         MT_Scalar ComputeScale();
79         void Scale(float scale, std::list<IK_QTask*>& tasks);
80
81 private:
82
83         IK_QJacobian m_jacobian;
84         IK_QJacobian m_jacobian_sub;
85
86         bool m_secondary_enabled;
87
88         std::vector<IK_QSegment*> m_segments;
89
90         MT_Transform m_rootmatrix;
91
92         bool m_poleconstraint;
93         bool m_getpoleangle;
94         MT_Vector3 m_goal;
95         MT_Vector3 m_polegoal;
96         float m_poleangle;
97         IK_QSegment *m_poletip;
98 };
99
100 #endif
101