summaryrefslogtreecommitdiffstats
path: root/BSPTree.h
diff options
context:
space:
mode:
Diffstat (limited to 'BSPTree.h')
-rw-r--r--BSPTree.h93
1 files changed, 49 insertions, 44 deletions
diff --git a/BSPTree.h b/BSPTree.h
index 47ba411..1944ef1 100644
--- a/BSPTree.h
+++ b/BSPTree.h
@@ -1,20 +1,61 @@
+/*
+ * BSPTree.h
+ *
+ * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de>
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
#ifndef ZOOM_BSPTREE_H_
#define ZOOM_BSPTREE_H_
#include "Triangle.h"
#include <list>
#include <cmath>
+
#include <vmmlib/vector.hpp>
+#include <boost/shared_ptr.hpp>
namespace Zoom {
class BSPTree {
+ public:
+ class TriangleData {
+ protected:
+ TriangleData() {}
+
+ public:
+ virtual ~TriangleData() {}
+ };
+
+ struct TriangleRecord {
+ public:
+ TriangleRecord(Triangle triangle0, boost::shared_ptr<TriangleData> data0)
+ : triangle(triangle0), data(data0) {}
+ TriangleRecord(Triangle triangle0) : triangle(triangle0) {}
+ TriangleRecord() {}
+
+ Triangle triangle;
+ boost::shared_ptr<TriangleData> data;
+ };
+
private:
class Plane {
public:
Plane() : d(0) {}
Plane(const vmml::vec3f &n, float d0) : normal(n), d(d0) {}
- Plane(const Triangle &t) : normal(t.getNormal()), d(t.getVertex(0).dot(normal)) {}
+ Plane(const Triangle &t) : normal(t.computeNormal()), d(t.getVertex(0).dot(normal)) {}
bool contains(const vmml::vec3f &v) const {
return (fabsf(normal.dot(v) - d) < 1E-6);
@@ -62,7 +103,7 @@ class BSPTree {
}
vmml::vec3f intersection(const vmml::vec3f &p, const vmml::vec3f &dir) const;
- void partition(const Triangle &t, std::list<Triangle> *front, std::list<Triangle> *back) const;
+ void partition(const TriangleRecord &t, std::list<TriangleRecord> *front, std::list<TriangleRecord> *back) const;
private:
vmml::vec3f normal;
@@ -70,7 +111,7 @@ class BSPTree {
};
public:
- BSPTree(const std::list<Triangle> &triangles);
+ BSPTree(const std::list<TriangleRecord> &triangles);
BSPTree(const BSPTree &tree) : frontTree(0), backTree(0) {
*this = tree;
@@ -87,16 +128,6 @@ class BSPTree {
BSPTree& operator=(const BSPTree &tree);
template<typename T>
- void visit(const T& visitor, const vmml::vec3f &p) {
- doVisit<const T>(visitor, p);
- }
-
- template<typename T>
- void visit(T& visitor, const vmml::vec3f &p) {
- doVisit(visitor, p);
- }
-
- template<typename T>
void visit(const T& visitor, const vmml::vec3f &p) const {
doVisit<const T>(visitor, p);
}
@@ -108,42 +139,16 @@ class BSPTree {
private:
Plane plane;
- std::list<Triangle> triangles;
+ std::list<TriangleRecord> triangles;
BSPTree *frontTree, *backTree;
template<typename T>
- void doVisit(T& visitor, const vmml::vec3f &p) {
- if(plane.isBehind(p)) {
- if(frontTree)
- frontTree->visit(visitor, p);
-
- for(std::list<Triangle>::iterator t = triangles.begin(); t != triangles.end(); ++t) {
- visitor(*t);
- }
-
- if(backTree)
- backTree->visit(visitor, p);
- }
- else {
- if(backTree)
- backTree->visit(visitor, p);
-
- for(std::list<Triangle>::iterator t = triangles.begin(); t != triangles.end(); ++t) {
- visitor(*t);
- }
-
- if(frontTree)
- frontTree->visit(visitor, p);
- }
- }
-
- template<typename T>
void doVisit(T& visitor, const vmml::vec3f &p) const {
if(plane.isBehind(p)) {
if(frontTree)
frontTree->visit(visitor, p);
- for(std::list<Triangle>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
+ for(std::list<TriangleRecord>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
visitor(*t);
}
@@ -154,7 +159,7 @@ class BSPTree {
if(backTree)
backTree->visit(visitor, p);
- for(std::list<Triangle>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
+ for(std::list<TriangleRecord>::const_iterator t = triangles.begin(); t != triangles.end(); ++t) {
visitor(*t);
}
@@ -163,8 +168,8 @@ class BSPTree {
}
}
- static vmml::vec3f findCenter(const std::list<Triangle> &triangles);
- static const Triangle* findNearestTriangle(const std::list<Triangle> &triangles, const vmml::vec3f &v);
+ static vmml::vec3f findCenter(const std::list<TriangleRecord> &triangles);
+ static const Triangle* findNearestTriangle(const std::list<TriangleRecord> &triangles, const vmml::vec3f &v);
};
}