1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033 |
- /**
- Copyright 2013 BlackBerry Inc.
- Copyright (c) 2014-2017 Chukong Technologies
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- Original file from GamePlay3D: http://gameplay3d.org
- This file was modified to fit the cocos2d-x project
- */
- #ifndef MATH_MAT4_H
- #define MATH_MAT4_H
- #include "base/ccMacros.h"
- #include "math/Vec3.h"
- #include "math/Vec4.h"
- #ifdef __SSE__
- #include <xmmintrin.h>
- #endif
- /**
- * @addtogroup base
- * @{
- */
- NS_CC_MATH_BEGIN
- //class Plane;
- /**
- * Defines a 4 x 4 floating point matrix representing a 3D transformation.
- *
- * Vectors are treated as columns, resulting in a matrix that is represented as follows,
- * where x, y and z are the translation components of the matrix:
- *
- * 1 0 0 x
- * 0 1 0 y
- * 0 0 1 z
- * 0 0 0 1
- *
- * This matrix class is directly compatible with OpenGL since its elements are
- * laid out in memory exactly as they are expected by OpenGL.
- * The matrix uses column-major format such that array indices increase down column first.
- * Since matrix multiplication is not commutative, multiplication must be done in the
- * correct order when combining transformations. Suppose we have a translation
- * matrix T and a rotation matrix R. To first rotate an object around the origin
- * and then translate it, you would multiply the two matrices as TR.
- *
- * Likewise, to first translate the object and then rotate it, you would do RT.
- * So generally, matrices must be multiplied in the reverse order in which you
- * want the transformations to take place (this also applies to
- * the scale, rotate, and translate methods below; these methods are convenience
- * methods for post-multiplying by a matrix representing a scale, rotation, or translation).
- *
- * In the case of repeated local transformations (i.e. rotate around the Z-axis by 0.76 radians,
- * then translate by 2.1 along the X-axis, then ...), it is better to use the Transform class
- * (which is optimized for that kind of usage).
- *
- * @see Transform
- */
- /* --- --- --- --- Add by XuJJ start --- --- --- --- */
- bool InvertMatrix4x4_General3D( const float* m, float* out );
- /* --- --- --- --- Add by XuJJ end --- --- --- --- */
- class CC_DLL Mat4
- {
- public:
- // //temp add conversion
- // operator kmMat4() const
- // {
- // kmMat4 result;
- // kmMat4Fill(&result, m);
- // return result;
- // }
-
- // Mat4(const kmMat4& mat)
- // {
- // set(mat.mat);
- // }
- /**
- * Stores the columns of this 4x4 matrix.
- * */
- #ifdef __SSE__
- union {
- __m128 col[4];
- float m[16];
- };
- #else
- float m[16];
- #endif
- /**
- * Default constructor.
- * Constructs a matrix initialized to the identity matrix:
- *
- * 1 0 0 0
- * 0 1 0 0
- * 0 0 1 0
- * 0 0 0 1
- */
- Mat4();
- /**
- * Constructs a matrix initialized to the specified value.
- *
- * @param m11 The first element of the first row.
- * @param m12 The second element of the first row.
- * @param m13 The third element of the first row.
- * @param m14 The fourth element of the first row.
- * @param m21 The first element of the second row.
- * @param m22 The second element of the second row.
- * @param m23 The third element of the second row.
- * @param m24 The fourth element of the second row.
- * @param m31 The first element of the third row.
- * @param m32 The second element of the third row.
- * @param m33 The third element of the third row.
- * @param m34 The fourth element of the third row.
- * @param m41 The first element of the fourth row.
- * @param m42 The second element of the fourth row.
- * @param m43 The third element of the fourth row.
- * @param m44 The fourth element of the fourth row.
- */
- Mat4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24,
- float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44);
- /**
- * Creates a matrix initialized to the specified column-major array.
- *
- * The passed-in array is in column-major order, so the memory layout of the array is as follows:
- *
- * 0 4 8 12
- * 1 5 9 13
- * 2 6 10 14
- * 3 7 11 15
- *
- * @param mat An array containing 16 elements in column-major order.
- */
- Mat4(const float* mat);
- /**
- * Constructs a new matrix by copying the values from the specified matrix.
- *
- * @param copy The matrix to copy.
- */
- Mat4(const Mat4& copy);
- /**
- * Destructor.
- */
- ~Mat4();
-
- /* --- --- --- --- Add by QY --- --- --- --- */
- float& Get (int row, int column) { return m[row + (column*4)]; }
- const float& Get (int row, int column)const { return m[row + (column*4)]; }
-
- inline Vec3 GetPosition() const {
- return Vec3( Get(0,3), Get(1,3), Get(2,3) );
- }
-
- void SetTR (const Vec3& pos, const Quaternion& q);
-
-
- static bool Invert_General3D( const Mat4 &inM, Mat4 &outM ) {
- return InvertMatrix4x4_General3D( inM.m, outM.m );
- }
- /* --- --- --- --- --- --- --- --- --- --- */
- /* --- --- --- --- Add by XuJJ start --- --- --- --- */
- Vec3 MultiplyPoint3 (const Vec3& inV) const;
- void MultiplyPoint3 (const Vec3& inV, Vec3& output) const;
- Vec3 MultiplyVector3 (const Vec3& inV) const;
- void MultiplyVector3 (const Vec3& inV, Vec3& output) const;
- void SetPosition( const Vec3& v );
- /* --- --- --- --- Add by XuJJ end --- --- --- --- */
- /**
- * Creates a view matrix based on the specified input parameters.
- *
- * @param eyePosition The eye position.
- * @param targetPosition The target's center position.
- * @param up The up vector.
- * @param dst A matrix to store the result in.
- */
- static void createLookAt(const Vec3& eyePosition, const Vec3& targetPosition, const Vec3& up, Mat4* dst);
- /**
- * Creates a view matrix based on the specified input parameters.
- *
- * @param eyePositionX The eye x-coordinate position.
- * @param eyePositionY The eye y-coordinate position.
- * @param eyePositionZ The eye z-coordinate position.
- * @param targetCenterX The target's center x-coordinate position.
- * @param targetCenterY The target's center y-coordinate position.
- * @param targetCenterZ The target's center z-coordinate position.
- * @param upX The up vector x-coordinate value.
- * @param upY The up vector y-coordinate value.
- * @param upZ The up vector z-coordinate value.
- * @param dst A matrix to store the result in.
- */
- static void createLookAt(float eyePositionX, float eyePositionY, float eyePositionZ,
- float targetCenterX, float targetCenterY, float targetCenterZ,
- float upX, float upY, float upZ, Mat4* dst);
- /**
- * Builds a perspective projection matrix based on a field of view and returns by value.
- *
- * Projection space refers to the space after applying projection transformation from view space.
- * After the projection transformation, visible content has x- and y-coordinates ranging from -1 to 1,
- * and a z-coordinate ranging from 0 to 1. To obtain the viewable area (in world space) of a scene,
- * create a BoundingFrustum and pass the combined view and projection matrix to the constructor.
- *
- * @param fieldOfView The field of view in the y direction (in degrees).
- * @param aspectRatio The aspect ratio, defined as view space width divided by height.
- * @param zNearPlane The distance to the near view plane.
- * @param zFarPlane The distance to the far view plane.
- * @param dst A matrix to store the result in.
- */
- static void createPerspective(float fieldOfView, float aspectRatio, float zNearPlane, float zFarPlane, Mat4* dst);
- /**
- * Creates an orthographic projection matrix.
- *
- * @param width The width of the view.
- * @param height The height of the view.
- * @param zNearPlane The minimum z-value of the view volume.
- * @param zFarPlane The maximum z-value of the view volume.
- * @param dst A matrix to store the result in.
- */
- static void createOrthographic(float width, float height, float zNearPlane, float zFarPlane, Mat4* dst);
- /**
- * Creates an orthographic projection matrix.
- *
- * Projection space refers to the space after applying
- * projection transformation from view space. After the
- * projection transformation, visible content has
- * x and y coordinates ranging from -1 to 1, and z coordinates
- * ranging from 0 to 1.
- *
- * Unlike perspective projection, in orthographic projection
- * there is no perspective foreshortening.
- *
- * The viewable area of this orthographic projection extends
- * from left to right on the x-axis, bottom to top on the y-axis,
- * and zNearPlane to zFarPlane on the z-axis. These values are
- * relative to the position and x, y, and z-axes of the view.
- * To obtain the viewable area (in world space) of a scene,
- * create a BoundingFrustum and pass the combined view and
- * projection matrix to the constructor.
- *
- * @param left The minimum x-value of the view volume.
- * @param right The maximum x-value of the view volume.
- * @param bottom The minimum y-value of the view volume.
- * @param top The maximum y-value of the view volume.
- * @param zNearPlane The minimum z-value of the view volume.
- * @param zFarPlane The maximum z-value of the view volume.
- * @param dst A matrix to store the result in.
- */
- static void createOrthographicOffCenter(float left, float right, float bottom, float top,
- float zNearPlane, float zFarPlane, Mat4* dst);
- /**
- * Creates a spherical billboard that rotates around a specified object position.
- *
- * This method computes the facing direction of the billboard from the object position
- * and camera position. When the object and camera positions are too close, the matrix
- * will not be accurate. To avoid this problem, this method defaults to the identity
- * rotation if the positions are too close. (See the other overload of createBillboard
- * for an alternative approach).
- *
- * @param objectPosition The position of the object the billboard will rotate around.
- * @param cameraPosition The position of the camera.
- * @param cameraUpVector The up vector of the camera.
- * @param dst A matrix to store the result in.
- */
- static void createBillboard(const Vec3& objectPosition, const Vec3& cameraPosition,
- const Vec3& cameraUpVector, Mat4* dst);
- /**
- * Creates a spherical billboard that rotates around a specified object position with
- * provision for a safe default orientation.
- *
- * This method computes the facing direction of the billboard from the object position
- * and camera position. When the object and camera positions are too close, the matrix
- * will not be accurate. To avoid this problem, this method uses the specified camera
- * forward vector if the positions are too close. (See the other overload of createBillboard
- * for an alternative approach).
- *
- * @param objectPosition The position of the object the billboard will rotate around.
- * @param cameraPosition The position of the camera.
- * @param cameraUpVector The up vector of the camera.
- * @param cameraForwardVector The forward vector of the camera, used if the positions are too close.
- * @param dst A matrix to store the result in.
- */
- static void createBillboard(const Vec3& objectPosition, const Vec3& cameraPosition,
- const Vec3& cameraUpVector, const Vec3& cameraForwardVector,
- Mat4* dst);
- //Fills in an existing Mat4 so that it reflects the coordinate system about a specified Plane.
- //plane The Plane about which to create a reflection.
- //dst A matrix to store the result in.
- //static void createReflection(const Plane& plane, Mat4* dst);
- /**
- * Creates a scale matrix.
- *
- * @param scale The amount to scale.
- * @param dst A matrix to store the result in.
- */
- static void createScale(const Vec3& scale, Mat4* dst);
- /**
- * Creates a scale matrix.
- *
- * @param xScale The amount to scale along the x-axis.
- * @param yScale The amount to scale along the y-axis.
- * @param zScale The amount to scale along the z-axis.
- * @param dst A matrix to store the result in.
- */
- static void createScale(float xScale, float yScale, float zScale, Mat4* dst);
- /**
- * Creates a rotation matrix from the specified quaternion.
- *
- * @param quat A quaternion describing a 3D orientation.
- * @param dst A matrix to store the result in.
- */
- static void createRotation(const Quaternion& quat, Mat4* dst);
- /**
- * Creates a rotation matrix from the specified axis and angle.
- *
- * @param axis A vector describing the axis to rotate about.
- * @param angle The angle (in radians).
- * @param dst A matrix to store the result in.
- */
- static void createRotation(const Vec3& axis, float angle, Mat4* dst);
- /**
- * Creates a matrix describing a rotation around the x-axis.
- *
- * @param angle The angle of rotation (in radians).
- * @param dst A matrix to store the result in.
- */
- static void createRotationX(float angle, Mat4* dst);
- /**
- * Creates a matrix describing a rotation around the y-axis.
- *
- * @param angle The angle of rotation (in radians).
- * @param dst A matrix to store the result in.
- */
- static void createRotationY(float angle, Mat4* dst);
- /**
- * Creates a matrix describing a rotation around the z-axis.
- *
- * @param angle The angle of rotation (in radians).
- * @param dst A matrix to store the result in.
- */
- static void createRotationZ(float angle, Mat4* dst);
- /**
- * Creates a translation matrix.
- *
- * @param translation The translation.
- * @param dst A matrix to store the result in.
- */
- static void createTranslation(const Vec3& translation, Mat4* dst);
- /**
- * Creates a translation matrix.
- *
- * @param xTranslation The translation on the x-axis.
- * @param yTranslation The translation on the y-axis.
- * @param zTranslation The translation on the z-axis.
- * @param dst A matrix to store the result in.
- */
- static void createTranslation(float xTranslation, float yTranslation, float zTranslation, Mat4* dst);
- /**
- * Adds a scalar value to each component of this matrix.
- *
- * @param scalar The scalar to add.
- */
- void add(float scalar);
- /**
- * Adds a scalar value to each component of this matrix and stores the result in dst.
- *
- * @param scalar The scalar value to add.
- * @param dst A matrix to store the result in.
- */
- void add(float scalar, Mat4* dst);
- /**
- * Adds the specified matrix to this matrix.
- *
- * @param mat The matrix to add.
- */
- void add(const Mat4& mat);
- /**
- * Adds the specified matrices and stores the result in dst.
- *
- * @param m1 The first matrix.
- * @param m2 The second matrix.
- * @param dst The destination matrix to add to.
- */
- static void add(const Mat4& m1, const Mat4& m2, Mat4* dst);
- /**
- * Decomposes the scale, rotation and translation components of this matrix.
- *
- * @param scale The scale.
- * @param rotation The rotation.
- * @param translation The translation.
- */
- bool decompose(Vec3* scale, Quaternion* rotation, Vec3* translation) const;
- /**
- * Computes the determinant of this matrix.
- *
- * @return The determinant.
- */
- float determinant() const;
- /**
- * Gets the scalar component of this matrix in the specified vector.
- *
- * If the scalar component of this matrix has negative parts,
- * it is not possible to always extract the exact scalar component;
- * instead, a scale vector that is mathematically equivalent to the
- * original scale vector is extracted and returned.
- *
- * @param scale A vector to receive the scale.
- */
- void getScale(Vec3* scale) const;
- /**
- * Gets the rotational component of this matrix in the specified quaternion.
- *
- * @param rotation A quaternion to receive the rotation.
- *
- * @return true if the rotation is successfully extracted, false otherwise.
- */
- bool getRotation(Quaternion* rotation) const;
- /**
- * Gets the translational component of this matrix in the specified vector.
- *
- * @param translation A vector to receive the translation.
- */
- void getTranslation(Vec3* translation) const;
- /**
- * Gets the up vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getUpVector(Vec3* dst) const;
- /**
- * Gets the down vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getDownVector(Vec3* dst) const;
- /**
- * Gets the left vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getLeftVector(Vec3* dst) const;
- /**
- * Gets the right vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getRightVector(Vec3* dst) const;
- /**
- * Gets the forward vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getForwardVector(Vec3* dst) const;
- /**
- * Gets the backward vector of this matrix.
- *
- * @param dst The destination vector.
- */
- void getBackVector(Vec3* dst) const;
- /**
- * Inverts this matrix.
- *
- * @return true if the matrix can be inverted, false otherwise.
- */
- bool inverse();
- /**
- * Get the inversed matrix.
- */
- Mat4 getInversed() const;
- /**
- * Determines if this matrix is equal to the identity matrix.
- *
- * @return true if the matrix is an identity matrix, false otherwise.
- */
- bool isIdentity() const;
- /**
- * Multiplies the components of this matrix by the specified scalar.
- *
- * @param scalar The scalar value.
- */
- void multiply(float scalar);
- /**
- * Multiplies the components of this matrix by a scalar and stores the result in dst.
- *
- * @param scalar The scalar value.
- * @param dst A matrix to store the result in.
- */
- void multiply(float scalar, Mat4* dst) const;
- /**
- * Multiplies the components of the specified matrix by a scalar and stores the result in dst.
- *
- * @param mat The matrix.
- * @param scalar The scalar value.
- * @param dst A matrix to store the result in.
- */
- static void multiply(const Mat4& mat, float scalar, Mat4* dst);
- /**
- * Multiplies this matrix by the specified one.
- *
- * @param mat The matrix to multiply.
- */
- void multiply(const Mat4& mat);
- /**
- * Multiplies m1 by m2 and stores the result in dst.
- *
- * @param m1 The first matrix to multiply.
- * @param m2 The second matrix to multiply.
- * @param dst A matrix to store the result in.
- */
- static void multiply(const Mat4& m1, const Mat4& m2, Mat4* dst);
- /**
- * Negates this matrix.
- */
- void negate();
- /**
- Get the Negated matrix.
- */
- Mat4 getNegated() const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified quaternion rotation.
- *
- * @param q The quaternion to rotate by.
- */
- void rotate(const Quaternion& q);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified quaternion rotation and stores the result in dst.
- *
- * @param q The quaternion to rotate by.
- * @param dst A matrix to store the result in.
- */
- void rotate(const Quaternion& q, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation about the specified axis.
- *
- * @param axis The axis to rotate about.
- * @param angle The angle (in radians).
- */
- void rotate(const Vec3& axis, float angle);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the specified
- * rotation about the specified axis and stores the result in dst.
- *
- * @param axis The axis to rotate about.
- * @param angle The angle (in radians).
- * @param dst A matrix to store the result in.
- */
- void rotate(const Vec3& axis, float angle, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the x-axis.
- *
- * @param angle The angle (in radians).
- */
- void rotateX(float angle);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the x-axis and stores the result in dst.
- *
- * @param angle The angle (in radians).
- * @param dst A matrix to store the result in.
- */
- void rotateX(float angle, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the y-axis.
- *
- * @param angle The angle (in radians).
- */
- void rotateY(float angle);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the y-axis and stores the result in dst.
- *
- * @param angle The angle (in radians).
- * @param dst A matrix to store the result in.
- */
- void rotateY(float angle, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the z-axis.
- *
- * @param angle The angle (in radians).
- */
- void rotateZ(float angle);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified rotation around the z-axis and stores the result in dst.
- *
- * @param angle The angle (in radians).
- * @param dst A matrix to store the result in.
- */
- void rotateZ(float angle, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation.
- *
- * @param value The amount to scale along all axes.
- */
- void scale(float value);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation and stores the result in dst.
- *
- * @param value The amount to scale along all axes.
- * @param dst A matrix to store the result in.
- */
- void scale(float value, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation.
- *
- * @param xScale The amount to scale along the x-axis.
- * @param yScale The amount to scale along the y-axis.
- * @param zScale The amount to scale along the z-axis.
- */
- void scale(float xScale, float yScale, float zScale);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation and stores the result in dst.
- *
- * @param xScale The amount to scale along the x-axis.
- * @param yScale The amount to scale along the y-axis.
- * @param zScale The amount to scale along the z-axis.
- * @param dst A matrix to store the result in.
- */
- void scale(float xScale, float yScale, float zScale, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation.
- *
- * @param s The scale values along the x, y and z axes.
- */
- void scale(const Vec3& s);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified scale transformation and stores the result in dst.
- *
- * @param s The scale values along the x, y and z axes.
- * @param dst A matrix to store the result in.
- */
- void scale(const Vec3& s, Mat4* dst) const;
- /**
- * Sets the values of this matrix.
- *
- * @param m11 The first element of the first row.
- * @param m12 The second element of the first row.
- * @param m13 The third element of the first row.
- * @param m14 The fourth element of the first row.
- * @param m21 The first element of the second row.
- * @param m22 The second element of the second row.
- * @param m23 The third element of the second row.
- * @param m24 The fourth element of the second row.
- * @param m31 The first element of the third row.
- * @param m32 The second element of the third row.
- * @param m33 The third element of the third row.
- * @param m34 The fourth element of the third row.
- * @param m41 The first element of the fourth row.
- * @param m42 The second element of the fourth row.
- * @param m43 The third element of the fourth row.
- * @param m44 The fourth element of the fourth row.
- */
- void set(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24,
- float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44);
- /**
- * Sets the values of this matrix to those in the specified column-major array.
- *
- * @param mat An array containing 16 elements in column-major format.
- */
- void set(const float* mat);
- /**
- * Sets the values of this matrix to those of the specified matrix.
- *
- * @param mat The source matrix.
- */
- void set(const Mat4& mat);
- /**
- * Sets this matrix to the identity matrix.
- */
- void setIdentity();
- /**
- * Sets all elements of the current matrix to zero.
- */
- void setZero();
- /**
- * Subtracts the specified matrix from the current matrix.
- *
- * @param mat The matrix to subtract.
- */
- void subtract(const Mat4& mat);
- /**
- * Subtracts the specified matrix from the current matrix.
- *
- * @param m1 The first matrix.
- * @param m2 The second matrix.
- * @param dst A matrix to store the result in.
- */
- static void subtract(const Mat4& m1, const Mat4& m2, Mat4* dst);
-
- static Mat4 lookat(Vec3 eye, Vec3 target, Vec3 up);
- /**
- * Transforms the specified point by this matrix.
- *
- * The result of the transformation is stored directly into point.
- *
- * @param point The point to transform and also a vector to hold the result in.
- */
- inline void transformPoint(Vec3* point) const { GP_ASSERT(point); transformVector(point->x, point->y, point->z, 1.0f, point); }
- /**
- * Transforms the specified point by this matrix, and stores
- * the result in dst.
- *
- * @param point The point to transform.
- * @param dst A vector to store the transformed point in.
- */
- inline void transformPoint(const Vec3& point, Vec3* dst) const { GP_ASSERT(dst); transformVector(point.x, point.y, point.z, 1.0f, dst); }
- /**
- * Transforms the specified vector by this matrix by
- * treating the fourth (w) coordinate as zero.
- *
- * The result of the transformation is stored directly into vector.
- *
- * @param vector The vector to transform and also a vector to hold the result in.
- */
- void transformVector(Vec3* vector) const;
- /**
- * Transforms the specified vector by this matrix by
- * treating the fourth (w) coordinate as zero, and stores the
- * result in dst.
- *
- * @param vector The vector to transform.
- * @param dst A vector to store the transformed vector in.
- */
- void transformVector(const Vec3& vector, Vec3* dst) const;
- /**
- * Transforms the specified vector by this matrix.
- *
- * @param x The vector x-coordinate to transform by.
- * @param y The vector y-coordinate to transform by.
- * @param z The vector z-coordinate to transform by.
- * @param w The vector w-coordinate to transform by.
- * @param dst A vector to store the transformed point in.
- */
- void transformVector(float x, float y, float z, float w, Vec3* dst) const;
- /**
- * Transforms the specified vector by this matrix.
- *
- * The result of the transformation is stored directly into vector.
- *
- * @param vector The vector to transform.
- */
- void transformVector(Vec4* vector) const;
- /**
- * Transforms the specified vector by this matrix.
- *
- * @param vector The vector to transform.
- * @param dst A vector to store the transformed point in.
- */
- void transformVector(const Vec4& vector, Vec4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified translation.
- *
- * @param x The amount to translate along the x-axis.
- * @param y The amount to translate along the y-axis.
- * @param z The amount to translate along the z-axis.
- */
- void translate(float x, float y, float z);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified translation and stores the result in dst.
- *
- * @param x The amount to translate along the x-axis.
- * @param y The amount to translate along the y-axis.
- * @param z The amount to translate along the z-axis.
- * @param dst A matrix to store the result in.
- */
- void translate(float x, float y, float z, Mat4* dst) const;
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified translation.
- *
- * @param t The translation values along the x, y and z axes.
- */
- void translate(const Vec3& t);
- /**
- * Post-multiplies this matrix by the matrix corresponding to the
- * specified translation and stores the result in dst.
- *
- * @param t The translation values along the x, y and z axes.
- * @param dst A matrix to store the result in.
- */
- void translate(const Vec3& t, Mat4* dst) const;
- /**
- * Transposes this matrix.
- */
- void transpose();
- /**
- * Get the Transposed matrix.
- */
- Mat4 getTransposed() const;
- /**
- * Calculates the sum of this matrix with the given matrix.
- *
- * Note: this does not modify this matrix.
- *
- * @param mat The matrix to add.
- * @return The matrix sum.
- */
- inline Mat4 operator+(const Mat4& mat) const;
-
- /**
- * Adds the given matrix to this matrix.
- *
- * @param mat The matrix to add.
- * @return This matrix, after the addition occurs.
- */
- inline Mat4& operator+=(const Mat4& mat);
- /**
- * Calculates the difference of this matrix with the given matrix.
- *
- * Note: this does not modify this matrix.
- *
- * @param mat The matrix to subtract.
- * @return The matrix difference.
- */
- inline Mat4 operator-(const Mat4& mat) const;
- /**
- * Subtracts the given matrix from this matrix.
- *
- * @param mat The matrix to subtract.
- * @return This matrix, after the subtraction occurs.
- */
- inline Mat4& operator-=(const Mat4& mat);
- /**
- * Calculates the negation of this matrix.
- *
- * Note: this does not modify this matrix.
- *
- * @return The negation of this matrix.
- */
- inline Mat4 operator-() const;
- /**
- * Calculates the matrix product of this matrix with the given matrix.
- *
- * Note: this does not modify this matrix.
- *
- * @param mat The matrix to multiply by.
- * @return The matrix product.
- */
- inline Mat4 operator*(const Mat4& mat) const;
- /**
- * Right-multiplies this matrix by the given matrix.
- *
- * @param mat The matrix to multiply by.
- * @return This matrix, after the multiplication occurs.
- */
- inline Mat4& operator*=(const Mat4& mat);
- /** equals to a matrix full of zeros */
- static const Mat4 ZERO;
- /** equals to the identity matrix */
- static const Mat4 IDENTITY;
- private:
- static void createBillboardHelper(const Vec3& objectPosition, const Vec3& cameraPosition,
- const Vec3& cameraUpVector, const Vec3* cameraForwardVector,
- Mat4* dst);
- };
- /**
- * Transforms the given vector by the given matrix.
- *
- * Note: this treats the given vector as a vector and not as a point.
- *
- * @param v The vector to transform.
- * @param m The matrix to transform by.
- * @return This vector, after the transformation occurs.
- */
- inline Vec3& operator*=(Vec3& v, const Mat4& m);
- /**
- * Transforms the given vector by the given matrix.
- *
- * Note: this treats the given vector as a vector and not as a point.
- *
- * @param m The matrix to transform by.
- * @param v The vector to transform.
- * @return The resulting transformed vector.
- */
- inline Vec3 operator*(const Mat4& m, const Vec3& v);
- /**
- * Transforms the given vector by the given matrix.
- *
- * Note: this treats the given vector as a vector and not as a point.
- *
- * @param v The vector to transform.
- * @param m The matrix to transform by.
- * @return This vector, after the transformation occurs.
- */
- inline Vec4& operator*=(Vec4& v, const Mat4& m);
- /**
- * Transforms the given vector by the given matrix.
- *
- * Note: this treats the given vector as a vector and not as a point.
- *
- * @param m The matrix to transform by.
- * @param v The vector to transform.
- * @return The resulting transformed vector.
- */
- inline Vec4 operator*(const Mat4& m, const Vec4& v);
- void MultiplyMatrices3x4( const Mat4& lhs, const Mat4& rhs, Mat4& res);
- NS_CC_MATH_END
- /**
- end of base group
- @}
- */
- #include "math/Mat4.inl"
- #endif // MATH_MAT4_H
|