[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57369] trunk/blender/source/blender: Fix #35561: freestyle + read full sample layers = crash.

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Tue Jun 11 04:32:02 CEST 2013


Revision: 57369
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57369
Author:   kjym3
Date:     2013-06-11 02:32:01 +0000 (Tue, 11 Jun 2013)
Log Message:
-----------
Fix #35561: freestyle + read full sample layers = crash.

Now add_freestyle() in pipeline.c takes a second argument to enable/disable
stroke rendering.  When stroke rendering is disabled, the function allocates
data structures but does not perform stroke rendering.  The allocated data
structures (mostly left unpopulated with data elements) are intended to allow
for the Read Full Sample Layers (Shift-R) command in the compositor.

Modified Paths:
--------------
    trunk/blender/source/blender/freestyle/FRS_freestyle.h
    trunk/blender/source/blender/freestyle/intern/application/Controller.cpp
    trunk/blender/source/blender/freestyle/intern/application/Controller.h
    trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
    trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
    trunk/blender/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/freestyle/FRS_freestyle.h
===================================================================
--- trunk/blender/source/blender/freestyle/FRS_freestyle.h	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/FRS_freestyle.h	2013-06-11 02:32:01 UTC (rev 57369)
@@ -45,7 +45,7 @@
 void FRS_read_file(struct bContext *C);
 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);
+struct Render *FRS_do_stroke_rendering(struct Render *re, struct SceneRenderLayer *srl, int render);
 void FRS_finish_stroke_rendering(struct Render *re);
 void FRS_composite_result(struct Render *re, struct SceneRenderLayer *srl, struct Render *freestyle_render);
 void FRS_exit(void);

Modified: trunk/blender/source/blender/freestyle/intern/application/Controller.cpp
===================================================================
--- trunk/blender/source/blender/freestyle/intern/application/Controller.cpp	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/intern/application/Controller.cpp	2013-06-11 02:32:01 UTC (rev 57369)
@@ -833,17 +833,18 @@
 	_render_count = 0;
 }
 
-Render *Controller::RenderStrokes(Render *re)
+Render *Controller::RenderStrokes(Render *re, bool render)
 {
 	_Chrono.start();
 	BlenderStrokeRenderer *blenderRenderer = new BlenderStrokeRenderer(re, ++_render_count);
-	_Canvas->Render(blenderRenderer);
+	if (render)
+		_Canvas->Render(blenderRenderer);
 	real d = _Chrono.stop();
 	if (G.debug & G_DEBUG_FREESTYLE) {
 		cout << "Temporary scene generation: " << d << endl;
 	}
 	_Chrono.start();
-	Render *freestyle_render = blenderRenderer->RenderScene(re);
+	Render *freestyle_render = blenderRenderer->RenderScene(re, render);
 	d = _Chrono.stop();
 	if (G.debug & G_DEBUG_FREESTYLE) {
 		cout << "Stroke rendering  : " << d << endl;

Modified: trunk/blender/source/blender/freestyle/intern/application/Controller.h
===================================================================
--- trunk/blender/source/blender/freestyle/intern/application/Controller.h	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/intern/application/Controller.h	2013-06-11 02:32:01 UTC (rev 57369)
@@ -86,7 +86,7 @@
 	void toggleEdgeTesselationNature(Nature::EdgeNature iNature);
 	void DrawStrokes();
 	void ResetRenderCount();
-	Render *RenderStrokes(Render *re);
+	Render *RenderStrokes(Render *re, bool render);
 	void SwapStyleModules(unsigned i1, unsigned i2);
 	void InsertStyleModule(unsigned index, const char *iFileName);
 	void InsertStyleModule(unsigned index, const char *iName, struct Text *iText);

Modified: trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
===================================================================
--- trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2013-06-11 02:32:01 UTC (rev 57369)
@@ -476,7 +476,7 @@
 	return ob;
 }
 
-Render *BlenderStrokeRenderer::RenderScene(Render *re)
+Render *BlenderStrokeRenderer::RenderScene(Render *re, bool render)
 {
 	Camera *camera = (Camera *)freestyle_scene->camera->data;
 	if (camera->clipend < _z)
@@ -489,7 +489,7 @@
 
 	Render *freestyle_render = RE_NewRender(freestyle_scene->id.name);
 
-	RE_RenderFreestyleStrokes(freestyle_render, freestyle_bmain, freestyle_scene);
+	RE_RenderFreestyleStrokes(freestyle_render, freestyle_bmain, freestyle_scene, render);
 
 	return freestyle_render;
 }

Modified: trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
===================================================================
--- trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2013-06-11 02:32:01 UTC (rev 57369)
@@ -51,7 +51,7 @@
 
 	Object *NewMesh() const;
 
-	Render *RenderScene(Render *re);
+	Render *RenderScene(Render *re, bool render);
 
 protected:
 	Main *freestyle_bmain;

Modified: trunk/blender/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
===================================================================
--- trunk/blender/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2013-06-11 02:32:01 UTC (rev 57369)
@@ -580,12 +580,15 @@
 	controller->ResetRenderCount();
 }
 
-Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl)
+Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render)
 {
 	Main bmain = {0};
 	Render *freestyle_render = NULL;
 	Text *text, *next_text;
 
+	if (!render)
+		return controller->RenderStrokes(re, false);
+
 	RenderMonitor monitor(re);
 	controller->setRenderMonitor(&monitor);
 
@@ -619,7 +622,7 @@
 		re->i.infostr = NULL;
 		freestyle_scene = re->scene;
 		controller->DrawStrokes();
-		freestyle_render = controller->RenderStrokes(re);
+		freestyle_render = controller->RenderStrokes(re, true);
 		controller->CloseFile();
 		freestyle_scene = NULL;
 

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2013-06-11 02:32:01 UTC (rev 57369)
@@ -226,7 +226,7 @@
 void RE_BlenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct SceneRenderLayer *srl, struct Object *camera_override, unsigned int lay, int frame, const short write_still);
 void RE_BlenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct Object *camera_override, unsigned int lay, int sfra, int efra, int tfra);
 #ifdef WITH_FREESTYLE
-void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene);
+void RE_RenderFreestyleStrokes(struct Render *re, struct Main *bmain, struct Scene *scene, int render);
 #endif
 
 /* error reporting */

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2013-06-10 21:55:41 UTC (rev 57368)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2013-06-11 02:32:01 UTC (rev 57369)
@@ -1081,7 +1081,7 @@
 }
 
 #ifdef WITH_FREESTYLE
-static void add_freestyle(Render *re);
+static void add_freestyle(Render *re, int render);
 static void free_all_freestyle_renders(void);
 #endif
 
@@ -1097,7 +1097,7 @@
 	/* Freestyle */
 	if (re->r.mode & R_EDGE_FRS) {
 		if (!re->test_break(re->tbh)) {
-			add_freestyle(re);
+			add_freestyle(re, 1);
 	
 			free_all_freestyle_renders();
 			
@@ -1150,7 +1150,7 @@
 	/* Freestyle */
 	if (re->r.mode & R_EDGE_FRS)
 		if (!re->test_break(re->tbh))
-			add_freestyle(re);
+			add_freestyle(re, 1);
 #endif
 	
 	/* do left-over 3d post effects (flares) */
@@ -1633,7 +1633,7 @@
 
 #ifdef WITH_FREESTYLE
 /* invokes Freestyle stroke rendering */
-static void add_freestyle(Render *re)
+static void add_freestyle(Render *re, int render)
 {
 	SceneRenderLayer *srl, *actsrl;
 	LinkData *link;
@@ -1659,7 +1659,7 @@
 		if ((re->r.scemode & R_SINGLE_LAYER) && srl != actsrl)
 			continue;
 		if (FRS_is_freestyle_enabled(srl)) {
-			link->data = (void *)FRS_do_stroke_rendering(re, srl);
+			link->data = (void *)FRS_do_stroke_rendering(re, srl, render);
 		}
 	}
 
@@ -1853,6 +1853,11 @@
 	for (scene = re->main->scene.first; scene; scene = scene->id.next)
 		scene->id.flag |= LIB_DOIT;
 	
+#ifdef WITH_FREESTYLE
+	for (scene = re->freestyle_bmain.scene.first; scene; scene = scene->id.next)
+		scene->id.flag &= ~LIB_DOIT;
+#endif
+
 	for (node = ntree->nodes.first; node; node = node->next) {
 		if (node->type == CMP_NODE_R_LAYERS) {
 			Scene *nodescene = (Scene *)node->id;
@@ -1876,7 +1881,16 @@
 	re->display_init(re->dih, re->result);
 	re->display_clear(re->dch, re->result);
 	
+#ifdef WITH_FREESTYLE
+	if (re->r.mode & R_EDGE_FRS)
+		add_freestyle(re, 0);
+#endif
+
 	do_merge_fullsample(re, ntree);
+
+#ifdef WITH_FREESTYLE
+	free_all_freestyle_renders();
+#endif
 }
 
 /* returns fully composited render-result on given time step (in RenderData) */
@@ -2445,11 +2459,12 @@
 }
 
 #ifdef WITH_FREESTYLE
-void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene)
+void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render)
 {
 	re->result_ok= 0;
 	if (render_initialize_from_main(re, bmain, scene, NULL, NULL, scene->lay, 0, 0)) {
-		do_render_fields_blur_3d(re);
+		if (render)
+			do_render_fields_blur_3d(re);
 	}
 	re->result_ok = 1;
 }




More information about the Bf-blender-cvs mailing list