Fix too much memory usage for Cycles attribute map.
[blender.git] / intern / iksolver / intern / IK_QJacobian.h
1
2 /*
3  * ***** BEGIN GPL 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.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Original Author: Laurence
25  * Contributor(s): Brecht
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 /** \file iksolver/intern/IK_QJacobian.h
31  *  \ingroup iksolver
32  */
33
34 #pragma once
35
36 #include "IK_Math.h"
37
38 class IK_QJacobian
39 {
40 public:
41         IK_QJacobian();
42         ~IK_QJacobian();
43
44         // Call once to initialize
45         void ArmMatrices(int dof, int task_size);
46         void SetDoFWeight(int dof, double weight);
47
48         // Iteratively called
49         void SetBetas(int id, int size, const Vector3d& v);
50         void SetDerivatives(int id, int dof_id, const Vector3d& v, double norm_weight);
51
52         void Invert();
53
54         double AngleUpdate(int dof_id) const;
55         double AngleUpdateNorm() const;
56
57         // DoF locking for inner clamping loop
58         void Lock(int dof_id, double delta);
59
60         // Secondary task
61         bool ComputeNullProjection();
62
63         void Restrict(VectorXd& d_theta, MatrixXd& nullspace);
64         void SubTask(IK_QJacobian& jacobian);
65
66 private:
67         
68         void InvertSDLS();
69         void InvertDLS();
70
71         int m_dof, m_task_size;
72         bool m_transpose;
73
74         // the jacobian matrix and it's null space projector
75         MatrixXd m_jacobian, m_jacobian_tmp;
76         MatrixXd m_nullspace;
77
78         /// the vector of intermediate betas
79         VectorXd m_beta;
80
81         /// the vector of computed angle changes
82         VectorXd m_d_theta;
83         VectorXd m_d_norm_weight;
84
85         /// space required for SVD computation
86         VectorXd m_svd_w;
87         MatrixXd m_svd_v;
88         MatrixXd m_svd_u;
89
90         VectorXd m_svd_u_beta;
91
92         // space required for SDLS
93
94         bool m_sdls;
95         VectorXd m_norm;
96         VectorXd m_d_theta_tmp;
97         double m_min_damp;
98
99         // null space task vector
100         VectorXd m_alpha;
101
102         // dof weighting
103         VectorXd m_weight;
104         VectorXd m_weight_sqrt;
105 };
106