From f529bc28970511c9ae5eb92fee8f743b7003d6b4 Mon Sep 17 00:00:00 2001 From: Palessan Date: Fri, 28 Jun 2024 12:50:30 +0300 Subject: [PATCH 1/4] Adding gif and sprite animation examples. -Added new UpdateTextureUnsafe method to support it. --- examples/textures/textures_gif_player/main.go | 111 ++++++++++++++++++ .../textures_gif_player/scarfy_run.gif | Bin 0 -> 21261 bytes .../textures/textures_sprite_anim/main.go | 94 +++++++++++++++ .../textures/textures_sprite_anim/scarfy.png | Bin 0 -> 10394 bytes raylib/raylib.go | 4 +- raylib/rtextures.go | 8 ++ 6 files changed, 215 insertions(+), 2 deletions(-) create mode 100644 examples/textures/textures_gif_player/main.go create mode 100644 examples/textures/textures_gif_player/scarfy_run.gif create mode 100644 examples/textures/textures_sprite_anim/main.go create mode 100644 examples/textures/textures_sprite_anim/scarfy.png diff --git a/examples/textures/textures_gif_player/main.go b/examples/textures/textures_gif_player/main.go new file mode 100644 index 0000000..784513a --- /dev/null +++ b/examples/textures/textures_gif_player/main.go @@ -0,0 +1,111 @@ +package main + +import ( + "fmt" + "unsafe" + + rl "github.com/gen2brain/raylib-go/raylib" +) + +func main() { + + const MAX_FRAME_DELAY int32 = 20 + const MIN_FRAME_DELAY int32 = 1 + + // Initialization + const screenWidth int32 = 800 + const screenHeight int32 = 450 + + rl.InitWindow(screenWidth, screenHeight, "raylib [textures] example - gif playing") + + var animFrames int32 = 0 + + // Load all GIF animation frames into a single Image + // NOTE: GIF data is always loaded as RGBA (32bit) by default + // NOTE: Frames are just appended one after another in image.data memory + var imScarfyAnim *rl.Image = rl.LoadImageAnim("scarfy_run.gif", &animFrames) + + // Load texture from image + // NOTE: We will update this texture when required with next frame data + // WARNING: It's not recommended to use this technique for sprites animation, + // use spritesheets instead, like illustrated in textures_sprite_anim example + var texScarfyAnim rl.Texture2D = rl.LoadTextureFromImage(imScarfyAnim) + + var nextFrameDataOffset uint32 = 0 // Current byte offset to next frame in image.data + + var currentAnimFrame int32 = 0 // Current animation frame to load and draw + var frameDelay int32 = 8 // Frame delay to switch between animation frames + var frameCounter int32 = 0 // General frames counter + + rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second + + // Main game loop + for !rl.WindowShouldClose() { // Detect window close button or ESC key + // Update + frameCounter++ + if frameCounter >= frameDelay { + // Move to next frame + // NOTE: If final frame is reached we return to first frame + currentAnimFrame++ + if currentAnimFrame >= animFrames { + currentAnimFrame = 0 + } + + // Get memory offset position for next frame data in image.data + nextFrameDataOffset = uint32(imScarfyAnim.Width * imScarfyAnim.Height * int32(4) * currentAnimFrame) + + // Update GPU texture data with next frame image data + // WARNING: Data size (frame size) and pixel format must match already created texture + // here we needed to make the Data as public + rl.UpdateTextureUnsafe(texScarfyAnim, unsafe.Pointer(uintptr(imScarfyAnim.Data)+uintptr(nextFrameDataOffset))) + + frameCounter = 0 + } + + // Control frames delay + if rl.IsKeyPressed(rl.KeyRight) { + frameDelay++ + } else if rl.IsKeyPressed(rl.KeyLeft) { + frameDelay-- + } + + if frameDelay > MAX_FRAME_DELAY { + frameDelay = MAX_FRAME_DELAY + } else if frameDelay < MIN_FRAME_DELAY { + frameDelay = MIN_FRAME_DELAY + } + + // Draw + rl.BeginDrawing() + + rl.ClearBackground(rl.RayWhite) + + rl.DrawText(fmt.Sprintf("TOTAL GIF FRAMES: %02d", animFrames), 50, 30, 20, rl.LightGray) + rl.DrawText(fmt.Sprintf("CURRENT FRAME: %02d", currentAnimFrame), 50, 60, 20, rl.Gray) + rl.DrawText(fmt.Sprintf("CURRENT FRAME IMAGE.DATA OFFSET: %02d", nextFrameDataOffset), 50, 90, 20, rl.Gray) + + rl.DrawText("FRAMES DELAY: ", 100, 305, 10, rl.DarkGray) + rl.DrawText(fmt.Sprintf("%02d frames", frameDelay), 620, 305, 10, rl.DarkGray) + rl.DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 350, 10, rl.DarkGray) + + for i := int32(0); i < MAX_FRAME_DELAY; i++ { + if i < frameDelay { + rl.DrawRectangle(190+21*i, 300, 20, 20, rl.Red) + } + rl.DrawRectangleLines(190+21*i, 300, 20, 20, rl.Maroon) + } + + rl.DrawTexture(texScarfyAnim, int32(rl.GetScreenWidth()/2)-texScarfyAnim.Width/2, 140, rl.White) + + rl.DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth-200, screenHeight-20, 10, rl.Gray) + + rl.EndDrawing() + } + + // De-Initialization + defer rl.UnloadTexture(texScarfyAnim) // Unload texture + defer rl.UnloadImage(imScarfyAnim) // Unload image (contains all frames) + + defer rl.CloseWindow() // Close window and OpenGL context + +} diff --git a/examples/textures/textures_gif_player/scarfy_run.gif b/examples/textures/textures_gif_player/scarfy_run.gif new file mode 100644 index 0000000000000000000000000000000000000000..f0f712ccdc1fa1b8addc74f1fef5cf61b93c0ab7 GIT binary patch literal 21261 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 (60 / framesSpeed) { + framesCounter = 0 + currentFrame++ + + if currentFrame > int(spriteFrames)-1 { + currentFrame = 0 + } + + frameRec.X = float32(currentFrame) * float32(scarfy.Width) / spriteFrames // select which image to show + } + + // Control frames speed + if rl.IsKeyPressed(rl.KeyRight) { + framesSpeed++ + } else if rl.IsKeyPressed(rl.KeyLeft) { + framesSpeed-- + } + + if framesSpeed > MAX_FRAME_SPEED { + framesSpeed = MAX_FRAME_SPEED + } else if framesSpeed < MIN_FRAME_SPEED { + framesSpeed = MIN_FRAME_SPEED + } + + // Draw + rl.BeginDrawing() + + rl.ClearBackground(rl.RayWhite) + + rl.DrawTexture(scarfy, 15, 40, rl.White) + rl.DrawRectangleLines(15, 40, int32(scarfy.Width), int32(scarfy.Height), rl.Lime) + rl.DrawRectangleLines(15+int32(frameRec.X), 40+int32(frameRec.Y), int32(frameRec.Width), int32(frameRec.Height), rl.Red) + + rl.DrawText("FRAME SPEED: ", 165, 210, 10, rl.DarkGray) + rl.DrawText(fmt.Sprintf("%02d FPS", framesSpeed), 575, 210, 10, rl.DarkGray) + rl.DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 240, 10, rl.DarkGray) + + for i := 0; i < MAX_FRAME_SPEED; i++ { + if i < framesSpeed { + rl.DrawRectangle(250+21*int32(i), screenHeight/2.5+15, 20, 20, rl.Red) + } + rl.DrawRectangleLines(250+21*int32(i), screenHeight/2.5+15, 20, 20, rl.Maroon) + } + + rl.DrawTextureRec(scarfy, frameRec, position, rl.White) // Draw part of the texture + + rl.DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth-200, screenHeight-20, 10, rl.Gray) + + rl.EndDrawing() + } + + // De-Initialization + defer rl.UnloadTexture(scarfy) // Texture unloading + + defer rl.CloseWindow() // Close window and OpenGL context +} diff --git a/examples/textures/textures_sprite_anim/scarfy.png b/examples/textures/textures_sprite_anim/scarfy.png new file mode 100644 index 0000000000000000000000000000000000000000..be3b83d0e7f523e2cf80da19e274a8479e33fe13 GIT binary patch literal 10394 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 E4?57ykpKVy literal 0 HcmV?d00001 diff --git a/raylib/raylib.go b/raylib/raylib.go index 1fa3d5c..8c9e46b 100644 --- a/raylib/raylib.go +++ b/raylib/raylib.go @@ -1090,8 +1090,8 @@ const ( // Image type, bpp always RGBA (32bit) // NOTE: Data stored in CPU memory (RAM) type Image struct { - // Image raw data - data unsafe.Pointer + // Image raw Data + Data unsafe.Pointer // Image base width Width int32 // Image base height diff --git a/raylib/rtextures.go b/raylib/rtextures.go index 23a1f37..9fce2a1 100644 --- a/raylib/rtextures.go +++ b/raylib/rtextures.go @@ -246,6 +246,14 @@ func UpdateTexture(texture Texture2D, pixels []color.RGBA) { C.UpdateTexture(*ctexture, cpixels) } +// UpdateTexture - Update GPU texture with new data +// NOTE: pixels data must match texture.format +func UpdateTextureUnsafe(texture Texture2D, pixels unsafe.Pointer) { + ctexture := texture.cptr() + cpixels := pixels + C.UpdateTexture(*ctexture, cpixels) +} + // UpdateTextureRec - Update GPU texture rectangle with new data func UpdateTextureRec(texture Texture2D, rec Rectangle, pixels []color.RGBA) { ctexture := texture.cptr() From 6c3961f894075a7b55cfd9a7dd0d27f21c2d1f68 Mon Sep 17 00:00:00 2001 From: Palessan Date: Fri, 28 Jun 2024 15:11:11 +0300 Subject: [PATCH 2/4] better to use the using existing method by passing the required []color.RGBA instead of the unsafe.Pointer --- examples/textures/textures_gif_player/main.go | 14 ++++++++------ raylib/rtextures.go | 8 -------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/examples/textures/textures_gif_player/main.go b/examples/textures/textures_gif_player/main.go index 784513a..82a9e2f 100644 --- a/examples/textures/textures_gif_player/main.go +++ b/examples/textures/textures_gif_player/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "image/color" "unsafe" rl "github.com/gen2brain/raylib-go/raylib" @@ -30,12 +31,12 @@ func main() { // WARNING: It's not recommended to use this technique for sprites animation, // use spritesheets instead, like illustrated in textures_sprite_anim example var texScarfyAnim rl.Texture2D = rl.LoadTextureFromImage(imScarfyAnim) + var texScarfyAnimSize int32 = imScarfyAnim.Width * imScarfyAnim.Height var nextFrameDataOffset uint32 = 0 // Current byte offset to next frame in image.data - - var currentAnimFrame int32 = 0 // Current animation frame to load and draw - var frameDelay int32 = 8 // Frame delay to switch between animation frames - var frameCounter int32 = 0 // General frames counter + var currentAnimFrame int32 = 0 // Current animation frame to load and draw + var frameDelay int32 = 8 // Frame delay to switch between animation frames + var frameCounter int32 = 0 // General frames counter rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second @@ -43,6 +44,7 @@ func main() { for !rl.WindowShouldClose() { // Detect window close button or ESC key // Update frameCounter++ + if frameCounter >= frameDelay { // Move to next frame // NOTE: If final frame is reached we return to first frame @@ -53,11 +55,11 @@ func main() { // Get memory offset position for next frame data in image.data nextFrameDataOffset = uint32(imScarfyAnim.Width * imScarfyAnim.Height * int32(4) * currentAnimFrame) - // Update GPU texture data with next frame image data // WARNING: Data size (frame size) and pixel format must match already created texture // here we needed to make the Data as public - rl.UpdateTextureUnsafe(texScarfyAnim, unsafe.Pointer(uintptr(imScarfyAnim.Data)+uintptr(nextFrameDataOffset))) + rl.UpdateTexture(texScarfyAnim, + unsafe.Slice((*color.RGBA)(unsafe.Pointer(uintptr(imScarfyAnim.Data)+uintptr(nextFrameDataOffset))), texScarfyAnimSize)) frameCounter = 0 } diff --git a/raylib/rtextures.go b/raylib/rtextures.go index 9fce2a1..23a1f37 100644 --- a/raylib/rtextures.go +++ b/raylib/rtextures.go @@ -246,14 +246,6 @@ func UpdateTexture(texture Texture2D, pixels []color.RGBA) { C.UpdateTexture(*ctexture, cpixels) } -// UpdateTexture - Update GPU texture with new data -// NOTE: pixels data must match texture.format -func UpdateTextureUnsafe(texture Texture2D, pixels unsafe.Pointer) { - ctexture := texture.cptr() - cpixels := pixels - C.UpdateTexture(*ctexture, cpixels) -} - // UpdateTextureRec - Update GPU texture rectangle with new data func UpdateTextureRec(texture Texture2D, rec Rectangle, pixels []color.RGBA) { ctexture := texture.cptr() From 49d7e623032078835eca56ea09c4009bd81778ac Mon Sep 17 00:00:00 2001 From: Palessan Date: Fri, 28 Jun 2024 15:18:23 +0300 Subject: [PATCH 3/4] rectangle will be renamed to textures_sprite_anim part 1/2 --- .../textures/textures_sprite_anim/main.go | 94 ------------------ .../textures/textures_sprite_anim/scarfy.png | Bin 10394 -> 0 bytes 2 files changed, 94 deletions(-) delete mode 100644 examples/textures/textures_sprite_anim/main.go delete mode 100644 examples/textures/textures_sprite_anim/scarfy.png diff --git a/examples/textures/textures_sprite_anim/main.go b/examples/textures/textures_sprite_anim/main.go deleted file mode 100644 index 52471e6..0000000 --- a/examples/textures/textures_sprite_anim/main.go +++ /dev/null @@ -1,94 +0,0 @@ -package main - -import ( - "fmt" - - rl "github.com/gen2brain/raylib-go/raylib" -) - -const ( - MAX_FRAME_SPEED = 15 - MIN_FRAME_SPEED = 1 -) - -func main() { - // Initialization - const screenWidth = 800 - const screenHeight = 450 - - rl.InitWindow(screenWidth, screenHeight, "raylib [texture] example - sprite anim") - - // NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required) - spriteFrames := float32(6) - scarfy := rl.LoadTexture("scarfy.png") // Texture loading - - position := rl.Vector2{X: 350.0, Y: 280.0} - frameRec := rl.Rectangle{X: 0.0, Y: 0.0, Width: float32(scarfy.Width) / spriteFrames, Height: float32(scarfy.Height)} - currentFrame := 0 - - framesCounter := 0 - framesSpeed := 8 // Number of spritesheet frames shown by second - - rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second - - // Main game loop - for !rl.WindowShouldClose() { // Detect window close button or ESC key - // Update - framesCounter++ - - if framesCounter >= (60 / framesSpeed) { - framesCounter = 0 - currentFrame++ - - if currentFrame > int(spriteFrames)-1 { - currentFrame = 0 - } - - frameRec.X = float32(currentFrame) * float32(scarfy.Width) / spriteFrames // select which image to show - } - - // Control frames speed - if rl.IsKeyPressed(rl.KeyRight) { - framesSpeed++ - } else if rl.IsKeyPressed(rl.KeyLeft) { - framesSpeed-- - } - - if framesSpeed > MAX_FRAME_SPEED { - framesSpeed = MAX_FRAME_SPEED - } else if framesSpeed < MIN_FRAME_SPEED { - framesSpeed = MIN_FRAME_SPEED - } - - // Draw - rl.BeginDrawing() - - rl.ClearBackground(rl.RayWhite) - - rl.DrawTexture(scarfy, 15, 40, rl.White) - rl.DrawRectangleLines(15, 40, int32(scarfy.Width), int32(scarfy.Height), rl.Lime) - rl.DrawRectangleLines(15+int32(frameRec.X), 40+int32(frameRec.Y), int32(frameRec.Width), int32(frameRec.Height), rl.Red) - - rl.DrawText("FRAME SPEED: ", 165, 210, 10, rl.DarkGray) - rl.DrawText(fmt.Sprintf("%02d FPS", framesSpeed), 575, 210, 10, rl.DarkGray) - rl.DrawText("PRESS RIGHT/LEFT KEYS to CHANGE SPEED!", 290, 240, 10, rl.DarkGray) - - for i := 0; i < MAX_FRAME_SPEED; i++ { - if i < framesSpeed { - rl.DrawRectangle(250+21*int32(i), screenHeight/2.5+15, 20, 20, rl.Red) - } - rl.DrawRectangleLines(250+21*int32(i), screenHeight/2.5+15, 20, 20, rl.Maroon) - } - - rl.DrawTextureRec(scarfy, frameRec, position, rl.White) // Draw part of the texture - - rl.DrawText("(c) Scarfy sprite by Eiden Marsal", screenWidth-200, screenHeight-20, 10, rl.Gray) - - rl.EndDrawing() - } - - // De-Initialization - defer rl.UnloadTexture(scarfy) // Texture unloading - - defer rl.CloseWindow() // Close window and OpenGL context -} diff --git a/examples/textures/textures_sprite_anim/scarfy.png b/examples/textures/textures_sprite_anim/scarfy.png deleted file mode 100644 index be3b83d0e7f523e2cf80da19e274a8479e33fe13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10394 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 E4?57ykpKVy From ded439d8498b602e8df8fda1a097011434db790b Mon Sep 17 00:00:00 2001 From: Palessan Date: Fri, 28 Jun 2024 15:27:21 +0300 Subject: [PATCH 4/4] rectangle will be renamed to textures_sprite_anim part 2/2 (using git mv to preserve git history) --- .../{rectangle => textures_sprite_anim}/main.go | 0 .../{rectangle => textures_sprite_anim}/scarfy.png | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/textures/{rectangle => textures_sprite_anim}/main.go (100%) rename examples/textures/{rectangle => textures_sprite_anim}/scarfy.png (100%) diff --git a/examples/textures/rectangle/main.go b/examples/textures/textures_sprite_anim/main.go similarity index 100% rename from examples/textures/rectangle/main.go rename to examples/textures/textures_sprite_anim/main.go diff --git a/examples/textures/rectangle/scarfy.png b/examples/textures/textures_sprite_anim/scarfy.png similarity index 100% rename from examples/textures/rectangle/scarfy.png rename to examples/textures/textures_sprite_anim/scarfy.png