#include #include #include #include #include #include #include VK_NAMESPACE_BEGIN const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename,ShaderResource *shader_resource) { if(!device)return(nullptr); if(filename.IsEmpty())return(nullptr); if(!shader_resource)return(nullptr); ShaderModule *sm; if(shader_module_by_name.Get(filename,sm)) return sm; sm=device->CreateShaderModule(shader_resource); shader_module_by_name.Add(filename,sm); return sm; } const ShaderModule *RenderResource::CreateShaderModule(const OSString &filename) { ShaderModule *sm; if(shader_module_by_name.Get(filename,sm)) return sm; ShaderResource *shader_resource=LoadShaderResoruce(filename); if(!shader_resource)return(nullptr); sm=device->CreateShaderModule(shader_resource); shader_module_by_name.Add(filename,sm); return sm; } Material *RenderResource::CreateMaterial(const OSString &vertex_shader_filename,const OSString &fragment_shader_filename) { const ShaderModule *vs=CreateShaderModule(vertex_shader_filename); if(!vs) return(nullptr); const ShaderModule *fs=CreateShaderModule(fragment_shader_filename); if(!fs) return(nullptr); return(device->CreateMaterial((VertexShaderModule *)vs,fs)); } Material *RenderResource::CreateMaterial(const OSString &vertex_shader_filename,const OSString &geometry_shader_filename,const OSString &fragment_shader_filename) { const ShaderModule *vs=CreateShaderModule(vertex_shader_filename); if(!vs) return(nullptr); const ShaderModule *gs=CreateShaderModule(geometry_shader_filename); if(!gs) return(nullptr); const ShaderModule *fs=CreateShaderModule(fragment_shader_filename); if(!fs) return(nullptr); return(device->CreateMaterial((VertexShaderModule *)vs,gs,fs)); } Material *RenderResource::CreateMaterial(const OSString &filename) { Material *mtl; if(material_by_name.Get(filename,mtl)) return mtl; constexpr char MaterialFileHeader[]=u8"Material\x1A"; constexpr uint MaterialFileHeaderLength=sizeof(MaterialFileHeader)-1; int64 filesize; uint8 *filedata=(uint8 *)filesystem::LoadFileToMemory(filename+OS_TEXT(".material"),filesize); if(!filedata) { material_by_name.Add(filename,nullptr); return(nullptr); } AutoDeleteArray origin_filedata(filedata,filesize); if(filesizeGetStageName()); sm=CreateShaderModule(shader_name,sr); if(sm) { if(smm->Add(sm)) continue; } } result=false; break; } if(result) { mtl=device->CreateMaterial(smm); Add(mtl); } else { delete smm; mtl=nullptr; } material_by_name.Add(filename,mtl); return(mtl); } VK_NAMESPACE_END