diff options
Diffstat (limited to 'source/blender/freestyle/intern/stroke/Operators.cpp')
-rw-r--r-- | source/blender/freestyle/intern/stroke/Operators.cpp | 183 |
1 files changed, 122 insertions, 61 deletions
diff --git a/source/blender/freestyle/intern/stroke/Operators.cpp b/source/blender/freestyle/intern/stroke/Operators.cpp index 0374e605ff2..329b5440fed 100644 --- a/source/blender/freestyle/intern/stroke/Operators.cpp +++ b/source/blender/freestyle/intern/stroke/Operators.cpp @@ -39,10 +39,12 @@ Operators::StrokesContainer Operators::_current_strokes_set; int Operators::select(UnaryPredicate1D &pred) { - if (!_current_set) + if (!_current_set) { return 0; - if (_current_set->empty()) + } + if (_current_set->empty()) { return 0; + } I1DContainer new_set; I1DContainer rejected; Functions1D::ChainingTimeStampF1D cts; @@ -67,8 +69,9 @@ int Operators::select(UnaryPredicate1D &pred) ++it; } if ((*itbegin)->getExactTypeName() != "ViewEdge") { - for (it = rejected.begin(); it != rejected.end(); ++it) + for (it = rejected.begin(); it != rejected.end(); ++it) { delete *it; + } } rejected.clear(); _current_set->clear(); @@ -80,8 +83,9 @@ int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, UnaryPredicate1D &pred, UnaryFunction1D_void &modifier) { - if (_current_view_edges_set.empty()) + if (_current_view_edges_set.empty()) { return 0; + } unsigned id = 0; ViewEdge *edge; @@ -90,10 +94,12 @@ int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, for (I1DContainer::iterator it_edge = _current_view_edges_set.begin(); it_edge != _current_view_edges_set.end(); ++it_edge) { - if (pred(**it_edge) < 0) + if (pred(**it_edge) < 0) { goto error; - if (pred.result) + } + if (pred.result) { continue; + } edge = dynamic_cast<ViewEdge *>(*it_edge); it.setBegin(edge); @@ -108,14 +114,16 @@ int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, goto error; } ++it; - if (it.isEnd()) + if (it.isEnd()) { break; + } if (pred(**it) < 0) { delete new_chain; goto error; } - if (pred.result) + if (pred.result) { break; + } } new_chains_set.push_back(new_chain); } @@ -139,8 +147,9 @@ error: int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, UnaryPredicate1D &pred) { - if (_current_view_edges_set.empty()) + if (_current_view_edges_set.empty()) { return 0; + } unsigned id = 0; Functions1D::IncrementChainingTimeStampF1D ts; @@ -151,14 +160,18 @@ int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, UnaryPredicate1D &p for (I1DContainer::iterator it_edge = _current_view_edges_set.begin(); it_edge != _current_view_edges_set.end(); ++it_edge) { - if (pred(**it_edge) < 0) + if (pred(**it_edge) < 0) { goto error; - if (pred.result) + } + if (pred.result) { continue; - if (pred_ts(**it_edge) < 0) + } + if (pred_ts(**it_edge) < 0) { goto error; - if (pred_ts.result) + } + if (pred_ts.result) { continue; + } edge = dynamic_cast<ViewEdge *>(*it_edge); it.setBegin(edge); @@ -170,20 +183,23 @@ int Operators::chain(ViewEdgeInternal::ViewEdgeIterator &it, UnaryPredicate1D &p new_chain->push_viewedge_back(*it, it.getOrientation()); ts(**it); ++it; - if (it.isEnd()) + if (it.isEnd()) { break; + } if (pred(**it) < 0) { delete new_chain; goto error; } - if (pred.result) + if (pred.result) { break; + } if (pred_ts(**it) < 0) { delete new_chain; goto error; } - if (pred_ts.result) + if (pred_ts.result) { break; + } } new_chains_set.push_back(new_chain); } @@ -306,8 +322,9 @@ void Operators::bidirectionalChain(ViewEdgeIterator &it, UnaryPredicate1D &pred) int Operators::bidirectionalChain(ChainingIterator &it, UnaryPredicate1D &pred) { - if (_current_view_edges_set.empty()) + if (_current_view_edges_set.empty()) { return 0; + } unsigned id = 0; Functions1D::IncrementChainingTimeStampF1D ts; @@ -318,22 +335,27 @@ int Operators::bidirectionalChain(ChainingIterator &it, UnaryPredicate1D &pred) for (I1DContainer::iterator it_edge = _current_view_edges_set.begin(); it_edge != _current_view_edges_set.end(); ++it_edge) { - if (pred(**it_edge) < 0) + if (pred(**it_edge) < 0) { goto error; - if (pred.result) + } + if (pred.result) { continue; - if (pred_ts(**it_edge) < 0) + } + if (pred_ts(**it_edge) < 0) { goto error; - if (pred_ts.result) + } + if (pred_ts.result) { continue; + } edge = dynamic_cast<ViewEdge *>(*it_edge); // re-init iterator it.setBegin(edge); it.setCurrentEdge(edge); it.setOrientation(true); - if (it.init() < 0) + if (it.init() < 0) { goto error; + } Chain *new_chain = new Chain(id); ++id; @@ -348,14 +370,16 @@ int Operators::bidirectionalChain(ChainingIterator &it, UnaryPredicate1D &pred) delete new_chain; goto error; } - if (it.isEnd()) + if (it.isEnd()) { break; + } if (pred(**it) < 0) { delete new_chain; goto error; } - if (pred.result) + if (pred.result) { break; + } } it.setBegin(edge); it.setCurrentEdge(edge); @@ -369,8 +393,9 @@ int Operators::bidirectionalChain(ChainingIterator &it, UnaryPredicate1D &pred) delete new_chain; goto error; } - if (pred.result) + if (pred.result) { break; + } new_chain->push_viewedge_front(*it, it.getOrientation()); ts(**it); if (it.decrement() < 0) { @@ -400,8 +425,9 @@ error: int Operators::bidirectionalChain(ChainingIterator &it) { - if (_current_view_edges_set.empty()) + if (_current_view_edges_set.empty()) { return 0; + } unsigned id = 0; Functions1D::IncrementChainingTimeStampF1D ts; @@ -412,18 +438,21 @@ int Operators::bidirectionalChain(ChainingIterator &it) for (I1DContainer::iterator it_edge = _current_view_edges_set.begin(); it_edge != _current_view_edges_set.end(); ++it_edge) { - if (pred_ts(**it_edge) < 0) + if (pred_ts(**it_edge) < 0) { goto error; - if (pred_ts.result) + } + if (pred_ts.result) { continue; + } edge = dynamic_cast<ViewEdge *>(*it_edge); // re-init iterator it.setBegin(edge); it.setCurrentEdge(edge); it.setOrientation(true); - if (it.init() < 0) + if (it.init() < 0) { goto error; + } Chain *new_chain = new Chain(id); ++id; @@ -541,8 +570,9 @@ int Operators::sequentialSplit(UnaryPredicate0D &pred, float sampling) #endif splitted_chains.clear(); - if (!_current_chains_set.empty()) + if (!_current_chains_set.empty()) { _current_set = &_current_chains_set; + } return 0; error: @@ -592,8 +622,9 @@ int Operators::sequentialSplit(UnaryPredicate0D &startingPred, point = dynamic_cast<CurvePoint *>(&(*itStop)); new_curve->push_vertex_back(point); ++itStop; - if (itStop == end) + if (itStop == end) { break; + } if (stoppingPred(itStop) < 0) { delete new_curve; goto error; @@ -612,10 +643,12 @@ int Operators::sequentialSplit(UnaryPredicate0D &startingPred, // find next start do { ++itStart; - if (itStart == end) + if (itStart == end) { break; - if (startingPred(itStart) < 0) + } + if (startingPred(itStart) < 0) { goto error; + } } while (!startingPred.result); } while ((itStart != end) && (itStart != last)); } @@ -639,8 +672,9 @@ int Operators::sequentialSplit(UnaryPredicate0D &startingPred, #endif splitted_chains.clear(); - if (!_current_chains_set.empty()) + if (!_current_chains_set.empty()) { _current_set = &_current_chains_set; + } return 0; error: @@ -681,8 +715,9 @@ static int __recursiveSplit(Chain *_curve, bool bsplit = false; for (; ((it != end) && (next != end)); ++it, ++next) { it0d = it.castToInterface0DIterator(); - if (func(it0d) < 0) + if (func(it0d) < 0) { return -1; + } if (func.result < _min) { _min = func.result; split = it; @@ -734,8 +769,9 @@ static int __recursiveSplit(Chain *_curve, new_curve_a->push_vertex_back(&(*split)); new_curve_b->push_vertex_back(&(*split)); - for (vit = vnext; vit != vitend; ++vit) + for (vit = vnext; vit != vitend; ++vit) { new_curve_b->push_vertex_back(&(*vit)); + } // let's check whether one or two of the two new curves satisfy the stopping condition or not. // (if one of them satisfies it, we don't split) @@ -774,11 +810,13 @@ int Operators::recursiveSplit(UnaryFunction0D<double> &func, I1DContainer::iterator cit = _current_chains_set.begin(), citend = _current_chains_set.end(); for (; cit != citend; ++cit) { currentChain = dynamic_cast<Chain *>(*cit); - if (!currentChain) + if (!currentChain) { continue; + } // let's check the first one: - if (pred(*currentChain) < 0) + if (pred(*currentChain) < 0) { return -1; + } if (!pred.result) { __recursiveSplit(currentChain, func, pred, sampling, newChains, splitted_chains); } @@ -808,8 +846,9 @@ int Operators::recursiveSplit(UnaryFunction0D<double> &func, #endif newChains.clear(); - if (!_current_chains_set.empty()) + if (!_current_chains_set.empty()) { _current_set = &_current_chains_set; + } return 0; } @@ -850,12 +889,15 @@ static int __recursiveSplit(Chain *_curve, for (; ((it != end) && (next != end)); ++it, ++next) { ++count; it0d = it.castToInterface0DIterator(); - if (pred0d(it0d) < 0) + if (pred0d(it0d) < 0) { return -1; - if (!pred0d.result) + } + if (!pred0d.result) { continue; - if (func(it0d) < 0) + } + if (func(it0d) < 0) { return -1; + } mean += func.result; if (func.result < _min) { _min = func.result; @@ -910,8 +952,9 @@ static int __recursiveSplit(Chain *_curve, new_curve_a->push_vertex_back(&(*split)); new_curve_b->push_vertex_back(&(*split)); - for (vit = vnext; vit != vitend; ++vit) + for (vit = vnext; vit != vitend; ++vit) { new_curve_b->push_vertex_back(&(*vit)); + } // let's check whether one or two of the two new curves satisfy the stopping condition or not. // (if one of them satisfies it, we don't split) @@ -951,11 +994,13 @@ int Operators::recursiveSplit(UnaryFunction0D<double> &func, I1DContainer::iterator cit = _current_chains_set.begin(), citend = _current_chains_set.end(); for (; cit != citend; ++cit) { currentChain = dynamic_cast<Chain *>(*cit); - if (!currentChain) + if (!currentChain) { continue; + } // let's check the first one: - if (pred(*currentChain) < 0) + if (pred(*currentChain) < 0) { return -1; + } if (!pred.result) { __recursiveSplit(currentChain, func, pred0d, pred, sampling, newChains, splitted_chains); } @@ -985,8 +1030,9 @@ int Operators::recursiveSplit(UnaryFunction0D<double> &func, #endif newChains.clear(); - if (!_current_chains_set.empty()) + if (!_current_chains_set.empty()) { _current_set = &_current_chains_set; + } return 0; } @@ -1000,10 +1046,12 @@ class PredicateWrapper { inline bool operator()(Interface1D *i1, Interface1D *i2) { - if (i1 == i2) + if (i1 == i2) { return false; - if ((*_pred)(*i1, *i2) < 0) + } + if ((*_pred)(*i1, *i2) < 0) { throw std::runtime_error("comparison failed"); + } return _pred->result; } @@ -1013,8 +1061,9 @@ class PredicateWrapper { int Operators::sort(BinaryPredicate1D &pred) { - if (!_current_set) + if (!_current_set) { return 0; + } PredicateWrapper wrapper(pred); try { std::sort(_current_set->begin(), _current_set->end(), wrapper); @@ -1059,8 +1108,9 @@ static Stroke *createStroke(Interface1D &inter) current = stroke_vertex->getPoint2D(); Vec2r vec_tmp(current - previous); real dist = vec_tmp.norm(); - if (dist < 1.0e-6) + if (dist < 1.0e-6) { hasSingularity = true; + } currentCurvilignAbscissa += dist; stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa); stroke->push_back(stroke_vertex); @@ -1073,10 +1123,12 @@ static Stroke *createStroke(Interface1D &inter) cp = dynamic_cast<CurvePoint *>(&(*it)); if (!cp) { sv = dynamic_cast<SVertex *>(&(*it)); - if (!sv) + if (!sv) { cerr << "Warning: unexpected Vertex type" << endl; - else + } + else { stroke_vertex = new StrokeVertex(sv); + } } else { stroke_vertex = new StrokeVertex(cp); @@ -1084,8 +1136,9 @@ static Stroke *createStroke(Interface1D &inter) current = stroke_vertex->getPoint2D(); Vec2r vec_tmp(current - previous); real dist = vec_tmp.norm(); - if (dist < 1.0e-6) + if (dist < 1.0e-6) { hasSingularity = true; + } currentCurvilignAbscissa += dist; stroke_vertex->setCurvilinearAbscissa(currentCurvilignAbscissa); stroke->push_back(stroke_vertex); @@ -1108,8 +1161,9 @@ static Stroke *createStroke(Interface1D &inter) next = (*vnext).getPoint(); if ((next - current).norm() < 1.0e-6) { StrokeInternal::StrokeVertexIterator vprevious = v; - if (!vprevious.isBegin()) + if (!vprevious.isBegin()) { --vprevious; + } // collect a set of overlapping vertices std::vector<StrokeVertex *> overlapping_vertices; @@ -1119,8 +1173,9 @@ static Stroke *createStroke(Interface1D &inter) current = next; ++v; ++vnext; - if (vnext.isEnd()) + if (vnext.isEnd()) { break; + } next = (*vnext).getPoint(); } while ((next - current).norm() < 1.0e-6); @@ -1167,8 +1222,9 @@ static Stroke *createStroke(Interface1D &inter) } } - if (vnext.isEnd()) + if (vnext.isEnd()) { break; + } } ++v; ++vnext; @@ -1218,10 +1274,12 @@ int Operators::create(UnaryPredicate1D &pred, vector<StrokeShader *> shaders) StrokesContainer new_strokes_set; for (Operators::I1DContainer::iterator it = _current_set->begin(); it != _current_set->end(); ++it) { - if (pred(**it) < 0) + if (pred(**it) < 0) { goto error; - if (!pred.result) + } + if (!pred.result) { continue; + } Stroke *stroke = createStroke(**it); if (stroke) { @@ -1259,20 +1317,23 @@ void Operators::reset(bool removeStrokes) } _current_view_edges_set.clear(); for (I1DContainer::iterator it = _current_chains_set.begin(); it != _current_chains_set.end(); - ++it) + ++it) { delete *it; + } _current_chains_set.clear(); ViewMap::viewedges_container &vedges = vm->ViewEdges(); ViewMap::viewedges_container::iterator ve = vedges.begin(), veend = vedges.end(); for (; ve != veend; ++ve) { - if ((*ve)->getLength2D() < M_EPSILON) + if ((*ve)->getLength2D() < M_EPSILON) { continue; + } _current_view_edges_set.push_back(*ve); } _current_set = &_current_view_edges_set; - if (removeStrokes) + if (removeStrokes) { _current_strokes_set.clear(); + } } } /* namespace Freestyle */ |