using Raylib;
using static Raylib.Raylib;
public partial class core_2d_camera
{
    /*******************************************************************************************
    *
    *   raylib [core] example - 2d camera
    *
    *   This example has been created using raylib 1.5 (www.raylib.com)
    *   raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
    *
    *   Copyright (c) 2016 Ramon Santamaria (@raysan5)
    *
    ********************************************************************************************/


    public const int MAX_BUILDINGS = 100;

    public static int Main()
    {
        // Initialization
        //--------------------------------------------------------------------------------------
        int screenWidth = 800;
        int screenHeight = 450;

        InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera");

        Rectangle player = new Rectangle( 400, 280, 40, 40 );
        Rectangle[] buildings = new Rectangle[MAX_BUILDINGS];
        Color[] buildColors = new Color[MAX_BUILDINGS];

        int spacing = 0;

        for (int i = 0; i < MAX_BUILDINGS; i++)
        {
            buildings[i].width = GetRandomValue(50, 200);
            buildings[i].height = GetRandomValue(100, 800);
            buildings[i].y = screenHeight - 130 - buildings[i].height;
            buildings[i].x = -6000 + spacing;

            spacing += (int)buildings[i].width;

            buildColors[i] = new Color( GetRandomValue(200, 240), GetRandomValue(200, 240), GetRandomValue(200, 250), 255 );
        }

        Camera2D camera;

        camera.target = new Vector2( player.x + 20, player.y + 20 );
        camera.offset = new Vector2( 0, 0 );
        camera.rotation = 0.0f;
        camera.zoom = 1.0f;

        SetTargetFPS(60);
        //--------------------------------------------------------------------------------------

        // Main game loop
        while (!WindowShouldClose())    // Detect window close button or ESC key
        {
            // Update
            //----------------------------------------------------------------------------------
            if (IsKeyDown(KEY_RIGHT))
            {
                player.x += 2;              // Player movement
                camera.offset.x -= 2;       // Camera3D displacement with player movement
            }
            else if (IsKeyDown(KEY_LEFT))
            {
                player.x -= 2;              // Player movement
                camera.offset.x += 2;       // Camera3D displacement with player movement
            }

            // Camera3D target follows player
            camera.target = new Vector2( player.x + 20, player.y + 20 );

            // Camera3D rotation controls
            if (IsKeyDown(KEY_A)) camera.rotation--;
            else if (IsKeyDown(KEY_S)) camera.rotation++;

            // Limit camera rotation to 80 degrees (-40 to 40)
            if (camera.rotation > 40) camera.rotation = 40;
            else if (camera.rotation < -40) camera.rotation = -40;

            // Camera3D zoom controls
            camera.zoom += ((float)GetMouseWheelMove()*0.05f);

            if (camera.zoom > 3.0f) camera.zoom = 3.0f;
            else if (camera.zoom < 0.1f) camera.zoom = 0.1f;

            // Camera3D reset (zoom and rotation)
            if (IsKeyPressed((int)KEY_R))
            {
                camera.zoom = 1.0f;
                camera.rotation = 0.0f;
            }
            //----------------------------------------------------------------------------------

            // Draw
            //----------------------------------------------------------------------------------
            BeginDrawing();

                ClearBackground(RAYWHITE);

                BeginMode2D(camera);

                    DrawRectangle(-6000, 320, 13000, 8000, DARKGRAY);

                    for (int i = 0; i < MAX_BUILDINGS; i++) DrawRectangleRec(buildings[i], buildColors[i]);

                    DrawRectangleRec(player, RED);

                    DrawRectangle((int)camera.target.x, -500, 1, screenHeight*4, GREEN);
                    DrawRectangle(-500, (int)camera.target.y, screenWidth*4, 1, GREEN);

                EndMode2D();

                DrawText("SCREEN AREA", 640, 10, 20, RED);

                DrawRectangle(0, 0, screenWidth, 5, RED);
                DrawRectangle(0, 5, 5, screenHeight - 10, RED);
                DrawRectangle(screenWidth - 5, 5, 5, screenHeight - 10, RED);
                DrawRectangle(0, screenHeight - 5, screenWidth, 5, RED);

                DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f));
                DrawRectangleLines( 10, 10, 250, 113, BLUE);

                DrawText("Free 2d camera controls:", 20, 20, 10, BLACK);
                DrawText("- Right/Left to move Offset", 40, 40, 10, DARKGRAY);
                DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY);
                DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY);
                DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY);

            EndDrawing();
            //----------------------------------------------------------------------------------
        }

        // De-Initialization
        //--------------------------------------------------------------------------------------   
        CloseWindow();        // Close window and OpenGL context
        //--------------------------------------------------------------------------------------

        return 0;
    }
}