001/* 002Copyright 2006 Jerry Huxtable 003 004Licensed under the Apache License, Version 2.0 (the "License"); 005you may not use this file except in compliance with the License. 006You may obtain a copy of the License at 007 008 http://www.apache.org/licenses/LICENSE-2.0 009 010Unless required by applicable law or agreed to in writing, software 011distributed under the License is distributed on an "AS IS" BASIS, 012WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013See the License for the specific language governing permissions and 014limitations under the License. 015*/ 016 017package com.jhlabs.vecmath; 018 019/** 020 * Vector math package, converted to look similar to javax.vecmath. 021 */ 022public 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}