9
9
10
10
#include " irr/asset/CGraphicsPipelineLoaderMTL.h"
11
11
#include " irr/asset/IGLSLEmbeddedIncludeLoader.h"
12
+ #include " irr/builtin/MTLdefaults.h"
12
13
13
14
14
15
namespace
@@ -116,13 +117,33 @@ void main()
116
117
using namespace irr ;
117
118
using namespace asset ;
118
119
120
+ static void insertPipelineIntoCache (core::smart_refctd_ptr<ICPURenderpassIndependentPipeline>&& asset, const char * path, IAssetManager* _assetMgr)
121
+ {
122
+ asset::SAssetBundle bundle ({ std::move (asset) });
123
+ _assetMgr->changeAssetKey (bundle, path);
124
+ _assetMgr->insertAssetIntoCache (bundle);
125
+ }
119
126
static void insertShaderIntoCache (core::smart_refctd_ptr<ICPUSpecializedShader>& asset, const char * path, IAssetManager* _assetMgr)
120
127
{
121
128
asset::SAssetBundle bundle ({ asset });
122
129
_assetMgr->changeAssetKey (bundle, path);
123
130
_assetMgr->insertAssetIntoCache (bundle);
124
131
}
132
+ template <typename AssetType, IAsset::E_TYPE assetType>
133
+ static core::smart_refctd_ptr<AssetType> getDefaultAsset (const char * _key, IAssetManager* _assetMgr)
134
+ {
135
+ size_t storageSz = 1ull ;
136
+ asset::SAssetBundle bundle;
137
+ const IAsset::E_TYPE types[]{ assetType, static_cast <IAsset::E_TYPE>(0u ) };
138
+
139
+ _assetMgr->findAssets (storageSz, &bundle, _key, types);
140
+ if (bundle.isEmpty ())
141
+ return nullptr ;
142
+ auto assets = bundle.getContents ();
143
+ // assert(assets.first != assets.second);
125
144
145
+ return core::smart_refctd_ptr_static_cast<AssetType>(assets.begin ()[0 ]);
146
+ }
126
147
#define VERT_SHADER_NO_UV_CACHE_KEY " irr/builtin/shaders/loaders/mtl/vertex_no_uv.vert"
127
148
#define VERT_SHADER_UV_CACHE_KEY " irr/builtin/shaders/loaders/mtl/vertex_uv.vert"
128
149
#define FRAG_SHADER_NO_UV_CACHE_KEY " irr/builtin/shaders/loaders/mtl/fragment_no_uv.frag"
@@ -148,6 +169,55 @@ CGraphicsPipelineLoaderMTL::CGraphicsPipelineLoaderMTL(IAssetManager* _am) : m_a
148
169
registerShader (IRR_CORE_UNIQUE_STRING_LITERAL_TYPE (VERT_SHADER_UV_CACHE_KEY) {}, ICPUSpecializedShader::ESS_VERTEX);
149
170
registerShader (IRR_CORE_UNIQUE_STRING_LITERAL_TYPE (FRAG_SHADER_NO_UV_CACHE_KEY){},ICPUSpecializedShader::ESS_FRAGMENT);
150
171
registerShader (IRR_CORE_UNIQUE_STRING_LITERAL_TYPE (FRAG_SHADER_UV_CACHE_KEY){},ICPUSpecializedShader::ESS_FRAGMENT);
172
+
173
+
174
+ constexpr const char * MISSING_MTL_PIPELINE_CACHE_KEY = " irr/builtin/graphics_pipeline/loaders/mtl/missing_material_pipeline" ;
175
+
176
+ /*
177
+ if possible, it would be great to use CImageLoaderPNG here
178
+
179
+ auto imgDataBuf = core::make_smart_refctd_ptr<ICPUBuffer>(sizeof(MISSING_CHECKERBOARD_TEXTURE_CONTENT));
180
+ void* dst = reinterpret_cast<uint8_t*>(imgDataBuf->getPointer());
181
+ const void* src = &MISSING_CHECKERBOARD_TEXTURE_CONTENT;
182
+ memcpy(dst, src, sizeof(MISSING_CHECKERBOARD_TEXTURE_CONTENT));
183
+ ICPUImage::SCreationParams imageParams;
184
+ imageParams.type =
185
+ ICPUImage img();
186
+
187
+
188
+
189
+
190
+ */
191
+ auto texture_file = m_assetMgr->getFileSystem ()->createMemoryReadFile (MISSING_CHECKERBOARD_TEXTURE_CONTENT, sizeof (MISSING_CHECKERBOARD_TEXTURE_CONTENT), " checkerboard.png" );
192
+
193
+ SAssetLoadParams params;
194
+ auto imageBundle = m_assetMgr->getAsset (texture_file, std::string (" checkerboard.png" ), params);
195
+ auto image = core::smart_refctd_ptr_dynamic_cast<ICPUImage>(imageBundle.getContents ().begin ()[0 ]);
196
+ ICPUImageView::SCreationParams viewParams;
197
+ viewParams.flags = static_cast <ICPUImageView::E_CREATE_FLAGS>(0u );
198
+ viewParams.format = EF_UNKNOWN;
199
+ viewParams.viewType = IImageView<ICPUImage>::ET_2D;
200
+ viewParams.subresourceRange .baseArrayLayer = 0u ;
201
+ viewParams.subresourceRange .layerCount = 1u ;
202
+ viewParams.subresourceRange .baseMipLevel = 0u ;
203
+ viewParams.subresourceRange .levelCount = 1u ;
204
+ viewParams.image = std::move (image);
205
+
206
+ image_views_set_t views;
207
+ views[0 ] = ICPUImageView::create (std::move (viewParams));
208
+
209
+ auto file = m_assetMgr->getFileSystem ()->createMemoryReadFile (DUMMY_MTL_CONTENT, strlen (DUMMY_MTL_CONTENT), " default IrrlichtBAW material" );
210
+ auto bundle = loadAsset (file, params);
211
+ auto pipeline = static_cast < ICPURenderpassIndependentPipeline*>( bundle.getContents ().begin ()->get ());
212
+ file->drop ();
213
+ auto p = core::smart_refctd_ptr<ICPURenderpassIndependentPipeline>(pipeline);
214
+ auto ds3 = makeDescSet (std::move (views), p->getLayout ()->getDescriptorSetLayout (3u ));
215
+
216
+ SAssetBundle ds3Bundle{ ds3 };
217
+ m_assetMgr->changeAssetKey (ds3Bundle, MISSING_CHECKERBOARD_TEXTURE_CACHE_KEY);
218
+ m_assetMgr->insertAssetIntoCache (ds3Bundle);
219
+
220
+ insertPipelineIntoCache (std::move (p), MISSING_MTL_PIPELINE_CACHE_KEY, m_assetMgr);
151
221
}
152
222
153
223
bool CGraphicsPipelineLoaderMTL::isALoadableFileFormat (io::IReadFile* _file) const
@@ -167,21 +237,6 @@ bool CGraphicsPipelineLoaderMTL::isALoadableFileFormat(io::IReadFile* _file) con
167
237
return mtl.find (" newmtl" ) != std::string::npos;
168
238
}
169
239
170
- template <typename AssetType, IAsset::E_TYPE assetType>
171
- static core::smart_refctd_ptr<AssetType> getDefaultAsset (const char * _key, IAssetManager* _assetMgr)
172
- {
173
- size_t storageSz = 1ull ;
174
- asset::SAssetBundle bundle;
175
- const IAsset::E_TYPE types[]{ assetType, static_cast <IAsset::E_TYPE>(0u ) };
176
-
177
- _assetMgr->findAssets (storageSz, &bundle, _key, types);
178
- if (bundle.isEmpty ())
179
- return nullptr ;
180
- auto assets = bundle.getContents ();
181
- // assert(assets.first != assets.second);
182
-
183
- return core::smart_refctd_ptr_static_cast<AssetType>(assets.begin ()[0 ]);
184
- }
185
240
186
241
core::smart_refctd_ptr<ICPUPipelineLayout> CGraphicsPipelineLoaderMTL::makePipelineLayoutFromMtl (const SMtl& _mtl, bool _noDS3)
187
242
{
@@ -324,19 +379,30 @@ SAssetBundle CGraphicsPipelineLoaderMTL::loadAsset(io::IReadFile* _file, const I
324
379
325
380
core::smart_refctd_ptr<ICPUDescriptorSet> ds3;
326
381
{
327
- const std::string dsCacheKey = std::string (fullName.c_str ())+" ?" +materials[i].name +" ?_ds" ;
328
- const asset::IAsset::E_TYPE types[]{ asset::IAsset::ET_DESCRIPTOR_SET, (asset::IAsset::E_TYPE)0u };
329
- auto ds_bundle = _override->findCachedAsset (dsCacheKey, types, ctx.inner , _hierarchyLevel + ICPUMesh::DESC_SET_HIERARCHYLEVELS_BELOW);
330
- if (!ds_bundle.isEmpty ())
331
- ds3 = core::smart_refctd_ptr_static_cast<ICPUDescriptorSet>(ds_bundle.getContents ().begin ()[0 ]);
332
- else
382
+ const std::string dsCacheKey = std::string (fullName.c_str ()) + " ?" + materials[i].name + " ?_ds" ;
383
+ if (_override)
333
384
{
334
- auto views = loadImages (relPath.c_str (), materials[i], ctx);
335
- ds3 = makeDescSet (std::move (views), layout->getDescriptorSetLayout (3u ));
336
- if (ds3)
385
+ const asset::IAsset::E_TYPE types[]{ asset::IAsset::ET_DESCRIPTOR_SET, (asset::IAsset::E_TYPE)0u };
386
+ auto ds_bundle = _override->findCachedAsset (dsCacheKey, types, ctx.inner , _hierarchyLevel + ICPUMesh::DESC_SET_HIERARCHYLEVELS_BELOW);
387
+ if (!ds_bundle.isEmpty ())
388
+ ds3 = core::smart_refctd_ptr_static_cast<ICPUDescriptorSet>(ds_bundle.getContents ().begin ()[0 ]);
389
+ else
337
390
{
338
- SAssetBundle bundle{ds3};
339
- _override->insertAssetIntoCache (bundle, dsCacheKey, ctx.inner , _hierarchyLevel + ICPURenderpassIndependentPipeline::DESC_SET_HIERARCHYLEVELS_BELOW);
391
+ auto views = loadImages (relPath.c_str (), materials[i], ctx);
392
+ ds3 = makeDescSet (std::move (views), layout->getDescriptorSetLayout (3u ));
393
+ if (ds3)
394
+ {
395
+ SAssetBundle bundle{ ds3 };
396
+ _override->insertAssetIntoCache (bundle, dsCacheKey, ctx.inner , _hierarchyLevel + ICPURenderpassIndependentPipeline::DESC_SET_HIERARCHYLEVELS_BELOW);
397
+ }
398
+ }
399
+ }
400
+ else {
401
+ const asset::IAsset::E_TYPE types[]{ asset::IAsset::ET_DESCRIPTOR_SET, (asset::IAsset::E_TYPE)0u };
402
+ auto b = m_assetMgr->findAssets (dsCacheKey, types);
403
+ if (b)
404
+ {
405
+ ds3 = core::smart_refctd_ptr_dynamic_cast<ICPUDescriptorSet>(b->begin ()->getContents ().begin ()[0 ]);
340
406
}
341
407
}
342
408
}
@@ -662,7 +728,6 @@ auto CGraphicsPipelineLoaderMTL::loadImages(const char* _relDir, const SMtl& _mt
662
728
ICPUImage::SCreationParams cubemapParams = images[CMTLPipelineMetadata::EMP_REFL_POSX]->getCreationParameters ();
663
729
cubemapParams.arrayLayers = 6u ;
664
730
cubemapParams.type = IImage::ET_2D;
665
-
666
731
auto cubemap = ICPUImage::create (std::move (cubemapParams));
667
732
auto regions = core::make_refctd_dynamic_array<core::smart_refctd_dynamic_array<ICPUImage::SBufferCopy>>(regions_);
668
733
cubemap->setBufferAndRegions (std::move (imgDataBuf), regions);
0 commit comments