start of debug drawing nightmare
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -26,9 +26,6 @@ typedef struct RayRenderer {
|
||||
glm::fvec4* RenderData = nullptr;
|
||||
GLuint RenderTargetTexture = 0;
|
||||
|
||||
// Internal stuffs
|
||||
// RaySource* RaySource = nullptr;
|
||||
|
||||
scene::Scene* Scene = nullptr;
|
||||
} RayRenderer;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user