[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [30629] trunk/blender/source/blender: Fix #22661: Multires/Sculpt Segfult

Sergey Sharybin g.ulairi at gmail.com
Thu Jul 22 13:27:54 CEST 2010


Revision: 30629
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30629
Author:   nazgul
Date:     2010-07-22 13:27:54 +0200 (Thu, 22 Jul 2010)

Log Message:
-----------
Fix #22661: Multires/Sculpt Segfult

- Show error message in multires modifier if there is no MDISPS layer
- Sculpt on basis mesh if there is no the same layer

Modified Paths:
--------------
    trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
    trunk/blender/source/blender/modifiers/intern/MOD_multires.c

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2010-07-22 11:21:21 UTC (rev 30628)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt.c	2010-07-22 11:27:54 UTC (rev 30629)
@@ -112,8 +112,14 @@
    it's the last modifier on the stack and it is not on the first level */
 struct MultiresModifierData *sculpt_multires_active(Scene *scene, Object *ob)
 {
+	Mesh *me= (Mesh*)ob->data;
 	ModifierData *md, *nmd;
-	
+
+	if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
+		/* multires can't work without displacement layer */
+		return NULL;
+	}
+
 	for(md= modifiers_getVirtualModifierList(ob); md; md= md->next) {
 		if(md->type == eModifierType_Multires) {
 			MultiresModifierData *mmd= (MultiresModifierData*)md;

Modified: trunk/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_multires.c	2010-07-22 11:21:21 UTC (rev 30628)
+++ trunk/blender/source/blender/modifiers/intern/MOD_multires.c	2010-07-22 11:27:54 UTC (rev 30629)
@@ -38,6 +38,8 @@
 #include "BKE_paint.h"
 #include "BKE_particle.h"
 
+#include "DNA_mesh_types.h"
+
 static void initData(ModifierData *md)
 {
 	MultiresModifierData *mmd = (MultiresModifierData*)md;
@@ -66,7 +68,16 @@
 	int sculpting= (ob->mode & OB_MODE_SCULPT) && ss;
 	MultiresModifierData *mmd = (MultiresModifierData*)md;
 	DerivedMesh *result;
+	Mesh *me= (Mesh*)ob->data;
 
+	if(mmd->totlvl) {
+		if(!CustomData_get_layer(&me->fdata, CD_MDISPS)) {
+			/* multires can't work without displacement layer */
+			modifier_setError(md, "Modifier needs mesh with displacement data.");
+			return dm;
+		}
+	}
+
 	result = multires_dm_create_from_derived(mmd, 0, dm, ob, useRenderParams, isFinalCalc);
 
 	if(result == dm)





More information about the Bf-blender-cvs mailing list