zworld/engine/render/pass/basic_material.go
2024-01-14 22:56:06 +08:00

67 lines
1.5 KiB
Go

package pass
import (
"zworld/engine/object/light"
"zworld/engine/object/mesh"
"zworld/engine/render/uniform"
"zworld/engine/renderapi/cache"
"zworld/engine/renderapi/command"
"zworld/engine/renderapi/descriptor"
"zworld/engine/renderapi/material"
)
type BasicDescriptors struct {
descriptor.Set
Camera *descriptor.Uniform[uniform.Camera]
Objects *descriptor.Storage[uniform.Object]
}
// Basic Materials only contain camera & object descriptors
// They can be used for various untextured objects, such
// as shadow/depth passes and lines.
type BasicMaterial struct {
Instance *material.Instance[*BasicDescriptors]
Objects *ObjectBuffer
Meshes cache.MeshCache
id material.ID
}
func (m *BasicMaterial) ID() material.ID {
return m.id
}
func (m *BasicMaterial) Begin(camera uniform.Camera, lights []light.T) {
m.Instance.Descriptors().Camera.Set(camera)
m.Objects.Reset()
}
func (m *BasicMaterial) Bind(cmds command.Recorder) {
cmds.Record(func(cmd command.Buffer) {
m.Instance.Bind(cmd)
})
}
func (m *BasicMaterial) End() {
m.Objects.Flush(m.Instance.Descriptors().Objects)
}
func (m *BasicMaterial) Draw(cmds command.Recorder, msh mesh.Mesh) {
vkmesh, meshReady := m.Meshes.TryFetch(msh.Mesh().Get())
if !meshReady {
return
}
index := m.Objects.Store(uniform.Object{
Model: msh.Transform().Matrix(),
})
cmds.Record(func(cmd command.Buffer) {
vkmesh.Draw(cmd, index)
})
}
func (m *BasicMaterial) Destroy() {
m.Instance.Material().Destroy()
}