start of debug drawing nightmare

This commit is contained in:
Ben Kyd
2023-10-30 08:27:07 +00:00
parent da259dd0cb
commit 80776f88d9
6 changed files with 35 additions and 14 deletions

View File

@@ -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()

View File

@@ -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);

View File

@@ -1,5 +1,7 @@
#include "renderer.hpp"
#include <graphics.hpp>
#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)

View File

@@ -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);

View File

@@ -15,8 +15,8 @@
#include <scene/camera.hpp>
#include <iostream>
#include <cstring>
#include <iostream>
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 };
}

View File

@@ -26,9 +26,6 @@ typedef struct RayRenderer {
glm::fvec4* RenderData = nullptr;
GLuint RenderTargetTexture = 0;
// Internal stuffs
// RaySource* RaySource = nullptr;
scene::Scene* Scene = nullptr;
} RayRenderer;