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

89 lines
2.0 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 LineMatCache struct {
app vulkan.App
pass renderpass.T
frames int
}
func NewLineMaterialCache(app vulkan.App, pass renderpass.T, frames int) MaterialCache {
return cache.New[*material.Def, []Material](&LineMatCache{
app: app,
pass: pass,
frames: frames,
})
}
func (m *LineMatCache) Name() string { return "LineMaterials" }
func (m *LineMatCache) Instantiate(def *material.Def, callback func([]Material)) {
if def == nil {
def = material.Lines()
}
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(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())
instances[i] = &BasicMaterial{
id: def.Hash(),
Instance: instance,
Objects: NewObjectBuffer(desc.Objects.Size),
Meshes: m.app.Meshes(),
}
}
callback(instances)
}
func (m *LineMatCache) Destroy() {
}
func (m *LineMatCache) Delete(mat []Material) {
mat[0].Destroy()
}