diff --git a/examples/models/draw_cube_texture/cubicmap_atlas.png b/examples/models/draw_cube_texture/cubicmap_atlas.png new file mode 100644 index 0000000..9fc404a Binary files /dev/null and b/examples/models/draw_cube_texture/cubicmap_atlas.png differ diff --git a/examples/models/draw_cube_texture/main.go b/examples/models/draw_cube_texture/main.go new file mode 100644 index 0000000..ed4ca0f --- /dev/null +++ b/examples/models/draw_cube_texture/main.go @@ -0,0 +1,256 @@ +/******************************************************************************************* +* +* raylib [models] example - Draw textured cube +* +* Example originally created with raylib 4.5, last time updated with raylib 4.5 +* +* 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) 2022-2024 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 [models] example - draw cube texture") + + // Define the camera to look into our 3d world + camera := rl.Camera{ + Position: rl.Vector3{ + Y: 10.0, + Z: 10.0, + }, + Target: rl.Vector3{}, + Up: rl.Vector3{Y: 1.0}, + Fovy: 45.0, + Projection: rl.CameraPerspective, + } + + // Load texture to be applied to the cubes sides + texture := rl.LoadTexture("cubicmap_atlas.png") + + 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 + // TODO: Update your variables here + + // Draw + rl.BeginDrawing() + rl.ClearBackground(rl.RayWhite) + rl.BeginMode3D(camera) + + // Draw cube with an applied texture + vec := rl.Vector3{ + X: -2.0, + Y: 2.0, + } + DrawCubeTexture(texture, vec, 2.0, 4.0, 2.0, rl.White) + + // Draw cube with an applied texture, but only a defined rectangle piece of the texture + rec := rl.Rectangle{ + Y: float32(texture.Height) / 2.0, + Width: float32(texture.Width) / 2.0, + Height: float32(texture.Height) / 2.0, + } + vec = rl.Vector3{ + X: 2.0, + Y: 1.0, + } + DrawCubeTextureRec(texture, rec, vec, 2.0, 2.0, 2.0, rl.White) + + rl.DrawGrid(10, 1.0) // Draw a grid + rl.EndMode3D() + rl.DrawFPS(10, 10) + rl.EndDrawing() + } + + // De-Initialization + rl.UnloadTexture(texture) // Unload texture + rl.CloseWindow() // Close window and OpenGL context +} + +// DrawCubeTexture draws a textured cube +// NOTE: Cube position is the center position +func DrawCubeTexture(texture rl.Texture2D, position rl.Vector3, width, height, length float32, color rl.Color) { + x := position.X + y := position.Y + z := position.Z + + // Set desired texture to be enabled while drawing following vertex data + rl.SetTexture(texture.ID) + + // Vertex data transformation can be defined with the commented lines, + // but in this example we calculate the transformed vertex data directly when calling rlVertex3f() + // rl.PushMatrix() + // NOTE: Transformation is applied in inverse order (scale -> rotate -> translate) + //rl.Translatef(2.0, 0.0, 0.0) + //rl.Rotatef(45, 0, 1, ) + //rl.Scalef(2.0, 2.0, 2.0) + + rl.Begin(rl.Quads) + rl.Color4ub(color.R, color.G, color.B, color.A) + // Front Face + rl.Normal3f(0.0, 0.0, 1.0) // Normal Pointing Towards Viewer + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Top Right Of The Texture and Quad + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Top Left Of The Texture and Quad + // Back Face + rl.Normal3f(0.0, 0.0, -1.0) // Normal Pointing Away From Viewer + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Bottom Right Of The Texture and Quad + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Bottom Left Of The Texture and Quad + // Top Face + rl.Normal3f(0.0, 1.0, 0.0) // Normal Pointing Up + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad. + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Bottom Left Of The Texture and Quad + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Bottom Right Of The Texture and Quad + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad Bottom Face + rl.Normal3f(0.0, -1.0, 0.0) // Normal Pointing Down + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Top Right Of The Texture and Quad + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Top Left Of The Texture and Quad + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad + // Right face + rl.Normal3f(1.0, 0.0, 0.0) // Normal Pointing Right + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) // Bottom Right Of The Texture and Quad + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) // Top Right Of The Texture and Quad + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) // Top Left Of The Texture and Quad + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) // Bottom Left Of The Texture and Quad + // Left Face + rl.Normal3f(-1.0, 0.0, 0.0) // Normal Pointing Left + rl.TexCoord2f(0.0, 0.0) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) // Bottom Left Of The Texture and Quad + rl.TexCoord2f(1.0, 0.0) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) // Bottom Right Of The Texture and Quad + rl.TexCoord2f(1.0, 1.0) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) // Top Right Of The Texture and Quad + rl.TexCoord2f(0.0, 1.0) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) // Top Left Of The Texture and Quad + + rl.End() + //rl.PopMatrix() + + rl.SetTexture(0) +} + +// DrawCubeTextureRec draws a cube with texture piece applied to all faces +func DrawCubeTextureRec(texture rl.Texture2D, source rl.Rectangle, position rl.Vector3, width, height, + length float32, color rl.Color) { + + x := position.X + y := position.Y + z := position.Z + + texWidth := float32(texture.Width) + texHeight := float32(texture.Height) + + // Set desired texture to be enabled while drawing following vertex data + rl.SetTexture(texture.ID) + + // We calculate the normalized texture coordinates for the desired texture-source-rectangle + // It means converting from (tex.width, tex.height) coordinates to [0.0f, 1.0f] equivalent + rl.Begin(rl.Quads) + rl.Color4ub(color.R, color.G, color.B, color.A) + + // Front face + rl.Normal3f(0.0, 0.0, 1.0) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) + + // Back face + rl.Normal3f(0.0, 0.0, -1.0) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) + + // Top face + rl.Normal3f(0.0, 1.0, 0.0) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) + + // Bottom face + rl.Normal3f(0.0, -1.0, 0.0) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) + + // Right face + rl.Normal3f(1.0, 0.0, 0.0) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z-length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z-length/2) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x+width/2, y+height/2, z+length/2) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x+width/2, y-height/2, z+length/2) + + // Left face + rl.Normal3f(-1.0, 0.0, 0.0) + rl.TexCoord2f(source.X/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z-length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, (source.Y+source.Height)/texHeight) + rl.Vertex3f(x-width/2, y-height/2, z+length/2) + rl.TexCoord2f((source.X+source.Width)/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z+length/2) + rl.TexCoord2f(source.X/texWidth, source.Y/texHeight) + rl.Vertex3f(x-width/2, y+height/2, z-length/2) + + rl.End() + + rl.SetTexture(0) +}