From 021e552f74d3c08c5cbe9568b8f29b2e259ff303 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Thu, 21 Dec 2023 19:43:03 +0000 Subject: [PATCH] Raytraced Renderer compiles now --- CMakeLists.txt | 3 +- src/graphics.hpp | 2 + src/inferno.cpp | 47 +++-- src/inferno.hpp | 5 +- src/{preview_renderer => preview}/debug.cpp | 5 +- src/{preview_renderer => preview}/debug.hpp | 0 .../renderer.cpp | 6 +- .../renderer.hpp | 0 .../global_illumination.cpp | 0 .../global_illumination.hpp | 0 src/{renderer => raytracing}/hit.hpp | 0 src/{renderer => raytracing}/kdtree.cpp | 0 src/{renderer => raytracing}/kdtree.hpp | 0 src/{renderer => raytracing}/light.cpp | 0 src/{renderer => raytracing}/light.hpp | 0 .../object_tracer.cpp | 11 +- .../object_tracer.hpp | 7 +- src/{renderer => raytracing}/ray.hpp | 0 src/{renderer => raytracing}/ray_source.cpp | 3 +- src/{renderer => raytracing}/ray_source.hpp | 2 +- src/raytracing/renderer.cpp | 151 +++++++++++++++ src/{renderer => raytracing}/renderer.hpp | 17 +- src/{renderer => raytracing}/triangle.hpp | 0 src/renderer/renderer.cpp | 172 ------------------ src/scene/mesh.cpp | 9 +- src/scene/mesh.hpp | 1 + src/scene/object.cpp | 9 +- src/scene/object.hpp | 1 + 28 files changed, 241 insertions(+), 210 deletions(-) rename src/{preview_renderer => preview}/debug.cpp (97%) rename src/{preview_renderer => preview}/debug.hpp (100%) rename src/{preview_renderer => preview}/renderer.cpp (96%) rename src/{preview_renderer => preview}/renderer.hpp (100%) rename src/{renderer => raytracing}/global_illumination.cpp (100%) rename src/{renderer => raytracing}/global_illumination.hpp (100%) rename src/{renderer => raytracing}/hit.hpp (100%) rename src/{renderer => raytracing}/kdtree.cpp (100%) rename src/{renderer => raytracing}/kdtree.hpp (100%) rename src/{renderer => raytracing}/light.cpp (100%) rename src/{renderer => raytracing}/light.hpp (100%) rename src/{renderer => raytracing}/object_tracer.cpp (92%) rename src/{renderer => raytracing}/object_tracer.hpp (69%) rename src/{renderer => raytracing}/ray.hpp (100%) rename src/{renderer => raytracing}/ray_source.cpp (97%) rename src/{renderer => raytracing}/ray_source.hpp (92%) create mode 100644 src/raytracing/renderer.cpp rename src/{renderer => raytracing}/renderer.hpp (66%) rename src/{renderer => raytracing}/triangle.hpp (100%) delete mode 100644 src/renderer/renderer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index d6a42ff..59ca3f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,8 @@ cmake_minimum_required(VERSION 3.13) project(inferno) -file(GLOB SRC "src/*.cpp" "src/graphics/*.cpp" "src/preview_renderer/*.cpp" "src/scene/*.cpp" "src/thirdparty/imgui/*.cpp" "src/preview_renderer/*.cpp") +# file(GLOB SRC "src/*.cpp" "src/graphics/*.cpp" "src/preview_renderer/*.cpp" "src/scene/*.cpp" "src/thirdparty/imgui/*.cpp" "src/preview_renderer/*.cpp") +file(GLOB_RECURSE SRC "src/*.cpp") add_subdirectory("thirdparty/assimp") diff --git a/src/graphics.hpp b/src/graphics.hpp index 78eed8c..44d596d 100644 --- a/src/graphics.hpp +++ b/src/graphics.hpp @@ -31,6 +31,8 @@ #define GLM_FORCE_SWIZZLE #include #include +#include +#include #include namespace inferno { diff --git a/src/inferno.cpp b/src/inferno.cpp index 1c068b4..e3e282e 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -14,7 +14,7 @@ #include "graphics/shader.hpp" #include "graphics/swapchain.hpp" #include "graphics/vkrenderer.hpp" -#include "preview_renderer/debug.hpp" +#include "preview/debug.hpp" #include "window.hpp" // #include "preview_renderer/debug.hpp" @@ -73,7 +73,7 @@ void inferno_timer_print(InfernoTimer* timer, bool time) std::chrono::duration inferno_timer_get_time(InfernoTimer* timer) { - return timer->Time; + return timer->Times.back(); } std::chrono::duration inferno_timer_get_average(InfernoTimer* timer) @@ -122,18 +122,15 @@ InfernoApp* inferno_create() true); scene::SceneObject* object = scene::scene_object_create(app->Device); - scene::scene_object_load(object, "res/Bistro.obj"); + // scene::scene_object_load(object, "res/Bistro.obj"); // scene::scene_object_load(object, "res/sponza.obj"); - // scene::mesh_load_obj(object, "res/cornell-box.obj"); + scene::scene_object_load(object, "res/cornell-box.obj"); scene::scene_add_object(app->Scene, object); - // scene::Mesh* lucy = scene::mesh_create(app->Device); - // scene::mesh_load_obj(lucy, "res/lucy.obj"); - // scene::mesh_ready(lucy); - // scene::SceneObject* lucyObject = scene::scene_object_create(); - // scene::scene_object_add_mesh(lucyObject, lucy); - // scene::scene_add_object(app->Scene, lucyObject); - + scene::SceneObject* lucy = scene::scene_object_create(app->Device); + scene::scene_object_load(lucy, "res/lucy.obj"); + scene::scene_object_optimize(lucy); + scene::scene_add_object(app->Scene, lucy); // app->PreviewRenderer = graphics::preview_create(); // graphics::preview_set_viewport(app->PreviewRenderer, app->Scene->Camera); // app->RayRenderer = graphics::rayr_create(app->Scene); @@ -251,6 +248,31 @@ void inferno_end(InfernoApp* app) int inferno_run(InfernoApp* app) { + + // we weant to outline Lucy in lines + graphics::renderer_submit_repeat( + app->Renderer, + [&](graphics::VulkanRenderer* renderer, VkCommandBuffer* commandBuffer) { + const auto lucy = app->Scene->Objects[0]; + for (auto& mesh : scene::scene_object_get_meshs(lucy)) { + for (int i = 0; i < mesh->Indicies.size() - 1; i += 3) { + graphics::debug_draw_line( + mesh->Verticies[mesh->Indicies[i]].Position, + mesh->Verticies[mesh->Indicies[i + 1]].Position, + { 1, 0, 0 }); + graphics::debug_draw_line( + mesh->Verticies[mesh->Indicies[i + 1]].Position, + mesh->Verticies[mesh->Indicies[i + 2]].Position, + { 1, 0, 0 }); + graphics::debug_draw_line( + mesh->Verticies[mesh->Indicies[i + 2]].Position, + mesh->Verticies[mesh->Indicies[i]].Position, + { 1, 0, 0 }); + } + } + }, + false); + while (graphics::window_new_frame()) { if (!inferno_pre(app)) continue; @@ -325,7 +347,6 @@ int inferno_run(InfernoApp* app) lastViewport = currentViewport; graphics::preview_draw(app->PreviewRenderer, app->Scene); - graphics::debug_draw_line({ 0, 0, 0 }, { 1, 1, 0 }, { 1, 1, 0 }); graphics::debug_draw_to_preview(app->Scene); ImTextureID texture @@ -356,4 +377,4 @@ int inferno_run(InfernoApp* app) return 1; } -} // namespace inferno +} // namespace infern diff --git a/src/inferno.hpp b/src/inferno.hpp index 94632b2..c58541d 100644 --- a/src/inferno.hpp +++ b/src/inferno.hpp @@ -5,8 +5,7 @@ #include "scene/mesh.hpp" #include "scene/scene.hpp" // #include "scene/camera.hpp" -#include "preview_renderer/renderer.hpp" -#include "renderer/renderer.hpp" +#include "preview/renderer.hpp" #include @@ -60,7 +59,7 @@ typedef struct InfernoApp { graphics::VulkanRenderer* Renderer; graphics::PreviewRenderer* PreviewRenderer; - graphics::RayRenderer* RayRenderer; + // graphics::RayRenderer* RayRenderer; InfernoTimer* MainTimer; uint64_t FrameCount; diff --git a/src/preview_renderer/debug.cpp b/src/preview/debug.cpp similarity index 97% rename from src/preview_renderer/debug.cpp rename to src/preview/debug.cpp index b3f97d8..ae9a3f4 100644 --- a/src/preview_renderer/debug.cpp +++ b/src/preview/debug.cpp @@ -5,7 +5,7 @@ #include "graphics/shader.hpp" #include "graphics/vkrenderer.hpp" -#include "preview_renderer/renderer.hpp" +#include "preview/renderer.hpp" #include "scene/camera.hpp" #include "scene/mesh.hpp" @@ -75,6 +75,9 @@ void debug_draw_to_preview(scene::Scene* scene) if (!DebugDrawerInstance->DoShow) return; + if (DebugDrawerInstance->LineElements.size() == 0) + return; + uint32_t bufferSize = DebugDrawerInstance->LineElements.size() * sizeof(DebugLine) * 2; scene::DebugLineVert* bufferData = new scene::DebugLineVert[bufferSize]; diff --git a/src/preview_renderer/debug.hpp b/src/preview/debug.hpp similarity index 100% rename from src/preview_renderer/debug.hpp rename to src/preview/debug.hpp diff --git a/src/preview_renderer/renderer.cpp b/src/preview/renderer.cpp similarity index 96% rename from src/preview_renderer/renderer.cpp rename to src/preview/renderer.cpp index 6a8cf52..d890169 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview/renderer.cpp @@ -2,7 +2,7 @@ #include -#include "preview_renderer/debug.hpp" +#include "debug.hpp" #include "graphics/buffer.hpp" #include "graphics/rendertarget.hpp" @@ -45,7 +45,9 @@ PreviewRenderer* preview_create(VulkanRenderer* vkrenderer) return renderer; } -void preview_cleanup(PreviewRenderer* renderer) { } +void preview_cleanup(PreviewRenderer* renderer) { + delete renderer; +} void preview_draw_ui(PreviewRenderer* renderer) { } diff --git a/src/preview_renderer/renderer.hpp b/src/preview/renderer.hpp similarity index 100% rename from src/preview_renderer/renderer.hpp rename to src/preview/renderer.hpp diff --git a/src/renderer/global_illumination.cpp b/src/raytracing/global_illumination.cpp similarity index 100% rename from src/renderer/global_illumination.cpp rename to src/raytracing/global_illumination.cpp diff --git a/src/renderer/global_illumination.hpp b/src/raytracing/global_illumination.hpp similarity index 100% rename from src/renderer/global_illumination.hpp rename to src/raytracing/global_illumination.hpp diff --git a/src/renderer/hit.hpp b/src/raytracing/hit.hpp similarity index 100% rename from src/renderer/hit.hpp rename to src/raytracing/hit.hpp diff --git a/src/renderer/kdtree.cpp b/src/raytracing/kdtree.cpp similarity index 100% rename from src/renderer/kdtree.cpp rename to src/raytracing/kdtree.cpp diff --git a/src/renderer/kdtree.hpp b/src/raytracing/kdtree.hpp similarity index 100% rename from src/renderer/kdtree.hpp rename to src/raytracing/kdtree.hpp diff --git a/src/renderer/light.cpp b/src/raytracing/light.cpp similarity index 100% rename from src/renderer/light.cpp rename to src/raytracing/light.cpp diff --git a/src/renderer/light.hpp b/src/raytracing/light.hpp similarity index 100% rename from src/renderer/light.hpp rename to src/raytracing/light.hpp diff --git a/src/renderer/object_tracer.cpp b/src/raytracing/object_tracer.cpp similarity index 92% rename from src/renderer/object_tracer.cpp rename to src/raytracing/object_tracer.cpp index ad5f42e..ac727a3 100644 --- a/src/renderer/object_tracer.cpp +++ b/src/raytracing/object_tracer.cpp @@ -1,6 +1,6 @@ #include "object_tracer.hpp" -#include "preview_renderer/debug.hpp" +#include "preview/debug.hpp" #include "scene/object.hpp" #include @@ -50,11 +50,12 @@ HitInfo* object_ray_collide(scene::SceneObject* object, Ray* ray) const uint32_t* ind; const float* verts; const float* norms; - mesh->getIndicies(&ind); - mesh->getVerticies(&verts, &norms); + // mesh->getIndicies(&ind); + // mesh->getVerticies(&verts, &norms); float t = INFINITY; - for (int i = 0; i < mesh->getIndexCount(); i += 3) { + int i ; + // for (int i = 0; i < mesh->getIndexCount(); i += 3) { uint32_t indexa = ind[i + 0]; uint32_t indexb = ind[i + 1]; uint32_t indexc = ind[i + 2]; @@ -71,7 +72,7 @@ HitInfo* object_ray_collide(scene::SceneObject* object, Ray* ray) t = temp_t; info->Distance = t; } - } + // } } return info; } diff --git a/src/renderer/object_tracer.hpp b/src/raytracing/object_tracer.hpp similarity index 69% rename from src/renderer/object_tracer.hpp rename to src/raytracing/object_tracer.hpp index cdf2a96..740e5fd 100644 --- a/src/renderer/object_tracer.hpp +++ b/src/raytracing/object_tracer.hpp @@ -1,9 +1,10 @@ -#pragma once +#pragma once #include #include -#include -#include + +#include +#include namespace inferno::graphics::rays { diff --git a/src/renderer/ray.hpp b/src/raytracing/ray.hpp similarity index 100% rename from src/renderer/ray.hpp rename to src/raytracing/ray.hpp diff --git a/src/renderer/ray_source.cpp b/src/raytracing/ray_source.cpp similarity index 97% rename from src/renderer/ray_source.cpp rename to src/raytracing/ray_source.cpp index e6239ad..013f7cb 100644 --- a/src/renderer/ray_source.cpp +++ b/src/raytracing/ray_source.cpp @@ -5,7 +5,8 @@ #include #include -#include + +#include namespace inferno::graphics::rays { diff --git a/src/renderer/ray_source.hpp b/src/raytracing/ray_source.hpp similarity index 92% rename from src/renderer/ray_source.hpp rename to src/raytracing/ray_source.hpp index 243e5f5..569b2dd 100644 --- a/src/renderer/ray_source.hpp +++ b/src/raytracing/ray_source.hpp @@ -5,7 +5,7 @@ #include -#include +#include namespace inferno::graphics { class Camera; diff --git a/src/raytracing/renderer.cpp b/src/raytracing/renderer.cpp new file mode 100644 index 0000000..79e0ae0 --- /dev/null +++ b/src/raytracing/renderer.cpp @@ -0,0 +1,151 @@ +#include "renderer.hpp" + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +// #include "preview/debug.hpp" +#include "ray_source.hpp" + +#include + +#include + +#include +#include + +namespace inferno::graphics { + +RayRenderer* rayr_create(VulkanRenderer* renderer, scene::Scene* scene) +{ + RayRenderer* ray = new RayRenderer; + + ray->Scene = scene; + ray->Renderer = renderer; + + auto camera = scene::scene_get_camera(scene); + glm::ivec2 viewport = camera_ray_get_viewport(camera); + ray->Viewport = { .extent + = { static_cast(viewport.x), static_cast(viewport.y) } }; + + ray->RenderData + = new glm::fvec4[ray->Viewport.extent.width * ray->Viewport.extent.height]; + memset(ray->RenderData, 0, + ray->Viewport.extent.width * ray->Viewport.extent.height * sizeof(glm::fvec4)); + + // TODO: We need to upload RenderData to the GPU / maybe do a quad pass ? I think + // ImGui handels that + + // ray->RayRenderTarget = graphics::rendertarget_create() + + return ray; +} + +void rayr_cleanup(RayRenderer* renderer) { delete[] renderer->RenderData; } + +void rayr_draw_ui(RayRenderer* renderer) { } + +void rayr_set_viewport(RayRenderer* renderer, Camera* camera) +{ + auto viewport = camera_ray_get_viewport(camera); + renderer->Viewport.offset.x = 0; + renderer->Viewport.offset.y = 0; + renderer->Viewport.extent.width = viewport.x; + renderer->Viewport.extent.height = viewport.y; + renderer->HasViewportChanged = true; +} + +GLuint rayr_get_rendered_texture(RayRenderer* renderer) +{ + // return renderer->RenderTargetTexture; +} + +glm::fvec4* rayr_get_render_data(RayRenderer* renderer) { return renderer->RenderData; } + +void rayr_prepare(RayRenderer* renderer) +{ + // TODO: This is TEMP + memset(renderer->RenderData, 0, + renderer->Viewport.extent.width * renderer->Viewport.extent.height + * sizeof(glm::fvec4)); + + assert(renderer->Scene != nullptr); + if (scene::scene_did_update(renderer->Scene)) { + yolo::debug("Scene updated, rebuilding acceleration structure"); + // renderer->AccelerationInterface->newScene(renderer->CurrentScene); + } +} + +void rayr_draw(RayRenderer* renderer) +{ + rayr_prepare(renderer); + + scene::scene_frame_tick(renderer->Scene); + // 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 + rays::ReferencedRayField startRays + = rays::generate_initial_rays(scene::scene_get_camera(renderer->Scene), true); + + // debug_draw_line({ 0, 0, 0 }, { 0, 0, 1 }, { 1, 0, 0 }); + +#pragma omp parallel for + for (int x = 0; x < renderer->Viewport.extent.width; x++) { + for (int y = 0; y < renderer->Viewport.extent.height; y++) { + rays::Ray* ray = startRays.Field[x * renderer->Viewport.extent.height + y]; + rays::HitInfo* closest_hit = nullptr; + + for (auto& obj : scene::scene_get_renderables(renderer->Scene)) { + rays::HitInfo* hit = rays::object_ray_collide(obj, ray); + if (hit->Did) { + if (closest_hit == nullptr) { + closest_hit = hit; + } else { + bool is_closer = hit->Distance < closest_hit->Distance; + if (is_closer) { + delete closest_hit; + closest_hit = hit; + } else { + delete hit; + } + } + } + if (hit->Did) { + glm::vec3 hit_distance = glm::vec3 { hit->Distance }; + hit_distance /= 10; + renderer->RenderData[y * renderer->Viewport.extent.width + x] + = { hit_distance, 1.0 }; + } + delete hit; + } + } + } +} +// +// void RayRenderer::computeHit(HitInfo* info) +// { +// static float mind = 100000.0f; +// static float maxd = 0.0f; +// // TODO: Make sure signal is started +// if (!(*mCurrentRefTable).count(info->Caller->Reference)) { +// yolo::warn("Why is the ray not in the map?!"); +// return; +// } +// glm::ivec2 pos = (*mCurrentRefTable)[info->Caller->Reference]; +// float d = info->Distance; +// if (d < mind) +// mind = d; +// if (d > maxd) +// maxd = d; +// float n = (d - mind) / (maxd - mind); +// mTarget[pos.y * mRenderTargetSize.x + pos.x] = { n, n, n, 1.0f }; +// } + +} diff --git a/src/renderer/renderer.hpp b/src/raytracing/renderer.hpp similarity index 66% rename from src/renderer/renderer.hpp rename to src/raytracing/renderer.hpp index 3128eb5..764dba0 100644 --- a/src/renderer/renderer.hpp +++ b/src/raytracing/renderer.hpp @@ -13,32 +13,39 @@ namespace inferno::scene { namespace inferno::graphics { +class VulkanRenderer; +class RenderTarget; + class Camera; class HitInfo; class RaySource; class RenderDispatcher; typedef struct RayRenderer { - glm::ivec2 Viewport; + VulkanRenderer* Renderer; // TODO: Can this be direct to GPU? // NOTE: Probably not glm::fvec4* RenderData = nullptr; - GLuint RenderTargetTexture = 0; + RenderTarget* RayRenderTarget; scene::Scene* Scene = nullptr; + + VkRect2D Viewport; + bool HasViewportChanged; } RayRenderer; -// Expects complete scene -RayRenderer* rayr_create(scene::Scene* scene); +// Expects complete scene as it will need to bake a lot of features +RayRenderer* rayr_create(VulkanRenderer* renderer, scene::Scene* scene); void rayr_cleanup(RayRenderer* renderer); void rayr_draw_ui(RayRenderer* renderer); void rayr_set_viewport(RayRenderer* renderer, Camera* camera); -GLuint rayr_get_rendered_texture(RayRenderer* renderer); + // rayr_get_rendered_texture(RayRenderer* renderer); glm::fvec4* rayr_get_render_data(RayRenderer* renderer); +void rayr_prepare(RayRenderer* renderer); void rayr_draw(RayRenderer* renderer); void raryr_compute_hit(HitInfo* info); diff --git a/src/renderer/triangle.hpp b/src/raytracing/triangle.hpp similarity index 100% rename from src/renderer/triangle.hpp rename to src/raytracing/triangle.hpp diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp deleted file mode 100644 index d5be6da..0000000 --- a/src/renderer/renderer.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "renderer.hpp" - -#include - -#include -#include -#include -#include -#include -#include - -#include "preview_renderer/debug.hpp" -#include "ray_source.hpp" - -#include - -#include - -#include -#include - -namespace inferno::graphics { - -RayRenderer* rayr_create(scene::Scene* scene) -{ - RayRenderer* renderer = new RayRenderer; - - renderer->Scene = scene; - - auto camera = scene::scene_get_camera(scene); - auto viewport = camera_ray_get_viewport(camera); - renderer->Viewport = viewport; - - yolo::debug("Raytracing Rendering {}x{} viewport", renderer->Viewport.x, renderer->Viewport.y); - renderer->RenderData = new glm::fvec4[renderer->Viewport.x * renderer->Viewport.y]; - memset(renderer->RenderData, 0, renderer->Viewport.x * renderer->Viewport.y * sizeof(glm::fvec4)); - - 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); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - 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, renderer->Viewport.x, renderer->Viewport.y, 0, GL_RGBA, GL_FLOAT, renderer->RenderData); - - glBindTexture(GL_TEXTURE_2D, 0); - - return renderer; -} - -void rayr_cleanup(RayRenderer* renderer) -{ - delete[] renderer->RenderData; -} - -void rayr_draw_ui(RayRenderer* renderer) -{ -} - -void rayr_set_viewport(RayRenderer* renderer, Camera* camera) -{ - auto viewport = camera_ray_get_viewport(camera); - renderer->Viewport = viewport; - - delete renderer->RenderData; - renderer->RenderData = new glm::fvec4[renderer->Viewport.x * renderer->Viewport.y]; - - 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); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - 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, renderer->Viewport.x, renderer->Viewport.y, 0, GL_RGBA, GL_FLOAT, renderer->RenderData); - - glBindTexture(GL_TEXTURE_2D, 0); -} - -GLuint rayr_get_rendered_texture(RayRenderer* renderer) -{ - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, renderer->Viewport.x, renderer->Viewport.y, 0, GL_RGBA, GL_FLOAT, renderer->RenderData); - return renderer->RenderTargetTexture; -} - -glm::fvec4* rayr_get_render_data(RayRenderer* renderer) -{ - return renderer->RenderData; -} - -void rayr_prepare(RayRenderer* renderer) -{ - // TODO: This is TEMP - memset(renderer->RenderData, 0, renderer->Viewport.x * renderer->Viewport.y * sizeof(glm::fvec4)); - - assert(renderer->Scene != nullptr); - if (scene::scene_did_update(renderer->Scene)) { - yolo::debug("Scene updated, rebuilding acceleration structure"); - // renderer->AccelerationInterface->newScene(renderer->CurrentScene); - } -} - -void rayr_draw(RayRenderer* renderer) -{ - rayr_prepare(renderer); - - scene::scene_frame_tick(renderer->Scene); - // 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 - rays::ReferencedRayField startRays = rays::generate_initial_rays(scene::scene_get_camera(renderer->Scene), true); - - // debug_draw_line({ 0, 0, 0 }, { 0, 0, 1 }, { 1, 0, 0 }); - -#pragma omp parallel for - for (int x = 0; x < renderer->Viewport.x; x++) { - for (int y = 0; y < renderer->Viewport.y; y++) { - rays::Ray* ray = startRays.Field[x * renderer->Viewport.y + y]; - rays::HitInfo* closest_hit = nullptr; - - for (auto& obj : scene::scene_get_renderables(renderer->Scene)) { - rays::HitInfo* hit = rays::object_ray_collide(obj, ray); - if (hit->Did) { - if (closest_hit == nullptr) { - closest_hit = hit; - } else { - bool is_closer = hit->Distance < closest_hit->Distance; - if (is_closer) { - delete closest_hit; - closest_hit = hit; - } else { - delete hit; - } - } - } - if (hit->Did) { - glm::vec3 hit_distance = glm::vec3 { hit->Distance }; - hit_distance /= 10; - renderer->RenderData[y * renderer->Viewport.x + x] = { hit_distance, 1.0 }; - } - delete hit; - } - } - } -} -// -// void RayRenderer::computeHit(HitInfo* info) -// { -// static float mind = 100000.0f; -// static float maxd = 0.0f; -// // TODO: Make sure signal is started -// if (!(*mCurrentRefTable).count(info->Caller->Reference)) { -// yolo::warn("Why is the ray not in the map?!"); -// return; -// } -// glm::ivec2 pos = (*mCurrentRefTable)[info->Caller->Reference]; -// float d = info->Distance; -// if (d < mind) -// mind = d; -// if (d > maxd) -// maxd = d; -// float n = (d - mind) / (maxd - mind); -// mTarget[pos.y * mRenderTargetSize.x + pos.x] = { n, n, n, 1.0f }; -// } - -} diff --git a/src/scene/mesh.cpp b/src/scene/mesh.cpp index 3c0729e..646bb86 100644 --- a/src/scene/mesh.cpp +++ b/src/scene/mesh.cpp @@ -56,9 +56,12 @@ void mesh_process(Mesh* out, aiMesh* mesh) { for (unsigned int i = 0; i < mesh->mNumVertices; i++) { Vert vertex = { - .Position = glm::vec3(mesh->mVertices[i].x, mesh->mVertices[i].y, mesh->mVertices[i].z), - .Normal = glm::vec3(mesh->mNormals[i].x, mesh->mNormals[i].y, mesh->mNormals[i].z), + .Position + = glm::vec3(mesh->mVertices[i].x, mesh->mVertices[i].y, mesh->mVertices[i].z), + .Normal + = glm::vec3(mesh->mNormals[i].x, mesh->mNormals[i].y, mesh->mNormals[i].z), }; + out->Verticies.push_back(vertex); } @@ -71,6 +74,8 @@ void mesh_process(Mesh* out, aiMesh* mesh) } } +void mesh_optimize(Mesh* mesh) { } + void mesh_ready(Mesh* mesh) { void* data = mesh->Verticies.data(); diff --git a/src/scene/mesh.hpp b/src/scene/mesh.hpp index 24d343e..155184c 100644 --- a/src/scene/mesh.hpp +++ b/src/scene/mesh.hpp @@ -50,6 +50,7 @@ void mesh_cleanup(Mesh* mesh); void mesh_process(Mesh* out, aiMesh* mesh); +void mesh_optimize(Mesh* mesh); void mesh_ready(Mesh* mesh); uint32_t mesh_get_verticies(Mesh* mesh, const float** v, const float** n); diff --git a/src/scene/object.cpp b/src/scene/object.cpp index 694765a..36e4143 100644 --- a/src/scene/object.cpp +++ b/src/scene/object.cpp @@ -40,7 +40,7 @@ void scene_object_load(SceneObject* object, std::filesystem::path file) const aiScene* scene = importer.ReadFile(file.string(), aiProcess_Triangulate | aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph - | aiProcess_GenNormals); + | aiProcess_GenSmoothNormals); if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { yolo::error("Assimp error: {}", importer.GetErrorString()); @@ -50,6 +50,13 @@ void scene_object_load(SceneObject* object, std::filesystem::path file) processNode(object, scene->mRootNode, scene); } +void scene_object_optimize(SceneObject* object) +{ + for (auto& mesh : object->Meshs) { + mesh_optimize(mesh); + } +} + void scene_object_add_mesh(SceneObject* object, Mesh* mesh) { object->Meshs.push_back(mesh); diff --git a/src/scene/object.hpp b/src/scene/object.hpp index c459354..17e53d3 100644 --- a/src/scene/object.hpp +++ b/src/scene/object.hpp @@ -23,6 +23,7 @@ SceneObject* scene_object_create(graphics::GraphicsDevice* device); void scene_object_cleanup(SceneObject* object); void scene_object_load(SceneObject* object, std::filesystem::path file); +void scene_object_optimize(SceneObject* object); void scene_object_add_mesh(SceneObject* object, Mesh* mesh); std::vector& scene_object_get_meshs(SceneObject* object);