+ | Handling transformation objects

This commit is contained in:
TheRedShip
2025-01-21 00:02:12 +01:00
parent fc9f8b9d91
commit da49d10ec5
13 changed files with 135 additions and 27 deletions

View File

@ -79,7 +79,8 @@
"xlocmes": "cpp", "xlocmes": "cpp",
"xlocmon": "cpp", "xlocmon": "cpp",
"xloctime": "cpp", "xloctime": "cpp",
"xtree": "cpp" "xtree": "cpp",
"forward_list": "cpp"
}, },
"cmake.ignoreCMakeListsMissing": true "cmake.ignoreCMakeListsMissing": true
} }

View File

@ -11,7 +11,7 @@ ifeq ($(OS),Windows_NT)
LINE_CLR = \33[2K\r LINE_CLR = \33[2K\r
RM := del /S /Q RM := del /S /Q
DIR_DUP = if not exist "$(@D)" mkdir "$(@D)" DIR_DUP = if not exist "$(@D)" mkdir "$(@D)"
CC := g++ CC := g++ -O3
IFLAGS := -I./includes -I./includes/RT -I./includes/imgui IFLAGS := -I./includes -I./includes/RT -I./includes/imgui
LDFLAGS := -L./lib -lglfw3 -lopengl32 -lgdi32 -lcglm LDFLAGS := -L./lib -lglfw3 -lopengl32 -lgdi32 -lcglm
else else

View File

@ -5,20 +5,24 @@ Size=400,400
[Window][Camera] [Window][Camera]
Pos=1643,7 Pos=1643,7
Size=259,200 Size=259,200
Collapsed=1
[Window][Material] [Window][Material]
Pos=1646,209 Pos=1642,29
Size=266,299 Size=266,299
Collapsed=1
[Window][Fog settings] [Window][Fog settings]
Pos=1649,509 Pos=1641,52
Size=247,130 Size=247,130
Collapsed=1
[Window][Debug] [Window][Debug]
Pos=1642,668 Pos=1642,668
Size=260,143 Size=260,143
[Window][Debug BVH] [Window][Debug BVH]
Pos=1646,642 Pos=1641,72
Size=274,205 Size=274,205
Collapsed=1

View File

@ -21,7 +21,7 @@ class ObjParser
ObjParser(std::string &filename); ObjParser(std::string &filename);
~ObjParser(); ~ObjParser();
void parse(Scene &scene, glm::vec3 offset); void parse(Scene &scene, glm::vec3 offset, float scale, glm::mat4 transform);
private: private:
glm::vec3 getVertex(std::stringstream &line); glm::vec3 getVertex(std::stringstream &line);

View File

@ -88,7 +88,9 @@ struct GPUBvh
struct GPUBvhData struct GPUBvhData
{ {
glm::mat4 transform;
alignas(16) glm::vec3 offset; alignas(16) glm::vec3 offset;
float scale;
int bvh_start_index; int bvh_start_index;
int triangle_start_index; int triangle_start_index;
@ -111,7 +113,7 @@ class Scene
void updateLightAndObjects(int mat_id); void updateLightAndObjects(int mat_id);
std::set<int> getGPULights(); std::set<int> getGPULights();
void addBvh(std::vector<Triangle> &triangles, glm::vec3 offset); void addBvh(std::vector<Triangle> &triangles, glm::vec3 offset, float scale, glm::mat4 transform);
const std::vector<GPUObject> &getObjectData() const; const std::vector<GPUObject> &getObjectData() const;
const std::vector<GPUTriangle> &getTriangleData() const; const std::vector<GPUTriangle> &getTriangleData() const;

View File

@ -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 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 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 0.5
OBJ obj/Dragon_80K.obj 0 0 1 OBJ obj/Dragon_80K.obj 0 0 -0.5 1 0 15 100
# OBJ obj/teapot.obj # OBJ obj/teapot.obj
# OBJ obj/Model.obj # OBJ obj/Model.obj
@ -33,4 +33,4 @@ OBJ obj/Dragon_80K.obj 0 0 1
# OBJ obj/Lowpoly_tree_sample.obj # OBJ obj/Lowpoly_tree_sample.obj
po -1.99 -0.5 -0.5 0 1 0 0 0 1 1 4 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

View File

@ -63,7 +63,9 @@ struct GPUVolume
struct GPUBvhData struct GPUBvhData
{ {
mat4 transform;
vec3 offset; vec3 offset;
float scale;
int bvh_start_index; int bvh_start_index;
int triangle_start_index; int triangle_start_index;

View File

@ -69,7 +69,9 @@ layout(std430, binding = 2) buffer TriangleBuffer
struct GPUBvhData struct GPUBvhData
{ {
mat4 transform;
vec3 offset; vec3 offset;
float scale;
int bvh_start_index; int bvh_start_index;
int triangle_start_index; int triangle_start_index;
@ -210,6 +212,44 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data, inout Stats stats)
return (hit); 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 traverseBVHs(Ray ray, inout Stats stats)
{ {
hitInfo hit; hitInfo hit;
@ -219,14 +259,25 @@ hitInfo traverseBVHs(Ray ray, inout Stats stats)
for (int i = 0; i < u_bvhNum; i++) for (int i = 0; i < u_bvhNum; i++)
{ {
ray.origin = i == 0 ? ray.origin : ray.origin + vec3(2., 0., 0.); GPUBvhData bvh_data = BvhData[i];
hitInfo temp_hit = traceBVH(ray, BvhData[i], stats);
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) if (temp_hit.t < hit.t)
{ {
hit.t = temp_hit.t; hit.t = temp_hit.t;
hit.obj_index = temp_hit.obj_index; hit.obj_index = temp_hit.obj_index;
hit.normal = temp_hit.normal; hit.normal = normalize(inverseTransformMatrix * temp_hit.normal);
} }
} }

View File

@ -118,6 +118,36 @@ hitInfo traceBVH(Ray ray, GPUBvhData bvh_data)
return (hit); 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 traverseBVHs(Ray ray)
{ {
hitInfo hit; hitInfo hit;
@ -128,21 +158,28 @@ hitInfo traverseBVHs(Ray ray)
for (int i = 0; i < u_bvhNum; i++) for (int i = 0; i < u_bvhNum; i++)
{ {
GPUBvhData bvh_data = BvhData[i]; GPUBvhData bvh_data = BvhData[i];
mat3 transformMatrix = mat3(bvh_data.transform);
mat3 inverseTransformMatrix = inverse(transformMatrix);
ray.origin -= bvh_data.offset; Ray transformedRay;
hitInfo temp_hit = traceBVH(ray, bvh_data); 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) if (temp_hit.t < hit.t)
{ {
hit.t = temp_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.obj_index = temp_hit.obj_index;
hit.mat_index = temp_hit.mat_index; hit.mat_index = temp_hit.mat_index;
hit.position = temp_hit.position; hit.position = inverseTransformMatrix * temp_hit.position + bvh_data.offset;
hit.normal = temp_hit.normal; hit.normal = normalize(inverseTransformMatrix * temp_hit.normal);
} }
ray.origin += bvh_data.offset;
} }
return (hit); return (hit);

View File

@ -240,7 +240,7 @@ void ObjParser::parseMtl(std::stringstream &input_line, Scene &scene)
file.close(); 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 line;
std::string identifier; 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);
} }

View File

@ -142,7 +142,7 @@ void Scene::addObject(Object *obj)
_gpu_objects.push_back(gpu_obj); _gpu_objects.push_back(gpu_obj);
} }
void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset) void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset, float scale, glm::mat4 transform)
{ {
GPUBvhData new_bvh_data; GPUBvhData new_bvh_data;
std::vector<GPUBvh> new_bvhs_list; std::vector<GPUBvh> new_bvhs_list;
@ -154,8 +154,9 @@ void Scene::addBvh(std::vector<Triangle> &triangles, glm::vec3 offset)
BVH *bvh = new BVH(triangles, 0, triangles.size()); BVH *bvh = new BVH(triangles, 0, triangles.size());
new_bvhs_list = bvh->getGPUBvhs(); 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.offset = offset;
new_bvh_data.scale = scale;
new_bvh_data.bvh_start_index = _gpu_bvh.size(); new_bvh_data.bvh_start_index = _gpu_bvh.size();
new_bvh_data.triangle_start_index = _gpu_triangles.size(); new_bvh_data.triangle_start_index = _gpu_triangles.size();

View File

@ -102,11 +102,21 @@ void SceneParser::parseObj(std::stringstream &line)
float y = 0.; float y = 0.;
float z = 0.; float z = 0.;
float scale = 1.;
float xtransform = 0.;
float ytransform = 0.;
float ztransform = 0.;
line >> name; line >> name;
line >> x >> y >> z; 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); 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) bool SceneParser::parseLine(const std::string &line)

View File

@ -67,7 +67,7 @@ Shader::Shader(std::string vertexPath, std::string fragmentPath, std::string com
const char *fragmentCode = loadFileWithIncludes(fragmentPath); const char *fragmentCode = loadFileWithIncludes(fragmentPath);
const char *computeCode = loadFileWithIncludes(computePath); const char *computeCode = loadFileWithIncludes(computePath);
// printWithLineNumbers(computeCode); printWithLineNumbers(computeCode);
_vertex = glCreateShader(GL_VERTEX_SHADER); _vertex = glCreateShader(GL_VERTEX_SHADER);