using Raylib;
using static Raylib.Raylib;

public partial class Examples
{
    /*******************************************************************************************
    *
    *   raylib example - Bunnymark
    *
    *   This example has been created using raylib 1.6 (www.raylib.com)
    *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
    *
    *   Copyright (c) 2014 Ramon Santamaria (@raysan5)
    *
    ********************************************************************************************/
    
    
    public const #define MAX_BUNNIES     100000       // 100K bunnies

    struct Bunny
{        public     Vector2 position;
    public     Vector2 speed;
    public     Color color;
    public } Bunny;
    
    public static int bunnymark()
    {
        // Initialization
        //--------------------------------------------------------------------------------------
        int screenWidth = 1280;
        int screenHeight = 960;
    
        InitWindow(screenWidth, screenHeight, "raylib example - Bunnymark");
    
        Texture2D texBunny = LoadTexture("resources/wabbit_alpha.png");
    
        Bunny *bunnies = (Bunny *)malloc(MAX_BUNNIES*sizeof(Bunny));          // Bunnies array
    
        int bunniesCount = 0;    // Bunnies counter
    
        SetTargetFPS(60);
        //--------------------------------------------------------------------------------------
    
        // Main game loop
        while (!WindowShouldClose())    // Detect window close button or ESC key
        {
            // Update
            //----------------------------------------------------------------------------------
            if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
            {
                // Create more bunnies
                for (int i = 0; i < 100; i++)
                {
                    bunnies[bunniesCount].position = GetMousePosition();
                    bunnies[bunniesCount].speed.x = (float)GetRandomValue(250, 500)/60.0f;
                    bunnies[bunniesCount].speed.y = (float)(GetRandomValue(250, 500) - 500)/60.0f;
                    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 > GetScreenWidth()) || (bunnies[i].position.x < 0)) bunnies[i].speed.x *= -1;
                if ((bunnies[i].position.y > GetScreenHeight()) || (bunnies[i].position.y < 0)) bunnies[i].speed.y *= -1;
            }
            //----------------------------------------------------------------------------------
    
            // Draw
            //----------------------------------------------------------------------------------
            BeginDrawing();
    
                ClearBackground(RAYWHITE);
    
                for (int i = 0; i < bunniesCount; i++)
                {
                    // NOTE: When internal QUADS batch limit is reached, a draw call is launched and
                    // batching buffer starts being filled again; before launching the draw call,
                    // updated vertex data from internal buffer is send to GPU... it seems it generates
                    // a stall and consequently a frame drop, limiting number of bunnies drawn at 60 fps
                    DrawTexture(texBunny, bunnies[i].position.x, bunnies[i].position.y, RAYWHITE);
                }
    
                DrawRectangle(0, 0, screenWidth, 40, LIGHTGRAY);
                DrawText("raylib bunnymark", 10, 10, 20, DARKGRAY);
                DrawText(FormatText("bunnies: %i", bunniesCount), 400, 10, 20, RED);
                DrawFPS(260, 10);
    
            EndDrawing();
            //----------------------------------------------------------------------------------
        }
    
        // De-Initialization
        //--------------------------------------------------------------------------------------
        free(bunnies);
    
        CloseWindow();        // Close window and OpenGL context
        //--------------------------------------------------------------------------------------
    
        return 0;
    }
        
}
