mirror of
https://github.com/TheRedShip/RT_GPU.git
synced 2025-09-27 18:48:36 +02:00
+ | Dragon and bvh
This commit is contained in:
@ -12,7 +12,7 @@
|
||||
|
||||
#include "BVH.hpp"
|
||||
|
||||
BVH::BVH(std::vector<GPUObject> &primitives, int first_primitive, int primitive_count) : _aabb(AABB(glm::vec3(1e30f), glm::vec3(-1e30f)))
|
||||
BVH::BVH(std::vector<GPUTriangle> &primitives, int first_primitive, int primitive_count) : _aabb(AABB(glm::vec3(1e30f), glm::vec3(-1e30f)))
|
||||
{
|
||||
_left = nullptr;
|
||||
_right = nullptr;
|
||||
@ -26,14 +26,14 @@ BVH::BVH(std::vector<GPUObject> &primitives, int first_primitive, int primitive_
|
||||
subdivide(primitives);
|
||||
}
|
||||
|
||||
void BVH::updateBounds(std::vector<GPUObject> &primitives)
|
||||
void BVH::updateBounds(std::vector<GPUTriangle> &primitives)
|
||||
{
|
||||
for (int i = 0; i < _primitive_count; i++)
|
||||
{
|
||||
GPUObject leaf_triangle = primitives[_first_primitive + i];
|
||||
GPUTriangle leaf_triangle = primitives[_first_primitive + i];
|
||||
|
||||
if (leaf_triangle.type != (int)Object::Type::TRIANGLE)
|
||||
continue ;
|
||||
// if (leaf_triangle.type != (int)Object::Type::TRIANGLE)
|
||||
// continue ;
|
||||
|
||||
_aabb.min = glm::min(_aabb.min, leaf_triangle.position);
|
||||
_aabb.min = glm::min(_aabb.min, leaf_triangle.vertex1);
|
||||
@ -44,9 +44,9 @@ void BVH::updateBounds(std::vector<GPUObject> &primitives)
|
||||
}
|
||||
}
|
||||
|
||||
void BVH::subdivide(std::vector<GPUObject> &primitives)
|
||||
void BVH::subdivide(std::vector<GPUTriangle> &primitives)
|
||||
{
|
||||
if (_primitive_count <= 100)
|
||||
if (_primitive_count <= 4)
|
||||
return ;
|
||||
|
||||
glm::vec3 extent = _aabb.max - _aabb.min;
|
||||
@ -79,7 +79,6 @@ void BVH::subdivide(std::vector<GPUObject> &primitives)
|
||||
if (left_count == 0 || left_count == _primitive_count)
|
||||
return ;
|
||||
|
||||
|
||||
_is_leaf = false;
|
||||
|
||||
_left = new BVH(primitives, _first_primitive, left_count);
|
||||
|
@ -105,7 +105,8 @@ bool ObjParser::addTriangleFromPolygon(std::vector<glm::vec3> &vertices, Scene &
|
||||
dot = glm::cross(v2 - v3, v2 - v1).z;
|
||||
if(dot <= 0)
|
||||
continue;
|
||||
if(pointInTriangle((glm::vec3 [3]){v1, v2, v3}, vertices, i))
|
||||
glm::vec3 triangleVertices[3] = {v1, v2, v3};
|
||||
if(pointInTriangle(triangleVertices, vertices, i))
|
||||
continue;
|
||||
vertices.erase(vertices.begin() + i);
|
||||
addTriangle(v1, v2 ,v3 , scene);
|
||||
|
@ -53,7 +53,7 @@ bool Scene::parseScene(char *name)
|
||||
}
|
||||
file.close();
|
||||
|
||||
BVH *bvh = new BVH(_gpu_objects, 0, _gpu_objects.size());
|
||||
BVH *bvh = new BVH(_gpu_triangles, 0, _gpu_triangles.size());
|
||||
_gpu_bvh = bvh->getGPUBvhs();
|
||||
|
||||
return (true);
|
||||
@ -84,13 +84,6 @@ void Scene::addObject(Object *obj)
|
||||
gpu_obj.vertex1 = quad->getUp();
|
||||
gpu_obj.vertex2 = quad->getRight();
|
||||
}
|
||||
else if (obj->getType() == Object::Type::TRIANGLE)
|
||||
{
|
||||
auto triangle = static_cast<Triangle *>(obj);
|
||||
gpu_obj.vertex1 = triangle->getVertex2();
|
||||
gpu_obj.vertex2 = triangle->getVertex3();
|
||||
gpu_obj.normal = triangle->getNormal();
|
||||
}
|
||||
else if (obj->getType() == Object::Type::CUBE)
|
||||
{
|
||||
auto cube = static_cast<Cube *>(obj);
|
||||
@ -103,6 +96,22 @@ void Scene::addObject(Object *obj)
|
||||
gpu_obj.normal = glm::vec3(cylinder->getRadius(), cylinder->getHeight(), 0.0f);
|
||||
gpu_obj.transform = glm::mat4(cylinder->getRotation());
|
||||
}
|
||||
else if (obj->getType() == Object::Type::TRIANGLE)
|
||||
{
|
||||
GPUTriangle gpu_triangle;
|
||||
|
||||
auto triangle = static_cast<Triangle *>(obj);
|
||||
gpu_triangle.position = obj->getPosition();
|
||||
gpu_triangle.mat_index = obj->getMaterialIndex();
|
||||
|
||||
gpu_triangle.vertex1 = triangle->getVertex2();
|
||||
gpu_triangle.vertex2 = triangle->getVertex3();
|
||||
gpu_triangle.normal = triangle->getNormal();
|
||||
|
||||
_gpu_triangles.push_back(gpu_triangle);
|
||||
|
||||
return ;
|
||||
}
|
||||
else if (obj->getType() == Object::Type::PORTAL)
|
||||
{
|
||||
auto portal = static_cast<Portal *>(obj);
|
||||
@ -169,6 +178,11 @@ const std::vector<GPUObject> &Scene::getObjectData() const
|
||||
return (_gpu_objects);
|
||||
}
|
||||
|
||||
const std::vector<GPUTriangle> &Scene::getTriangleData() const
|
||||
{
|
||||
return (_gpu_triangles);
|
||||
}
|
||||
|
||||
std::vector<GPUMaterial> &Scene::getMaterialData()
|
||||
{
|
||||
return (_gpu_materials);
|
||||
|
@ -175,6 +175,7 @@ void Window::imGuiRender()
|
||||
|
||||
ImGui::Text("Fps: %d", int(_fps));
|
||||
ImGui::Text("Frame: %d", _frameCount);
|
||||
ImGui::Text("Objects: %d", _scene->getObjectData().size() + _scene->getTriangleData().size());
|
||||
|
||||
ImGui::Separator();
|
||||
if (ImGui::Checkbox("Accumulate", &accumulate))
|
||||
|
Reference in New Issue
Block a user