zworld/test/tgraph/mat_cache.go
2024-01-20 18:44:07 +08:00

91 lines
2.0 KiB
Go

package tgraph
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 MatCache struct {
app vulkan.App
pass renderpass.T
frames int
}
func NewMaterialCache(app vulkan.App, pass renderpass.T, frames int) MaterialCache {
return cache.New[*material.Def, []Material](&MatCache{
app: app,
pass: pass,
frames: frames,
})
}
func (m *MatCache) Name() string { return "DepthMaterials" }
func (m *MatCache) Instantiate(def *material.Def, callback func([]Material)) {
if def == nil {
def = &material.Def{}
}
desc := &BasicDescriptors{
Camera: &descriptor.Uniform[uniform.Camera]{
Stages: core1_0.StageAll,
},
Objects: &descriptor.Storage[uniform.Object]{
Stages: core1_0.StageAll,
Size: 2000,
},
}
// read vertex pointers from vertex format
pointers := vertex.ParsePointers(def.VertexFormat)
// fetch shader from cache
shader := m.app.Shaders().Fetch(shader.NewRef("depth"))
// create material
mat := material.New(
m.app.Device(),
material.Args{
Shader: shader,
Pass: m.pass,
Subpass: MainSubpass,
Pointers: pointers,
CullMode: vertex.CullBack,
DepthTest: true,
DepthWrite: true,
DepthFunc: core1_0.CompareOpLess,
DepthClamp: def.DepthClamp,
Primitive: def.Primitive,
},
desc)
instances := make([]Material, m.frames)
for i := range instances {
instance := mat.Instantiate(m.app.Pool())
bm := &BasicMaterial{
//id: def.Hash(),
Instance: instance,
Objects: NewObjectBuffer(desc.Objects.Size),
Meshes: m.app.Meshes(),
}
bm.SetID(def.Hash())
instances[i] = bm
}
callback(instances)
}
func (m *MatCache) Destroy() {
}
func (m *MatCache) Delete(mat []Material) {
mat[0].Destroy()
}