[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48989] branches/soc-2008-mxcurioni/source /blender/freestyle/intern: Better handling of the ESC key during Freestyle rendering.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Tue Jul 17 01:29:12 CEST 2012


Revision: 48989
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48989
Author:   kjym3
Date:     2012-07-16 23:29:12 +0000 (Mon, 16 Jul 2012)
Log Message:
-----------
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.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/ViewMapBuilder.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/winged_edge/WXEdgeBuilder.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/winged_edge/WingedEdgeBuilder.h

Added Paths:
-----------
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/system/RenderMonitor.h

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp	2012-07-16 23:29:12 UTC (rev 48989)
@@ -93,6 +93,7 @@
   _winged_edge = NULL;
   
   _pView = NULL;
+  _pRenderMonitor = NULL;
 
   _edgeTesselationNature = (Nature::SILHOUETTE | Nature::BORDER | Nature::CREASE);
 
@@ -181,6 +182,11 @@
   _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 @@
 {
   
   BlenderFileLoader loader(re, srl);
+
+  loader.setRenderMonitor(_pRenderMonitor);
   
   _Chrono.start();
   
@@ -242,11 +250,15 @@
   _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 @@
   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 @@
   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:
   //---------------------------------------------------------------

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h	2012-07-16 23:29:12 UTC (rev 48989)
@@ -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 @@
   ~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 @@
   //Viewer2DWindow *_pView2DWindow;
   //Viewer2D *_pView2D;
   
+  RenderMonitor *_pRenderMonitor;
+
   //Model
   // Drawing Structure
   NodeGroup *_RootNode;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp	2012-07-16 23:29:12 UTC (rev 48989)
@@ -40,6 +40,8 @@
 
 	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;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderFileLoader.h	2012-07-16 23:29:12 UTC (rev 48989)
@@ -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 @@
   /*! 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 @@
 	float _viewplane_bottom;
 	float _viewplane_top;
 	float _z_near, _z_far;
+
+	RenderMonitor *_pRenderMonitor;
 };
 
 #endif // BLENDER_FILE_LOADER_H

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2012-07-16 23:29:12 UTC (rev 48989)
@@ -462,6 +462,9 @@
 	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 @@
 
         if( re->test_break(re->tbh) ) {
 			controller->CloseFile();
+			cout << "Break" << endl;
             return NULL;
         }
 

Added: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/system/RenderMonitor.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/system/RenderMonitor.h	                        (rev 0)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/system/RenderMonitor.h	2012-07-16 23:29:12 UTC (rev 48989)
@@ -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

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.cpp	2012-07-16 23:29:12 UTC (rev 48989)
@@ -42,6 +42,8 @@
   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();

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.h	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/FEdgeXDetector.h	2012-07-16 23:29:12 UTC (rev 48989)
@@ -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 @@
 
   FEdgeXDetector() {
     _pProgressBar = 0;
+    _pRenderMonitor = 0;
     _computeViewIndependant = true;
     _bbox_diagonal = 1.0;
     _meanEdgeSize = 0;
@@ -165,6 +167,8 @@
 
   inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;}
 
+  inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;}
+
 protected:
 
   Vec3r _Viewpoint;
@@ -193,6 +197,7 @@
   real _kr_derivative_epsilon;
 
   ProgressBar *_pProgressBar;
+  RenderMonitor *_pRenderMonitor;
 };
 
 #endif // FEDGEDXETECTOR_H

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp	2012-07-16 23:23:33 UTC (rev 48988)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/view_map/ViewMapBuilder.cpp	2012-07-16 23:29:12 UTC (rev 48989)
@@ -378,7 +378,7 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list