From be3222a70e1a695e32819aef4cb8c0a6b14a7fd4 Mon Sep 17 00:00:00 2001 From: coco24 <1281299809@qq.com> Date: Sun, 7 Jul 2024 17:10:42 +0800 Subject: [PATCH] [rmodels] Make `DrawBillboardPro` consistent with `DrawTexturePro` --- examples/models/models_billboard.c | 12 +++++++----- src/rmodels.c | 12 ++---------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/examples/models/models_billboard.c b/examples/models/models_billboard.c index 237e1b69d3b8..7ad28513ffdf 100644 --- a/examples/models/models_billboard.c +++ b/examples/models/models_billboard.c @@ -44,10 +44,12 @@ int main(void) // NOTE: Billboard locked on axis-Y Vector3 billUp = { 0.0f, 1.0f, 0.0f }; + // Set the height of the rotating billboard to 1.0 with the aspect ratio fixed + Vector2 size = { source.width / source.height, 1.0f }; + // Rotate around origin // Here we choose to rotate around the image center - // NOTE: (-1, 1) is the range where origin.x, origin.y is inside the texture - Vector2 rotateOrigin = { 0.0f }; + Vector2 origin = Vector2Scale(size, 0.5f); // Distance is needed for the correct billboard draw order // Larger distance (further away from the camera) should be drawn prior to smaller distance. @@ -84,11 +86,11 @@ int main(void) if (distanceStatic > distanceRotating) { DrawBillboard(camera, bill, billPositionStatic, 2.0f, WHITE); - DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, (Vector2) {1.0f, 1.0f}, rotateOrigin, rotation, WHITE); + DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, size, origin, rotation, WHITE); } else { - DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, (Vector2) {1.0f, 1.0f}, rotateOrigin, rotation, WHITE); + DrawBillboardPro(camera, bill, source, billPositionRotating, billUp, size, origin, rotation, WHITE); DrawBillboard(camera, bill, billPositionStatic, 2.0f, WHITE); } @@ -108,4 +110,4 @@ int main(void) //-------------------------------------------------------------------------------------- return 0; -} \ No newline at end of file +} diff --git a/src/rmodels.c b/src/rmodels.c index f8157cd3a701..ca58d8ce7c86 100644 --- a/src/rmodels.c +++ b/src/rmodels.c @@ -3642,7 +3642,7 @@ void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float siz { Rectangle source = { 0.0f, 0.0f, (float)texture.width, (float)texture.height }; - DrawBillboardRec(camera, texture, source, position, (Vector2){ size, size }, tint); + DrawBillboardRec(camera, texture, source, position, (Vector2) { size*fabsf((float)source.width/source.height), size }, tint); } // Draw a billboard (part of a texture defined by a rectangle) @@ -3651,16 +3651,12 @@ void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector // NOTE: Billboard locked on axis-Y Vector3 up = { 0.0f, 1.0f, 0.0f }; - DrawBillboardPro(camera, texture, source, position, up, size, Vector2Zero(), 0.0f, tint); + DrawBillboardPro(camera, texture, source, position, up, size, Vector2Scale(size, 0.5), 0.0f, tint); } // Draw a billboard with additional parameters -// NOTE: Size defines the destination rectangle size, stretching the source texture as required void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint) { - // NOTE: Billboard size will maintain source rectangle aspect ratio, size will represent billboard width - size = (Vector2) { size.x*fabsf((float)source.width/source.height), size.y }; - // Compute the up vector and the right vector Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up); Vector3 right = { matView.m0, matView.m4, matView.m8 }; @@ -3683,10 +3679,6 @@ void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector origin.y *= -1.0f; } - // Assume the given origin is normalized and does not alter the position of the billboard - position = Vector3Add(position, Vector3Scale(Vector3Add(Vector3Scale(right, origin.x), Vector3Scale(up, origin.y)), 0.5f)); - origin = Vector2Multiply(Vector2Scale(Vector2Add(origin, Vector2One()), 0.5f), (Vector2) { fabsf(size.x), fabsf(size.y) }); - // Draw the texture region described by source on the following rectangle in 3D space: // // size.x <--.