|
@@ -73,6 +73,9 @@ float KDTree::median(std::vector<KDTree::Triangle>& data, int dim) const {
|
|
|
}
|
|
|
|
|
|
void KDTree::build(Node* n, std::vector<KDTree::Triangle>& data) {
|
|
|
+ for(KDTree::Triangle& t : data) {
|
|
|
+ n->data.push_back(t);
|
|
|
+ }
|
|
|
if(data.size() == 0) {
|
|
|
return;
|
|
|
} else if(data.size() == 1) {
|
|
@@ -125,6 +128,15 @@ void KDTree::build(Node* n, std::vector<KDTree::Triangle>& data) {
|
|
|
n->data.push_back(t);
|
|
|
}
|
|
|
}
|
|
|
+ if(lessEqualData.size() == 0 || greaterData.size() == 0) {
|
|
|
+ for(KDTree::Triangle& t : lessEqualData) {
|
|
|
+ n->data.push_back(t);
|
|
|
+ }
|
|
|
+ for(KDTree::Triangle& t : greaterData) {
|
|
|
+ n->data.push_back(t);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
if(lessEqualData.size() > 0) {
|
|
|
n->childs[0] = new Node();
|
|
@@ -225,7 +237,7 @@ bool KDTree::findIntersection(const Vector3& pos, const Vector3& direction) {
|
|
|
t = std::max(t, std::abs((min[i] - pos[i]) / direction[i]));
|
|
|
t = std::max(t, std::abs((max[i] - pos[i]) / direction[i]));
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return findIntersection(&root, pos, direction, t);
|
|
|
}
|
|
|
|
|
@@ -258,7 +270,7 @@ bool KDTree::findIntersection(Node* n, const Vector3& pos, const Vector3& direct
|
|
|
r = findIntersection(n->childs[first], pos, direction, tMax);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for(KDTree::Triangle& tri : n->data) {
|
|
|
float t = testIntersection(pos, direction, tri);
|
|
|
if(t < 0.0f) {
|
|
@@ -286,6 +298,9 @@ float KDTree::testIntersection(const Vector3& pos, const Vector3& direction, con
|
|
|
Vector3 h1 = t[1] - t[0];
|
|
|
Vector3 h2 = t[2] - t[0];
|
|
|
Vector3 abc = h1.cross(h2);
|
|
|
+ if(abc.squareLength() < eps) {
|
|
|
+ return -1.0f;
|
|
|
+ }
|
|
|
abc.normalize();
|
|
|
float d = -abc.dot(t[0]);
|
|
|
|