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