@@ -49,7 +49,8 @@ int main(int argc, char** argv)
49
49
std::string outputScreenshotsFolderPath = cmdHandler.getOutputScreenshotsFolderPath ();
50
50
bool shouldTerminate = cmdHandler.getTerminate (); // skip interaction with window and take screenshots only
51
51
bool takeScreenShots = true ;
52
-
52
+ std::string mainFileName; // std::filesystem::path(filePath).filename().string();
53
+
53
54
// create device with full flexibility over creation parameters
54
55
// you can add more parameters if desired, check nbl::SIrrlichtCreationParameters
55
56
nbl::SIrrlichtCreationParameters params;
@@ -89,6 +90,9 @@ int main(int argc, char** argv)
89
90
90
91
if (filePath.empty ())
91
92
filePath = " ../../media/mitsuba/staircase2.zip" ;
93
+
94
+ mainFileName = std::filesystem::path (filePath).filename ().string ();
95
+ mainFileName = mainFileName.substr (0u , mainFileName.find_first_of (' .' ));
92
96
93
97
if (core::hasFileExtension (io::path (filePath.c_str ()), " zip" , " ZIP" ))
94
98
{
@@ -183,6 +187,7 @@ int main(int argc, char** argv)
183
187
float moveSpeed = core::nan<float >();
184
188
scene::ICameraSceneNode * staticCamera;
185
189
scene::ICameraSceneNode * interactiveCamera;
190
+ std::string outputFileName = " " ;
186
191
};
187
192
188
193
auto smgr = device->getSceneManager ();
@@ -342,15 +347,12 @@ int main(int argc, char** argv)
342
347
343
348
bool rightHandedCamera = true ;
344
349
float moveSpeed = core::nan<float >();
345
- uint32_t sensorSamplesNeeded = 0u ;
346
350
347
351
if (globalMeta->m_global .m_sensors .size () && isOkSensorType (globalMeta->m_global .m_sensors .front ()))
348
352
{
349
353
const auto & sensor = globalMeta->m_global .m_sensors .front ();
350
354
const auto & film = sensor.film ;
351
355
352
- sensorSamplesNeeded = sensor.sampler .sampleCount ;
353
-
354
356
// need to extract individual components
355
357
{
356
358
auto relativeTransform = sensor.transform .matrix .extractSub3x4 ();
@@ -489,33 +491,31 @@ int main(int argc, char** argv)
489
491
renderer->initSceneResources (meshes);
490
492
meshes = {}; // free memory
491
493
494
+ uint32_t activeSensor = 0u ; // that outputs to current window when not in TERMIANTE mode.
495
+
492
496
auto extent = renderer->getSceneBound ().getExtent ();
493
- smgr->setActiveCamera (camera );
497
+ smgr->setActiveCamera (sensors[activeSensor]. interactiveCamera );
494
498
495
499
QToQuitEventReceiver receiver;
496
500
device->setEventReceiver (&receiver);
497
501
498
- renderer->initScreenSizedResources (sensors[0 ].width , sensors[0 ].height , std::move (sampleSequence));
502
+ renderer->initScreenSizedResources (sensors[activeSensor ].width , sensors[activeSensor ].height , std::move (sampleSequence));
499
503
500
504
uint64_t lastFPSTime = 0 ;
501
505
auto start = std::chrono::steady_clock::now ();
502
506
while (device->run () && receiver.keepOpen ())
503
507
{
504
508
driver->beginScene (false , false );
505
509
506
- std::cout << " Camera Position Before Render: (" << camera->getPosition ().X << " ," << camera->getPosition ().Y << " ," << camera->getPosition ().Z << " )" << std::endl;
507
- std::cout << " Target Before Render: (" << camera->getTarget ().X << " ," << camera->getTarget ().Y << " ," << camera->getTarget ().Z << " )" << std::endl;
508
510
renderer->render (device->getTimer ());
509
- std::cout << " Camera Position After Render: (" << camera->getPosition ().X << " ," << camera->getPosition ().Y << " ," << camera->getPosition ().Z << " )" << std::endl;
510
- std::cout << " Target After Render: (" << camera->getTarget ().X << " ," << camera->getTarget ().Y << " ," << camera->getTarget ().Z << " )" << std::endl;
511
511
512
512
auto oldVP = driver->getViewPort ();
513
513
driver->blitRenderTargets (renderer->getColorBuffer (),nullptr ,false ,false ,{},{},true );
514
514
driver->setViewPort (oldVP);
515
515
516
516
driver->endScene ();
517
517
518
- if (shouldTerminate && renderer->getTotalSamplesPerPixelComputed () >= sensorSamplesNeeded )
518
+ if (shouldTerminate && renderer->getTotalSamplesPerPixelComputed () >= sensors[activeSensor]. samplesNeeded )
519
519
break ;
520
520
521
521
// display frames per second in window title
@@ -532,9 +532,54 @@ int main(int argc, char** argv)
532
532
lastFPSTime = time;
533
533
}
534
534
}
535
-
536
- renderer->takeAndSaveScreenShot (" tonemapped " , outputScreenshotsFolderPath);
535
+
536
+ renderer->takeAndSaveScreenShot (" LastView_ " + mainFileName + " _Sensor_ " + std::to_string (activeSensor) , outputScreenshotsFolderPath);
537
537
renderer->deinitScreenSizedResources ();
538
+
539
+ for (uint32_t s = 0u ; s < sensors.size (); ++s)
540
+ {
541
+ const auto & sensorData = sensors[s];
542
+
543
+ std::cout << " -- Rendering " << filePath << " (Sensor=" << s << " ) to file..." << std::endl;
544
+ smgr->setActiveCamera (sensorData.staticCamera );
545
+
546
+ renderer->initScreenSizedResources (sensors[0 ].width , sensors[0 ].height , std::move (sampleSequence));
547
+
548
+ const uint32_t samplesPerPixelPerDispatch = renderer->getSamplesPerPixelPerDispatch ();
549
+ const uint32_t maxNeededIterations = (sensorData.samplesNeeded + samplesPerPixelPerDispatch - 1 ) / samplesPerPixelPerDispatch;
550
+
551
+ uint32_t itr = 0u ;
552
+ bool takenEnoughSamples = false ;
553
+
554
+ while (!takenEnoughSamples)
555
+ {
556
+ if (itr >= maxNeededIterations)
557
+ std::cout << " [ERROR] Samples taken (" << renderer->getTotalSamplesPerPixelComputed () << " ) must've exceeded samples needed for Sensor (" << sensorData.samplesNeeded << " ) by now; something is wrong." << std::endl;
558
+
559
+ driver->beginScene (false , false );
560
+ renderer->render (device->getTimer ());
561
+ auto oldVP = driver->getViewPort ();
562
+ driver->blitRenderTargets (renderer->getColorBuffer (),nullptr ,false ,false ,{},{},true );
563
+ driver->setViewPort (oldVP);
564
+
565
+ driver->endScene ();
566
+
567
+ if (renderer->getTotalSamplesPerPixelComputed () >= sensorData.samplesNeeded )
568
+ takenEnoughSamples = true ;
569
+
570
+ itr++;
571
+ }
572
+
573
+ auto screenshotFileNameWithoutExtension = sensorData.outputFileName ;
574
+ if (screenshotFileNameWithoutExtension.empty ())
575
+ screenshotFileNameWithoutExtension = " ScreenShot_" + mainFileName + " _Sensor_" + std::to_string (s);
576
+
577
+ std::cout << " -- Rendered Successfully: " << filePath << " (Sensor=" << s << " ) to file (" << screenshotFileNameWithoutExtension << " )." << std::endl;
578
+
579
+ renderer->takeAndSaveScreenShot (screenshotFileNameWithoutExtension, outputScreenshotsFolderPath);
580
+ renderer->deinitScreenSizedResources ();
581
+ }
582
+
538
583
renderer->deinitSceneResources ();
539
584
renderer = nullptr ;
540
585
0 commit comments