92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
package lines
|
|
|
|
import (
|
|
"zworld/engine/object"
|
|
"zworld/engine/object/mesh"
|
|
"zworld/engine/renderapi/color"
|
|
"zworld/engine/renderapi/vertex"
|
|
"zworld/plugins/math/vec3"
|
|
)
|
|
|
|
type BoxObject struct {
|
|
object.Object
|
|
*Box
|
|
}
|
|
|
|
func NewBoxObject(args BoxArgs) *BoxObject {
|
|
return object.New("Box", &BoxObject{
|
|
Box: NewBox(args),
|
|
})
|
|
}
|
|
|
|
type Box struct {
|
|
*mesh.Static
|
|
Extents object.Property[vec3.T]
|
|
Color object.Property[color.T]
|
|
|
|
data vertex.MutableMesh[vertex.C, uint16]
|
|
}
|
|
|
|
// Args are kinda like props
|
|
// If they change, we should recomupte the mesh
|
|
|
|
type BoxArgs struct {
|
|
Extents vec3.T
|
|
Color color.T
|
|
}
|
|
|
|
func NewBox(args BoxArgs) *Box {
|
|
b := object.NewComponent(&Box{
|
|
Static: mesh.NewLines(),
|
|
Extents: object.NewProperty(args.Extents),
|
|
Color: object.NewProperty(args.Color),
|
|
})
|
|
b.data = vertex.NewLines[vertex.C, uint16](object.Key("box", b), nil, nil)
|
|
b.Extents.OnChange.Subscribe(func(vec3.T) { b.refresh() })
|
|
b.Color.OnChange.Subscribe(func(color.T) { b.refresh() })
|
|
b.refresh()
|
|
return b
|
|
}
|
|
|
|
func (b *Box) refresh() {
|
|
halfsize := b.Extents.Get().Scaled(0.5)
|
|
w, h, d := halfsize.X, halfsize.Y, halfsize.Z
|
|
c := b.Color.Get().Vec4()
|
|
|
|
vertices := []vertex.C{
|
|
// bottom square
|
|
{P: vec3.New(-w, -h, -d), C: c}, // 0
|
|
{P: vec3.New(+w, -h, -d), C: c}, // 1
|
|
{P: vec3.New(-w, -h, +d), C: c}, // 2
|
|
{P: vec3.New(+w, -h, +d), C: c}, // 3
|
|
|
|
// top square
|
|
{P: vec3.New(-w, +h, -d), C: c}, // 4
|
|
{P: vec3.New(+w, +h, -d), C: c}, // 5
|
|
{P: vec3.New(-w, +h, +d), C: c}, // 6
|
|
{P: vec3.New(+w, +h, +d), C: c}, // 7
|
|
}
|
|
indices := []uint16{
|
|
// bottom
|
|
0, 1,
|
|
0, 2,
|
|
1, 3,
|
|
2, 3,
|
|
|
|
// top
|
|
4, 5,
|
|
4, 6,
|
|
5, 7,
|
|
6, 7,
|
|
|
|
// sides
|
|
0, 4,
|
|
1, 5,
|
|
2, 6,
|
|
3, 7,
|
|
}
|
|
|
|
b.data.Update(vertices, indices)
|
|
b.VertexData.Set(b.data)
|
|
}
|