96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
|
|
package pass
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/vkngwrapper/core/v2/core1_0"
|
||
|
|
"zworld/engine/render/uniform"
|
||
|
|
"zworld/engine/renderapi/cache"
|
||
|
|
"zworld/engine/renderapi/descriptor"
|
||
|
|
"zworld/engine/renderapi/material"
|
||
|
|
"zworld/engine/renderapi/renderpass"
|
||
|
|
"zworld/engine/renderapi/shader"
|
||
|
|
"zworld/engine/renderapi/vertex"
|
||
|
|
"zworld/engine/renderapi/vulkan"
|
||
|
|
)
|
||
|
|
|
||
|
|
type DeferredMatCache struct {
|
||
|
|
app vulkan.App
|
||
|
|
pass renderpass.T
|
||
|
|
frames int
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewDeferredMaterialCache(app vulkan.App, pass renderpass.T, frames int) MaterialCache {
|
||
|
|
return cache.New[*material.Def, []Material](&DeferredMatCache{
|
||
|
|
app: app,
|
||
|
|
pass: pass,
|
||
|
|
frames: frames,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (m *DeferredMatCache) Name() string { return "DeferredMaterials" }
|
||
|
|
|
||
|
|
func (m *DeferredMatCache) Instantiate(def *material.Def, callback func([]Material)) {
|
||
|
|
if def == nil {
|
||
|
|
def = material.StandardDeferred()
|
||
|
|
}
|
||
|
|
|
||
|
|
desc := &DeferredDescriptors{
|
||
|
|
Camera: &descriptor.Uniform[uniform.Camera]{
|
||
|
|
Stages: core1_0.StageAll,
|
||
|
|
},
|
||
|
|
Objects: &descriptor.Storage[uniform.Object]{
|
||
|
|
Stages: core1_0.StageAll,
|
||
|
|
Size: 2000,
|
||
|
|
},
|
||
|
|
Textures: &descriptor.SamplerArray{
|
||
|
|
Stages: core1_0.StageFragment,
|
||
|
|
Count: 100,
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
// read vertex pointers from vertex format
|
||
|
|
pointers := vertex.ParsePointers(def.VertexFormat)
|
||
|
|
|
||
|
|
// fetch shader from cache
|
||
|
|
shader := m.app.Shaders().Fetch(shader.NewRef(def.Shader))
|
||
|
|
|
||
|
|
// create material
|
||
|
|
mat := material.New(
|
||
|
|
m.app.Device(),
|
||
|
|
material.Args{
|
||
|
|
Shader: shader,
|
||
|
|
Pass: m.pass,
|
||
|
|
Subpass: MainSubpass,
|
||
|
|
Pointers: pointers,
|
||
|
|
DepthTest: def.DepthTest,
|
||
|
|
DepthWrite: def.DepthWrite,
|
||
|
|
DepthClamp: def.DepthClamp,
|
||
|
|
DepthFunc: def.DepthFunc,
|
||
|
|
Primitive: def.Primitive,
|
||
|
|
CullMode: def.CullMode,
|
||
|
|
},
|
||
|
|
desc)
|
||
|
|
|
||
|
|
instances := make([]Material, m.frames)
|
||
|
|
for i := range instances {
|
||
|
|
instance := mat.Instantiate(m.app.Pool())
|
||
|
|
textures := cache.NewSamplerCache(m.app.Textures(), instance.Descriptors().Textures)
|
||
|
|
instances[i] = &DeferredMaterial{
|
||
|
|
id: def.Hash(),
|
||
|
|
Instance: instance,
|
||
|
|
Objects: NewObjectBuffer(instance.Descriptors().Objects.Size),
|
||
|
|
Textures: textures,
|
||
|
|
Meshes: m.app.Meshes(),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
callback(instances)
|
||
|
|
}
|
||
|
|
|
||
|
|
func (m *DeferredMatCache) Destroy() {
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
func (m *DeferredMatCache) Delete(mat []Material) {
|
||
|
|
mat[0].Destroy()
|
||
|
|
}
|