From 5008af768196e0c7be4e41b543db9d75b020b9f8 Mon Sep 17 00:00:00 2001 From: benkyd Date: Thu, 12 Jan 2023 16:06:30 +0000 Subject: [PATCH] what's that? a segfault??? --- libhart/tracing/hit.hpp | 3 +++ libhart/tracing/ray.hpp | 1 + src/hart_module.cpp | 3 +++ src/hart_module.hpp | 3 +++ src/renderer/dispatcher.cpp | 1 + src/renderer/ray_source.cpp | 12 +++++++++--- src/renderer/ray_source.hpp | 9 ++++++++- src/renderer/renderer.cpp | 28 +++++++++++++++++++++++----- src/renderer/renderer.hpp | 8 ++++++++ 9 files changed, 59 insertions(+), 9 deletions(-) diff --git a/libhart/tracing/hit.hpp b/libhart/tracing/hit.hpp index 6a607af..b990987 100644 --- a/libhart/tracing/hit.hpp +++ b/libhart/tracing/hit.hpp @@ -4,8 +4,11 @@ namespace inferno { +class Ray; + struct HitInfo { + Ray* Caller; // indicie of hit ^ mesh idx of hit int Identifier; glm::vec2 UV; diff --git a/libhart/tracing/ray.hpp b/libhart/tracing/ray.hpp index 90d55f4..c186b94 100644 --- a/libhart/tracing/ray.hpp +++ b/libhart/tracing/ray.hpp @@ -8,6 +8,7 @@ struct Ray { glm::vec3 Origin; glm::vec3 Direction; + uint32_t Reference; }; } diff --git a/src/hart_module.cpp b/src/hart_module.cpp index 6ae0d1c..954b3e4 100644 --- a/src/hart_module.cpp +++ b/src/hart_module.cpp @@ -1,6 +1,8 @@ #include "hart_module.hpp" #include +#include + #include #include @@ -64,6 +66,7 @@ void HHM::rayReturn(HitInfo* hit) { HARTModule* mod = mDirectory.getActiveModule(); spdlog::debug("HIT!!"); + Renderer->computeHit(hit); } void HHM::bounce(Ray* newRay) diff --git a/src/hart_module.hpp b/src/hart_module.hpp index 586282c..cf5b8f8 100644 --- a/src/hart_module.hpp +++ b/src/hart_module.hpp @@ -14,6 +14,7 @@ class Scene; class Ray; class HitInfo; class HARTModule; +class RayRenderer; class HHM { @@ -32,6 +33,8 @@ public: void startTrace(RayField sourceScatter); + RayRenderer* Renderer; + private: HARTModuleDirectory mDirectory; }; diff --git a/src/renderer/dispatcher.cpp b/src/renderer/dispatcher.cpp index 3071a55..7455dd5 100644 --- a/src/renderer/dispatcher.cpp +++ b/src/renderer/dispatcher.cpp @@ -15,6 +15,7 @@ RenderDispatcher::RenderDispatcher() { mHHM = new HHM(); mRenderer = new RayRenderer(mHHM); + mHHM->Renderer = mRenderer; } RenderDispatcher::~RenderDispatcher() diff --git a/src/renderer/ray_source.cpp b/src/renderer/ray_source.cpp index 587bfa1..fb9c41d 100644 --- a/src/renderer/ray_source.cpp +++ b/src/renderer/ray_source.cpp @@ -27,7 +27,7 @@ void RaySource::generate() // float scale = tan(mReferenceCamera->FOV / 2.0f * helpers::PI / 180.0f); } -RayField RaySource::getInitialRays(bool MSAA) +ReferencedRayField RaySource::getInitialRays(bool MSAA) { if (mReferenceCamera->didUpdate()) { @@ -43,6 +43,9 @@ RayField RaySource::getInitialRays(bool MSAA) glm::mat4 cameraToWorld = mReferenceCamera->getCameraLook(); glm::vec3 origin = mReferenceCamera->Position; + std::unordered_map reference; + + int i = 0; for (int x = 0; x < mReferenceCamera->getRayViewport().x; x++) for (int y = 0; y < mReferenceCamera->getRayViewport().y; y++) { @@ -52,9 +55,12 @@ RayField RaySource::getInitialRays(bool MSAA) Ray* ray = new Ray; ray->Origin = origin; ray->Direction = glm::normalize((glm::vec4(Px, Py, -1.0f, 1.0f) * cameraToWorld)); - + ray->Reference = i; + reference[i] = {x, y}; + field.push_back(ray); + i++; } - return field; + return { field, reference }; } diff --git a/src/renderer/ray_source.hpp b/src/renderer/ray_source.hpp index 4c2ee55..0b3ae52 100644 --- a/src/renderer/ray_source.hpp +++ b/src/renderer/ray_source.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include @@ -10,6 +11,12 @@ namespace inferno { class Camera; +struct ReferencedRayField +{ + RayField Field; + std::unordered_map Reference; +}; + class RaySource { public: @@ -17,7 +24,7 @@ public: ~RaySource(); void generate(); - RayField getInitialRays(bool MSAA); + ReferencedRayField getInitialRays(bool MSAA); private: Camera* mReferenceCamera; diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 9b7c9b3..e3645a5 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -1,7 +1,11 @@ #include "renderer.hpp" +#include + #include #include +#include +#include #include "hart_module.hpp" #include "ray_source.hpp" @@ -86,21 +90,27 @@ void RayRenderer::draw() { mCurrentScene->newFrame(); - RayField startRays = mRaySource->getInitialRays(true); - mIface->startTrace(startRays); + ReferencedRayField startRays = mRaySource->getInitialRays(true); + + for (int x = 0; x < mRenderTargetSize.x; x++) + for (int y = 0; y < mRenderTargetSize.y; y++) + { + mTarget[y * mRenderTargetSize.x + x] = { 1.0f, 0.0f, 0.0f, 1.0f }; + } + + mCurrentRefTable = &startRays.Reference; + mIface->startTrace(startRays.Field); // hault wait for the module to finish bool frameStatus = false; while (!frameStatus) { - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); switch(mIface->getModuleState()) { case EModuleState::Bad: spdlog::error("MODULE STATE BAD"); case EModuleState::Build: case EModuleState::Trace: - spdlog::debug("MODULE BUSY.."); break; case EModuleState::Ready: frameStatus = true; @@ -110,8 +120,16 @@ void RayRenderer::draw() spdlog::info("Sample complete"); - for (auto* ray : startRays) + for (auto* ray : startRays.Field) { delete ray; } } + +void RayRenderer::computeHit(HitInfo* info) +{ + glm::ivec2 pos = (*mCurrentRefTable)[info->Caller->Reference]; + std::lock_guard lock(this->_mTarget); + float d = info->Distance; + mTarget[pos.y * mRenderTargetSize.x + pos.x] = { d, d, d, 1.0f }; +} diff --git a/src/renderer/renderer.hpp b/src/renderer/renderer.hpp index a809a89..4f35017 100644 --- a/src/renderer/renderer.hpp +++ b/src/renderer/renderer.hpp @@ -3,12 +3,14 @@ #include #include +#include namespace inferno { class HHM; class Scene; +class HitInfo; class RaySource; class RenderDispatcher; @@ -28,6 +30,12 @@ public: void prepare(); void draw(); +public: + void computeHit(HitInfo* info); + +private: + std::unordered_map* mCurrentRefTable; + private: GLuint mRenderTargetTexture = 0; glm::fvec4* mTarget;