67 lines
1.5 KiB
Go
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()
|
||
|
|
}
|