From 9a5dddc311d890c30474d8ac28e6887ffd11688e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Almeida?= <60551627+luis605@users.noreply.github.com> Date: Sun, 4 Feb 2024 10:37:10 +0000 Subject: [PATCH] Added viewport independent raycast (#3709) * added viewport independent raycast * Renamed GetMouseRayEx to GetViewRay --- src/raylib.h | 1 + src/rcore.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/raylib.h b/src/raylib.h index 4c4b191c0..e2404a324 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1050,6 +1050,7 @@ RLAPI void UnloadShader(Shader shader); // Un // Screen-space-related functions RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Get a ray trace from mouse position +RLAPI Ray GetViewRay(Vector2 mousePosition, Camera camera, float width, float height); // Get a ray trace from mouse position in a viewport RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position diff --git a/src/rcore.c b/src/rcore.c index 784b9b621..48c863f56 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -1404,14 +1404,20 @@ void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture) //---------------------------------------------------------------------------------- // Get a ray trace from mouse position -Ray GetMouseRay(Vector2 mouse, Camera camera) +Ray GetMouseRay(Vector2 mousePosition, Camera camera) +{ + return GetViewRay(mousePosition, camera, GetScreenWidth(), GetScreenHeight()); +} + +// Get a ray trace from the mouse position within a specific section of the screen +Ray GetViewRay(Vector2 mousePosition, Camera camera, float width, float height) { Ray ray = { 0 }; // Calculate normalized device coordinates // NOTE: y value is negative - float x = (2.0f*mouse.x)/(float)GetScreenWidth() - 1.0f; - float y = 1.0f - (2.0f*mouse.y)/(float)GetScreenHeight(); + float x = (2.0f*mousePosition.x)/width - 1.0f; + float y = 1.0f - (2.0f*mousePosition.y)/height; float z = 1.0f; // Store values in a vector @@ -1425,11 +1431,11 @@ Ray GetMouseRay(Vector2 mouse, Camera camera) if (camera.projection == CAMERA_PERSPECTIVE) { // Calculate projection matrix from perspective - matProj = MatrixPerspective(camera.fovy*DEG2RAD, ((double)GetScreenWidth()/(double)GetScreenHeight()), RL_CULL_DISTANCE_NEAR, RL_CULL_DISTANCE_FAR); + matProj = MatrixPerspective(camera.fovy*DEG2RAD, ((double)width/(double)height), RL_CULL_DISTANCE_NEAR, RL_CULL_DISTANCE_FAR); } else if (camera.projection == CAMERA_ORTHOGRAPHIC) { - double aspect = (double)CORE.Window.screen.width/(double)CORE.Window.screen.height; + double aspect = (double)width/(double)height; double top = camera.fovy/2.0; double right = top*aspect;