RNA/UI - Reset Settings to Default Values
[blender.git] / source / kernel / gen_system / GEN_Matrix4x4.cpp
1 /**
2  * $Id$
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "GEN_Matrix4x4.h"
30
31 #ifdef HAVE_CONFIG_H
32 #include <config.h>
33 #endif
34
35 GEN_Matrix4x4::GEN_Matrix4x4()
36 {
37         Identity();
38 }
39
40
41
42 GEN_Matrix4x4::GEN_Matrix4x4(const float value[4][4])
43 {
44         for (int i=0;i<4;i++)
45         {
46                 for (int j=0;j<4;j++)
47                         m_V[i][j] = value[i][j];
48         }
49 }
50
51
52
53 GEN_Matrix4x4::GEN_Matrix4x4(const double value[16])
54 {
55         for (int i=0;i<16;i++)
56                 m_Vflat[i] = value[i];
57 }
58
59
60
61 GEN_Matrix4x4::GEN_Matrix4x4(const GEN_Matrix4x4& other)
62 {
63         SetMatrix(other);
64 }
65
66
67
68 GEN_Matrix4x4::GEN_Matrix4x4(const MT_Point3& orig,
69                                                          const MT_Vector3& dir,
70                                                          const MT_Vector3 up)
71 {
72         MT_Vector3 z = -(dir.normalized());
73         MT_Vector3 x = (up.cross(z)).normalized();
74         MT_Vector3 y = (z.cross(x));
75         
76         m_V[0][0] = x.x();
77         m_V[0][1] = y.x();
78         m_V[0][2] = z.x();
79         m_V[0][3] = 0.0f;
80         
81         m_V[1][0] = x.y();
82         m_V[1][1] = y.y();
83         m_V[1][2] = z.y();
84         m_V[1][3] = 0.0f;
85         
86         m_V[2][0] = x.z();
87         m_V[2][1] = y.z();
88         m_V[2][2] = z.z();
89         m_V[2][3] = 0.0f;
90         
91         m_V[3][0] = orig.x();//0.0f;
92         m_V[3][1] = orig.y();//0.0f;
93         m_V[3][2] = orig.z();//0.0f;
94         m_V[3][3] = 1.0f;
95         
96         //Translate(-orig);
97 }
98
99
100
101 MT_Vector3 GEN_Matrix4x4::GetRight() const
102 {
103         return MT_Vector3(m_V[0][0], m_V[0][1], m_V[0][2]);
104 }
105
106
107
108 MT_Vector3 GEN_Matrix4x4::GetUp() const
109 {
110         return MT_Vector3(m_V[1][0], m_V[1][1], m_V[1][2]);
111 }
112
113
114
115 MT_Vector3 GEN_Matrix4x4::GetDir() const
116 {
117         return MT_Vector3(m_V[2][0], m_V[2][1], m_V[2][2]);
118 }
119
120
121
122 MT_Point3 GEN_Matrix4x4::GetPos() const
123 {
124         return MT_Point3(m_V[3][0], m_V[3][1], m_V[3][2]);
125 }
126
127
128
129 void GEN_Matrix4x4::Identity()
130 {
131         for (int i=0; i<4; i++)
132         {
133                 for (int j=0; j<4; j++)
134                         m_V[i][j] = (i==j?1.0f:0.0f);
135         } 
136 }
137
138
139
140 void GEN_Matrix4x4::SetMatrix(const GEN_Matrix4x4& other)
141 {
142         for (int i=0; i<16; i++)
143                 m_Vflat[i] = other.m_Vflat[i];
144 }
145
146
147
148 double* GEN_Matrix4x4::getPointer()
149 {
150         return &m_V[0][0];
151 }
152
153
154
155 const double* GEN_Matrix4x4::getPointer() const
156 {
157         return &m_V[0][0];
158 }       
159
160
161
162 void GEN_Matrix4x4::setElem(int pos,double newvalue)
163 {
164         m_Vflat[pos] = newvalue;
165 }       
166
167
168
169
170
171 GEN_Matrix4x4 GEN_Matrix4x4::Perspective(MT_Scalar inLeft,
172 MT_Scalar inRight,
173 MT_Scalar inBottom,
174 MT_Scalar inTop,
175 MT_Scalar inNear,
176 MT_Scalar inFar)
177 {
178
179         GEN_Matrix4x4 mat;
180         
181         // Column 0
182         mat(0, 0) = -(2.0*inNear)                       / (inRight-inLeft);
183         mat(1, 0) = 0;
184         mat(2, 0) = 0;
185         mat(3, 0) = 0;
186
187         // Column 1
188         mat(0, 1) = 0;
189         mat(1, 1) = (2.0*inNear)                        / (inTop-inBottom);
190         mat(2, 1) = 0;
191         mat(3, 1) = 0;
192
193         // Column 2
194         mat(0, 2) =  (inRight+inLeft)           / (inRight-inLeft);
195         mat(1, 2) =  (inTop+inBottom)           / (inTop-inBottom);
196         mat(2, 2) = -(inFar+inNear)                     / (inFar-inNear);
197         mat(3, 2) = -1;
198
199         // Column 3
200         mat(0, 3) = 0;
201         mat(1, 3) = 0;
202         mat(2, 3) = -(2.0*inFar*inNear)         / (inFar-inNear);
203         mat(3, 3) = 0;
204
205         return mat;
206 }