Merge pull request #470 from Hultan/draw_cube_texture
New example: models/draw_cube_textured
This commit is contained in:
commit
c4ef7b53e9
2 changed files with 256 additions and 0 deletions
BIN
examples/models/draw_cube_texture/cubicmap_atlas.png
Normal file
BIN
examples/models/draw_cube_texture/cubicmap_atlas.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
256
examples/models/draw_cube_texture/main.go
Normal file
256
examples/models/draw_cube_texture/main.go
Normal file
|
@ -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)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue