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