diff --git a/library/public/camera.h b/library/public/camera.h index bba321b1a1..670afec571 100644 --- a/library/public/camera.h +++ b/library/public/camera.h @@ -35,19 +35,19 @@ class F3D_EXPORT camera * Angles are in degrees. */ virtual camera& setPosition(const point3_t& pos) = 0; - virtual point3_t getPosition() = 0; + [[nodiscard]] virtual point3_t getPosition() = 0; virtual void getPosition(point3_t& pos) = 0; virtual camera& setFocalPoint(const point3_t& foc) = 0; - virtual point3_t getFocalPoint() = 0; + [[nodiscard]] virtual point3_t getFocalPoint() = 0; virtual void getFocalPoint(point3_t& foc) = 0; virtual camera& setViewUp(const vector3_t& up) = 0; - virtual vector3_t getViewUp() = 0; + [[nodiscard]] virtual vector3_t getViewUp() = 0; virtual void getViewUp(vector3_t& up) = 0; virtual camera& setViewAngle(const angle_deg_t& angle) = 0; - virtual angle_deg_t getViewAngle() = 0; + [[nodiscard]] virtual angle_deg_t getViewAngle() = 0; virtual void getViewAngle(angle_deg_t& angle) = 0; virtual camera& setState(const camera_state_t& state) = 0; - virtual camera_state_t getState() = 0; + [[nodiscard]] virtual camera_state_t getState() = 0; virtual void getState(camera_state_t& state) = 0; ///@} diff --git a/library/public/context.h b/library/public/context.h index b190740726..b4309edee3 100644 --- a/library/public/context.h +++ b/library/public/context.h @@ -29,34 +29,34 @@ class F3D_EXPORT context * Create a GLX context function. * Only supported on Linux. */ - static function glx(); + [[nodiscard]] static function glx(); /** * Create a WGL context function. * Only supported on Windows. */ - static function wgl(); + [[nodiscard]] static function wgl(); /** * Create a COCOA context function. * This is usually required when using a headless context and a GPU device. * Only supported on macOS. */ - static function cocoa(); + [[nodiscard]] static function cocoa(); /** * Create a EGL context function. * This is usually required when using a headless context and a GPU device. * Only supported on Linux and Windows. */ - static function egl(); + [[nodiscard]] static function egl(); /** * Create a OSMesa context function. * This is usually required when using a headless context and no GPU device. * Only supported on Linux and Windows. */ - static function osmesa(); + [[nodiscard]] static function osmesa(); /** * Create a context function from a library name and a function name. @@ -64,7 +64,7 @@ class F3D_EXPORT context * For example, `getSymbol("EGL", "eglGetProcAddress")` looks for the symbol * `eglGetProcAddress` in the library `libEGL.so` on Linux. */ - static function getSymbol(const std::string& lib, const std::string& func); + [[nodiscard]] static function getSymbol(const std::string& lib, const std::string& func); /** * An exception that can be thrown when the requested library cannot be loaded. diff --git a/library/public/engine.h b/library/public/engine.h index 230b3f18a3..4a715664e8 100644 --- a/library/public/engine.h +++ b/library/public/engine.h @@ -45,12 +45,12 @@ class F3D_EXPORT engine * Windows: Try Win32, then EGL, then OSMesa * macOS: Always use Cocoa */ - static engine create(bool offscreen = false); + [[nodiscard]] static engine create(bool offscreen = false); /** * Create an engine with no window. */ - static engine createNone(); + [[nodiscard]] static engine createNone(); /** * Create an engine with a GLX window. @@ -59,7 +59,7 @@ class F3D_EXPORT engine * Optionally, the window can be hidden by setting offscreen to true. * Throws engine::loading_exception in case of window creation failure. */ - static engine createGLX(bool offscreen = false); + [[nodiscard]] static engine createGLX(bool offscreen = false); /** * Create an engine with a WGL window. @@ -68,7 +68,7 @@ class F3D_EXPORT engine * Optionally, the window can be hidden by setting offscreen to true. * Throws engine::loading_exception in case of window creation failure. */ - static engine createWGL(bool offscreen = false); + [[nodiscard]] static engine createWGL(bool offscreen = false); /** * Create an engine with an offscreen EGL window. @@ -77,14 +77,14 @@ class F3D_EXPORT engine * `VTK_DEFAULT_EGL_DEVICE_INDEX` allows its selection. * Throws engine::loading_exception in case of failure. */ - static engine createEGL(); + [[nodiscard]] static engine createEGL(); /** * Create an engine with an offscreen OSMesa window. * VTK >= 9.4 required. * Throws engine::loading_exception in case of window creation failure. */ - static engine createOSMesa(); + [[nodiscard]] static engine createOSMesa(); /** * Create an engine with an external window. @@ -95,7 +95,7 @@ class F3D_EXPORT engine * f3d::engine eng = f3d::engine::createExternal(glfwGetProcAddress); * \endcode */ - static engine createExternal(const context::function& getProcAddress); + [[nodiscard]] static engine createExternal(const context::function& getProcAddress); /** * Create an engine with an external GLX context. @@ -103,7 +103,7 @@ class F3D_EXPORT engine * VTK >= 9.4 required. * Throws context::loading_exception if GLX library is not found or if not running on Linux. */ - static engine createExternalGLX(); + [[nodiscard]] static engine createExternalGLX(); /** * Create an engine with an external WGL context. @@ -111,7 +111,7 @@ class F3D_EXPORT engine * VTK >= 9.4 required. * Throws context::loading_exception if WGL library is not found or if not running on Windows. */ - static engine createExternalWGL(); + [[nodiscard]] static engine createExternalWGL(); /** * Create an engine with an external COCOA context. @@ -119,7 +119,7 @@ class F3D_EXPORT engine * VTK >= 9.4 required. * Throws context::loading_exception if WGL library is not found or if not running on Windows. */ - static engine createExternalCOCOA(); + [[nodiscard]] static engine createExternalCOCOA(); /** * Create an engine with an external EGL context. @@ -127,7 +127,7 @@ class F3D_EXPORT engine * VTK >= 9.4 required. * Throws context::loading_exception if EGL library is not found. */ - static engine createExternalEGL(); + [[nodiscard]] static engine createExternalEGL(); /** * Create an engine with an external OSMesa context. @@ -135,7 +135,7 @@ class F3D_EXPORT engine * VTK >= 9.4 required. * Throws context::loading_exception if OSMesa library is not found. */ - static engine createExternalOSMesa(); + [[nodiscard]] static engine createExternalOSMesa(); /** * Engine destructor, delete all object instances as well. @@ -179,24 +179,24 @@ class F3D_EXPORT engine /** * Get the default options provided by the engine. */ - options& getOptions(); + [[nodiscard]] options& getOptions(); /** * Get the window provided by the engine, if any. * If not, will throw a engine::no_window_exception. */ - window& getWindow(); + [[nodiscard]] window& getWindow(); /** * Get the loaded provided by the engine. */ - scene& getScene(); + [[nodiscard]] scene& getScene(); /** * Get the interactor provided by the engine, if any. * If not, will throw a engine::no_interactor_exception. */ - interactor& getInteractor(); + [[nodiscard]] interactor& getInteractor(); /** * Load a plugin. @@ -225,7 +225,7 @@ class F3D_EXPORT engine * Listed plugins can be loaded using engine::loadPlugin function. * Note that the listed plugins may fail to load if the library is not found or incompatible. */ - static std::vector getPluginsList(const std::string& pluginPath); + [[nodiscard]] static std::vector getPluginsList(const std::string& pluginPath); /** * A structure providing information about the libf3d. @@ -247,7 +247,7 @@ class F3D_EXPORT engine /** * Get a struct containing info about the libf3d. */ - static libInformation getLibInfo(); + [[nodiscard]] static libInformation getLibInfo(); /** * A structure providing information about a reader. @@ -267,7 +267,7 @@ class F3D_EXPORT engine /** * Get a vector of struct containing info about the supported readers. */ - static std::vector getReadersInfo(); + [[nodiscard]] static std::vector getReadersInfo(); /** * An exception that can be thrown by the engine diff --git a/library/public/image.h b/library/public/image.h index faa2930873..3b10a53100 100644 --- a/library/public/image.h +++ b/library/public/image.h @@ -76,8 +76,8 @@ class F3D_EXPORT image /** * Comparison operators, uses image::compare with a threshold of 1e-14. */ - bool operator==(const image& reference) const; - bool operator!=(const image& reference) const; + [[nodiscard]] bool operator==(const image& reference) const; + [[nodiscard]] bool operator!=(const image& reference) const; ///@} /** @@ -86,12 +86,12 @@ class F3D_EXPORT image * \warning Because of the normalization, this function can be slow, prefer getContent when * reading several pixels and normalization is not needed. */ - std::vector getNormalizedPixel(const std::pair& xy) const; + [[nodiscard]] std::vector getNormalizedPixel(const std::pair& xy) const; /** * Get the list of supported image format extensions when opening a file. */ - static std::vector getSupportedFormats(); + [[nodiscard]] static std::vector getSupportedFormats(); ///@{ @name Resolution /** @@ -99,8 +99,8 @@ class F3D_EXPORT image * * \deprecated { setResolution is deprecated, use the appropriate constructor } */ - unsigned int getWidth() const; - unsigned int getHeight() const; + [[nodiscard]] unsigned int getWidth() const; + [[nodiscard]] unsigned int getHeight() const; ///@} ///@{ @name Channel Count @@ -109,19 +109,19 @@ class F3D_EXPORT image * * \deprecated { setChannelCount is deprecated, use the appropriate constructor } */ - unsigned int getChannelCount() const; + [[nodiscard]] unsigned int getChannelCount() const; ///@} /** * Get image channel type. * throw an `image::read_exception` if the type is unknown. */ - ChannelType getChannelType() const; + [[nodiscard]] ChannelType getChannelType() const; /** * Get image channel type size in bytes. */ - unsigned int getChannelTypeSize() const; + [[nodiscard]] unsigned int getChannelTypeSize() const; ///@{ @name Buffer Data /** @@ -131,7 +131,7 @@ class F3D_EXPORT image * \deprecated { setData and getData are deprecated, use setContent and getContent instead } */ image& setContent(void* buffer); - void* getContent() const; + [[nodiscard]] void* getContent() const; ///@} /** @@ -166,7 +166,7 @@ class F3D_EXPORT image void save(const std::string& path, SaveFormat format = SaveFormat::PNG) const; /** - * Save an image to a memory buffer in the specified format. + * Save an image to a memory buffer in the specified format and returns it. * Default format is PNG if not specified. * PNG: Supports channel type BYTE and SHORT with channel count of 1 to 4 * JPG: Supports channel type BYTE with channel count of 1 or 3 @@ -175,7 +175,7 @@ class F3D_EXPORT image * Throw an `image::write_exception` if the type is TIF or * if the format is incompatible with with image channel type or channel count. */ - std::vector saveBuffer(SaveFormat format = SaveFormat::PNG) const; + [[nodiscard]] std::vector saveBuffer(SaveFormat format = SaveFormat::PNG) const; /** * Convert to colored text using ANSI escape sequences for printing in a terminal. @@ -195,7 +195,7 @@ class F3D_EXPORT image * See `toTerminalText(std::ostream& stream)`. * Throw a `image::write_exception` if the type is not byte RGB or RGBA. */ - std::string toTerminalText() const; + [[nodiscard]] std::string toTerminalText() const; /** * Set the value for a metadata key. Setting an empty value (`""`) removes the key. @@ -206,12 +206,12 @@ class F3D_EXPORT image * Get the value for a metadata key. * Throw a `image::read_exception` if key does not exist. */ - std::string getMetadata(const std::string& key) const; + [[nodiscard]] std::string getMetadata(const std::string& key) const; /** * List all the metadata keys which have a value set. */ - std::vector allMetadata() const; + [[nodiscard]] std::vector allMetadata() const; /** * An exception that can be thrown by the image when there. diff --git a/library/public/interactor.h b/library/public/interactor.h index d62d5e8ea2..12dc41ed0d 100644 --- a/library/public/interactor.h +++ b/library/public/interactor.h @@ -35,24 +35,24 @@ struct interaction_bind_t * Operator to be able to store binds in maps and other structs * Compare modifier and interaction */ - bool operator<(const interaction_bind_t& bind) const; + [[nodiscard]] bool operator<(const interaction_bind_t& bind) const; /** * Operator to be able to store binds in maps and other structs * Compare modifier and interaction */ - bool operator==(const interaction_bind_t& bind) const; + [[nodiscard]] bool operator==(const interaction_bind_t& bind) const; /** * Format this binding into a string * eg: "A", "Any+Question", "Shift+L". */ - std::string format() const; + [[nodiscard]] std::string format() const; /** * Create and return an interaction bind from provided string */ - static interaction_bind_t parse(const std::string& str); + [[nodiscard]] static interaction_bind_t parse(const std::string& str); }; /** @@ -90,7 +90,7 @@ class F3D_EXPORT interactor /** * Return a string vector containing all currently defined actions of commands */ - virtual std::vector getCommandActions() const = 0; + [[nodiscard]] virtual std::vector getCommandActions() const = 0; /** * Trigger provided command, see COMMANDS.md for details about supported @@ -172,19 +172,19 @@ class F3D_EXPORT interactor /** * Return a vector of available bind groups, in order of addition */ - virtual std::vector getBindGroups() const = 0; + [[nodiscard]] virtual std::vector getBindGroups() const = 0; /** * Return a vector of bind for the specified group, in order of addition * * Getting binds for a group that does not exists will throw a does_not_exists_exception. */ - virtual std::vector getBindsForGroup(std::string group) const = 0; + [[nodiscard]] virtual std::vector getBindsForGroup(std::string group) const = 0; /** * Return a vector of all binds, in order of addition */ - virtual std::vector getBinds() const = 0; + [[nodiscard]] virtual std::vector getBinds() const = 0; /** * Get a pair of string documenting a binding. @@ -198,7 +198,7 @@ class F3D_EXPORT interactor * * Getting documentation for a bind that does not exists will throw a does_not_exists_exception. */ - virtual std::pair getBindingDocumentation( + [[nodiscard]] virtual std::pair getBindingDocumentation( const interaction_bind_t& bind) const = 0; ///@} diff --git a/library/public/options.h.in b/library/public/options.h.in index 01dd6c5a4f..2b8001f0b5 100644 --- a/library/public/options.h.in +++ b/library/public/options.h.in @@ -53,7 +53,7 @@ public: * Throw an options::inexistent_exception if option does not exist. * Throw an options::no_value_exception if option has not been set. */ - option_variant_t get(const std::string& name) const; + [[nodiscard]] option_variant_t get(const std::string& name) const; /** * Set an option as a string based on its name @@ -69,7 +69,7 @@ public: * Throw an options::inexistent_exception if option does not exist. * Throw an options::no_value_exception if option has not been set. */ - std::string getAsString(const std::string& name) const; + [[nodiscard]] std::string getAsString(const std::string& name) const; /** * A boolean option specific method to toggle it. @@ -84,14 +84,14 @@ public: * Return true if they are the same value, false otherwise. * Throw an options::inexistent_exception if option does not exist. */ - bool isSame(const options& other, const std::string& name) const; + [[nodiscard]] bool isSame(const options& other, const std::string& name) const; /** * Return true if an option has a value, false otherwise * Always returns true for non-optional options. * Throw an options::inexistent_exception if option does not exist. */ - bool hasValue(const std::string& name) const; + [[nodiscard]] bool hasValue(const std::string& name) const; /** * Copy the value of an option from this to the provided other. @@ -102,23 +102,23 @@ public: /** * Get all available option names. */ - static std::vector getAllNames(); + [[nodiscard]] static std::vector getAllNames(); /** * Get all option names that currently have values. */ - std::vector getNames() const; + [[nodiscard]] std::vector getNames() const; /** * Get the closest option name and its Levenshtein distance. */ - std::pair getClosestOption(const std::string& option) const; + [[nodiscard]] std::pair getClosestOption(const std::string& option) const; /** * Returns true if the option is optional else returns false. * Throws an options::inexistent_exception if option does not exist. */ - bool isOptional(const std::string& option) const; + [[nodiscard]] bool isOptional(const std::string& option) const; /** * Resets the option to default value. @@ -149,7 +149,7 @@ public: * Throw an options::parsing_exception if parsing failed. */ template - static T parse(const std::string& str); + [[nodiscard]] static T parse(const std::string& str); /** * An exception that can be thrown by the options diff --git a/library/public/scene.h b/library/public/scene.h index 52a7f7572c..960975f6c6 100644 --- a/library/public/scene.h +++ b/library/public/scene.h @@ -80,7 +80,7 @@ class F3D_EXPORT scene /** * Return true if provided file path is supported, false otherwise. */ - virtual bool supports(const std::filesystem::path& filePath) = 0; + [[nodiscard]] virtual bool supports(const std::filesystem::path& filePath) = 0; /** * Load added files at provided time value if they contain any animation @@ -94,7 +94,7 @@ class F3D_EXPORT scene * Get animation time range of currently added files. * Returns [0, 0] if there is no animations. */ - virtual std::pair animationTimeRange() = 0; + [[nodiscard]] virtual std::pair animationTimeRange() = 0; protected: //! @cond diff --git a/library/public/types.h b/library/public/types.h index 238a005184..b5357720c1 100644 --- a/library/public/types.h +++ b/library/public/types.h @@ -80,7 +80,7 @@ struct mesh_t * Returns a pair with the first element to true if the mesh is valid. * If invalid, an error message is returned in the second element. */ - F3D_EXPORT std::pair isValid() const; + F3D_EXPORT [[nodiscard]] std::pair isValid() const; }; } diff --git a/library/public/utils.h b/library/public/utils.h index 45609af8b9..7cd431ac5a 100644 --- a/library/public/utils.h +++ b/library/public/utils.h @@ -26,7 +26,7 @@ class F3D_EXPORT utils * Compute the Levenshtein distance between two strings. * Can be useful for spell checking and typo detection. */ - static unsigned int textDistance(const std::string& strA, const std::string& strB); + [[nodiscard]] static unsigned int textDistance(const std::string& strA, const std::string& strB); // clang-format off /** @@ -52,7 +52,7 @@ class F3D_EXPORT utils * `set scene.up.direction "+Z` -> tokenize_exception * `set scene.up.direction +Z\` -> tokenize_exception */ - static std::vector tokenize(std::string_view str); + [[nodiscard]] static std::vector tokenize(std::string_view str); // clang-format on /** @@ -89,10 +89,10 @@ class F3D_EXPORT utils */ string_template& substitute(const std::map& lookup); - std::string str() const; + [[nodiscard]] std::string str() const; /** List the remaining un-substituted variables. */ - std::vector variables() const; + [[nodiscard]] std::vector variables() const; /** * Exception to be thrown by substitution functions to let untouched variables through. diff --git a/library/public/window.h b/library/public/window.h index 37d2cf75e2..33d7aa9c6a 100644 --- a/library/public/window.h +++ b/library/public/window.h @@ -49,17 +49,17 @@ class F3D_EXPORT window /** * Get the type of the window. */ - virtual Type getType() = 0; + [[nodiscard]] virtual Type getType() = 0; /** * Is the window offscreen. */ - virtual bool isOffscreen() = 0; + [[nodiscard]] virtual bool isOffscreen() = 0; /** * Get the camera provided by the window. */ - virtual camera& getCamera() = 0; + [[nodiscard]] virtual camera& getCamera() = 0; /** * Perform a render of the window to the screen. @@ -74,7 +74,7 @@ class F3D_EXPORT window * Set noBackground to true to have a transparent background. * Return the resulting f3d::image. */ - virtual image renderToImage(bool noBackground = false) = 0; + [[nodiscard]] virtual image renderToImage(bool noBackground = false) = 0; /** * Set the size of the window. @@ -84,12 +84,12 @@ class F3D_EXPORT window /** * Get the width of the window. */ - virtual int getWidth() const = 0; + [[nodiscard]] virtual int getWidth() const = 0; /** * Get the height of the window. */ - virtual int getHeight() const = 0; + [[nodiscard]] virtual int getHeight() const = 0; /** * Set the position of the window. @@ -111,12 +111,12 @@ class F3D_EXPORT window /** * Convert a point in display coordinate to world coordinate. */ - virtual point3_t getWorldFromDisplay(const point3_t& displayPoint) const = 0; + [[nodiscard]] virtual point3_t getWorldFromDisplay(const point3_t& displayPoint) const = 0; /** * Convert a point in world coordinate to display coordinate. */ - virtual point3_t getDisplayFromWorld(const point3_t& worldPoint) const = 0; + [[nodiscard]] virtual point3_t getDisplayFromWorld(const point3_t& worldPoint) const = 0; protected: //! @cond diff --git a/library/testing/TestSDKImage.cxx b/library/testing/TestSDKImage.cxx index 336f225794..a51afcb85a 100644 --- a/library/testing/TestSDKImage.cxx +++ b/library/testing/TestSDKImage.cxx @@ -69,7 +69,7 @@ int TestSDKImage(int argc, char* argv[]) test("generated JPG buffer not empty", bufferJPG.size() != 0); test.expect("save incompatible buffer to TIF format", - [&]() { generated.saveBuffer(f3d::image::SaveFormat::TIF); }); + [&]() { std::ignore = generated.saveBuffer(f3d::image::SaveFormat::TIF); }); std::vector bufferBMP = generated.saveBuffer(f3d::image::SaveFormat::BMP); test("generated BMP buffer not empty", bufferBMP.size() != 0); @@ -82,16 +82,16 @@ int TestSDKImage(int argc, char* argv[]) test.expect( "save buffer to incorrect path", [&]() { generated.save("/dummy/folder/img.png"); }); test.expect("save incompatible buffer to BMP format", - [&]() { img16.saveBuffer(f3d::image::SaveFormat::BMP); }); + [&]() { std::ignore = img16.saveBuffer(f3d::image::SaveFormat::BMP); }); test.expect("save incompatible buffer to PNG format", - [&]() { img32.saveBuffer(f3d::image::SaveFormat::PNG); }); + [&]() { std::ignore = img32.saveBuffer(f3d::image::SaveFormat::PNG); }); f3d::image img2Ch(4, 4, 2); f3d::image img5Ch(4, 4, 5); test.expect("save incompatible channel count to BMP format", - [&]() { img5Ch.saveBuffer(f3d::image::SaveFormat::BMP); }); + [&]() { std::ignore = img5Ch.saveBuffer(f3d::image::SaveFormat::BMP); }); test.expect("save incompatible channel count to JPG format", - [&]() { img2Ch.saveBuffer(f3d::image::SaveFormat::JPG); }); + [&]() { std::ignore = img2Ch.saveBuffer(f3d::image::SaveFormat::JPG); }); test.expect( "read image from incorrect path", [&]() { f3d::image img("/dummy/folder/img.png"); }); @@ -221,9 +221,9 @@ int TestSDKImage(int argc, char* argv[]) // test toTerminalText { test.expect("invalid toTerminalText with BYTE", - [&]() { f3d::image(3, 3, 1, f3d::image::ChannelType::BYTE).toTerminalText(); }); + [&]() { std::ignore = f3d::image(3, 3, 1, f3d::image::ChannelType::BYTE).toTerminalText(); }); test.expect("invalid toTerminalText with SHORT", - [&]() { f3d::image(3, 3, 4, f3d::image::ChannelType::SHORT).toTerminalText(); }); + [&]() { std::ignore = f3d::image(3, 3, 4, f3d::image::ChannelType::SHORT).toTerminalText(); }); const auto fileToString = [](const std::string& path) { std::ifstream file(path); @@ -253,11 +253,11 @@ int TestSDKImage(int argc, char* argv[]) std::set(keys.begin(), keys.end()) == std::set({ "foo", "hello" })); test.expect( - "invalid get metadata", [&]() { img.getMetadata("baz"); }); + "invalid get metadata", [&]() { std::ignore = img.getMetadata("baz"); }); test.expect("remove and get metadata", [&]() { img.setMetadata("foo", ""); // empty value, should remove key - img.getMetadata("foo"); // expected to throw + std::ignore = img.getMetadata("foo"); // expected to throw }); test( diff --git a/library/testing/TestSDKUtils.cxx b/library/testing/TestSDKUtils.cxx index e4157d616b..2ca8f94452 100644 --- a/library/testing/TestSDKUtils.cxx +++ b/library/testing/TestSDKUtils.cxx @@ -63,10 +63,10 @@ int TestSDKUtils(int argc, char* argv[]) std::vector{ "set", "render.hdri.file", R"(file\pa\th\backsl\ashes)" }); test.expect("tokenize_exception with incomplete quotes", - [&]() { f3d::utils::tokenize(R"(set render.hdri.file "file path back)"); }); + [&]() { std::ignore = f3d::utils::tokenize(R"(set render.hdri.file "file path back)"); }); test.expect("tokenize_exception with unfinishied escape", - [&]() { f3d::utils::tokenize(R"(set render.hdri.file file path back\)"); }); + [&]() { std::ignore = f3d::utils::tokenize(R"(set render.hdri.file file path back\)"); }); //