Added location and rotation operator properties for adding objects. The Align to...
authorMatt Ebb <matt@mke3.net>
Mon, 28 Dec 2009 04:09:46 +0000 (04:09 +0000)
committerMatt Ebb <matt@mke3.net>
Mon, 28 Dec 2009 04:09:46 +0000 (04:09 +0000)
is now just used to set the rotation property value during invoke.

This removes some reliance on 3d view info for non-interactive use, and also lets you specify
new object's locations/rotations explicitly when calling from Python.

source/blender/editors/armature/editarmature.c
source/blender/editors/curve/editfont.c
source/blender/editors/include/ED_object.h
source/blender/editors/mesh/editmesh_add.c
source/blender/editors/object/object_add.c

index 4564ec4947792f601e226e40077e9ab505502d12..f382896c8681b0332cc0188ca7d53bc9aadb4593 100644 (file)
@@ -5785,7 +5785,7 @@ void generateSkeletonFromReebGraph(Scene *scene, ReebGraph *rg)
        }
        
        dst = add_object(scene, OB_ARMATURE);
-       ED_object_base_init_from_view(NULL, scene->basact);     // XXX NULL is C
+       ED_object_base_init_transform(NULL, scene->basact, NULL, NULL);         // XXX NULL is C, loc, rot
        obedit= scene->basact->object;
        
        /* Copy orientation from source */
index b6b0289e871f5512d49e201e84eff13886ccfe7c..da794eb1c25ceb70cfe4d2201dc9926ac7630f23 100644 (file)
@@ -475,11 +475,13 @@ static void txt_add_object(bContext *C, TextLine *firstline, int totline, float
        Base *base;
        struct TextLine *tmp;
        int nchars = 0, a;
-
+       float rot[3] = {0.f, 0.f, 0.f};
+       
        obedit= add_object(scene, OB_FONT);
        base= scene->basact;
 
-       ED_object_base_init_from_view(C, base, 1); /* seems to assume view align ? TODO - look into this, could be an operator option */
+       
+       ED_object_base_init_transform(C, base, NULL, rot); /* seems to assume view align ? TODO - look into this, could be an operator option */
        where_is_object(scene, obedit);
 
        obedit->loc[0] += offset[0];
index 1b77d298e3a9385134f6e229b0878141031bfbc5..0ba5c93837784b11531f9a39f4635016cd80d7bc 100644 (file)
@@ -79,11 +79,14 @@ void ED_object_toggle_modes(struct bContext *C, int mode);
 void ED_object_exit_editmode(struct bContext *C, int flag);
 void ED_object_enter_editmode(struct bContext *C, int flag);
 
-void ED_object_base_init_from_view(struct bContext *C, struct Base *base, int view_align);
+void ED_object_location_from_view(struct bContext *C, float *loc);
+void ED_object_rotation_from_view(struct bContext *C, float *rot);
+void ED_object_base_init_transform(struct bContext *C, struct Base *base, float *loc, float *rot);
+
 void ED_object_add_generic_props(struct wmOperatorType *ot, int do_editmode);
 int ED_object_add_generic_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
-void ED_object_add_generic_get_opts(struct wmOperator *op, int *view_align, int *enter_editmode);
-struct Object *ED_object_add_type(struct bContext *C, int type, int view_align, int enter_editmode);
+void ED_object_add_generic_get_opts(struct wmOperator *op, float *loc, float *rot, int *enter_editmode);
+struct Object *ED_object_add_type(struct bContext *C, int type, float *loc, float *rot, int enter_editmode);
 
 void ED_object_single_users(struct Scene *scene, int full);
 
index 26fde849f9f338c3203e44842c4f2b235532a752..d7f421331e5ef7341d59dfde59be885061f21050 100644 (file)
@@ -1273,30 +1273,25 @@ static void make_prim(Object *obedit, int type, float mat[4][4], int tot, int se
 
 /* uses context to figure out transform for primitive */
 /* returns standard diameter */
-static float new_primitive_matrix(bContext *C, int view_align, float primmat[][4])
+static float new_primitive_matrix(bContext *C, float *loc, float *rot, float primmat[][4])
 {
        Object *obedit= CTX_data_edit_object(C);
-       Scene *scene = CTX_data_scene(C);
        View3D *v3d =CTX_wm_view3d(C);
-       RegionView3D *rv3d= ED_view3d_context_rv3d(C);
-       float *curs, mat[3][3], vmat[3][3], cmat[3][3], imat[3][3];
+       float mat[3][3], rmat[3][3], cmat[3][3], imat[3][3];
        
        unit_m4(primmat);
+
+       eul_to_mat3(rmat, rot);
+       invert_m3(rmat);
        
-       if(rv3d && view_align) {
-               copy_m3_m4(vmat, rv3d->viewmat);
-       } else
-               unit_m3(vmat);
-       
-       /* inverse transform for view and object */
+       /* inverse transform for initial rotation and object */
        copy_m3_m4(mat, obedit->obmat);
-       mul_m3_m3m3(cmat, vmat, mat);
+       mul_m3_m3m3(cmat, rmat, mat);
        invert_m3_m3(imat, cmat);
        copy_m4_m3(primmat, imat);
 
        /* center */
-       curs= give_cursor(scene, v3d);
-       VECCOPY(primmat[3], curs);
+       VECCOPY(primmat[3], loc);
        VECSUB(primmat[3], primmat[3], obedit->obmat[3]);
        invert_m3_m3(imat, mat);
        mul_m3_v3(imat, primmat[3]);
@@ -1307,7 +1302,7 @@ static float new_primitive_matrix(bContext *C, int view_align, float primmat[][4
 
 /* ********* add primitive operators ************* */
 
-static void make_prim_ext(bContext *C, int view_align, int enter_editmode,
+static void make_prim_ext(bContext *C, float *loc, float *rot, int enter_editmode,
                int type, int tot, int seg,
                int subdiv, float dia, float depth, int ext, int fill)
 {
@@ -1316,14 +1311,15 @@ static void make_prim_ext(bContext *C, int view_align, int enter_editmode,
        float mat[4][4];
 
        if(obedit==NULL || obedit->type!=OB_MESH) {
+               obedit= ED_object_add_type(C, OB_MESH, loc, rot, FALSE);
+               
                /* create editmode */
-               obedit= ED_object_add_type(C, OB_MESH, view_align, FALSE);
                ED_object_enter_editmode(C, EM_DO_UNDO|EM_IGNORE_LAYER); /* rare cases the active layer is messed up */
                newob = 1;
        }
        else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
 
-       dia *= new_primitive_matrix(C, view_align, mat);
+       dia *= new_primitive_matrix(C, loc, rot, mat);
 
        make_prim(obedit, type, mat, tot, seg, subdiv, dia, depth, ext, fill);
 
@@ -1340,11 +1336,14 @@ static void make_prim_ext(bContext *C, int view_align, int enter_editmode,
 
 static int add_primitive_plane_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
        /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
-       make_prim_ext(C, view_align, enter_editmode, PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1);
+       make_prim_ext(C, loc, rot, enter_editmode,
+                       PRIM_PLANE, 4, 0, 0, sqrt(2.0f), 0.0f, 0, 1);
        return OPERATOR_FINISHED;       
 }
 
@@ -1368,11 +1367,14 @@ void MESH_OT_primitive_plane_add(wmOperatorType *ot)
 
 static int add_primitive_cube_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
        /* sqrt(2.0f) - plane (diameter of 1.41 makes it unit size) */
-       make_prim_ext(C, view_align, enter_editmode, PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1);
+       make_prim_ext(C, loc, rot, enter_editmode,
+                       PRIM_CUBE, 4, 0, 0, sqrt(2.0f), 1.0f, 1, 1);
        return OPERATOR_FINISHED;
 }
 
@@ -1396,10 +1398,12 @@ void MESH_OT_primitive_cube_add(wmOperatorType *ot)
 
 static int add_primitive_circle_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_CIRCLE, RNA_int_get(op->ptr, "vertices"), 0, 0,
                        RNA_float_get(op->ptr,"radius"), 0.0f, 0,
                        RNA_boolean_get(op->ptr, "fill"));
@@ -1432,10 +1436,12 @@ void MESH_OT_primitive_circle_add(wmOperatorType *ot)
 
 static int add_primitive_tube_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_CYLINDER, RNA_int_get(op->ptr, "vertices"), 0, 0,
                        RNA_float_get(op->ptr,"radius"),
                        RNA_float_get(op->ptr, "depth"), 1, 
@@ -1470,10 +1476,12 @@ void MESH_OT_primitive_tube_add(wmOperatorType *ot)
 
 static int add_primitive_cone_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_CONE, RNA_int_get(op->ptr, "vertices"), 0, 0,
                        RNA_float_get(op->ptr,"radius"), RNA_float_get(op->ptr, "depth"),
                        0, RNA_boolean_get(op->ptr, "cap_end"));
@@ -1507,10 +1515,12 @@ void MESH_OT_primitive_cone_add(wmOperatorType *ot)
 
 static int add_primitive_grid_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_GRID, RNA_int_get(op->ptr, "x_subdivisions"),
                        RNA_int_get(op->ptr, "y_subdivisions"), 0,
                        RNA_float_get(op->ptr,"size"), 0.0f, 0, 1);
@@ -1543,10 +1553,12 @@ void MESH_OT_primitive_grid_add(wmOperatorType *ot)
 
 static int add_primitive_monkey_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_MONKEY, 0, 0, 2, 0.0f, 0.0f, 0, 0);
 
        return OPERATOR_FINISHED;
@@ -1572,10 +1584,12 @@ void MESH_OT_primitive_monkey_add(wmOperatorType *ot)
 
 static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_UVSPHERE, RNA_int_get(op->ptr, "rings"),
                        RNA_int_get(op->ptr, "segments"), 0,
                        RNA_float_get(op->ptr,"size"), 0.0f, 0, 0);
@@ -1608,10 +1622,12 @@ void MESH_OT_primitive_uv_sphere_add(wmOperatorType *ot)
 
 static int add_primitive_icosphere_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       make_prim_ext(C, view_align, enter_editmode,
+       make_prim_ext(C, loc, rot, enter_editmode,
                        PRIM_ICOSPHERE, 0, 0, RNA_int_get(op->ptr, "subdivisions"),
                        RNA_float_get(op->ptr,"size"), 0.0f, 0, 0);
 
index 5ad6e2d557cd5cf7dc7845010bc0b3b26be1c2dd..abc182ef7ae1cbff75f83edcb270eba9f2e2b2e7 100644 (file)
 
 /************************** Exported *****************************/
 
-void ED_object_base_init_from_view(bContext *C, Base *base, int view_align)
+void ED_object_location_from_view(bContext *C, float *loc)
 {
        View3D *v3d= CTX_wm_view3d(C);
        Scene *scene= CTX_data_scene(C);
-       Object *ob= base->object;
        
-       if (scene==NULL)
-               return;
+       if (v3d) {
+               if (v3d->localvd)
+                       copy_v3_v3(loc, v3d->cursor);
+               else
+                       copy_v3_v3(loc, scene->cursor);
+       } else {
+               copy_v3_v3(loc, scene->cursor);
+       }
+}
+
+void ED_object_rotation_from_view(bContext *C, float *rot)
+{
+       RegionView3D *rv3d = CTX_wm_region_view3d(C);
        
-       if (v3d==NULL) {
-               base->lay = scene->lay;
-               VECCOPY(ob->loc, scene->cursor);
-       } 
-       else {
-               if (v3d->localvd) {
-                       base->lay= ob->lay= v3d->layact | v3d->lay;
-                       VECCOPY(ob->loc, v3d->cursor);
-               } 
-               else {
-                       base->lay= ob->lay= v3d->layact;
-                       VECCOPY(ob->loc, scene->cursor);
-               }
-               
-               if (view_align) {
-                       RegionView3D *rv3d = CTX_wm_region_view3d(C);
-                       if(rv3d) {
-                               rv3d->viewquat[0]= -rv3d->viewquat[0];
-                               quat_to_eul( ob->rot,rv3d->viewquat);
-                               rv3d->viewquat[0]= -rv3d->viewquat[0];
-                       }
-               }
+       if(rv3d) {
+               rv3d->viewquat[0]= -rv3d->viewquat[0];
+               quat_to_eul( rot, rv3d->viewquat);
+               rv3d->viewquat[0]= -rv3d->viewquat[0];
        }
+       else
+               rot[0] = rot[1] = rot[2] = 0.f;
+}
+
+void ED_object_base_init_transform(bContext *C, Base *base, float *loc, float *rot)
+{
+       Object *ob= base->object;
+       Scene *scene= CTX_data_scene(C);
+       
+       if (!scene) return;
+       
+       if (loc)
+               copy_v3_v3(ob->loc, loc);
+       
+       if (rot)
+               copy_v3_v3(ob->rot, rot);
+       
        where_is_object(scene, ob);
 }
 
@@ -143,20 +152,44 @@ void add_object_draw(Scene *scene, View3D *v3d, int type) /* for toolbox or menu
 
 void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode)
 {
-       RNA_def_boolean(ot->srna, "view_align", 0, "View Align", "Align the new object to the view.");
+       RNA_def_boolean(ot->srna, "view_align", 0, "Align to View", "Align the new object to the view.");
 
        if(do_editmode)
                RNA_def_boolean(ot->srna, "enter_editmode", 0, "Enter Editmode", "Enter editmode when adding this object.");
+       
+       RNA_def_float_vector(ot->srna, "location", 3, NULL, -FLT_MAX, FLT_MAX, "Location", "Location for the newly added object.", -FLT_MAX, FLT_MAX);
+       RNA_def_float_rotation(ot->srna, "rotation", 3, NULL, -FLT_MAX, FLT_MAX, "Rotation", "Rotation for the newly added object", -FLT_MAX, FLT_MAX);
 }
 
 static void object_add_generic_invoke_options(bContext *C, wmOperator *op)
 {
-       if (!RNA_property_is_set(op->ptr, "view_align"))
-               RNA_boolean_set(op->ptr, "view_align", U.flag & USER_ADD_VIEWALIGNED);
-
        if(RNA_struct_find_property(op->ptr, "enter_editmode")) /* optional */
                if (!RNA_property_is_set(op->ptr, "enter_editmode"))
                        RNA_boolean_set(op->ptr, "enter_editmode", U.flag & USER_ADD_EDITMODE);
+       
+       if (!RNA_property_is_set(op->ptr, "location")) {
+               float loc[3];
+               
+               ED_object_location_from_view(C, loc);
+               RNA_float_set_array(op->ptr, "location", loc);
+       }
+       
+       if (!RNA_property_is_set(op->ptr, "rotation")) {
+               int view_align;
+               float rot[3] = {0.f, 0.f, 0.f};
+       
+               /* view align property is just used to set rotation property */
+               if (!RNA_property_is_set(op->ptr, "view_align"))
+                       view_align = U.flag & USER_ADD_VIEWALIGNED;
+               else
+                       view_align = RNA_boolean_get(op->ptr, "view_align");
+               
+               if (view_align)
+                       ED_object_rotation_from_view(C, rot);
+
+               RNA_float_set_array(op->ptr, "rotation", rot);
+       }
+       
 }
 
 int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -165,18 +198,20 @@ int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *event)
        return op->type->exec(C, op);
 }
 
-void ED_object_add_generic_get_opts(wmOperator *op, int *view_align, int *enter_editmode)
+void ED_object_add_generic_get_opts(wmOperator *op, float *loc, float *rot, int *enter_editmode)
 {
-       *view_align= RNA_boolean_get(op->ptr, "view_align");
        *enter_editmode = FALSE;
 
        if(RNA_struct_find_property(op->ptr, "enter_editmode") && RNA_boolean_get(op->ptr, "enter_editmode")) {
                *enter_editmode = TRUE;
        }
+       
+       RNA_float_get_array(op->ptr, "location", loc);
+       RNA_float_get_array(op->ptr, "rotation", rot);
 }
 
 /* for object add primitive operators */
-Object *ED_object_add_type(bContext *C, int type, int view_align, int enter_editmode)
+Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode)
 {
        Scene *scene= CTX_data_scene(C);
        Object *ob;
@@ -191,7 +226,7 @@ Object *ED_object_add_type(bContext *C, int type, int view_align, int enter_edit
        ED_base_object_activate(C, BASACT);
 
        /* more editor stuff */
-       ED_object_base_init_from_view(C, BASACT, view_align);
+       ED_object_base_init_transform(C, BASACT, loc, rot);
 
        DAG_scene_sort(scene);
 
@@ -204,9 +239,11 @@ Object *ED_object_add_type(bContext *C, int type, int view_align, int enter_edit
 /* for object add operator */
 static int object_add_exec(bContext *C, wmOperator *op)
 {
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
-       ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), view_align, enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
+       ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode);
        
        return OPERATOR_FINISHED;
 }
@@ -258,11 +295,13 @@ void add_effector_draw(Scene *scene, View3D *v3d, int type)       /* for toolbox or me
 static Object *effector_add_type(bContext *C, wmOperator *op, int type)
 {
        Object *ob;
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
        if(type==PFIELD_GUIDE) {
-               ob= ED_object_add_type(C, OB_CURVE, view_align, FALSE);
+               ob= ED_object_add_type(C, OB_CURVE, loc, rot, FALSE);
                rename_id(&ob->id, "CurveGuide");
 
                ((Curve*)ob->data)->flag |= CU_PATH|CU_3D;
@@ -273,7 +312,7 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type)
                        ED_object_exit_editmode(C, EM_FREEDATA|EM_DO_UNDO);
        }
        else {
-               ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE);
+               ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE);
                rename_id(&ob->id, "Field");
 
                switch(type) {
@@ -335,13 +374,14 @@ static int object_add_curve_exec(bContext *C, wmOperator *op)
        ListBase *editnurb;
        Nurb *nu;
        int newob= 0, type= RNA_enum_get(op->ptr, "type");
-       int view_align, enter_editmode;
+       int enter_editmode;
+       float loc[3], rot[3];
        
        object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
        
        if(obedit==NULL || obedit->type!=OB_CURVE) {
-               obedit= ED_object_add_type(C, OB_CURVE, view_align, TRUE);
+               obedit= ED_object_add_type(C, OB_CURVE, loc, rot, TRUE);
                newob = 1;
 
                if(type & CU_PRIM_PATH)
@@ -419,13 +459,14 @@ static int object_add_surface_exec(bContext *C, wmOperator *op)
        ListBase *editnurb;
        Nurb *nu;
        int newob= 0;
-       int view_align, enter_editmode;
+       int enter_editmode;
+       float loc[3], rot[3];
        
        object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
        
        if(obedit==NULL || obedit->type!=OB_SURF) {
-               obedit= ED_object_add_type(C, OB_SURF, view_align, TRUE);
+               obedit= ED_object_add_type(C, OB_SURF, loc, rot, TRUE);
                newob = 1;
        }
        else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
@@ -479,13 +520,14 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
        MetaBall *mball;
        MetaElem *elem;
        int newob= 0;
-       int view_align, enter_editmode;
+       int enter_editmode;
+       float loc[3], rot[3];
        
        object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
        
        if(obedit==NULL || obedit->type!=OB_MBALL) {
-               obedit= ED_object_add_type(C, OB_MBALL, view_align, TRUE);
+               obedit= ED_object_add_type(C, OB_MBALL, loc, rot, TRUE);
                newob = 1;
        }
        else DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);
@@ -544,15 +586,16 @@ void OBJECT_OT_metaball_add(wmOperatorType *ot)
 static int object_add_text_exec(bContext *C, wmOperator *op)
 {
        Object *obedit= CTX_data_edit_object(C);
-       int view_align, enter_editmode;
+       int enter_editmode;
+       float loc[3], rot[3];
        
        object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
        
        if(obedit && obedit->type==OB_FONT)
                return OPERATOR_CANCELLED;
 
-       obedit= ED_object_add_type(C, OB_FONT, view_align, enter_editmode);
+       obedit= ED_object_add_type(C, OB_FONT, loc, rot, enter_editmode);
        
        WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, obedit);
        
@@ -582,13 +625,14 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
        View3D *v3d= CTX_wm_view3d(C);
        RegionView3D *rv3d= NULL;
        int newob= 0;
-       int view_align, enter_editmode;
+       int enter_editmode;
+       float loc[3], rot[3];
        
        object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
        
        if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) {
-               obedit= ED_object_add_type(C, OB_ARMATURE, view_align, TRUE);
+               obedit= ED_object_add_type(C, OB_ARMATURE, loc, rot, TRUE);
                ED_object_enter_editmode(C, 0);
                newob = 1;
        }
@@ -636,10 +680,12 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op)
 {
        Object *ob;
        int type= RNA_enum_get(op->ptr, "type");
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
-       ob= ED_object_add_type(C, OB_LAMP, view_align, FALSE);
+       ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE);
        if(ob && ob->data)
                ((Lamp*)ob->data)->type= type;
        
@@ -679,11 +725,13 @@ static int group_instance_add_exec(bContext *C, wmOperator *op)
 {
        Group *group= BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "type"));
 
-       int view_align, enter_editmode;
-       ED_object_add_generic_get_opts(op, &view_align, &enter_editmode);
+       int enter_editmode;
+       float loc[3], rot[3];
+       
+       ED_object_add_generic_get_opts(op, loc, rot, &enter_editmode);
 
        if(group) {
-               Object *ob= ED_object_add_type(C, OB_EMPTY, view_align, FALSE);
+               Object *ob= ED_object_add_type(C, OB_EMPTY, loc, rot, FALSE);
                rename_id(&ob->id, group->id.name+2);
                ob->dup_group= group;
                ob->transflag |= OB_DUPLIGROUP;