Fix #34070: set origin operator did not work for lattice objects.
This commit is contained in:
@@ -75,5 +75,10 @@ void BKE_lattice_modifiers_calc(struct Scene *scene, struct Object *ob);
|
||||
|
||||
struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *lattice);
|
||||
|
||||
void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3]);
|
||||
void BKE_lattice_center_median(struct Lattice *lt, float cent[3]);
|
||||
void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3]);
|
||||
void BKE_lattice_translate(struct Lattice *lt, float offset[3], int do_keys);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -1003,3 +1003,66 @@ struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *oblatt)
|
||||
if (lt->editlatt) lt = lt->editlatt->latt;
|
||||
return lt->dvert;
|
||||
}
|
||||
|
||||
void BKE_lattice_center_median(struct Lattice *lt, float cent[3])
|
||||
{
|
||||
int i, numVerts;
|
||||
|
||||
if (lt->editlatt) lt = lt->editlatt->latt;
|
||||
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
|
||||
|
||||
zero_v3(cent);
|
||||
|
||||
for (i = 0; i < numVerts; i++)
|
||||
add_v3_v3(cent, lt->def[i].vec);
|
||||
|
||||
mul_v3_fl(cent, 1.0f / (float)numVerts);
|
||||
}
|
||||
|
||||
void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3])
|
||||
{
|
||||
int i, numVerts;
|
||||
|
||||
if (lt->editlatt) lt = lt->editlatt->latt;
|
||||
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
|
||||
|
||||
for (i = 0; i < numVerts; i++)
|
||||
minmax_v3v3_v3(min, max, lt->def[i].vec);
|
||||
}
|
||||
|
||||
void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3])
|
||||
{
|
||||
float min[3], max[3];
|
||||
|
||||
INIT_MINMAX(min, max);
|
||||
|
||||
BKE_lattice_minmax(lt, min, max);
|
||||
mid_v3_v3v3(cent, min, max);
|
||||
}
|
||||
|
||||
void BKE_lattice_translate(Lattice *lt, float offset[3], int do_keys)
|
||||
{
|
||||
int i, numVerts;
|
||||
|
||||
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
|
||||
|
||||
if (lt->def)
|
||||
for (i = 0; i < numVerts; i++)
|
||||
add_v3_v3(lt->def[i].vec, offset);
|
||||
|
||||
if (lt->editlatt)
|
||||
for (i = 0; i < numVerts; i++)
|
||||
add_v3_v3(lt->editlatt->latt->def[i].vec, offset);
|
||||
|
||||
if (do_keys && lt->key) {
|
||||
KeyBlock *kb;
|
||||
|
||||
for (kb = lt->key->block.first; kb; kb = kb->next) {
|
||||
float *fp = kb->data;
|
||||
for (i = kb->totelem; i--; fp += 3) {
|
||||
add_v3_v3(fp, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -899,6 +899,20 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (ob->type == OB_LATTICE) {
|
||||
Lattice *lt = ob->data;
|
||||
|
||||
if (centermode == ORIGIN_TO_CURSOR) { /* done */ }
|
||||
else if (around == V3D_CENTROID) { BKE_lattice_center_median(lt, cent); }
|
||||
else { BKE_lattice_center_bounds(lt, cent); }
|
||||
|
||||
negate_v3_v3(cent_neg, cent);
|
||||
BKE_lattice_translate(lt, cent_neg, 1);
|
||||
|
||||
tot_change++;
|
||||
lt->id.flag |= LIB_DOIT;
|
||||
do_inverse_offset = TRUE;
|
||||
}
|
||||
|
||||
/* offset other selected objects */
|
||||
if (do_inverse_offset && (centermode != GEOMETRY_TO_ORIGIN)) {
|
||||
|
Reference in New Issue
Block a user