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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to