| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043 |
- /*
- 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;
- vector3::normalize(zAxis);
- Vector3 xAxis = vector3::cross(up, zAxis);
- Vector3 yAxis = vector3::cross(zAxis, 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] = -vector3::dot(pos, xAxis);
- m[13] = -vector3::dot(pos, yAxis);
- m[14] = -vector3::dot(pos, zAxis);
- m[15] = 1.0;
- }
- //-----------------------------------------------------------------------------
- void Matrix4x4::build_viewpoint_billboard(const Vector3& pos, const Vector3& target, const Vector3& up)
- {
- Vector3 zAxis = target - pos;
- vector3::normalize(zAxis);
- Vector3 xAxis = vector3::cross(up, zAxis);
- Vector3 yAxis = vector3::cross(zAxis, xAxis);
- vector3::normalize(xAxis);
- vector3::normalize(yAxis);
- 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 = vector3::cross(axis, zAxis);
- zAxis = vector3::cross(axis, xAxis);
- vector3::normalize(xAxis);
- vector3::normalize(zAxis);
- 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
|