65 : _params(std::move(params))
66 , _camera(engine.createCamera())
67 , _imageGenerator(imageGenerator)
71 const auto& engineName = applicationParameters.getEngine();
72 if (engineName == ENGINE_OPTIX_6)
73 CORE_THROW(
"Snapshot are currently not supported by the " + engineName +
" engine");
78 _params.
animParams = std::make_unique<AnimationParameters>(parametersManager.getAnimationParameters());
83 _params.
geometryParams = std::make_unique<GeometryParameters>(parametersManager.getGeometryParameters());
88 _params.
volumeParams = std::make_unique<VolumeParameters>(parametersManager.getVolumeParameters());
93 _params.
fieldParams = std::make_unique<FieldParameters>(parametersManager.getFieldParameters());
101 *_camera = *_params.
camera;
103 _camera->clonePropertiesFrom(engine.
getCamera());
111 _renderer->setCurrentType(renderer.getCurrentType());
112 _renderer->clonePropertiesFrom(renderer);
114 _scene->copyFrom(engine.
getScene());
121 _camera->updateProperty(CAMERA_PROPERTY_ASPECT_RATIO.name,
double(_params.
size.x) / _params.
size.y);
124 _renderer->setSamplesPerPixel(1);
125 _renderer->setSubsampling(1);
126 _renderer->setCamera(_camera);
127 _renderer->setEngine(&_engine);
130 std::stringstream msg;
131 msg <<
"Render snapshot";
132 if (!_params.
name.empty())
136 const auto isStereo = _camera->hasProperty(CAMERA_PROPERTY_STEREO.name) &&
137 _camera->getProperty<
bool>(CAMERA_PROPERTY_STEREO.name);
138 const auto names = isStereo ?
strings{
"0L",
"0R"} :
strings{DEFAULT};
139 std::vector<FrameBufferPtr> frameBuffers;
140 for (
const auto& name : names)
143 while (frameBuffers[0]->numAccumFrames() != size_t(_params.
samplesPerPixel))
145 for (
auto frameBuffer : frameBuffers)
147 _camera->setBufferTarget(frameBuffer->getName());
148 _camera->markModified(
false);
150 _camera->resetModified();
151 _renderer->render(frameBuffer);
152 frameBuffer->incrementAccumFrames();
155 progress(msg.str(), 1.f / frameBuffers[0]->numAccumFrames(),
159 if (!_params.
filePath.empty() && frameBuffers.size() == 1)
161 auto& fb = *frameBuffers[0];
174 auto fif = _params.
format ==
"jpg" ? FIF_JPEG : FreeImage_GetFIFFromFormat(_params.
format.c_str());
177 image.reset(FreeImage_ConvertTo24Bits(image.get()));
178 else if (fif == FIF_UNKNOWN)
180 std::cerr <<
"Unknown format: " << _params.
format << std::endl;
190 FreeImage_SaveToMemory(fif, image.get(), memory.get(), flags);
192 BYTE* pixels =
nullptr;
194 FreeImage_AcquireMemory(memory.get(), &pixels, &numPixels);
198 file.open(path, std::ios_base::binary);
201 std::cerr <<
"Failed to create " << path << std::endl;
205 file.write((
char*)pixels, numPixels);
209 SnapshotParams _params;
214 ImageGenerator& _imageGenerator;
Provides an abstract implementation of a ray-tracing engine.
virtual PLATFORM_API FrameBufferPtr createFrameBuffer(const std::string &name, const Vector2ui &frameSize, FrameBufferFormat frameBufferFormat) const =0
Factory method to create an engine-specific framebuffer.
PLATFORM_API const auto & getParametersManager() const
Returns the parameter manager.
virtual PLATFORM_API ScenePtr createScene(AnimationParameters &animationParameters, GeometryParameters &geometryParameters, VolumeParameters &volumeParameters, FieldParameters &fieldParameters) const =0
Factory method to create an engine-specific scene.
PLATFORM_API Renderer & getRenderer()
Returns the renderer.
PLATFORM_API Scene & getScene()
Returns the scene.
virtual PLATFORM_API RendererPtr createRenderer(const AnimationParameters &animationParameters, const RenderingParameters &renderingParameters) const =0
Factory method to create an engine-specific renderer.
PLATFORM_API const Camera & getCamera() const
Returns the camera.
This class represents a frame buffer for an engine specific code. It provides an API for utilizing an...
PLATFORM_API freeimage::ImagePtr getImage()
Get the Image object.
ImageBase64 createImage(FrameBuffer &frameBuffer, const std::string &format, uint8_t quality)
const std::string & getCurrentType() const
SnapshotFunctor(Engine &engine, SnapshotParams &¶ms, ImageGenerator &imageGenerator)
ImageGenerator::ImageBase64 operator()()
void progress(const std::string &message, const float increment, const float amount)
std::unique_ptr< FIMEMORY, MemoryDeleter > MemoryPtr
std::string shortenString(const std::string &string, const size_t maxLength)
std::shared_ptr< Camera > CameraPtr
std::shared_ptr< Renderer > RendererPtr
std::shared_ptr< FrameBuffer > FrameBufferPtr
std::shared_ptr< Scene > ScenePtr
glm::vec< 2, uint32_t > Vector2ui
std::unique_ptr< Renderer > renderer
std::unique_ptr< VolumeParameters > volumeParams
std::unique_ptr< FieldParameters > fieldParams
std::unique_ptr< AnimationParameters > animParams
std::unique_ptr< GeometryParameters > geometryParams
std::unique_ptr< Camera > camera