diff --git a/source/blender/bmesh/operators/bmo_primitive.c b/source/blender/bmesh/operators/bmo_primitive.c index 34e4efbe562..f0e31b78ca0 100644 --- a/source/blender/bmesh/operators/bmo_primitive.c +++ b/source/blender/bmesh/operators/bmo_primitive.c @@ -453,7 +453,10 @@ void bmo_create_monkey_exec(BMesh *bm, BMOperator *op) for (i = 0; i < monkeynv; i++) { float v[3]; - v[0] = (monkeyv[i][0] + 127) / 128.0, v[1] = monkeyv[i][1] / 128.0, v[2] = monkeyv[i][2] / 128.0; + /* rotate to face in the -Y axis */ + v[0] = (monkeyv[i][0] + 127) / 128.0; + v[2] = monkeyv[i][1] / 128.0; + v[1] = monkeyv[i][2] / -128.0; tv[i] = BM_vert_create(bm, v, NULL, BM_CREATE_NOP); BMO_elem_flag_enable(bm, tv[i], VERT_MARK); diff --git a/source/blender/editors/curve/editcurve_add.c b/source/blender/editors/curve/editcurve_add.c index 6804aa3584f..a1d144a92e9 100644 --- a/source/blender/editors/curve/editcurve_add.c +++ b/source/blender/editors/curve/editcurve_add.c @@ -473,7 +473,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) ListBase *editnurb; Nurb *nu; bool newob = false; - bool enter_editmode, is_view_aligned; + bool enter_editmode; unsigned int layer; float dia; float loc[3], rot[3]; @@ -481,7 +481,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf) WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, &is_view_aligned)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if (!isSurf) { /* adding curve */ diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h index a8711e8bbfb..973023227f0 100644 --- a/source/blender/editors/include/ED_object.h +++ b/source/blender/editors/include/ED_object.h @@ -138,7 +138,7 @@ void ED_object_editmode_enter(struct bContext *C, int flag); bool ED_object_editmode_load(struct Object *obedit); void ED_object_location_from_view(struct bContext *C, float loc[3]); -void ED_object_rotation_from_view(struct bContext *C, float rot[3]); +void ED_object_rotation_from_view(struct bContext *C, float rot[3], const char align_axis); void ED_object_base_init_transform(struct bContext *C, struct Base *base, const float loc[3], const float rot[3]); float ED_object_new_primitive_matrix(struct bContext *C, struct Object *editob, const float loc[3], const float rot[3], float primmat[4][4], @@ -146,7 +146,8 @@ float ED_object_new_primitive_matrix(struct bContext *C, struct Object *editob, void ED_object_add_unit_props(struct wmOperatorType *ot); void ED_object_add_generic_props(struct wmOperatorType *ot, bool do_editmode); -bool ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, float loc[3], float rot[3], +bool ED_object_add_generic_get_opts(struct bContext *C, struct wmOperator *op, const char view_align_axis, + 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], diff --git a/source/blender/editors/mesh/editmesh_add.c b/source/blender/editors/mesh/editmesh_add.c index f81eef7ac88..1a0fea51581 100644 --- a/source/blender/editors/mesh/editmesh_add.c +++ b/source/blender/editors/mesh/editmesh_add.c @@ -106,7 +106,7 @@ static int add_primitive_plane_exec(bContext *C, wmOperator *op) unsigned int layer; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Plane"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -151,7 +151,7 @@ static int add_primitive_cube_exec(bContext *C, wmOperator *op) unsigned int layer; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Cube"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -207,7 +207,7 @@ static int add_primitive_circle_exec(bContext *C, wmOperator *op) cap_tri = (cap_end == 2); WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Circle"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -260,7 +260,7 @@ static int add_primitive_cylinder_exec(bContext *C, wmOperator *op) const bool cap_tri = (end_fill_type == 2); WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Cylinder"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -320,7 +320,7 @@ static int add_primitive_cone_exec(bContext *C, wmOperator *op) const bool cap_tri = (end_fill_type == 2); WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Cone"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -377,7 +377,7 @@ static int add_primitive_grid_exec(bContext *C, wmOperator *op) unsigned int layer; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Grid"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -424,14 +424,11 @@ static int add_primitive_monkey_exec(bContext *C, wmOperator *op) BMEditMesh *em; float loc[3], rot[3], mat[4][4], dia; bool enter_editmode; - bool is_view_aligned; unsigned int layer; bool was_editmode; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, &is_view_aligned); - if (!is_view_aligned) - rot[0] += (float)M_PI / 2.0f; + ED_object_add_generic_get_opts(C, op, 'Y', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Suzanne"), &dia, mat, &was_editmode, loc, rot, layer); dia = RNA_float_get(op->ptr, "radius"); @@ -481,7 +478,7 @@ static int add_primitive_uvsphere_exec(bContext *C, wmOperator *op) unsigned int layer; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Sphere"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); @@ -534,7 +531,7 @@ static int add_primitive_icosphere_exec(bContext *C, wmOperator *op) unsigned int layer; WM_operator_view3d_unit_defaults(C, op); - ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL); + ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL); obedit = make_prim_init(C, CTX_DATA_(BLF_I18NCONTEXT_ID_MESH, "Icosphere"), &dia, mat, &was_editmode, loc, rot, layer); em = BKE_editmesh_from_object(obedit); diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index b2977bb18b0..8209d5db8cd 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -158,14 +158,46 @@ void ED_object_location_from_view(bContext *C, float loc[3]) copy_v3_v3(loc, cursor); } -void ED_object_rotation_from_view(bContext *C, float rot[3]) +void ED_object_rotation_from_view(bContext *C, float rot[3], const char align_axis) { RegionView3D *rv3d = CTX_wm_region_view3d(C); + + BLI_assert(align_axis >= 'X' && align_axis <= 'Z'); + if (rv3d) { + const float pi_2 = (float)M_PI / 2.0f; float quat[4]; - copy_qt_qt(quat, rv3d->viewquat); - quat[0] = -quat[0]; - quat_to_eul(rot, quat); + + switch (align_axis) { + case 'X': + { + float quat_y[4]; + axis_angle_to_quat(quat_y, rv3d->viewinv[1], -pi_2); + mul_qt_qtqt(quat, rv3d->viewquat, quat_y); + quat[0] = -quat[0]; + + quat_to_eul(rot, quat); + break; + } + case 'Y': + { + copy_qt_qt(quat, rv3d->viewquat); + quat[0] = -quat[0]; + + quat_to_eul(rot, quat); + rot[0] -= pi_2; + break; + } + case 'Z': + { + copy_qt_qt(quat, rv3d->viewquat); + quat[0] = -quat[0]; + + quat_to_eul(rot, quat); + break; + } + } + } else { zero_v3(rot); @@ -270,7 +302,8 @@ void ED_object_add_generic_props(wmOperatorType *ot, bool do_editmode) RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); } -bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float loc[3], float rot[3], +bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, const char view_align_axis, + float loc[3], float rot[3], bool *enter_editmode, unsigned int *layer, bool *is_view_aligned) { View3D *v3d = CTX_wm_view3d(C); @@ -356,7 +389,7 @@ bool ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float loc[3], f } if (*is_view_aligned) { - ED_object_rotation_from_view(C, rot); + ED_object_rotation_from_view(C, rot, view_align_axis); RNA_float_set_array(op->ptr, "rotation", rot); } else @@ -420,7 +453,7 @@ static int object_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + 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); @@ -459,7 +492,7 @@ static int effector_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; float mat[4][4]; - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + 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"); @@ -527,7 +560,7 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) /* force view align for cameras */ RNA_boolean_set(op->ptr, "view_align", TRUE); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; ob = ED_object_add_type(C, OB_CAMERA, loc, rot, FALSE, layer); @@ -580,7 +613,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) float dia; WM_operator_view3d_unit_defaults(C, op); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if (obedit == NULL || obedit->type != OB_MBALL) { @@ -636,7 +669,7 @@ static int object_add_text_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if (obedit && obedit->type == OB_FONT) @@ -677,7 +710,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; bool view_aligned = rv3d && (U.flag & USER_ADD_VIEWALIGNED); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if ((obedit == NULL) || (obedit->type != OB_ARMATURE)) { @@ -730,7 +763,7 @@ static int object_empty_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - if (!ED_object_add_generic_get_opts(C, op, loc, rot, NULL, &layer, NULL)) + 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); @@ -798,7 +831,7 @@ static int empty_drop_named_image_invoke(bContext *C, wmOperator *op, const wmEv unsigned int layer; float rot[3]; - if (!ED_object_add_generic_get_opts(C, op, NULL, rot, NULL, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', NULL, rot, NULL, &layer, NULL)) return OPERATOR_CANCELLED; ob = ED_object_add_type(C, OB_EMPTY, NULL, rot, FALSE, layer); @@ -862,7 +895,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - if (!ED_object_add_generic_get_opts(C, op, loc, rot, NULL, &layer, NULL)) + 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); @@ -926,7 +959,7 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) else group = BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, NULL, &layer, NULL)) + if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL)) return OPERATOR_CANCELLED; if (group) { @@ -981,7 +1014,7 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; Scene *scene = CTX_data_scene(C); - if (!ED_object_add_generic_get_opts(C, op, loc, rot, NULL, &layer, NULL)) + 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_SPEAKER, loc, rot, FALSE, layer);