001    /*
002    *
003    
004    Licensed under the Apache License, Version 2.0 (the "License");
005    you may not use this file except in compliance with the License.
006    You may obtain a copy of the License at
007    
008       http://www.apache.org/licenses/LICENSE-2.0
009    
010    Unless required by applicable law or agreed to in writing, software
011    distributed under the License is distributed on an "AS IS" BASIS,
012    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013    See the License for the specific language governing permissions and
014    limitations under the License.
015    */
016    
017    package railo.runtime.img.vecmath;
018    
019    /**
020     * Vector math package, converted to look similar to javax.vecmath.
021     */
022    public class Matrix4f {
023            public float m00, m01, m02, m03;
024            public float m10, m11, m12, m13;
025            public float m20, m21, m22, m23;
026            public float m30, m31, m32, m33;
027    
028            public Matrix4f() {
029                    setIdentity();
030            }
031    
032            public Matrix4f( Matrix4f m ) {
033                    set( m );
034            }
035    
036            public Matrix4f(float[] m) {
037                    set( m );
038            }
039    
040            public void set( Matrix4f m) {
041                    m00 = m.m00;
042                    m01 = m.m01;
043                    m02 = m.m02;
044                    m03 = m.m03;
045                    m10 = m.m10;
046                    m11 = m.m11;
047                    m12 = m.m12;
048                    m13 = m.m13;
049                    m20 = m.m20;
050                    m21 = m.m21;
051                    m22 = m.m22;
052                    m23 = m.m23;
053                    m30 = m.m30;
054                    m31 = m.m31;
055                    m32 = m.m32;
056                    m33 = m.m33;
057            }
058    
059            public void set(float[] m) {
060                    m00 = m[0];
061                    m01 = m[1];
062                    m02 = m[2];
063                    m03 = m[3];
064                    m10 = m[4];
065                    m11 = m[5];
066                    m12 = m[6];
067                    m13 = m[7];
068                    m20 = m[8];
069                    m21 = m[9];
070                    m22 = m[10];
071                    m23 = m[11];
072                    m30 = m[12];
073                    m31 = m[13];
074                    m32 = m[14];
075                    m33 = m[15];
076            }
077    
078            public void get( Matrix4f m) {
079                    m.m00 = m00;
080                    m.m01 = m01;
081                    m.m02 = m02;
082                    m.m03 = m03;
083                    m.m10 = m10;
084                    m.m11 = m11;
085                    m.m12 = m12;
086                    m.m13 = m13;
087                    m.m20 = m20;
088                    m.m21 = m21;
089                    m.m22 = m22;
090                    m.m23 = m23;
091                    m.m30 = m30;
092                    m.m31 = m31;
093                    m.m32 = m32;
094                    m.m33 = m33;
095            }
096    
097            public void get(float[] m) {
098                    m[0] = m00;
099                    m[1] = m01;
100                    m[2] = m02;
101                    m[3] = m03;
102                    m[4] = m10;
103                    m[5] = m11;
104                    m[6] = m12;
105                    m[7] = m13;
106                    m[8] = m20;
107                    m[9] = m21;
108                    m[10] = m22;
109                    m[11] = m23;
110                    m[12] = m30;
111                    m[13] = m31;
112                    m[14] = m32;
113                    m[15] = m33;
114            }
115    
116            public void setIdentity() {
117                    m00 = 1.0f;
118                    m01 = 0.0f;
119                    m02 = 0.0f;
120                    m03 = 0.0f;
121    
122                    m10 = 0.0f;
123                    m11 = 1.0f;
124                    m12 = 0.0f;
125                    m13 = 0.0f;
126    
127                    m20 = 0.0f;
128                    m21 = 0.0f;
129                    m22 = 1.0f;
130                    m23 = 0.0f;
131    
132                    m30 = 0.0f;
133                    m31 = 0.0f;
134                    m32 = 0.0f;
135                    m33 = 1.0f;
136            }
137    
138            public void mul( Matrix4f m ) {
139                    float tm00 = m00;
140                    float tm01 = m01;
141                    float tm02 = m02;
142                    float tm03 = m03;
143                    float tm10 = m10;
144                    float tm11 = m11;
145                    float tm12 = m12;
146                    float tm13 = m13;
147                    float tm20 = m20;
148                    float tm21 = m21;
149                    float tm22 = m22;
150                    float tm23 = m23;
151                    float tm30 = m30;
152                    float tm31 = m31;
153                    float tm32 = m32;
154                    float tm33 = m33;
155    
156                    m00 = tm00*m.m00 + tm10*m.m01 + tm20*m.m02 + tm30*m.m03;
157                    m01 = tm01*m.m00 + tm11*m.m01 + tm21*m.m02 + tm31*m.m03;
158                    m02 = tm02*m.m00 + tm12*m.m01 + tm22*m.m02 + tm32*m.m03;
159                    m03 = tm03*m.m00 + tm13*m.m01 + tm23*m.m02 + tm33*m.m03;
160                    m10 = tm00*m.m10 + tm10*m.m11 + tm20*m.m12 + tm30*m.m13;
161                    m11 = tm01*m.m10 + tm11*m.m11 + tm21*m.m12 + tm31*m.m13;
162                    m12 = tm02*m.m10 + tm12*m.m11 + tm22*m.m12 + tm32*m.m13;
163                    m13 = tm03*m.m10 + tm13*m.m11 + tm23*m.m12 + tm33*m.m13;
164                    m20 = tm00*m.m20 + tm10*m.m21 + tm20*m.m22 + tm30*m.m23;
165                    m21 = tm01*m.m20 + tm11*m.m21 + tm21*m.m22 + tm31*m.m23;
166                    m22 = tm02*m.m20 + tm12*m.m21 + tm22*m.m22 + tm32*m.m23;
167                    m23 = tm03*m.m20 + tm13*m.m21 + tm23*m.m22 + tm33*m.m23;
168                    m30 = tm00*m.m30 + tm10*m.m31 + tm20*m.m32 + tm30*m.m33;
169                    m31 = tm01*m.m30 + tm11*m.m31 + tm21*m.m32 + tm31*m.m33;
170                    m32 = tm02*m.m30 + tm12*m.m31 + tm22*m.m32 + tm32*m.m33;
171                    m33 = tm03*m.m30 + tm13*m.m31 + tm23*m.m32 + tm33*m.m33;
172            }
173    
174            public void invert() {
175                    Matrix4f t = new Matrix4f( this );
176                    invert( t );
177            }
178    
179            public void invert( Matrix4f t ) {
180                    m00 = t.m00;
181                    m01 = t.m10;
182                    m02 = t.m20;
183                    m03 = t.m03;
184    
185                    m10 = t.m01;
186                    m11 = t.m11;
187                    m12 = t.m21;
188                    m13 = t.m13;
189    
190                    m20 = t.m02;
191                    m21 = t.m12;
192                    m22 = t.m22;
193                    m23 = t.m23;
194    
195                    m30 *= -1.0f;
196                    m31 *= -1.0f;
197                    m32 *= -1.0f;
198                    m33 = t.m33;
199            }
200    
201            public void set( AxisAngle4f a ) {
202                    float halfTheta = a.angle * 0.5f;
203                    float cosHalfTheta = (float)Math.cos(halfTheta);
204                    float sinHalfTheta = (float)Math.sin(halfTheta);
205                    set( new Quat4f( a.x * sinHalfTheta, a.y * sinHalfTheta, a.z * sinHalfTheta, cosHalfTheta ) );
206            }
207    
208            public void set( Quat4f q ) {
209                    float wx, wy, wz, xx, yy, yz, xy, xz, zz, x2, y2, z2;
210                    x2 = q.x + q.x;
211                    y2 = q.y + q.y;
212                    z2 = q.z + q.z;
213                    xx = q.x * x2;
214                    xy = q.x * y2;
215                    xz = q.x * z2;
216                    yy = q.y * y2;
217                    yz = q.y * z2;
218                    zz = q.z * z2;
219                    wx = q.w * x2;
220                    wy = q.w * y2;
221                    wz = q.w * z2;
222                    m00 = 1.0f - (yy + zz);
223                    m01 = xy - wz;
224                    m02 = xz + wy;
225                    m03 = 0.0f;
226                    m10 = xy + wz;
227                    m11 = 1.0f - (xx + zz);
228                    m12 = yz - wx;
229                    m13 = 0.0f;
230                    m20 = xz - wy;
231                    m21 = yz + wx;
232                    m22 = 1.0f - (xx + yy);
233                    m23 = 0.0f;
234                    m30 = 0;
235                    m31 = 0;
236                    m32 = 0;
237                    m33 = 1;
238            }
239    
240            public void transform( Point3f v ) {
241                    float x = v.x * m00 + v.y * m10 + v.z * m20 + m30;
242                    float y = v.x * m01 + v.y * m11 + v.z * m21 + m31;
243                    float z = v.x * m02 + v.y * m12 + v.z * m22 + m32;
244                    v.x = x;
245                    v.y = y;
246                    v.z = z;
247            }
248    
249            public void transform( Vector3f v ) {
250                    float x = v.x * m00 + v.y * m10 + v.z * m20;
251                    float y = v.x * m01 + v.y * m11 + v.z * m21;
252                    float z = v.x * m02 + v.y * m12 + v.z * m22;
253                    v.x = x;
254                    v.y = y;
255                    v.z = z;
256            }
257    
258            public void setTranslation( Vector3f v ) {
259                    m30 = v.x;
260                    m31 = v.y;
261                    m32 = v.z;
262            }
263    
264            public void set( float scale ) {
265                    m00 = scale;
266                    m11 = scale;
267                    m22 = scale;
268            }
269    
270            public void rotX( float angle ) {
271                    float s = (float)Math.sin( angle );
272                    float c = (float)Math.cos( angle );
273                    m00 = 1.0f;
274                    m01 = 0.0f;
275                    m02 = 0.0f;
276                    m03 = 0.0f;
277    
278                    m10 = 0.0f;
279                    m11 = c;
280                    m12 = s;
281                    m13 = 0.0f;
282    
283                    m20 = 0.0f;
284                    m21 = -s;
285                    m22 = c;
286                    m23 = 0.0f;
287    
288                    m30 = 0.0f;
289                    m31 = 0.0f;
290                    m32 = 0.0f;
291                    m33 = 1.0f;
292            }
293    
294            public void rotY( float angle ) {
295                    float s = (float)Math.sin( angle );
296                    float c = (float)Math.cos( angle );
297                    m00 = c;
298                    m01 = 0.0f;
299                    m02 = -s;
300                    m03 = 0.0f;
301    
302                    m10 = 0.0f;
303                    m11 = 1.0f;
304                    m12 = 0.0f;
305                    m13 = 0.0f;
306    
307                    m20 = s;
308                    m21 = 0.0f;
309                    m22 = c;
310                    m23 = 0.0f;
311    
312                    m30 = 0.0f;
313                    m31 = 0.0f;
314                    m32 = 0.0f;
315                    m33 = 1.0f;
316            }
317    
318            public void rotZ( float angle ) {
319                    float s = (float)Math.sin( angle );
320                    float c = (float)Math.cos( angle );
321                    m00 = c;
322                    m01 = s;
323                    m02 = 0.0f;
324                    m03 = 0.0f;
325    
326                    m10 = -s;
327                    m11 = c;
328                    m12 = 0.0f;
329                    m13 = 0.0f;
330    
331                    m20 = 0.0f;
332                    m21 = 0.0f;
333                    m22 = 1.0f;
334                    m23 = 0.0f;
335    
336                    m30 = 0.0f;
337                    m31 = 0.0f;
338                    m32 = 0.0f;
339                    m33 = 1.0f;
340            }
341    /*
342            void rotate(float angle, float x, float y, float z) {
343                    Matrix4f m = new Matrix4f();//FIXME
344                    m.MatrixFromAxisAngle(Vector3f(x, y, z), angle);
345                    Multiply(m);
346            }
347    */
348    }