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