91 lines
2.0 KiB
Go
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()
|
|
}
|