diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-07-17 03:29:12 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-07-17 03:29:12 +0400 |
commit | 5a581c1fd116c51df13e09c5c320feba48d069bb (patch) | |
tree | 91df14a7a43b19af4ecac736460cbbd8c1b1e291 /source/blender/freestyle/intern/view_map | |
parent | 9d2a957a0d440b07d1a5e9e0ee5fb613d93637d9 (diff) |
Better handling of the ESC key during Freestyle rendering.
This commit is meant to improve the response of the ESC key for stopping Freestyle rendering
throughout the rendering process. The rendering with Freestyle consists of several steps
including: (1) mesh data loading, (2) winged edge construction, (3) silhouette edge detection,
(4) view map construction, and (5) stroke drawing. All these steps have been extended to
frequently check if the ESC key is pressed, so that users can abort time-consuming rendering
at any point of time.
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: |