Fix T49078: Cycles tries to render volume from another render layer when camera is...
[blender.git] / intern / moto / intern / MT_CmMatrix4x4.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file moto/intern/MT_CmMatrix4x4.cpp
29  *  \ingroup moto
30  */
31
32
33 #include "MT_CmMatrix4x4.h"
34 #include "MT_Vector3.h"
35 #include "MT_Point3.h"
36
37
38 MT_CmMatrix4x4::MT_CmMatrix4x4()
39 {
40         Identity();
41 }
42
43
44
45 MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_Scalar value[4][4])
46 {
47         for (int i=0;i<4;i++)
48         {
49                 for (int j=0;j<4;j++)
50                         m_V[i][j] = value[i][j];
51         }
52 }
53
54
55
56 MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_Scalar value[16])
57 {
58         for (int i=0;i<16;i++)
59                 m_Vflat[i] = value[i];
60 }
61
62
63
64 MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_CmMatrix4x4& other)
65 {
66         SetMatrix(other);
67 }
68
69
70
71 MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_Point3& orig,
72                                                          const MT_Vector3& dir,
73                                                          const MT_Vector3 up)
74 {
75         MT_Vector3 z = -(dir.normalized());
76         MT_Vector3 x = (up.cross(z)).normalized();
77         MT_Vector3 y = (z.cross(x));
78         
79         m_V[0][0] = x.x();
80         m_V[0][1] = y.x();
81         m_V[0][2] = z.x();
82         m_V[0][3] = 0.0f;
83         
84         m_V[1][0] = x.y();
85         m_V[1][1] = y.y();
86         m_V[1][2] = z.y();
87         m_V[1][3] = 0.0f;
88         
89         m_V[2][0] = x.z();
90         m_V[2][1] = y.z();
91         m_V[2][2] = z.z();
92         m_V[2][3] = 0.0f;
93         
94         m_V[3][0] = orig.x();//0.0f;
95         m_V[3][1] = orig.y();//0.0f;
96         m_V[3][2] = orig.z();//0.0f;
97         m_V[3][3] = 1.0f;
98         
99         //Translate(-orig);
100 }
101
102
103
104 MT_Vector3 MT_CmMatrix4x4::GetRight() const
105 {
106         return MT_Vector3(m_V[0][0], m_V[0][1], m_V[0][2]);
107 }
108
109
110
111 MT_Vector3 MT_CmMatrix4x4::GetUp() const
112 {
113         return MT_Vector3(m_V[1][0], m_V[1][1], m_V[1][2]);
114 }
115
116
117
118 MT_Vector3 MT_CmMatrix4x4::GetDir() const
119 {
120         return MT_Vector3(m_V[2][0], m_V[2][1], m_V[2][2]);
121 }
122
123
124
125 MT_Point3 MT_CmMatrix4x4::GetPos() const
126 {
127         return MT_Point3(m_V[3][0], m_V[3][1], m_V[3][2]);
128 }
129
130
131
132 void MT_CmMatrix4x4::Identity()
133 {
134         for (int i=0; i<4; i++)
135         {
136                 for (int j=0; j<4; j++)
137                         m_V[i][j] = (i==j?1.0f:0.0f);
138         } 
139 }
140
141
142
143 void MT_CmMatrix4x4::SetMatrix(const MT_CmMatrix4x4& other)
144 {
145         for (int i=0; i<16; i++)
146                 m_Vflat[i] = other.m_Vflat[i];
147 }
148
149
150
151 MT_Scalar*      MT_CmMatrix4x4::getPointer()
152 {
153         return &m_V[0][0];
154 }
155
156
157
158 const MT_Scalar* MT_CmMatrix4x4::getPointer() const
159 {
160         return &m_V[0][0];
161 }       
162
163
164
165 void MT_CmMatrix4x4::setElem(int pos,MT_Scalar newvalue)
166 {
167         m_Vflat[pos] = newvalue;
168 }       
169
170 MT_CmMatrix4x4 MT_CmMatrix4x4::Perspective(
171         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         MT_CmMatrix4x4 mat;
180         
181         // Column 0
182         mat(0, 0) = -(2.0f*inNear)                      / (inRight-inLeft);
183         mat(1, 0) = 0.0f;
184         mat(2, 0) = 0.0f;
185         mat(3, 0) = 0.0f;
186
187         // Column 1
188         mat(0, 1) = 0.0f;
189         mat(1, 1) = (2.0f*inNear)                       / (inTop-inBottom);
190         mat(2, 1) = 0.0f;
191         mat(3, 1) = 0.0f;
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.0f;
198
199         // Column 3
200         mat(0, 3) = 0.0f;
201         mat(1, 3) = 0.0f;
202         mat(2, 3) = -(2.0f*inFar*inNear)                / (inFar-inNear);
203         mat(3, 3) = 0.0f;
204
205         return mat;
206 }