|  | /******************************************************************************************* | 
						
						
							|  | * | 
						
						
							|  | *   raylib [core] example - smooth pixelperfect | 
						
						
							|  | * | 
						
						
							|  | *   Example complexity rating: [★★★☆] 3/4 | 
						
						
							|  | * | 
						
						
							|  | *   Example originally created with raylib 3.7, last time updated with raylib 4.0 | 
						
						
							|  | * | 
						
						
							|  | *   Example contributed by Giancamillo Alessandroni (@NotManyIdeasDev) and | 
						
						
							|  | *   reviewed by Ramon Santamaria (@raysan5) | 
						
						
							|  | * | 
						
						
							|  | *   Example licensed under an unmodified zlib/libpng license, which is an OSI-certified, | 
						
						
							|  | *   BSD-like license that allows static linking with closed source software | 
						
						
							|  | * | 
						
						
							|  | *   Copyright (c) 2021-2025 Giancamillo Alessandroni (@NotManyIdeasDev) and Ramon Santamaria (@raysan5) | 
						
						
							|  | * | 
						
						
							|  | ********************************************************************************************/ | 
						
						
							|  | 
 | 
						
						
							|  | #include "raylib.h" | 
						
						
							|  |  | 
						
						
							|  | #include <math.h>       // Required for: sinf(), cosf() | 
						
						
							|  |  | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | // Program main entry point | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | int main(void) | 
						
						
							|  | { | 
						
						
							|  |     // Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     const int screenWidth = 800; | 
						
						
							|  |     const int screenHeight = 450; | 
						
						
							|  | 
 | 
						
						
							|  |     const int virtualScreenWidth = 160; | 
						
						
							|  |     const int virtualScreenHeight = 90; | 
						
						
							|  | 
 | 
						
						
							|  |     const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth; | 
						
						
							|  | 
 | 
						
						
							|  |     InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixelperfect"); | 
						
						
							|  | 
 | 
						
						
							|  |     Camera2D worldSpaceCamera = { 0 };  // Game world camera | 
						
						
							|  |     worldSpaceCamera.zoom = 1.0f; | 
						
						
							|  | 
 | 
						
						
							|  |     Camera2D screenSpaceCamera = { 0 }; // Smoothing camera | 
						
						
							|  |     screenSpaceCamera.zoom = 1.0f; | 
						
						
							|  | 
 | 
						
						
							|  |     // Load render texture to draw all our objects | 
						
						
							|  |     RenderTexture2D target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); | 
						
						
							|  | 
 | 
						
						
							|  |     Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f }; | 
						
						
							|  |     Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f }; | 
						
						
							|  |     Rectangle rec03 = { 80.0f, 65.0f, 15.0f, 25.0f }; | 
						
						
							|  | 
 | 
						
						
							|  |     // The target's height is flipped (in the source Rectangle), due to OpenGL reasons | 
						
						
							|  |     Rectangle sourceRec = { 0.0f, 0.0f, (float)target.texture.width, -(float)target.texture.height }; | 
						
						
							|  |     Rectangle destRec = { -virtualRatio, -virtualRatio, screenWidth + (virtualRatio*2), screenHeight + (virtualRatio*2) }; | 
						
						
							|  | 
 | 
						
						
							|  |     Vector2 origin = { 0.0f, 0.0f }; | 
						
						
							|  | 
 | 
						
						
							|  |     float rotation = 0.0f; | 
						
						
							|  | 
 | 
						
						
							|  |     float cameraX = 0.0f; | 
						
						
							|  |     float cameraY = 0.0f; | 
						
						
							|  | 
 | 
						
						
							|  |     SetTargetFPS(60); | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     // Main game loop | 
						
						
							|  |     while (!WindowShouldClose())    // Detect window close button or ESC key | 
						
						
							|  |     { | 
						
						
							|  |         // Update | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         rotation += 60.0f*GetFrameTime();   // Rotate the rectangles, 60 degrees per second | 
						
						
							|  |  | 
						
						
							|  |         // Make the camera move to demonstrate the effect | 
						
						
							|  |         cameraX = (sinf((float)GetTime())*50.0f) - 10.0f; | 
						
						
							|  |         cameraY = cosf((float)GetTime())*30.0f; | 
						
						
							|  | 
 | 
						
						
							|  |         // Set the camera's target to the values computed above | 
						
						
							|  |         screenSpaceCamera.target = (Vector2){ cameraX, cameraY }; | 
						
						
							|  | 
 | 
						
						
							|  |         // Round worldSpace coordinates, keep decimals into screenSpace coordinates | 
						
						
							|  |         worldSpaceCamera.target.x = truncf(screenSpaceCamera.target.x); | 
						
						
							|  |         screenSpaceCamera.target.x -= worldSpaceCamera.target.x; | 
						
						
							|  |         screenSpaceCamera.target.x *= virtualRatio; | 
						
						
							|  | 
 | 
						
						
							|  |         worldSpaceCamera.target.y = truncf(screenSpaceCamera.target.y); | 
						
						
							|  |         screenSpaceCamera.target.y -= worldSpaceCamera.target.y; | 
						
						
							|  |         screenSpaceCamera.target.y *= virtualRatio; | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |         // Draw | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         BeginTextureMode(target); | 
						
						
							|  |             ClearBackground(RAYWHITE); | 
						
						
							|  | 
 | 
						
						
							|  |             BeginMode2D(worldSpaceCamera); | 
						
						
							|  |                 DrawRectanglePro(rec01, origin, rotation, BLACK); | 
						
						
							|  |                 DrawRectanglePro(rec02, origin, -rotation, RED); | 
						
						
							|  |                 DrawRectanglePro(rec03, origin, rotation + 45.0f, BLUE); | 
						
						
							|  |             EndMode2D(); | 
						
						
							|  |         EndTextureMode(); | 
						
						
							|  | 
 | 
						
						
							|  |         BeginDrawing(); | 
						
						
							|  |             ClearBackground(RED); | 
						
						
							|  | 
 | 
						
						
							|  |             BeginMode2D(screenSpaceCamera); | 
						
						
							|  |                 DrawTexturePro(target.texture, sourceRec, destRec, origin, 0.0f, WHITE); | 
						
						
							|  |             EndMode2D(); | 
						
						
							|  | 
 | 
						
						
							|  |             DrawText(TextFormat("Screen resolution: %ix%i", screenWidth, screenHeight), 10, 10, 20, DARKBLUE); | 
						
						
							|  |             DrawText(TextFormat("World resolution: %ix%i", virtualScreenWidth, virtualScreenHeight), 10, 40, 20, DARKGREEN); | 
						
						
							|  |             DrawFPS(GetScreenWidth() - 95, 10); | 
						
						
							|  |         EndDrawing(); | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |     } | 
						
						
							|  | 
 | 
						
						
							|  |     // De-Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     UnloadRenderTexture(target);    // Unload render texture | 
						
						
							|  |  | 
						
						
							|  |     CloseWindow();                  // Close window and OpenGL context | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     return 0; | 
						
						
							|  | } |