dust3d/thirdparty/carve-1.4.0/include/carve/octree_decl.hpp

194 lines
6.2 KiB
C++

// Begin License:
// Copyright (C) 2006-2008 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 the GNU General Public
// License version 2.0 as published by the Free Software Foundation
// and appearing in the file LICENSE.GPL2 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
#include <carve/carve.hpp>
#include <carve/geom3d.hpp>
#include <carve/aabb.hpp>
#include <carve/polyhedron_base.hpp>
namespace carve {
namespace csg {
const double SLACK_FACTOR=1.0009765625;
const unsigned FACE_SPLIT_THRESHOLD=50U;
const unsigned EDGE_SPLIT_THRESHOLD=50U;
const unsigned POINT_SPLIT_THRESHOLD=20U;
const unsigned MAX_SPLIT_DEPTH=32;
class Octree {
public:
class Node {
private:
Node(const Node &node); // undefined.
Node &operator=(const Node &node); // undefined.
public:
Node *parent;
Node *children[8];
bool is_leaf;
carve::geom3d::Vector min;
carve::geom3d::Vector max;
std::vector<const carve::poly::Geometry<3>::face_t *> faces;
std::vector<const carve::poly::Geometry<3>::edge_t *> edges;
std::vector<const carve::poly::Geometry<3>::vertex_t *> vertices;
carve::geom3d::AABB aabb;
Node();
Node(const carve::geom3d::Vector &newMin, const carve::geom3d::Vector &newMax);
Node(Node *p, double x1, double y1, double z1, double x2, double y2, double z2);
~Node();
bool mightContain(const carve::poly::Geometry<3>::face_t &face);
bool mightContain(const carve::poly::Geometry<3>::edge_t &edge);
bool mightContain(const carve::poly::Geometry<3>::vertex_t &p);
bool hasChildren();
bool hasGeometry();
template <class T>
void putInside(const T &input, Node *child, T &output);
bool split();
};
Node *root;
struct no_filter {
bool operator()(const carve::poly::Geometry<3>::edge_t *) { return true; }
bool operator()(const carve::poly::Geometry<3>::face_t *) { return true; }
};
Octree();
~Octree();
void setBounds(const carve::geom3d::Vector &min, const carve::geom3d::Vector &max);
void setBounds(carve::geom3d::AABB aabb);
void addEdges(const std::vector<carve::poly::Geometry<3>::edge_t > &edges);
void addFaces(const std::vector<carve::poly::Geometry<3>::face_t > &faces);
void addVertices(const std::vector<const carve::poly::Geometry<3>::vertex_t *> &vertices);
static carve::geom3d::AABB makeAABB(const Node *node);
void doFindEdges(const carve::geom::aabb<3> &aabb,
Node *node,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out,
unsigned depth) const;
void doFindEdges(const carve::geom3d::LineSegment &l,
Node *node,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out,
unsigned depth) const;
void doFindEdges(const carve::geom3d::Vector &v,
Node *node,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out,
unsigned depth) const;
void doFindFaces(const carve::geom::aabb<3> &aabb,
Node *node,
std::vector<const carve::poly::Geometry<3>::face_t *> &out,
unsigned depth) const;
void doFindFaces(const carve::geom3d::LineSegment &l,
Node *node,
std::vector<const carve::poly::Geometry<3>::face_t *> &out,
unsigned depth) const;
void doFindVerticesAllowDupes(const carve::geom3d::Vector &v,
Node *node,
std::vector<const carve::poly::Geometry<3>::vertex_t *> &out,
unsigned depth) const;
void findVerticesNearAllowDupes(const carve::geom3d::Vector &v,
std::vector<const carve::poly::Geometry<3>::vertex_t *> &out) const;
template<typename filter_t>
void 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;
template<typename filter_t>
void findEdgesNear(const carve::poly::Geometry<3>::face_t &f,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out,
filter_t filter) const;
void findEdgesNear(const carve::poly::Geometry<3>::face_t &f,
std::vector<const carve::poly::Geometry<3>::edge_t *> &out) const {
return findEdgesNear(f, out, no_filter());
}
void findEdgesNear(const carve::geom::aabb<3> &aabb, std::vector<const carve::poly::Geometry<3>::edge_t *> &out) const;
void findEdgesNear(const carve::geom3d::LineSegment &l, std::vector<const carve::poly::Geometry<3>::edge_t *> &out) const;
void findEdgesNear(const carve::poly::Geometry<3>::edge_t &e, std::vector<const carve::poly::Geometry<3>::edge_t *> &out) const;
void findEdgesNear(const carve::geom3d::Vector &v, std::vector<const carve::poly::Geometry<3>::edge_t *> &out) const;
void findFacesNear(const carve::geom::aabb<3> &aabb, std::vector<const carve::poly::Geometry<3>::face_t *> &out) const;
void findFacesNear(const carve::geom3d::LineSegment &l, std::vector<const carve::poly::Geometry<3>::face_t *> &out) const;
void findFacesNear(const carve::poly::Geometry<3>::edge_t &e, std::vector<const carve::poly::Geometry<3>::face_t *> &out) const;
static void doSplit(int maxSplit, Node *node);
template <typename FUNC>
void doIterate(int level, Node *node, const FUNC &f) const;
template <typename FUNC>
void iterateNodes(const FUNC &f) const;
void splitTree();
};
}
}