|
@@ -0,0 +1,411 @@
|
|
|
+module raymath;
|
|
|
+
|
|
|
+import raylib;
|
|
|
+
|
|
|
+/**********************************************************************************************
|
|
|
+*
|
|
|
+* raymath v1.2 - Math functions to work with Vector3, Matrix and Quaternions
|
|
|
+*
|
|
|
+* CONFIGURATION:
|
|
|
+*
|
|
|
+* #define RAYMATH_IMPLEMENTATION
|
|
|
+* Generates the implementation of the library into the included file.
|
|
|
+* If not defined, the library is in header only mode and can be included in other headers
|
|
|
+* or source files without problems. But only ONE file should hold the implementation.
|
|
|
+*
|
|
|
+* #define RAYMATH_HEADER_ONLY
|
|
|
+* Define static inline functions code, so #include header suffices for use.
|
|
|
+* This may use up lots of memory.
|
|
|
+*
|
|
|
+* #define RAYMATH_STANDALONE
|
|
|
+* Avoid raylib.h header inclusion in this file.
|
|
|
+* Vector3 and Matrix data types are defined internally in raymath module.
|
|
|
+*
|
|
|
+*
|
|
|
+* LICENSE: zlib/libpng
|
|
|
+*
|
|
|
+* Copyright (c) 2015-2020 Ramon Santamaria (@raysan5)
|
|
|
+*
|
|
|
+* This software is provided "as-is", without any express or implied warranty. In no event
|
|
|
+* will the authors be held liable for any damages arising from the use of this software.
|
|
|
+*
|
|
|
+* Permission is granted to anyone to use this software for any purpose, including commercial
|
|
|
+* applications, and to alter it and redistribute it freely, subject to the following restrictions:
|
|
|
+*
|
|
|
+* 1. The origin of this software must not be misrepresented; you must not claim that you
|
|
|
+* wrote the original software. If you use this software in a product, an acknowledgment
|
|
|
+* in the product documentation would be appreciated but is not required.
|
|
|
+*
|
|
|
+* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
|
|
|
+* as being the original software.
|
|
|
+*
|
|
|
+* 3. This notice may not be removed or altered from any source distribution.
|
|
|
+*
|
|
|
+**********************************************************************************************/
|
|
|
+
|
|
|
+extern (C):
|
|
|
+
|
|
|
+//#define RAYMATH_STANDALONE // NOTE: To use raymath as standalone lib, just uncomment this line
|
|
|
+//#define RAYMATH_HEADER_ONLY // NOTE: To compile functions as static inline, uncomment this line
|
|
|
+
|
|
|
+// Required for structs: Vector3, Matrix
|
|
|
+
|
|
|
+// We are building raylib as a Win32 shared library (.dll).
|
|
|
+
|
|
|
+// We are using raylib as a Win32 shared library (.dll)
|
|
|
+
|
|
|
+// Provide external definition
|
|
|
+
|
|
|
+// Functions may be inlined, no external out-of-line definition
|
|
|
+
|
|
|
+// plain inline not supported by tinycc (See issue #435) // Functions may be inlined or external definition used
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Defines and Macros
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Return float vector for Matrix
|
|
|
+
|
|
|
+extern (D) auto MatrixToFloat(T)(auto ref T mat)
|
|
|
+{
|
|
|
+ return MatrixToFloatV(mat).v;
|
|
|
+}
|
|
|
+
|
|
|
+// Return float vector for Vector3
|
|
|
+
|
|
|
+extern (D) auto Vector3ToFloat(T)(auto ref T vec)
|
|
|
+{
|
|
|
+ return Vector3ToFloatV(vec).v;
|
|
|
+}
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Types and Structures Definition
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Vector2 type
|
|
|
+
|
|
|
+// Vector3 type
|
|
|
+
|
|
|
+// Quaternion type
|
|
|
+
|
|
|
+// Matrix type (OpenGL style 4x4 - right handed, column major)
|
|
|
+
|
|
|
+// NOTE: Helper types to be used instead of array return types for *ToFloat functions
|
|
|
+struct float3
|
|
|
+{
|
|
|
+ float[3] v;
|
|
|
+}
|
|
|
+
|
|
|
+struct float16
|
|
|
+{
|
|
|
+ float[16] v;
|
|
|
+}
|
|
|
+
|
|
|
+// Required for: sinf(), cosf(), sqrtf(), tan(), fabs()
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Module Functions Definition - Utils math
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Clamp float value
|
|
|
+float Clamp (float value, float min, float max);
|
|
|
+
|
|
|
+// Calculate linear interpolation between two floats
|
|
|
+float Lerp (float start, float end, float amount);
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Module Functions Definition - Vector2 math
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Vector with components value 0.0f
|
|
|
+Vector2 Vector2Zero ();
|
|
|
+
|
|
|
+// Vector with components value 1.0f
|
|
|
+Vector2 Vector2One ();
|
|
|
+
|
|
|
+// Add two vectors (v1 + v2)
|
|
|
+Vector2 Vector2Add (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Subtract two vectors (v1 - v2)
|
|
|
+Vector2 Vector2Subtract (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Calculate vector length
|
|
|
+float Vector2Length (Vector2 v);
|
|
|
+
|
|
|
+// Calculate two vectors dot product
|
|
|
+float Vector2DotProduct (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Calculate distance between two vectors
|
|
|
+float Vector2Distance (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Calculate angle from two vectors in X-axis
|
|
|
+float Vector2Angle (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Scale vector (multiply by value)
|
|
|
+Vector2 Vector2Scale (Vector2 v, float scale);
|
|
|
+
|
|
|
+// Multiply vector by vector
|
|
|
+Vector2 Vector2MultiplyV (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Negate vector
|
|
|
+Vector2 Vector2Negate (Vector2 v);
|
|
|
+
|
|
|
+// Divide vector by a float value
|
|
|
+Vector2 Vector2Divide (Vector2 v, float div);
|
|
|
+
|
|
|
+// Divide vector by vector
|
|
|
+Vector2 Vector2DivideV (Vector2 v1, Vector2 v2);
|
|
|
+
|
|
|
+// Normalize provided vector
|
|
|
+Vector2 Vector2Normalize (Vector2 v);
|
|
|
+
|
|
|
+// Calculate linear interpolation between two vectors
|
|
|
+Vector2 Vector2Lerp (Vector2 v1, Vector2 v2, float amount);
|
|
|
+
|
|
|
+// Rotate Vector by float in Degrees.
|
|
|
+Vector2 Vector2Rotate (Vector2 v, float degs);
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Module Functions Definition - Vector3 math
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Vector with components value 0.0f
|
|
|
+Vector3 Vector3Zero ();
|
|
|
+
|
|
|
+// Vector with components value 1.0f
|
|
|
+Vector3 Vector3One ();
|
|
|
+
|
|
|
+// Add two vectors
|
|
|
+Vector3 Vector3Add (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Subtract two vectors
|
|
|
+Vector3 Vector3Subtract (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Multiply vector by scalar
|
|
|
+Vector3 Vector3Scale (Vector3 v, float scalar);
|
|
|
+
|
|
|
+// Multiply vector by vector
|
|
|
+Vector3 Vector3Multiply (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Calculate two vectors cross product
|
|
|
+Vector3 Vector3CrossProduct (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Calculate one vector perpendicular vector
|
|
|
+Vector3 Vector3Perpendicular (Vector3 v);
|
|
|
+
|
|
|
+// Calculate vector length
|
|
|
+float Vector3Length (const Vector3 v);
|
|
|
+
|
|
|
+// Calculate two vectors dot product
|
|
|
+float Vector3DotProduct (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Calculate distance between two vectors
|
|
|
+float Vector3Distance (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Negate provided vector (invert direction)
|
|
|
+Vector3 Vector3Negate (Vector3 v);
|
|
|
+
|
|
|
+// Divide vector by a float value
|
|
|
+Vector3 Vector3Divide (Vector3 v, float div);
|
|
|
+
|
|
|
+// Divide vector by vector
|
|
|
+Vector3 Vector3DivideV (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Normalize provided vector
|
|
|
+Vector3 Vector3Normalize (Vector3 v);
|
|
|
+
|
|
|
+// Orthonormalize provided vectors
|
|
|
+// Makes vectors normalized and orthogonal to each other
|
|
|
+// Gram-Schmidt function implementation
|
|
|
+void Vector3OrthoNormalize (Vector3* v1, Vector3* v2);
|
|
|
+
|
|
|
+// Transforms a Vector3 by a given Matrix
|
|
|
+Vector3 Vector3Transform (Vector3 v, Matrix mat);
|
|
|
+
|
|
|
+// Transform a vector by quaternion rotation
|
|
|
+Vector3 Vector3RotateByQuaternion (Vector3 v, Quaternion q);
|
|
|
+
|
|
|
+// Calculate linear interpolation between two vectors
|
|
|
+Vector3 Vector3Lerp (Vector3 v1, Vector3 v2, float amount);
|
|
|
+
|
|
|
+// Calculate reflected vector to normal
|
|
|
+
|
|
|
+// I is the original vector
|
|
|
+// N is the normal of the incident plane
|
|
|
+// R = I - (2*N*( DotProduct[ I,N] ))
|
|
|
+Vector3 Vector3Reflect (Vector3 v, Vector3 normal);
|
|
|
+
|
|
|
+// Return min value for each pair of components
|
|
|
+Vector3 Vector3Min (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Return max value for each pair of components
|
|
|
+Vector3 Vector3Max (Vector3 v1, Vector3 v2);
|
|
|
+
|
|
|
+// Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c)
|
|
|
+// NOTE: Assumes P is on the plane of the triangle
|
|
|
+
|
|
|
+//Vector v0 = b - a, v1 = c - a, v2 = p - a;
|
|
|
+Vector3 Vector3Barycenter (Vector3 p, Vector3 a, Vector3 b, Vector3 c);
|
|
|
+
|
|
|
+// Returns Vector3 as float array
|
|
|
+float3 Vector3ToFloatV (Vector3 v);
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Module Functions Definition - Matrix math
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Compute matrix determinant
|
|
|
+
|
|
|
+// Cache the matrix values (speed optimization)
|
|
|
+float MatrixDeterminant (Matrix mat);
|
|
|
+
|
|
|
+// Returns the trace of the matrix (sum of the values along the diagonal)
|
|
|
+float MatrixTrace (Matrix mat);
|
|
|
+
|
|
|
+// Transposes provided matrix
|
|
|
+Matrix MatrixTranspose (Matrix mat);
|
|
|
+
|
|
|
+// Invert provided matrix
|
|
|
+
|
|
|
+// Cache the matrix values (speed optimization)
|
|
|
+
|
|
|
+// Calculate the invert determinant (inlined to avoid double-caching)
|
|
|
+Matrix MatrixInvert (Matrix mat);
|
|
|
+
|
|
|
+// Normalize provided matrix
|
|
|
+Matrix MatrixNormalize (Matrix mat);
|
|
|
+
|
|
|
+// Returns identity matrix
|
|
|
+Matrix MatrixIdentity ();
|
|
|
+
|
|
|
+// Add two matrices
|
|
|
+Matrix MatrixAdd (Matrix left, Matrix right);
|
|
|
+
|
|
|
+// Subtract two matrices (left - right)
|
|
|
+Matrix MatrixSubtract (Matrix left, Matrix right);
|
|
|
+
|
|
|
+// Returns translation matrix
|
|
|
+Matrix MatrixTranslate (float x, float y, float z);
|
|
|
+
|
|
|
+// Create rotation matrix from axis and angle
|
|
|
+// NOTE: Angle should be provided in radians
|
|
|
+Matrix MatrixRotate (Vector3 axis, float angle);
|
|
|
+
|
|
|
+// Returns xyz-rotation matrix (angles in radians)
|
|
|
+Matrix MatrixRotateXYZ (Vector3 ang);
|
|
|
+
|
|
|
+// Returns x-rotation matrix (angle in radians)
|
|
|
+Matrix MatrixRotateX (float angle);
|
|
|
+
|
|
|
+// Returns y-rotation matrix (angle in radians)
|
|
|
+Matrix MatrixRotateY (float angle);
|
|
|
+
|
|
|
+// Returns z-rotation matrix (angle in radians)
|
|
|
+Matrix MatrixRotateZ (float angle);
|
|
|
+
|
|
|
+// Returns scaling matrix
|
|
|
+Matrix MatrixScale (float x, float y, float z);
|
|
|
+
|
|
|
+// Returns two matrix multiplication
|
|
|
+// NOTE: When multiplying matrices... the order matters!
|
|
|
+Matrix MatrixMultiply (Matrix left, Matrix right);
|
|
|
+
|
|
|
+// Returns perspective projection matrix
|
|
|
+Matrix MatrixFrustum (
|
|
|
+ double left,
|
|
|
+ double right,
|
|
|
+ double bottom,
|
|
|
+ double top,
|
|
|
+ double near,
|
|
|
+ double far);
|
|
|
+
|
|
|
+// Returns perspective projection matrix
|
|
|
+// NOTE: Angle should be provided in radians
|
|
|
+Matrix MatrixPerspective (double fovy, double aspect, double near, double far);
|
|
|
+
|
|
|
+// Returns orthographic projection matrix
|
|
|
+Matrix MatrixOrtho (
|
|
|
+ double left,
|
|
|
+ double right,
|
|
|
+ double bottom,
|
|
|
+ double top,
|
|
|
+ double near,
|
|
|
+ double far);
|
|
|
+
|
|
|
+// Returns camera look-at matrix (view matrix)
|
|
|
+Matrix MatrixLookAt (Vector3 eye, Vector3 target, Vector3 up);
|
|
|
+
|
|
|
+// Returns float array of matrix data
|
|
|
+float16 MatrixToFloatV (Matrix mat);
|
|
|
+
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+// Module Functions Definition - Quaternion math
|
|
|
+//----------------------------------------------------------------------------------
|
|
|
+
|
|
|
+// Returns identity quaternion
|
|
|
+Quaternion QuaternionIdentity ();
|
|
|
+
|
|
|
+// Computes the length of a quaternion
|
|
|
+float QuaternionLength (Quaternion q);
|
|
|
+
|
|
|
+// Normalize provided quaternion
|
|
|
+Quaternion QuaternionNormalize (Quaternion q);
|
|
|
+
|
|
|
+// Invert provided quaternion
|
|
|
+Quaternion QuaternionInvert (Quaternion q);
|
|
|
+
|
|
|
+// Calculate two quaternion multiplication
|
|
|
+Quaternion QuaternionMultiply (Quaternion q1, Quaternion q2);
|
|
|
+
|
|
|
+// Calculate linear interpolation between two quaternions
|
|
|
+Quaternion QuaternionLerp (Quaternion q1, Quaternion q2, float amount);
|
|
|
+
|
|
|
+// Calculate slerp-optimized interpolation between two quaternions
|
|
|
+Quaternion QuaternionNlerp (Quaternion q1, Quaternion q2, float amount);
|
|
|
+
|
|
|
+// Calculates spherical linear interpolation between two quaternions
|
|
|
+Quaternion QuaternionSlerp (Quaternion q1, Quaternion q2, float amount);
|
|
|
+
|
|
|
+// Calculate quaternion based on the rotation from one vector to another
|
|
|
+
|
|
|
+// NOTE: Added QuaternioIdentity()
|
|
|
+
|
|
|
+// Normalize to essentially nlerp the original and identity to 0.5
|
|
|
+
|
|
|
+// Above lines are equivalent to:
|
|
|
+//Quaternion result = QuaternionNlerp(q, QuaternionIdentity(), 0.5f);
|
|
|
+Quaternion QuaternionFromVector3ToVector3 (Vector3 from, Vector3 to);
|
|
|
+
|
|
|
+// Returns a quaternion for a given rotation matrix
|
|
|
+Quaternion QuaternionFromMatrix (Matrix mat);
|
|
|
+
|
|
|
+// Returns a matrix for a given quaternion
|
|
|
+Matrix QuaternionToMatrix (Quaternion q);
|
|
|
+
|
|
|
+// Returns rotation quaternion for an angle and axis
|
|
|
+// NOTE: angle must be provided in radians
|
|
|
+Quaternion QuaternionFromAxisAngle (Vector3 axis, float angle);
|
|
|
+
|
|
|
+// Returns the rotation angle and axis for a given quaternion
|
|
|
+
|
|
|
+// This occurs when the angle is zero.
|
|
|
+// Not a problem: just set an arbitrary normalized axis.
|
|
|
+void QuaternionToAxisAngle (Quaternion q, Vector3* outAxis, float* outAngle);
|
|
|
+
|
|
|
+// Returns he quaternion equivalent to Euler angles
|
|
|
+Quaternion QuaternionFromEuler (float roll, float pitch, float yaw);
|
|
|
+
|
|
|
+// Return the Euler angles equivalent to quaternion (roll, pitch, yaw)
|
|
|
+// NOTE: Angles are returned in a Vector3 struct in degrees
|
|
|
+
|
|
|
+// roll (x-axis rotation)
|
|
|
+
|
|
|
+// pitch (y-axis rotation)
|
|
|
+
|
|
|
+// yaw (z-axis rotation)
|
|
|
+Vector3 QuaternionToEuler (Quaternion q);
|
|
|
+
|
|
|
+// Transform a quaternion given a transformation matrix
|
|
|
+Quaternion QuaternionTransform (Quaternion q, Matrix mat);
|
|
|
+
|
|
|
+// RAYMATH_H
|