From 30d425aa26a3aa802cb2ff55f1f7655be056f3ed Mon Sep 17 00:00:00 2001 From: jussi Date: Thu, 31 Mar 2022 13:55:02 +0300 Subject: Screen-space related functions for 3DCamera. --- src/core.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lua_core.c | 26 ++++++++++++++++++ 2 files changed, 109 insertions(+) (limited to 'src') diff --git a/src/core.c b/src/core.c index 8f67c34..74e6607 100644 --- a/src/core.c +++ b/src/core.c @@ -2337,3 +2337,86 @@ int lcoreUpdateCamera3D( lua_State *L ) { return 1; } + +/* +## Core - Screen-space +*/ + +/* +> ray = RL_GetMouseRay( Vector2 mousePosition, Camera3D camera ) + +Get a ray trace from mouse position + +- Failure return false +- Success return Ray +*/ +int lcoreGetMouseRay( lua_State *L ) { + if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetMouseRay( Vector2 mousePosition, Camera3D camera )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t cameraId = lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + Vector2 mousePosition = uluaGetVector2( L ); + + if ( !validCamera3D( cameraId ) ) { + lua_pushboolean( L, false ); + return 1; + } + uluaPushRay( L, GetMouseRay( mousePosition, *state->camera3Ds[ cameraId ] ) ); + + return 1; +} + +/* +> matrix = RL_GetCameraMatrix( Camera3D camera ) + +Get camera transform matrix ( view matrix ) + +- Failure return false +- Success return Matrix +*/ +int lcoreGetCameraMatrix( lua_State *L ) { + if ( !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetCameraMatrix( Camera3D camera )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t cameraId = lua_tointeger( L, -1 ); + + if ( !validCamera3D( cameraId ) ) { + lua_pushboolean( L, false ); + return 1; + } + uluaPushMatrix( L, GetCameraMatrix( *state->camera3Ds[ cameraId ] ) ); + + return 1; +} + +/* +> position = RL_GetWorldToScreen( Vector3 position, Camera3D camera ) + +Get the screen space position for a 3d world space position + +- Failure return false +- Success return Vector2 +*/ +int lcoreGetWorldToScreen( lua_State *L ) { + if ( !lua_istable( L, -2 ) || !lua_isnumber( L, -1 ) ) { + TraceLog( LOG_WARNING, "%s", "Bad call of function. RL_GetWorldToScreen( Vector3 position, Camera3D camera )" ); + lua_pushboolean( L, false ); + return 1; + } + size_t cameraId = lua_tointeger( L, -1 ); + lua_pop( L, 1 ); + Vector3 position = uluaGetVector3( L ); + + if ( !validCamera3D( cameraId ) ) { + lua_pushboolean( L, false ); + return 1; + } + uluaPushVector2( L, GetWorldToScreen( position, *state->camera3Ds[ cameraId ] ) ); + + return 1; +} diff --git a/src/lua_core.c b/src/lua_core.c index 4cfbafd..6006474 100644 --- a/src/lua_core.c +++ b/src/lua_core.c @@ -597,6 +597,10 @@ void luaRegister() { lua_register( L, "RL_GetGestureDragAngle", lcoreGetGestureDragAngle ); lua_register( L, "RL_GetGesturePinchVector", lcoreGetGesturePinchVector ); lua_register( L, "RL_GetGesturePinchAngle", lcoreGetGesturePinchAngle ); + /* Screen-space. */ + lua_register( L, "RL_GetMouseRay", lcoreGetMouseRay ); + lua_register( L, "RL_GetCameraMatrix", lcoreGetCameraMatrix ); + lua_register( L, "RL_GetWorldToScreen", lcoreGetWorldToScreen ); /* Shapes. */ /* Drawing. */ @@ -1304,6 +1308,28 @@ void uluaPushMatrix( lua_State *L, Matrix matrix ) { lua_rawseti( L, -2, 4 ); } +void uluaPushRay( lua_State *L, Ray ray ) { + lua_createtable( L, 2, 0 ); + + lua_createtable( L, 3, 0 ); + lua_pushnumber( L, ray.position.x ); + lua_rawseti( L, -2, 1 ); + lua_pushnumber( L, ray.position.y ); + lua_rawseti( L, -2, 2 ); + lua_pushnumber( L, ray.position.z ); + lua_rawseti( L, -2, 3 ); + lua_rawseti( L, -2, 1 ); + + lua_createtable( L, 3, 0 ); + lua_pushnumber( L, ray.direction.x ); + lua_rawseti( L, -2, 1 ); + lua_pushnumber( L, ray.direction.y ); + lua_rawseti( L, -2, 2 ); + lua_pushnumber( L, ray.direction.z ); + lua_rawseti( L, -2, 3 ); + lua_rawseti( L, -2, 2 ); +} + void uluaPushRayCollision( lua_State *L, RayCollision rayCol ) { lua_createtable( L, 4, 0 ); lua_pushboolean( L, rayCol.hit ); -- cgit v1.2.3