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() }