| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039 |
- /*
- Copyright (c) 2013 Daniele Bartolini, Michele Rossi
- Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- */
- #include "Assert.h"
- #include "Matrix3x3.h"
- #include "Types.h"
- #include "Matrix4x4.h"
- #include "MathUtils.h"
- #include "Quaternion.h"
- #include "Vector3.h"
- #include "Vector4.h"
- namespace crown
- {
- const Matrix4x4 Matrix4x4::IDENTITY = Matrix4x4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0);
- //-----------------------------------------------------------------------------
- Matrix4x4::Matrix4x4()
- {
- }
- //-----------------------------------------------------------------------------
- Matrix4x4::Matrix4x4(float r1c1, float r2c1, float r3c1, float r4c1,
- float r1c2, float r2c2, float r3c2, float r4c2,
- float r1c3, float r2c3, float r3c3, float r4c3,
- float r1c4, float r2c4, float r3c4, float r4c4)
- {
- m[0] = r1c1;
- m[1] = r2c1;
- m[2] = r3c1;
- m[3] = r4c1;
- m[4] = r1c2;
- m[5] = r2c2;
- m[6] = r3c2;
- m[7] = r4c2;
- m[8] = r1c3;
- m[9] = r2c3;
- m[10] = r3c3;
- m[11] = r4c3;
- m[12] = r1c4;
- m[13] = r2c4;
- m[14] = r3c4;
- m[15] = r4c4;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4::Matrix4x4(const Quaternion& r, const Vector3& p)
- {
- const float& rx = r.v.x;
- const float& ry = r.v.y;
- const float& rz = r.v.z;
- const float& rw = r.w;
- m[0] = 1.0 - 2.0 * ry * ry - 2.0 * rz * rz;
- m[1] = 2.0 * rx * ry + 2.0 * rw * rz;
- m[2] = 2.0 * rx * rz - 2.0 * rw * ry;
- m[3] = 0;
- m[4] = 2.0 * rx * ry - 2.0 * rw * rz;
- m[5] = 1.0 - 2.0 * rx * rx - 2.0 * rz * rz;
- m[6] = 2.0 * ry * rz + 2.0 * rw * rx;
- m[7] = 0.0;
- m[8] = 2.0 * rx * rz + 2.0 * rw * ry;
- m[9] = 2.0 * ry * rz - 2.0 * rw * rx;
- m[10] = 1.0 - 2.0 * rx * rx - 2.0 * ry * ry;
- m[11] = 0.0;
- m[12] = p.x;
- m[13] = p.y;
- m[14] = p.z;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4::Matrix4x4(const float v[16])
- {
- m[0] = v[0];
- m[1] = v[1];
- m[2] = v[2];
- m[3] = v[3];
- m[4] = v[4];
- m[5] = v[5];
- m[6] = v[6];
- m[7] = v[7];
- m[8] = v[8];
- m[9] = v[9];
- m[10] = v[10];
- m[11] = v[11];
- m[12] = v[12];
- m[13] = v[13];
- m[14] = v[14];
- m[15] = v[15];
- }
- //-----------------------------------------------------------------------------
- Matrix4x4::Matrix4x4(const Matrix4x4& a)
- {
- m[0] = a.m[0];
- m[1] = a.m[1];
- m[2] = a.m[2];
- m[3] = a.m[3];
- m[4] = a.m[4];
- m[5] = a.m[5];
- m[6] = a.m[6];
- m[7] = a.m[7];
- m[8] = a.m[8];
- m[9] = a.m[9];
- m[10] = a.m[10];
- m[11] = a.m[11];
- m[12] = a.m[12];
- m[13] = a.m[13];
- m[14] = a.m[14];
- m[15] = a.m[15];
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator=(const Matrix4x4& a)
- {
- m[0] = a.m[0];
- m[1] = a.m[1];
- m[2] = a.m[2];
- m[3] = a.m[3];
- m[4] = a.m[4];
- m[5] = a.m[5];
- m[6] = a.m[6];
- m[7] = a.m[7];
- m[8] = a.m[8];
- m[9] = a.m[9];
- m[10] = a.m[10];
- m[11] = a.m[11];
- m[12] = a.m[12];
- m[13] = a.m[13];
- m[14] = a.m[14];
- m[15] = a.m[15];
- return *this;
- }
- //-----------------------------------------------------------------------------
- float Matrix4x4::operator[](uint32_t i) const
- {
- CE_ASSERT(i < 16, "Index must be < 16");
- return m[i];
- }
- //-----------------------------------------------------------------------------
- float& Matrix4x4::operator[](uint32_t i)
- {
- CE_ASSERT(i < 16, "Index must be < 16");
- return m[i];
- }
- //-----------------------------------------------------------------------------
- float Matrix4x4::operator()(uint32_t row, uint32_t column) const
- {
- CE_ASSERT(row < 4 && column < 4, "Row and column must be < 4");
- return m[row + column * 4];
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::operator+(const Matrix4x4& a) const
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0] + a.m[0];
- tmp.m[1] = m[1] + a.m[1];
- tmp.m[2] = m[2] + a.m[2];
- tmp.m[3] = m[3] + a.m[3];
- tmp.m[4] = m[4] + a.m[4];
- tmp.m[5] = m[5] + a.m[5];
- tmp.m[6] = m[6] + a.m[6];
- tmp.m[7] = m[7] + a.m[7];
- tmp.m[8] = m[8] + a.m[8];
- tmp.m[9] = m[9] + a.m[9];
- tmp.m[10] = m[10] + a.m[10];
- tmp.m[11] = m[11] + a.m[11];
- tmp.m[12] = m[12] + a.m[12];
- tmp.m[13] = m[13] + a.m[13];
- tmp.m[14] = m[14] + a.m[14];
- tmp.m[14] = m[15] + a.m[15];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator+=(const Matrix4x4& a)
- {
- m[0] = m[0] + a.m[0];
- m[1] = m[1] + a.m[1];
- m[2] = m[2] + a.m[2];
- m[3] = m[3] + a.m[3];
- m[4] = m[4] + a.m[4];
- m[5] = m[5] + a.m[5];
- m[6] = m[6] + a.m[6];
- m[7] = m[7] + a.m[7];
- m[8] = m[8] + a.m[8];
- m[9] = m[9] + a.m[9];
- m[10] = m[10] + a.m[10];
- m[11] = m[11] + a.m[11];
- m[12] = m[12] + a.m[12];
- m[13] = m[13] + a.m[13];
- m[14] = m[14] + a.m[14];
- m[14] = m[15] + a.m[15];
- return *this;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::operator-(const Matrix4x4& a) const
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0] - a.m[0];
- tmp.m[1] = m[1] - a.m[1];
- tmp.m[2] = m[2] - a.m[2];
- tmp.m[3] = m[3] - a.m[3];
- tmp.m[4] = m[4] - a.m[4];
- tmp.m[5] = m[5] - a.m[5];
- tmp.m[6] = m[6] - a.m[6];
- tmp.m[7] = m[7] - a.m[7];
- tmp.m[8] = m[8] - a.m[8];
- tmp.m[9] = m[9] - a.m[9];
- tmp.m[10] = m[10] - a.m[10];
- tmp.m[11] = m[11] - a.m[11];
- tmp.m[12] = m[12] - a.m[12];
- tmp.m[13] = m[13] - a.m[13];
- tmp.m[14] = m[14] - a.m[14];
- tmp.m[14] = m[15] - a.m[15];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator-=(const Matrix4x4& a)
- {
- m[0] = m[0] - a.m[0];
- m[1] = m[1] - a.m[1];
- m[2] = m[2] - a.m[2];
- m[3] = m[3] - a.m[3];
- m[4] = m[4] - a.m[4];
- m[5] = m[5] - a.m[5];
- m[6] = m[6] - a.m[6];
- m[7] = m[7] - a.m[7];
- m[8] = m[8] - a.m[8];
- m[9] = m[9] - a.m[9];
- m[10] = m[10] - a.m[10];
- m[11] = m[11] - a.m[11];
- m[12] = m[12] - a.m[12];
- m[13] = m[13] - a.m[13];
- m[14] = m[14] - a.m[14];
- m[14] = m[15] - a.m[15];
- return *this;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::operator*(float k) const
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0] * k;
- tmp.m[1] = m[1] * k;
- tmp.m[2] = m[2] * k;
- tmp.m[3] = m[3] * k;
- tmp.m[4] = m[4] * k;
- tmp.m[5] = m[5] * k;
- tmp.m[6] = m[6] * k;
- tmp.m[7] = m[7] * k;
- tmp.m[8] = m[8] * k;
- tmp.m[9] = m[9] * k;
- tmp.m[10] = m[10] * k;
- tmp.m[11] = m[11] * k;
- tmp.m[12] = m[12] * k;
- tmp.m[13] = m[13] * k;
- tmp.m[14] = m[14] * k;
- tmp.m[15] = m[15] * k;
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator*=(float k)
- {
- m[0] *= k;
- m[1] *= k;
- m[2] *= k;
- m[3] *= k;
- m[4] *= k;
- m[5] *= k;
- m[6] *= k;
- m[7] *= k;
- m[8] *= k;
- m[9] *= k;
- m[10] *= k;
- m[11] *= k;
- m[12] *= k;
- m[13] *= k;
- m[14] *= k;
- m[15] *= k;
- return *this;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::operator/(float k) const
- {
- Matrix4x4 tmp;
- k = (float)1.0 / k;
- tmp.m[0] = m[0] * k;
- tmp.m[1] = m[1] * k;
- tmp.m[2] = m[2] * k;
- tmp.m[3] = m[3] * k;
- tmp.m[4] = m[4] * k;
- tmp.m[5] = m[5] * k;
- tmp.m[6] = m[6] * k;
- tmp.m[7] = m[7] * k;
- tmp.m[8] = m[8] * k;
- tmp.m[9] = m[9] * k;
- tmp.m[10] = m[10] * k;
- tmp.m[11] = m[11] * k;
- tmp.m[12] = m[12] * k;
- tmp.m[13] = m[13] * k;
- tmp.m[14] = m[14] * k;
- tmp.m[15] = m[15] * k;
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator/=(float k)
- {
- k = (float)1.0 / k;
- m[0] *= k;
- m[1] *= k;
- m[2] *= k;
- m[3] *= k;
- m[4] *= k;
- m[5] *= k;
- m[6] *= k;
- m[7] *= k;
- m[8] *= k;
- m[9] *= k;
- m[10] *= k;
- m[11] *= k;
- m[12] *= k;
- m[13] *= k;
- m[14] *= k;
- m[15] *= k;
- return *this;
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::operator*(const Vector3& v) const
- {
- Vector3 tmp;
- tmp.x = m[0] * v.x + m[4] * v.y + m[8] * v.z + m[12];
- tmp.y = m[1] * v.x + m[5] * v.y + m[9] * v.z + m[13];
- tmp.z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Vector4 Matrix4x4::operator*(const Vector4& v) const
- {
- Vector4 tmp;
- tmp.x = m[0] * v.x + m[4] * v.y + m[8] * v.z + m[12] * v.w;
- tmp.y = m[1] * v.x + m[5] * v.y + m[9] * v.z + m[13] * v.w;
- tmp.z = m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14] * v.w;
- tmp.w = m[3] * v.x + m[7] * v.y + m[11] * v.z + m[15] * v.w;
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::operator*(const Matrix4x4& a) const
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0] * a.m[0] + m[4] * a.m[1] + m[8] * a.m[2] + m[12] * a.m[3];
- tmp.m[1] = m[1] * a.m[0] + m[5] * a.m[1] + m[9] * a.m[2] + m[13] * a.m[3];
- tmp.m[2] = m[2] * a.m[0] + m[6] * a.m[1] + m[10] * a.m[2] + m[14] * a.m[3];
- tmp.m[3] = m[3] * a.m[0] + m[7] * a.m[1] + m[11] * a.m[2] + m[15] * a.m[3];
- tmp.m[4] = m[0] * a.m[4] + m[4] * a.m[5] + m[8] * a.m[6] + m[12] * a.m[7];
- tmp.m[5] = m[1] * a.m[4] + m[5] * a.m[5] + m[9] * a.m[6] + m[13] * a.m[7];
- tmp.m[6] = m[2] * a.m[4] + m[6] * a.m[5] + m[10] * a.m[6] + m[14] * a.m[7];
- tmp.m[7] = m[3] * a.m[4] + m[7] * a.m[5] + m[11] * a.m[6] + m[15] * a.m[7];
- tmp.m[8] = m[0] * a.m[8] + m[4] * a.m[9] + m[8] * a.m[10] + m[12] * a.m[11];
- tmp.m[9] = m[1] * a.m[8] + m[5] * a.m[9] + m[9] * a.m[10] + m[13] * a.m[11];
- tmp.m[10] = m[2] * a.m[8] + m[6] * a.m[9] + m[10] * a.m[10] + m[14] * a.m[11];
- tmp.m[11] = m[3] * a.m[8] + m[7] * a.m[9] + m[11] * a.m[10] + m[15] * a.m[11];
- tmp.m[12] = m[0] * a.m[12] + m[4] * a.m[13] + m[8] * a.m[14] + m[12] * a.m[15];
- tmp.m[13] = m[1] * a.m[12] + m[5] * a.m[13] + m[9] * a.m[14] + m[13] * a.m[15];
- tmp.m[14] = m[2] * a.m[12] + m[6] * a.m[13] + m[10] * a.m[14] + m[14] * a.m[15];
- tmp.m[15] = m[3] * a.m[12] + m[7] * a.m[13] + m[11] * a.m[14] + m[15] * a.m[15];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::operator*=(const Matrix4x4& a)
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0] * a.m[0] + m[4] * a.m[1] + m[8] * a.m[2] + m[12] * a.m[3];
- tmp.m[1] = m[1] * a.m[0] + m[5] * a.m[1] + m[9] * a.m[2] + m[13] * a.m[3];
- tmp.m[2] = m[2] * a.m[0] + m[6] * a.m[1] + m[10] * a.m[2] + m[14] * a.m[3];
- tmp.m[3] = m[3] * a.m[0] + m[7] * a.m[1] + m[11] * a.m[2] + m[15] * a.m[3];
- tmp.m[4] = m[0] * a.m[4] + m[4] * a.m[5] + m[8] * a.m[6] + m[12] * a.m[7];
- tmp.m[5] = m[1] * a.m[4] + m[5] * a.m[5] + m[9] * a.m[6] + m[13] * a.m[7];
- tmp.m[6] = m[2] * a.m[4] + m[6] * a.m[5] + m[10] * a.m[6] + m[14] * a.m[7];
- tmp.m[7] = m[3] * a.m[4] + m[7] * a.m[5] + m[11] * a.m[6] + m[15] * a.m[7];
- tmp.m[8] = m[0] * a.m[8] + m[4] * a.m[9] + m[8] * a.m[10] + m[12] * a.m[11];
- tmp.m[9] = m[1] * a.m[8] + m[5] * a.m[9] + m[9] * a.m[10] + m[13] * a.m[11];
- tmp.m[10] = m[2] * a.m[8] + m[6] * a.m[9] + m[10] * a.m[10] + m[14] * a.m[11];
- tmp.m[11] = m[3] * a.m[8] + m[7] * a.m[9] + m[11] * a.m[10] + m[15] * a.m[11];
- tmp.m[12] = m[0] * a.m[12] + m[4] * a.m[13] + m[8] * a.m[14] + m[12] * a.m[15];
- tmp.m[13] = m[1] * a.m[12] + m[5] * a.m[13] + m[9] * a.m[14] + m[13] * a.m[15];
- tmp.m[14] = m[2] * a.m[12] + m[6] * a.m[13] + m[10] * a.m[14] + m[14] * a.m[15];
- tmp.m[15] = m[3] * a.m[12] + m[7] * a.m[13] + m[11] * a.m[14] + m[15] * a.m[15];
- *this = tmp;
- return *this;
- }
- Matrix4x4 operator*(float k, const Matrix4x4& a)
- {
- return a * k;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_rotation_x(float radians)
- {
- m[0] = 1.0;
- m[1] = 0.0;
- m[2] = 0.0;
- m[3] = 0.0;
- m[4] = 0.0;
- m[5] = math::cos(radians);
- m[6] = math::sin(radians);
- m[7] = 0.0;
- m[8] = 0.0;
- m[9] = -math::sin(radians);
- m[10] = math::cos(radians);
- m[11] = 0.0;
- m[12] = 0.0;
- m[13] = 0.0;
- m[14] = 0.0;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_rotation_y(float radians)
- {
- m[0] = math::cos(radians);
- m[1] = 0.0;
- m[2] = -math::sin(radians);
- m[3] = 0.0;
- m[4] = 0.0;
- m[5] = 1.0;
- m[6] = 0.0;
- m[7] = 0.0;
- m[8] = math::sin(radians);
- m[9] = 0.0;
- m[10] = math::cos(radians);
- m[11] = 0.0;
- m[12] = 0.0;
- m[13] = 0.0;
- m[14] = 0.0;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_rotation_z(float radians)
- {
- m[0] = math::cos(radians);
- m[1] = math::sin(radians);
- m[2] = 0.0;
- m[3] = 0.0;
- m[4] = -math::sin(radians);
- m[5] = math::cos(radians);
- m[6] = 0.0;
- m[7] = 0.0;
- m[8] = 0.0;
- m[9] = 0.0;
- m[10] = 1.0;
- m[11] = 0.0;
- m[12] = 0.0;
- m[13] = 0.0;
- m[14] = 0.0;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_rotation(const Vector3& n, float radians)
- {
- float a = (float)1.0 - math::cos(radians);
- float sin_a = math::sin(radians);
- float cos_a = math::cos(radians);
- m[0] = n.x * n.x * a + cos_a;
- m[1] = n.x * n.y * a + n.z * sin_a;
- m[2] = n.x * n.z * a - n.y * sin_a;
- m[3] = 0.0;
- m[4] = n.x * n.y * a - n.z * sin_a;
- m[5] = n.y * n.y * a + cos_a;
- m[6] = n.y * n.z * a + n.x * sin_a;
- m[7] = 0.0;
- m[8] = n.x * n.z * a + n.y * sin_a;
- m[9] = n.y * n.z * a - n.x * sin_a;
- m[10] = n.z * n.z * a + cos_a;
- m[11] = 0.0;
- m[12] = 0.0;
- m[13] = 0.0;
- m[14] = 0.0;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_rotation(const Quaternion& rot)
- {
- set_rotation(rot.to_matrix3x3());
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_rotation(const Matrix3x3& rot)
- {
- m[0] = rot.m[0];
- m[1] = rot.m[1];
- m[2] = rot.m[2];
- m[4] = rot.m[3];
- m[5] = rot.m[4];
- m[6] = rot.m[5];
- m[8] = rot.m[6];
- m[9] = rot.m[7];
- m[10] = rot.m[8];
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_projection_perspective_rh(float fovy, float aspect, float near, float far)
- {
- double top, right;
- top = math::tan((float)((double)fovy / 360.0 * math::PI)) * (double)near;
- right = top * aspect;
- m[0] = (float)(near / right);
- m[1] = 0.0;
- m[2] = 0.0;
- m[3] = 0.0;
- m[4] = 0.0;
- m[5] = (float)(near / top);
- m[6] = 0.0;
- m[7] = 0.0;
- m[8] = 0.0;
- m[9] = 0.0;
- m[10] = (float)((far + near) / (near - far));
- m[11] = -1.0;
- m[12] = 0.0;
- m[13] = 0.0;
- m[14] = (float)((2.0 * far * near) / (near - far));
- m[15] = 0.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_projection_ortho_rh(float left, float right, float bottom, float top, float near, float far)
- {
- m[0] = 2.0 / (right - left);
- m[1] = 0.0;
- m[2] = 0.0;
- m[3] = 0.0;
- m[4] = 0.0;
- m[5] = 2.0 / (top - bottom);
- m[6] = 0.0;
- m[7] = 0.0;
- m[8] = 0.0;
- m[9] = 0.0;
- m[10] = -2.0 / (far - near);
- m[11] = 0.0;
- m[12] = -((right + left) / (right - left));
- m[13] = -((top + bottom) / (top - bottom));
- m[14] = -((far + near) / (far - near));
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::transpose()
- {
- float tmp;
- tmp = m[1];
- m[1] = m[4];
- m[4] = tmp;
- tmp = m[2];
- m[2] = m[8];
- m[8] = tmp;
- tmp = m[3];
- m[3] = m[12];
- m[12] = tmp;
- tmp = m[6];
- m[6] = m[9];
- m[9] = tmp;
- tmp = m[7];
- m[7] = m[13];
- m[13] = tmp;
- tmp = m[11];
- m[11] = m[14];
- m[14] = tmp;
- return *this;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4 Matrix4x4::get_transposed() const
- {
- Matrix4x4 tmp;
- tmp.m[0] = m[0];
- tmp.m[1] = m[4];
- tmp.m[2] = m[8];
- tmp.m[3] = m[12];
- tmp.m[4] = m[1];
- tmp.m[5] = m[5];
- tmp.m[6] = m[9];
- tmp.m[7] = m[13];
- tmp.m[8] = m[2];
- tmp.m[9] = m[6];
- tmp.m[10] = m[10];
- tmp.m[11] = m[14];
- tmp.m[12] = m[3];
- tmp.m[13] = m[7];
- tmp.m[14] = m[11];
- tmp.m[15] = m[15];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_look_at_rh(const Vector3& pos, const Vector3& target, const Vector3& up)
- {
- Vector3 zAxis = pos - target;
- zAxis.normalize();
- Vector3 xAxis = up.cross(zAxis);
- Vector3 yAxis = zAxis.cross(xAxis);
- m[0] = xAxis.x;
- m[1] = yAxis.x;
- m[2] = zAxis.x;
- m[3] = 0.0;
- m[4] = xAxis.y;
- m[5] = yAxis.y;
- m[6] = zAxis.y;
- m[7] = 0.0;
- m[8] = xAxis.z;
- m[9] = yAxis.z;
- m[10] = zAxis.z;
- m[11] = 0.0;
- m[12] = -pos.dot(xAxis);
- m[13] = -pos.dot(yAxis);
- m[14] = -pos.dot(zAxis);
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_viewpoint_billboard(const Vector3& pos, const Vector3& target, const Vector3& up)
- {
- Vector3 zAxis = target - pos;
- zAxis.normalize();
- Vector3 xAxis = up.cross(zAxis).normalize();
- Vector3 yAxis = zAxis.cross(xAxis).normalize();
- m[0] = xAxis.x;
- m[1] = xAxis.y;
- m[2] = xAxis.z;
- m[3] = 0.0;
- m[4] = yAxis.x;
- m[5] = yAxis.y;
- m[6] = yAxis.z;
- m[7] = 0.0;
- m[8] = zAxis.x;
- m[9] = zAxis.y;
- m[10] = zAxis.z;
- m[11] = 0.0;
- m[12] = pos.x;
- m[13] = pos.y;
- m[14] = pos.z;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_axis_billboard(const Vector3& pos, const Vector3& target, const Vector3& axis)
- {
- Vector3 zAxis = target - pos;
- Vector3 xAxis = axis.cross(zAxis).normalize();
- zAxis = axis.cross(xAxis).normalize();
- const Vector3& yAxis = axis;
- m[0] = xAxis.x;
- m[1] = xAxis.y;
- m[2] = xAxis.z;
- m[3] = 0.0;
- m[4] = yAxis.x;
- m[5] = yAxis.y;
- m[6] = yAxis.z;
- m[7] = 0.0;
- m[8] = zAxis.x;
- m[9] = zAxis.y;
- m[10] = zAxis.z;
- m[11] = 0.0;
- m[12] = pos.x;
- m[13] = pos.y;
- m[14] = pos.z;
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- float Matrix4x4::get_determinant() const
- {
- float det;
- float m02m07_m06m03 = m[2] * m[7] - m[6] * m[3];
- float m02m11_m10m03 = m[2] * m[11] - m[10] * m[3];
- float m02m15_m14m03 = m[2] * m[15] - m[14] * m[3];
- float m06m11_m10m07 = m[6] * m[11] - m[10] * m[7];
- float m06m15_m14m07 = m[6] * m[15] - m[14] * m[7];
- float m10m15_m14m11 = m[10] * m[15] - m[14] * m[11];
- det = + m[0] * (m[5] * m10m15_m14m11 - m[9] * m06m15_m14m07 + m[13] * m06m11_m10m07)
- - m[4] * (m[1] * m10m15_m14m11 - m[9] * m02m15_m14m03 + m[13] * m02m11_m10m03)
- + m[8] * (m[1] * m06m15_m14m07 - m[5] * m02m15_m14m03 + m[13] * m02m07_m06m03)
- - m[12] * (m[1] * m06m11_m10m07 - m[5] * m02m11_m10m03 + m[9] * m02m07_m06m03);
- return det;
- }
- //-----------------------------------------------------------------------------
- Matrix4x4& Matrix4x4::invert()
- {
- Matrix4x4 mat;
- float det;
- float m01m06_m05m02 = m[1] * m[6] - m[5] * m[2];
- float m01m07_m05m03 = m[1] * m[7] - m[5] * m[3];
- float m01m10_m09m02 = m[1] * m[10] - m[9] * m[2];
- float m01m11_m09m03 = m[1] * m[11] - m[9] * m[3];
- float m01m14_m13m02 = m[1] * m[14] - m[13] * m[2];
- float m01m15_m13m03 = m[1] * m[15] - m[13] * m[3];
- float m02m07_m06m03 = m[2] * m[7] - m[6] * m[3];
- float m02m11_m10m03 = m[2] * m[11] - m[10] * m[3];
- float m02m15_m14m03 = m[2] * m[15] - m[14] * m[3];
- float m05m10_m09m06 = m[5] * m[10] - m[9] * m[6];
- float m05m11_m09m07 = m[5] * m[11] - m[9] * m[7];
- float m05m14_m13m06 = m[5] * m[14] - m[13] * m[6];
- float m05m15_m13m07 = m[5] * m[15] - m[13] * m[7];
- float m06m11_m10m07 = m[6] * m[11] - m[10] * m[7];
- float m06m15_m14m07 = m[6] * m[15] - m[14] * m[7];
- float m09m14_m13m10 = m[9] * m[14] - m[13] * m[10];
- float m09m15_m13m11 = m[9] * m[15] - m[13] * m[11];
- float m10m15_m14m11 = m[10] * m[15] - m[14] * m[11];
- mat.m[0] = (+ m[5] * m10m15_m14m11 - m[9] * m06m15_m14m07 + m[13] * m06m11_m10m07);
- mat.m[1] = (+ m[1] * m10m15_m14m11 - m[9] * m02m15_m14m03 + m[13] * m02m11_m10m03);
- mat.m[2] = (+ m[1] * m06m15_m14m07 - m[5] * m02m15_m14m03 + m[13] * m02m07_m06m03);
- mat.m[3] = (+ m[1] * m06m11_m10m07 - m[5] * m02m11_m10m03 + m[9] * m02m07_m06m03);
- det = m[0] * mat.m[0] - m[4] * mat.m[1] + m[8] * mat.m[2] - m[12] * mat.m[3];
- det = (float)1.0 / det;
- mat.m[4] = (+ m[4] * m10m15_m14m11 - m[8] * m06m15_m14m07 + m[12] * m06m11_m10m07);
- mat.m[5] = (+ m[0] * m10m15_m14m11 - m[8] * m02m15_m14m03 + m[12] * m02m11_m10m03);
- mat.m[6] = (+ m[0] * m06m15_m14m07 - m[4] * m02m15_m14m03 + m[12] * m02m07_m06m03);
- mat.m[7] = (+ m[0] * m06m11_m10m07 - m[4] * m02m11_m10m03 + m[8] * m02m07_m06m03);
- mat.m[8] = (+ m[4] * m09m15_m13m11 - m[8] * m05m15_m13m07 + m[12] * m05m11_m09m07);
- mat.m[9] = (+ m[0] * m09m15_m13m11 - m[8] * m01m15_m13m03 + m[12] * m01m11_m09m03);
- mat.m[10] = (+ m[0] * m05m15_m13m07 - m[4] * m01m15_m13m03 + m[12] * m01m07_m05m03);
- mat.m[11] = (+ m[0] * m05m11_m09m07 - m[4] * m01m11_m09m03 + m[8] * m01m07_m05m03);
- mat.m[12] = (+ m[4] * m09m14_m13m10 - m[8] * m05m14_m13m06 + m[12] * m05m10_m09m06);
- mat.m[13] = (+ m[0] * m09m14_m13m10 - m[8] * m01m14_m13m02 + m[12] * m01m10_m09m02);
- mat.m[14] = (+ m[0] * m05m14_m13m06 - m[4] * m01m14_m13m02 + m[12] * m01m06_m05m02);
- mat.m[15] = (+ m[0] * m05m10_m09m06 - m[4] * m01m10_m09m02 + m[8] * m01m06_m05m02);
- m[0] = + mat.m[0] * det;
- m[1] = - mat.m[1] * det;
- m[2] = + mat.m[2] * det;
- m[3] = - mat.m[3] * det;
- m[4] = - mat.m[4] * det;
- m[5] = + mat.m[5] * det;
- m[6] = - mat.m[6] * det;
- m[7] = + mat.m[7] * det;
- m[8] = + mat.m[8] * det;
- m[9] = - mat.m[9] * det;
- m[10] = + mat.m[10] * det;
- m[11] = - mat.m[11] * det;
- m[12] = - mat.m[12] * det;
- m[13] = + mat.m[13] * det;
- m[14] = - mat.m[14] * det;
- m[15] = + mat.m[15] * det;
- return *this;
- }
- //-----------------------------------------------------------------------------
- inline Matrix4x4 Matrix4x4::get_inverted() const
- {
- Matrix4x4 tmp(*this);
- return tmp.invert();
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::load_identity()
- {
- m[0] = m[5] = m[10] = m[15] = 1.0;
- m[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = m[11] = m[12] = m[13] = m[14] = 0.0;
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::x() const
- {
- return Vector3(m[0], m[1], m[2]);
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::y() const
- {
- return Vector3(m[4], m[5], m[6]);
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::z() const
- {
- return Vector3(m[8], m[9], m[10]);
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_x(const Vector3& x)
- {
- m[0] = x.x;
- m[1] = x.y;
- m[2] = x.z;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_y(const Vector3& y)
- {
- m[4] = y.x;
- m[5] = y.y;
- m[6] = y.z;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_z(const Vector3& z)
- {
- m[8] = z.x;
- m[9] = z.y;
- m[10] = z.z;
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::translation() const
- {
- Vector3 tmp;
- tmp.x = m[12];
- tmp.y = m[13];
- tmp.z = m[14];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_translation(const Vector3& trans)
- {
- m[12] = trans.x;
- m[13] = trans.y;
- m[14] = trans.z;
- }
- //-----------------------------------------------------------------------------
- Vector3 Matrix4x4::get_scale() const
- {
- Vector3 tmp;
- tmp.x = m[0];
- tmp.y = m[5];
- tmp.z = m[10];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::set_scale(const Vector3& scale)
- {
- m[0] = scale.x;
- m[5] = scale.y;
- m[10] = scale.z;
- }
- //-----------------------------------------------------------------------------
- float* Matrix4x4::to_float_ptr()
- {
- return &m[0];
- }
- //-----------------------------------------------------------------------------
- const float* Matrix4x4::to_float_ptr() const
- {
- return &m[0];
- }
- //-----------------------------------------------------------------------------
- Matrix3x3 Matrix4x4::to_matrix3x3() const
- {
- Matrix3x3 tmp;
- tmp.m[0] = m[0];
- tmp.m[1] = m[1];
- tmp.m[2] = m[2];
- tmp.m[3] = m[4];
- tmp.m[4] = m[5];
- tmp.m[5] = m[6];
- tmp.m[6] = m[8];
- tmp.m[7] = m[9];
- tmp.m[8] = m[10];
- return tmp;
- }
- //-----------------------------------------------------------------------------
- Quaternion Matrix4x4::to_quaternion() const
- {
- Quaternion tmp;
- float fourWSquaredMinusOne = m[0] + m[5] + m[10];
- float fourXSquaredMinusOne = m[0] - m[5] - m[10];
- float fourYSquaredMinusOne = -m[0] + m[5] - m[10];
- float fourZSquaredMinusOne = -m[0] - m[5] + m[10];
- float fourMaxSquaredMinusOne = fourWSquaredMinusOne;
- uint32_t index = 0;
- if (fourXSquaredMinusOne > fourMaxSquaredMinusOne)
- {
- fourMaxSquaredMinusOne = fourXSquaredMinusOne;
- index = 1;
- }
- if (fourYSquaredMinusOne > fourMaxSquaredMinusOne)
- {
- fourMaxSquaredMinusOne = fourYSquaredMinusOne;
- index = 2;
- }
- if (fourZSquaredMinusOne > fourMaxSquaredMinusOne)
- {
- fourMaxSquaredMinusOne = fourZSquaredMinusOne;
- index = 3;
- }
- float biggest = math::sqrt(fourMaxSquaredMinusOne + (float)1.0) * (float)0.5;
- float mult = (float)0.25 / biggest;
- switch (index)
- {
- case 0:
- tmp.w = biggest;
- tmp.v.x = (-m[9] + m[6]) * mult;
- tmp.v.y = (-m[2] + m[8]) * mult;
- tmp.v.z = (-m[4] + m[1]) * mult;
- break;
- case 1:
- tmp.v.x = biggest;
- tmp.w = (-m[9] + m[6]) * mult;
- tmp.v.y = (-m[4] - m[1]) * mult;
- tmp.v.z = (-m[2] - m[8]) * mult;
- break;
- case 2:
- tmp.v.y = biggest;
- tmp.w = (-m[2] + m[8]) * mult;
- tmp.v.x = (-m[4] - m[1]) * mult;
- tmp.v.z = (-m[9] - m[6]) * mult;
- break;
- case 3:
- tmp.v.z = biggest;
- tmp.w = (-m[4] + m[1]) * mult;
- tmp.v.x = (-m[2] - m[8]) * mult;
- tmp.v.y = (-m[9] - m[6]) * mult;
- break;
- }
- return tmp;
- }
- } // namespace crown
|