[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27805] branches/soc-2008-mxcurioni/source /blender: Fixed the full sample anti-aliasing support in Freestyle.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Sun Mar 28 19:46:12 CEST 2010


Revision: 27805
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27805
Author:   kjym3
Date:     2010-03-28 19:46:10 +0200 (Sun, 28 Mar 2010)

Log Message:
-----------
Fixed the full sample anti-aliasing support in Freestyle.

The render pipeline has been extended to better work with
Freestyle stroke rendering.  Struct Render has a new member
ListBase freestyle_renders to keep Render instances generated
through stroke rendering in Freestyle.  The number of
elements (LinkData instances with LinkData::data pointing to a
Render instance) in freestyle_renders is the same as the scene
render layers of the scene being rendered.  When the k-th scene
render layer has the Freestyle option enabled, the k-th element
of freestyle_renders refers to a Render instance that holds
Freestyle render results for the scene layer.  This association
between the scene render layer and the Render instance is used to
merge the Freestyle render results into the corresponding render
results for the scene render layer.

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/freestyle/FRS_freestyle.h
    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/BlenderStrokeRenderer.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
    branches/soc-2008-mxcurioni/source/blender/render/intern/include/render_types.h
    branches/soc-2008-mxcurioni/source/blender/render/intern/source/pipeline.c

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/FRS_freestyle.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/FRS_freestyle.h	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/FRS_freestyle.h	2010-03-28 17:46:10 UTC (rev 27805)
@@ -19,7 +19,10 @@
 	// Rendering
 	void FRS_initialize();
 	void FRS_set_context(bContext* C);
-	void FRS_add_Freestyle( struct Render* re);
+	int FRS_is_freestyle_enabled(struct SceneRenderLayer* srl);
+	void FRS_init_stroke_rendering(struct Render* re);
+	struct Render* FRS_do_stroke_rendering(struct Render* re, struct SceneRenderLayer* srl);
+	void FRS_composite_result(struct Render* re, struct SceneRenderLayer* srl, struct Render* freestyle_render);
 	void FRS_exit();
 	
 	// Panel configuration

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.cpp	2010-03-28 17:46:10 UTC (rev 27805)
@@ -676,8 +676,13 @@
   resetModified();
 }
 
+void Controller::ResetRenderCount()
+{
+	_render_count = 0;
+}
+
 Render* Controller::RenderStrokes(Render *re) {
-	BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer(re);
+	BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer(re, ++_render_count);
   	_Canvas->Render( blenderRenderer );
 	Render* freestyle_render = blenderRenderer->RenderScene(re);
 	delete blenderRenderer;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/application/Controller.h	2010-03-28 17:46:10 UTC (rev 27805)
@@ -85,6 +85,7 @@
   void saveSteerableViewMapImages();
   void toggleEdgeTesselationNature(Nature::EdgeNature iNature);
   void DrawStrokes();
+  void ResetRenderCount();
   Render* RenderStrokes(Render *re);
   void SwapStyleModules(unsigned i1, unsigned i2);
   void InsertStyleModule(unsigned index, const char *iFileName);
@@ -204,6 +205,7 @@
   real _EPSILON;
   real _bboxDiag;
 
+  int _render_count;
 
   //AppStyleWindow *_pStyleWindow;
   //AppOptionsWindow *_pOptionsWindow;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2010-03-28 17:46:10 UTC (rev 27805)
@@ -32,7 +32,7 @@
 #endif
 
 
-BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
+BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re, int render_count)
 :StrokeRenderer(){
 	
 	// TEMPORARY - need a  texture manager
@@ -45,7 +45,9 @@
 	objects.first = objects.last = NULL;
 	
 	ListBase lb;
-	freestyle_scene = add_scene("freestyle_strokes");
+	char name[22];
+	snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name+2);
+	freestyle_scene = add_scene(name);
 	lb = freestyle_scene->r.layers;
 	freestyle_scene->r= old_scene->r;
 	freestyle_scene->r.layers= lb;
@@ -95,9 +97,6 @@
 	    _textureManager = 0;
 	  }
 
-	// release scene
-	free_libblock( &G.main->scene, freestyle_scene );
-
 	// release objects and data blocks
 	LinkData *link = (LinkData *)objects.first;
 	while(link) {

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2010-03-28 17:46:10 UTC (rev 27805)
@@ -23,7 +23,7 @@
 class LIB_STROKE_EXPORT BlenderStrokeRenderer : public StrokeRenderer
 {
 public:
-  BlenderStrokeRenderer(Render *re);
+  BlenderStrokeRenderer(Render *re, int render_count);
   virtual ~BlenderStrokeRenderer();
 
   /*! Renders a stroke rep */

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	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2010-03-28 17:46:10 UTC (rev 27805)
@@ -185,7 +185,7 @@
 		controller->ComputeViewMap();
 	}
 	
-	void composite_result(Render* re, SceneRenderLayer* srl, Render* freestyle_render)
+	void FRS_composite_result(Render* re, SceneRenderLayer* srl, Render* freestyle_render)
 	{
 
 		RenderLayer *rl;
@@ -230,64 +230,66 @@
 		}
 		return count;
 	}
+
+	int FRS_is_freestyle_enabled(SceneRenderLayer* srl) {
+		return (!(srl->layflag & SCE_LAY_DISABLE) &&
+			 	srl->layflag & SCE_LAY_FRS &&
+				displayed_layer_count(srl) > 0);
+	}
 	
-	void FRS_add_Freestyle(Render* re) {
-		
-		SceneRenderLayer *srl;
-		Render* freestyle_render = NULL;
-		
-		// init
+	void FRS_init_stroke_rendering(Render* re) {
+
 		cout << "\n#===============================================================" << endl;
 		cout << "#  Freestyle" << endl;
 		cout << "#===============================================================" << endl;
 		
 		init_view(re);
 		init_camera(re);
-		freestyle_scene = re->scene;
+
+		controller->ResetRenderCount();
+	}
+	
+	Render* FRS_do_stroke_rendering(Render* re, SceneRenderLayer *srl) {
 		
-		for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) {
-			if( !(srl->layflag & SCE_LAY_DISABLE) &&
-			 	srl->layflag & SCE_LAY_FRS &&
-				displayed_layer_count(srl) > 0       )
-			{
-				cout << "\n----------------------------------------------------------" << endl;
-				cout << "|  " << (re->scene->id.name+2) << "|" << srl->name << endl;
-				cout << "----------------------------------------------------------" << endl;
-				
-				// prepare Freestyle:
-				//   - clear canvas
-				//   - load mesh
-				//   - add style modules
-				//   - set parameters
-				//   - compute view map
-				prepare(re, srl);
+		Render* freestyle_render = NULL;
+		
+		cout << "\n----------------------------------------------------------" << endl;
+		cout << "|  " << (re->scene->id.name+2) << "|" << srl->name << endl;
+		cout << "----------------------------------------------------------" << endl;
+		
+		// prepare Freestyle:
+		//   - clear canvas
+		//   - load mesh
+		//   - add style modules
+		//   - set parameters
+		//   - compute view map
+		prepare(re, srl);
 
-                if( re->test_break(re->tbh) ) {
-					controller->CloseFile();
-                    break;
-                }
+        if( re->test_break(re->tbh) ) {
+			controller->CloseFile();
+            return NULL;
+        }
 
-				// render and composite Freestyle result
-				if( controller->_ViewMap ) {
-					
-					// render strokes					
-                    re->i.infostr= "Freestyle: Stroke rendering";
-		            re->stats_draw(re->sdh, &re->i);
-                	re->i.infostr= NULL;
-					controller->DrawStrokes();
-					freestyle_render = controller->RenderStrokes(re);
-					controller->CloseFile();
-					
-					// composite result
-					composite_result(re, srl, freestyle_render);
-					
-					// free resources
-					RE_FreeRender(freestyle_render);
-				}
-			}
+		// render and composite Freestyle result
+		if( controller->_ViewMap ) {
+			
+			// render strokes					
+            re->i.infostr= "Freestyle: Stroke rendering";
+            re->stats_draw(re->sdh, &re->i);
+        	re->i.infostr= NULL;
+			freestyle_scene = re->scene;
+			controller->DrawStrokes();
+			freestyle_render = controller->RenderStrokes(re);
+			controller->CloseFile();
+			freestyle_scene = NULL;
+			
+			// composite result
+			FRS_composite_result(re, srl, freestyle_render);
+			RE_FreeRenderResult(freestyle_render->result);
+			freestyle_render->result = NULL;
 		}
-		
-		freestyle_scene = NULL;
+
+		return freestyle_render;
 	}
 
 	//=======================================================

Modified: branches/soc-2008-mxcurioni/source/blender/render/intern/include/render_types.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/render/intern/include/render_types.h	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/render/intern/include/render_types.h	2010-03-28 17:46:10 UTC (rev 27805)
@@ -219,6 +219,8 @@
 	ListBase volumes;
 	ListBase volume_precache_parts;
 
+	ListBase freestyle_renders;
+
 	/* arena for allocating data for use during render, for
 		* example dynamic TFaces to go in the VlakRen structure.
 		*/

Modified: branches/soc-2008-mxcurioni/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/render/intern/source/pipeline.c	2010-03-28 17:01:46 UTC (rev 27804)
+++ branches/soc-2008-mxcurioni/source/blender/render/intern/source/pipeline.c	2010-03-28 17:46:10 UTC (rev 27805)
@@ -1829,6 +1829,7 @@
 /* ************  This part uses API, for rendering Blender scenes ********** */
 
 static void external_render_3d(Render *re, RenderEngineType *type);
+static void add_freestyle(Render *re);
 
 static void do_render_3d(Render *re)
 {
@@ -1864,7 +1865,7 @@
 	/* Freestyle  */
 	if( re->r.mode & R_EDGE_FRS && re->r.renderer==R_INTERN)
 		if(!re->test_break(re->tbh))
-			FRS_add_Freestyle(re);
+			add_freestyle(re);
 		
 	/* free all render verts etc */
 	RE_Database_Free(re);
@@ -2316,6 +2317,64 @@
 }
 
 
+/* invokes Freestyle stroke rendering */
+static void add_freestyle(Render *re)
+{
+	SceneRenderLayer *srl;
+	LinkData *link;
+
+	FRS_init_stroke_rendering(re);
+

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list