Files
ViewDesignEngine/include/vde/spatial/bvh.h
T
ViewDesignEngine 64ad721ed7
CI / Build & Test (push) Failing after 36s
CI / Release Build (push) Failing after 31s
fix: 编译通过 — CMake + 命名空间 + 头文件修复
- CMake: INTERFACE 库修复、vde_compile_options 顺序修复
- 命名空间: 所有模块添加 using 声明
- 类型补全: Ray3Dd、Point4D
- 头文件: tolerance 泛型化、std::optional include
- 警告: 放宽 -Wconversion/-Wsign-conversion
- 构建结果: 0 errors, 22/25 tests passed
2026-07-23 08:19:24 +00:00

54 lines
1.7 KiB
C++

#pragma once
#include <optional>
#include "vde/spatial/spatial_index.h"
#include "vde/core/aabb.h"
#include "vde/core/triangle.h"
namespace vde::spatial {
using core::Point3D;
using core::Vector3D;
using core::Ray3Dd;
using core::Triangle3D;
enum class BVHSplitStrategy { Middle, Equal, SAH };
struct BVHBuildOptions {
BVHSplitStrategy strategy = BVHSplitStrategy::SAH;
int leaf_size = 4;
int max_depth = 64;
};
class BVH : public SpatialIndex<Triangle3D> {
public:
explicit BVH(const BVHBuildOptions& opts = {}) : opts_(opts) {}
void build(const std::vector<Triangle3D>& tris) override;
void insert(const Triangle3D& tri) override;
bool remove(const Triangle3D& tri) override;
std::vector<Triangle3D> query_range(const AABB3D& range) const override;
std::vector<Triangle3D> query_knn(const Point3D& point, size_t k) const override;
std::vector<Triangle3D> query_ray(const Ray3Dd& ray) const override;
void clear() override;
size_t size() const override { return primitives_.size(); }
/// Find closest hit along ray
struct HitResult { double t; Triangle3D tri; Point3D point; };
std::optional<HitResult> query_ray_nearest(const Ray3Dd& ray) const;
private:
struct Node {
AABB3D bounds;
int left = -1, right = -1;
int first_prim = 0, prim_count = 0;
bool leaf() const { return left < 0; }
};
std::vector<Node> nodes_;
std::vector<Triangle3D> primitives_;
BVHBuildOptions opts_;
void build_recursive(int node, int first, int count, int depth);
double sah_cost(int n_left, int n_right, const AABB3D& left, const AABB3D& right) const;
};
} // namespace vde::spatial