You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.5 KiB

1 year ago
#pragma once
#ifdef _WIN32
#define INTERSECTION_API __declspec(dllexport)
#else
#define INTERSECTION_API
#endif
#include "Geometry.h"
1 year ago
#include <numeric>
#include <algorithm>
#include <vector>
#include <cstddef>
#include <iostream> // std::cerr
#include <stdexcept> // std::length_error
1 year ago
extern "C" struct INTERSECTION_API TriangleSegmentIntersectRes
{
1 year ago
bool hit;
float t;
TriangleSegmentIntersectRes(bool h, float tt);
1 year ago
};
INTERSECTION_API
TriangleSegmentIntersectRes triangleSegmentIntersection(const LineSegment &segment, const Vec3f &a, const Vec3f &b, const Vec3f &c);
1 year ago
extern "C" class INTERSECTION_API BVHNode
{
1 year ago
public:
size_t left;
size_t right;
size_t parent;
AABB boundingBox;
BVHNode(size_t l, size_t r, size_t p, const AABB &aabb);
BVHNode();
1 year ago
};
extern "C" class INTERSECTION_API BVH_intersection
{
1 year ago
public:
const Mesh &mesh;
std::vector<Vec3f> faceCenters;
std::vector<BVHNode> nodes;
BVH_intersection(const Mesh &mesh_);
size_t
dfsBuild(std::vector<size_t> &indicesList, AABB aabb, size_t &nowIdx);
bool intersectWithLineSegment(const LineSegment &lineSegment) const;
1 year ago
private:
AABB computeAABB(const std::vector<size_t> &indices);
bool recursiveLineSegIntersection(const LineSegment &lineSegment, size_t nodeIdx) const;
1 year ago
void nth(std::vector<size_t> &indicesList, size_t kth, int longAxis);
void recursiveChoose(std::vector<size_t> &indicesList, size_t begin, size_t end, size_t kth, int longAxis);
1 year ago
};