Fix #34070: set origin operator did not work for lattice objects.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 1 Feb 2013 15:17:39 +0000 (15:17 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 1 Feb 2013 15:17:39 +0000 (15:17 +0000)
source/blender/blenkernel/BKE_lattice.h
source/blender/blenkernel/intern/lattice.c
source/blender/editors/object/object_transform.c

index a0bebd7..fe88f0c 100644 (file)
@@ -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
 
index fa01e9f..05d7933 100644 (file)
@@ -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);
+                       }
+               }
+       }
+}
+
index 7a2eb56..d933a6d 100644 (file)
@@ -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)) {