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)
 | 
						|
}
 |