From eb3ffd8e35839c23377db13d9b651c622250e07f Mon Sep 17 00:00:00 2001 From: Alexander Klingenbeck Date: Thu, 25 May 2023 07:57:23 +0200 Subject: [PATCH] Descriptions for math functions, extend readme --- bindings/raylib_math_api.json | 2 +- bindings/src/index.ts | 30 ++--- doc/auto-complete.png | Bin 0 -> 89319 bytes examples/bunnymark.js | 19 ++- examples/lib.raylib.d.ts | 239 +++++++++++++++++++--------------- generate-bindings.js | 25 ++-- readme.md | 27 +++- 7 files changed, 197 insertions(+), 145 deletions(-) create mode 100644 doc/auto-complete.png diff --git a/bindings/raylib_math_api.json b/bindings/raylib_math_api.json index 3cd9177..7dd1586 100644 --- a/bindings/raylib_math_api.json +++ b/bindings/raylib_math_api.json @@ -1 +1 @@ -[{"name":"Clamp","returnType":"float","params":[{"name":"value","type":"float"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":""},{"name":"Lerp","returnType":"float","params":[{"name":"start","type":"float"},{"name":"end","type":"float"},{"name":"amount","type":"float"}],"description":""},{"name":"Normalize","returnType":"float","params":[{"name":"value","type":"float"},{"name":"start","type":"float"},{"name":"end","type":"float"}],"description":""},{"name":"Remap","returnType":"float","params":[{"name":"value","type":"float"},{"name":"inputStart","type":"float"},{"name":"inputEnd","type":"float"},{"name":"outputStart","type":"float"},{"name":"outputEnd","type":"float"}],"description":""},{"name":"Wrap","returnType":"float","params":[{"name":"value","type":"float"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":""},{"name":"FloatEquals","returnType":"int","params":[{"name":"x","type":"float"},{"name":"y","type":"float"}],"description":""},{"name":"Vector2Zero","returnType":"Vector2","params":[],"description":""},{"name":"Vector2One","returnType":"Vector2","params":[],"description":""},{"name":"Vector2Add","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2AddValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"add","type":"float"}],"description":""},{"name":"Vector2Subtract","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2SubtractValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"sub","type":"float"}],"description":""},{"name":"Vector2Length","returnType":"float","params":[{"name":"v","type":"Vector2"}],"description":""},{"name":"Vector2LengthSqr","returnType":"float","params":[{"name":"v","type":"Vector2"}],"description":""},{"name":"Vector2DotProduct","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2Distance","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2DistanceSqr","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2Angle","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2LineAngle","returnType":"float","params":[{"name":"start","type":"Vector2"},{"name":"end","type":"Vector2"}],"description":""},{"name":"Vector2Scale","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"scale","type":"float"}],"description":""},{"name":"Vector2Multiply","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2Negate","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":""},{"name":"Vector2Divide","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":""},{"name":"Vector2Normalize","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":""},{"name":"Vector2Transform","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"mat","type":"Matrix"}],"description":""},{"name":"Vector2Lerp","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"},{"name":"amount","type":"float"}],"description":""},{"name":"Vector2Reflect","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"normal","type":"Vector2"}],"description":""},{"name":"Vector2Rotate","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"angle","type":"float"}],"description":""},{"name":"Vector2MoveTowards","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"target","type":"Vector2"},{"name":"maxDistance","type":"float"}],"description":""},{"name":"Vector2Invert","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":""},{"name":"Vector2Clamp","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"min","type":"Vector2"},{"name":"max","type":"Vector2"}],"description":""},{"name":"Vector2ClampValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":""},{"name":"Vector2Equals","returnType":"int","params":[{"name":"p","type":"Vector2"},{"name":"q","type":"Vector2"}],"description":""},{"name":"Vector3Zero","returnType":"Vector3","params":[],"description":""},{"name":"Vector3One","returnType":"Vector3","params":[],"description":""},{"name":"Vector3Add","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3AddValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"add","type":"float"}],"description":""},{"name":"Vector3Subtract","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3SubtractValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"sub","type":"float"}],"description":""},{"name":"Vector3Scale","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"scalar","type":"float"}],"description":""},{"name":"Vector3Multiply","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3CrossProduct","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Perpendicular","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":""},{"name":"Vector3Length","returnType":"float","params":[{"name":"v","type":"const Vector3"}],"description":""},{"name":"Vector3LengthSqr","returnType":"float","params":[{"name":"v","type":"const Vector3"}],"description":""},{"name":"Vector3DotProduct","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Distance","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3DistanceSqr","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Angle","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Negate","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":""},{"name":"Vector3Divide","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Normalize","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":""},{"name":"Vector3OrthoNormalize","returnType":"void","params":[{"name":"v1","type":"Vector3 *"},{"name":"v2","type":"Vector3 *"}],"description":""},{"name":"Vector3Transform","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"mat","type":"Matrix"}],"description":""},{"name":"Vector3RotateByQuaternion","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"q","type":"Quaternion"}],"description":""},{"name":"Vector3RotateByAxisAngle","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":""},{"name":"Vector3Lerp","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"},{"name":"amount","type":"float"}],"description":""},{"name":"Vector3Reflect","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"normal","type":"Vector3"}],"description":""},{"name":"Vector3Min","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Max","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":""},{"name":"Vector3Barycenter","returnType":"Vector3","params":[{"name":"p","type":"Vector3"},{"name":"a","type":"Vector3"},{"name":"b","type":"Vector3"},{"name":"c","type":"Vector3"}],"description":""},{"name":"Vector3Unproject","returnType":"Vector3","params":[{"name":"source","type":"Vector3"},{"name":"projection","type":"Matrix"},{"name":"view","type":"Matrix"}],"description":""},{"name":"Vector3ToFloatV","returnType":"float3","params":[{"name":"v","type":"Vector3"}],"description":""},{"name":"Vector3Invert","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":""},{"name":"Vector3Clamp","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"min","type":"Vector3"},{"name":"max","type":"Vector3"}],"description":""},{"name":"Vector3ClampValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":""},{"name":"Vector3Equals","returnType":"int","params":[{"name":"p","type":"Vector3"},{"name":"q","type":"Vector3"}],"description":""},{"name":"Vector3Refract","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"n","type":"Vector3"},{"name":"r","type":"float"}],"description":""},{"name":"MatrixDeterminant","returnType":"float","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"MatrixTrace","returnType":"float","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"MatrixTranspose","returnType":"Matrix","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"MatrixInvert","returnType":"Matrix","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"MatrixIdentity","returnType":"Matrix","params":[],"description":""},{"name":"MatrixAdd","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":""},{"name":"MatrixSubtract","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":""},{"name":"MatrixMultiply","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":""},{"name":"MatrixTranslate","returnType":"Matrix","params":[{"name":"x","type":"float"},{"name":"y","type":"float"},{"name":"z","type":"float"}],"description":""},{"name":"MatrixRotate","returnType":"Matrix","params":[{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":""},{"name":"MatrixRotateX","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":""},{"name":"MatrixRotateY","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":""},{"name":"MatrixRotateZ","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":""},{"name":"MatrixRotateXYZ","returnType":"Matrix","params":[{"name":"angle","type":"Vector3"}],"description":""},{"name":"MatrixRotateZYX","returnType":"Matrix","params":[{"name":"angle","type":"Vector3"}],"description":""},{"name":"MatrixScale","returnType":"Matrix","params":[{"name":"x","type":"float"},{"name":"y","type":"float"},{"name":"z","type":"float"}],"description":""},{"name":"MatrixFrustum","returnType":"Matrix","params":[{"name":"left","type":"double"},{"name":"right","type":"double"},{"name":"bottom","type":"double"},{"name":"top","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":""},{"name":"MatrixPerspective","returnType":"Matrix","params":[{"name":"fovy","type":"double"},{"name":"aspect","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":""},{"name":"MatrixOrtho","returnType":"Matrix","params":[{"name":"left","type":"double"},{"name":"right","type":"double"},{"name":"bottom","type":"double"},{"name":"top","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":""},{"name":"MatrixLookAt","returnType":"Matrix","params":[{"name":"eye","type":"Vector3"},{"name":"target","type":"Vector3"},{"name":"up","type":"Vector3"}],"description":""},{"name":"MatrixToFloatV","returnType":"float16","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"QuaternionAdd","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":""},{"name":"QuaternionAddValue","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"add","type":"float"}],"description":""},{"name":"QuaternionSubtract","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":""},{"name":"QuaternionSubtractValue","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"sub","type":"float"}],"description":""},{"name":"QuaternionIdentity","returnType":"Quaternion","params":[],"description":""},{"name":"QuaternionLength","returnType":"float","params":[{"name":"q","type":"Quaternion"}],"description":""},{"name":"QuaternionNormalize","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"}],"description":""},{"name":"QuaternionInvert","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"}],"description":""},{"name":"QuaternionMultiply","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":""},{"name":"QuaternionScale","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"mul","type":"float"}],"description":""},{"name":"QuaternionDivide","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":""},{"name":"QuaternionLerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":""},{"name":"QuaternionNlerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":""},{"name":"QuaternionSlerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":""},{"name":"QuaternionFromVector3ToVector3","returnType":"Quaternion","params":[{"name":"from","type":"Vector3"},{"name":"to","type":"Vector3"}],"description":""},{"name":"QuaternionFromMatrix","returnType":"Quaternion","params":[{"name":"mat","type":"Matrix"}],"description":""},{"name":"QuaternionToMatrix","returnType":"Matrix","params":[{"name":"q","type":"Quaternion"}],"description":""},{"name":"QuaternionFromAxisAngle","returnType":"Quaternion","params":[{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":""},{"name":"QuaternionToAxisAngle","returnType":"void","params":[{"name":"q","type":"Quaternion"},{"name":"outAxis","type":"Vector3 *"},{"name":"outAngle","type":"float *"}],"description":""},{"name":"QuaternionFromEuler","returnType":"Quaternion","params":[{"name":"pitch","type":"float"},{"name":"yaw","type":"float"},{"name":"roll","type":"float"}],"description":""},{"name":"QuaternionToEuler","returnType":"Vector3","params":[{"name":"q","type":"Quaternion"}],"description":""},{"name":"QuaternionTransform","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"mat","type":"Matrix"}],"description":""},{"name":"QuaternionEquals","returnType":"int","params":[{"name":"p","type":"Quaternion"},{"name":"q","type":"Quaternion"}],"description":""}] \ No newline at end of file +[{"name":"Clamp","returnType":"float","params":[{"name":"value","type":"float"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":"Clamp float value"},{"name":"Lerp","returnType":"float","params":[{"name":"start","type":"float"},{"name":"end","type":"float"},{"name":"amount","type":"float"}],"description":"Calculate linear interpolation between two floats"},{"name":"Normalize","returnType":"float","params":[{"name":"value","type":"float"},{"name":"start","type":"float"},{"name":"end","type":"float"}],"description":"Normalize input value within input range"},{"name":"Remap","returnType":"float","params":[{"name":"value","type":"float"},{"name":"inputStart","type":"float"},{"name":"inputEnd","type":"float"},{"name":"outputStart","type":"float"},{"name":"outputEnd","type":"float"}],"description":"Remap input value within input range to output range"},{"name":"Wrap","returnType":"float","params":[{"name":"value","type":"float"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":"Wrap input value from min to max"},{"name":"FloatEquals","returnType":"int","params":[{"name":"x","type":"float"},{"name":"y","type":"float"}],"description":"Check whether two given floats are almost equal"},{"name":"Vector2Zero","returnType":"Vector2","params":[],"description":"Vector with components value 0.0f"},{"name":"Vector2One","returnType":"Vector2","params":[],"description":"Vector with components value 1.0f"},{"name":"Vector2Add","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Add two vectors (v1 + v2)"},{"name":"Vector2AddValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"add","type":"float"}],"description":"Add vector and float value"},{"name":"Vector2Subtract","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Subtract two vectors (v1 - v2)"},{"name":"Vector2SubtractValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"sub","type":"float"}],"description":"Subtract vector by float value"},{"name":"Vector2Length","returnType":"float","params":[{"name":"v","type":"Vector2"}],"description":"Calculate vector length"},{"name":"Vector2LengthSqr","returnType":"float","params":[{"name":"v","type":"Vector2"}],"description":"Calculate vector square length"},{"name":"Vector2DotProduct","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Calculate two vectors dot product"},{"name":"Vector2Distance","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Calculate distance between two vectors"},{"name":"Vector2DistanceSqr","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Calculate square distance between two vectors"},{"name":"Vector2Angle","returnType":"float","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Calculate angle between two vectors\nNOTE: Angle is calculated from origin point (0, 0)"},{"name":"Vector2LineAngle","returnType":"float","params":[{"name":"start","type":"Vector2"},{"name":"end","type":"Vector2"}],"description":"Calculate angle defined by a two vectors line\nNOTE: Parameters need to be normalized\nCurrent implementation should be aligned with glm::angle"},{"name":"Vector2Scale","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"scale","type":"float"}],"description":"Scale vector (multiply by value)"},{"name":"Vector2Multiply","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Multiply vector by vector"},{"name":"Vector2Negate","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":"Negate vector"},{"name":"Vector2Divide","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"}],"description":"Divide vector by vector"},{"name":"Vector2Normalize","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":"Normalize provided vector"},{"name":"Vector2Transform","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"mat","type":"Matrix"}],"description":"Transforms a Vector2 by a given Matrix"},{"name":"Vector2Lerp","returnType":"Vector2","params":[{"name":"v1","type":"Vector2"},{"name":"v2","type":"Vector2"},{"name":"amount","type":"float"}],"description":"Calculate linear interpolation between two vectors"},{"name":"Vector2Reflect","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"normal","type":"Vector2"}],"description":"Calculate reflected vector to normal"},{"name":"Vector2Rotate","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"angle","type":"float"}],"description":"Rotate vector by angle"},{"name":"Vector2MoveTowards","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"target","type":"Vector2"},{"name":"maxDistance","type":"float"}],"description":"Move Vector towards target"},{"name":"Vector2Invert","returnType":"Vector2","params":[{"name":"v","type":"Vector2"}],"description":"Invert the given vector"},{"name":"Vector2Clamp","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"min","type":"Vector2"},{"name":"max","type":"Vector2"}],"description":"Clamp the components of the vector between\nmin and max values specified by the given vectors"},{"name":"Vector2ClampValue","returnType":"Vector2","params":[{"name":"v","type":"Vector2"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":"Clamp the magnitude of the vector between two min and max values"},{"name":"Vector2Equals","returnType":"int","params":[{"name":"p","type":"Vector2"},{"name":"q","type":"Vector2"}],"description":"Check whether two given vectors are almost equal"},{"name":"Vector3Zero","returnType":"Vector3","params":[],"description":"Vector with components value 0.0f"},{"name":"Vector3One","returnType":"Vector3","params":[],"description":"Vector with components value 1.0f"},{"name":"Vector3Add","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Add two vectors"},{"name":"Vector3AddValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"add","type":"float"}],"description":"Add vector and float value"},{"name":"Vector3Subtract","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Subtract two vectors"},{"name":"Vector3SubtractValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"sub","type":"float"}],"description":"Subtract vector by float value"},{"name":"Vector3Scale","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"scalar","type":"float"}],"description":"Multiply vector by scalar"},{"name":"Vector3Multiply","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Multiply vector by vector"},{"name":"Vector3CrossProduct","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Calculate two vectors cross product"},{"name":"Vector3Perpendicular","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":"Calculate one vector perpendicular vector"},{"name":"Vector3Length","returnType":"float","params":[{"name":"v","type":"const Vector3"}],"description":"Calculate vector length"},{"name":"Vector3LengthSqr","returnType":"float","params":[{"name":"v","type":"const Vector3"}],"description":"Calculate vector square length"},{"name":"Vector3DotProduct","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Calculate two vectors dot product"},{"name":"Vector3Distance","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Calculate distance between two vectors"},{"name":"Vector3DistanceSqr","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Calculate square distance between two vectors"},{"name":"Vector3Angle","returnType":"float","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Calculate angle between two vectors"},{"name":"Vector3Negate","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":"Negate provided vector (invert direction)"},{"name":"Vector3Divide","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Divide vector by vector"},{"name":"Vector3Normalize","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":"Normalize provided vector"},{"name":"Vector3OrthoNormalize","returnType":"void","params":[{"name":"v1","type":"Vector3 *"},{"name":"v2","type":"Vector3 *"}],"description":"Orthonormalize provided vectors\nMakes vectors normalized and orthogonal to each other\nGram-Schmidt function implementation"},{"name":"Vector3Transform","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"mat","type":"Matrix"}],"description":"Transforms a Vector3 by a given Matrix"},{"name":"Vector3RotateByQuaternion","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"q","type":"Quaternion"}],"description":"Transform a vector by quaternion rotation"},{"name":"Vector3RotateByAxisAngle","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":"Rotates a vector around an axis"},{"name":"Vector3Lerp","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"},{"name":"amount","type":"float"}],"description":"Calculate linear interpolation between two vectors"},{"name":"Vector3Reflect","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"normal","type":"Vector3"}],"description":"Calculate reflected vector to normal"},{"name":"Vector3Min","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Get min value for each pair of components"},{"name":"Vector3Max","returnType":"Vector3","params":[{"name":"v1","type":"Vector3"},{"name":"v2","type":"Vector3"}],"description":"Get max value for each pair of components"},{"name":"Vector3Barycenter","returnType":"Vector3","params":[{"name":"p","type":"Vector3"},{"name":"a","type":"Vector3"},{"name":"b","type":"Vector3"},{"name":"c","type":"Vector3"}],"description":"Compute barycenter coordinates (u, v, w) for point p with respect to triangle (a, b, c)\nNOTE: Assumes P is on the plane of the triangle"},{"name":"Vector3Unproject","returnType":"Vector3","params":[{"name":"source","type":"Vector3"},{"name":"projection","type":"Matrix"},{"name":"view","type":"Matrix"}],"description":"Projects a Vector3 from screen space into object space\nNOTE: We are avoiding calling other raymath functions despite available"},{"name":"Vector3ToFloatV","returnType":"float3","params":[{"name":"v","type":"Vector3"}],"description":"Get Vector3 as float array"},{"name":"Vector3Invert","returnType":"Vector3","params":[{"name":"v","type":"Vector3"}],"description":"Invert the given vector"},{"name":"Vector3Clamp","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"min","type":"Vector3"},{"name":"max","type":"Vector3"}],"description":"Clamp the components of the vector between\nmin and max values specified by the given vectors"},{"name":"Vector3ClampValue","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"min","type":"float"},{"name":"max","type":"float"}],"description":"Clamp the magnitude of the vector between two values"},{"name":"Vector3Equals","returnType":"int","params":[{"name":"p","type":"Vector3"},{"name":"q","type":"Vector3"}],"description":"Check whether two given vectors are almost equal"},{"name":"Vector3Refract","returnType":"Vector3","params":[{"name":"v","type":"Vector3"},{"name":"n","type":"Vector3"},{"name":"r","type":"float"}],"description":"Compute the direction of a refracted ray where v specifies the\nnormalized direction of the incoming ray, n specifies the\nnormalized normal vector of the interface of two optical media,\nand r specifies the ratio of the refractive index of the medium\nfrom where the ray comes to the refractive index of the medium\non the other side of the surface"},{"name":"MatrixDeterminant","returnType":"float","params":[{"name":"mat","type":"Matrix"}],"description":"Compute matrix determinant"},{"name":"MatrixTrace","returnType":"float","params":[{"name":"mat","type":"Matrix"}],"description":"Get the trace of the matrix (sum of the values along the diagonal)"},{"name":"MatrixTranspose","returnType":"Matrix","params":[{"name":"mat","type":"Matrix"}],"description":"Transposes provided matrix"},{"name":"MatrixInvert","returnType":"Matrix","params":[{"name":"mat","type":"Matrix"}],"description":"Invert provided matrix"},{"name":"MatrixIdentity","returnType":"Matrix","params":[],"description":"Get identity matrix"},{"name":"MatrixAdd","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":"Add two matrices"},{"name":"MatrixSubtract","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":"Subtract two matrices (left - right)"},{"name":"MatrixMultiply","returnType":"Matrix","params":[{"name":"left","type":"Matrix"},{"name":"right","type":"Matrix"}],"description":"Get two matrix multiplication\nNOTE: When multiplying matrices... the order matters!"},{"name":"MatrixTranslate","returnType":"Matrix","params":[{"name":"x","type":"float"},{"name":"y","type":"float"},{"name":"z","type":"float"}],"description":"Get translation matrix"},{"name":"MatrixRotate","returnType":"Matrix","params":[{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":"Create rotation matrix from axis and angle\nNOTE: Angle should be provided in radians"},{"name":"MatrixRotateX","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":"Get x-rotation matrix\nNOTE: Angle must be provided in radians"},{"name":"MatrixRotateY","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":"Get y-rotation matrix\nNOTE: Angle must be provided in radians"},{"name":"MatrixRotateZ","returnType":"Matrix","params":[{"name":"angle","type":"float"}],"description":"Get z-rotation matrix\nNOTE: Angle must be provided in radians"},{"name":"MatrixRotateXYZ","returnType":"Matrix","params":[{"name":"angle","type":"Vector3"}],"description":"Get xyz-rotation matrix\nNOTE: Angle must be provided in radians"},{"name":"MatrixRotateZYX","returnType":"Matrix","params":[{"name":"angle","type":"Vector3"}],"description":"Get zyx-rotation matrix\nNOTE: Angle must be provided in radians"},{"name":"MatrixScale","returnType":"Matrix","params":[{"name":"x","type":"float"},{"name":"y","type":"float"},{"name":"z","type":"float"}],"description":"Get scaling matrix"},{"name":"MatrixFrustum","returnType":"Matrix","params":[{"name":"left","type":"double"},{"name":"right","type":"double"},{"name":"bottom","type":"double"},{"name":"top","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":"Get perspective projection matrix"},{"name":"MatrixPerspective","returnType":"Matrix","params":[{"name":"fovy","type":"double"},{"name":"aspect","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":"Get perspective projection matrix\nNOTE: Fovy angle must be provided in radians"},{"name":"MatrixOrtho","returnType":"Matrix","params":[{"name":"left","type":"double"},{"name":"right","type":"double"},{"name":"bottom","type":"double"},{"name":"top","type":"double"},{"name":"near","type":"double"},{"name":"far","type":"double"}],"description":"Get orthographic projection matrix"},{"name":"MatrixLookAt","returnType":"Matrix","params":[{"name":"eye","type":"Vector3"},{"name":"target","type":"Vector3"},{"name":"up","type":"Vector3"}],"description":"Get camera look-at matrix (view matrix)"},{"name":"MatrixToFloatV","returnType":"float16","params":[{"name":"mat","type":"Matrix"}],"description":"Get float array of matrix data"},{"name":"QuaternionAdd","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":"Add two quaternions"},{"name":"QuaternionAddValue","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"add","type":"float"}],"description":"Add quaternion and float value"},{"name":"QuaternionSubtract","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":"Subtract two quaternions"},{"name":"QuaternionSubtractValue","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"sub","type":"float"}],"description":"Subtract quaternion and float value"},{"name":"QuaternionIdentity","returnType":"Quaternion","params":[],"description":"Get identity quaternion"},{"name":"QuaternionLength","returnType":"float","params":[{"name":"q","type":"Quaternion"}],"description":"Computes the length of a quaternion"},{"name":"QuaternionNormalize","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"}],"description":"Normalize provided quaternion"},{"name":"QuaternionInvert","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"}],"description":"Invert provided quaternion"},{"name":"QuaternionMultiply","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":"Calculate two quaternion multiplication"},{"name":"QuaternionScale","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"mul","type":"float"}],"description":"Scale quaternion by float value"},{"name":"QuaternionDivide","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"}],"description":"Divide two quaternions"},{"name":"QuaternionLerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":"Calculate linear interpolation between two quaternions"},{"name":"QuaternionNlerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":"Calculate slerp-optimized interpolation between two quaternions"},{"name":"QuaternionSlerp","returnType":"Quaternion","params":[{"name":"q1","type":"Quaternion"},{"name":"q2","type":"Quaternion"},{"name":"amount","type":"float"}],"description":"Calculates spherical linear interpolation between two quaternions"},{"name":"QuaternionFromVector3ToVector3","returnType":"Quaternion","params":[{"name":"from","type":"Vector3"},{"name":"to","type":"Vector3"}],"description":"Calculate quaternion based on the rotation from one vector to another"},{"name":"QuaternionFromMatrix","returnType":"Quaternion","params":[{"name":"mat","type":"Matrix"}],"description":"Get a quaternion for a given rotation matrix"},{"name":"QuaternionToMatrix","returnType":"Matrix","params":[{"name":"q","type":"Quaternion"}],"description":"Get a matrix for a given quaternion"},{"name":"QuaternionFromAxisAngle","returnType":"Quaternion","params":[{"name":"axis","type":"Vector3"},{"name":"angle","type":"float"}],"description":"Get rotation quaternion for an angle and axis\nNOTE: Angle must be provided in radians"},{"name":"QuaternionToAxisAngle","returnType":"void","params":[{"name":"q","type":"Quaternion"},{"name":"outAxis","type":"Vector3 *"},{"name":"outAngle","type":"float *"}],"description":"Get the rotation angle and axis for a given quaternion"},{"name":"QuaternionFromEuler","returnType":"Quaternion","params":[{"name":"pitch","type":"float"},{"name":"yaw","type":"float"},{"name":"roll","type":"float"}],"description":"Get the quaternion equivalent to Euler angles\nNOTE: Rotation order is ZYX"},{"name":"QuaternionToEuler","returnType":"Vector3","params":[{"name":"q","type":"Quaternion"}],"description":"Get the Euler angles equivalent to quaternion (roll, pitch, yaw)\nNOTE: Angles are returned in a Vector3 struct in radians"},{"name":"QuaternionTransform","returnType":"Quaternion","params":[{"name":"q","type":"Quaternion"},{"name":"mat","type":"Matrix"}],"description":"Transform a quaternion given a transformation matrix"},{"name":"QuaternionEquals","returnType":"int","params":[{"name":"p","type":"Quaternion"},{"name":"q","type":"Quaternion"}],"description":"Check whether two given quaternions are almost equal"}] \ No newline at end of file diff --git a/bindings/src/index.ts b/bindings/src/index.ts index a9c59a9..fa34866 100644 --- a/bindings/src/index.ts +++ b/bindings/src/index.ts @@ -4,13 +4,10 @@ import { ApiDescription, ApiFunction } from "./api"; import { RayLibHeader } from "./raylib-header"; function parseMathHeader(): RayLibFunction[] { - return readFileSync("thirdparty/raylib/src/raymath.h", 'utf8') - .split("\n") - .filter(x => x.startsWith("RMAPI")) - .map(inputString => { - const matches = inputString.match(/^RMAPI\s+([\w<>]+)\s+([\w<>]+)\((.*)\)$/); - if(!matches) throw new Error("Unable to match " + inputString) - const args = matches[3].split(',').filter(x => x !== 'void').map(arg => { + const i = readFileSync("thirdparty/raylib/src/raymath.h", 'utf8') + const m = [...i.matchAll(/((?:\/\/ .+\n)*)RMAPI\s+([\w<>]+)\s+([\w<>]+)\((.*)\)/gm)] + const res = m.map(groups => { + const args = groups[4].split(',').filter(x => x !== 'void').map(arg => { arg = arg.trim().replace(" *", "* ") const frags = arg.split(' ') const name = frags.pop() @@ -18,27 +15,30 @@ function parseMathHeader(): RayLibFunction[] { return { name: name || "", type: type } }) + const comments = groups[1].split('\n').map(x => x.replace("// ","")).join('\n').trim() return { - name: matches[2], - returnType: matches[1], + name: groups[3], + returnType: groups[2], params: args, - description: "" + description: comments } - }); + }) + return res; } function main(){ - - const mathApi = parseMathHeader(); - writeFileSync("bindings/raylib_math_api.json", JSON.stringify(mathApi)) - + + // Load the pre-generated raylib api const api = JSON.parse(readFileSync("thirdparty/raylib/parser/output/raylib_api.json", 'utf8')) + api.functions.push({ name: "SetModelMaterial", description: "Replace material in slot materialIndex", returnType: "void", params: [{type: "Model *",name:"model"},{type:"int",name:"materialIndex"},{type:"Material",name:"material"}] }) + const mathApi = parseMathHeader(); + writeFileSync("bindings/raylib_math_api.json", JSON.stringify(mathApi)) mathApi.forEach(x => api.functions.push(x)) const apiDesc = new ApiDescription(api) diff --git a/doc/auto-complete.png b/doc/auto-complete.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3c991019dea7444dc3207c2d575ab3950e376b GIT binary patch literal 89319 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

RhBCsEwjS|H=;ppH(X%I{P_DvnCI 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 I#30~*06w$QO8@`> literal 0 HcmV?d00001 diff --git a/examples/bunnymark.js b/examples/bunnymark.js index 91faa59..2ffcb06 100644 --- a/examples/bunnymark.js +++ b/examples/bunnymark.js @@ -42,15 +42,19 @@ while (!windowShouldClose()) // Detect window close button or ESC key } // Update bunnies + const width = getScreenWidth() + const height = getScreenHeight() for (let i = 0; i < bunniesCount; i++) { - bunnies[i].position.x += bunnies[i].speed.x; - bunnies[i].position.y += bunnies[i].speed.y; + const bunny = bunnies[i] - if (((bunnies[i].position.x + texBunny.width/2) > getScreenWidth()) || - ((bunnies[i].position.x + texBunny.width/2) < 0)) bunnies[i].speed.x *= -1; - if (((bunnies[i].position.y + texBunny.height/2) > getScreenHeight()) || - ((bunnies[i].position.y + texBunny.height/2 - 40) < 0)) bunnies[i].speed.y *= -1; + bunny.position.x += bunny.speed.x; + bunny.position.y += bunny.speed.y; + + if (((bunny.position.x + texBunny.width/2) > width) || + ((bunny.position.x + texBunny.width/2) < 0)) bunny.speed.x *= -1; + if (((bunny.position.y + texBunny.height/2) > height) || + ((bunny.position.y + texBunny.height/2 - 40) < 0)) bunny.speed.y *= -1; } //---------------------------------------------------------------------------------- @@ -62,13 +66,14 @@ while (!windowShouldClose()) // Detect window close button or ESC key for (let i = 0; i < bunniesCount; i++) { + const bunny = bunnies[i] // NOTE: When internal batch buffer limit is reached (MAX_BATCH_ELEMENTS), // a draw call is launched and buffer starts being filled again; // before issuing a draw call, updated vertex data from internal CPU buffer is send to GPU... // Process of sending data is costly and it could happen that GPU data has not been completely // processed for drawing while new data is tried to be sent (updating current in-use buffers) // it could generates a stall and consequently a frame drop, limiting the number of drawn bunnies - drawTexture(texBunny, bunnies[i].position.x, bunnies[i].position.y, bunnies[i].color); + drawTexture(texBunny, bunny.position.x, bunny.position.y, bunny.color); } drawRectangle(0, 0, screenWidth, 40, BLACK); diff --git a/examples/lib.raylib.d.ts b/examples/lib.raylib.d.ts index efeb351..05d892c 100644 --- a/examples/lib.raylib.d.ts +++ b/examples/lib.raylib.d.ts @@ -1121,221 +1121,244 @@ declare function setMusicPan(music: Music, pan: number): void; declare function getMusicTimeLength(music: Music): number; /** Get current music time played (in seconds) */ declare function getMusicTimePlayed(music: Music): number; -/** */ +/** Clamp float value */ declare function clamp(value: number, min: number, max: number): number; -/** */ +/** Calculate linear interpolation between two floats */ declare function lerp(start: number, end: number, amount: number): number; -/** */ +/** Normalize input value within input range */ declare function normalize(value: number, start: number, end: number): number; -/** */ +/** Remap input value within input range to output range */ declare function remap(value: number, inputStart: number, inputEnd: number, outputStart: number, outputEnd: number): number; -/** */ +/** Wrap input value from min to max */ declare function wrap(value: number, min: number, max: number): number; -/** */ +/** Check whether two given floats are almost equal */ declare function floatEquals(x: number, y: number): number; -/** */ +/** Vector with components value 0.0f */ declare function vector2Zero(): Vector2; -/** */ +/** Vector with components value 1.0f */ declare function vector2One(): Vector2; -/** */ +/** Add two vectors (v1 + v2) */ declare function vector2Add(v1: Vector2, v2: Vector2): Vector2; -/** */ +/** Add vector and float value */ declare function vector2AddValue(v: Vector2, add: number): Vector2; -/** */ +/** Subtract two vectors (v1 - v2) */ declare function vector2Subtract(v1: Vector2, v2: Vector2): Vector2; -/** */ +/** Subtract vector by float value */ declare function vector2SubtractValue(v: Vector2, sub: number): Vector2; -/** */ +/** Calculate vector length */ declare function vector2Length(v: Vector2): number; -/** */ +/** Calculate vector square length */ declare function vector2LengthSqr(v: Vector2): number; -/** */ +/** Calculate two vectors dot product */ declare function vector2DotProduct(v1: Vector2, v2: Vector2): number; -/** */ +/** Calculate distance between two vectors */ declare function vector2Distance(v1: Vector2, v2: Vector2): number; -/** */ +/** Calculate square distance between two vectors */ declare function vector2DistanceSqr(v1: Vector2, v2: Vector2): number; -/** */ +/** Calculate angle between two vectors +NOTE: Angle is calculated from origin point (0, 0) */ declare function vector2Angle(v1: Vector2, v2: Vector2): number; -/** */ +/** Calculate angle defined by a two vectors line +NOTE: Parameters need to be normalized +Current implementation should be aligned with glm::angle */ declare function vector2LineAngle(start: Vector2, end: Vector2): number; -/** */ +/** Scale vector (multiply by value) */ declare function vector2Scale(v: Vector2, scale: number): Vector2; -/** */ +/** Multiply vector by vector */ declare function vector2Multiply(v1: Vector2, v2: Vector2): Vector2; -/** */ +/** Negate vector */ declare function vector2Negate(v: Vector2): Vector2; -/** */ +/** Divide vector by vector */ declare function vector2Divide(v1: Vector2, v2: Vector2): Vector2; -/** */ +/** Normalize provided vector */ declare function vector2Normalize(v: Vector2): Vector2; -/** */ +/** Transforms a Vector2 by a given Matrix */ declare function vector2Transform(v: Vector2, mat: Matrix): Vector2; -/** */ +/** Calculate linear interpolation between two vectors */ declare function vector2Lerp(v1: Vector2, v2: Vector2, amount: number): Vector2; -/** */ +/** Calculate reflected vector to normal */ declare function vector2Reflect(v: Vector2, normal: Vector2): Vector2; -/** */ +/** Rotate vector by angle */ declare function vector2Rotate(v: Vector2, angle: number): Vector2; -/** */ +/** Move Vector towards target */ declare function vector2MoveTowards(v: Vector2, target: Vector2, maxDistance: number): Vector2; -/** */ +/** Invert the given vector */ declare function vector2Invert(v: Vector2): Vector2; -/** */ +/** Clamp the components of the vector between +min and max values specified by the given vectors */ declare function vector2Clamp(v: Vector2, min: Vector2, max: Vector2): Vector2; -/** */ +/** Clamp the magnitude of the vector between two min and max values */ declare function vector2ClampValue(v: Vector2, min: number, max: number): Vector2; -/** */ +/** Check whether two given vectors are almost equal */ declare function vector2Equals(p: Vector2, q: Vector2): number; -/** */ +/** Vector with components value 0.0f */ declare function vector3Zero(): Vector3; -/** */ +/** Vector with components value 1.0f */ declare function vector3One(): Vector3; -/** */ +/** Add two vectors */ declare function vector3Add(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Add vector and float value */ declare function vector3AddValue(v: Vector3, add: number): Vector3; -/** */ +/** Subtract two vectors */ declare function vector3Subtract(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Subtract vector by float value */ declare function vector3SubtractValue(v: Vector3, sub: number): Vector3; -/** */ +/** Multiply vector by scalar */ declare function vector3Scale(v: Vector3, scalar: number): Vector3; -/** */ +/** Multiply vector by vector */ declare function vector3Multiply(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Calculate two vectors cross product */ declare function vector3CrossProduct(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Calculate one vector perpendicular vector */ declare function vector3Perpendicular(v: Vector3): Vector3; -/** */ +/** Calculate vector length */ declare function vector3Length(v: Vector3): number; -/** */ +/** Calculate vector square length */ declare function vector3LengthSqr(v: Vector3): number; -/** */ +/** Calculate two vectors dot product */ declare function vector3DotProduct(v1: Vector3, v2: Vector3): number; -/** */ +/** Calculate distance between two vectors */ declare function vector3Distance(v1: Vector3, v2: Vector3): number; -/** */ +/** Calculate square distance between two vectors */ declare function vector3DistanceSqr(v1: Vector3, v2: Vector3): number; -/** */ +/** Calculate angle between two vectors */ declare function vector3Angle(v1: Vector3, v2: Vector3): number; -/** */ +/** Negate provided vector (invert direction) */ declare function vector3Negate(v: Vector3): Vector3; -/** */ +/** Divide vector by vector */ declare function vector3Divide(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Normalize provided vector */ declare function vector3Normalize(v: Vector3): Vector3; -/** */ +/** Transforms a Vector3 by a given Matrix */ declare function vector3Transform(v: Vector3, mat: Matrix): Vector3; -/** */ +/** Transform a vector by quaternion rotation */ declare function vector3RotateByQuaternion(v: Vector3, q: Vector4): Vector3; -/** */ +/** Rotates a vector around an axis */ declare function vector3RotateByAxisAngle(v: Vector3, axis: Vector3, angle: number): Vector3; -/** */ +/** Calculate linear interpolation between two vectors */ declare function vector3Lerp(v1: Vector3, v2: Vector3, amount: number): Vector3; -/** */ +/** Calculate reflected vector to normal */ declare function vector3Reflect(v: Vector3, normal: Vector3): Vector3; -/** */ +/** Get min value for each pair of components */ declare function vector3Min(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** Get max value for each pair of components */ declare function vector3Max(v1: Vector3, v2: Vector3): Vector3; -/** */ +/** 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 */ declare function vector3Barycenter(p: Vector3, a: Vector3, b: Vector3, c: Vector3): Vector3; -/** */ +/** Projects a Vector3 from screen space into object space +NOTE: We are avoiding calling other raymath functions despite available */ declare function vector3Unproject(source: Vector3, projection: Matrix, view: Matrix): Vector3; -/** */ +/** Invert the given vector */ declare function vector3Invert(v: Vector3): Vector3; -/** */ +/** Clamp the components of the vector between +min and max values specified by the given vectors */ declare function vector3Clamp(v: Vector3, min: Vector3, max: Vector3): Vector3; -/** */ +/** Clamp the magnitude of the vector between two values */ declare function vector3ClampValue(v: Vector3, min: number, max: number): Vector3; -/** */ +/** Check whether two given vectors are almost equal */ declare function vector3Equals(p: Vector3, q: Vector3): number; -/** */ +/** Compute the direction of a refracted ray where v specifies the +normalized direction of the incoming ray, n specifies the +normalized normal vector of the interface of two optical media, +and r specifies the 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 */ declare function vector3Refract(v: Vector3, n: Vector3, r: number): Vector3; -/** */ +/** Compute matrix determinant */ declare function matrixDeterminant(mat: Matrix): number; -/** */ +/** Get the trace of the matrix (sum of the values along the diagonal) */ declare function matrixTrace(mat: Matrix): number; -/** */ +/** Transposes provided matrix */ declare function matrixTranspose(mat: Matrix): Matrix; -/** */ +/** Invert provided matrix */ declare function matrixInvert(mat: Matrix): Matrix; -/** */ +/** Get identity matrix */ declare function matrixIdentity(): Matrix; -/** */ +/** Add two matrices */ declare function matrixAdd(left: Matrix, right: Matrix): Matrix; -/** */ +/** Subtract two matrices (left - right) */ declare function matrixSubtract(left: Matrix, right: Matrix): Matrix; -/** */ +/** Get two matrix multiplication +NOTE: When multiplying matrices... the order matters! */ declare function matrixMultiply(left: Matrix, right: Matrix): Matrix; -/** */ +/** Get translation matrix */ declare function matrixTranslate(x: number, y: number, z: number): Matrix; -/** */ +/** Create rotation matrix from axis and angle +NOTE: Angle should be provided in radians */ declare function matrixRotate(axis: Vector3, angle: number): Matrix; -/** */ +/** Get x-rotation matrix +NOTE: Angle must be provided in radians */ declare function matrixRotateX(angle: number): Matrix; -/** */ +/** Get y-rotation matrix +NOTE: Angle must be provided in radians */ declare function matrixRotateY(angle: number): Matrix; -/** */ +/** Get z-rotation matrix +NOTE: Angle must be provided in radians */ declare function matrixRotateZ(angle: number): Matrix; -/** */ +/** Get xyz-rotation matrix +NOTE: Angle must be provided in radians */ declare function matrixRotateXYZ(angle: Vector3): Matrix; -/** */ +/** Get zyx-rotation matrix +NOTE: Angle must be provided in radians */ declare function matrixRotateZYX(angle: Vector3): Matrix; -/** */ +/** Get scaling matrix */ declare function matrixScale(x: number, y: number, z: number): Matrix; -/** */ +/** Get perspective projection matrix */ declare function matrixFrustum(left: number, right: number, bottom: number, top: number, near: number, far: number): Matrix; -/** */ +/** Get perspective projection matrix +NOTE: Fovy angle must be provided in radians */ declare function matrixPerspective(fovy: number, aspect: number, near: number, far: number): Matrix; -/** */ +/** Get orthographic projection matrix */ declare function matrixOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number): Matrix; -/** */ +/** Get camera look-at matrix (view matrix) */ declare function matrixLookAt(eye: Vector3, target: Vector3, up: Vector3): Matrix; -/** */ +/** Add two quaternions */ declare function quaternionAdd(q1: Vector4, q2: Vector4): Vector4; -/** */ +/** Add quaternion and float value */ declare function quaternionAddValue(q: Vector4, add: number): Vector4; -/** */ +/** Subtract two quaternions */ declare function quaternionSubtract(q1: Vector4, q2: Vector4): Vector4; -/** */ +/** Subtract quaternion and float value */ declare function quaternionSubtractValue(q: Vector4, sub: number): Vector4; -/** */ +/** Get identity quaternion */ declare function quaternionIdentity(): Vector4; -/** */ +/** Computes the length of a quaternion */ declare function quaternionLength(q: Vector4): number; -/** */ +/** Normalize provided quaternion */ declare function quaternionNormalize(q: Vector4): Vector4; -/** */ +/** Invert provided quaternion */ declare function quaternionInvert(q: Vector4): Vector4; -/** */ +/** Calculate two quaternion multiplication */ declare function quaternionMultiply(q1: Vector4, q2: Vector4): Vector4; -/** */ +/** Scale quaternion by float value */ declare function quaternionScale(q: Vector4, mul: number): Vector4; -/** */ +/** Divide two quaternions */ declare function quaternionDivide(q1: Vector4, q2: Vector4): Vector4; -/** */ +/** Calculate linear interpolation between two quaternions */ declare function quaternionLerp(q1: Vector4, q2: Vector4, amount: number): Vector4; -/** */ +/** Calculate slerp-optimized interpolation between two quaternions */ declare function quaternionNlerp(q1: Vector4, q2: Vector4, amount: number): Vector4; -/** */ +/** Calculates spherical linear interpolation between two quaternions */ declare function quaternionSlerp(q1: Vector4, q2: Vector4, amount: number): Vector4; -/** */ +/** Calculate quaternion based on the rotation from one vector to another */ declare function quaternionFromVector3ToVector3(from: Vector3, to: Vector3): Vector4; -/** */ +/** Get a quaternion for a given rotation matrix */ declare function quaternionFromMatrix(mat: Matrix): Vector4; -/** */ +/** Get a matrix for a given quaternion */ declare function quaternionToMatrix(q: Vector4): Matrix; -/** */ +/** Get rotation quaternion for an angle and axis +NOTE: Angle must be provided in radians */ declare function quaternionFromAxisAngle(axis: Vector3, angle: number): Vector4; -/** */ +/** Get the quaternion equivalent to Euler angles +NOTE: Rotation order is ZYX */ declare function quaternionFromEuler(pitch: number, yaw: number, roll: number): Vector4; -/** */ +/** Get the Euler angles equivalent to quaternion (roll, pitch, yaw) +NOTE: Angles are returned in a Vector3 struct in radians */ declare function quaternionToEuler(q: Vector4): Vector3; -/** */ +/** Transform a quaternion given a transformation matrix */ declare function quaternionTransform(q: Vector4, mat: Matrix): Vector4; -/** */ +/** Check whether two given quaternions are almost equal */ declare function quaternionEquals(p: Vector4, q: Vector4): number; /** Light Gray */ declare var LIGHTGRAY: Color; diff --git a/generate-bindings.js b/generate-bindings.js index 67f1e1e..0d81e8b 100644 --- a/generate-bindings.js +++ b/generate-bindings.js @@ -897,31 +897,28 @@ const fs_1 = __webpack_require__(/*! fs */ "fs"); const api_1 = __webpack_require__(/*! ./api */ "./src/api.ts"); const raylib_header_1 = __webpack_require__(/*! ./raylib-header */ "./src/raylib-header.ts"); function parseMathHeader() { - return (0, fs_1.readFileSync)("thirdparty/raylib/src/raymath.h", 'utf8') - .split("\n") - .filter(x => x.startsWith("RMAPI")) - .map(inputString => { - const matches = inputString.match(/^RMAPI\s+([\w<>]+)\s+([\w<>]+)\((.*)\)$/); - if (!matches) - throw new Error("Unable to match " + inputString); - const args = matches[3].split(',').filter(x => x !== 'void').map(arg => { + const i = (0, fs_1.readFileSync)("thirdparty/raylib/src/raymath.h", 'utf8'); + const m = [...i.matchAll(/((?:\/\/ .+\n)*)RMAPI\s+([\w<>]+)\s+([\w<>]+)\((.*)\)/gm)]; + const res = m.map(groups => { + const args = groups[4].split(',').filter(x => x !== 'void').map(arg => { arg = arg.trim().replace(" *", "* "); const frags = arg.split(' '); const name = frags.pop(); const type = frags.join(' ').replace("*", " *"); return { name: name || "", type: type }; }); + const comments = groups[1].split('\n').map(x => x.replace("// ", "")).join('\n').trim(); return { - name: matches[2], - returnType: matches[1], + name: groups[3], + returnType: groups[2], params: args, - description: "" + description: comments }; }); + return res; } function main() { - const mathApi = parseMathHeader(); - (0, fs_1.writeFileSync)("bindings/raylib_math_api.json", JSON.stringify(mathApi)); + // Load the pre-generated raylib api const api = JSON.parse((0, fs_1.readFileSync)("thirdparty/raylib/parser/output/raylib_api.json", 'utf8')); api.functions.push({ name: "SetModelMaterial", @@ -929,6 +926,8 @@ function main() { returnType: "void", params: [{ type: "Model *", name: "model" }, { type: "int", name: "materialIndex" }, { type: "Material", name: "material" }] }); + const mathApi = parseMathHeader(); + (0, fs_1.writeFileSync)("bindings/raylib_math_api.json", JSON.stringify(mathApi)); mathApi.forEach(x => api.functions.push(x)); const apiDesc = new api_1.ApiDescription(api); const core = new raylib_header_1.RayLibHeader("raylib_core", apiDesc); diff --git a/readme.md b/readme.md index 2f7f086..2e6f35f 100644 --- a/readme.md +++ b/readme.md @@ -5,6 +5,9 @@ Javascript bindings for raylib in a single ~3mb executable ## What is this? rayjs is small ES2020 compliant Javascript interpreter based on [QuickJS](https://bellard.org/quickjs/) with bindings for [Raylib](https://www.raylib.com/). You can use it to develop desktop games with Javascript. +## What this is not +rayjs is not a binding for NodeJS nor is it running in the browser (yet). It's comes with its own Javascript engine (QuickJS) similar to how NodeJS comes with the V8 engine. That makes it much easier to run and distribute rayjs programs as all you need to run a program / game is the small rayjs executable. No installation, no dlls or additional files are needed. + ## Features * Compiles into a single, small executable without any dependencies for easy distribution * Use modern Javascript features like classes or async/await @@ -43,6 +46,26 @@ rayjs will run code in three different modes The directory of the main Javascript module will also be the working directory of the app. Modules and resources will be loaded relative to it. +## API support + +The following raylib APIs are supported so far (with a few exceptions): + +- core (no VR support yet) +- shapes +- textures +- text (no support for GlyphInfo yet) +- models +- shaders +- audio +- raymath + +Similar to including a header in C and for your convenience, all types/functions are provided globally. They are additionally available in a module called 'raylib' + +## Auto-Complete / Intellisense + +rayjs comes with full auto-complete support in the form of the definitions file `lib.raylib.d.ts`. These will work with Typescript and Javascript. For most editors (e.g. Visual Studio Code) it should be enough to put them in the project folder. +![](doc/auto-complete.png) + ## Building Here are some basic steps if you want to compile rayjs yourself. You should use CMake for building. **Please note that QuickJS needs Mingw in order to compile correctly on Windows** @@ -53,6 +76,8 @@ git clone https://github.com/mode777/rayjs.git git submodule update --init --recursive ``` + + ### Build with cmake Make sure you have cmake installed and in your path. ```bash @@ -64,5 +89,5 @@ make ``` ## Performance -QuickJS is one of the [faster JS interpreters](https://bellard.org/quickjs/bench.html). I'm getting about 13000 bunnys in bunnmark before dropping any frames on my 2020 Macbook Air M1 which seems pretty good. +QuickJS is one of the [faster JS interpreters](https://bellard.org/quickjs/bench.html). I'm getting about 13000 bunnys in the unmodified bunnmark before dropping any frames on my 2020 Macbook Air M1 which seems pretty good. ![Bunnymark](doc/bunny.png)