summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorRay <[email protected]>2020-01-24 18:54:53 +0100
committerRay <[email protected]>2020-01-24 18:54:53 +0100
commiteee995ec3d1a84fe413693a666fb0b3f9c06c84a (patch)
tree27cf4ce09869b1cfd666f55f61eb4d23605d9ff2 /src
parenta3ca859db2fafd66b7a75d6750f10a05b49e40a0 (diff)
downloadraylib-eee995ec3d1a84fe413693a666fb0b3f9c06c84a.tar.gz
raylib-eee995ec3d1a84fe413693a666fb0b3f9c06c84a.zip
ADDED: GetWorldToScreenEx()
Addressing issue #1056
Diffstat (limited to 'src')
-rw-r--r--src/core.c64
-rw-r--r--src/raylib.h1
2 files changed, 37 insertions, 28 deletions
diff --git a/src/core.c b/src/core.c
index 7d7cf4bf..a31e1007 100644
--- a/src/core.c
+++ b/src/core.c
@@ -1522,43 +1522,51 @@ Matrix GetCameraMatrix2D(Camera2D camera)
// Returns the screen space position from a 3d world space position
Vector2 GetWorldToScreen(Vector3 position, Camera camera)
{
- // Calculate projection matrix (from perspective instead of frustum
- Matrix matProj = MatrixIdentity();
+ Vector2 screenPosition = GetWorldToScreenEx(position, camera, GetScreenWidth(), GetScreenHeight());
- if (camera.type == CAMERA_PERSPECTIVE)
- {
- // Calculate projection matrix from perspective
- matProj = MatrixPerspective(camera.fovy*DEG2RAD, ((double)GetScreenWidth()/(double)GetScreenHeight()), DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE);
- }
- else if (camera.type == CAMERA_ORTHOGRAPHIC)
- {
- float aspect = (float)screenWidth/(float)screenHeight;
- double top = camera.fovy/2.0;
- double right = top*aspect;
+ return screenPosition;
+}
- // Calculate projection matrix from orthographic
- matProj = MatrixOrtho(-right, right, -top, top, 0.01, 1000.0);
- }
+// Returns size position for a 3d world space position (useful for texture drawing)
+Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height)
+{
+ // Calculate projection matrix (from perspective instead of frustum
+ Matrix matProj = MatrixIdentity();
- // Calculate view matrix from camera look at (and transpose it)
- Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
+ if (camera.type == CAMERA_PERSPECTIVE)
+ {
+ // Calculate projection matrix from perspective
+ matProj = MatrixPerspective(camera.fovy * DEG2RAD, ((double)width/(double)height), DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE);
+ }
+ else if (camera.type == CAMERA_ORTHOGRAPHIC)
+ {
+ float aspect = (float)width/(float)height;
+ double top = camera.fovy/2.0;
+ double right = top*aspect;
- // Convert world position vector to quaternion
- Quaternion worldPos = { position.x, position.y, position.z, 1.0f };
+ // Calculate projection matrix from orthographic
+ matProj = MatrixOrtho(-right, right, -top, top, DEFAULT_NEAR_CULL_DISTANCE, DEFAULT_FAR_CULL_DISTANCE);
+ }
- // Transform world position to view
- worldPos = QuaternionTransform(worldPos, matView);
+ // Calculate view matrix from camera look at (and transpose it)
+ Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
- // Transform result to projection (clip space position)
- worldPos = QuaternionTransform(worldPos, matProj);
+ // Convert world position vector to quaternion
+ Quaternion worldPos = { position.x, position.y, position.z, 1.0f };
- // Calculate normalized device coordinates (inverted y)
- Vector3 ndcPos = { worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w };
+ // Transform world position to view
+ worldPos = QuaternionTransform(worldPos, matView);
- // Calculate 2d screen position vector
- Vector2 screenPosition = { (ndcPos.x + 1.0f)/2.0f*(float)GetScreenWidth(), (ndcPos.y + 1.0f)/2.0f*(float)GetScreenHeight() };
+ // Transform result to projection (clip space position)
+ worldPos = QuaternionTransform(worldPos, matProj);
- return screenPosition;
+ // Calculate normalized device coordinates (inverted y)
+ Vector3 ndcPos = { worldPos.x/worldPos.w, -worldPos.y/worldPos.w, worldPos.z/worldPos.w };
+
+ // Calculate 2d screen position vector
+ Vector2 sizePosition = { (ndcPos.x + 1.0f)/2.0f*(float)width, (ndcPos.y + 1.0f)/2.0f*(float)height };
+
+ return sizePosition;
}
// Returns the screen space position for a 2d camera world space position
diff --git a/src/raylib.h b/src/raylib.h
index a86aac86..946e71a2 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -920,6 +920,7 @@ RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a r
RLAPI Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix)
RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Returns camera 2d transform matrix
RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position for a 3d world space position
+RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Returns size position for a 3d world space position
RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Returns the screen space position for a 2d camera world space position
RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Returns the world space position for a 2d camera screen space position