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

71 lines
1.6 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 DeferredDescriptors struct {
descriptor.Set
Camera *descriptor.Uniform[uniform.Camera]
Objects *descriptor.Storage[uniform.Object]
Textures *descriptor.SamplerArray
}
type DeferredMaterial struct {
Instance *material.Instance[*DeferredDescriptors]
Objects *ObjectBuffer
Textures cache.SamplerCache
Meshes cache.MeshCache
id material.ID
}
func (m *DeferredMaterial) ID() material.ID {
return m.id
}
func (m *DeferredMaterial) Begin(camera uniform.Camera, lights []light.T) {
m.Instance.Descriptors().Camera.Set(camera)
m.Objects.Reset()
}
func (m *DeferredMaterial) Bind(cmds command.Recorder) {
cmds.Record(func(cmd command.Buffer) {
m.Instance.Bind(cmd)
})
}
func (m *DeferredMaterial) End() {
m.Objects.Flush(m.Instance.Descriptors().Objects)
m.Textures.Flush()
}
func (m *DeferredMaterial) Draw(cmds command.Recorder, msh mesh.Mesh) {
vkmesh, meshReady := m.Meshes.TryFetch(msh.Mesh().Get())
if !meshReady {
return
}
textures := m.Instance.Material().TextureSlots()
textureIds := AssignMeshTextures(m.Textures, msh, textures)
index := m.Objects.Store(uniform.Object{
Model: msh.Transform().Matrix(),
Textures: textureIds,
})
cmds.Record(func(cmd command.Buffer) {
vkmesh.Draw(cmd, index)
})
}
func (m *DeferredMaterial) Destroy() {
m.Instance.Material().Destroy()
}