diff options
Diffstat (limited to 'source/blender/freestyle/intern/view_map')
4 files changed, 50 insertions, 6 deletions
diff --git a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp index 1cbed8a87c6..1d52f37236e 100755 --- a/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp +++ b/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp @@ -42,6 +42,8 @@ void FEdgeXDetector::processShapes(WingedEdge& we) { for(vector<WShape*>::const_iterator it = wshapes.begin(); it != wshapes.end(); it++){ + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; wxs = dynamic_cast<WXShape*>(*it); wxs->bbox(Min, Max); _bbox_diagonal = (Max-Min).norm(); diff --git a/source/blender/freestyle/intern/view_map/FEdgeXDetector.h b/source/blender/freestyle/intern/view_map/FEdgeXDetector.h index d73a086f81d..2fd6a4a1e8f 100755 --- a/source/blender/freestyle/intern/view_map/FEdgeXDetector.h +++ b/source/blender/freestyle/intern/view_map/FEdgeXDetector.h @@ -38,6 +38,7 @@ # include "../winged_edge/WXEdge.h" # include "../winged_edge/Curvature.h" # include "../system/ProgressBar.h" +# include "../system/RenderMonitor.h" using namespace Geometry; @@ -50,6 +51,7 @@ public: FEdgeXDetector() { _pProgressBar = 0; + _pRenderMonitor = 0; _computeViewIndependant = true; _bbox_diagonal = 1.0; _meanEdgeSize = 0; @@ -165,6 +167,8 @@ public: inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;} + inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;} + protected: Vec3r _Viewpoint; @@ -193,6 +197,7 @@ protected: real _kr_derivative_epsilon; ProgressBar *_pProgressBar; + RenderMonitor *_pRenderMonitor; }; #endif // FEDGEDXETECTOR_H diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp index 242b769e8b5..d503daa3696 100755 --- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp +++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp @@ -378,7 +378,7 @@ cout << "\t\tIs occluder" << endl; // a QI of 22 because 3 out of 6 occluders have QI <= 22. template <typename G, typename I> -static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon) +static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor) { vector<ViewEdge*>& vedges = ioViewMap->ViewEdges(); @@ -391,6 +391,8 @@ static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilo unsigned maxIndex, maxCard; unsigned qiMajority; for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) { + if (iRenderMonitor && iRenderMonitor->testBreak()) + break; #if logging > 0 cout << "Processing ViewEdge " << (*ve)->getId() << endl; #endif @@ -538,7 +540,7 @@ cout << "\tConclusion: QI = " << maxIndex << ", " << (*ve)->occluders_size() << } template <typename G, typename I> -static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon) +static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor) { vector<ViewEdge*>& vedges = ioViewMap->ViewEdges(); @@ -551,6 +553,8 @@ static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon) unsigned maxIndex, maxCard; unsigned qiMajority; for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) { + if (iRenderMonitor && iRenderMonitor->testBreak()) + break; #if logging > 0 cout << "Processing ViewEdge " << (*ve)->getId() << endl; #endif @@ -1115,6 +1119,9 @@ void ViewMapBuilder::computeInitialViewEdges(WingedEdge& we) for (vector<WShape*>::const_iterator it = wshapes.begin(); it != wshapes.end(); it++) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; + // create the embedding psShape = new SShape; psShape->setId((*it)->GetId()); @@ -1151,6 +1158,8 @@ void ViewMapBuilder::computeCusps(ViewMap *ioViewMap){ for(; ve!=veend; ++ve){ + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; if((!((*ve)->getNature() & Nature::SILHOUETTE)) || (!((*ve)->fedgeA()->isSmooth()))) continue; FEdge *fe = (*ve)->fedgeA(); @@ -1236,10 +1245,10 @@ void ViewMapBuilder::ComputeCumulativeVisibility(ViewMap *ioViewMap, if ( _orthographicProjection ) { BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeCumulativeVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon); + computeCumulativeVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor); } else { SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeCumulativeVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon); + computeCumulativeVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor); } } @@ -1265,10 +1274,10 @@ void ViewMapBuilder::ComputeDetailedVisibility(ViewMap *ioViewMap, if ( _orthographicProjection ) { BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeDetailedVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon); + computeDetailedVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor); } else { SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeDetailedVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon); + computeDetailedVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor); } } @@ -1378,6 +1387,8 @@ void ViewMapBuilder::ComputeRayCastingVisibility(ViewMap *ioViewMap, real epsilo ve!=veend; ve++) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; #if logging > 0 cout << "Processing ViewEdge " << (*ve)->getId() << endl; #endif @@ -1525,6 +1536,9 @@ void ViewMapBuilder::ComputeFastRayCastingVisibility(ViewMap *ioViewMap, real ep ve!=veend; ve++) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; + festart = (*ve)->fedgeA(); fe = (*ve)->fedgeA(); qiMajority = 1; @@ -1653,6 +1667,9 @@ void ViewMapBuilder::ComputeVeryFastRayCastingVisibility(ViewMap *ioViewMap, rea ve!=veend; ve++) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; + set<ViewShape*> occluders; fe = (*ve)->fedgeA(); @@ -2136,6 +2153,9 @@ void ViewMapBuilder::ComputeSweepLineIntersections(ViewMap *ioViewMap, real epsi sv!=svend; sv++) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; + const vector<FEdge*>& vedges = (*sv)->fedges(); for(vector<FEdge*>::const_iterator sve=vedges.begin(), sveend=vedges.end(); @@ -2159,6 +2179,19 @@ void ViewMapBuilder::ComputeSweepLineIntersections(ViewMap *ioViewMap, real epsi vsegments.clear(); } + if (_pRenderMonitor && _pRenderMonitor->testBreak()) { + // delete segments + if(!segments.empty()){ + vector<segment* >::iterator s, send; + for(s=segments.begin(),send=segments.end(); + s!=send; + s++){ + delete *s; + } + } + return; + } + // reset userdata: for(fe=ioEdges.begin(), fend=ioEdges.end(); fe!=fend; diff --git a/source/blender/freestyle/intern/view_map/ViewMapBuilder.h b/source/blender/freestyle/intern/view_map/ViewMapBuilder.h index 2e37a41df3c..a41df92062e 100755 --- a/source/blender/freestyle/intern/view_map/ViewMapBuilder.h +++ b/source/blender/freestyle/intern/view_map/ViewMapBuilder.h @@ -40,6 +40,7 @@ # include "../geometry/GeomUtils.h" # include "../geometry/Grid.h" # include "../system/ProgressBar.h" +# include "../system/RenderMonitor.h" # include "../geometry/SweepLine.h" # include "ViewMap.h" # include "SilhouetteGeomEngine.h" @@ -58,6 +59,7 @@ private: ViewMap * _ViewMap; // result //SilhouetteGeomEngine _GeomEngine; ProgressBar *_pProgressBar; + RenderMonitor *_pRenderMonitor; Vec3r _viewpoint; bool _orthographicProjection; Grid* _Grid; @@ -91,6 +93,7 @@ public: inline ViewMapBuilder() { _pProgressBar = 0; + _pRenderMonitor = 0; _Grid = 0; _currentId = 1; _currentFId = 0; @@ -185,6 +188,7 @@ public: /*! Modifiers */ inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;} + inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;} inline void setEnableQI(bool iBool) {_EnableQI = iBool;} protected: |