zworld/plugins/geometry/plane/plane.go

74 lines
1.7 KiB
Go
Raw Permalink Normal View History

2024-01-14 22:56:06 +08:00
package plane
import (
"zworld/engine/object"
"zworld/engine/object/mesh"
"zworld/engine/renderapi/material"
"zworld/engine/renderapi/vertex"
"zworld/plugins/math/vec2"
"zworld/plugins/math/vec3"
)
type Plane struct {
object.Object
*Mesh
}
func NewObject(args Args) *Plane {
return object.New("Plane", &Plane{
Mesh: New(args),
})
}
// Plane is a single segment, two-sided 3D plane
type Mesh struct {
*mesh.Static
Size object.Property[vec2.T]
data vertex.MutableMesh[vertex.T, uint16]
}
type Args struct {
Size vec2.T
Mat *material.Def
}
func New(args Args) *Mesh {
if args.Mat == nil {
args.Mat = material.StandardForward()
}
p := object.NewComponent(&Mesh{
Static: mesh.New(args.Mat),
Size: object.NewProperty[vec2.T](args.Size),
})
p.data = vertex.NewTriangles[vertex.T, uint16](object.Key("plane", p), nil, nil)
p.Size.OnChange.Subscribe(func(f vec2.T) { p.refresh() })
p.refresh()
return p
}
func (p *Mesh) refresh() {
s := p.Size.Get().Scaled(0.5)
y := float32(0.001)
vertices := []vertex.T{
{P: vec3.New(-s.X, y, -s.Y), N: vec3.UnitY, T: vec2.New(0, 1)}, // o1
{P: vec3.New(s.X, y, -s.Y), N: vec3.UnitY, T: vec2.New(1, 1)}, // x1
{P: vec3.New(-s.X, y, s.Y), N: vec3.UnitY, T: vec2.New(0, 0)}, // z1
{P: vec3.New(s.X, y, s.Y), N: vec3.UnitY, T: vec2.New(1, 0)}, // d1
{P: vec3.New(-s.X, -y, -s.Y), N: vec3.UnitYN, T: vec2.New(0, 0)}, // o2
{P: vec3.New(s.X, -y, -s.Y), N: vec3.UnitYN, T: vec2.New(0, 0)}, // x2
{P: vec3.New(-s.X, -y, s.Y), N: vec3.UnitYN, T: vec2.New(0, 0)}, // z2
{P: vec3.New(s.X, -y, s.Y), N: vec3.UnitYN, T: vec2.New(0, 0)}, // d2
}
indices := []uint16{
0, 2, 1, 1, 2, 3, // top
5, 6, 4, 7, 6, 5, // bottom
}
p.data.Update(vertices, indices)
p.VertexData.Set(p.data)
}