[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57419] trunk/blender/source/blender/ blenkernel: fix for problem with creating weight-paint preview.

Campbell Barton ideasman42 at gmail.com
Thu Jun 13 02:33:49 CEST 2013


Revision: 57419
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57419
Author:   campbellbarton
Date:     2013-06-13 00:33:48 +0000 (Thu, 13 Jun 2013)
Log Message:
-----------
fix for problem with creating weight-paint preview.

In the case where the modifier stack didnt need deform-verts to calculate,
they would not be available for the preview either.

This fixes a bug caused by r57206 which set mirror to preview so the mirrored
weights would be displayed, but it only worked when there was an armature after it, see [#35545].

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57206

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_modifier.h
    trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
    trunk/blender/source/blender/blenkernel/intern/modifier.c

Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h	2013-06-12 23:17:31 UTC (rev 57418)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h	2013-06-13 00:33:48 UTC (rev 57419)
@@ -371,11 +371,12 @@
  * evaluation, assuming the data indicated by dataMask is required at the
  * end of the stack.
  */
-struct CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, 
+struct CDMaskLink *modifiers_calcDataMasks(struct Scene *scene,
                                            struct Object *ob,
                                            struct ModifierData *md,
                                            CustomDataMask dataMask,
-                                           int required_mode);
+                                           int required_mode,
+                                           ModifierData *previewmd, CustomDataMask previewmask);
 struct ModifierData *modifiers_getLastPreview(struct Scene *scene,
                                               struct ModifierData *md,
                                               int required_mode);

Modified: trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-06-12 23:17:31 UTC (rev 57418)
+++ trunk/blender/source/blender/blenkernel/intern/DerivedMesh.c	2013-06-13 00:33:48 UTC (rev 57419)
@@ -1482,7 +1482,7 @@
 	ModifierData *firstmd, *md, *previewmd = NULL;
 	CDMaskLink *datamasks, *curr;
 	/* XXX Always copying POLYINDEX, else tessellated data are no more valid! */
-	CustomDataMask mask, nextmask, append_mask = CD_MASK_ORIGINDEX;
+	CustomDataMask mask, nextmask, previewmask = 0, append_mask = CD_MASK_ORIGINDEX;
 	float (*deformedVerts)[3] = NULL;
 	DerivedMesh *dm = NULL, *orcodm, *clothorcodm, *finaldm;
 	int numVerts = me->totvert;
@@ -1532,17 +1532,24 @@
 	if (useRenderParams) required_mode = eModifierMode_Render;
 	else required_mode = eModifierMode_Realtime;
 
-	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
-	curr = datamasks;
-
 	if (do_mod_wmcol || do_mod_mcol) {
 		/* Find the last active modifier generating a preview, or NULL if none. */
 		/* XXX Currently, DPaint modifier just ignores this.
 		 *     Needs a stupid hack...
 		 *     The whole "modifier preview" thing has to be (re?)designed, anyway! */
 		previewmd = modifiers_getLastPreview(scene, md, required_mode);
+
+		/* even if the modifier doesn't need the data, to make a preview it may */
+		if (previewmd) {
+			if (do_mod_wmcol) {
+				previewmask = CD_MASK_MDEFORMVERT;
+			}
+		}
 	}
 
+	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, previewmd, previewmask);
+	curr = datamasks;
+
 	if (deform_r) *deform_r = NULL;
 	*final_r = NULL;
 
@@ -2028,7 +2035,7 @@
 	dm = NULL;
 	md = modifiers_getVirtualModifierList(ob);
 
-	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode);
+	datamasks = modifiers_calcDataMasks(scene, ob, md, dataMask, required_mode, NULL, 0);
 
 	curr = datamasks;
 	for (i = 0; md; i++, md = md->next, curr = curr->next) {

Modified: trunk/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/modifier.c	2013-06-12 23:17:31 UTC (rev 57418)
+++ trunk/blender/source/blender/blenkernel/intern/modifier.c	2013-06-13 00:33:48 UTC (rev 57419)
@@ -363,7 +363,9 @@
 	return 1;
 }
 
-CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md, CustomDataMask dataMask, int required_mode)
+CDMaskLink *modifiers_calcDataMasks(struct Scene *scene, Object *ob, ModifierData *md,
+                                    CustomDataMask dataMask, int required_mode,
+                                    ModifierData *previewmd, CustomDataMask previewmask)
 {
 	CDMaskLink *dataMasks = NULL;
 	CDMaskLink *curr, *prev;
@@ -374,10 +376,15 @@
 
 		curr = MEM_callocN(sizeof(CDMaskLink), "CDMaskLink");
 		
-		if (modifier_isEnabled(scene, md, required_mode))
+		if (modifier_isEnabled(scene, md, required_mode)) {
 			if (mti->requiredDataMask)
 				curr->mask = mti->requiredDataMask(ob, md);
 
+			if (previewmd == md) {
+				curr->mask |= previewmask;
+			}
+		}
+
 		/* prepend new datamask */
 		curr->next = dataMasks;
 		dataMasks = curr;




More information about the Bf-blender-cvs mailing list