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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs