mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 10:48:34 +02:00
+ | Handling transformation objects
This commit is contained in:
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -79,7 +79,8 @@
|
||||
"xlocmes": "cpp",
|
||||
"xlocmon": "cpp",
|
||||
"xloctime": "cpp",
|
||||
"xtree": "cpp"
|
||||
"xtree": "cpp",
|
||||
"forward_list": "cpp"
|
||||
},
|
||||
"cmake.ignoreCMakeListsMissing": true
|
||||
}
|
2
Makefile
2
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
|
||||
|
10
imgui.ini
10
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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -63,7 +63,9 @@ struct GPUVolume
|
||||
|
||||
struct GPUBvhData
|
||||
{
|
||||
mat4 transform;
|
||||
vec3 offset;
|
||||
float scale;
|
||||
|
||||
int bvh_start_index;
|
||||
int triangle_start_index;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user