[Bf-blender-cvs] [3b4d464] alembic: Fix for crashes when changing draw types that affect dupli objects.

Lukas Tönne noreply at git.blender.org
Mon Mar 30 14:15:29 CEST 2015


Commit: 3b4d464d1a5f9c058494b8ca299a68022e0f9e02
Author: Lukas Tönne
Date:   Mon Mar 30 14:11:58 2015 +0200
Branches: alembic
https://developer.blender.org/rB3b4d464d1a5f9c058494b8ca299a68022e0f9e02

Fix for crashes when changing draw types that affect dupli objects.

The draw code was restoring the derivedFinal mesh unconditionally after
drawing duplis. However, the drawing code can in some cases replace the
derivedFinal pointer during drawing (bad!). This then leads to invalid
pointer access.

Fix is to only touch the derivedFinal when it's actually a dupli cache
mesh.

===================================================================

M	source/blender/editors/space_view3d/view3d_draw.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index d2e2e9e..a2923dc 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2200,8 +2200,20 @@ static void draw_dupli_objects_color(
 		tbase.object->currentlod = savedlod;
 		
 		/* restore final DM */
-		tbase.object->transflag &= ~OB_IS_DUPLI_CACHE;
-		tbase.object->derivedFinal = store_final_dm;
+		if (tbase.object->transflag & OB_IS_DUPLI_CACHE) {
+			DerivedMesh *cur = tbase.object->derivedFinal;
+			
+			/* in some cases drawing code can recreate the derivedFinal,
+			 * make sure we free those first before restoring
+			 */
+			if (cur && cur != dob_data->dm) {
+				cur->needsFree = 1;
+				cur->release(cur);
+			}
+			
+			tbase.object->transflag &= ~OB_IS_DUPLI_CACHE;
+			tbase.object->derivedFinal = store_final_dm;
+		}
 	}
 
 	if (apply_data) {




More information about the Bf-blender-cvs mailing list