Support more object types scene-scale (on creation)
authorCampbell Barton <ideasman42@gmail.com>
Mon, 1 Sep 2014 10:09:31 +0000 (20:09 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 1 Sep 2014 11:01:11 +0000 (21:01 +1000)
- lamp
- camera
- font
- empty & effector

Also fix inconsistency with apply transform
(modified shape-keys for meshes but not curve/lattice)

29 files changed:
source/blender/blenkernel/BKE_curve.h
source/blender/blenkernel/BKE_lattice.h
source/blender/blenkernel/BKE_mball.h
source/blender/blenkernel/BKE_mesh.h
source/blender/blenkernel/BKE_object.h
source/blender/blenkernel/intern/curve.c
source/blender/blenkernel/intern/lattice.c
source/blender/blenkernel/intern/mball.c
source/blender/blenkernel/intern/mesh.c
source/blender/blenkernel/intern/object.c
source/blender/editors/armature/armature_add.c
source/blender/editors/curve/editcurve.c
source/blender/editors/include/ED_armature.h
source/blender/editors/include/ED_curve.h
source/blender/editors/include/ED_lattice.h
source/blender/editors/include/ED_mball.h
source/blender/editors/include/ED_mesh.h
source/blender/editors/include/ED_object.h
source/blender/editors/mesh/mesh_data.c
source/blender/editors/metaball/mball_edit.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_lattice.c
source/blender/editors/object/object_lod.c
source/blender/editors/object/object_transform.c
source/blender/makesrna/intern/rna_curve_api.c
source/blender/makesrna/intern/rna_lattice_api.c
source/blender/makesrna/intern/rna_mesh_api.c
source/blender/makesrna/intern/rna_meta_api.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index 0177053839040ceff919f9c1ebbe6c6ab237066f..5de7d9936e68c7aa1d2ba5741b281ba87707337e 100644 (file)
@@ -84,6 +84,8 @@ void BKE_curve_texspace_get(struct Curve *cu, float r_loc[3], float r_rot[3], fl
 bool BKE_curve_minmax(struct Curve *cu, bool use_radius, float min[3], float max[3]);
 bool BKE_curve_center_median(struct Curve *cu, float cent[3]);
 bool BKE_curve_center_bounds(struct Curve *cu, float cent[3]);
+void BKE_curve_transform_ex(struct Curve *cu, float mat[4][4], bool do_keys, const float unit_scale);
+void BKE_curve_transform(struct Curve *cu, float mat[4][4], bool do_keys);
 void BKE_curve_translate(struct Curve *cu, float offset[3], const bool do_keys);
 void BKE_curve_material_index_remove(struct Curve *cu, int index);
 void BKE_curve_material_index_clear(struct Curve *cu);
index 8d8d37026349320d4b602551b48a523c6b896dd6..5fb1053b53fc7dc1a6300048c6e7b0598a9cd90a 100644 (file)
@@ -84,6 +84,7 @@ 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], bool do_keys);
+void BKE_lattice_transform(struct Lattice *lt, float mat[4][4], bool do_keys);
 
 int  BKE_lattice_index_from_uvw(struct Lattice *lt, const int u, const int v, const int w);
 void BKE_lattice_index_to_uvw(struct Lattice *lt, const int index, int *r_u, int *r_v, int *r_w);
index 56ea44fa6e91acc883aeaf1ffb1b2acbc98354d6..c021960e730daa36fd47cf9f9a3403d5fd81d327 100644 (file)
@@ -63,6 +63,7 @@ bool BKE_mball_minmax_ex(struct MetaBall *mb, float min[3], float max[3],
                          float obmat[4][4], const short flag);
 bool BKE_mball_center_median(struct MetaBall *mb, float r_cent[3]);
 bool BKE_mball_center_bounds(struct MetaBall *mb, float r_cent[3]);
+void BKE_mball_transform(struct MetaBall *mb, float mat[4][4]);
 void BKE_mball_translate(struct MetaBall *mb, const float offset[3]);
 
 struct MetaElem *BKE_mball_element_add(struct MetaBall *mb, const int type);
index d0c268df93cb9e2b7b362569ea9d21cec151e624..b2b9e37f500a64b11dc8a27a8681a4f5645fa55e 100644 (file)
@@ -133,6 +133,7 @@ struct Mesh *BKE_mesh_new_from_object(struct Main *bmain, struct Scene *sce, str
 /* vertex level transformations & checks (no derived mesh) */
 
 bool BKE_mesh_minmax(struct Mesh *me, float r_min[3], float r_max[3]);
+void BKE_mesh_transform(struct Mesh *me, float mat[4][4], bool do_keys);
 void BKE_mesh_translate(struct Mesh *me, const float offset[3], const bool do_keys);
 
 void BKE_mesh_ensure_navmesh(struct Mesh *me);
index 1468d60ef9d8cc4f1246b6382ef3079e9c1e63ac..1bfd26d4f8ccb84ab6dc40bc118029658f2811ae 100644 (file)
@@ -103,6 +103,8 @@ void BKE_object_make_local(struct Object *ob);
 bool BKE_object_is_libdata(struct Object *ob);
 bool BKE_object_obdata_is_libdata(struct Object *ob);
 
+void BKE_object_obdata_size_init(struct Object *ob, const float scale);
+
 void BKE_object_scale_to_mat3(struct Object *ob, float mat[3][3]);
 void BKE_object_rot_to_mat3(struct Object *ob, float mat[3][3], bool use_drot);
 void BKE_object_mat3_to_rot(struct Object *ob, float mat[3][3], bool use_compat);
index 671a18efc5bbf352b58d11087e936021534b2035..730bffd2509c78db4c99088f209bfadb3c9885e1 100644 (file)
@@ -4282,7 +4282,50 @@ bool BKE_curve_center_bounds(Curve *cu, float cent[3])
        return false;
 }
 
-void BKE_curve_translate(Curve *cu, float offset[3], const bool do_keys)
+
+void BKE_curve_transform_ex(Curve *cu, float mat[4][4], bool do_keys, float unit_scale)
+{
+       Nurb *nu;
+       BPoint *bp;
+       BezTriple *bezt;
+       int i;
+
+       for (nu = cu->nurb.first; nu; nu = nu->next) {
+               if (nu->type == CU_BEZIER) {
+                       i = nu->pntsu;
+                       for (bezt = nu->bezt; i--; bezt++) {
+                               mul_m4_v3(mat, bezt->vec[0]);
+                               mul_m4_v3(mat, bezt->vec[1]);
+                               mul_m4_v3(mat, bezt->vec[2]);
+                               bezt->radius *= unit_scale;
+                       }
+                       BKE_nurb_handles_calc(nu);
+               }
+               else {
+                       i = nu->pntsu * nu->pntsv;
+                       for (bp = nu->bp; i--; bp++)
+                               mul_m4_v3(mat, bp->vec);
+               }
+       }
+
+       if (do_keys && cu->key) {
+               KeyBlock *kb;
+               for (kb = cu->key->block.first; kb; kb = kb->next) {
+                       float *fp = kb->data;
+                       for (i = kb->totelem; i--; fp += 3) {
+                               mul_m4_v3(mat, fp);
+                       }
+               }
+       }
+}
+
+void BKE_curve_transform(Curve *cu, float mat[4][4], bool do_keys)
+{
+       float unit_scale = mat4_to_scale(mat);
+       BKE_curve_transform_ex(cu, mat, do_keys, unit_scale);
+}
+
+void BKE_curve_translate(Curve *cu, float offset[3], bool do_keys)
 {
        ListBase *nurb_lb = BKE_curve_nurbs_get(cu);
        Nurb *nu;
index ea55f32ea058f18cab14de414cefddc5035e6815..1f609852af2bec955a697db91ebc4d18edc834c1 100644 (file)
@@ -1166,6 +1166,28 @@ void BKE_lattice_center_bounds(Lattice *lt, float cent[3])
        mid_v3_v3v3(cent, min, max);
 }
 
+void BKE_lattice_transform(Lattice *lt, float mat[4][4], bool do_keys)
+{
+       BPoint *bp = lt->def;
+       int i = lt->pntsu * lt->pntsv * lt->pntsw;
+
+       while (i--) {
+               mul_m4_v3(mat, bp->vec);
+               bp++;
+       }
+
+       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) {
+                               mul_m4_v3(mat, fp);
+                       }
+               }
+       }
+}
+
 void BKE_lattice_translate(Lattice *lt, float offset[3], bool do_keys)
 {
        int i, numVerts;
index 5a045606d15a1c55587458f4c7e131b392d40334..453c6df6e3b33f13b088e7dfc8594bd0b6fb002d 100644 (file)
@@ -2442,6 +2442,30 @@ bool BKE_mball_center_bounds(MetaBall *mb, float r_cent[3])
        return 0;
 }
 
+void BKE_mball_transform(MetaBall *mb, float mat[4][4])
+{
+       MetaElem *me;
+       float quat[4];
+       const float scale = mat4_to_scale(mat);
+       const float scale_sqrt = sqrtf(scale);
+
+       mat4_to_quat(quat, mat);
+
+       for (me = mb->elems.first; me; me = me->next) {
+               mul_m4_v3(mat, &me->x);
+               mul_qt_qtqt(me->quat, quat, me->quat);
+               me->rad *= scale;
+               /* hrmf, probably elems shouldn't be
+                * treating scale differently - campbell */
+               if (!MB_TYPE_SIZE_SQUARED(me->type)) {
+                       mul_v3_fl(&me->expx, scale);
+               }
+               else {
+                       mul_v3_fl(&me->expx, scale_sqrt);
+               }
+       }
+}
+
 void BKE_mball_translate(MetaBall *mb, const float offset[3])
 {
        MetaElem *ml;
index 66c383ef0d3d93bf2b37808b3b997926b2c6b513..2e80379522c37956669e31d336f51b38119dbcdf 100644 (file)
@@ -1869,6 +1869,27 @@ bool BKE_mesh_minmax(Mesh *me, float r_min[3], float r_max[3])
        return (me->totvert != 0);
 }
 
+void BKE_mesh_transform(Mesh *me, float mat[4][4], bool do_keys)
+{
+       int i;
+       MVert *mvert = me->mvert;
+
+       for (i = 0; i < me->totvert; i++, mvert++)
+               mul_m4_v3(mat, mvert->co);
+
+       if (do_keys && me->key) {
+               KeyBlock *kb;
+               for (kb = me->key->block.first; kb; kb = kb->next) {
+                       float *fp = kb->data;
+                       for (i = kb->totelem; i--; fp += 3) {
+                               mul_m4_v3(mat, fp);
+                       }
+               }
+       }
+
+       /* don't update normals, caller can do this explicitly */
+}
+
 void BKE_mesh_translate(Mesh *me, const float offset[3], const bool do_keys)
 {
        int i = me->totvert;
index 3a28796d7c91cb4c9deb838bedfa2db26796c4d9..b09016506e30a248be94267b23472c536fe8e0d2 100644 (file)
@@ -42,6 +42,7 @@
 #include "DNA_constraint_types.h"
 #include "DNA_group_types.h"
 #include "DNA_key_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_material_types.h"
 #include "DNA_meta_types.h"
@@ -1792,6 +1793,55 @@ void BKE_object_make_proxy(Object *ob, Object *target, Object *gob)
        ob->dt = target->dt;
 }
 
+/**
+ * Use with newly created objects to set their size
+ * (used to apply scene-scale).
+ */
+void BKE_object_obdata_size_init(struct Object *ob, const float size)
+{
+       /* apply radius as a scale to types that support it */
+       switch (ob->type) {
+               case OB_EMPTY:
+               {
+                       ob->empty_drawsize *= size;
+                       break;
+               }
+               case OB_FONT:
+               {
+                       Curve *cu = ob->data;
+                       cu->fsize *= size;
+                       break;
+               }
+               case OB_CAMERA:
+               {
+                       Camera *cam = ob->data;
+                       cam->drawsize *= size;
+                       break;
+               }
+               case OB_LAMP:
+               {
+                       Lamp *lamp = ob->data;
+                       lamp->dist *= size;
+                       lamp->area_size  *= size;
+                       lamp->area_sizey *= size;
+                       lamp->area_sizez *= size;
+                       break;
+               }
+               /* Only lattice (not mesh, curve, mball...),
+                * because its got data when newly added */
+               case OB_LATTICE:
+               {
+                       struct Lattice *lt = ob->data;
+                       float mat[4][4];
+
+                       unit_m4(mat);
+                       scale_m4_fl(mat, size);
+
+                       BKE_lattice_transform(lt, (float (*)[4])mat, false);
+                       break;
+               }
+       }
+}
 
 /* *************** CALC ****************** */
 
index 16975eed75ef3e977d039e6bba8ba424e8805c43..eba1bc4d78d52df00ca941e30a56ec1b3f52f33e 100644 (file)
@@ -84,7 +84,7 @@ EditBone *ED_armature_edit_bone_add(bArmature *arm, const char *name)
        return bone;
 }
 
-void add_primitive_bone(Object *obedit_arm, bool view_aligned)
+EditBone *ED_armature_edit_bone_add_primitive(Object *obedit_arm, float length, bool view_aligned)
 {
        bArmature *arm = obedit_arm->data;
        EditBone *bone;
@@ -99,10 +99,9 @@ void add_primitive_bone(Object *obedit_arm, bool view_aligned)
        zero_v3(bone->head);
        zero_v3(bone->tail);
 
-       if (view_aligned)
-               bone->tail[1] = 1.0f;
-       else
-               bone->tail[2] = 1.0f;
+       bone->tail[view_aligned ? 1 : 2] = length;
+
+       return bone;
 }
 
 
index f3a6dfb2d35fb4e540a2e0d42cf860fc7a747e9b..a52b2a619dc02fbef4ea64ec77b429b60f2f00a8 100644 (file)
@@ -1476,37 +1476,6 @@ void ED_curve_select_swap(EditNurb *editnurb, bool hide_handles)
        }
 }
 
-/******************** transform operator **********************/
-
-void ED_curve_transform(Curve *cu, float mat[4][4])
-{
-       Nurb *nu;
-       BPoint *bp;
-       BezTriple *bezt;
-       int a;
-
-       float scale = mat4_to_scale(mat);
-
-       for (nu = cu->nurb.first; nu; nu = nu->next) {
-               if (nu->type == CU_BEZIER) {
-                       a = nu->pntsu;
-                       for (bezt = nu->bezt; a--; bezt++) {
-                               mul_m4_v3(mat, bezt->vec[0]);
-                               mul_m4_v3(mat, bezt->vec[1]);
-                               mul_m4_v3(mat, bezt->vec[2]);
-                               bezt->radius *= scale;
-                       }
-                       BKE_nurb_handles_calc(nu);
-               }
-               else {
-                       a = nu->pntsu * nu->pntsv;
-                       for (bp = nu->bp; a--; bp++)
-                               mul_m4_v3(mat, bp->vec);
-               }
-       }
-       DAG_id_tag_update(&cu->id, 0);
-}
-
 /******************** separate operator ***********************/
 
 static int separate_exec(bContext *C, wmOperator *op)
index f6a1b493facd7bd4b9c10a3dc8a8e821c91f783c..6eac9f14bf604907fd8af75195a35e714696fe3a 100644 (file)
@@ -133,8 +133,8 @@ EditBone *ED_armature_bone_get_mirrored(const struct ListBase *edbo, EditBone *e
 void ED_armature_sync_selection(struct ListBase *edbo);
 void ED_armature_validate_active(struct bArmature *arm);
 
-void add_primitive_bone(struct Object *obedit_arm, bool view_aligned);
-struct EditBone *ED_armature_edit_bone_add(struct bArmature *arm, const char *name);
+EditBone *ED_armature_edit_bone_add_primitive(struct Object *obedit_arm, float length, bool view_aligned);
+EditBone *ED_armature_edit_bone_add(struct bArmature *arm, const char *name);
 void ED_armature_edit_bone_remove(struct bArmature *arm, EditBone *exBone);
 
 bool ED_armature_ebone_is_child_recursive(EditBone *ebone_parent, EditBone *ebone_child);
index 330147db077b698e9d5523873aefbfcdb78e255e..58e64f30b057e5cb52b06857c7e6ab151e58d409 100644 (file)
@@ -51,7 +51,6 @@ void    ED_operatormacros_curve(void);
 void    ED_keymap_curve(struct wmKeyConfig *keyconf);
 
 /* editcurve.c */
-void ED_curve_transform(struct Curve *cu, float mat[4][4]);
 void ED_curve_deselect_all(struct EditNurb *editnurb);
 void ED_curve_select_all(struct EditNurb *editnurb);
 void ED_curve_select_swap(struct EditNurb *editnurb, bool hide_handles);
index 4d19b6d5548367f115006b004549991ea679d20e..6636319dc9b83625e47026e5aa8a921ddff1c5ed 100644 (file)
@@ -37,6 +37,5 @@ struct Lattice;
 void free_editLatt(struct Object *ob);
 void make_editLatt(struct Object *obedit);
 void load_editLatt(struct Object *obedit);
-void ED_lattice_transform(struct Lattice *lt, float mat[4][4]);
 
 #endif  /* __ED_LATTICE_H__ */
index 680e9d791095833b61cb6864f7707462ea0a1644..5e774c638417f608448c4aa1f25030f29946faa0 100644 (file)
@@ -50,6 +50,4 @@ void load_editMball(struct Object *obedit);
 
 void undo_push_mball(struct bContext *C, const char *name);
 
-void ED_mball_transform(struct MetaBall *mb, float mat[4][4]);
-
 #endif  /* __ED_MBALL_H__ */
index 4acc5279ba6ffbdb9ff2cb94a7a373dd55439dcd..6a562da0a0ef0a2a2980c7784b9af4001c75e2f0 100644 (file)
@@ -264,7 +264,6 @@ void ED_mesh_faces_remove(struct Mesh *mesh, struct ReportList *reports, int cou
 void ED_mesh_edges_remove(struct Mesh *mesh, struct ReportList *reports, int count);
 void ED_mesh_vertices_remove(struct Mesh *mesh, struct ReportList *reports, int count);
 
-void ED_mesh_transform(struct Mesh *me, float mat[4][4]);
 void ED_mesh_calc_tessface(struct Mesh *mesh);
 void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface);
 
index 5504b7e03528238e57b2af535d1b3812d8b9c1c5..2328f7d5135575a9cfcaa8ba83bdb7c3456532a5 100644 (file)
@@ -150,8 +150,9 @@ bool ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, c
                                     float loc[3], float rot[3],
                                     bool *enter_editmode, unsigned int *layer, bool *is_view_aligned);
 
-struct Object *ED_object_add_type(struct bContext *C, int type, const float loc[3], const float rot[3],
-                                  bool enter_editmode, unsigned int layer);
+struct Object *ED_object_add_type(
+        struct bContext *C, int type, const float loc[3], const float rot[3],
+        bool enter_editmode, unsigned int layer) ATTR_RETURNS_NONNULL;
 
 void ED_object_single_users(struct Main *bmain, struct Scene *scene, bool full, bool copy_groups);
 void ED_object_single_user(struct Main *bmain, struct Scene *scene, struct Object *ob);
index 83947534d06662e4500d96068185f0d6a7a2118c..bf8559add6f8c57ffba18058700d135375788028 100644 (file)
@@ -880,17 +880,6 @@ static void mesh_add_verts(Mesh *mesh, int len)
        mesh->totvert = totvert;
 }
 
-void ED_mesh_transform(Mesh *me, float mat[4][4])
-{
-       int i;
-       MVert *mvert = me->mvert;
-
-       for (i = 0; i < me->totvert; i++, mvert++)
-               mul_m4_v3(mat, mvert->co);
-
-       /* don't update normals, caller can do this explicitly */
-}
-
 static void mesh_add_edges(Mesh *mesh, int len)
 {
        CustomData edata;
index feac7f6ece3ae0beb75f8d3fa771214f0a127b36..f6a54beb8c84690fd1fe1804033de6bc6a1e2038 100644 (file)
@@ -743,28 +743,3 @@ void undo_push_mball(bContext *C, const char *name)
 {
        undo_editmode_push(C, name, get_data, free_undoMball, undoMball_to_editMball, editMball_to_undoMball, NULL);
 }
-
-void ED_mball_transform(MetaBall *mb, float mat[4][4])
-{
-       MetaElem *me;
-       float quat[4];
-       const float scale = mat4_to_scale(mat);
-       const float scale_sqrt = sqrtf(scale);
-
-       mat4_to_quat(quat, mat);
-
-       for (me = mb->elems.first; me; me = me->next) {
-               mul_m4_v3(mat, &me->x);
-               mul_qt_qtqt(me->quat, quat, me->quat);
-               me->rad *= scale;
-               /* hrmf, probably elems shouldn't be
-                * treating scale differently - campbell */
-               if (!MB_TYPE_SIZE_SQUARED(me->type)) {
-                       mul_v3_fl(&me->expx, scale);
-               }
-               else {
-                       mul_v3_fl(&me->expx, scale_sqrt);
-               }
-       }
-       DAG_id_tag_update(&mb->id, 0);
-}
index 6eb16a8a2d61966de059f1212f7a764a1144099e..0c07f4a1288e171637f97bcb48b25ee1e3aa1227 100644 (file)
@@ -96,6 +96,7 @@
 
 #include "ED_armature.h"
 #include "ED_curve.h"
+#include "ED_lattice.h"
 #include "ED_mball.h"
 #include "ED_mesh.h"
 #include "ED_node.h"
@@ -447,14 +448,17 @@ Object *ED_object_add_type(bContext *C, int type, const float loc[3], const floa
 /* for object add operator */
 static int object_add_exec(bContext *C, wmOperator *op)
 {
+       Object *ob;
        bool enter_editmode;
        unsigned int layer;
        float loc[3], rot[3];
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
                return OPERATOR_CANCELLED;
 
-       ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer);
+       ob = ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer);
+       BKE_object_obdata_size_init(ob, RNA_float_get(op->ptr, "radius"));
 
        return OPERATOR_FINISHED;
 }
@@ -473,6 +477,8 @@ void OBJECT_OT_add(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
+       /* properties */
+       ED_object_add_unit_props(ot);
        RNA_def_enum(ot->srna, "type", object_type_items, 0, "Type", "");
 
        ED_object_add_generic_props(ot, true);
@@ -489,32 +495,31 @@ static int effector_add_exec(bContext *C, wmOperator *op)
        unsigned int layer;
        float loc[3], rot[3];
        float mat[4][4];
+       float dia;
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
                return OPERATOR_CANCELLED;
 
        type = RNA_enum_get(op->ptr, "type");
+       dia = RNA_float_get(op->ptr, "radius");
 
        if (type == PFIELD_GUIDE) {
                Curve *cu;
                ob = ED_object_add_type(C, OB_CURVE, loc, rot, false, layer);
-               if (!ob)
-                       return OPERATOR_CANCELLED;
 
                rename_id(&ob->id, CTX_DATA_(BLF_I18NCONTEXT_ID_OBJECT, "CurveGuide"));
                cu = ob->data;
                cu->flag |= CU_PATH | CU_3D;
                ED_object_editmode_enter(C, 0);
                ED_object_new_primitive_matrix(C, ob, loc, rot, mat, false);
-               BLI_addtail(&cu->editnurb->nurbs, add_nurbs_primitive(C, ob, mat, CU_NURBS | CU_PRIM_PATH, 1));
+               BLI_addtail(&cu->editnurb->nurbs, add_nurbs_primitive(C, ob, mat, CU_NURBS | CU_PRIM_PATH, dia));
                if (!enter_editmode)
                        ED_object_editmode_exit(C, EM_FREEDATA);
        }
        else {
                ob = ED_object_add_type(C, OB_EMPTY, loc, rot, false, layer);
-               if (!ob)
-                       return OPERATOR_CANCELLED;
-
+               BKE_object_obdata_size_init(ob, dia);
                rename_id(&ob->id, CTX_DATA_(BLF_I18NCONTEXT_ID_OBJECT, "Field"));
                if (ELEM(type, PFIELD_WIND, PFIELD_VORTEX))
                        ob->empty_drawtype = OB_SINGLE_ARROW;
@@ -541,8 +546,10 @@ void OBJECT_OT_effector_add(wmOperatorType *ot)
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 
+       /* properties */
        ot->prop = RNA_def_enum(ot->srna, "type", field_type_items, 0, "Type", "");
 
+       ED_object_add_unit_props(ot);
        ED_object_add_generic_props(ot, true);
 }
 
@@ -673,6 +680,7 @@ static int object_add_text_exec(bContext *C, wmOperator *op)
        unsigned int layer;
        float loc[3], rot[3];
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
                return OPERATOR_CANCELLED;
 
@@ -680,6 +688,7 @@ static int object_add_text_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
 
        obedit = ED_object_add_type(C, OB_FONT, loc, rot, enter_editmode, layer);
+       BKE_object_obdata_size_init(obedit, RNA_float_get(op->ptr, "radius"));
 
        WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
 
@@ -699,6 +708,9 @@ void OBJECT_OT_text_add(wmOperatorType *ot)
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+       /* properties */
+       ED_object_add_unit_props(ot);
        ED_object_add_generic_props(ot, true);
 }
 
@@ -711,9 +723,10 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
        bool newob = false;
        bool enter_editmode;
        unsigned int layer;
-       float loc[3], rot[3];
+       float loc[3], rot[3], dia;
        bool view_aligned = rv3d && (U.flag & USER_ADD_VIEWALIGNED);
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL))
                return OPERATOR_CANCELLED;
 
@@ -731,7 +744,8 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       add_primitive_bone(obedit, view_aligned);
+       dia = RNA_float_get(op->ptr, "radius");
+       ED_armature_edit_bone_add_primitive(obedit, dia, view_aligned);
 
        /* userdef */
        if (newob && !enter_editmode)
@@ -755,6 +769,9 @@ void OBJECT_OT_armature_add(wmOperatorType *ot)
 
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+       /* properties */
+       ED_object_add_unit_props(ot);
        ED_object_add_generic_props(ot, true);
 }
 
@@ -767,12 +784,14 @@ static int object_empty_add_exec(bContext *C, wmOperator *op)
        unsigned int layer;
        float loc[3], rot[3];
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
                return OPERATOR_CANCELLED;
 
        ob = ED_object_add_type(C, OB_EMPTY, loc, rot, false, layer);
 
        BKE_object_empty_draw_type_set(ob, type);
+       BKE_object_obdata_size_init(ob, RNA_float_get(op->ptr, "radius"));
 
        return OPERATOR_FINISHED;
 }
@@ -795,6 +814,7 @@ void OBJECT_OT_empty_add(wmOperatorType *ot)
        /* properties */
        ot->prop = RNA_def_enum(ot->srna, "type", object_empty_drawtype_items, 0, "Type", "");
 
+       ED_object_add_unit_props(ot);
        ED_object_add_generic_props(ot, false);
 }
 
@@ -904,12 +924,14 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op)
        unsigned int layer;
        float loc[3], rot[3];
 
+       WM_operator_view3d_unit_defaults(C, op);
        if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL))
                return OPERATOR_CANCELLED;
 
        ob = ED_object_add_type(C, OB_LAMP, loc, rot, false, layer);
-       la = (Lamp *)ob->data;
+       BKE_object_obdata_size_init(ob, RNA_float_get(op->ptr, "radius"));
 
+       la = (Lamp *)ob->data;
        la->type = type;
        rename_id(&ob->id, get_lamp_defname(type));
        rename_id(&la->id, get_lamp_defname(type));
@@ -941,6 +963,7 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot)
        ot->prop = RNA_def_enum(ot->srna, "type", lamp_type_items, 0, "Type", "");
        RNA_def_property_translation_context(ot->prop, BLF_I18NCONTEXT_ID_LAMP);
 
+       ED_object_add_unit_props(ot);
        ED_object_add_generic_props(ot, false);
 }
 
index 3897e452d0d12b87248be9676c5e44aa68da57b0..c24a127ed8bd48d0e2de06dafac67ace694bbb8d 100644 (file)
@@ -174,21 +174,6 @@ void load_editLatt(Object *obedit)
        }
 }
 
-/*************************** Transform Operator ************************/
-
-void ED_lattice_transform(Lattice *lt, float mat[4][4])
-{
-       BPoint *bp = lt->def;
-       int a = lt->pntsu * lt->pntsv * lt->pntsw;
-
-       while (a--) {
-               mul_m4_v3(mat, bp->vec);
-               bp++;
-       }
-
-       DAG_id_tag_update(&lt->id, 0);
-}
-
 static void bpoint_select_set(BPoint *bp, bool select)
 {
        if (select) {
index 8bcbba6be9601ccab91f8dd765966c06ca05147d..48e980015a7072d82c203e54fe63769744be034b 100644 (file)
  *  \ingroup edobj
  */
 
-
 #include "DNA_object_types.h"
 
 #include "BKE_context.h"
 #include "BKE_object.h"
 
-#include "ED_screen.h"
-#include "ED_object.h"
-
 #include "WM_api.h"
 #include "WM_types.h"
 
@@ -45,6 +41,9 @@
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
+#include "ED_screen.h"
+#include "ED_object.h"
+
 #include "object_intern.h"
 
 static int object_lod_add_exec(bContext *C, wmOperator *UNUSED(op))
index e2ebe583ecf930dd3b9c22d3268e2c8249605c5b..a1b8478a0e1a7b9025cbac28a41d94181a5f4e12 100644 (file)
@@ -472,27 +472,12 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
                /* apply to object data */
                if (ob->type == OB_MESH) {
                        Mesh *me = ob->data;
-                       MVert *mvert;
-                       int a;
 
                        if (apply_scale)
                                multiresModifier_scale_disp(scene, ob);
                        
                        /* adjust data */
-                       mvert = me->mvert;
-                       for (a = 0; a < me->totvert; a++, mvert++)
-                               mul_m4_v3(mat, mvert->co);
-                       
-                       if (me->key) {
-                               KeyBlock *kb;
-                               
-                               for (kb = me->key->block.first; kb; kb = kb->next) {
-                                       float *fp = kb->data;
-                                       
-                                       for (a = 0; a < kb->totelem; a++, fp += 3)
-                                               mul_m4_v3(mat, fp);
-                               }
-                       }
+                       BKE_mesh_transform(me, mat, true);
                        
                        /* update normals */
                        BKE_mesh_calc_normals(me);
@@ -502,45 +487,17 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
                }
                else if (ob->type == OB_LATTICE) {
                        Lattice *lt = ob->data;
-                       BPoint *bp = lt->def;
-                       int a = lt->pntsu * lt->pntsv * lt->pntsw;
-                       
-                       while (a--) {
-                               mul_m4_v3(mat, bp->vec);
-                               bp++;
-                       }
+
+                       BKE_lattice_transform(lt, mat, true);
                }
                else if (ob->type == OB_MBALL) {
                        MetaBall *mb = ob->data;
-                       ED_mball_transform(mb, mat);
+                       BKE_mball_transform(mb, mat);
                }
                else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
                        Curve *cu = ob->data;
-
-                       Nurb *nu;
-                       BPoint *bp;
-                       BezTriple *bezt;
-                       int a;
-
                        scale = mat3_to_scale(rsmat);
-
-                       for (nu = cu->nurb.first; nu; nu = nu->next) {
-                               if (nu->type == CU_BEZIER) {
-                                       a = nu->pntsu;
-                                       for (bezt = nu->bezt; a--; bezt++) {
-                                               mul_m4_v3(mat, bezt->vec[0]);
-                                               mul_m4_v3(mat, bezt->vec[1]);
-                                               mul_m4_v3(mat, bezt->vec[2]);
-                                               bezt->radius *= scale;
-                                       }
-                                       BKE_nurb_handles_calc(nu);
-                               }
-                               else {
-                                       a = nu->pntsu * nu->pntsv;
-                                       for (bp = nu->bp; a--; bp++)
-                                               mul_m4_v3(mat, bp->vec);
-                               }
-                       }
+                       BKE_curve_transform_ex(cu, mat, true, scale);
                }
                else if (ob->type == OB_CAMERA) {
                        MovieClip *clip = BKE_object_movieclip_get(scene, ob, false);
index e2c2d1929a8286c6ca677090702bbeb83506dae0..e85511f08e93f5f69ecc489a72177d5a1260926f 100644 (file)
 
 #include "BLI_utildefines.h"
 
-#include "ED_curve.h"
+#include "BKE_curve.h"
 
 #include "rna_internal.h"  /* own include */
 
 #ifdef RNA_RUNTIME
-static void rna_Curve_transform(Curve *cu, float *mat)
+static void rna_Curve_transform(Curve *cu, float *mat, int shape_keys)
 {
-       ED_curve_transform(cu, (float (*)[4])mat);
+       BKE_curve_transform(cu, (float (*)[4])mat, shape_keys);
+
+       DAG_id_tag_update(&cu->id, 0);
 }
 #else
 
@@ -58,6 +60,7 @@ void RNA_api_curve(StructRNA *srna)
        RNA_def_function_ui_description(func, "Transform curve by a matrix");
        parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "shape_keys", 0, "", "Transform Shape Keys");
 
        func = RNA_def_function(srna, "validate_material_indices", "BKE_curve_material_index_validate");
        RNA_def_function_ui_description(func, "Validate material indices of splines or letters, return True when the curve "
index 2738ee58ada1f8d1e067a3e6ff132e5f4e749117..ed0489db1a28ff33eecb0721ac638e4297c961c5 100644 (file)
 
 #include "BLI_utildefines.h"
 
-#include "ED_lattice.h"
-
 #include "rna_internal.h"  /* own include */
 
 #ifdef RNA_RUNTIME
-static void rna_Lattice_transform(Lattice *lt, float *mat)
+static void rna_Lattice_transform(Lattice *lt, float *mat, int shape_keys)
 {
-       ED_lattice_transform(lt, (float (*)[4])mat);
+       BKE_lattice_transform(lt, (float (*)[4])mat, shape_keys);
+
+       DAG_id_tag_update(&lt->id, 0);
 }
 #else
 
@@ -58,6 +58,7 @@ void RNA_api_lattice(StructRNA *srna)
        RNA_def_function_ui_description(func, "Transform lattice by a matrix");
        parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "shape_keys", 0, "", "Transform Shape Keys");
 }
 
 #endif
index 3b0635156255195b9a30c1265dedefed85bab613..cc1f57d8a1475a0e691f5189140f69fda1e9466e 100644 (file)
@@ -139,9 +139,11 @@ static void rna_Mesh_calc_smooth_groups(Mesh *mesh, int use_bitflags, int *r_pol
                            r_group_total, use_bitflags);
 }
 
-static void rna_Mesh_transform(Mesh *mesh, float *mat)
+static void rna_Mesh_transform(Mesh *mesh, float *mat, int shape_keys)
 {
-       ED_mesh_transform(mesh, (float (*)[4])mat);
+       BKE_mesh_transform(mesh, (float (*)[4])mat, shape_keys);
+
+       DAG_id_tag_update(&mesh->id, 0);
 }
 
 #else
@@ -155,6 +157,7 @@ void RNA_api_mesh(StructRNA *srna)
        RNA_def_function_ui_description(func, "Transform mesh vertices by a matrix");
        parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, 0.0f, 0.0f, "", "Matrix", 0.0f, 0.0f);
        RNA_def_property_flag(parm, PROP_REQUIRED);
+       RNA_def_boolean(func, "shape_keys", 0, "", "Transform Shape Keys");
 
        func = RNA_def_function(srna, "calc_normals", "BKE_mesh_calc_normals");
        RNA_def_function_ui_description(func, "Calculate vertex normals");
index 4e8703ecac109d16aebb3e04e3b4f2b0186ddc7e..43dca6fe4f103fffc18cbc25a13bdac3f51dfc89 100644 (file)
 
 #include "BLI_utildefines.h"
 
-#include "ED_mball.h"
+#include "BKE_mball.h"
 
 #include "rna_internal.h"  /* own include */
 
 #ifdef RNA_RUNTIME
 static void rna_Meta_transform(struct MetaBall *mb, float *mat)
 {
-       ED_mball_transform(mb, (float (*)[4])mat);
+       BKE_mball_transform(mb, (float (*)[4])mat);
+
+       DAG_id_tag_update(&mb->id, 0);
 }
 #else
 
index 87a8bbf3e0298cc28997137b7e14621e0f94b2c0..97e7d99c80215f477f9ec58a7e4785effb899693 100644 (file)
@@ -387,7 +387,6 @@ void ED_area_tag_redraw(struct ScrArea *sa) RET_NONE
 void ED_area_tag_refresh(struct ScrArea *sa) RET_NONE
 void ED_area_newspace(struct bContext *C, struct ScrArea *sa, int type) RET_NONE
 void ED_region_tag_redraw(struct ARegion *ar) RET_NONE
-void ED_curve_transform(struct Curve *cv, float mat[4][4]) RET_NONE
 void WM_event_add_fileselect(struct bContext *C, struct wmOperator *op) RET_NONE
 void WM_cursor_wait(bool val) RET_NONE
 void ED_node_texture_default(const struct bContext *C, struct Tex *tex) RET_NONE
@@ -439,7 +438,6 @@ void uiLayoutSetScaleX(struct uiLayout *layout, float scale) RET_NONE
 void uiLayoutSetScaleY(struct uiLayout *layout, float scale) RET_NONE
 void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname) RET_NONE
 void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base) RET_NONE
-void ED_mesh_transform(struct Mesh *me, float mat[4][4]) RET_NONE
 void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface) RET_NONE
 void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
 void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE
@@ -475,8 +473,6 @@ bool ED_texture_context_check_lamp(const struct bContext *C) RET_ZERO
 bool ED_texture_context_check_particles(const struct bContext *C) RET_ZERO
 bool ED_texture_context_check_others(const struct bContext *C) RET_ZERO
 
-void ED_mball_transform(struct MetaBall *mb, float mat[4][4]) RET_NONE
-
 bool snapObjectsRayEx(struct Scene *scene, struct Base *base_act, struct View3D *v3d, struct ARegion *ar, struct Object *obedit, short snap_mode,
                       struct Object **r_ob, float r_obmat[4][4],
                       const float ray_start[3], const float ray_normal[3], float *r_ray_dist,
@@ -484,7 +480,6 @@ bool snapObjectsRayEx(struct Scene *scene, struct Base *base_act, struct View3D
 
 void make_editLatt(struct Object *obedit) RET_NONE
 void load_editLatt(struct Object *obedit) RET_NONE
-void ED_lattice_transform(struct Lattice *lt, float mat[4][4]) RET_NONE
 
 void load_editNurb(struct Object *obedit) RET_NONE
 void make_editNurb(struct Object *obedit) RET_NONE