|
|
|
@ -0,0 +1,146 @@ |
|
|
|
/******************************************************************************************* |
|
|
|
* |
|
|
|
* 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; |
|
|
|
} |