[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42826] branches/vgroup_modifiers/source/ blender: On second thought, also enable weight preview in object mode, like for DynamicPaint.

Bastien Montagne montagne29 at wanadoo.fr
Thu Dec 22 17:37:27 CET 2011


Revision: 42826
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42826
Author:   mont29
Date:     2011-12-22 16:37:14 +0000 (Thu, 22 Dec 2011)
Log Message:
-----------
On second thought, also enable weight preview in object mode, like for DynamicPaint. This commit also generalizes/factorizes the way that feature (CD_WEIGHT_MCOL preview in object mode) is handled:
* Adding in BKE_modifier.h "int modifiers_isWMColPreview(struct Object *ob);", which checks whether there is a modifier in the object's stack that needs WEIGHT_MCOL preview. This higly simplifies the code in draw_mesh_fancy() (drawobject.c).
* Adding in BKE_modifier.h "int modifier_usesWMColPreview(struct ModifierData *md);", which checks whether that modifier needs WEIGHT_MCOL preview. Used among other places in mesh_calc_modifiers() (DerivedMesh.c) to make sure preview mask remains for following modifiers.
* Adding the new flag "eModifierTypeFlag_UsesWMColPreview" for those modifiers, used by above functions to make a first, quick check.

Modified Paths:
--------------
    branches/vgroup_modifiers/source/blender/blenkernel/BKE_modifier.h
    branches/vgroup_modifiers/source/blender/blenkernel/intern/DerivedMesh.c
    branches/vgroup_modifiers/source/blender/blenkernel/intern/modifier.c
    branches/vgroup_modifiers/source/blender/editors/space_view3d/drawobject.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_dynamicpaint.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
    branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgproximity.c

Modified: branches/vgroup_modifiers/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- branches/vgroup_modifiers/source/blender/blenkernel/BKE_modifier.h	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/blenkernel/BKE_modifier.h	2011-12-22 16:37:14 UTC (rev 42826)
@@ -99,7 +99,10 @@
 	eModifierTypeFlag_Single = (1<<7),
 
 	/* Some modifier can't be added manually by user */
-	eModifierTypeFlag_NoUserAdd = (1<<8)
+	eModifierTypeFlag_NoUserAdd = (1<<8),
+
+	/* For modifiers that use CD_WEIGHT_MCOL for preview. */
+	eModifierTypeFlag_UsesWMColPreview = (1<<9)
 } ModifierTypeFlag;
 
 typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
@@ -308,14 +311,14 @@
 struct ModifierData  *modifier_new(int type);
 void          modifier_free(struct ModifierData *md);
 
-void 		  modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
+void          modifier_unique_name(struct ListBase *modifiers, struct ModifierData *md);
 
 void          modifier_copyData(struct ModifierData *md, struct ModifierData *target);
 int           modifier_dependsOnTime(struct ModifierData *md);
 int           modifier_supportsMapping(struct ModifierData *md);
 int           modifier_couldBeCage(struct Scene *scene, struct ModifierData *md);
 int           modifier_isCorrectableDeformed(struct ModifierData *md);
-int			  modifier_sameTopology(ModifierData *md);
+int           modifier_sameTopology(ModifierData *md);
 int           modifier_nonGeometrical(ModifierData *md);
 int           modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
 void          modifier_setError(struct ModifierData *md, const char *format, ...)
@@ -323,6 +326,7 @@
 __attribute__ ((format (printf, 2, 3)))
 #endif
 ;
+int           modifier_usesWMColPreview(struct ModifierData *md);
 
 void          modifiers_foreachObjectLink(struct Object *ob,
 										  ObjectWalkFunc walk,
@@ -349,6 +353,7 @@
 int           modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
 int           modifiers_isCorrectableDeformed(struct Object *ob);
 void          modifier_freeTemporaryData(struct ModifierData *md);
+int           modifiers_isWMColPreview(struct Object *ob);
 
 int           modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
 

Modified: branches/vgroup_modifiers/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/vgroup_modifiers/source/blender/blenkernel/intern/DerivedMesh.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/blenkernel/intern/DerivedMesh.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -1070,8 +1070,9 @@
 				}
 			}
 
-			/* in case of dynamic paint, make sure preview mask remains for following modifiers */
-			if (md->type == eModifierType_DynamicPaint)
+			/* In case of dynamic paint or WeightVG with enabled preview, make sure
+			 * preview mask remains for following modifiers. */
+			if (modifier_usesWMColPreview(md))
 				append_mask |= CD_MASK_WEIGHT_MCOL;
 		}
 

Modified: branches/vgroup_modifiers/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/vgroup_modifiers/source/blender/blenkernel/intern/modifier.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/blenkernel/intern/modifier.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -48,6 +48,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_dynamicpaint_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_path_util.h"
@@ -142,6 +143,42 @@
 			(mti->flags & eModifierTypeFlag_SupportsMapping));
 }
 
+int modifier_usesWMColPreview(ModifierData *md)
+{
+	ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+	if (!(mti->flags & eModifierTypeFlag_UsesWMColPreview))
+		return FALSE;
+
+	if (md->type == eModifierType_DynamicPaint) {
+		DynamicPaintModifierData *pmd = (DynamicPaintModifierData*) md;
+		/* if canvas is ready to preview vertex colors */
+		if (pmd->canvas && pmd->canvas->flags & MOD_DPAINT_PREVIEW_READY)
+			return TRUE;
+	}
+	else if (md->type == eModifierType_WeightVGEdit) {
+		WeightVGEditModifierData *wmd = (WeightVGEditModifierData*) md;
+		/* If preview of vertex weights is enabled... */
+		if (wmd->common_flags & MOD_WVG_CFLAG_WEIGHT_PREVIEW)
+			return TRUE;
+	}
+	else if (md->type == eModifierType_WeightVGMix) {
+		WeightVGMixModifierData *wmd = (WeightVGMixModifierData*) md;
+		printf("A mix modifier…\n");
+		/* If preview of vertex weights is enabled... */
+		if (wmd->common_flags & MOD_WVG_CFLAG_WEIGHT_PREVIEW)
+			return TRUE;
+	}
+	else if (md->type == eModifierType_WeightVGProximity) {
+		WeightVGProximityModifierData *wmd = (WeightVGProximityModifierData*) md;
+		/* If preview of vertex weights is enabled... */
+		if (wmd->common_flags & MOD_WVG_CFLAG_WEIGHT_PREVIEW)
+			return TRUE;
+	}
+
+	return FALSE;
+}
+
 ModifierData *modifiers_findByType(Object *ob, ModifierType type)
 {
 	ModifierData *md = ob->modifiers.first;
@@ -545,6 +582,20 @@
 	return 0;
 }
 
+/* Check whether the given object has a modifier in its stack that uses WEIGHT_MCOL CD layer
+ * to preview something... Used by DynamicPaint and WeightVG currently. */
+int modifiers_isWMColPreview(Object *ob)
+{
+	ModifierData *md = ob->modifiers.first;
+
+	for (; md; md = md->next) {
+		if (md->mode & eModifierMode_Realtime && modifier_usesWMColPreview(md))
+			return TRUE;
+	}
+
+	return FALSE;
+}
+
 int modifiers_indexInObject(Object *ob, ModifierData *md_seek)
 {
 	int i= 0;

Modified: branches/vgroup_modifiers/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/vgroup_modifiers/source/blender/editors/space_view3d/drawobject.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/editors/space_view3d/drawobject.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -36,7 +36,6 @@
 #include "DNA_camera_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_constraint_types.h" // for drawing constraint
-#include "DNA_dynamicpaint_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_material_types.h"
@@ -3039,27 +3038,16 @@
 	eWireDrawMode draw_wire= OBDRAW_WIRE_OFF;
 	int /* totvert,*/ totedge, totface;
 	DerivedMesh *dm= mesh_get_derived_final(scene, ob, scene->customdata_mask);
-	ModifierData *md = NULL;
 	const short is_obact= (ob == OBACT);
 	int draw_flags = (is_obact && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0;
 
 	if(!dm)
 		return;
 
-	/* check to draw dynamic paint colors */
-	if ((md = modifiers_findByType(ob, eModifierType_DynamicPaint)))
-	{
-		/* check if target has an active dpaint modifier	*/
-		if(md && (md->mode & eModifierMode_Realtime))					
-		{
-			DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
-			/* if canvas is ready to preview vertex colors */
-			if (pmd->canvas && pmd->canvas->flags & MOD_DPAINT_PREVIEW_READY &&
-				DM_get_face_data_layer(dm, CD_WEIGHT_MCOL)) {
-				draw_flags |= DRAW_DYNAMIC_PAINT_PREVIEW;
-			}
-		}
-	}
+	/* Check to draw dynamic paint colors (or weights from WeightVG modifiers).
+	 * Note: Last "preview-active" modifier in stack will win! */
+	if(DM_get_face_data_layer(dm, CD_WEIGHT_MCOL) && modifiers_isWMColPreview(ob))
+		draw_flags |= DRAW_DYNAMIC_PAINT_PREVIEW;
 
 	/* Unwanted combination */
 	if (draw_flags & DRAW_FACE_SELECT) {

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_dynamicpaint.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_dynamicpaint.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_dynamicpaint.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -157,8 +157,9 @@
 	/* structSize */        sizeof(DynamicPaintModifierData),
 	/* type */              eModifierTypeType_Constructive,
 	/* flags */             eModifierTypeFlag_AcceptsMesh
-							| eModifierTypeFlag_UsesPointCache
-							| eModifierTypeFlag_Single,
+	                        |eModifierTypeFlag_UsesPointCache
+	                        |eModifierTypeFlag_Single
+	                        |eModifierTypeFlag_UsesWMColPreview,
 
 	/* copyData */          copyData,
 	/* deformVerts */       NULL,

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvg_util.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -290,7 +290,7 @@
 			float temp_color[3];
 			int j = mface[i].v4 ? 4 : 3;
 			while(j--) {
-				int idx = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
+				int idx = *((&mface[i].v1)+j);
 
 				CLAMP(w[idx], 0.0f, 1.0f);
 				weight_to_rgb(temp_color, w[idx]);
@@ -300,7 +300,6 @@
 				col[i*4+j].a = 255;
 			}
 		}
-//		pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
 
 		if(indices)
 			MEM_freeN(w);

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-12-22 16:00:34 UTC (rev 42825)
+++ branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgedit.c	2011-12-22 16:37:14 UTC (rev 42826)
@@ -266,7 +266,8 @@
 	/* type */              eModifierTypeType_NonGeometrical,
 	/* flags */             eModifierTypeFlag_AcceptsMesh
 	                       |eModifierTypeFlag_SupportsMapping
-	                       |eModifierTypeFlag_SupportsEditmode,
+	                       |eModifierTypeFlag_SupportsEditmode
+	                       |eModifierTypeFlag_UsesWMColPreview,
 
 	/* copyData */          copyData,
 	/* deformVerts */       NULL,

Modified: branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c
===================================================================
--- branches/vgroup_modifiers/source/blender/modifiers/intern/MOD_weightvgmix.c	2011-12-22 16:00:34 UTC (rev 42825)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list