diff --git a/.vscode/settings.json b/.vscode/settings.json index 7e83515..74e2d32 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -69,7 +69,8 @@ "typeinfo": "cpp", "valarray": "cpp", "variant": "cpp", - "complex": "cpp" + "complex": "cpp", + "hash_map": "cpp" }, "cmake.configureOnOpen": false } \ No newline at end of file diff --git a/hart/inferno-hart-cpu/src/main.cpp b/hart/inferno-hart-cpu/src/main.cpp index c91b51a..a495b85 100644 --- a/hart/inferno-hart-cpu/src/main.cpp +++ b/hart/inferno-hart-cpu/src/main.cpp @@ -18,6 +18,17 @@ public: std::cout << "Goodbye Module HART CPU" << std::endl; } + void submitTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) override {} + void updateTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) override {} + + void submitQueue(std::queue queue) override {} + void pushtoQueue(Ray* ray) override {} }; HART_INTERFACE void* _GET() diff --git a/hart/inferno-hart-opencl/src/main.cpp b/hart/inferno-hart-opencl/src/main.cpp index 080d53f..eeb6c83 100644 --- a/hart/inferno-hart-opencl/src/main.cpp +++ b/hart/inferno-hart-opencl/src/main.cpp @@ -17,7 +17,18 @@ public: { std::cout << "Goodbye Module HART GPU" << std::endl; } + + void submitTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) override {} + void updateTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) override {} + void submitQueue(std::queue queue) override {} + void pushtoQueue(Ray* ray) override {} }; HART_INTERFACE void* _GET() diff --git a/libhart/hardware_accelerator.hpp b/libhart/hardware_accelerator.hpp deleted file mode 100644 index 52a52af..0000000 --- a/libhart/hardware_accelerator.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -namespace inferno { - -} diff --git a/libhart/inferno_hart.hpp b/libhart/inferno_hart.hpp index fbb66fd..399606f 100644 --- a/libhart/inferno_hart.hpp +++ b/libhart/inferno_hart.hpp @@ -1,8 +1,9 @@ #pragma once #include +#include -#include "hardware_accelerator.hpp" +#include "hart_graphics.hpp" namespace inferno { @@ -16,10 +17,6 @@ namespace inferno { #define HART_INTERFACE extern "C" #endif -HART_INTERFACE typedef void* (*HART_INIT_F)(void); -HART_INTERFACE typedef void (*HART_DESTROY_F)(void*); -HART_INTERFACE typedef void* (*HART_CREDIT_F)(void); - struct ModuleCredit { const std::string ModuleName; @@ -30,11 +27,42 @@ struct ModuleCredit const int VersionBuild; }; +class Ray; +class HitInfo; +class Material; + +HART_INTERFACE typedef void* (*HART_INIT_F)(void); +HART_INTERFACE typedef void (*HART_DESTROY_F)(void*); +HART_INTERFACE typedef void* (*HART_CREDIT_F)(void); + +typedef void (*HART_HIT_CALLBACK)(HitInfo* hit); + class HARTModule { public: // Constructor & destructor is done in the module - // virtual void takeScene() = 0; + virtual void submitTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) = 0; + virtual void updateTris(std::vector* vert, + std::vector* norm, + std::vector* mats, + std::vector* indicies) = 0; + + virtual void submitQueue(std::queue queue) = 0; + virtual void pushtoQueue(Ray* ray) = 0; + + inline void passHitCallback(HART_HIT_CALLBACK callback) + { + Hit = callback; + } + +private: + HART_HIT_CALLBACK Hit = nullptr; + +private: + std::queue mToTrace; }; } diff --git a/src/hart/hart_module.hpp b/src/hart/hart_module.hpp deleted file mode 100644 index 23c5386..0000000 --- a/src/hart/hart_module.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#ifdef _WIN32 -// TODO: DLLs -#else -#include -#endif -#include - diff --git a/src/hart_directory.cpp b/src/hart_directory.cpp index e9b6425..1daacab 100644 --- a/src/hart_directory.cpp +++ b/src/hart_directory.cpp @@ -68,10 +68,10 @@ HARTModuleDirectory::discoveryEntry HARTModuleDirectory::registerModule(std::fil entry.InitCallback = (HART_INIT_F)GetProcAddress(entry.Handle, "_GET"); entry.DestroyCallback = (HART_DESTROY_F)GetProcAddress(entry.Handle, "_DESTROY"); #else // UNIX-Like - entry.Handle = dlopen(file.c_str(), RTLD_LAZY | RTLD_LOCAL); + entry.Handle = dlopen(file.c_str(), RTLD_NOW | RTLD_LOCAL); if (entry.Handle == NULL) { - spdlog::error("Cannot load module at {}.", file.c_str()); + spdlog::error("Cannot load module at ", dlerror()); entry.Handle = NULL; entry.DidLink = false; return entry; } @@ -101,11 +101,11 @@ HARTModuleDirectory::discoveryEntry HARTModuleDirectory::registerModule(std::fil entry.Credit = (ModuleCredit*)credit(); - spdlog::info("Module {} v{}.{}.{} by {}", entry.Credit->ModuleName, - entry.Credit->VersionMajor, - entry.Credit->VersionMinor, - entry.Credit->VersionBuild, - entry.Credit->AuthorName); + spdlog::info("Module {0} v{2}.{3}.{4} by {5}", entry.Credit->ModuleName, + entry.Credit->VersionMajor, + entry.Credit->VersionMinor, + entry.Credit->VersionBuild, + entry.Credit->AuthorName); entry.DidLink = true; mEntries[entry.Credit->ModuleName] = { entry, nullptr }; @@ -144,6 +144,11 @@ void HARTModuleDirectory::setActiveIndex(int index) this->setActive(keys[index]); } +HARTModule* HARTModuleDirectory::getActiveModule() +{ + return mEntries[mActiveModule].Module; +} + std::string HARTModuleDirectory::getActive() { return mActiveModule; diff --git a/src/hart_directory.hpp b/src/hart_directory.hpp index 31f3f1e..44420e8 100644 --- a/src/hart_directory.hpp +++ b/src/hart_directory.hpp @@ -40,7 +40,8 @@ public: bool Active; }; - std::vector discoverModules(std::filesystem::path folder, bool recurse = false); + // This can take a file or a directory, and inside the directory discover recursively or not + std::vector discoverModules(std::filesystem::path path, bool recurse = false); discoveryEntry registerModule(std::filesystem::path file); std::vector getModules(); @@ -48,6 +49,7 @@ public: void setActive(std::string moduleName); void setActiveIndex(int index); + HARTModule* getActiveModule(); std::string getActive(); int getActiveIndex(); ModuleCredit* getActiveCredit(); diff --git a/src/hart/hart_module.cpp b/src/hart_module.cpp similarity index 100% rename from src/hart/hart_module.cpp rename to src/hart_module.cpp diff --git a/src/hart_module.hpp b/src/hart_module.hpp new file mode 100644 index 0000000..3e6224d --- /dev/null +++ b/src/hart_module.hpp @@ -0,0 +1,38 @@ +#pragma once + +// the HHM (Hamlin Hamlin McGill) aka the Head HART Module keeps track of the module +// and gives the renderer a cleaner interface to talk to a HART Module + +namespace inferno { + +class Scene; +class Ray; +class RaySouce; +class HitInfo; + +class HARTModule; + +class HHM +{ +public: + HHM(); + ~HHM(); + + // needs to syncronusly stop the module's execution and + // prepare for setting up a new HART layer + void notifyModuleChange(HARTModule* newModule); + + void newScene(Scene* scene); + void notifySceneUpdate(); + + void startTrace(RaySouce* sourceScatter); + + void rayReturn(HitInfo* hit); + void bounce(Ray* newRay); + +private: + HARTModule* activeModule; + +}; + +} diff --git a/src/inferno.cpp b/src/inferno.cpp index 294e5d7..84d40d4 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -128,6 +128,7 @@ int Inferno::run() Material basicMaterial("basic"); Shader basicShader; + basicShader.load("res/shaders/basic.glsl")->link(); basicMaterial.setGlShader(&basicShader); Mesh cornell; @@ -145,12 +146,6 @@ int Inferno::run() Camera camera; mScene->setCamera(&camera); - Mesh dragon; - dragon.loadOBJ("res/dragon-cornell-size.obj"); - dragon.ready(); - dragon.setMaterial(&basicMaterial); - mScene->addMesh(&dragon); - mRasterRenderer->setScene(mScene); mRayRenderer->setScene(mScene);