COSC-3P93-Project/Step 2/include/math/bvh.h

53 lines
1.5 KiB
C
Raw Normal View History

2022-10-18 00:44:49 -04:00
/*
* Created by Brett Terpstra 6920201 on 17/10/22.
* Copyright (c) 2022 Brett Terpstra. All Rights Reserved.
*/
#ifndef STEP_2_BVH_H
#define STEP_2_BVH_H
#include <util/std.h>
#include <types.h>
// A currently pure header implementation of a BVH. TODO: make source file.
// this is also for testing and might not make it into the step 2.
namespace Raytracing {
class BVHNode {
private:
void* obj;
AABB aabb;
BVHNode* left;
BVHNode* right;
public:
BVHNode(void* obj, AABB aabb, BVHNode* left, BVHNode* right): obj(obj), aabb(std::move(aabb)), left(left), right(right) {}
~BVHNode() {
delete(left);
delete(right);
}
};
class BVHTree {
private:
BVHNode* root = nullptr;
public:
explicit BVHTree(const std::vector<Object*>& objectsInWorld) {
// create a volume for the entire world.
AABB world;
for (const auto& obj : objectsInWorld)
if (!obj->getAABB().isEmpty())
world.expand(obj->getAABB());
// world sized bvh node isn't associated with a specific object
// only leafs should be non-null, and we might need to change it to a vector.
root = new BVHNode(nullptr, world, nullptr, nullptr);
}
~BVHTree(){
delete(root);
}
};
}
#endif //STEP_2_BVH_H