/******************************************************************************************* * * raylib [shapes] example - lines drawing * * Example complexity rating: [★☆☆☆] 1/4 * * Example originally created with raylib 5.6-dev, last time updated with raylib 5.6 * * Example contributed by Robin (@RobinsAviary) 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) 2025-2025 Robin (@RobinsAviary) * ********************************************************************************************/ #include "raylib.h" #include "raymath.h" //------------------------------------------------------------------------------------ // Program main entry point //------------------------------------------------------------------------------------ int main(void) { // Initialization //-------------------------------------------------------------------------------------- const int screenWidth = 800; const int screenHeight = 450; InitWindow(screenWidth, screenHeight, "raylib [shapes] example - lines drawing"); // Hint text that shows before you click the screen bool startText = true; // The mouse's position on the previous frame Vector2 mousePositionPrevious = GetMousePosition(); // The canvas to draw lines on RenderTexture canvas = LoadRenderTexture(screenWidth, screenHeight); // The background color of the canvas const Color backgroundColor = RAYWHITE; // The line's thickness float lineThickness = 8.0f; // The lines hue (in HSV, from 0-360) float lineHue = 0.0f; // Clear the canvas to the background color BeginTextureMode(canvas); ClearBackground(backgroundColor); EndTextureMode(); //-------------------------------------------------------------------------------------- // Main game loop while (!WindowShouldClose()) // Detect window close button or ESC key { // Update //---------------------------------------------------------------------------------- // Disable the hint text once the user clicks if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && startText) { startText = false; } // Clear the canvas when the user middle-clicks if (IsMouseButtonPressed(MOUSE_BUTTON_MIDDLE)) { BeginTextureMode(canvas); ClearBackground(backgroundColor); EndTextureMode(); } // Store whether the left and right buttons are down bool leftButtonDown = IsMouseButtonDown(MOUSE_BUTTON_LEFT); bool rightButtonDown = IsMouseButtonDown(MOUSE_BUTTON_RIGHT); if (leftButtonDown || rightButtonDown) { // The color for the line Color drawColor; if (leftButtonDown) { // Increase the hue value by the distance our cursor has moved since the last frame (divided by 3) lineHue += Vector2Distance(mousePositionPrevious, GetMousePosition())/3.0f; // While the hue is >=360, subtract it to bring it down into the range 0-360 // This is more visually accurate than resetting to zero while (lineHue >= 360.0f) { lineHue -= 360.0f; } // Create the final color drawColor = ColorFromHSV(lineHue, 1.0f, 1.0f); } else if (rightButtonDown) { // Use the background color as an "eraser" drawColor = backgroundColor; } // Draw the line onto the canvas BeginTextureMode(canvas); // Circles act as "caps", smoothing corners DrawCircleV(mousePositionPrevious, lineThickness/2.0f, drawColor); DrawCircleV(GetMousePosition(), lineThickness/2.0f, drawColor); DrawLineEx(mousePositionPrevious, GetMousePosition(), lineThickness, drawColor); EndTextureMode(); } // Update line thickness based on mousewheel lineThickness += GetMouseWheelMove(); lineThickness = Clamp(lineThickness, 1.0, 500.0f); // Update mouse's previous position mousePositionPrevious = GetMousePosition(); //---------------------------------------------------------------------------------- // Draw //---------------------------------------------------------------------------------- BeginDrawing(); // Draw the render texture to the screen, flipped vertically to make it appear top-side up DrawTextureRec(canvas.texture, (Rectangle){ 0.0f, 0.0f, (float)canvas.texture.width,(float)-canvas.texture.height }, Vector2Zero(), WHITE); // Draw the preview circle if (!leftButtonDown) DrawCircleLinesV(GetMousePosition(), lineThickness/2.0f, (Color){ 127, 127, 127, 127 }); // Draw the hint text if (startText) DrawText("try clicking and dragging!", 275, 215, 20, LIGHTGRAY); EndDrawing(); //---------------------------------------------------------------------------------- } // De-Initialization //-------------------------------------------------------------------------------------- // Unload the canvas render texture UnloadRenderTexture(canvas); CloseWindow(); // Close window and OpenGL context //-------------------------------------------------------------------------------------- return 0; }