Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsource/blender/freestyle/intern/application/Controller.cpp17
-rwxr-xr-xsource/blender/freestyle/intern/application/Controller.h4
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h6
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp4
-rw-r--r--source/blender/freestyle/intern/system/RenderMonitor.h47
-rwxr-xr-xsource/blender/freestyle/intern/view_map/FEdgeXDetector.cpp2
-rwxr-xr-xsource/blender/freestyle/intern/view_map/FEdgeXDetector.h5
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewMapBuilder.cpp45
-rwxr-xr-xsource/blender/freestyle/intern/view_map/ViewMapBuilder.h4
-rwxr-xr-xsource/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp2
-rwxr-xr-xsource/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp2
-rwxr-xr-xsource/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h8
13 files changed, 142 insertions, 6 deletions
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<AppCanvas *>(_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 <float.h>
# 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<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:
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,