From 4012464bc59cf27f1dbed53f8003a4535861387b Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Sun, 6 Aug 2023 23:38:39 +0100 Subject: [PATCH] ray renderer --- src/renderer/renderer.cpp | 72 +++++++++++++++++++++++---------------- src/renderer/renderer.hpp | 68 ++++++++++++++++-------------------- src/scene/scene.cpp | 8 ++--- src/scene/scene.hpp | 10 +++--- 4 files changed, 81 insertions(+), 77 deletions(-) diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 0cd3230..8356f89 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -15,15 +15,16 @@ #include -using namespace inferno; +namespace inferno::graphics { -RayRenderer::RayRenderer(HHM* accelIface) - : mIface(accelIface) +std::unique_ptr rayr_create(glm::ivec2 viewport, HHM* accelIface) { - mTarget = new glm::fvec4[mRenderTargetSize.x * mRenderTargetSize.y]; + std::unique_ptr renderer = std::make_unique(); + renderer->RenderTargetSize = viewport; + renderer->RenderData = new glm::fvec4[renderer->RenderTargetSize.x * renderer->RenderTargetSize.y]; - glGenTextures(1, &mRenderTargetTexture); - glBindTexture(GL_TEXTURE_2D, mRenderTargetTexture); + glGenTextures(1, &renderer->RenderTargetTexture); + glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetTexture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -31,66 +32,72 @@ RayRenderer::RayRenderer(HHM* accelIface) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, mRenderTargetSize.x, mRenderTargetSize.y, 0, GL_RGBA, GL_FLOAT, mTarget); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderer->RenderTargetSize.x, renderer->RenderTargetSize.y, 0, GL_RGBA, GL_FLOAT, renderer->RenderData); glBindTexture(GL_TEXTURE_2D, 0); + + return renderer; } -RayRenderer::~RayRenderer() +void rayr_cleanup(std::unique_ptr& renderer) { - delete[] mTarget; + delete[] renderer->RenderData; } -void RayRenderer::setScene(Scene* scene) +void rayr_set_scene(std::unique_ptr& renderer, std::shared_ptr scene) { - mCurrentScene = scene; - if (mRaySource != nullptr) + renderer->CurrentScene = scene; + if (renderer->RaySource != nullptr) { - delete mRaySource; + delete renderer->RaySource; } - mRaySource = new RaySource(scene->getCamera()); + // renderer->RaySource = new RaySource(scene->getCamera()); // the scene will be sent to the module on prepare // as it did update during initialisation // mIface->newScene(scene); } -void RayRenderer::setTargetSize(glm::ivec2 size) +void rayr_set_viewport(std::unique_ptr &renderer, glm::ivec2 size) { - mRenderTargetSize = size; + renderer->RenderTargetSize = size; } -glm::ivec2 RayRenderer::getTargetSize() +glm::ivec2 rayr_get_viewport(std::unique_ptr &renderer) { - return mRenderTargetSize; + return renderer->RenderTargetSize; } -GLuint RayRenderer::getRenderedTexture() +GLuint rayr_get_rendered_texture(std::unique_ptr &renderer) { - std::lock_guard lock(this->_RenderData); + std::lock_guard lock(renderer->RenderDataMutex); glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindTexture(GL_TEXTURE_2D, mRenderTargetTexture); - return mRenderTargetTexture; + glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetTexture); + return renderer->RenderTargetTexture; } -glm::fvec4* RayRenderer::getRenderData() +glm::fvec4* rayr_get_render_data(std::unique_ptr &renderer) { - return mTarget; + std::lock_guard lock(renderer->RenderDataMutex); + return renderer->RenderData; } -void RayRenderer::prepare() +void rayr_prepare(std::unique_ptr &renderer) { - assert(mCurrentScene != nullptr); - if (mCurrentScene->didUpdate()) + assert(renderer->CurrentScene != nullptr); + // here, scene_did_update takes a unique_ptr, but we have a shared_ptr + // so we need to call unique() to get the unique_ptr but that will error + // with non-const ltype so we need to const_cast it + if (scene::scene_did_update(renderer->CurrentScene.unique())) { yolo::debug("New Scene!"); - mIface->newScene(mCurrentScene); + // renderer->AccelerationInterface->newScene(renderer->CurrentScene); } } -void RayRenderer::draw() +void rayr_draw(std::unique_ptr &renderer) { - mCurrentScene->newFrame(); + scene::scene_frame_tick(renderer->CurrentScene.unique()); // TODO: Rays should definately be bump allocated if possible, this is KBs of // ray data and nothing else being reallocated every frame for no reason ReferencedRayField startRays = mRaySource->getInitialRays(true); @@ -129,4 +136,9 @@ void RayRenderer::computeHit(HitInfo* info) if (d > maxd) maxd = d; float n = (d - mind) / (maxd - mind); mTarget[pos.y * mRenderTargetSize.x + pos.x] = { n, n, n, 1.0f}; +} + void mHaultWait(); + std::unordered_map* mCurrentRefTable; + + } diff --git a/src/renderer/renderer.hpp b/src/renderer/renderer.hpp index ca3ad45..5d30657 100644 --- a/src/renderer/renderer.hpp +++ b/src/renderer/renderer.hpp @@ -2,58 +2,50 @@ #include +#include #include #include -#include -namespace inferno { +namespace inferno::scene { +struct Scene; +} + +namespace inferno::graphics { class HHM; -class Scene; class HitInfo; class RaySource; class RenderDispatcher; -class RayRenderer -{ -public: - RayRenderer(HHM* accelIface); - ~RayRenderer(); +typedef struct RayRenderer { + glm::fvec4* RenderData = nullptr; + GLuint RenderTargetTexture = 0; - void setScene(Scene* scene); + // TODO: Put this inside an internal struct + std::mutex RenderDataMutex; + std::condition_variable RenderPause; + // TODO: End - void setTargetSize(glm::ivec2 size); - glm::ivec2 getTargetSize(); - GLuint getRenderedTexture(); - glm::fvec4* getRenderData(); + std::shared_ptr CurrentScene; + // std::shared_ptr RenderTargetSize; + glm::ivec2 RenderTargetSize; - void prepare(); - void draw(); + HHM* AccelerationInterface = nullptr; + RenderDispatcher* Dispatcher = nullptr; + RaySource* RaySource = nullptr; +} RayRenderer; -public: - void computeHit(HitInfo* info); +std::unique_ptr rayr_create(glm::ivec2 viewport, HHM* accelIface); +void rayr_cleanup(std::unique_ptr& renderer); +void rayr_set_scene(std::unique_ptr& renderer, std::shared_ptr scene); +void rayr_set_viewport(std::unique_ptr& renderer, glm::ivec2 size); +glm::ivec2 rayr_get_viewport(std::unique_ptr& renderer); +GLuint rayr_get_rendered_texture(std::unique_ptr& renderer); +glm::fvec4* rayr_get_render_data(std::unique_ptr& renderer); +void rayr_prepare(std::unique_ptr& renderer); +void rayr_draw(std::unique_ptr& renderer); -private: - void mHaultWait(); - - std::unordered_map* mCurrentRefTable; - -private: - GLuint mRenderTargetTexture = 0; - glm::fvec4* mTarget; - - std::mutex _RenderData; - std::condition_variable _RenderPause; - - glm::ivec2 mRenderTargetSize = {200, 200}; - - Scene* mCurrentScene = nullptr; - RaySource* mRaySource = nullptr; - - friend class RenderDispatcher; -private: - HHM* mIface; -}; +void raryr_compute_hit(HitInfo* info); } diff --git a/src/scene/scene.cpp b/src/scene/scene.cpp index b3ec889..5c25f86 100644 --- a/src/scene/scene.cpp +++ b/src/scene/scene.cpp @@ -29,22 +29,22 @@ void scene_add_object(std::unique_ptr& scene, std::unique_ptrDidUpdate = true; } -std::vector>& get_renderables(std::unique_ptr& scene) +std::vector>& scene_get_renderables(std::unique_ptr& scene) { return scene->Objects; } -bool did_update(std::unique_ptr& scene) +bool scene_did_update(std::unique_ptr& scene) { return scene->DidUpdate; } -void frame_tick(std::unique_ptr& scene) +void scene_frame_tick(std::unique_ptr& scene) { scene->DidUpdate = false; } -void tick(std::unique_ptr& scene) +void scene_tick(std::unique_ptr& scene) { for (auto& object : scene->Objects) { // object->tick(); diff --git a/src/scene/scene.hpp b/src/scene/scene.hpp index a9d5757..3849999 100644 --- a/src/scene/scene.hpp +++ b/src/scene/scene.hpp @@ -22,10 +22,10 @@ std::unique_ptr scene_create(); void scene_cleanup(std::unique_ptr& scene); void scene_set_camera(std::unique_ptr& scene, std::shared_ptr camera); void scene_add_object(std::unique_ptr& scene, std::unique_ptr object); -std::unique_ptr& get_camera(std::unique_ptr& scene); -std::vector>& get_renderables(std::unique_ptr& scene); -bool did_update(std::unique_ptr& scene); -void frame_tick(std::unique_ptr& scene); -void tick(std::unique_ptr& scene); +std::unique_ptr& scene_get_camera(std::unique_ptr& scene); +std::vector>& scene_get_renderables(std::unique_ptr& scene); +bool scene_did_update(std::unique_ptr& scene); +void scene_frame_tick(std::unique_ptr& scene); +void scene_tick(std::unique_ptr& scene); }