From da49d10ec59683ea2d053dd9d692cbedee3ced18 Mon Sep 17 00:00:00 2001 From: TheRedShip Date: Tue, 21 Jan 2025 00:02:12 +0100 Subject: [PATCH] + | Handling transformation objects --- .vscode/settings.json | 3 +- Makefile | 2 +- imgui.ini | 10 +++++-- includes/RT/ObjParser.hpp | 2 +- includes/RT/Scene.hpp | 4 ++- scenes/dragon.rt | 8 +++--- shaders/compute.glsl | 2 ++ shaders/debug.glsl | 57 ++++++++++++++++++++++++++++++++++++-- shaders/trace.glsl | 51 +++++++++++++++++++++++++++++----- srcs/class/ObjParser.cpp | 4 +-- srcs/class/Scene.cpp | 5 ++-- srcs/class/SceneParser.cpp | 12 +++++++- srcs/class/Shader.cpp | 2 +- 13 files changed, 135 insertions(+), 27 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 8a1f376..abe297a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -79,7 +79,8 @@ "xlocmes": "cpp", "xlocmon": "cpp", "xloctime": "cpp", - "xtree": "cpp" + "xtree": "cpp", + "forward_list": "cpp" }, "cmake.ignoreCMakeListsMissing": true } \ No newline at end of file diff --git a/Makefile b/Makefile index 79d220e..9d73d4b 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ ifeq ($(OS),Windows_NT) LINE_CLR = \33[2K\r RM := del /S /Q DIR_DUP = if not exist "$(@D)" mkdir "$(@D)" - CC := g++ + CC := g++ -O3 IFLAGS := -I./includes -I./includes/RT -I./includes/imgui LDFLAGS := -L./lib -lglfw3 -lopengl32 -lgdi32 -lcglm else diff --git a/imgui.ini b/imgui.ini index 95b4e37..e0f3220 100644 --- a/imgui.ini +++ b/imgui.ini @@ -5,20 +5,24 @@ Size=400,400 [Window][Camera] Pos=1643,7 Size=259,200 +Collapsed=1 [Window][Material] -Pos=1646,209 +Pos=1642,29 Size=266,299 +Collapsed=1 [Window][Fog settings] -Pos=1649,509 +Pos=1641,52 Size=247,130 +Collapsed=1 [Window][Debug] Pos=1642,668 Size=260,143 [Window][Debug BVH] -Pos=1646,642 +Pos=1641,72 Size=274,205 +Collapsed=1 diff --git a/includes/RT/ObjParser.hpp b/includes/RT/ObjParser.hpp index c64b7f3..8937310 100644 --- a/includes/RT/ObjParser.hpp +++ b/includes/RT/ObjParser.hpp @@ -21,7 +21,7 @@ class ObjParser ObjParser(std::string &filename); ~ObjParser(); - void parse(Scene &scene, glm::vec3 offset); + void parse(Scene &scene, glm::vec3 offset, float scale, glm::mat4 transform); private: glm::vec3 getVertex(std::stringstream &line); diff --git a/includes/RT/Scene.hpp b/includes/RT/Scene.hpp index 63bead0..a8490dd 100644 --- a/includes/RT/Scene.hpp +++ b/includes/RT/Scene.hpp @@ -88,7 +88,9 @@ struct GPUBvh struct GPUBvhData { + glm::mat4 transform; alignas(16) glm::vec3 offset; + float scale; int bvh_start_index; int triangle_start_index; @@ -111,7 +113,7 @@ class Scene void updateLightAndObjects(int mat_id); std::set getGPULights(); - void addBvh(std::vector &triangles, glm::vec3 offset); + void addBvh(std::vector &triangles, glm::vec3 offset, float scale, glm::mat4 transform); const std::vector &getObjectData() const; const std::vector &getTriangleData() const; diff --git a/scenes/dragon.rt b/scenes/dragon.rt index 541cf41..9585860 100644 --- a/scenes/dragon.rt +++ b/scenes/dragon.rt @@ -1,4 +1,4 @@ -CAM 1.82501 0.45 -0.0162945 -10 180.6 0.02 2.164 30 5 +CAM 1.82501 0.45 0 -10 180 0.005 2.164 35 5 MAT 255 255 255 0.0 1. 0.3 // white 0 @@ -24,8 +24,8 @@ pl 0 -2 0 0 1 0 2 // floor qu -1 1.999 -1 2 0 0 0 0 2 6 -OBJ obj/Dragon_80K.obj 0 0 0 -OBJ obj/Dragon_80K.obj 0 0 1 +OBJ obj/Dragon_80K.obj 0 0 0.5 +OBJ obj/Dragon_80K.obj 0 0 -0.5 1 0 15 100 # OBJ obj/teapot.obj # OBJ obj/Model.obj @@ -33,4 +33,4 @@ OBJ obj/Dragon_80K.obj 0 0 1 # OBJ obj/Lowpoly_tree_sample.obj po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4 -po -0.5 -0.5 -1.99 0 1 0 1 0 0 0 4 +po 1.99 -0.5 -0.5 0 1 0 0 0 1 0 4 diff --git a/shaders/compute.glsl b/shaders/compute.glsl index de1636e..4684f48 100644 --- a/shaders/compute.glsl +++ b/shaders/compute.glsl @@ -63,7 +63,9 @@ struct GPUVolume struct GPUBvhData { + mat4 transform; vec3 offset; + float scale; int bvh_start_index; int triangle_start_index; diff --git a/shaders/debug.glsl b/shaders/debug.glsl index f8fd4a4..3fa249c 100644 --- a/shaders/debug.glsl +++ b/shaders/debug.glsl @@ -69,7 +69,9 @@ layout(std430, binding = 2) buffer TriangleBuffer struct GPUBvhData { + mat4 transform; vec3 offset; + float scale; int bvh_start_index; int triangle_start_index; @@ -210,6 +212,44 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data, inout Stats stats) return (hit); } +mat3 rotateX(float angleRadians) { + float c = cos(angleRadians); + float s = sin(angleRadians); + return mat3( + 1.0, 0.0, 0.0, + 0.0, c, -s, + 0.0, s, c + ); +} + +mat3 rotateY(float angleRadians) { + float c = cos(angleRadians); + float s = sin(angleRadians); + return mat3( + c, 0.0, s, + 0.0, 1.0, 0.0, + -s, 0.0, c + ); +} + +mat3 rotateZ(float angleRadians) { + float c = cos(angleRadians); + float s = sin(angleRadians); + return mat3( + c, -s, 0.0, + s, c, 0.0, + 0.0, 0.0, 1.0 + ); +} + +mat3 createTransformMatrix(vec3 rotationAngles, float scale) { + mat3 rotMatrix = rotateZ(rotationAngles.z) * + rotateY(rotationAngles.y) * + rotateX(rotationAngles.x); + + return rotMatrix * scale; +} + hitInfo traverseBVHs(Ray ray, inout Stats stats) { hitInfo hit; @@ -219,14 +259,25 @@ hitInfo traverseBVHs(Ray ray, inout Stats stats) for (int i = 0; i < u_bvhNum; i++) { - ray.origin = i == 0 ? ray.origin : ray.origin + vec3(2., 0., 0.); - hitInfo temp_hit = traceBVH(ray, BvhData[i], stats); + GPUBvhData bvh_data = BvhData[i]; + + mat3 transformMatrix = mat3(bvh_data.transform); + mat3 inverseTransformMatrix = inverse(transformMatrix); + Ray transformedRay; + transformedRay.direction = normalize(transformMatrix * ray.direction); + transformedRay.origin = transformMatrix * (ray.origin - bvh_data.offset); + transformedRay.inv_direction = (1. / transformedRay.direction); + + hitInfo temp_hit = traceBVH(transformedRay, BvhData[i], stats); + + temp_hit.t = temp_hit.t / bvh_data.scale; + if (temp_hit.t < hit.t) { hit.t = temp_hit.t; hit.obj_index = temp_hit.obj_index; - hit.normal = temp_hit.normal; + hit.normal = normalize(inverseTransformMatrix * temp_hit.normal); } } diff --git a/shaders/trace.glsl b/shaders/trace.glsl index 5b186ed..9356c77 100644 --- a/shaders/trace.glsl +++ b/shaders/trace.glsl @@ -118,6 +118,36 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data) return (hit); } +// hitInfo traverseBVHs(Ray ray) +// { +// hitInfo hit; + +// hit.t = 1e30; +// hit.obj_index = -1; + +// for (int i = 0; i < u_bvhNum; i++) +// { +// GPUBvhData bvh_data = BvhData[i]; + +// ray.origin -= bvh_data.offset; +// hitInfo temp_hit = traceBVH(ray, bvh_data); + +// if (temp_hit.t < hit.t) +// { +// hit.t = temp_hit.t; +// hit.last_t = temp_hit.last_t; +// hit.obj_index = temp_hit.obj_index; +// hit.mat_index = temp_hit.mat_index; +// hit.position = temp_hit.position; +// hit.normal = temp_hit.normal; +// } + +// ray.origin += bvh_data.offset; +// } + +// return (hit); +// } + hitInfo traverseBVHs(Ray ray) { hitInfo hit; @@ -128,21 +158,28 @@ hitInfo traverseBVHs(Ray ray) for (int i = 0; i < u_bvhNum; i++) { GPUBvhData bvh_data = BvhData[i]; + + mat3 transformMatrix = mat3(bvh_data.transform); + mat3 inverseTransformMatrix = inverse(transformMatrix); - ray.origin -= bvh_data.offset; - hitInfo temp_hit = traceBVH(ray, bvh_data); + Ray transformedRay; + transformedRay.direction = normalize(transformMatrix * ray.direction); + transformedRay.origin = transformMatrix * (ray.origin - bvh_data.offset); + transformedRay.inv_direction = (1. / transformedRay.direction); + + hitInfo temp_hit = traceBVH(transformedRay, BvhData[i]); + + temp_hit.t = temp_hit.t / bvh_data.scale; if (temp_hit.t < hit.t) { hit.t = temp_hit.t; - hit.last_t = temp_hit.last_t; + hit.last_t = temp_hit.last_t / bvh_data.scale; hit.obj_index = temp_hit.obj_index; hit.mat_index = temp_hit.mat_index; - hit.position = temp_hit.position; - hit.normal = temp_hit.normal; + hit.position = inverseTransformMatrix * temp_hit.position + bvh_data.offset; + hit.normal = normalize(inverseTransformMatrix * temp_hit.normal); } - - ray.origin += bvh_data.offset; } return (hit); diff --git a/srcs/class/ObjParser.cpp b/srcs/class/ObjParser.cpp index e8641d2..fa494dc 100644 --- a/srcs/class/ObjParser.cpp +++ b/srcs/class/ObjParser.cpp @@ -240,7 +240,7 @@ void ObjParser::parseMtl(std::stringstream &input_line, Scene &scene) file.close(); } -void ObjParser::parse(Scene &scene, glm::vec3 offset) +void ObjParser::parse(Scene &scene, glm::vec3 offset, float scale, glm::mat4 transform) { std::string line; std::string identifier; @@ -275,6 +275,6 @@ void ObjParser::parse(Scene &scene, glm::vec3 offset) } } - scene.addBvh(_triangles, offset); + scene.addBvh(_triangles, offset, scale, transform); } diff --git a/srcs/class/Scene.cpp b/srcs/class/Scene.cpp index 8ae75df..637479d 100644 --- a/srcs/class/Scene.cpp +++ b/srcs/class/Scene.cpp @@ -142,7 +142,7 @@ void Scene::addObject(Object *obj) _gpu_objects.push_back(gpu_obj); } -void Scene::addBvh(std::vector &triangles, glm::vec3 offset) +void Scene::addBvh(std::vector &triangles, glm::vec3 offset, float scale, glm::mat4 transform) { GPUBvhData new_bvh_data; std::vector new_bvhs_list; @@ -154,8 +154,9 @@ void Scene::addBvh(std::vector &triangles, glm::vec3 offset) BVH *bvh = new BVH(triangles, 0, triangles.size()); new_bvhs_list = bvh->getGPUBvhs(); - std::cout << glm::to_string(offset) << std::endl; + new_bvh_data.transform = transform * scale; new_bvh_data.offset = offset; + new_bvh_data.scale = scale; new_bvh_data.bvh_start_index = _gpu_bvh.size(); new_bvh_data.triangle_start_index = _gpu_triangles.size(); diff --git a/srcs/class/SceneParser.cpp b/srcs/class/SceneParser.cpp index 6ff5a12..e775558 100644 --- a/srcs/class/SceneParser.cpp +++ b/srcs/class/SceneParser.cpp @@ -102,11 +102,21 @@ void SceneParser::parseObj(std::stringstream &line) float y = 0.; float z = 0.; + float scale = 1.; + + float xtransform = 0.; + float ytransform = 0.; + float ztransform = 0.; + line >> name; line >> x >> y >> z; + line >> scale; + line >> xtransform >> ytransform >> ztransform; + + glm::mat4 transform = glm::eulerAngleXYZ(glm::radians(xtransform), glm::radians(ytransform), glm::radians(ztransform)); ObjParser obj(name); - obj.parse(*_scene, glm::vec3(x, y, z)); + obj.parse(*_scene, glm::vec3(x, y, z), (1.0 / scale), transform); } bool SceneParser::parseLine(const std::string &line) diff --git a/srcs/class/Shader.cpp b/srcs/class/Shader.cpp index d6935ad..a141739 100644 --- a/srcs/class/Shader.cpp +++ b/srcs/class/Shader.cpp @@ -67,7 +67,7 @@ Shader::Shader(std::string vertexPath, std::string fragmentPath, std::string com const char *fragmentCode = loadFileWithIncludes(fragmentPath); const char *computeCode = loadFileWithIncludes(computePath); - // printWithLineNumbers(computeCode); + printWithLineNumbers(computeCode); _vertex = glCreateShader(GL_VERTEX_SHADER);