[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58132] trunk/blender/source/blender/ editors: Fix #36075: editing shading nodes could still crash blender internal rendered

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Jul 10 03:05:59 CEST 2013


Revision: 58132
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58132
Author:   blendix
Date:     2013-07-10 01:05:56 +0000 (Wed, 10 Jul 2013)
Log Message:
-----------
Fix #36075: editing shading nodes could still crash blender internal rendered
draw mode. This happens because it uses node data structures in threads, now
it does same as preview render, which is to immediately stop the render thread
when e.g. deleting nodes.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_render.h
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/editors/util/undo.c

Modified: trunk/blender/source/blender/editors/include/ED_render.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_render.h	2013-07-10 00:29:32 UTC (rev 58131)
+++ trunk/blender/source/blender/editors/include/ED_render.h	2013-07-10 01:05:56 UTC (rev 58132)
@@ -52,7 +52,7 @@
 void ED_render_engine_area_exit(struct ScrArea *sa);
 void ED_render_scene_update(struct Main *bmain, struct Scene *scene, int updated);
 
-void ED_viewport_render_kill_jobs(const struct bContext *C);
+void ED_viewport_render_kill_jobs(const struct bContext *C, bool free_database);
 
 /* render_preview.c */
 

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2013-07-10 00:29:32 UTC (rev 58131)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2013-07-10 01:05:56 UTC (rev 58132)
@@ -1141,7 +1141,7 @@
 	RE_ReleaseResultImage(re);
 }
 
-void ED_viewport_render_kill_jobs(const bContext *C)
+void ED_viewport_render_kill_jobs(const bContext *C, bool free_database)
 {
 	wmWindowManager *wm = CTX_wm_manager(C);
 	Main *bmain = CTX_data_main(C);
@@ -1172,17 +1172,23 @@
 				if (rv3d->render_engine) {
 					/* free render database now before we change data, because
 					 * RE_Database_Free will also loop over blender data */
-					char name[32];
-					Render *re;
+					if (free_database) {
+						char name[32];
+						Render *re;
 
-					sprintf(name, "View3dPreview %p", (void *)ar);
-					re = RE_GetRender(name);
+						sprintf(name, "View3dPreview %p", (void *)ar);
+						re = RE_GetRender(name);
 
-					if (re)
-						RE_Database_Free(re);
+						if (re)
+							RE_Database_Free(re);
 
-					/* tag render engine to update entire database */
-					rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_DATABASE;
+						/* tag render engine to update entire database */
+						rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_DATABASE;
+					}
+					else {
+						/* quick shader update */
+						rv3d->render_engine->update_flag |= RE_ENGINE_UPDATE_MA;
+					}
 				}
 			}
 		}

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2013-07-10 00:29:32 UTC (rev 58131)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2013-07-10 01:05:56 UTC (rev 58132)
@@ -1180,5 +1180,7 @@
 	wmWindowManager *wm = CTX_wm_manager(C);
 	if (wm)
 		WM_jobs_kill(wm, NULL, common_preview_startjob);
+	
+	ED_viewport_render_kill_jobs(C, false);
 }
 

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2013-07-10 00:29:32 UTC (rev 58131)
+++ trunk/blender/source/blender/editors/util/undo.c	2013-07-10 01:05:56 UTC (rev 58132)
@@ -143,7 +143,7 @@
 		if ((obact && (obact->mode & OB_MODE_TEXTURE_PAINT)) || (sima->mode == SI_MODE_PAINT)) {
 			if (!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname) {
 				if (U.uiflag & USER_GLOBALUNDO) {
-					ED_viewport_render_kill_jobs(C);
+					ED_viewport_render_kill_jobs(C, true);
 					BKE_undo_name(C, undoname);
 				}
 			}
@@ -196,7 +196,7 @@
 			/* for example, texface stores image pointers */
 			undo_editmode_clear();
 			
-			ED_viewport_render_kill_jobs(C);
+			ED_viewport_render_kill_jobs(C, true);
 
 			if (undoname)
 				BKE_undo_name(C, undoname);
@@ -369,7 +369,7 @@
 		{
 			int retval;
 
-			ED_viewport_render_kill_jobs(C);
+			ED_viewport_render_kill_jobs(C, true);
 
 			if (G.debug & G_DEBUG)
 				printf("redo_cb: operator redo %s\n", op->type->name);
@@ -537,7 +537,7 @@
 			WM_event_add_notifier(C, NC_GEOM | ND_DATA, NULL);
 		}
 		else {
-			ED_viewport_render_kill_jobs(C);
+			ED_viewport_render_kill_jobs(C, true);
 			BKE_undo_number(C, item);
 			WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, CTX_data_scene(C));
 		}




More information about the Bf-blender-cvs mailing list