+ | 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",
"xlocmon": "cpp",
"xloctime": "cpp",
"xtree": "cpp"
"xtree": "cpp",
"forward_list": "cpp"
},
"cmake.ignoreCMakeListsMissing": true
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -142,7 +142,7 @@ void Scene::addObject(Object *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;
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());
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();

View File

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

View File

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