diff --git a/oom_bella_engine.h b/oom_bella_engine.h index cd53200..6d48877 100644 --- a/oom_bella_engine.h +++ b/oom_bella_engine.h @@ -7,101 +7,78 @@ namespace oom { namespace bella { // Function declaration - dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene); - // @param belScene - the scene to create the essentials in - // @return - the world node - dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene) { - // Create the basic scene elements in Bella - // Each line creates a different type of node in the scene auto belBeautyPass = belScene.createNode("beautyPass","oomerBeautyPass","oomerBeautyPass"); - auto belWorld = belScene.world(); // Get scene world root + /* + * MyEngineObserver Class override + * This class receives callbacks from the Bella rendering engine to track rendering progress. + * It implements the EngineObserver interface and provides methods to: + * - Handle render start/stop events + * - Track rendering progress + * - Handle error conditions + * - Store and retrieve the current progress state + */ + struct MyEngineObserver : public dl::bella_sdk::EngineObserver + { + public: + // Called when a rendering pass starts + void onStarted(dl::String pass) override { - dl::bella_sdk::Scene::EventScope es(belScene); - - auto belCamForm = belScene.createNode("xform","oomerCameraXform","oomerCameraXform"); - auto belCam = belScene.createNode("camera","oomerCamera","oomerCamera"); - auto belSensor = belScene.createNode("sensor","oomerSensor","oomerSensor"); - auto belLens = belScene.createNode("thinLens","oomerThinLens","oomerThinLens"); - auto belImageDome = belScene.createNode("imageDome","oomerImageDome","oomerImageDome"); - auto belGroundPlane = belScene.createNode("groundPlane","oomerGroundPlane","oomerGroundPlane"); - - auto belBeautyPass = belScene.createNode("beautyPass","oomerBeautyPass","oomerBeautyPass"); - auto belGroundMat = belScene.createNode("quickMaterial","oomerGroundMat","oomerGroundMat"); - auto belSun = belScene.createNode("sun","oomerSun","oomerSun"); - auto belColorDome = belScene.createNode("colorDome","oomerColorDome","oomerColorDome"); - auto belSettings = belScene.settings(); // Get scene settings - // Configure camera - belCam["resolution"] = dl::Vec2 {1920, 1080}; // Set resolution to 1080p - belCam["lens"] = belLens; // Connect camera to lens - belCam["sensor"] = belSensor; // Connect camera to sensor - belCamForm.parentTo(belWorld); // Parent camera transform to world - belCam.parentTo(belCamForm); // Parent camera to camera transform - - // Position the camera with a transformation matrix - belCamForm["steps"][0]["xform"] = dl::Mat4 {0.525768608156, -0.850627633385, 0, 0, -0.234464751651, -0.144921468924, -0.961261695938, 0, 0.817675761479, 0.505401223947, -0.275637355817, 0, -88.12259018466, -54.468125200218, 50.706001690932, 1}; - - // Configure environment (image-based lighting) - belImageDome["ext"] = ".jpg"; - belImageDome["dir"] = "./res"; - belImageDome["multiplier"] = 6.0f; - belImageDome["file"] = "DayEnvironmentHDRI019_1K-TONEMAPPED"; - belImageDome["overrides"]["background"] = belColorDome; - belColorDome["zenith"] = dl::Rgba{1.0f, 1.0f, 1.0f, 1.0f}; - belColorDome["horizon"] = dl::Rgba{.85f, 0.76f, 0.294f, 1.0f}; - belColorDome["altitude"] = 14.0f; - // Configure ground plane - //belGroundPlane["elevation"] = -.5f; - belGroundPlane["material"] = belGroundMat; - - /* Commented out: Sun configuration - belSun["size"] = 20.0f; - belSun["month"] = "july"; - belSun["rotation"] = 50.0f;*/ - - // Configure materials - belGroundMat["type"] = "metal"; - belGroundMat["roughness"] = 22.0f; - belGroundMat["color"] = dl::Rgba{0.138431623578, 0.5, 0.3, 1.0}; - - // Set up scene settings - belSettings["beautyPass"] = belBeautyPass; - belSettings["camera"] = belCam; - belSettings["environment"] = belColorDome; - belSettings["iprScale"] = 100.0f; - belSettings["threads"] = dl::bella_sdk::Input(0); // Auto-detect thread count - belSettings["groundPlane"] = belGroundPlane; - belSettings["iprNavigation"] = "maya"; // Use Maya-like navigation in viewer - //settings["sun"] = sun; - - auto belVoxel = belScene.createNode("box","oomerVoxel","oomerVoxel"); - auto belLiqVoxel = belScene.createNode("box","oomerLiqVoxel","oomerLiqVoxel"); - auto belVoxelForm = belScene.createNode("xform","oomerVoxelXform","oomerVoxelXform"); - auto belLiqVoxelForm = belScene.createNode("xform","oomerLiqVoxelXform","oomerLiqVoxelXform"); - auto belVoxelMat = belScene.createNode("orenNayar","oomerVoxelMat","oomerVoxelMat"); - auto belMeshVoxel = belScene.createNode("mesh", "oomerMeshVoxel"); - auto belBevel = belScene.createNode("bevel", "oomerBevel"); - belBevel["radius"] = 90.0f; - belBevel["samples"] =dl::UInt(6); - - //#include "resources/smoothcube.h" - addMeshCube(belMeshVoxel); - // Configure voxel box dimensions - belVoxel["radius"] = 0.33f; - belVoxel["sizeX"] = 0.99f; - belVoxel["sizeY"] = 0.99f; - belVoxel["sizeZ"] = 0.99f; - - // Less gap to make liquid look better, allows more light to pass through - belLiqVoxel["sizeX"] = 0.99945f; - belLiqVoxel["sizeY"] = 0.99945f; - belLiqVoxel["sizeZ"] = 0.99945f; - - belVoxel.parentTo(belVoxelForm); - belVoxelForm["steps"][0]["xform"] = dl::Mat4 {0.999,0,0,0,0,0.999,0,0,0,0,0.999,0,0,0,0,1}; - belVoxelMat["reflectance"] = dl::Rgba{0.0, 0.0, 0.0, 1.0}; - belVoxelForm["material"] = belVoxelMat; + dl::logInfo("Started pass %s", pass.buf()); } - return belWorld; - } + + // Called to update the current status of rendering + void onStatus(dl::String pass, dl::String status) override + { + dl::logInfo("%s [%s]", status.buf(), pass.buf()); + } + + // Called to update rendering progress (percentage, time remaining, etc) + void onProgress(dl::String pass, dl::bella_sdk::Progress progress) override + { + dl::logInfo("%s [%s]", progress.toString().buf(), pass.buf()); + } + + void onImage(dl::String pass, dl::bella_sdk::Image image) override + { + dl::logInfo("We got an image %d x %d.", (int)image.width(), (int)image.height()); + } + + // Called when an error occurs during rendering + void onError(dl::String pass, dl::String msg) override + { + dl::logError("%s [%s]", msg.buf(), pass.buf()); + } + + // Called when a rendering pass completes + void onStopped(dl::String pass) override + { + dl::logInfo("Stopped %s", pass.buf()); + } + + // Returns the current progress as a string + std::string getProgress() const { + std::string* currentProgress = progressPtr.load(); + if (currentProgress) { + return *currentProgress; + } else { + return ""; + } + } + + // Cleanup resources in destructor + ~MyEngineObserver() { + setString(nullptr); + } + private: + // Thread-safe pointer to current progress string + std::atomic progressPtr{nullptr}; + + // Helper function to safely update the progress string + void setString(std::string* newStatus) { + std::string* oldStatus = progressPtr.exchange(newStatus); + delete oldStatus; // Clean up old string if it exists + } + }; + } } diff --git a/oom_bella_long.h b/oom_bella_long.h index aa67241..399c224 100644 --- a/oom_bella_long.h +++ b/oom_bella_long.h @@ -3,9 +3,11 @@ namespace oom { namespace bella { + // Unit mesh cube created in Blender, with rounded edges // Used for emitter voxels because procedural Bella box does not currently support emission - void addMeshCube(dl::bella_sdk::Node& belMeshVoxel) { + dl::bella_sdk::Node addMeshCube(dl::bella_sdk::Scene& belScene, dl::String guiName) { + auto belMeshVoxel = belScene.createNode("mesh", guiName); belMeshVoxel["name"] = "oomerMeshVoxel"; belMeshVoxel["channels"][0] = "st"; belMeshVoxel["optimized"] = false; @@ -1971,6 +1973,7 @@ namespace oom { points.push_back(dl::Pos3f{0.353579, -0.353579, -0.495}); points.push_back(dl::Pos3f{-0.353579, -0.353579, -0.495}); belMeshVoxel["steps"][0]["points"] = points; + return belMeshVoxel; } } } \ No newline at end of file diff --git a/oom_bella_misc.h b/oom_bella_misc.h new file mode 100644 index 0000000..b7d4042 --- /dev/null +++ b/oom_bella_misc.h @@ -0,0 +1,41 @@ +#pragma once + +extern int s_oomBellaLogContext; // Declare the s_dlLogContext variable + +namespace oom { + namespace bella { + + // Define color codes + #define OOMRESET "\033[0m" + #define OOMRED "\033[31m" + #define OOMGREEN "\033[32m" + #define OOMYELLOW "\033[33m" + #define OOMBLUE "\033[34m" + + // In your log function: + static void log(void* /*ctx*/, dl::LogType type, const char* msg) + { + switch (type) + { + case dl::LogType_Info: + DL_PRINT(OOMGREEN "[INFO] %s" OOMRESET "\n", msg); + break; + case dl::LogType_Warning: + if (strcmp(msg, "Redefining arg with long form: 'input'") == 0) { + break; + } else if (strcmp(msg, "Core node implementations are not linked.") == 0) { + break; + } + DL_PRINT(OOMYELLOW "[WARN] %s" OOMRESET "\n", msg); + break; + case dl::LogType_Error: + DL_PRINT(OOMRED "[ERROR] %s" OOMRESET "\n", msg); + break; + case dl::LogType_Custom: + DL_PRINT(OOMBLUE "%s\n" OOMRESET, msg); + break; + } + } + + } +} \ No newline at end of file diff --git a/oom_bella_premade.h b/oom_bella_premade.h new file mode 100644 index 0000000..d400b25 --- /dev/null +++ b/oom_bella_premade.h @@ -0,0 +1,151 @@ +#pragma once + +// Bella SDK includes - external libraries for 3D rendering +#include "../bella_engine_sdk/src/bella_sdk/bella_engine.h" // For creating and manipulating 3D scenes in Bella +#include "../oom/oom_bella_long.h" // This file is very large + +extern int s_oomBellaLogContext; // Declare the s_dlLogContext variable + +// Define the oom namespace +namespace oom { + namespace bella { + // Function declaration + dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene); + dl::bella_sdk::Node defaultSceneVoxel(dl::bella_sdk::Scene& belScene); + + // @param belScene - the scene to create the essentials in + // @return - the world node + dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene) { + // Create the basic scene elements in Bella + // Each line creates a different type of node in the scene auto belBeautyPass = belScene.createNode("beautyPass","oomerBeautyPass","oomerBeautyPass"); + auto belWorld = belScene.world(); // Get scene world root + { + dl::bella_sdk::Scene::EventScope es(belScene); + // Configure camera + auto belCamForm = belScene.createNode("xform","oomCameraXform","oomCameraXform"); + auto belCam = belScene.createNode("camera","oomCamera","oomCamera"); + auto belSensor = belScene.createNode("sensor","oomSensor","oomSensor"); + auto belLens = belScene.createNode("thinLens","oomThinLens","oomThinLens"); + belCam["resolution"] = dl::Vec2 {800, 800}; // Set resolution to 1080p + belCam["lens"] = belLens; // Connect camera to lens + belCam["sensor"] = belSensor; // Connect camera to sensor + belCamForm.parentTo(belWorld); // Parent camera transform to world + belCam.parentTo(belCamForm); // Parent camera to camera transform + // Position the camera with a transformation matrix + belCamForm["steps"][0]["xform"] = dl::Mat4 {0.525768608156, -0.850627633385, 0, 0, -0.234464751651, -0.144921468924, -0.961261695938, 0, 0.817675761479, 0.505401223947, -0.275637355817, 0, -88.12259018466, -54.468125200218, 50.706001690932, 1}; + + // Configure environment (image-based lighting) + auto belImageDome = belScene.createNode("imageDome","oomImageDome","oomImageDome"); + auto belColorDome = belScene.createNode("colorDome","oomColorDome","oomColorDome"); + belImageDome["ext"] = ".jpg"; + belImageDome["dir"] = "./res"; + belImageDome["multiplier"] = 6.0f; + belImageDome["file"] = "DayEnvironmentHDRI019_1K-TONEMAPPED"; + belImageDome["overrides"]["background"] = belColorDome; + belColorDome["zenith"] = dl::Rgba{1.0f, 1.0f, 1.0f, 1.0f}; + belColorDome["horizon"] = dl::Rgba{.85f, 0.76f, 0.294f, 1.0f}; + belColorDome["altitude"] = 14.0f; + + // Configure a metallic ground plane + auto belGroundPlane = belScene.createNode("groundPlane","oomGroundPlane","oomGroundPlane"); + auto belGroundMat = belScene.createNode("quickMaterial","oomGroundMat","oomGroundMat"); + belGroundPlane["material"] = belGroundMat; + belGroundMat["type"] = "metal"; + belGroundMat["roughness"] = 22.0f; + belGroundMat["color"] = dl::Rgba{0.138431623578, 0.5, 0.3, 1.0}; + + // Set up scene settings + auto belSettings = belScene.settings(); // Get scene settings + auto belBeautyPass = belScene.createNode("beautyPass","oomBeautyPass","oomBeautyPass"); + belSettings["beautyPass"] = belBeautyPass; + belSettings["camera"] = belCam; + belSettings["environment"] = belColorDome; + belSettings["iprScale"] = 100.0f; + belSettings["threads"] = dl::bella_sdk::Input(0); // Auto-detect thread count + belSettings["groundPlane"] = belGroundPlane; + belSettings["iprNavigation"] = "maya"; // Use Maya-like navigation in viewer + } + return belWorld; + } + + // @param belScene - the scene to create the essentials in + // @return - the world node + dl::bella_sdk::Node defaultSceneVoxel(dl::bella_sdk::Scene& belScene) { + // Create basic scene elements in Bella for voxel rendering + auto belWorld = belScene.world(); // Get scene world root + { + dl::bella_sdk::Scene::EventScope es(belScene); + + // Configure camera + auto belCamForm = belScene.createNode("xform","oomCameraXform","oomCameraXform"); + auto belCam = belScene.createNode("camera","oomCamera","oomCamera"); + auto belSensor = belScene.createNode("sensor","oomSensor","oomSensor"); + auto belLens = belScene.createNode("thinLens","oomThinLens","oomThinLens"); + belCam["resolution"] = dl::Vec2 {1920, 1080}; // Set resolution to 1080p + belCam["lens"] = belLens; // Connect camera to lens + belCam["sensor"] = belSensor; // Connect camera to sensor + belCamForm.parentTo(belWorld); // Parent camera transform to world + belCam.parentTo(belCamForm); // Parent camera to camera transform + + // Position the camera with a transformation matrix + belCamForm["steps"][0]["xform"] = dl::Mat4 {0.525768608156, -0.850627633385, 0, 0, -0.234464751651, -0.144921468924, -0.961261695938, 0, 0.817675761479, 0.505401223947, -0.275637355817, 0, -88.12259018466, -54.468125200218, 50.706001690932, 1}; + + // Configure environment (image-based lighting) + auto belImageDome = belScene.createNode("imageDome","oomImageDome","oomImageDome"); + auto belColorDome = belScene.createNode("colorDome","oomColorDome","oomColorDome"); + belImageDome["ext"] = ".jpg"; + belImageDome["dir"] = "./res"; + belImageDome["multiplier"] = 6.0f; + belImageDome["file"] = "DayEnvironmentHDRI019_1K-TONEMAPPED"; + belImageDome["overrides"]["background"] = belColorDome; + belColorDome["zenith"] = dl::Rgba{1.0f, 1.0f, 1.0f, 1.0f}; + belColorDome["horizon"] = dl::Rgba{.85f, 0.76f, 0.294f, 1.0f}; + belColorDome["altitude"] = 14.0f; + + // Configure ground plane + auto belGroundPlane = belScene.createNode("groundPlane","oomGroundPlane","oomGroundPlane"); + auto belGroundMat = belScene.createNode("quickMaterial","oomGroundMat","oomGroundMat"); + belGroundPlane["material"] = belGroundMat; + belGroundMat["type"] = "metal"; + belGroundMat["roughness"] = 22.0f; + belGroundMat["color"] = dl::Rgba{0.138431623578, 0.5, 0.3, 1.0}; + + // Set up scene settings + auto belSettings = belScene.settings(); // Get scene settings + auto belBeautyPass = belScene.createNode("beautyPass","oomBeautyPass","oomBeautyPass"); + belSettings["beautyPass"] = belBeautyPass; + belSettings["camera"] = belCam; + belSettings["environment"] = belColorDome; + belSettings["iprScale"] = 100.0f; + belSettings["threads"] = dl::bella_sdk::Input(0); // Auto-detect thread count + belSettings["groundPlane"] = belGroundPlane; + belSettings["iprNavigation"]= "maya"; // Use Maya-like navigation in viewer + + // Create voxel nodes + auto belVoxel = belScene.createNode("box","oomVoxel","oomVoxel"); + auto belLiqVoxel = belScene.createNode("box","oomLiqVoxel","oomLiqVoxel"); + auto belVoxelForm = belScene.createNode("xform","oomVoxelXform","oomVoxelXform"); + auto belLiqVoxelForm = belScene.createNode("xform","oomLiqVoxelXform","oomLiqVoxelXform"); + auto belVoxelMat = belScene.createNode("orenNayar","oomVoxelMat","oomVoxelMat"); + auto belBevel = belScene.createNode("bevel", "oomBevel", "oomBevel"); + belBevel["radius"] = 90.0f; + belBevel["samples"] =dl::UInt(6); + auto belMeshVoxel = addMeshCube(belScene, "oomMeshVoxel"); + belVoxel["radius"] = 0.33f; + belVoxel["sizeX"] = 0.99f; + belVoxel["sizeY"] = 0.99f; + belVoxel["sizeZ"] = 0.99f; + // Less gap to make liquid look better, allows more light to pass through + belLiqVoxel["sizeX"] = 0.99945f; + belLiqVoxel["sizeY"] = 0.99945f; + belLiqVoxel["sizeZ"] = 0.99945f; + belVoxel.parentTo(belVoxelForm); + belVoxelForm["steps"][0]["xform"] = dl::Mat4 {0.999,0,0,0,0,0.999,0,0,0,0,0.999,0,0,0,0,1}; + belVoxelMat["reflectance"] = dl::Rgba{0.0, 0.0, 0.0, 1.0}; + belVoxelForm["material"] = belVoxelMat; + + } + return belWorld; + } + } +} diff --git a/oom_bella_scene.h b/oom_bella_scene.h index e5f499a..40224c2 100644 --- a/oom_bella_scene.h +++ b/oom_bella_scene.h @@ -3,95 +3,5 @@ namespace oom { namespace bella { - // Function declaration - dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene); - - // @param belScene - the scene to create the essentials in - // @return - the world node - dl::bella_sdk::Node defaultScene2025(dl::bella_sdk::Scene& belScene) { - // Create the basic scene elements in Bella - // Each line creates a different type of node in the scene auto belBeautyPass = belScene.createNode("beautyPass","oomerBeautyPass","oomerBeautyPass"); - auto belWorld = belScene.world(); // Get scene world root - { - dl::bella_sdk::Scene::EventScope es(belScene); - - auto belCamForm = belScene.createNode("xform","oomerCameraXform","oomerCameraXform"); - auto belCam = belScene.createNode("camera","oomerCamera","oomerCamera"); - auto belSensor = belScene.createNode("sensor","oomerSensor","oomerSensor"); - auto belLens = belScene.createNode("thinLens","oomerThinLens","oomerThinLens"); - auto belImageDome = belScene.createNode("imageDome","oomerImageDome","oomerImageDome"); - auto belGroundPlane= belScene.createNode("groundPlane","oomerGroundPlane","oomerGroundPlane"); - - auto belBeautyPass = belScene.createNode("beautyPass","oomerBeautyPass","oomerBeautyPass"); - auto belGroundMat = belScene.createNode("quickMaterial","oomerGroundMat","oomerGroundMat"); - auto belSun = belScene.createNode("sun","oomerSun","oomerSun"); - auto belColorDome = belScene.createNode("colorDome","oomerColorDome","oomerColorDome"); - - auto belSettings = belScene.settings(); // Get scene settings - - // Configure camera - belCam["resolution"] = dl::Vec2 {1920, 1080}; // Set resolution to 1080p - belCam["lens"] = belLens; // Connect camera to lens - belCam["sensor"] = belSensor; // Connect camera to sensor - belCamForm.parentTo(belWorld); // Parent camera transform to world - belCam.parentTo(belCamForm); // Parent camera to camera transform - belCamForm["steps"][0]["xform"] = dl::Mat4 {0.525768608156, -0.850627633385, 0, 0, -0.234464751651, -0.144921468924, -0.961261695938, 0, 0.817675761479, 0.505401223947, -0.275637355817, 0, -88.12259018466, -54.468125200218, 50.706001690932, 1}; - - // Configure environment (image-based lighting) - belImageDome["ext"] = ".jpg"; - belImageDome["dir"] = "./res"; - belImageDome["multiplier"] = 6.0f; - belImageDome["file"] = "DayEnvironmentHDRI019_1K-TONEMAPPED"; - belImageDome["overrides"]["background"] = belColorDome; - belColorDome["zenith"] = dl::Rgba{1.0f, 1.0f, 1.0f, 1.0f}; - belColorDome["horizon"] = dl::Rgba{.85f, 0.76f, 0.294f, 1.0f}; - belColorDome["altitude"] = 14.0f; - - // Configure ground plane - belGroundPlane["material"] = belGroundMat; - - // Configure materials - belGroundMat["type"] = "metal"; - belGroundMat["roughness"] = 22.0f; - belGroundMat["color"] = dl::Rgba{0.138431623578, 0.5, 0.3, 1.0}; - - // Set up scene settings - belSettings["beautyPass"] = belBeautyPass; - belSettings["camera"] = belCam; - belSettings["environment"] = belColorDome; - belSettings["iprScale"] = 100.0f; - belSettings["threads"] = dl::bella_sdk::Input(0); // Auto-detect thread count - belSettings["groundPlane"] = belGroundPlane; - belSettings["iprNavigation"]= "maya"; // Use Maya-like navigation in viewer - - auto belVoxel = belScene.createNode("box","oomerVoxel","oomerVoxel"); - auto belLiqVoxel = belScene.createNode("box","oomerLiqVoxel","oomerLiqVoxel"); - auto belVoxelForm = belScene.createNode("xform","oomerVoxelXform","oomerVoxelXform"); - auto belLiqVoxelForm = belScene.createNode("xform","oomerLiqVoxelXform","oomerLiqVoxelXform"); - auto belVoxelMat = belScene.createNode("orenNayar","oomerVoxelMat","oomerVoxelMat"); - auto belMeshVoxel = belScene.createNode("mesh", "oomerMeshVoxel"); - auto belBevel = belScene.createNode("bevel", "oomerBevel"); - belBevel["radius"] = 90.0f; - belBevel["samples"] =dl::UInt(6); - - oom::bella::addMeshCube(belMeshVoxel); // bring in a blender mesh cube for emitters - // Configure voxel box dimensions - belVoxel["radius"] = 0.33f; - belVoxel["sizeX"] = 0.99f; - belVoxel["sizeY"] = 0.99f; - belVoxel["sizeZ"] = 0.99f; - - // Less gap to make liquid look better, allows more light to pass through - belLiqVoxel["sizeX"] = 0.99945f; - belLiqVoxel["sizeY"] = 0.99945f; - belLiqVoxel["sizeZ"] = 0.99945f; - - belVoxel.parentTo(belVoxelForm); - belVoxelForm["steps"][0]["xform"] = dl::Mat4 {0.999,0,0,0,0,0.999,0,0,0,0,0.999,0,0,0,0,1}; - belVoxelMat["reflectance"] = dl::Rgba{0.0, 0.0, 0.0, 1.0}; - belVoxelForm["material"] = belVoxelMat; - } - return belWorld; - } } } diff --git a/oom_misc.h b/oom_misc.h index 0001355..c994c24 100644 --- a/oom_misc.h +++ b/oom_misc.h @@ -10,6 +10,7 @@ namespace oom { //Forward declarations extern const unsigned char DayEnvironmentHDRI019_1K_TONEMAPPED_jpg[]; extern const unsigned int DayEnvironmentHDRI019_1K_TONEMAPPED_jpg_len; + // Convert sRGB color value to linear color space inline float srgbToLinear(float value) { return (value <= 0.04045f) ? diff --git a/oom_queue.h b/oom_queue.h new file mode 100644 index 0000000..c2b8bf6 --- /dev/null +++ b/oom_queue.h @@ -0,0 +1,23 @@ +#pragma once + +#include // For std::string +#include // For std::filesystem +// This is a set of common oomer utilities for file queue operations + +#include "../efsw/src/efsw/FileSystem.hpp" // For file watching +#include "../efsw/src/efsw/System.hpp" // For file watching +#include "../efsw/include/efsw/efsw.hpp" // For file watching + +#include "../bella_engine_sdk/src/dl_core/dl_string.h" +#include "../bella_engine_sdk/src/dl_core/dl_fs.h" + +namespace oom { + namespace filesystem { + /// A class that manages a queue of files to render with both FIFO order and fast lookups + } +} + + + + + diff --git a/oom_voxel_vmax.h b/oom_voxel_vmax.h index c5b5378..045e7b6 100644 --- a/oom_voxel_vmax.h +++ b/oom_voxel_vmax.h @@ -22,7 +22,7 @@ using json = nlohmann::json; // Define STB_IMAGE_IMPLEMENTATION before including to create the implementation #define STB_IMAGE_IMPLEMENTATION -#include "thirdparty/stb_image.h" // STB Image library +#include "thirdparty/stb_image.h" // STB Image library used to read 256x1 vmax palette stored in .png namespace oom { namespace vmax { @@ -36,16 +36,23 @@ namespace oom { inline uint32_t compactBits(uint32_t n); inline void decodeMorton3DOptimized(uint32_t morton, uint32_t& x, uint32_t& y, uint32_t& z); struct Material; - struct VoxelGrid; + //struct VoxelGrid; struct Model; - inline std::array getMaterials(plist_t pnodPalettePlist); - inline std::vector decodeVoxels(const std::vector& dsData, int mortonOffset, uint16_t chunkID); struct ChunkInfo; + inline std::vector decodeVoxels(const std::vector& dsData, int mortonOffset, uint16_t chunkID); + + // Useful plist functions + + // Read plist file + inline plist_t readPlist(const std::string& inStrPlist, std::string outStrPlist, bool decompress); + inline plist_t readPlist(const std::string& inStrPlist, bool decompress); + + inline std::array getMaterials(plist_t pnodPalettePlist); plist_t getNestedPlistNode(plist_t plist_root, const std::vector& path); ChunkInfo chunkInfo(const plist_t& plist_snapshot_dict_item); std::vector vmaxVoxelInfo(plist_t& plist_datastream, uint64_t chunkID, uint64_t minMorton); - inline plist_t readPlist(const std::string& inStrPlist, std::string outStrPlist, bool decompress); - inline plist_t readPlist(const std::string& inStrPlist, bool decompress); + + // Use these to parse scene.json struct JsonModelInfo; struct JsonGroupInfo; class JsonSceneParser; @@ -255,17 +262,16 @@ namespace oom { bool volumetric; // future use }; - struct VoxelGrid { + /*struct VoxelGrid { // dimensions of the voxel grid uint32_t size_x, size_y, size_z; // voxel data uint8_t* voxel_data; - }; + };*/ // Create a structure to represent a model with its voxels with helper functions // since the xyz coords are at the voxel level, we need an accessor to walk it sequentially - // maybe I create a new structure called VoxelGrid struct Model { // Model identifier or name std::string vmaxbFileName; // file name is used like a key @@ -474,7 +480,7 @@ namespace oom { } else { std::cout << "No materials array found or invalid type" << std::endl; } - #ifdef _DEBUG23 + #ifdef _DEBUG for (const auto& material : vmaxMaterials) { std::cout << "Material: " << material.materialName << std::endl; std::cout << " Transmission: " << material.transmission << std::endl; @@ -594,7 +600,6 @@ namespace oom { return ChunkInfo{-1, 0, 0, 0, 0, 0}; } - // Right after we get ChunkInfo, we can get the voxels because we need morton chunk offset // @param pnodSnaphot: plist_t of a snapshot // @return vector of Voxel @@ -821,7 +826,7 @@ namespace oom { } // Parse the JSON - json sceneData; + json sceneData; // uses nlohmann/json file >> sceneData; file.close();