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:
authorGermano Cavalcante <germano.costa@ig.com.br>2021-11-18 19:55:24 +0300
committerGermano Cavalcante <germano.costa@ig.com.br>2021-11-18 20:14:51 +0300
commitf61a73093ba5efcbcf60098c12acbff4b31d8b08 (patch)
treebac83722f5fff31d324b0e24ce1d90c354fe54a9 /source/blender/editors/transform/transform_snap.c
parentada6742601a715ee0d078cd693ba303a8286e1bd (diff)
Revert "Revert "Revert "Revert "Transform: interactive mode for editing a 'Snap Source'""""
This reverts commit 701f2dfd5bc61c0f37603880fa21abfe8b1d9620.
Diffstat (limited to 'source/blender/editors/transform/transform_snap.c')
-rw-r--r--source/blender/editors/transform/transform_snap.c158
1 files changed, 136 insertions, 22 deletions
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 71f26ef0594..f52061f8910 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -136,6 +136,10 @@ bool validSnap(const TransInfo *t)
bool activeSnap(const TransInfo *t)
{
+ if (t->modifiers & MOD_SNAP_TEMP) {
+ return true;
+ }
+
return ((t->modifiers & (MOD_SNAP | MOD_SNAP_INVERT)) == MOD_SNAP) ||
((t->modifiers & (MOD_SNAP | MOD_SNAP_INVERT)) == MOD_SNAP_INVERT);
}
@@ -178,7 +182,7 @@ bool transformModeUseSnap(const TransInfo *t)
static bool doForceIncrementSnap(const TransInfo *t)
{
- return !transformModeUseSnap(t);
+ return !(t->modifiers & MOD_SNAP_TEMP) && !transformModeUseSnap(t);
}
void drawSnapping(const struct bContext *C, TransInfo *t)
@@ -232,6 +236,15 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
imm_drawcircball(p->co, ED_view3d_pixel_size(rv3d, p->co) * size, view_inv, pos);
}
+ if (t->modifiers & MOD_EDIT_SNAP_SOURCE) {
+ float snap_point[3];
+ getSnapPoint(t, snap_point);
+
+ immUniformColor4ubv(col);
+ imm_drawX(
+ snap_point, 0.75f * size * ED_view3d_pixel_size(rv3d, snap_point), view_inv, pos);
+ }
+
immUnbindProgram();
}
@@ -244,7 +257,7 @@ void drawSnapping(const struct bContext *C, TransInfo *t)
loc_prev = t->tsnap.snapTarget;
}
- if (validSnap(t)) {
+ if (t->tsnap.status & POINT_INIT) {
loc_cur = t->tsnap.snapPoint;
}
@@ -477,8 +490,7 @@ void applyGridAbsolute(TransInfo *t)
void applySnapping(TransInfo *t, float *vec)
{
- /* Each Trans Data already makes the snap to face */
- if (doForceIncrementSnap(t)) {
+ if (!transformModeUseSnap(t) && !(t->modifiers & MOD_SNAP_TEMP)) {
return;
}
@@ -659,6 +671,20 @@ static short snap_select_type_get(TransInfo *t)
return r_snap_select;
}
+static void snap_object_context_setup(TransInfo *t)
+{
+ if (t->data_type != TC_MESH_VERTS) {
+ return;
+ }
+ /* Ignore elements being transformed. */
+ ED_transform_snap_object_context_set_editmesh_callbacks(
+ t->tsnap.object_context,
+ (bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled,
+ bm_edge_is_snap_target,
+ bm_face_is_snap_target,
+ POINTER_FROM_UINT((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
+}
+
static void initSnappingMode(TransInfo *t)
{
ToolSettings *ts = t->settings;
@@ -670,27 +696,13 @@ static void initSnappingMode(TransInfo *t)
t->tsnap.project = 0;
}
- if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_NODE, SPACE_SEQ)) {
- /* Not with camera selected in camera view. */
- if (!(t->options & CTX_CAMERA)) {
- setSnappingCallback(t);
- }
- }
+ setSnappingCallback(t);
if (t->spacetype == SPACE_VIEW3D) {
if (t->tsnap.object_context == NULL) {
t->tsnap.use_backface_culling = snap_use_backface_culling(t);
t->tsnap.object_context = ED_transform_snap_object_context_create(t->scene, 0);
-
- if (t->data_type == TC_MESH_VERTS) {
- /* Ignore elements being transformed. */
- ED_transform_snap_object_context_set_editmesh_callbacks(
- t->tsnap.object_context,
- (bool (*)(BMVert *, void *))BM_elem_cb_check_hflag_disabled,
- bm_edge_is_snap_target,
- bm_face_is_snap_target,
- POINTER_FROM_UINT((BM_ELEM_SELECT | BM_ELEM_HIDDEN)));
- }
+ snap_object_context_setup(t);
}
}
else if (t->spacetype == SPACE_SEQ) {
@@ -775,10 +787,16 @@ void freeSnapping(TransInfo *t)
static void setSnappingCallback(TransInfo *t)
{
if (t->spacetype == SPACE_VIEW3D) {
+ if (t->options & CTX_CAMERA) {
+ /* Not with camera selected in camera view. */
+ return;
+ }
t->tsnap.calcSnap = snap_calc_view3d_fn;
}
- else if (t->spacetype == SPACE_IMAGE && t->obedit_type == OB_MESH) {
- t->tsnap.calcSnap = snap_calc_uv_fn;
+ else if (t->spacetype == SPACE_IMAGE) {
+ if (t->obedit_type == OB_MESH) {
+ t->tsnap.calcSnap = snap_calc_uv_fn;
+ }
}
else if (t->spacetype == SPACE_NODE) {
t->tsnap.calcSnap = snap_calc_node_fn;
@@ -788,6 +806,9 @@ static void setSnappingCallback(TransInfo *t)
/* The target is calculated along with the snap point. */
return;
}
+ else {
+ return;
+ }
switch (t->tsnap.target) {
case SCE_SNAP_TARGET_CLOSEST:
@@ -905,6 +926,15 @@ void getSnapPoint(const TransInfo *t, float vec[3])
}
}
+static void transform_snap_multipoints_free(TransInfo *t)
+{
+ if (t->tsnap.status & MULTI_POINTS) {
+ BLI_freelistN(&t->tsnap.points);
+ t->tsnap.status &= ~MULTI_POINTS;
+ t->tsnap.selectedPoint = NULL;
+ }
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -1619,6 +1649,90 @@ bool transform_snap_increment(const TransInfo *t, float *r_val)
return transform_snap_increment_ex(t, false, r_val);
}
+static void snap_source_mod_start(TransInfo *t)
+{
+ t->modifiers |= MOD_EDIT_SNAP_SOURCE;
+ t->tsnap.modeSelect = SNAP_ALL;
+ if ((t->tsnap.status & TARGET_INIT) == 0) {
+ /* Calculate the current target for the perpendicular snap. */
+ t->tsnap.targetSnap(t);
+
+ /* Fallback. */
+ TargetSnapMedian(t);
+ }
+ t->tsnap.targetSnap = NULL;
+
+ if ((t->tsnap.mode & ~(SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID)) == 0) {
+ /* Initialize snap modes for geometry. */
+ t->tsnap.mode &= ~(SCE_SNAP_MODE_INCREMENT | SCE_SNAP_MODE_GRID);
+ t->tsnap.mode |= SCE_SNAP_MODE_GEOM;
+ }
+
+ if (!activeSnap(t) || !transformModeUseSnap(t)) {
+ t->modifiers |= MOD_SNAP_TEMP;
+ }
+
+ restoreTransObjects(t);
+
+ if (t->data_type == TC_MESH_VERTS) {
+ ED_transform_snap_object_context_set_editmesh_callbacks(
+ t->tsnap.object_context, NULL, NULL, NULL, NULL);
+ }
+
+ t->redraw |= TREDRAW_SOFT;
+}
+
+static void snap_source_mod_end(TransInfo *t)
+{
+ t->modifiers &= ~MOD_EDIT_SNAP_SOURCE;
+
+ /* Restore. */
+ t->tsnap.modeSelect = snap_select_type_get(t);
+ snap_object_context_setup(t);
+ transform_snap_multipoints_free(t);
+}
+
+void tranform_snap_source_mod_toggle(TransInfo *t)
+{
+ if (t->flag & T_RELEASE_CONFIRM) {
+ return;
+ }
+
+ if (!(t->modifiers & MOD_EDIT_SNAP_SOURCE)) {
+ snap_source_mod_start(t);
+ }
+ else if (t->modifiers & MOD_EDIT_SNAP_SOURCE) {
+ /* Cancel. */
+ t->modifiers &= ~MOD_SNAP_TEMP;
+ t->tsnap.mode = snap_mode_from_scene(t);
+ setSnappingCallback(t);
+ snap_source_mod_end(t);
+ }
+}
+
+void tranform_snap_source_mod_update(TransInfo *t)
+{
+ BLI_assert(t->modifiers & MOD_EDIT_SNAP_SOURCE);
+
+ /* Time base quirky code to go around findnearest slowness */
+ /* TODO: add exception for object mode, no need to slow it down then. */
+ double current = PIL_check_seconds_timer();
+ if (current - t->tsnap.last >= 0.01) {
+ t->tsnap.calcSnap(t, NULL);
+ t->tsnap.last = current;
+ t->redraw |= TREDRAW_SOFT;
+ }
+}
+
+void tranform_snap_source_mod_confirm(TransInfo *t)
+{
+ BLI_assert(t->modifiers & MOD_EDIT_SNAP_SOURCE);
+ getSnapPoint(t, t->tsnap.snapTarget);
+
+ transform_input_reset(&t->mouse, t->mval);
+ snap_source_mod_end(t);
+}
+
/** \} */
/* -------------------------------------------------------------------- */