+ | Dragon and bvh

This commit is contained in:
TheRedShip
2025-01-18 12:30:35 +01:00
parent bb673d4af1
commit 5d3de6158b
20 changed files with 430842 additions and 25476 deletions

View File

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

View File

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

View File

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

View File

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