forked from bartvdbraak/blender
Fix #28280: Insert Hook wrong index
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.
This commit is contained in:
parent
6b4bdf621f
commit
2fb2075c5b
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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--) {
|
||||
|
Loading…
Reference in New Issue
Block a user