Fix T100370: Depth choice for "Add Cube" tool always using Surface
As the surface normal is calculated along with the coordinates, the surface depth was always being used when surface orientation was set. Therefore, even calculated, ignore the surface depth when it is not required. Also promote an optimization when neither orientation nor depth is required.
This commit is contained in:
parent
fd57f520ac
commit
82fe475f06
Notes:
blender-bot
2023-02-14 08:07:50 +01:00
Referenced by issue #100370, Depth choice for "Add Cube" tool is ignored (always uses Surface)
|
@ -495,6 +495,16 @@ static void v3d_cursor_eventstate_save_xy(SnapCursorDataIntern *cursor_snap,
|
|||
}
|
||||
|
||||
#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
|
||||
static void v3d_cursor_eventstate_save_modifier(SnapCursorDataIntern *data_intern,
|
||||
const wmWindowManager *wm)
|
||||
{
|
||||
if (!wm || !wm->winactive) {
|
||||
return;
|
||||
}
|
||||
const wmEvent *event = wm->winactive->eventstate;
|
||||
data_intern->last_eventstate.modifier = event->modifier;
|
||||
}
|
||||
|
||||
static bool v3d_cursor_is_snap_invert(SnapCursorDataIntern *data_intern, const wmWindowManager *wm)
|
||||
{
|
||||
if (!wm || !wm->winactive) {
|
||||
|
@ -582,10 +592,14 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state,
|
|||
{
|
||||
SnapCursorDataIntern *data_intern = &g_data_intern;
|
||||
V3DSnapCursorData *snap_data = &data_intern->snap_data;
|
||||
v3d_cursor_snap_context_ensure(scene);
|
||||
|
||||
const bool use_surface_nor = state->plane_orient == V3D_PLACE_ORIENT_SURFACE;
|
||||
const bool use_surface_co = state->plane_depth == V3D_PLACE_DEPTH_SURFACE;
|
||||
const bool calc_plane_omat = v3d_cursor_snap_calc_plane();
|
||||
|
||||
float co[3], no[3], face_nor[3], obmat[4][4], omat[3][3];
|
||||
eSnapMode snap_elem = SCE_SNAP_MODE_NONE;
|
||||
eSnapMode snap_elements = v3d_cursor_snap_elements(state, scene);
|
||||
int snap_elem_index[3] = {-1, -1, -1};
|
||||
int index = -1;
|
||||
|
||||
|
@ -594,77 +608,84 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state,
|
|||
zero_v3(face_nor);
|
||||
unit_m3(omat);
|
||||
|
||||
eSnapMode snap_elements = v3d_cursor_snap_elements(state, scene);
|
||||
data_intern->snap_elem_hidden = SCE_SNAP_MODE_NONE;
|
||||
const bool calc_plane_omat = v3d_cursor_snap_calc_plane();
|
||||
if (calc_plane_omat && !(snap_elements & SCE_SNAP_MODE_FACE_RAYCAST)) {
|
||||
data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
snap_elements |= SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
}
|
||||
if (use_surface_nor || use_surface_co) {
|
||||
v3d_cursor_snap_context_ensure(scene);
|
||||
|
||||
snap_data->is_enabled = true;
|
||||
#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
|
||||
if (!(state->flag & V3D_SNAPCURSOR_TOGGLE_ALWAYS_TRUE)) {
|
||||
snap_data->is_snap_invert = v3d_cursor_is_snap_invert(data_intern, wm);
|
||||
|
||||
const ToolSettings *ts = scene->toolsettings;
|
||||
if (snap_data->is_snap_invert != !(ts->snap_flag & SCE_SNAP)) {
|
||||
snap_data->is_enabled = false;
|
||||
if (!calc_plane_omat) {
|
||||
snap_data->snap_elem = SCE_SNAP_MODE_NONE;
|
||||
return;
|
||||
}
|
||||
snap_elements = data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
data_intern->snap_elem_hidden = SCE_SNAP_MODE_NONE;
|
||||
if (calc_plane_omat && !(snap_elements & SCE_SNAP_MODE_FACE_RAYCAST)) {
|
||||
data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
snap_elements |= SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
}
|
||||
|
||||
snap_data->is_enabled = true;
|
||||
#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
|
||||
if (!(state->flag & V3D_SNAPCURSOR_TOGGLE_ALWAYS_TRUE)) {
|
||||
snap_data->is_snap_invert = v3d_cursor_is_snap_invert(data_intern, wm);
|
||||
|
||||
const ToolSettings *ts = scene->toolsettings;
|
||||
if (snap_data->is_snap_invert != !(ts->snap_flag & SCE_SNAP)) {
|
||||
snap_data->is_enabled = false;
|
||||
if (!calc_plane_omat) {
|
||||
snap_data->snap_elem = SCE_SNAP_MODE_NONE;
|
||||
return;
|
||||
}
|
||||
snap_elements = data_intern->snap_elem_hidden = SCE_SNAP_MODE_FACE_RAYCAST;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (snap_elements & SCE_SNAP_MODE_GEOM) {
|
||||
float prev_co[3] = {0.0f};
|
||||
if (state->prevpoint) {
|
||||
copy_v3_v3(prev_co, state->prevpoint);
|
||||
}
|
||||
else {
|
||||
snap_elements &= ~SCE_SNAP_MODE_EDGE_PERPENDICULAR;
|
||||
}
|
||||
|
||||
eSnapEditType edit_mode_type = (state->flag & V3D_SNAPCURSOR_SNAP_EDIT_GEOM_FINAL) ?
|
||||
SNAP_GEOM_FINAL :
|
||||
(state->flag & V3D_SNAPCURSOR_SNAP_EDIT_GEOM_CAGE) ?
|
||||
SNAP_GEOM_CAGE :
|
||||
SNAP_GEOM_EDIT;
|
||||
|
||||
bool use_occlusion_test = (state->flag & V3D_SNAPCURSOR_OCCLUSION_ALWAYS_TRUE) ? false :
|
||||
true;
|
||||
|
||||
float dist_px = 12.0f * U.pixelsize;
|
||||
|
||||
snap_elem = ED_transform_snap_object_project_view3d_ex(
|
||||
data_intern->snap_context_v3d,
|
||||
depsgraph,
|
||||
region,
|
||||
v3d,
|
||||
snap_elements,
|
||||
&(const struct SnapObjectParams){
|
||||
.snap_target_select = SCE_SNAP_TARGET_ALL,
|
||||
.edit_mode_type = edit_mode_type,
|
||||
.use_occlusion_test = use_occlusion_test,
|
||||
},
|
||||
NULL,
|
||||
mval_fl,
|
||||
prev_co,
|
||||
&dist_px,
|
||||
co,
|
||||
no,
|
||||
&index,
|
||||
NULL,
|
||||
obmat,
|
||||
face_nor);
|
||||
}
|
||||
}
|
||||
#ifdef USE_SNAP_DETECT_FROM_KEYMAP_HACK
|
||||
else {
|
||||
v3d_cursor_eventstate_save_modifier(data_intern, wm);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (snap_elements & SCE_SNAP_MODE_GEOM) {
|
||||
float prev_co[3] = {0.0f};
|
||||
if (state->prevpoint) {
|
||||
copy_v3_v3(prev_co, state->prevpoint);
|
||||
}
|
||||
else {
|
||||
snap_elements &= ~SCE_SNAP_MODE_EDGE_PERPENDICULAR;
|
||||
}
|
||||
|
||||
eSnapEditType edit_mode_type = (state->flag & V3D_SNAPCURSOR_SNAP_EDIT_GEOM_FINAL) ?
|
||||
SNAP_GEOM_FINAL :
|
||||
(state->flag & V3D_SNAPCURSOR_SNAP_EDIT_GEOM_CAGE) ?
|
||||
SNAP_GEOM_CAGE :
|
||||
SNAP_GEOM_EDIT;
|
||||
|
||||
bool use_occlusion_test = (state->flag & V3D_SNAPCURSOR_OCCLUSION_ALWAYS_TRUE) ? false : true;
|
||||
|
||||
float dist_px = 12.0f * U.pixelsize;
|
||||
|
||||
snap_elem = ED_transform_snap_object_project_view3d_ex(
|
||||
data_intern->snap_context_v3d,
|
||||
depsgraph,
|
||||
region,
|
||||
v3d,
|
||||
snap_elements,
|
||||
&(const struct SnapObjectParams){
|
||||
.snap_target_select = SCE_SNAP_TARGET_ALL,
|
||||
.edit_mode_type = edit_mode_type,
|
||||
.use_occlusion_test = use_occlusion_test,
|
||||
},
|
||||
NULL,
|
||||
mval_fl,
|
||||
prev_co,
|
||||
&dist_px,
|
||||
co,
|
||||
no,
|
||||
&index,
|
||||
NULL,
|
||||
obmat,
|
||||
face_nor);
|
||||
}
|
||||
|
||||
if (calc_plane_omat) {
|
||||
RegionView3D *rv3d = region->regiondata;
|
||||
bool orient_surface = (snap_elem != SCE_SNAP_MODE_NONE) &&
|
||||
(state->plane_orient == V3D_PLACE_ORIENT_SURFACE);
|
||||
bool orient_surface = use_surface_nor && (snap_elem != SCE_SNAP_MODE_NONE);
|
||||
if (orient_surface) {
|
||||
copy_m3_m4(omat, obmat);
|
||||
}
|
||||
|
@ -715,6 +736,10 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state,
|
|||
}
|
||||
}
|
||||
|
||||
if (!use_surface_co) {
|
||||
snap_elem = SCE_SNAP_MODE_NONE;
|
||||
}
|
||||
|
||||
float *co_depth = (snap_elem != SCE_SNAP_MODE_NONE) ? co : scene->cursor.location;
|
||||
snap_elem &= ~data_intern->snap_elem_hidden;
|
||||
if (snap_elem == SCE_SNAP_MODE_NONE) {
|
||||
|
|
Loading…
Reference in New Issue