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