Revision: 48941
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48941
Author:   mont29
Date:     2012-07-15 12:53:16 +0000 (Sun, 15 Jul 2012)
Log Message:
-----------
"Fix" [#32033] In the execution result of with_automatic_weight, the difference 
is seen right and left.

This auto/heat vgroup creation seems to be fuzzy/unstable (each run gives a 
slightly different result). I have not the competences (nor time) to 
investigate that laplacian stuff, so for now just adding an option when 
parenting to an armature with envelope/heat, to mirror weights along the X axis 
(as it is done by default when doing it from the Weight Paint mode).

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_relations.c
    trunk/blender/source/blender/editors/space_outliner/outliner_edit.c

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h    2012-07-15 
11:35:13 UTC (rev 48940)
+++ trunk/blender/source/blender/editors/include/ED_object.h    2012-07-15 
12:53:16 UTC (rev 48941)
@@ -84,7 +84,8 @@
 extern struct EnumPropertyItem prop_clear_parent_types[];
 extern struct EnumPropertyItem prop_make_parent_types[];
 
-int ED_object_parent_set(struct ReportList *reports, struct Main *bmain, 
struct Scene *scene, struct Object *ob, struct Object *par, int partype);
+int ED_object_parent_set(struct ReportList *reports, struct Main *bmain, 
struct Scene *scene, struct Object *ob,
+                         struct Object *par, int partype, int xmirror);
 void ED_object_parent_clear(struct Object *ob, int type);
 struct Base *ED_object_scene_link(struct Scene *scene, struct Object *ob);
 

Modified: trunk/blender/source/blender/editors/object/object_relations.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_relations.c      
2012-07-15 11:35:13 UTC (rev 48940)
+++ trunk/blender/source/blender/editors/object/object_relations.c      
2012-07-15 12:53:16 UTC (rev 48941)
@@ -518,7 +518,8 @@
        {0, NULL, 0, NULL, NULL}
 };
 
-int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, 
Object *ob, Object *par, int partype)
+int ED_object_parent_set(ReportList *reports, Main *bmain, Scene *scene, 
Object *ob, Object *par,
+                         int partype, int xmirror)
 {
        bPoseChannel *pchan = NULL;
        int pararm = ELEM4(partype, PAR_ARMATURE, PAR_ARMATURE_NAME, 
PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO);
@@ -641,12 +642,12 @@
                        }
                        else if (pararm && ob->type == OB_MESH && par->type == 
OB_ARMATURE) {
                                if (partype == PAR_ARMATURE_NAME)
-                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_NAME, 0);
+                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_NAME, FALSE);
                                else if (partype == PAR_ARMATURE_ENVELOPE)
-                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_ENVELOPE, 0);
+                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_ENVELOPE, xmirror);
                                else if (partype == PAR_ARMATURE_AUTO) {
                                        WM_cursor_wait(1);
-                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_AUTO, 0);
+                                       create_vgroups_from_armature(reports, 
scene, ob, par, ARM_GROUPS_AUTO, xmirror);
                                        WM_cursor_wait(0);
                                }
                                /* get corrected inverse */
@@ -674,11 +675,12 @@
        Scene *scene = CTX_data_scene(C);
        Object *par = ED_object_active_context(C);
        int partype = RNA_enum_get(op->ptr, "type");
+       int xmirror = RNA_enum_get(op->ptr, "xmirror");
        int ok = 1;
 
        CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
        {
-               if (!ED_object_parent_set(op->reports, bmain, scene, ob, par, 
partype)) {
+               if (!ED_object_parent_set(op->reports, bmain, scene, ob, par, 
partype, xmirror)) {
                        ok = 0;
                        break;
                }
@@ -728,7 +730,34 @@
        return OPERATOR_CANCELLED;
 }
 
+static int parent_set_draw_check_prop(PointerRNA *ptr, PropertyRNA *prop)
+{
+       const char *prop_id = RNA_property_identifier(prop);
+       int type = RNA_enum_get(ptr, "type");
 
+       /* Only show XMirror for PAR_ARMATURE_ENVELOPE and PAR_ARMATURE_AUTO! */
+       if (strcmp(prop_id, "xmirror") == 0) {
+               if (ELEM(type, PAR_ARMATURE_ENVELOPE, PAR_ARMATURE_AUTO))
+                       return TRUE;
+               else
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
+static void parent_set_ui(bContext *C, wmOperator *op)
+{
+       uiLayout *layout = op->layout;
+       wmWindowManager *wm = CTX_wm_manager(C);
+       PointerRNA ptr;
+
+       RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
+
+       /* Main auto-draw call. */
+       uiDefAutoButsRNA(layout, &ptr, parent_set_draw_check_prop, '\0');
+}
+
 void OBJECT_OT_parent_set(wmOperatorType *ot)
 {
        /* identifiers */
@@ -739,13 +768,15 @@
        /* api callbacks */
        ot->invoke = parent_set_invoke;
        ot->exec = parent_set_exec;
-       
        ot->poll = ED_operator_object_active;
+       ot->ui = parent_set_ui;
        
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
        
        RNA_def_enum(ot->srna, "type", prop_make_parent_types, 0, "Type", "");
+       RNA_def_boolean(ot->srna, "xmirror", FALSE, "X Mirror",
+                       "Apply weights symmetrically along X axis, for 
Envelope/Automatic vertex groups creation");
 }
 
 /* ************ Make Parent Without Inverse Operator ******************* */

Modified: trunk/blender/source/blender/editors/space_outliner/outliner_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_outliner/outliner_edit.c 
2012-07-15 11:35:13 UTC (rev 48940)
+++ trunk/blender/source/blender/editors/space_outliner/outliner_edit.c 
2012-07-15 12:53:16 UTC (rev 48941)
@@ -1423,7 +1423,7 @@
        RNA_string_get(op->ptr, "child", childname);
        ob = (Object *)BKE_libblock_find_name(ID_OB, childname);
 
-       ED_object_parent_set(op->reports, bmain, scene, ob, par, partype);
+       ED_object_parent_set(op->reports, bmain, scene, ob, par, partype, 
FALSE);
 
        DAG_scene_sort(bmain, scene);
        DAG_ids_flush_update(bmain, 0);
@@ -1514,7 +1514,7 @@
                }
 
                if ((par->type != OB_ARMATURE) && (par->type != OB_CURVE) && 
(par->type != OB_LATTICE)) {
-                       if (ED_object_parent_set(op->reports, bmain, scene, ob, 
par, partype)) {
+                       if (ED_object_parent_set(op->reports, bmain, scene, ob, 
par, partype, FALSE)) {
                                DAG_scene_sort(bmain, scene);
                                DAG_ids_flush_update(bmain, 0);
                                WM_event_add_notifier(C, NC_OBJECT | 
ND_TRANSFORM, NULL);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to