Screen-space related functions for 3DCamera.
This commit is contained in:
33
API.md
33
API.md
@@ -667,7 +667,7 @@ int id. Basic 3d Model type
|
||||
|
||||
---
|
||||
|
||||
> RayCollision = { hit = true, distance = 1.0, point = { 0.0, 0.0 }, normal = { 0.0, 0.0, 1.0 } }
|
||||
> RayCollision = { hit = true, distance = 1.0, point = { 0.0, 0.0, 0.0 }, normal = { 0.0, 0.0, 1.0 } }
|
||||
|
||||
Raycast hit information. NOTE: Data in named keys
|
||||
|
||||
@@ -1721,6 +1721,37 @@ Update camera position for selected mode
|
||||
|
||||
---
|
||||
|
||||
## Core - Screen-space
|
||||
|
||||
---
|
||||
|
||||
> ray = RL_GetMouseRay( Vector2 mousePosition, Camera3D camera )
|
||||
|
||||
Get a ray trace from mouse position
|
||||
|
||||
- Failure return false
|
||||
- Success return Ray
|
||||
|
||||
---
|
||||
|
||||
> matrix = RL_GetCameraMatrix( Camera3D camera )
|
||||
|
||||
Get camera transform matrix ( view matrix )
|
||||
|
||||
- Failure return false
|
||||
- Success return Matrix
|
||||
|
||||
---
|
||||
|
||||
> position = RL_GetWorldToScreen( Vector3 position, Camera3D camera )
|
||||
|
||||
Get the screen space position for a 3d world space position
|
||||
|
||||
- Failure return false
|
||||
- Success return Vector2
|
||||
|
||||
---
|
||||
|
||||
## Shapes - Drawing
|
||||
|
||||
---
|
||||
|
||||
@@ -119,7 +119,7 @@ apiFile:write( "\n> Model = ModelId\n\
|
||||
int id. Basic 3d Model type\n\n---\n" )
|
||||
apiFile:write( "\n> Ray = { { 0.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 } }\n\
|
||||
{ position, direction }. Ray type (useful for raycast)\n\n---\n" )
|
||||
apiFile:write( "\n> RayCollision = { hit = true, distance = 1.0, point = { 0.0, 0.0 }, normal = { 0.0, 0.0, 1.0 } }\n\
|
||||
apiFile:write( "\n> RayCollision = { hit = true, distance = 1.0, point = { 0.0, 0.0, 0.0 }, normal = { 0.0, 0.0, 1.0 } }\n\
|
||||
Raycast hit information. NOTE: Data in named keys\n\n---\n" )
|
||||
apiFile:write( "\n> BoundingBox = { { 0.0, 0.0, 0.0 }, { 1.0, 1.0, 1.0 } }\n\
|
||||
{ min, max }. Bounding box type for 3d mesh\n\n---\n" )
|
||||
|
||||
@@ -12,6 +12,17 @@ local function setupWindow()
|
||||
RL_SetWindowPosition( { mPos[1] + mSize[1] / 2 - winSize[1] / 2, mPos[2] + mSize[2] / 2 - winSize[2] / 2 } )
|
||||
end
|
||||
|
||||
function ray_collision()
|
||||
local rayCol = RL_GetRayCollisionMesh( ray, sphereMesh, RL_MatrixIdentity() )
|
||||
|
||||
if rayCol ~= nil and rayCol.hit then
|
||||
print( "hit", rayCol.hit )
|
||||
print( "distance", rayCol.distance )
|
||||
print( "point", rayCol.point[1], rayCol.point[2], rayCol.point[3] )
|
||||
print( "normal", rayCol.normal[1], rayCol.normal[2], rayCol.normal[3] )
|
||||
end
|
||||
end
|
||||
|
||||
function init()
|
||||
setupWindow()
|
||||
|
||||
@@ -23,14 +34,13 @@ function init()
|
||||
|
||||
sphereMesh = RL_GenMeshSphere( 1.0, 8, 10 )
|
||||
|
||||
-- local rayCol = RL_GetRayCollisionSphere( { { 0.5, 0, 4 }, { 0, 0, -1 } }, { 0, 0, 0 }, 1.0 )
|
||||
local rayCol = RL_GetRayCollisionMesh( ray, sphereMesh, RL_MatrixIdentity() )
|
||||
ray_collision()
|
||||
end
|
||||
|
||||
if rayCol ~= nil and rayCol.hit then
|
||||
print( "hit", rayCol.hit )
|
||||
print( "distance", rayCol.distance )
|
||||
print( "point", rayCol.point[1], rayCol.point[2], rayCol.point[3] )
|
||||
print( "normal", rayCol.normal[1], rayCol.normal[2], rayCol.normal[3] )
|
||||
function process( delta )
|
||||
if RL_IsMouseButtonPressed( 0 ) then
|
||||
ray = RL_GetMouseRay( RL_GetMousePosition(), camera )
|
||||
ray_collision()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -128,3 +128,7 @@ int lcoreGetGestureDragVector( lua_State *L );
|
||||
int lcoreGetGestureDragAngle( lua_State *L );
|
||||
int lcoreGetGesturePinchVector( lua_State *L );
|
||||
int lcoreGetGesturePinchAngle( lua_State *L );
|
||||
/* Screen-space. */
|
||||
int lcoreGetMouseRay( lua_State *L );
|
||||
int lcoreGetCameraMatrix( lua_State *L );
|
||||
int lcoreGetWorldToScreen( lua_State *L );
|
||||
|
||||
@@ -24,6 +24,7 @@ void uluaPushVector3( lua_State *L, Vector3 vector );
|
||||
void uluaPushVector4( lua_State *L, Vector4 vector );
|
||||
void uluaPushRectangle( lua_State *L, Rectangle rect );
|
||||
void uluaPushMatrix( lua_State *L, Matrix matrix );
|
||||
void uluaPushRay( lua_State *L, Ray ray );
|
||||
void uluaPushRayCollision( lua_State *L, RayCollision rayCol );
|
||||
|
||||
int uluaGetTableLen( lua_State *L );
|
||||
|
||||
83
src/core.c
83
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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user