summaryrefslogtreecommitdiff
path: root/src/csgterm.cc
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2011-12-26 18:15:51 (GMT)
committerMarius Kintel <marius@kintel.net>2011-12-26 18:15:51 (GMT)
commitbc3454f369a21cd689f42f5e9ec5cb316f9ebdd5 (patch)
tree9794056684d42b7dd4b955160c6e83fa694e0729 /src/csgterm.cc
parent9e6cc9cebbfd5007a5fa9afabf57476676357193 (diff)
Refactored normalization into a separate class, hard-limited normalization to stop at 5000 nodes to keep from normalizing 'forever'
Diffstat (limited to 'src/csgterm.cc')
-rw-r--r--src/csgterm.cc121
1 files changed, 0 insertions, 121 deletions
diff --git a/src/csgterm.cc b/src/csgterm.cc
index 56fcbb5..b368072 100644
--- a/src/csgterm.cc
+++ b/src/csgterm.cc
@@ -140,127 +140,6 @@ void CSGTerm::initBoundingBox()
}
}
-shared_ptr<CSGTerm> CSGTerm::normalize(shared_ptr<CSGTerm> term)
-{
- // This function implements the CSG normalization
- // Reference:
- // Goldfeather, J., Molnar, S., Turk, G., and Fuchs, H. Near
- // Realtime CSG Rendering Using Tree Normalization and Geometric
- // Pruning. IEEE Computer Graphics and Applications, 9(3):20-28,
- // 1989.
- // http://www.cc.gatech.edu/~turk/my_papers/pxpl_csg.pdf
-
- if (term->type == TYPE_PRIMITIVE) {
- return term;
- }
-
- do {
- while (term && normalize_tail(term)) { }
- if (!term || term->type == TYPE_PRIMITIVE) return term;
- term->left = normalize(term->left);
- } while (term->type != TYPE_UNION &&
- (term->right->type != TYPE_PRIMITIVE || term->left->type == TYPE_UNION));
- term->right = normalize(term->right);
-
- // FIXME: Do we need to take into account any transformation of item here?
- if (!term->right) {
- if (term->type == TYPE_UNION || term->type == TYPE_DIFFERENCE) return term->left;
- else return term->right;
- }
- if (!term->left) {
- if (term->type == TYPE_UNION) return term->right;
- else return term->left;
- }
-
- return term;
-}
-
-bool CSGTerm::normalize_tail(shared_ptr<CSGTerm> &term)
-{
- if (term->type == TYPE_UNION || term->type == TYPE_PRIMITIVE) return false;
-
- // Part A: The 'x . (y . z)' expressions
-
- shared_ptr<CSGTerm> x = term->left;
- shared_ptr<CSGTerm> y = term->right->left;
- shared_ptr<CSGTerm> z = term->right->right;
-
- shared_ptr<CSGTerm> result = term;
-
- // 1. x - (y + z) -> (x - y) - z
- if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_UNION) {
- term = createCSGTerm(TYPE_DIFFERENCE,
- createCSGTerm(TYPE_DIFFERENCE, x, y),
- z);
- return true;
- }
- // 2. x * (y + z) -> (x * y) + (x * z)
- else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_UNION) {
- term = createCSGTerm(TYPE_UNION,
- createCSGTerm(TYPE_INTERSECTION, x, y),
- createCSGTerm(TYPE_INTERSECTION, x, z));
- return true;
- }
- // 3. x - (y * z) -> (x - y) + (x - z)
- else if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_INTERSECTION) {
- term = createCSGTerm(TYPE_UNION,
- createCSGTerm(TYPE_DIFFERENCE, x, y),
- createCSGTerm(TYPE_DIFFERENCE, x, z));
- return true;
- }
- // 4. x * (y * z) -> (x * y) * z
- else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_INTERSECTION) {
- term = createCSGTerm(TYPE_INTERSECTION,
- createCSGTerm(TYPE_INTERSECTION, x, y),
- z);
- return true;
- }
- // 5. x - (y - z) -> (x - y) + (x * z)
- else if (term->type == TYPE_DIFFERENCE && term->right->type == TYPE_DIFFERENCE) {
- term = createCSGTerm(TYPE_UNION,
- createCSGTerm(TYPE_DIFFERENCE, x, y),
- createCSGTerm(TYPE_INTERSECTION, x, z));
- return true;
- }
- // 6. x * (y - z) -> (x * y) - z
- else if (term->type == TYPE_INTERSECTION && term->right->type == TYPE_DIFFERENCE) {
- term = createCSGTerm(TYPE_DIFFERENCE,
- createCSGTerm(TYPE_INTERSECTION, x, y),
- z);
- return true;
- }
-
- // Part B: The '(x . y) . z' expressions
-
- x = term->left->left;
- y = term->left->right;
- z = term->right;
-
- // 7. (x - y) * z -> (x * z) - y
- if (term->left->type == TYPE_DIFFERENCE && term->type == TYPE_INTERSECTION) {
- term = createCSGTerm(TYPE_DIFFERENCE,
- createCSGTerm(TYPE_INTERSECTION, x, z),
- y);
- return true;
- }
- // 8. (x + y) - z -> (x - z) + (y - z)
- else if (term->left->type == TYPE_UNION && term->type == TYPE_DIFFERENCE) {
- term = createCSGTerm(TYPE_UNION,
- createCSGTerm(TYPE_DIFFERENCE, x, z),
- createCSGTerm(TYPE_DIFFERENCE, y, z));
- return true;
- }
- // 9. (x + y) * z -> (x * z) + (y * z)
- else if (term->left->type == TYPE_UNION && term->type == TYPE_INTERSECTION) {
- term = createCSGTerm(TYPE_UNION,
- createCSGTerm(TYPE_INTERSECTION, x, z),
- createCSGTerm(TYPE_INTERSECTION, y, z));
- return true;
- }
-
- return false;
-}
-
std::string CSGTerm::dump()
{
std::stringstream dump;
contact: Jan Huwald // Impressum