From 1a79ffd7668200c1d278c614ccc1f749084fcf89 Mon Sep 17 00:00:00 2001 From: Gianni Alessandroni <45824238+NotManyIdeasDev@users.noreply.github.com> Date: Sun, 9 May 2021 21:31:49 +0200 Subject: [PATCH] Precomputed rectangles, time-based movement and whitespace fix Moved the source and destination rectangles for the renderTexture into their own variables, modified the animation to be time-based instead of frame-based, fixed the bug with whitespaces. --- .../core/core_2d_camera_smooth_pixelperfect.c | 46 ++++++++----------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/examples/core/core_2d_camera_smooth_pixelperfect.c b/examples/core/core_2d_camera_smooth_pixelperfect.c index 7d8b30492..21da3e7dc 100644 --- a/examples/core/core_2d_camera_smooth_pixelperfect.c +++ b/examples/core/core_2d_camera_smooth_pixelperfect.c @@ -41,8 +41,14 @@ int main(void) Rectangle secondRectangle = { 90.0f, 55.0f, 30.0f, 10.0f }; Rectangle thirdRectangle = { 80.0f, 65.0f, 15.0f, 25.0f }; + //The renderTexture's height is flipped (in the source Rectangle), due to OpenGL reasons. + Rectangle renderTextureSource = { 0.0f, 0.0f, (float)renderTexture.texture.width, (float)-renderTexture.texture.height }; + Rectangle renderTextureDest = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio * 2), screenHeight + (virtualRatio * 2) }; + Vector2 origin = { 0.0f, 0.0f }; + float rotation = 0.0f; + float degreesPerSecond = 60.0f; float cameraX = 0.0f; float cameraY = 0.0f; @@ -55,28 +61,30 @@ int main(void) { // Update //---------------------------------------------------------------------------------- - rotation++; // Rotate the rectangles. + rotation += degreesPerSecond * GetFrameTime(); // Rotate the rectangles. // Make the camera move to demonstrate the effect. cameraX = (sin(GetTime()) * 50.0f) - 10.0f; cameraY = cos(GetTime()) * 30.0f; + // Set the camera's target to the values computed above. screenSpaceCamera.target = (Vector2){ cameraX, cameraY }; - if (screenSpaceCamera.target.x >= 1 || screenSpaceCamera.target.x <= -1) // Round worldCamera's X, keep the decimals on screenSpaceCamera. + // Round worldCamera's X, keep the decimals on screenSpaceCamera. + if (screenSpaceCamera.target.x >= 1 || screenSpaceCamera.target.x <= -1) { worldSpaceCamera.target.x = (int)screenSpaceCamera.target.x; screenSpaceCamera.target.x -= worldSpaceCamera.target.x; screenSpaceCamera.target.x *= virtualRatio; } - if (screenSpaceCamera.target.y >= 1 || screenSpaceCamera.target.y <= -1) // Round worldCamera's Y, keep the decimals on screenSpaceCamera. + // Round worldCamera's Y, keep the decimals on screenSpaceCamera. + if (screenSpaceCamera.target.y >= 1 || screenSpaceCamera.target.y <= -1) { worldSpaceCamera.target.y = (int)screenSpaceCamera.target.y; screenSpaceCamera.target.y -= worldSpaceCamera.target.y; screenSpaceCamera.target.y *= virtualRatio; } - //---------------------------------------------------------------------------------- // Draw @@ -85,9 +93,7 @@ int main(void) ClearBackground(RED); // This is for debug purposes. If you see red, then you've probably done something wrong. BeginTextureMode(renderTexture); - BeginMode2D(worldSpaceCamera); - ClearBackground(RAYWHITE); // This is the color you should see as background color. // Draw the rectangles @@ -96,45 +102,33 @@ int main(void) DrawRectanglePro(thirdRectangle, origin, rotation + 45.0f, BLUE); EndMode2D(); - EndTextureMode(); BeginMode2D(screenSpaceCamera); // Draw the render texture with an offset of 1 worldSpace unit/pixel, so that the content behind the renderTexture is not shown. - // Also the renderTexture's height is flipped (in the source Rectangle), due to OpenGL reasons. DrawTexturePro( renderTexture.texture, - (Rectangle) - { - 0.0f, 0.0f, (float)renderTexture.texture.width, (float)-renderTexture.texture.height - }, - (Rectangle) - { - -virtualRatio, -virtualRatio, screenWidth + (virtualRatio * 2), screenHeight + (virtualRatio * 2) - }, - (Vector2) - { - 0.0f, 0.0f - }, - 0.0f, - WHITE - ); + renderTextureSource, + renderTextureDest, + origin, + 0.0f, + WHITE + ); EndMode2D(); + //Debug info DrawText("Screen resolution: 800x450", 5, 0, 20, DARKBLUE); DrawText("World resolution: 160x90", 5, 20, 20, DARKGREEN); - + DrawFPS(screenWidth - 75, 0); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- - UnloadRenderTexture(renderTexture); // RenderTexture unloading - CloseWindow(); // Close window and OpenGL context //--------------------------------------------------------------------------------------