zworld/plugins/geometry/cube/cube.go
2024-01-14 22:56:06 +08:00

119 lines
2.9 KiB
Go

package cube
import (
"zworld/engine/object"
"zworld/engine/object/mesh"
"zworld/engine/renderapi/material"
"zworld/engine/renderapi/texture"
"zworld/engine/renderapi/vertex"
"zworld/plugins/math/vec2"
"zworld/plugins/math/vec3"
)
type Object struct {
object.Object
*Mesh
}
func NewObject(args Args) *Object {
return object.New("Cube", &Object{
Mesh: New(args),
})
}
// Mesh is a vertex colored cube mesh
type Mesh struct {
*mesh.Static
Args
}
type Args struct {
Mat *material.Def
Size float32
}
// New creates a vertex colored cube mesh with a given size
func New(args Args) *Mesh {
if args.Mat == nil {
args.Mat = material.ColoredForward()
}
cube := object.NewComponent(&Mesh{
Static: mesh.New(args.Mat),
Args: args,
})
cube.SetTexture(texture.Diffuse, texture.Checker)
cube.generate()
return cube
}
func (c *Mesh) generate() {
s := c.Size / 2
topLeft := vec2.New(0, 0)
topRight := vec2.New(1, 0)
bottomLeft := vec2.New(0, 1)
bottomRight := vec2.New(1, 1)
vertices := []vertex.T{
// X+
{P: vec3.New(s, -s, s), N: vec3.UnitX, T: bottomRight}, // 0
{P: vec3.New(s, -s, -s), N: vec3.UnitX, T: bottomLeft}, // 1
{P: vec3.New(s, s, -s), N: vec3.UnitX, T: topLeft}, // 2
{P: vec3.New(s, s, s), N: vec3.UnitX, T: topRight}, // 3
// X-
{P: vec3.New(-s, -s, -s), N: vec3.UnitXN, T: bottomRight}, // 4
{P: vec3.New(-s, -s, s), N: vec3.UnitXN, T: bottomLeft}, // 5
{P: vec3.New(-s, s, s), N: vec3.UnitXN, T: topLeft}, // 6
{P: vec3.New(-s, s, -s), N: vec3.UnitXN, T: topRight}, // 7
// Y+
{P: vec3.New(s, s, -s), N: vec3.UnitY, T: bottomRight}, // 8
{P: vec3.New(-s, s, -s), N: vec3.UnitY, T: bottomLeft}, // 9
{P: vec3.New(-s, s, s), N: vec3.UnitY, T: topLeft}, // 10
{P: vec3.New(s, s, s), N: vec3.UnitY, T: topRight}, // 11
// Y-
{P: vec3.New(-s, -s, -s), N: vec3.UnitYN, T: bottomRight}, // 12
{P: vec3.New(s, -s, -s), N: vec3.UnitYN, T: bottomLeft}, // 13
{P: vec3.New(s, -s, s), N: vec3.UnitYN, T: topLeft}, // 14
{P: vec3.New(-s, -s, s), N: vec3.UnitYN, T: topRight}, // 15
// Z+
{P: vec3.New(-s, -s, s), N: vec3.UnitZ, T: bottomRight}, // 16
{P: vec3.New(s, -s, s), N: vec3.UnitZ, T: bottomLeft}, // 17
{P: vec3.New(s, s, s), N: vec3.UnitZ, T: topLeft}, // 18
{P: vec3.New(-s, s, s), N: vec3.UnitZ, T: topRight}, // 19
// Z-
{P: vec3.New(s, -s, -s), N: vec3.UnitZN, T: bottomRight}, // 20
{P: vec3.New(-s, -s, -s), N: vec3.UnitZN, T: bottomLeft}, // 21
{P: vec3.New(-s, s, -s), N: vec3.UnitZN, T: topLeft}, // 22
{P: vec3.New(s, s, -s), N: vec3.UnitZN, T: topRight}, // 23
}
indices := []uint16{
0, 1, 2,
0, 2, 3,
4, 5, 6,
4, 6, 7,
8, 9, 10,
8, 10, 11,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
20, 21, 22,
20, 22, 23,
}
key := object.Key("cube", c)
mesh := vertex.NewTriangles(key, vertices, indices)
c.VertexData.Set(mesh)
}