From 274a0b58548fddff11a5ef29adcb17a1e290e645 Mon Sep 17 00:00:00 2001 From: Per Hultqvist Date: Thu, 17 Oct 2024 11:54:12 +0200 Subject: [PATCH] New example : Textures/npatch_drawing --- examples/textures/npatch_drawing/main.go | 134 ++++++++++++++++++ .../npatch_drawing/ninepatch_button.png | Bin 0 -> 5902 bytes 2 files changed, 134 insertions(+) create mode 100644 examples/textures/npatch_drawing/main.go create mode 100644 examples/textures/npatch_drawing/ninepatch_button.png diff --git a/examples/textures/npatch_drawing/main.go b/examples/textures/npatch_drawing/main.go new file mode 100644 index 0000000..84048c0 --- /dev/null +++ b/examples/textures/npatch_drawing/main.go @@ -0,0 +1,134 @@ +/******************************************************************************************* +* +* raylib [textures] example - N-patch drawing +* +* NOTE: Images are loaded in CPU memory (RAM); textures are loaded in GPU memory (VRAM) +* +* Example originally created with raylib 2.0, last time updated with raylib 2.5 +* +* Example contributed by Jorge A. Gomes (@overdev) 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) 2018-2024 Jorge A. Gomes (@overdev) and Ramon Santamaria (@raysan5) +* +********************************************************************************************/ +package main + +import rl "github.com/gen2brain/raylib-go/raylib" + +const ( + screenWidth = 800 + screenHeight = 450 +) + +func main() { + rl.InitWindow(screenWidth, screenHeight, "raylib [textures] example - N-patch drawing") + + // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) + nPatchTexture := rl.LoadTexture("ninepatch_button.png") + + var mousePosition rl.Vector2 + var origin rl.Vector2 + + // Position and size of the n-patches + dstRec1 := rl.Rectangle{X: 480.0, Y: 160.0, Width: 32.0, Height: 32.0} + dstRec2 := rl.Rectangle{X: 160.0, Y: 160.0, Width: 32.0, Height: 32.0} + dstRecH := rl.Rectangle{X: 160.0, Y: 93.0, Width: 32.0, Height: 32.0} + dstRecV := rl.Rectangle{X: 92.0, Y: 160.0, Width: 32.0, Height: 32.0} + + // A 9-patch (NPatchNinePatch) changes its sizes in both axis + ninePatchInfo1 := rl.NPatchInfo{ + Source: rl.Rectangle{Width: 64.0, Height: 64.0}, + Left: 12, + Top: 40, + Right: 12, + Bottom: 12, + Layout: rl.NPatchNinePatch, + } + ninePatchInfo2 := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 128.0, Width: 64.0, Height: 64.0}, + Left: 16, + Top: 16, + Right: 16, + Bottom: 16, + Layout: rl.NPatchNinePatch, + } + + // A horizontal 3-patch (NPatchThreePatchHorizontal) changes its sizes along the x-axis only + h3PatchInfo := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 64.0, Width: 64.0, Height: 64.0}, + Left: 8, + Top: 8, + Right: 8, + Bottom: 8, + Layout: rl.NPatchThreePatchHorizontal, + } + + // A vertical 3-patch (NPatchThreePatchVertical) changes its sizes along the y-axis only + v3PatchInfo := rl.NPatchInfo{ + Source: rl.Rectangle{Y: 192.0, Width: 64.0, Height: 64.0}, + Left: 6, + Top: 6, + Right: 6, + Bottom: 6, + Layout: rl.NPatchThreePatchVertical, + } + + rl.SetTargetFPS(60) + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + mousePosition = rl.GetMousePosition() + + // Resize the n-patches based on mouse position + dstRec1.Width = mousePosition.X - dstRec1.X + dstRec1.Height = mousePosition.Y - dstRec1.Y + dstRec2.Width = mousePosition.X - dstRec2.X + dstRec2.Height = mousePosition.Y - dstRec2.Y + dstRecH.Width = mousePosition.X - dstRecH.X + dstRecV.Height = mousePosition.Y - dstRecV.Y + + // Set a minimum Width and/or Height + dstRec1.Width = clamp(dstRec1.Width, 1, 300) + dstRec1.Height = clamp(dstRec1.Height, 1, screenHeight) + dstRec2.Width = clamp(dstRec2.Width, 1, 300) + dstRec2.Height = clamp(dstRec2.Height, 1, screenHeight) + dstRecH.Width = clamp(dstRecH.Width, 1, screenWidth) + dstRecV.Height = clamp(dstRecV.Height, 1, screenHeight) + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + + // Draw the n-patches + rl.DrawTextureNPatch(nPatchTexture, ninePatchInfo2, dstRec2, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, ninePatchInfo1, dstRec1, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, h3PatchInfo, dstRecH, origin, 0.0, rl.White) + rl.DrawTextureNPatch(nPatchTexture, v3PatchInfo, dstRecV, origin, 0.0, rl.White) + + // Draw the source texture + rl.DrawRectangleLines(5, 88, 74, 266, rl.Blue) + rl.DrawTexture(nPatchTexture, 10, 93, rl.White) + rl.DrawText("TEXTURE", 15, 360, 10, rl.DarkGray) + + rl.DrawText("Move the mouse to stretch or shrink the n-patches", 10, 20, 20, rl.DarkGray) + + rl.EndDrawing() + } + + // De-Initialization + rl.UnloadTexture(nPatchTexture) // Texture unloading + rl.CloseWindow() // Close window and OpenGL context +} + +func clamp(value, min, max float32) float32 { + if value < min { + return min + } + if value > max { + return max + } + return value +} diff --git a/examples/textures/npatch_drawing/ninepatch_button.png b/examples/textures/npatch_drawing/ninepatch_button.png new file mode 100644 index 0000000000000000000000000000000000000000..f10037a0fc1664dcbdcc027ec3cdbb5757098835 GIT binary patch literal 5902 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 literal 0 HcmV?d00001