@@ -163,21 +163,13 @@ Renderer::~Renderer()
163
163
Renderer::InitializationData Renderer::initSceneObjects (const SAssetBundle& meshes)
164
164
{
165
165
InitializationData retval;
166
-
167
- auto getInstances = [&retval]( const auto & cpumesh) -> core::vector<ext::MitsubaLoader::IMeshMetadata::Instance>
166
+ retval. globalMeta = meshes. getMetadata ()-> selfCast < const ext::MitsubaLoader::CMitsubaMetadata>();
167
+ assert (retval. globalMeta );
168
168
{
169
- auto * meta = cpumesh->getMetadata ();
170
- assert (meta && core::strcmpi (meta->getLoaderName (), ext::MitsubaLoader::IMitsubaMetadata::LoaderName) == 0 );
171
- const auto * meshmeta = static_cast <const ext::MitsubaLoader::IMeshMetadata*>(meta);
172
- retval.globalMeta = meshmeta->globalMetadata .get ();
173
- assert (retval.globalMeta );
174
-
175
- // WARNING !!!
176
- // all this instance-related things is a rework candidate since mitsuba loader supports instances
177
- // (all this metadata should be global, but meshbuffers has instanceCount correctly set
178
- // and globalDS with per-instance data (transform, normal matrix, instructions offsets, etc)
179
- return meshmeta->getInstances ();
180
- };
169
+ auto * glslMaterialBackendGlobalDS = retval.globalMeta ->m_global .m_ds0 .get ();
170
+ m_globalBackendDataDS = m_driver->getGPUObjectsFromAssets (&glslMaterialBackendGlobalDS,&glslMaterialBackendGlobalDS+1 )->front ();
171
+ }
172
+
181
173
core::vector<CullData_t> cullData;
182
174
core::vector<std::pair<core::smart_refctd_ptr<IGPUMeshBuffer>,uint32_t >> gpuMeshBuffers;
183
175
{
@@ -208,38 +200,39 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
208
200
};
209
201
core::unordered_map<VisibilityBufferPipelineKey, core::smart_refctd_ptr<ICPURenderpassIndependentPipeline>, VisibilityBufferPipelineKeyHash> visibilityBufferFillPipelines;
210
202
211
- meshesToProcess.reserve (contents.size ());
212
- for (auto * it=contents.begin (); it!=contents.end (); it++)
213
203
{
214
- auto cpumesh = static_cast <asset::ICPUMesh*>(it->get ());
215
- meshesToProcess.push_back (cpumesh);
204
+ meshesToProcess.reserve (contents.size ());
216
205
217
- const auto & instances = getInstances (cpumesh);
206
+ uint32_t drawableCount = 0u ;
207
+ for (const auto & asset : contents)
208
+ {
209
+ auto cpumesh = static_cast <asset::ICPUMesh*>(asset.get ());
210
+ auto meshBuffers = cpumesh->getMeshBuffers ();
211
+ assert (!meshBuffers.empty ());
218
212
219
- auto meshBufferCount = cpumesh->getMeshBufferCount ();
220
- assert (meshBufferCount);
213
+ meshesToProcess.push_back (cpumesh);
221
214
222
- const auto cullDataOffset = cullData.size ();
223
- cullData.resize (cullDataOffset+instances.size ()*meshBufferCount);
224
- for (auto i=0u ; i<meshBufferCount; i++)
215
+ drawableCount += meshBuffers.size ()*retval.globalMeta ->getAssetSpecificMetadata (cpumesh)->m_instances .size ();
216
+ }
217
+ cullData.resize (drawableCount);
218
+ }
219
+ auto cullDataIt = cullData.begin ();
220
+ for (const auto & asset : contents)
221
+ {
222
+ auto cpumesh = static_cast <asset::ICPUMesh*>(asset.get ());
223
+ const auto * meta = retval.globalMeta ->getAssetSpecificMetadata (cpumesh);
224
+ const auto & instanceData = meta->m_instances ;
225
+ const auto & instanceAuxData = meta->m_instanceAuxData ;
226
+
227
+ auto cullDataBaseBegin = cullDataIt;
228
+ auto meshBuffers = cpumesh->getMeshBuffers ();
229
+ for (auto cpumb : meshBuffers)
225
230
{
226
- // TODO: get rid of `getMeshBuffer` and `getMeshBufferCount`, just return a range as `getMeshBuffers`
227
- auto cpumb = cpumesh->getMeshBuffer (i);
228
- assert (cpumb->getInstanceCount ()==instances.size ());
231
+ assert (cpumb->getInstanceCount ()==instanceData.size ());
229
232
230
233
// set up Visibility Buffer pipelines
231
234
{
232
235
auto oldPipeline = cpumb->getPipeline ();
233
-
234
- // if global SSBO with instruction streams not captured yet
235
- if (!m_globalBackendDataDS)
236
- {
237
- // a bit roundabout but oh well what can we do (global metadata needs to be more useful)
238
- auto * pipelinemeta = static_cast <ext::MitsubaLoader::CMitsubaPipelineMetadata*>(oldPipeline->getMetadata ());
239
- auto * glslMaterialBackendGlobalDS = pipelinemeta->getDescriptorSet ();
240
- m_globalBackendDataDS = m_driver->getGPUObjectsFromAssets (&glslMaterialBackendGlobalDS,&glslMaterialBackendGlobalDS+1 )->front ();
241
- }
242
-
243
236
auto vertexInputParams = oldPipeline->getVertexInputParams ();
244
237
const bool frontFaceIsCCW = oldPipeline->getRasterizationParams ().frontFaceIsCCW ;
245
238
auto found = visibilityBufferFillPipelines.find (VisibilityBufferPipelineKey{ vertexInputParams,frontFaceIsCCW });
@@ -264,7 +257,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
264
257
cpumb->setPipeline (std::move (newPipeline));
265
258
}
266
259
267
- CullData_t& baseCullData = cullData[cullDataOffset+i] ;
260
+ CullData_t& baseCullData = *(cullDataIt++) ;
268
261
{
269
262
const auto aabbOriginal = cpumb->getBoundingBox ();
270
263
baseCullData.aabbMinEdge .x = aabbOriginal.MinEdge .X ;
@@ -279,40 +272,39 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
279
272
280
273
meshBuffersToProcess.push_back (cpumb);
281
274
}
282
- auto cullDataBaseBegin = cullData.begin ()+cullDataOffset;
283
- auto cullDataBaseEnd = cullDataBaseBegin+meshBufferCount;
284
-
285
275
286
276
// set up scene bounds and lights
287
277
const auto aabbOriginal = cpumesh->getBoundingBox ();
288
- for (auto j=0u ; j<instances .size (); j++)
278
+ for (auto j=0u ; j<instanceData .size (); j++)
289
279
{
290
- const auto & instance = instances[j];
280
+ const auto & worldTform = instanceData.begin ()[j].worldTform ;
281
+ const auto & aux = instanceAuxData.begin ()[j];
282
+
291
283
ext::RadeonRays::MockSceneManager::ObjectData objectData;
292
284
{
293
- objectData.tform = instance. tform ;
285
+ objectData.tform = worldTform ;
294
286
objectData.mesh = nullptr ;
295
- objectData.instanceGUIDPerMeshBuffer .reserve (meshBufferCount );
296
- for (auto src=cullDataBaseBegin; src!=cullDataBaseEnd ; src++)
287
+ objectData.instanceGUIDPerMeshBuffer .reserve (meshBuffers. size () );
288
+ for (auto src=cullDataBaseBegin; src!=cullDataIt ; src++)
297
289
{
298
- auto dst = src+j*meshBufferCount ;
290
+ auto dst = src+j*meshBuffers. size () ;
299
291
*dst = *src;
300
292
dst->globalObjectID += j;
301
293
objectData.instanceGUIDPerMeshBuffer .push_back (dst->globalObjectID );
302
294
}
303
295
}
304
296
m_mock_smgr.m_objectData .push_back (std::move (objectData));
305
297
306
- m_sceneBound.addInternalBox (core::transformBoxEx (aabbOriginal,instance. tform ));
298
+ m_sceneBound.addInternalBox (core::transformBoxEx (aabbOriginal,worldTform ));
307
299
308
- auto emitter = instance. emitter . front ;
300
+ auto emitter = aux. frontEmitter ;
309
301
if (emitter.type != ext::MitsubaLoader::CElementEmitter::Type::INVALID)
310
302
{
311
303
assert (emitter.type == ext::MitsubaLoader::CElementEmitter::Type::AREA);
312
304
313
- SLight newLight (cpumesh-> getBoundingBox (), instance. tform );
305
+ SLight newLight (aabbOriginal,worldTform); // TODO: should be an OBB
314
306
315
- const float weight = newLight.computeFluxBound (emitter.area .radiance ) * emitter.area .samplingWeight ;
307
+ const float weight = newLight.computeFluxBound (emitter.area .radiance )* emitter.area .samplingWeight ;
316
308
if (weight <= FLT_MIN)
317
309
continue ;
318
310
@@ -335,7 +327,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
335
327
auto objectDataIt = m_mock_smgr.m_objectData .begin ();
336
328
for (auto i=0u ; i<gpuMeshes->size (); i++)
337
329
{
338
- const auto instanceCount = getInstances (meshesToProcess[i]).size ();
330
+ const auto instanceCount = retval. globalMeta -> getAssetSpecificMetadata (meshesToProcess[i])-> m_instances .size ();
339
331
for (size_t j=0u ; j<instanceCount; j++)
340
332
(objectDataIt++)->mesh = gpuMeshes->operator [](i);
341
333
}
@@ -370,7 +362,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
370
362
{
371
363
std::copy (gpumb->getVertexBufferBindings (),gpumb->getVertexBufferBindings ()+IGPUMeshBuffer::MAX_ATTR_BUF_BINDING_COUNT,call.vertexBindings );
372
364
call.indexBuffer = core::smart_refctd_ptr (gpumb->getIndexBufferBinding ().buffer );
373
- call.pipeline = core::smart_refctd_ptr<IGPURenderpassIndependentPipeline>(const_cast <IGPURenderpassIndependentPipeline*>( gpumb->getPipeline () ));
365
+ call.pipeline = core::smart_refctd_ptr<const IGPURenderpassIndependentPipeline>(gpumb->getPipeline ());
374
366
};
375
367
initNewMDI (std::get<core::smart_refctd_ptr<IGPUMeshBuffer>>(gpuMeshBuffers.front ()));
376
368
call.mdiOffset = 0u ;
@@ -475,7 +467,7 @@ void Renderer::initSceneNonAreaLights(Renderer::InitializationData& initData)
475
467
{
476
468
core::vectorSIMDf _envmapBaseColor;
477
469
_envmapBaseColor.set (0 .f ,0 .f ,0 .f ,1 .f );
478
- for (const auto & emitter : initData.globalMeta ->emitters )
470
+ for (const auto & emitter : initData.globalMeta ->m_global . m_emitters )
479
471
{
480
472
float weight = 0 .f ;
481
473
switch (emitter.type )
@@ -610,7 +602,7 @@ void Renderer::init(const SAssetBundle& meshes,
610
602
// figure out the renderable size
611
603
{
612
604
m_staticViewData.imageDimensions = {m_driver->getScreenSize ().Width ,m_driver->getScreenSize ().Height };
613
- const auto & sensors = initData.globalMeta ->sensors ;
605
+ const auto & sensors = initData.globalMeta ->m_global . m_sensors ;
614
606
if (sensors.size ())
615
607
{
616
608
// just grab the first sensor
@@ -690,7 +682,7 @@ void Renderer::init(const SAssetBundle& meshes,
690
682
core::smart_refctd_ptr (m_raygenDSLayout),
691
683
nullptr
692
684
);
693
- (std::ofstream (" material_declarations.glsl" ) << " #define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta ->getVTStorageViewCount () << " \n " << initData.globalMeta ->materialCompilerGLSL_declarations ).close ();
685
+ (std::ofstream (" material_declarations.glsl" ) << " #define _NBL_EXT_MITSUBA_LOADER_VT_STORAGE_VIEW_COUNT " << initData.globalMeta ->m_global . getVTStorageViewCount () << " \n " << initData.globalMeta ->m_global . m_materialCompilerGLSL_declarations ).close ();
694
686
m_raygenPipeline = m_driver->createGPUComputePipeline (nullptr , core::smart_refctd_ptr (m_raygenPipelineLayout),gpuSpecializedShaderFromFile (m_assetManager,m_driver," ../raygen.comp" ));
695
687
696
688
m_raygenDS = m_driver->createGPUDescriptorSet (core::smart_refctd_ptr (m_raygenDSLayout));
0 commit comments