Fix #28280: Insert Hook wrong index
authorSergey Sharybin <sergey.vfx@gmail.com>
Fri, 2 Sep 2011 15:19:30 +0000 (15:19 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Fri, 2 Sep 2011 15:19:30 +0000 (15:19 +0000)
Use quite easy and stupid approach like it used for shape keys:
re-make editmesh (editcurve or editlattice) before creating index array
for hook or storing vertex index in parenting object.

Even if hook was added in "current" edit mode, it should be re-mapped on
loading edit data because topology could be changed after it was created.
Such kind of re-loading edit structures is the easiest way for now to
update keyindexes to relevant state.

Also, fixed bug with not re-mapping indices for vertex-parented objects.
Really old error, not sure why it wasn't noticed yet.

source/blender/editors/mesh/editmesh.c
source/blender/editors/object/object_hook.c
source/blender/editors/object/object_relations.c

index 4377fb036326d0796db820e085d196a54e2a486d..e371c346f362c7ddddb8efb9f193d667e736d502 100644 (file)
@@ -1099,7 +1099,7 @@ void load_editMesh(Scene *scene, Object *obedit)
                int j;
 
                for (ob=G.main->object.first; ob; ob=ob->id.next) {
-                       if (ob->parent==ob && ELEM(ob->partype, PARVERT1,PARVERT3)) {
+                       if (ob->parent==obedit && ELEM(ob->partype, PARVERT1,PARVERT3)) {
                                
                                /* duplicate code from below, make it function later...? */
                                if (!vertMap) {
index bb32869469ac74b21bd22e6f5e1f20b048bd51b6..266556773f09c22a2e6fb6655641d79c343ab318 100644 (file)
@@ -64,6 +64,7 @@
 
 #include "ED_curve.h"
 #include "ED_mesh.h"
+#include "ED_lattice.h"
 #include "ED_screen.h"
 
 #include "WM_types.h"
@@ -292,7 +293,7 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo
        return totvert;
 }
 
-static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
 {
        *indexar= NULL;
        *tot= 0;
@@ -302,7 +303,12 @@ static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char
                case OB_MESH:
                {
                        Mesh *me= obedit->data;
-                       EditMesh *em = BKE_mesh_get_editmesh(me);
+                       EditMesh *em;
+
+                       load_editMesh(scene, obedit);
+                       make_editMesh(scene, obedit);
+
+                       em = BKE_mesh_get_editmesh(me);
 
                        /* check selected vertices first */
                        if( return_editmesh_indexar(em, tot, indexar, cent_r)) {
@@ -316,10 +322,17 @@ static int object_hook_index_array(Object *obedit, int *tot, int **indexar, char
                }
                case OB_CURVE:
                case OB_SURF:
+                       load_editNurb(obedit);
+                       make_editNurb(obedit);
+
                        return return_editcurve_indexar(obedit, tot, indexar, cent_r);
                case OB_LATTICE:
                {
                        Lattice *lt= obedit->data;
+
+                       load_editLatt(obedit);
+                       make_editLatt(obedit);
+
                        return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
                }
                default:
@@ -427,7 +440,7 @@ static void add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *o
        int tot, ok, *indexar;
        char name[32];
        
-       ok = object_hook_index_array(obedit, &tot, &indexar, name, cent);
+       ok = object_hook_index_array(scene, obedit, &tot, &indexar, name, cent);
        
        if (!ok) return;        // XXX error("Requires selected vertices or active Vertex Group");
        
@@ -760,7 +773,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op)
        
        /* assign functionality */
        
-       if(!object_hook_index_array(ob, &tot, &indexar, name, cent)) {
+       if(!object_hook_index_array(CTX_data_scene(C), ob, &tot, &indexar, name, cent)) {
                BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group");
                return OPERATOR_CANCELLED;
        }
index e9418ca9f9f995d2c922b44026b5c7719369a648..b9208e778c7e52d80e4deea3776bf0e25c03305d 100644 (file)
@@ -91,6 +91,8 @@
 
 #include "ED_armature.h"
 #include "ED_curve.h"
+#include "ED_lattice.h"
+#include "ED_mesh.h"
 #include "ED_keyframing.h"
 #include "ED_object.h"
 #include "ED_screen.h"
@@ -122,7 +124,12 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
        
        if(obedit->type==OB_MESH) {
                Mesh *me= obedit->data;
-               EditMesh *em = BKE_mesh_get_editmesh(me);
+               EditMesh *em;
+
+               load_editMesh(scene, obedit);
+               make_editMesh(scene, obedit);
+
+               em = BKE_mesh_get_editmesh(me);
 
                eve= em->verts.first;
                while(eve) {
@@ -140,7 +147,12 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
                BKE_mesh_end_editmesh(me, em);
        }
        else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) {
-               ListBase *editnurb= curve_get_editcurve(obedit);
+               ListBase *editnurb;
+
+               load_editNurb(obedit);
+               make_editNurb(obedit);
+
+               editnurb= curve_get_editcurve(obedit);
                
                cu= obedit->data;
 
@@ -180,8 +192,13 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
                }
        }
        else if(obedit->type==OB_LATTICE) {
-               Lattice *lt= obedit->data;
-               
+               Lattice *lt;
+
+               load_editLatt(obedit);
+               make_editLatt(obedit);
+
+               lt= obedit->data;
+
                a= lt->editlatt->latt->pntsu*lt->editlatt->latt->pntsv*lt->editlatt->latt->pntsw;
                bp= lt->editlatt->latt->def;
                while(a--) {