forked from bartvdbraak/blender
Todo item:
- Drop group into 3d window now puts itself at mouse cursor location. - Drop objects into 3d window now doesn't move the 3d cursor anymore. Added new function ED_view3d_cursor3d_position() to handle this, so the temporarily object-drop operator macro also could go away. (Which was setting 3d cursor)
This commit is contained in:
parent
0bca6c1834
commit
cffd10a7c8
@ -85,6 +85,7 @@ typedef struct ViewDepths {
|
||||
} ViewDepths;
|
||||
|
||||
float *give_cursor(struct Scene *scene, struct View3D *v3d);
|
||||
void ED_view3d_cursor3d_position(struct bContext *C, float *fp, int mx, int my);
|
||||
|
||||
void ED_view3d_to_m4(float mat[4][4], const float ofs[3], const float quat[4], const float dist);
|
||||
void ED_view3d_from_m4(float mat[4][4], float ofs[3], float quat[4], float *dist);
|
||||
|
@ -808,9 +808,16 @@ static int group_instance_add_exec(bContext *C, wmOperator *op)
|
||||
|
||||
if (RNA_struct_property_is_set(op->ptr, "name")) {
|
||||
char name[MAX_ID_NAME - 2];
|
||||
|
||||
|
||||
RNA_string_get(op->ptr, "name", name);
|
||||
group = (Group *)BKE_libblock_find_name(ID_GR, name);
|
||||
|
||||
if (0 == RNA_struct_property_is_set(op->ptr, "location")) {
|
||||
wmEvent *event = CTX_wm_window(C)->eventstate;
|
||||
ED_object_location_from_view(C, loc);
|
||||
ED_view3d_cursor3d_position(C, loc, event->x, event->y);
|
||||
RNA_float_set_array(op->ptr, "location", loc);
|
||||
}
|
||||
}
|
||||
else
|
||||
group = BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group"));
|
||||
@ -1994,6 +2001,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
|
||||
|
||||
static int add_named_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
wmEvent *event = CTX_wm_window(C)->eventstate;
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Base *basen, *base;
|
||||
@ -2026,6 +2034,8 @@ static int add_named_exec(bContext *C, wmOperator *op)
|
||||
basen->lay = basen->object->lay = scene->lay;
|
||||
|
||||
ED_object_location_from_view(C, basen->object->loc);
|
||||
ED_view3d_cursor3d_position(C, basen->object->loc, event->x, event->y);
|
||||
|
||||
ED_base_object_activate(C, basen);
|
||||
|
||||
copy_object_set_idnew(C, dupflag);
|
||||
|
@ -252,15 +252,6 @@ void ED_operatormacros_object(void)
|
||||
RNA_enum_set(otmacro->ptr, "proportional", PROP_EDIT_OFF);
|
||||
}
|
||||
|
||||
/* XXX */
|
||||
ot = WM_operatortype_append_macro("OBJECT_OT_add_named_cursor", "Add Named At Cursor",
|
||||
"Add named object at cursor", OPTYPE_UNDO | OPTYPE_REGISTER);
|
||||
if (ot) {
|
||||
RNA_def_string(ot->srna, "name", "Cube", MAX_ID_NAME - 2, "Name", "Object name to add");
|
||||
|
||||
WM_operatortype_macro_define(ot, "VIEW3D_OT_cursor3d");
|
||||
WM_operatortype_macro_define(ot, "OBJECT_OT_add_named");
|
||||
}
|
||||
}
|
||||
|
||||
static int object_mode_poll(bContext *C)
|
||||
|
@ -520,14 +520,8 @@ static int view3d_ima_ob_drop_poll(bContext *C, wmDrag *drag, wmEvent *event)
|
||||
static void view3d_ob_drop_copy(wmDrag *drag, wmDropBox *drop)
|
||||
{
|
||||
ID *id = (ID *)drag->poin;
|
||||
PointerRNA ptr;
|
||||
|
||||
/* need to put name in sub-operator in macro */
|
||||
ptr = RNA_pointer_get(drop->ptr, "OBJECT_OT_add_named");
|
||||
if (ptr.data)
|
||||
RNA_string_set(&ptr, "name", id->name + 2);
|
||||
else
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
RNA_string_set(drop->ptr, "name", id->name + 2);
|
||||
}
|
||||
|
||||
static void view3d_group_drop_copy(wmDrag *drag, wmDropBox *drop)
|
||||
@ -561,7 +555,7 @@ static void view3d_dropboxes(void)
|
||||
{
|
||||
ListBase *lb = WM_dropboxmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW);
|
||||
|
||||
WM_dropbox_add(lb, "OBJECT_OT_add_named_cursor", view3d_ob_drop_poll, view3d_ob_drop_copy);
|
||||
WM_dropbox_add(lb, "OBJECT_OT_add_named", view3d_ob_drop_poll, view3d_ob_drop_copy);
|
||||
WM_dropbox_add(lb, "OBJECT_OT_drop_named_material", view3d_mat_drop_poll, view3d_id_drop_copy);
|
||||
WM_dropbox_add(lb, "MESH_OT_drop_named_image", view3d_ima_ob_drop_poll, view3d_id_path_drop_copy);
|
||||
WM_dropbox_add(lb, "VIEW3D_OT_background_image_add", view3d_ima_bg_drop_poll, view3d_id_path_drop_copy);
|
||||
|
@ -3678,17 +3678,21 @@ void VIEW3D_OT_clip_border(wmOperatorType *ot)
|
||||
|
||||
/* ***************** 3d cursor cursor op ******************* */
|
||||
|
||||
/* mx my in region coords */
|
||||
static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
|
||||
/* cursor position in vec, result in vec, mval in region coords */
|
||||
/* note: cannot use event->mval here (called by object_add() */
|
||||
void ED_view3d_cursor3d_position(bContext *C, float *fp, int mx, int my)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
float *fp = give_cursor(scene, v3d);
|
||||
float mval_fl[2];
|
||||
int mval[2];
|
||||
int flip;
|
||||
|
||||
mval[0] = mx - ar->winrct.xmin;
|
||||
mval[1] = my - ar->winrct.ymin;
|
||||
|
||||
flip = initgrabz(rv3d, fp[0], fp[1], fp[2]);
|
||||
|
||||
/* reset the depth based on the view offset (we _know_ the offset is infront of us) */
|
||||
@ -3703,20 +3707,20 @@ static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *
|
||||
|
||||
if (U.uiflag & USER_ZBUF_CURSOR) { /* maybe this should be accessed some other way */
|
||||
view3d_operator_needs_opengl(C);
|
||||
if (ED_view3d_autodist(scene, ar, v3d, event->mval, fp))
|
||||
if (ED_view3d_autodist(scene, ar, v3d, mval, fp))
|
||||
depth_used = TRUE;
|
||||
}
|
||||
|
||||
if (depth_used == FALSE) {
|
||||
float dvec[3];
|
||||
VECSUB2D(mval_fl, mval_fl, event->mval);
|
||||
VECSUB2D(mval_fl, mval_fl, mval);
|
||||
ED_view3d_win_to_delta(ar, mval_fl, dvec);
|
||||
sub_v3_v3(fp, dvec);
|
||||
}
|
||||
}
|
||||
else {
|
||||
const float dx = ((float)(event->mval[0] - (ar->winx / 2))) * rv3d->zfac / (ar->winx / 2);
|
||||
const float dy = ((float)(event->mval[1] - (ar->winy / 2))) * rv3d->zfac / (ar->winy / 2);
|
||||
const float dx = ((float)(mval[0] - (ar->winx / 2))) * rv3d->zfac / (ar->winx / 2);
|
||||
const float dy = ((float)(mval[1] - (ar->winy / 2))) * rv3d->zfac / (ar->winy / 2);
|
||||
const float fz = (rv3d->persmat[0][3] * fp[0] +
|
||||
rv3d->persmat[1][3] * fp[1] +
|
||||
rv3d->persmat[2][3] * fp[2] +
|
||||
@ -3727,11 +3731,21 @@ static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *
|
||||
fp[2] = (rv3d->persinv[0][2] * dx + rv3d->persinv[1][2] * dy + rv3d->persinv[2][2] * fz) - rv3d->ofs[2];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
float *fp = give_cursor(scene, v3d);
|
||||
|
||||
ED_view3d_cursor3d_position(C, fp, event->x, event->y);
|
||||
|
||||
if (v3d && v3d->localvd)
|
||||
WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d);
|
||||
else
|
||||
WM_event_add_notifier(C, NC_SCENE | NA_EDITED, scene);
|
||||
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user