|  | /******************************************************************************************* | 
						
						
							|  | * | 
						
						
							|  | *   raylib [textures] example - Bunnymark | 
						
						
							|  | * | 
						
						
							|  | *   Example originally created with raylib 1.6, last time updated with raylib 2.5 | 
						
						
							|  | * | 
						
						
							|  | *   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) 2014-2024 Ramon Santamaria (@raysan5) | 
						
						
							|  | * | 
						
						
							|  | ********************************************************************************************/ | 
						
						
							|  | 
 | 
						
						
							|  | #include "raylib.h" | 
						
						
							|  |  | 
						
						
							|  | #include <stdlib.h>                 // Required for: malloc(), free() | 
						
						
							|  |  | 
						
						
							|  | #define MAX_BUNNIES        50000    // 50K bunnies limit | 
						
						
							|  |  | 
						
						
							|  | // This is the maximum amount of elements (quads) per batch | 
						
						
							|  | // NOTE: This value is defined in [rlgl] module and can be changed there | 
						
						
							|  | #define MAX_BATCH_ELEMENTS  8192 | 
						
						
							|  |  | 
						
						
							|  | typedef struct Bunny { | 
						
						
							|  |     Vector2 position; | 
						
						
							|  |     Vector2 speed; | 
						
						
							|  |     Color color; | 
						
						
							|  | } Bunny; | 
						
						
							|  | 
 | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | // Program main entry point | 
						
						
							|  | //------------------------------------------------------------------------------------ | 
						
						
							|  | int main(void) | 
						
						
							|  | { | 
						
						
							|  |     // Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     const int screenWidth = 800; | 
						
						
							|  |     const int screenHeight = 450; | 
						
						
							|  | 
 | 
						
						
							|  |     InitWindow(screenWidth, screenHeight, "raylib [textures] example - bunnymark"); | 
						
						
							|  | 
 | 
						
						
							|  |     // Load bunny texture | 
						
						
							|  |     Texture2D texBunny = LoadTexture("resources/wabbit_alpha.png"); | 
						
						
							|  | 
 | 
						
						
							|  |     Bunny *bunnies = (Bunny *)malloc(MAX_BUNNIES*sizeof(Bunny));    // Bunnies array | 
						
						
							|  |  | 
						
						
							|  |     int bunniesCount = 0;           // Bunnies counter | 
						
						
							|  |  | 
						
						
							|  |     SetTargetFPS(60);               // Set our game to run at 60 frames-per-second | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     // Main game loop | 
						
						
							|  |     while (!WindowShouldClose())    // Detect window close button or ESC key | 
						
						
							|  |     { | 
						
						
							|  |         // Update | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) | 
						
						
							|  |         { | 
						
						
							|  |             // Create more bunnies | 
						
						
							|  |             for (int i = 0; i < 100; i++) | 
						
						
							|  |             { | 
						
						
							|  |                 if (bunniesCount < MAX_BUNNIES) | 
						
						
							|  |                 { | 
						
						
							|  |                     bunnies[bunniesCount].position = GetMousePosition(); | 
						
						
							|  |                     bunnies[bunniesCount].speed.x = (float)GetRandomValue(-250, 250)/60.0f; | 
						
						
							|  |                     bunnies[bunniesCount].speed.y = (float)GetRandomValue(-250, 250)/60.0f; | 
						
						
							|  |                     bunnies[bunniesCount].color = (Color){ GetRandomValue(50, 240), | 
						
						
							|  |                                                        GetRandomValue(80, 240), | 
						
						
							|  |                                                        GetRandomValue(100, 240), 255 }; | 
						
						
							|  |                     bunniesCount++; | 
						
						
							|  |                 } | 
						
						
							|  |             } | 
						
						
							|  |         } | 
						
						
							|  | 
 | 
						
						
							|  |         // Update bunnies | 
						
						
							|  |         for (int i = 0; i < bunniesCount; i++) | 
						
						
							|  |         { | 
						
						
							|  |             bunnies[i].position.x += bunnies[i].speed.x; | 
						
						
							|  |             bunnies[i].position.y += bunnies[i].speed.y; | 
						
						
							|  | 
 | 
						
						
							|  |             if (((bunnies[i].position.x + texBunny.width/2) > GetScreenWidth()) || | 
						
						
							|  |                 ((bunnies[i].position.x + texBunny.width/2) < 0)) bunnies[i].speed.x *= -1; | 
						
						
							|  |             if (((bunnies[i].position.y + texBunny.height/2) > GetScreenHeight()) || | 
						
						
							|  |                 ((bunnies[i].position.y + texBunny.height/2 - 40) < 0)) bunnies[i].speed.y *= -1; | 
						
						
							|  |         } | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |         // Draw | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |         BeginDrawing(); | 
						
						
							|  | 
 | 
						
						
							|  |             ClearBackground(RAYWHITE); | 
						
						
							|  | 
 | 
						
						
							|  |             for (int i = 0; i < bunniesCount; i++) | 
						
						
							|  |             { | 
						
						
							|  |                 // NOTE: When internal batch buffer limit is reached (MAX_BATCH_ELEMENTS), | 
						
						
							|  |                 // a draw call is launched and buffer starts being filled again; | 
						
						
							|  |                 // before issuing a draw call, updated vertex data from internal CPU buffer is send to GPU... | 
						
						
							|  |                 // Process of sending data is costly and it could happen that GPU data has not been completely | 
						
						
							|  |                 // processed for drawing while new data is tried to be sent (updating current in-use buffers) | 
						
						
							|  |                 // it could generates a stall and consequently a frame drop, limiting the number of drawn bunnies | 
						
						
							|  |                 DrawTexture(texBunny, (int)bunnies[i].position.x, (int)bunnies[i].position.y, bunnies[i].color); | 
						
						
							|  |             } | 
						
						
							|  | 
 | 
						
						
							|  |             DrawRectangle(0, 0, screenWidth, 40, BLACK); | 
						
						
							|  |             DrawText(TextFormat("bunnies: %i", bunniesCount), 120, 10, 20, GREEN); | 
						
						
							|  |             DrawText(TextFormat("batched draw calls: %i", 1 + bunniesCount/MAX_BATCH_ELEMENTS), 320, 10, 20, MAROON); | 
						
						
							|  | 
 | 
						
						
							|  |             DrawFPS(10, 10); | 
						
						
							|  | 
 | 
						
						
							|  |         EndDrawing(); | 
						
						
							|  |         //---------------------------------------------------------------------------------- | 
						
						
							|  |     } | 
						
						
							|  | 
 | 
						
						
							|  |     // De-Initialization | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |     free(bunnies);              // Unload bunnies data array | 
						
						
							|  |  | 
						
						
							|  |     UnloadTexture(texBunny);    // Unload bunny texture | 
						
						
							|  |  | 
						
						
							|  |     CloseWindow();              // Close window and OpenGL context | 
						
						
							|  |     //-------------------------------------------------------------------------------------- | 
						
						
							|  |  | 
						
						
							|  |     return 0; | 
						
						
							|  | }
 |