Snapping System: Improve drawing indicating Perpendicular snap
Since pependicular snap depends on `snapTarget` it is important to indicate where this target is so as not to confuse users. So draw a pivot where the target is and a dotted line toward the perpendicular snap point. Reviewers: campbellbarton, brecht, billreynish Differential Revision: https://developer.blender.org/D5557
This commit is contained in:
@@ -197,12 +197,12 @@ bool peelObjectsSnapContext(struct SnapObjectContext *sctx,
|
||||
float r_no[3],
|
||||
float *r_thickness);
|
||||
|
||||
bool snapObjectsTransform(struct TransInfo *t,
|
||||
const float mval[2],
|
||||
float *dist_px,
|
||||
/* return args */
|
||||
float r_loc[3],
|
||||
float r_no[3]);
|
||||
short snapObjectsTransform(struct TransInfo *t,
|
||||
const float mval[2],
|
||||
float *dist_px,
|
||||
/* return args */
|
||||
float r_loc[3],
|
||||
float r_no[3]);
|
||||
bool snapNodesTransform(struct TransInfo *t,
|
||||
const int mval[2],
|
||||
/* return args */
|
||||
|
||||
@@ -85,7 +85,9 @@ typedef struct TransSnap {
|
||||
bool snap_self;
|
||||
bool peel;
|
||||
bool snap_spatial_grid;
|
||||
short status;
|
||||
char status;
|
||||
/* Snapped Element Type (currently for objects only). */
|
||||
char snapElem;
|
||||
/** snapping from this point (in global-space). */
|
||||
float snapPoint[3];
|
||||
/** to this point (in global-space). */
|
||||
|
||||
@@ -166,7 +166,10 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
|
||||
activeCol[3] = 192;
|
||||
|
||||
if (t->spacetype == SPACE_VIEW3D) {
|
||||
if (validSnap(t)) {
|
||||
bool draw_target = (t->tsnap.status & TARGET_INIT) &&
|
||||
(t->scene->toolsettings->snap_mode & SCE_SNAP_MODE_EDGE_PERPENDICULAR);
|
||||
|
||||
if (draw_target || validSnap(t)) {
|
||||
TransSnapPoint *p;
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
float imat[4][4];
|
||||
@@ -214,6 +217,48 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
|
||||
immEnd();
|
||||
}
|
||||
|
||||
if (draw_target) {
|
||||
/* Draw snapTarget */
|
||||
float targ_co[3], vx[3], vy[3], v1[3], v2[3], v3[3], v4[4];
|
||||
copy_v3_v3(targ_co, t->tsnap.snapTarget);
|
||||
float px_size = 0.75f * size * ED_view3d_pixel_size(rv3d, targ_co);
|
||||
|
||||
mul_v3_v3fl(vx, imat[0], px_size);
|
||||
mul_v3_v3fl(vy, imat[1], px_size);
|
||||
|
||||
add_v3_v3v3(v1, vx, vy);
|
||||
sub_v3_v3v3(v2, vx, vy);
|
||||
negate_v3_v3(v3, v1);
|
||||
negate_v3_v3(v4, v2);
|
||||
|
||||
add_v3_v3(v1, targ_co);
|
||||
add_v3_v3(v2, targ_co);
|
||||
add_v3_v3(v3, targ_co);
|
||||
add_v3_v3(v4, targ_co);
|
||||
|
||||
immUniformColor4ubv(col);
|
||||
immBegin(GPU_PRIM_LINES, 4);
|
||||
immVertex3fv(pos, v3);
|
||||
immVertex3fv(pos, v1);
|
||||
immVertex3fv(pos, v4);
|
||||
immVertex3fv(pos, v2);
|
||||
immEnd();
|
||||
|
||||
if (t->tsnap.snapElem & SCE_SNAP_MODE_EDGE_PERPENDICULAR) {
|
||||
immUnbindProgram();
|
||||
|
||||
immBindBuiltinProgram(GPU_SHADER_3D_LINE_DASHED_UNIFORM_COLOR);
|
||||
immUniform1f("dash_width", 6.0f * U.pixelsize);
|
||||
immUniform1f("dash_factor", 1.0f / 4.0f);
|
||||
immUniformColor4ubv(col);
|
||||
|
||||
immBegin(GPU_PRIM_LINES, 2);
|
||||
immVertex3fv(pos, targ_co);
|
||||
immVertex3fv(pos, t->tsnap.snapPoint);
|
||||
immEnd();
|
||||
}
|
||||
}
|
||||
|
||||
immUnbindProgram();
|
||||
|
||||
GPU_depth_test(true);
|
||||
@@ -994,6 +1039,7 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
|
||||
float no[3];
|
||||
float mval[2];
|
||||
bool found = false;
|
||||
short snap_elem = 0;
|
||||
float dist_px = SNAP_MIN_DISTANCE; // Use a user defined value here
|
||||
|
||||
mval[0] = t->mval[0];
|
||||
@@ -1002,11 +1048,16 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
|
||||
if (t->tsnap.mode & (SCE_SNAP_MODE_VERTEX | SCE_SNAP_MODE_EDGE | SCE_SNAP_MODE_FACE |
|
||||
SCE_SNAP_MODE_EDGE_MIDPOINT | SCE_SNAP_MODE_EDGE_PERPENDICULAR)) {
|
||||
zero_v3(no); /* objects won't set this */
|
||||
found = snapObjectsTransform(t, mval, &dist_px, loc, no);
|
||||
snap_elem = snapObjectsTransform(t, mval, &dist_px, loc, no);
|
||||
found = snap_elem != 0;
|
||||
}
|
||||
if ((found == false) && (t->tsnap.mode & SCE_SNAP_MODE_VOLUME)) {
|
||||
found = peelObjectsTransform(
|
||||
t, mval, (t->settings->snap_flag & SCE_SNAP_PEEL_OBJECT) != 0, loc, no, NULL);
|
||||
|
||||
if (found) {
|
||||
snap_elem = SCE_SNAP_MODE_VOLUME;
|
||||
}
|
||||
}
|
||||
|
||||
if (found == true) {
|
||||
@@ -1018,6 +1069,8 @@ static void CalcSnapGeometry(TransInfo *t, float *UNUSED(vec))
|
||||
else {
|
||||
t->tsnap.status &= ~POINT_INIT;
|
||||
}
|
||||
|
||||
t->tsnap.snapElem = (char)snap_elem;
|
||||
}
|
||||
else if (t->spacetype == SPACE_IMAGE && t->obedit_type == OB_MESH) {
|
||||
if (t->tsnap.mode & SCE_SNAP_MODE_VERTEX) {
|
||||
@@ -1261,10 +1314,10 @@ static void TargetSnapClosest(TransInfo *t)
|
||||
}
|
||||
}
|
||||
|
||||
bool snapObjectsTransform(
|
||||
short snapObjectsTransform(
|
||||
TransInfo *t, const float mval[2], float *dist_px, float r_loc[3], float r_no[3])
|
||||
{
|
||||
return ED_transform_snap_object_project_view3d(
|
||||
return ED_transform_snap_object_project_view3d_ex(
|
||||
t->tsnap.object_context,
|
||||
t->scene->toolsettings->snap_mode,
|
||||
&(const struct SnapObjectParams){
|
||||
@@ -1276,7 +1329,10 @@ bool snapObjectsTransform(
|
||||
t->tsnap.snapTarget,
|
||||
dist_px,
|
||||
r_loc,
|
||||
r_no);
|
||||
r_no,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/******************** PEELING *********************************/
|
||||
|
||||
Reference in New Issue
Block a user