From 80776f88d9783153e29ca3afb0234c2ce2b4b8c7 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Mon, 30 Oct 2023 08:27:07 +0000 Subject: [PATCH] start of debug drawing nightmare --- CMakeLists.txt | 3 +++ src/inferno.cpp | 17 +++++++++-------- src/preview_renderer/renderer.cpp | 3 +++ src/preview_renderer/renderer.hpp | 3 +++ src/renderer/renderer.cpp | 20 +++++++++++++++++--- src/renderer/renderer.hpp | 3 --- 6 files changed, 35 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 33edf86..955d5ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,8 @@ find_package(Threads REQUIRED) set(OpenGL_GL_PREFERENCE GLVND) find_package(OpenGL REQUIRED) +find_package(OpenMP REQUIRED) + # Libraries if (WIN32) # cmake .. "-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake" @@ -65,6 +67,7 @@ else() target_link_libraries(inferno PRIVATE ${GLFW3_LIBRARIES} OpenGL::GL + OpenMP::OpenMP_CXX ) endif() diff --git a/src/inferno.cpp b/src/inferno.cpp index 61d2ba5..8cddca1 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -84,6 +84,8 @@ InfernoApp* inferno_create() app->Scene = scene::scene_create(); app->MainTimer = inferno_timer_create(); + graphics::camera_set_position(app->Scene->Camera, { 0.0f, 1.0f, 3.1f }); + // Create window graphics::window_create("Inferno v" INFERNO_VERSION, 1280, 720); @@ -94,13 +96,13 @@ InfernoApp* inferno_create() graphics::shader_link(basicShader); basicMaterial->setGlShader(basicShader); - // scene::Mesh* mesh = new scene::Mesh; - // mesh->loadOBJ("res/dragon-cornell-size.obj"); - // mesh->ready(); - // mesh->setMaterial(basicMaterial); - // scene::SceneObject* object = scene::scene_object_create(); - // scene::scene_object_add_mesh(object, mesh); - // scene::scene_add_object(app->Scene, object); + scene::Mesh* mesh = new scene::Mesh; + mesh->loadOBJ("res/lucy.obj"); + mesh->ready(); + mesh->setMaterial(basicMaterial); + scene::SceneObject* object = scene::scene_object_create(); + scene::scene_object_add_mesh(object, mesh); + scene::scene_add_object(app->Scene, object); scene::Mesh* box = new scene::Mesh; box->loadOBJ("res/cornell-box.obj"); @@ -110,7 +112,6 @@ InfernoApp* inferno_create() scene::scene_object_add_mesh(box_object, box); scene::scene_add_object(app->Scene, box_object); - app->PreviewRenderer = graphics::preview_create(); graphics::preview_set_viewport(app->PreviewRenderer, app->Scene->Camera); app->RayRenderer = graphics::rayr_create(app->Scene); diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index 27d734d..85b6cf3 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -1,5 +1,7 @@ #include "renderer.hpp" +#include + #include "scene/object.hpp" #include "shader.hpp" @@ -55,6 +57,7 @@ void preview_cleanup(PreviewRenderer* renderer) void preview_draw_ui(PreviewRenderer* renderer) { + ImGui::Checkbox("Debug", &renderer->DoShowDebug); } void preview_set_viewport(PreviewRenderer* renderer, Camera* camera) diff --git a/src/preview_renderer/renderer.hpp b/src/preview_renderer/renderer.hpp index 6bacf4c..3089bea 100644 --- a/src/preview_renderer/renderer.hpp +++ b/src/preview_renderer/renderer.hpp @@ -14,6 +14,7 @@ struct Viewport; struct Camera; typedef struct PreviewRenderer { + bool DoShowDebug = true; glm::ivec2 Viewport; GLuint RenderTarget = 0; @@ -24,6 +25,8 @@ typedef struct PreviewRenderer { PreviewRenderer* preview_create(); void preview_cleanup(PreviewRenderer* renderer); +void preview_draw_debug_ui(PreviewRenderer* renderer); + void preview_draw_ui(PreviewRenderer* renderer); void preview_set_viewport(PreviewRenderer* renderer, Camera* camera); diff --git a/src/renderer/renderer.cpp b/src/renderer/renderer.cpp index 7c060f2..fc18def 100644 --- a/src/renderer/renderer.cpp +++ b/src/renderer/renderer.cpp @@ -15,8 +15,8 @@ #include -#include #include +#include namespace inferno::graphics { @@ -115,15 +115,29 @@ void rayr_draw(RayRenderer* renderer) // 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); +#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; - // we want to iterate over every object in the scene and then ask that object for an intersection for (auto& obj : scene::scene_get_renderables(renderer->Scene)) { rays::HitInfo* hit = rays::object_ray_collide(obj, ray); if (hit->Did) { - glm::vec3 hit_distance = glm::vec3{ hit->Distance }; + 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 }; } diff --git a/src/renderer/renderer.hpp b/src/renderer/renderer.hpp index 3e907f9..3128eb5 100644 --- a/src/renderer/renderer.hpp +++ b/src/renderer/renderer.hpp @@ -26,9 +26,6 @@ typedef struct RayRenderer { glm::fvec4* RenderData = nullptr; GLuint RenderTargetTexture = 0; - // Internal stuffs - // RaySource* RaySource = nullptr; - scene::Scene* Scene = nullptr; } RayRenderer;