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

72 lines
1.5 KiB
Go

package sprite
import (
"zworld/engine/object"
"zworld/engine/object/mesh"
"zworld/engine/renderapi/texture"
"zworld/engine/renderapi/vertex"
"zworld/plugins/math/vec2"
"zworld/plugins/math/vec3"
)
type Sprite struct {
object.Object
*Mesh
}
func NewObject(args Args) *Sprite {
return object.New("Sprite", &Sprite{
Mesh: New(args),
})
}
// Sprite is a single segment, two-sided 3D plane
type Mesh struct {
*mesh.Static
Size object.Property[vec2.T]
Sprite object.Property[texture.Ref]
mesh vertex.MutableMesh[vertex.T, uint16]
}
var _ mesh.Mesh = &Mesh{}
type Args struct {
Size vec2.T
Texture texture.Ref
}
func New(args Args) *Mesh {
sprite := object.NewComponent(&Mesh{
Static: mesh.New(Material()),
Size: object.NewProperty(args.Size),
Sprite: object.NewProperty(args.Texture),
})
sprite.mesh = vertex.NewTriangles[vertex.T, uint16]("sprite", nil, nil)
sprite.generate()
sprite.SetTexture(texture.Diffuse, args.Texture)
sprite.Sprite.OnChange.Subscribe(func(tex texture.Ref) {
sprite.SetTexture(texture.Diffuse, tex)
})
return sprite
}
func (p *Mesh) generate() {
w, h := p.Size.Get().X, p.Size.Get().Y
vertices := []vertex.T{
{P: vec3.New(-0.5*w, -0.5*h, 0), T: vec2.New(0, 1)},
{P: vec3.New(0.5*w, 0.5*h, 0), T: vec2.New(1, 0)},
{P: vec3.New(-0.5*w, 0.5*h, 0), T: vec2.New(0, 0)},
{P: vec3.New(0.5*w, -0.5*h, 0), T: vec2.New(1, 1)},
}
indices := []uint16{
0, 1, 2,
0, 3, 1,
}
p.mesh.Update(vertices, indices)
p.VertexData.Set(p.mesh)
}