Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/carve/include/carve/intersection.hpp')
-rw-r--r--extern/carve/include/carve/intersection.hpp267
1 files changed, 0 insertions, 267 deletions
diff --git a/extern/carve/include/carve/intersection.hpp b/extern/carve/include/carve/intersection.hpp
deleted file mode 100644
index af1bc829291..00000000000
--- a/extern/carve/include/carve/intersection.hpp
+++ /dev/null
@@ -1,267 +0,0 @@
-// 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
-
-#include <carve/carve.hpp>
-#include <carve/collection_types.hpp>
-#include <carve/iobj.hpp>
-
-namespace carve {
- namespace csg {
-
- /**
- * \class Intersections
- * \brief Storage for computed intersections between vertices, edges and faces.
- *
- */
- struct Intersections : public std::unordered_map<IObj, IObjVMapSmall, IObj_hash> {
- typedef carve::mesh::MeshSet<3>::vertex_t vertex_t;
- typedef carve::mesh::MeshSet<3>::edge_t edge_t;
- typedef carve::mesh::MeshSet<3>::face_t face_t;
-
- typedef std::unordered_map<IObj, IObjVMapSmall, IObj_hash> super;
-
- ~Intersections() {
- }
-
- /**
- * \brief Record the position of intersection between a pair of intersection objects.
- *
- * @param a The first intersecting object.
- * @param b The second intersecting object.
- * @param p The point of intersection.
- */
- void record(IObj a, IObj b, vertex_t *p) {
- if (a > b) std::swap(a, b);
- (*this)[a][b] = p;
- (*this)[b][a] = p;
- }
-
- /**
- * \brief Test whether vertex \a v intersects face \a f.
- *
- * @param v The vertex to test.
- * @param f The face to test.
- *
- * @return true, if \a v intersects \a f.
- */
- bool intersectsFace(vertex_t *v, face_t *f) const;
-
- /**
- * \brief Collect sets of vertices, edges and faces that intersect \a obj
- *
- * @param[in] obj The intersection object to search for intersections.
- * @param[out] collect_v A vector of vertices intersecting \a obj.
- * @param[out] collect_e A vector of edges intersecting \a obj.
- * @param[out] collect_f A vector of faces intersecting \a obj.
- */
- void collect(const IObj &obj,
- std::vector<vertex_t *> *collect_v,
- std::vector<edge_t *> *collect_e,
- std::vector<face_t *> *collect_f) const;
-
-
- /**
- * \brief Determine whether two intersection objects intersect.
- *
- * @param a The first intersection object.
- * @param b The second intersection object.
- *
- * @return true, if \a a and \a b intersect.
- */
- bool intersectsExactly(const IObj &a, const IObj &b) {
- Intersections::const_iterator i = find(a);
- if (i == end()) return false;
- return i->second.find(b) != i->second.end();
- }
-
- /**
- * \brief Determine whether an intersection object intersects a vertex.
- *
- * @param a The intersection object.
- * @param v The vertex.
- *
- * @return true, if \a a and \a v intersect.
- */
- bool intersects(const IObj &a, vertex_t *v) {
- Intersections::const_iterator i = find(a);
- if (i == end()) return false;
- if (i->second.find(v) != i->second.end()) return true;
- return false;
- }
-
- /**
- * \brief Determine whether an intersection object intersects an edge.
- *
- * @param a The intersection object.
- * @param e The edge.
- *
- * @return true, if \a a and \a e intersect (either on the edge,
- * or at either endpoint).
- */
- bool intersects(const IObj &a, edge_t *e) {
- Intersections::const_iterator i = find(a);
- if (i == end()) return false;
- for (super::data_type::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
- const IObj &obj = j->first;
- switch (obj.obtype) {
- case IObj::OBTYPE_VERTEX:
- if (obj.vertex == e->v1() || obj.vertex == e->v2()) return true;
- break;
- case IObj::OBTYPE_EDGE:
- if (obj.edge == e) return true;
- break;
- default:
- break;
- }
- }
- return false;
- }
-
- /**
- * \brief Determine whether an intersection object intersects a face.
- *
- * @param a The intersection object.
- * @param f The face.
- *
- * @return true, if \a a and \a f intersect (either on the face,
- * or at any associated edge or vertex).
- */
- bool intersects(const IObj &a, face_t *f) {
- Intersections::const_iterator i = find(a);
- if (i == end()) return false;
- if (i->second.find(f) != i->second.end()) return true;
- edge_t *e = f->edge;
- do {
- if (i->second.find(e) != i->second.end()) return true;
- if (i->second.find(e->vert) != i->second.end()) return true;
- e = e->next;
- } while (e != f->edge);
- return false;
- }
-
- /**
- * \brief Determine whether an edge intersects another edge.
- *
- * @param e The edge.
- * @param f The face.
- *
- * @return true, if \a e and \a f intersect.
- */
- bool intersects(edge_t *e1, edge_t *e2) {
- if (intersects(e1->v1(), e2) || intersects(e1->v2(), e2) || intersects(IObj(e1), e2)) return true;
- return false;
- }
-
- /**
- * \brief Determine whether an edge intersects a face.
- *
- * @param e The edge.
- * @param f The face.
- *
- * @return true, if \a e and \a f intersect.
- */
- bool intersects(edge_t *e, face_t *f) {
- if (intersects(e->v1(), f) || intersects(e->v2(), f) || intersects(IObj(e), f)) return true;
- return false;
- }
-
- /**
- * \brief Determine the faces intersected by an edge.
- *
- * @tparam face_set_t A collection type holding face_t *
- * @param[in] e The edge.
- * @param[out] f The resulting set of faces.
- */
- template<typename face_set_t>
- void intersectedFaces(edge_t *e, face_set_t &f) const {
- std::vector<face_t *> intersected_faces;
- std::vector<edge_t *> intersected_edges;
- std::vector<vertex_t *> intersected_vertices;
-
- collect(e, &intersected_vertices, &intersected_edges, &intersected_faces);
-
- for (unsigned i = 0; i < intersected_vertices.size(); ++i) {
- facesForVertex(intersected_vertices[i], f);
- }
- for (unsigned i = 0; i < intersected_edges.size(); ++i) {
- facesForEdge(intersected_edges[i], f);
- }
- f.insert(intersected_faces.begin(), intersected_faces.end());
- }
-
- /**
- * \brief Determine the faces intersected by a vertex.
- *
- * @tparam face_set_t A collection type holding face_t *
- * @param[in] v The vertex.
- * @param[out] f The resulting set of faces.
- */
- template<typename face_set_t>
- void intersectedFaces(vertex_t *v, face_set_t &f) const {
- std::vector<face_t *> intersected_faces;
- std::vector<edge_t *> intersected_edges;
- std::vector<vertex_t *> intersected_vertices;
-
- collect(v, &intersected_vertices, &intersected_edges, &intersected_faces);
-
- for (unsigned i = 0; i < intersected_vertices.size(); ++i) {
- facesForVertex(intersected_vertices[i], f);
- }
- for (unsigned i = 0; i < intersected_edges.size(); ++i) {
- facesForEdge(intersected_edges[i], f);
- }
- f.insert(intersected_faces.begin(), intersected_faces.end());
- }
-
- /**
- * \brief Collect the set of faces that contain all vertices in \a verts.
- *
- * @tparam vertex_set_t A collection type holding vertex_t *
- * @tparam face_set_t A collection type holding face_t *
- * @param[in] verts A set of vertices.
- * @param[out] result The resulting set of faces.
- */
- template<typename vertex_set_t, typename face_set_t>
- void commonFaces(const vertex_set_t &verts, face_set_t &result) {
-
- std::set<face_t *> ifaces, temp, out;
- typename vertex_set_t::const_iterator i = verts.begin();
- if (i == verts.end()) return;
- intersectedFaces((*i), ifaces);
- while (++i != verts.end()) {
- temp.clear();
- intersectedFaces((*i), temp);
-
- out.clear();
- std::set_intersection(temp.begin(), temp.end(),
- ifaces.begin(), ifaces.end(),
- set_inserter(out));
- ifaces.swap(out);
- }
- std::copy(ifaces.begin(), ifaces.end(), set_inserter(result));
- }
-
- void clear() {
- super::clear();
- }
-
- };
-
- }
-}