|
@@ -1,4 +1,5 @@
|
|
|
#include <algorithm>
|
|
|
+#include <iostream>
|
|
|
|
|
|
#include "common/utils/KDTree.h"
|
|
|
|
|
@@ -125,3 +126,79 @@ void KDTree::build(Node* n, std::vector<KDTree::Triangle>& data) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void KDTree::fillLines(Lines& lines, const std::vector<KDTree::Triangle>& data) {
|
|
|
+ if(data.size() == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Vector3 min = data[0][0];
|
|
|
+ Vector3 max = data[0][0];
|
|
|
+ for(const Triangle& t : data) {
|
|
|
+ for(const Vector3& v : t.data()) {
|
|
|
+ min.set(std::min(min[0], v[0]), std::min(min[1], v[1]), std::min(min[2], v[2]));
|
|
|
+ max.set(std::max(max[0], v[0]), std::max(max[1], v[1]), std::max(max[2], v[2]));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ lines.add(Vector3(min[0], min[1], min[2]), Vector3(max[0], min[1], min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], min[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], min[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], min[1], max[2]), Vector3(max[0], min[1], max[2]), 0xFFFFFF);
|
|
|
+
|
|
|
+ lines.add(Vector3(min[0], min[1], min[2]), Vector3(min[0], max[1], min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], min[1], min[2]), Vector3(max[0], max[1], min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], min[1], max[2]), Vector3(min[0], max[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], min[1], max[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
|
|
|
+
|
|
|
+ lines.add(Vector3(min[0], max[1], min[2]), Vector3(max[0], max[1], min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], max[1], min[2]), Vector3(min[0], max[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], max[1], min[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], max[1], max[2]), Vector3(max[0], max[1], max[2]), 0xFFFFFF);
|
|
|
+
|
|
|
+ fillLines(lines, &root, min, max);
|
|
|
+
|
|
|
+ lines.build();
|
|
|
+}
|
|
|
+
|
|
|
+void KDTree::fillLines(Lines& lines, Node* n, const Vector3& min, const Vector3& max) {
|
|
|
+ if(n->lessEqual == nullptr && n->greater == nullptr) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ switch(n->splitDim) {
|
|
|
+ case 0:
|
|
|
+ lines.add(Vector3(n->splitValue, min[1], min[2]), Vector3(n->splitValue, max[1], min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(n->splitValue, max[1], min[2]), Vector3(n->splitValue, max[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(n->splitValue, max[1], max[2]), Vector3(n->splitValue, min[1], max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(n->splitValue, min[1], max[2]), Vector3(n->splitValue, min[1], min[2]), 0xFFFFFF);
|
|
|
+ if(n->lessEqual != nullptr) {
|
|
|
+ fillLines(lines, n->lessEqual, min, Vector3(n->splitValue, max[1], max[2]));
|
|
|
+ }
|
|
|
+ if(n->greater != nullptr) {
|
|
|
+ fillLines(lines, n->greater, Vector3(n->splitValue, min[1], min[2]), max);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, min[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], n->splitValue, min[2]), Vector3(min[0], n->splitValue, max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], n->splitValue, min[2]), Vector3(max[0], n->splitValue, max[2]), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], n->splitValue, max[2]), Vector3(max[0], n->splitValue, max[2]), 0xFFFFFF);
|
|
|
+ if(n->lessEqual != nullptr) {
|
|
|
+ fillLines(lines, n->lessEqual, min, Vector3(max[0], n->splitValue, max[2]));
|
|
|
+ }
|
|
|
+ if(n->greater != nullptr) {
|
|
|
+ fillLines(lines, n->greater, Vector3(min[0], n->splitValue, min[2]), max);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ lines.add(Vector3(min[0], min[1], n->splitValue), Vector3(min[0], max[1], n->splitValue), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(min[0], max[1], n->splitValue), Vector3(max[0], max[1], n->splitValue), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], max[1], n->splitValue), Vector3(max[0], min[1], n->splitValue), 0xFFFFFF);
|
|
|
+ lines.add(Vector3(max[0], min[1], n->splitValue), Vector3(min[0], min[1], n->splitValue), 0xFFFFFF);
|
|
|
+ if(n->lessEqual != nullptr) {
|
|
|
+ fillLines(lines, n->lessEqual, min, Vector3(max[0], max[1], n->splitValue));
|
|
|
+ }
|
|
|
+ if(n->greater != nullptr) {
|
|
|
+ fillLines(lines, n->greater, Vector3(min[0], min[1], n->splitValue), max);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|