From 1f23592883cb90b3beb2853a3f2239e974a2efa4 Mon Sep 17 00:00:00 2001 From: TheRedShip Date: Thu, 23 Jan 2025 15:38:39 +0100 Subject: [PATCH] ~ | Working toplevel with transformed obj --- shaders/debug.glsl | 5 +++-- srcs/RT.cpp | 4 ++-- srcs/class/TopBVH.cpp | 36 +++++++++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/shaders/debug.glsl b/shaders/debug.glsl index 4a05e89..0257593 100644 --- a/shaders/debug.glsl +++ b/shaders/debug.glsl @@ -342,8 +342,7 @@ vec3 debugColor(vec2 uv) Ray ray = initRay(uv); Stats stats = Stats(0, 0); - // hitInfo hit = traceBVH(ray, BvhData[0], stats); - // hitInfo hit = traverseBVHs(ray, BvhData[0], stats); + // hitInfo hit = traverseBVHs(ray, BvhData[0], stats); //working with scaling offset transfo hitInfo hit = traceTopBVH(ray, stats); float box_display = float(stats.box_count) / float(debug.box_treshold); @@ -354,6 +353,8 @@ vec3 debugColor(vec2 uv) case 0: return (hit.normal * 0.5 + 0.5) * int(hit.obj_index != -1); case 1: + if (hit.obj_index != -1) + return (hit.normal * 0.5 + 0.5); return (box_display < 1. ? vec3(box_display) : vec3(1., 0., 0.)); case 2: return (triangle_display < 1. ? vec3(triangle_display) : vec3(1., 0., 0.)); diff --git a/srcs/RT.cpp b/srcs/RT.cpp index 4ba55c0..69a8fdf 100644 --- a/srcs/RT.cpp +++ b/srcs/RT.cpp @@ -20,8 +20,8 @@ int main(int argc, char **argv) return (1); Window window(&scene, WIDTH, HEIGHT, "RT_GPU", 0); - Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); - // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); + // Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/compute.glsl"); + Shader shader("shaders/vertex.vert", "shaders/frag.frag", "shaders/debug.glsl"); GLint max_gpu_size; glGetIntegerv(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_gpu_size); diff --git a/srcs/class/TopBVH.cpp b/srcs/class/TopBVH.cpp index cc8421a..baac1d1 100644 --- a/srcs/class/TopBVH.cpp +++ b/srcs/class/TopBVH.cpp @@ -29,16 +29,34 @@ TopBVH::TopBVH(std::vector &bvhs_data, std::vector &bvhs, in void TopBVH::updateBounds(std::vector &bvhs_data, std::vector &bvhs) { for (int i = 0; i < _bvh_count; i++) - { - GPUBvhData bvh_data = bvhs_data[_first_bvh + i]; - GPUBvh root_bvh = bvhs[bvh_data.bvh_start_index]; + { + GPUBvhData bvh_data = bvhs_data[_first_bvh + i]; + GPUBvh root_bvh = bvhs[bvh_data.bvh_start_index]; - glm::vec3 min = root_bvh.min + bvh_data.offset; - glm::vec3 max = root_bvh.max + bvh_data.offset; - - _aabb.min = glm::min(_aabb.min, min); - _aabb.max = glm::max(_aabb.max, max); - } + glm::vec3 corners[8] = { + glm::vec3(root_bvh.min.x, root_bvh.min.y, root_bvh.min.z), + glm::vec3(root_bvh.max.x, root_bvh.min.y, root_bvh.min.z), + glm::vec3(root_bvh.min.x, root_bvh.max.y, root_bvh.min.z), + glm::vec3(root_bvh.max.x, root_bvh.max.y, root_bvh.min.z), + glm::vec3(root_bvh.min.x, root_bvh.min.y, root_bvh.max.z), + glm::vec3(root_bvh.max.x, root_bvh.min.y, root_bvh.max.z), + glm::vec3(root_bvh.min.x, root_bvh.max.y, root_bvh.max.z), + glm::vec3(root_bvh.max.x, root_bvh.max.y, root_bvh.max.z) + }; + + glm::vec3 transformed_min(1e30); + glm::vec3 transformed_max(-1e30); + + for (glm::vec3 corner : corners) + { + glm::vec3 transformed = glm::vec3(glm::inverse(bvh_data.transform) * glm::vec4(corner, 1.0)) + bvh_data.offset; + transformed_min = glm::min(transformed_min, transformed); + transformed_max = glm::max(transformed_max, transformed); + } + + _aabb.min = glm::min(_aabb.min, transformed_min); + _aabb.max = glm::max(_aabb.max, transformed_max); + } } float TopBVH::evaluateSah(std::vector &bvhs_data, std::vector &bvhs, int axis, float pos)