123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997 |
- /**
- 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
- */
- 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();
- /**
- * 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);
- /**
- * 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);
- NS_CC_MATH_END
- /**
- end of base group
- @}
- */
- #include "math/Mat4.inl"
- #endif // MATH_MAT4_H
|