Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-12-09 03:45:50 +0300
committerCampbell Barton <ideasman42@gmail.com>2009-12-09 03:45:50 +0300
commite9b417c1bf4b8e42dce2ee42a7421d4177478e5d (patch)
treebab655eab88399ce23cb4b6741c72bbecb4ce9fd /source/blender/editors
parentfabdde675a02407e59e4f2720a64b1495b1080e7 (diff)
auto-dist working again, renamed obofs --> dyn_ofs, use_sel --> use_dyn_ofs, since its used by Auto-Depth too.
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c76
1 files changed, 60 insertions, 16 deletions
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 0ea185589e1..ad40a7266af 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -236,11 +236,14 @@ typedef struct ViewOpsData {
float oldquat[4];
float trackvec[3];
- float ofs[3], obofs[3];
float reverse, dist0;
float grid, far;
short axis_snap; /* view rotate only */
+ /* use for orbit selection and auto-dist */
+ float ofs[3], dyn_ofs[3];
+ short use_dyn_ofs;
+
int origx, origy, oldx, oldy;
int origkey; /* the key that triggered the operator */
@@ -292,14 +295,56 @@ static void viewops_data(bContext *C, wmOperator *op, wmEvent *event)
vod->origx= vod->oldx= event->x;
vod->origy= vod->oldy= event->y;
vod->origkey= event->type; /* the key that triggered the operator. */
-
- if (U.uiflag & USER_ORBIT_SELECTION)
- {
+ vod->use_dyn_ofs= (U.uiflag & USER_ORBIT_SELECTION) ? 1:0;
+
+ if (vod->use_dyn_ofs) {
VECCOPY(vod->ofs, rv3d->ofs);
/* If there's no selection, lastofs is unmodified and last value since static */
calculateTransformCenter(C, event, V3D_CENTROID, lastofs);
- VECCOPY(vod->obofs, lastofs);
- mul_v3_fl(vod->obofs, -1.0f);
+ VECCOPY(vod->dyn_ofs, lastofs);
+ mul_v3_fl(vod->dyn_ofs, -1.0f);
+ }
+ else if (U.uiflag & USER_ORBIT_ZBUF) {
+
+ view3d_operator_needs_opengl(C); /* needed for zbuf drawing */
+
+ if((vod->use_dyn_ofs=view_autodist(CTX_data_scene(C), vod->ar, v3d, event->mval, vod->dyn_ofs))) {
+ if (rv3d->persp==RV3D_PERSP) {
+ float my_origin[3]; /* original G.vd->ofs */
+ float my_pivot[3]; /* view */
+ float dvec[3];
+
+ // locals for dist correction
+ float mat[3][3];
+ float upvec[3];
+
+ VECCOPY(my_origin, rv3d->ofs);
+ negate_v3(my_origin); /* ofs is flipped */
+
+ /* Set the dist value to be the distance from this 3d point */
+ /* this means youll always be able to zoom into it and panning wont go bad when dist was zero */
+
+ /* remove dist value */
+ upvec[0] = upvec[1] = 0;
+ upvec[2] = rv3d->dist;
+ copy_m3_m4(mat, rv3d->viewinv);
+
+ mul_m3_v3(mat, upvec);
+ sub_v3_v3v3(my_pivot, rv3d->ofs, upvec);
+ negate_v3(my_pivot); /* ofs is flipped */
+
+ /* find a new ofs value that is allong the view axis (rather then the mouse location) */
+ closest_to_line_v3(dvec, vod->dyn_ofs, my_pivot, my_origin);
+ vod->dist0 = rv3d->dist = len_v3v3(my_pivot, dvec);
+
+ negate_v3(dvec);
+ VECCOPY(rv3d->ofs, dvec);
+ }
+ negate_v3(vod->dyn_ofs);
+ VECCOPY(vod->ofs, rv3d->ofs);
+ } else {
+ vod->ofs[0] = vod->ofs[1] = vod->ofs[2] = 0.0f;
+ }
}
/* lookup, we dont pass on v3d to prevent confusement */
@@ -413,7 +458,6 @@ void viewrotate_modal_keymap(wmKeyConfig *keyconf)
static void viewrotate_apply(ViewOpsData *vod, int x, int y)
{
RegionView3D *rv3d= vod->rv3d;
- int use_sel= U.uiflag & USER_ORBIT_SELECTION;
rv3d->view= 0; /* need to reset everytime because of view snapping */
@@ -449,7 +493,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
q1[3]*= si;
mul_qt_qtqt(rv3d->viewquat, q1, vod->oldquat);
- if (use_sel) {
+ if (vod->use_dyn_ofs) {
/* compute the post multiplication quat, to rotate the offset correctly */
QUATCOPY(q1, vod->oldquat);
conjugate_qt(q1);
@@ -457,9 +501,9 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
conjugate_qt(q1); /* conj == inv for unit quat */
VECCOPY(rv3d->ofs, vod->ofs);
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
mul_qt_v3(q1, rv3d->ofs);
- add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
}
}
else {
@@ -491,11 +535,11 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
q1[3] = si * xvec[2];
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
- if (use_sel) {
+ if (vod->use_dyn_ofs) {
conjugate_qt(q1); /* conj == inv for unit quat */
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
mul_qt_v3(q1, rv3d->ofs);
- add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
}
/* Perform the orbital rotation */
@@ -505,11 +549,11 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
q1[3] = sin(phi);
mul_qt_qtqt(rv3d->viewquat, rv3d->viewquat, q1);
- if (use_sel) {
+ if (vod->use_dyn_ofs) {
conjugate_qt(q1);
- sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ sub_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
mul_qt_v3(q1, rv3d->ofs);
- add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->obofs);
+ add_v3_v3v3(rv3d->ofs, rv3d->ofs, vod->dyn_ofs);
}
}