summaryrefslogtreecommitdiff
path: root/src/rmath.c
diff options
context:
space:
mode:
authorjussi2024-11-21 14:54:10 +0200
committerjussi2024-11-21 14:54:10 +0200
commit3d5eeac3d7e73a71cd476afed556e76fd9b5fe07 (patch)
treea518e6c69c64f35183011054ef35d2f86492cf94 /src/rmath.c
parent6317547502e547de399b6d391be1947567a16a0a (diff)
downloadreilua-enhanced-3d5eeac3d7e73a71cd476afed556e76fd9b5fe07.tar.gz
reilua-enhanced-3d5eeac3d7e73a71cd476afed556e76fd9b5fe07.tar.bz2
reilua-enhanced-3d5eeac3d7e73a71cd476afed556e76fd9b5fe07.zip
New raylib 5.5 raymath functions.
Diffstat (limited to 'src/rmath.c')
-rw-r--r--src/rmath.c480
1 files changed, 480 insertions, 0 deletions
diff --git a/src/rmath.c b/src/rmath.c
index 15d5323..40e8cb8 100644
--- a/src/rmath.c
+++ b/src/rmath.c
@@ -483,6 +483,38 @@ int lmathVector2Reflect( lua_State* L ) {
}
/*
+> result = RL.Vector2Min( Vector2 v1, Vector2 v2 )
+
+Get min value for each pair of components
+
+- Success return Vector2
+*/
+int lmathVector2Min( lua_State* L ) {
+ Vector2 v1 = uluaGetVector2( L, 1 );
+ Vector2 v2 = uluaGetVector2( L, 2 );
+
+ uluaPushVector2( L, Vector2Min( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector2Max( Vector2 v1, Vector2 v2 )
+
+Get max value for each pair of components
+
+- Success return Vector2
+*/
+int lmathVector2Max( lua_State* L ) {
+ Vector2 v1 = uluaGetVector2( L, 1 );
+ Vector2 v2 = uluaGetVector2( L, 2 );
+
+ uluaPushVector2( L, Vector2Max( v1, v2 ) );
+
+ return 1;
+}
+
+/*
> result = RL.Vector2Rotate( Vector2 v, float angle )
Rotate vector by angle
@@ -582,6 +614,27 @@ int lmathVector2Equals( lua_State* L ) {
}
/*
+> result = RL.Vector2Refract( Vector2 v, Vector2 n, float r )
+
+Compute the direction of a refracted ray
+v: normalized direction of the incoming ray
+n: normalized normal vector of the interface of two optical media
+r: ratio of the refractive index of the medium from where the ray comes
+ to the refractive index of the medium on the other side of the surface
+
+- Success return Vector2
+*/
+int lmathVector2Refract( lua_State* L ) {
+ Vector2 v = uluaGetVector2( L, 1 );
+ Vector2 n = uluaGetVector2( L, 2 );
+ float r = luaL_checknumber( L, 3 );
+
+ uluaPushVector2( L, Vector2Refract( v, n, r ) );
+
+ return 1;
+}
+
+/*
## Math - Vector 3
*/
@@ -980,6 +1033,23 @@ int lmathVector3RotateByAxisAngle( lua_State* L ) {
}
/*
+> result = RL.Vector3MoveTowards( Vector3 v, Vector3 target, float maxDistance )
+
+Move Vector towards target
+
+- Success return Vector3
+*/
+int lmathVector3MoveTowards( lua_State* L ) {
+ Vector3 v = uluaGetVector3( L, 1 );
+ Vector3 target = uluaGetVector3( L, 2 );
+ float maxDistance = luaL_checknumber( L, 3 );
+
+ uluaPushVector3( L, Vector3MoveTowards( v, target, maxDistance ) );
+
+ return 1;
+}
+
+/*
> result = RL.Vector3Lerp( Vector3 v1, Vector3 v2, float amount )
Calculate linear interpolation between two vectors
@@ -997,6 +1067,26 @@ int lmathVector3Lerp( lua_State* L ) {
}
/*
+> result = RL.Vector3CubicHermite( Vector3 v1, Vector3 tangent1, Vector3 v2, Vector3 tangent2, float amount )
+
+Calculate cubic hermite interpolation between two vectors and their tangents
+as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic
+
+- Success return Vector3
+*/
+int lmathVector3CubicHermite( lua_State* L ) {
+ Vector3 v1 = uluaGetVector3( L, 1 );
+ Vector3 tangent1 = uluaGetVector3( L, 2 );
+ Vector3 v2 = uluaGetVector3( L, 3 );
+ Vector3 tangent2 = uluaGetVector3( L, 4 );
+ float amount = luaL_checknumber( L, 5 );
+
+ uluaPushVector3( L, Vector3CubicHermite( v1, tangent1, v2, tangent2, amount ) );
+
+ return 1;
+}
+
+/*
> result = RL.Vector3Reflect( Vector3 v, Vector3 normal )
Calculate reflected vector to normal
@@ -1170,6 +1260,353 @@ int lmathVector3Refract( lua_State* L ) {
}
/*
+## Math - Vector4
+*/
+
+/*
+> result = RL.Vector4Zero()
+
+Vector with components value 0.0f
+
+- Success return Vector4
+*/
+int lmathVector4Zero( lua_State* L ) {
+ uluaPushVector4( L, Vector4Zero() );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4One()
+
+Vector with components value 1.0f
+
+- Success return Vector4
+*/
+int lmathVector4One( lua_State* L ) {
+ uluaPushVector4( L, Vector4One() );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Add( Vector4 v1, Vector4 v2 )
+
+Add two vectors
+
+- Success return Vector4
+*/
+int lmathVector4Add( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Add( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4AddValue( Vector4 v, float add )
+
+Add vector and float value
+
+- Success return Vector4
+*/
+int lmathVector4AddValue( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+ float add = luaL_checknumber( L, 2 );
+
+ uluaPushVector4( L, Vector4AddValue( v, add ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Subtract( Vector4 v1, Vector4 v2 )
+
+Subtract two vectors
+
+- Success return Vector4
+*/
+int lmathVector4Subtract( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Subtract( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4SubtractValue( Vector4 v, float sub )
+
+Subtract vector by float value
+
+- Success return Vector4
+*/
+int lmathVector4SubtractValue( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+ float sub = luaL_checknumber( L, 2 );
+
+ uluaPushVector4( L, Vector4SubtractValue( v, sub ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Length( Vector4 v )
+
+Calculate vector length
+
+- Success return float
+*/
+int lmathVector4Length( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+
+ lua_pushnumber( L, Vector4Length( v ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4LengthSqr( Vector4 v )
+
+Calculate vector square length
+
+- Success return float
+*/
+int lmathVector4LengthSqr( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+
+ lua_pushnumber( L, Vector4LengthSqr( v ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4DotProduct( Vector4 v1, Vector4 v2 )
+
+Calculate two vectors dot product
+
+- Success return float
+*/
+int lmathVector4DotProduct( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ lua_pushnumber( L, Vector4DotProduct( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Distance( Vector4 v1, Vector4 v2 )
+
+Calculate distance between two vectors
+
+- Success return float
+*/
+int lmathVector4Distance( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ lua_pushnumber( L, Vector4Distance( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4DistanceSqr( Vector4 v1, Vector4 v2 )
+
+Calculate square distance between two vectors
+
+- Success return float
+*/
+int lmathVector4DistanceSqr( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ lua_pushnumber( L, Vector4DistanceSqr( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Scale( Vector4 v, float scalar )
+
+Multiply vector by scalar
+
+- Success return Vector4
+*/
+int lmathVector4Scale( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+ float scalar = luaL_checknumber( L, 2 );
+
+ uluaPushVector4( L, Vector4Scale( v, scalar ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Multiply( Vector4 v1, Vector4 v2 )
+
+Multiply vector by vector
+
+- Success return Vector4
+*/
+int lmathVector4Multiply( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Multiply( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Negate( Vector4 v )
+
+Negate provided vector (invert direction)
+
+- Success return Vector4
+*/
+int lmathVector4Negate( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+
+ uluaPushVector4( L, Vector4Negate( v ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Divide( Vector4 v1, Vector4 v2 )
+
+Divide vector by vector
+
+- Success return Vector4
+*/
+int lmathVector4Divide( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Divide( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Normalize( Vector4 v )
+
+Normalize provided vector
+
+- Success return Vector4
+*/
+int lmathVector4Normalize( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+
+ uluaPushVector4( L, Vector4Normalize( v ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Min( Vector4 v1, Vector4 v2 )
+
+Get min value for each pair of components
+
+- Success return Vector4
+*/
+int lmathVector4Min( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Min( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Max( Vector4 v1, Vector4 v2 )
+
+Get max value for each pair of components
+
+- Success return Vector4
+*/
+int lmathVector4Max( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ uluaPushVector4( L, Vector4Max( v1, v2 ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Lerp( Vector4 v1, Vector4 v2, float amount )
+
+Calculate linear interpolation between two vectors
+
+- Success return Vector4
+*/
+int lmathVector4Lerp( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+ float amount = luaL_checknumber( L, 3 );
+
+ uluaPushVector4( L, Vector4Lerp( v1, v2, amount ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4MoveTowards( Vector4 v, Vector4 target, float maxDistance )
+
+Move Vector towards target
+
+- Success return Vector4
+*/
+int lmathVector4MoveTowards( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+ Vector4 target = uluaGetVector4( L, 2 );
+ float maxDistance = luaL_checknumber( L, 3 );
+
+ uluaPushVector4( L, Vector4MoveTowards( v, target, maxDistance ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Invert( Vector4 v )
+
+Invert the given vector
+
+- Success return Vector4
+*/
+int lmathVector4Invert( lua_State* L ) {
+ Vector4 v = uluaGetVector4( L, 1 );
+
+ uluaPushVector4( L, Vector4Invert( v ) );
+
+ return 1;
+}
+
+/*
+> result = RL.Vector4Equals( Vector4 v1, Vector4 v2 )
+
+Check whether two given vectors are almost equal
+
+- Success return bool
+*/
+int lmathVector4Equals( lua_State* L ) {
+ Vector4 v1 = uluaGetVector4( L, 1 );
+ Vector4 v2 = uluaGetVector4( L, 2 );
+
+ lua_pushboolean( L, Vector4Equals( v1, v2 ) == 1 );
+
+ return 1;
+}
+
+/*
## Math - Matrix
*/
@@ -1491,6 +1928,29 @@ int lmathMatrixLookAt( lua_State* L ) {
}
/*
+> translation, rotation, scale = RL.MatrixDecompose( Matrix mat )
+
+Decompose a transformation matrix into its rotational, translational and scaling components
+
+- Success return Vector3, Quaternion, Vector3
+*/
+int lmathMatrixDecompose( lua_State* L ) {
+ Matrix mat = uluaGetMatrix( L, 1 );
+
+ Vector3 translation = { 0 };
+ Quaternion rotation = { 0 };
+ Vector3 scale = { 0 };
+
+ MatrixDecompose( mat, &translation, &rotation, &scale );
+
+ uluaPushVector3( L, translation );
+ uluaPushQuaternion( L, rotation );
+ uluaPushVector3( L, scale );
+
+ return 3;
+}
+
+/*
## Math - Quaternion
*/
@@ -1716,6 +2176,26 @@ int lmathQuaternionSlerp( lua_State* L ) {
}
/*
+> result = RL.QuaternionCubicHermiteSpline( Quaternion q1, Quaternion outTangent1, Quaternion q2, Quaternion inTangent2, float t )
+
+Calculate quaternion cubic spline interpolation using Cubic Hermite Spline algorithm
+as described in the GLTF 2.0 specification: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#interpolation-cubic
+
+- Success return Quaternion
+*/
+int lmathQuaternionCubicHermiteSpline( lua_State* L ) {
+ Quaternion q1 = uluaGetQuaternion( L, 1 );
+ Quaternion outTangent1 = uluaGetQuaternion( L, 2 );
+ Quaternion q2 = uluaGetQuaternion( L, 3 );
+ Quaternion inTangent2 = uluaGetQuaternion( L, 4 );
+ float t = luaL_checknumber( L, 5 );
+
+ uluaPushQuaternion( L, QuaternionCubicHermiteSpline( q1, outTangent1, q2, inTangent2, t ) );
+
+ return 1;
+}
+
+/*
> result = RL.QuaternionFromVector3ToVector3( Vector3 from, Vector3 to )
Calculate quaternion based on the rotation from one vector to another