1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
// Begin License:
// Copyright (C) 2006-2014 Tobias Sargeant (tobias.sargeant@gmail.com).
// All rights reserved.
//
// This file is part of the Carve CSG Library (http://carve-csg.com/)
//
// This file may be used under the terms of either the GNU General
// Public License version 2 or 3 (at your option) as published by the
// Free Software Foundation and appearing in the files LICENSE.GPL2
// and LICENSE.GPL3 included in the packaging of this file.
//
// This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
// INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
// End:
#pragma once
namespace carve {
namespace csg {
template<typename filter_t>
void Octree::doFindEdges(const carve::poly::Geometry<3>::face_t &f,
Node *node,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out,
unsigned depth,
filter_t filter) const {
if (node == NULL) {
return;
}
if (node->aabb.intersects(f.aabb) && node->aabb.intersects(f.plane_eqn)) {
if (node->hasChildren()) {
for (int i = 0; i < 8; ++i) {
doFindEdges(f, node->children[i], out, depth + 1, filter);
}
} else {
if (depth < MAX_SPLIT_DEPTH && node->edges.size() > EDGE_SPLIT_THRESHOLD) {
if (!node->split()) {
for (int i = 0; i < 8; ++i) {
doFindEdges(f, node->children[i], out, depth + 1, filter);
}
return;
}
}
for (std::vector<const carve::poly::Geometry<3>::edge_t*>::const_iterator it = node->edges.begin(), e = node->edges.end(); it != e; ++it) {
if ((*it)->tag_once()) {
if (filter(*it)) {
out.push_back(*it);
}
}
}
}
}
}
template<typename filter_t>
void Octree::findEdgesNear(const carve::poly::Geometry<3>::face_t &f, std::vector<const carve::poly::Geometry<3>::edge_t *> &out, filter_t filter) const {
tagable::tag_begin();
doFindEdges(f, root, out, 0, filter);
}
template <typename func_t>
void Octree::doIterate(int level, Node *node, const func_t &f) const{
f(level, node);
if (node->hasChildren()) {
for (int i = 0; i < 8; ++i) {
doIterate(level + 1, node->children[i], f);
}
}
}
template <typename func_t>
void Octree::iterateNodes(const func_t &f) const {
doIterate(0, root, f);
}
}
}
|