diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index eb27ab62340..d7f91d3d7c2 100755 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -93,6 +93,7 @@ Controller::Controller() _winged_edge = NULL; _pView = NULL; + _pRenderMonitor = NULL; _edgeTesselationNature = (Nature::SILHOUETTE | Nature::BORDER | Nature::CREASE); @@ -181,6 +182,11 @@ void Controller::setView(AppView *iView) _Canvas->setViewer(_pView); } +void Controller::setRenderMonitor(RenderMonitor *iRenderMonitor) +{ + _pRenderMonitor = iRenderMonitor; +} + void Controller::setPassDiffuse(float *buf, int width, int height) { AppCanvas *app_canvas = dynamic_cast(_Canvas); @@ -206,6 +212,8 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer* srl) { BlenderFileLoader loader(re, srl); + + loader.setRenderMonitor(_pRenderMonitor); _Chrono.start(); @@ -242,11 +250,15 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer* srl) _pView->setModel(_RootNode); //_pView->FitBBox(); + if (_pRenderMonitor->testBreak()) + return 0; + _Chrono.start(); WXEdgeBuilder wx_builder; + wx_builder.setRenderMonitor(_pRenderMonitor); blenderScene->accept(wx_builder); _winged_edge = wx_builder.getWingedEdge(); @@ -465,11 +477,15 @@ void Controller::ComputeViewMap() edgeDetector.setCreaseAngle(_creaseAngle); edgeDetector.setSphereRadius(_sphereRadius); edgeDetector.setSuggestiveContourKrDerivativeEpsilon(_suggestiveContourKrDerivativeEpsilon); + edgeDetector.setRenderMonitor(_pRenderMonitor); edgeDetector.processShapes(*_winged_edge); real duration = _Chrono.stop(); printf("Feature lines : %lf\n", duration); + if (_pRenderMonitor->testBreak()) + return; + // Builds the view map structure from the flagged WSEdge structure: //---------------------------------------------------------- ViewMapBuilder vmBuilder; @@ -478,6 +494,7 @@ void Controller::ComputeViewMap() vmBuilder.setTransform( mv, proj,viewport, _pView->GetFocalLength(), _pView->GetAspect(), _pView->GetFovyRadian()); vmBuilder.setFrustum(_pView->znear(), _pView->zfar()); vmBuilder.setGrid(&_Grid); + vmBuilder.setRenderMonitor(_pRenderMonitor); // Builds a tesselated form of the silhouette for display purpose: //--------------------------------------------------------------- diff --git a/source/blender/freestyle/intern/application/Controller.h b/source/blender/freestyle/intern/application/Controller.h index 4ee79405fa9..6119e14f7b7 100755 --- a/source/blender/freestyle/intern/application/Controller.h +++ b/source/blender/freestyle/intern/application/Controller.h @@ -38,6 +38,7 @@ # include "../system/ProgressBar.h" # include "../system/Precision.h" # include "../system/Interpreter.h" +# include "../system/RenderMonitor.h" # include "../view_map/FEdgeXDetector.h" class AppView; @@ -69,6 +70,7 @@ public: ~Controller() ; void setView(AppView *iView); + void setRenderMonitor(RenderMonitor *iRenderMonitor); void setPassDiffuse(float *buf, int width, int height); void setPassZ(float *buf, int width, int height); void setContext(bContext *C); @@ -177,6 +179,8 @@ private: //Viewer2DWindow *_pView2DWindow; //Viewer2D *_pView2D; + RenderMonitor *_pRenderMonitor; + //Model // Drawing Structure NodeGroup *_RootNode; diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp index 492fbf239ad..2b2e92f57dd 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp @@ -40,6 +40,8 @@ NodeGroup* BlenderFileLoader::Load() int id = 0; for(obi= (ObjectInstanceRen *) _re->instancetable.first; obi; obi=obi->next) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; if (!(obi->lay & _srl->lay)) continue; char *name = obi->ob->id.name; diff --git a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h index 804b1eb635d..c5c06567c41 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h @@ -5,6 +5,7 @@ # include # include "../system/FreestyleConfig.h" +# include "../system/RenderMonitor.h" # include "../scene_graph/NodeGroup.h" # include "../scene_graph/NodeTransform.h" # include "../scene_graph/NodeShape.h" @@ -64,6 +65,9 @@ public: /*! Gets the smallest edge size read */ inline real minEdgeSize() {return _minEdgeSize;} + /*! Modifiers */ + inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;} + protected: void insertShapeNode(ObjectInstanceRen *obi, int id); int testDegenerateTriangle(float v1[3], float v2[3], float v3[3]); @@ -93,6 +97,8 @@ protected: float _viewplane_bottom; float _viewplane_top; float _z_near, _z_far; + + RenderMonitor *_pRenderMonitor; }; #endif // BLENDER_FILE_LOADER_H diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index fe37b89999e..5dcda3bd69c 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -462,6 +462,9 @@ extern "C" { Render* FRS_do_stroke_rendering(Render* re, SceneRenderLayer *srl) { Render* freestyle_render = NULL; + + RenderMonitor monitor(re); + controller->setRenderMonitor(&monitor); cout << "\n----------------------------------------------------------" << endl; cout << "| " << (re->scene->id.name+2) << "|" << srl->name << endl; @@ -476,6 +479,7 @@ extern "C" { if( re->test_break(re->tbh) ) { controller->CloseFile(); + cout << "Break" << endl; return NULL; } diff --git a/source/blender/freestyle/intern/system/RenderMonitor.h b/source/blender/freestyle/intern/system/RenderMonitor.h new file mode 100644 index 00000000000..7d148e65c90 --- /dev/null +++ b/source/blender/freestyle/intern/system/RenderMonitor.h @@ -0,0 +1,47 @@ +// +// Copyright (C) : Please refer to the COPYRIGHT file distributed +// with this source distribution. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef RENDERMONITOR_H +#define RENDERMONITOR_H + +extern "C" { +#include "render_types.h" +} + +class RenderMonitor +{ +public: + + inline RenderMonitor(Render *re) { + _re = re; + } + + virtual ~RenderMonitor() {} + + inline bool testBreak() { + return _re && _re->test_break(_re->tbh); + } + +protected: + + Render *_re; +}; + +#endif // RENDERMONITOR_H 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::const_iterator it = wshapes.begin(); it != wshapes.end(); it++){ + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + break; wxs = dynamic_cast(*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 -static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon) +static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor) { vector& vedges = ioViewMap->ViewEdges(); @@ -391,6 +391,8 @@ static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilo unsigned maxIndex, maxCard; unsigned qiMajority; for(vector::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 -static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon) +static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor) { vector& vedges = ioViewMap->ViewEdges(); @@ -551,6 +553,8 @@ static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon) unsigned maxIndex, maxCard; unsigned qiMajority; for(vector::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::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(ioViewMap, grid, epsilon); + computeCumulativeVisibility(ioViewMap, grid, epsilon, _pRenderMonitor); } else { SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeCumulativeVisibility(ioViewMap, grid, epsilon); + computeCumulativeVisibility(ioViewMap, grid, epsilon, _pRenderMonitor); } } @@ -1265,10 +1274,10 @@ void ViewMapBuilder::ComputeDetailedVisibility(ViewMap *ioViewMap, if ( _orthographicProjection ) { BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeDetailedVisibility(ioViewMap, grid, epsilon); + computeDetailedVisibility(ioViewMap, grid, epsilon, _pRenderMonitor); } else { SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); - computeDetailedVisibility(ioViewMap, grid, epsilon); + computeDetailedVisibility(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 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& vedges = (*sv)->fedges(); for(vector::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::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: diff --git a/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp b/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp index 80e06fc2b7b..b29f0c7e9ee 100755 --- a/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp +++ b/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp @@ -23,6 +23,8 @@ void WXEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + return; WXShape *shape = new WXShape; buildWShape(*shape, ifs); shape->setId(ifs.getId().getFirst()); diff --git a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp index 40c14eafe72..e56ac0f9c42 100755 --- a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp +++ b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp @@ -26,6 +26,8 @@ using namespace std; void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) { + if (_pRenderMonitor && _pRenderMonitor->testBreak()) + return; WShape *shape = new WShape; buildWShape(*shape, ifs); shape->setId(ifs.getId().getFirst()); diff --git a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h index 8e9d0122e35..972d67355d2 100755 --- a/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h +++ b/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h @@ -33,6 +33,7 @@ # define WINGED_EDGE_BUILDER_H # include "../system/FreestyleConfig.h" +# include "../system/RenderMonitor.h" # include "../scene_graph/SceneVisitor.h" # include "WEdge.h" # include "../scene_graph/IndexedFaceSet.h" @@ -47,6 +48,7 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor _current_frs_material = NULL; _current_matrix = NULL; _winged_edge = new WingedEdge; // Not deleted by the destructor + _pRenderMonitor = NULL; } virtual ~WingedEdgeBuilder() { @@ -101,6 +103,10 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor // _current_matrix = matrix; // } + inline void setRenderMonitor(RenderMonitor *iRenderMonitor) { + _pRenderMonitor = iRenderMonitor; + } + protected: virtual void buildWShape(WShape& shape, IndexedFaceSet& ifs); @@ -108,6 +114,8 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor const real *vertices, unsigned vsize); + RenderMonitor *_pRenderMonitor; + private: void buildTriangleStrip(const real *vertices,