+static char *wpaint_make_validmap(Mesh *me, Object *ob)
+{
+ bDeformGroup *dg;
+ ModifierData *md;
+ char *validmap;
+ bPose *pose;
+ bPoseChannel *chan;
+ ArmatureModifierData *amd;
+ GHash *gh = BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
+ int i = 0;
+
+ /*add all names to a hash table*/
+ for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
+ BLI_ghash_insert(gh, dg->name, NULL);
+ }
+
+ if (!i)
+ return;
+
+ validmap = MEM_callocN(i, "wpaint valid map");
+
+ /*now loop through the armature modifiers and identify deform bones*/
+ for (md = ob->modifiers.first; md; md=md->next) {
+ if (!(md->mode & eModifierMode_Realtime))
+ continue;
+
+ if (md->type == eModifierType_Armature)
+ {
+ amd = (ArmatureModifierData*) md;
+ pose = amd->object->pose;
+
+ for (chan=pose->chanbase.first; chan; chan=chan->next) {
+ if (chan->bone->flag & BONE_NO_DEFORM)
+ continue;
+
+ if (BLI_ghash_haskey(gh, chan->name)) {
+ BLI_ghash_remove(gh, chan->name, NULL, NULL);
+ BLI_ghash_insert(gh, chan->name, SET_INT_IN_POINTER(1));
+ }
+ }
+ }
+ }
+
+ /*add all names to a hash table*/
+ for (dg=ob->defbase.first, i=0; dg; dg=dg->next, i++) {
+ if (BLI_ghash_lookup(gh, dg->name) != NULL) {
+ validmap[i] = 1;
+ }
+ }
+
+ BLI_ghash_free(gh, NULL, NULL);
+
+ return validmap;
+}
+