Cleanup: differentiate region/screen relative coordinates
- Avoid ambiguity which caused these values to be confused, use `mval` for region relative mouse coordinates, otherwise `event_xy`. - Pass region relative coordinates to sample_detail_dyntopo & sample_detail_voxel as there is no reason to use screen-space values. - Rename invalid use of mval for screen-space coordinates.
This commit is contained in:
parent
b19751bee2
commit
1064bf58c3
@ -105,7 +105,7 @@ struct CurveDrawData {
|
||||
} radius;
|
||||
|
||||
struct {
|
||||
float mouse[2];
|
||||
float mval[2];
|
||||
/* Used in case we can't calculate the depth. */
|
||||
float location_world[3];
|
||||
|
||||
@ -463,8 +463,8 @@ static void curve_draw_event_add(wmOperator *op, const wmEvent *event)
|
||||
}
|
||||
copy_v3_v3(cdd->prev.location_world, selem->location_world);
|
||||
|
||||
float len_sq = len_squared_v2v2(cdd->prev.mouse, selem->mval);
|
||||
copy_v2_v2(cdd->prev.mouse, selem->mval);
|
||||
float len_sq = len_squared_v2v2(cdd->prev.mval, selem->mval);
|
||||
copy_v2_v2(cdd->prev.mval, selem->mval);
|
||||
|
||||
if (cdd->sample.use_substeps && cdd->prev.selem) {
|
||||
const struct StrokeElem selem_target = *selem;
|
||||
@ -1165,7 +1165,7 @@ static int curve_draw_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
else if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
|
||||
if (cdd->state == CURVE_DRAW_PAINTING) {
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
if (len_squared_v2v2(mval_fl, cdd->prev.mouse) > square_f(STROKE_SAMPLE_DIST_MIN_PX)) {
|
||||
if (len_squared_v2v2(mval_fl, cdd->prev.mval) > square_f(STROKE_SAMPLE_DIST_MIN_PX)) {
|
||||
curve_draw_event_add(op, event);
|
||||
}
|
||||
}
|
||||
|
@ -2962,7 +2962,7 @@ void ED_gpencil_projected_2d_bound_box(const GP_SpaceConversion *gsc,
|
||||
|
||||
bool ED_gpencil_stroke_check_collision(const GP_SpaceConversion *gsc,
|
||||
bGPDstroke *gps,
|
||||
const float mouse[2],
|
||||
const float mval[2],
|
||||
const int radius,
|
||||
const float diff_mat[4][4])
|
||||
{
|
||||
@ -2980,7 +2980,7 @@ bool ED_gpencil_stroke_check_collision(const GP_SpaceConversion *gsc,
|
||||
rcti rect_stroke = {boundbox_min[0], boundbox_max[0], boundbox_min[1], boundbox_max[1]};
|
||||
|
||||
/* For mouse, add a small offset to avoid false negative in corners. */
|
||||
rcti rect_mouse = {mouse[0] - offset, mouse[0] + offset, mouse[1] - offset, mouse[1] + offset};
|
||||
rcti rect_mouse = {mval[0] - offset, mval[0] + offset, mval[1] - offset, mval[1] + offset};
|
||||
|
||||
/* Check collision between both rectangles. */
|
||||
return BLI_rcti_isect(&rect_stroke, &rect_mouse, NULL);
|
||||
@ -2988,7 +2988,7 @@ bool ED_gpencil_stroke_check_collision(const GP_SpaceConversion *gsc,
|
||||
|
||||
bool ED_gpencil_stroke_point_is_inside(const bGPDstroke *gps,
|
||||
const GP_SpaceConversion *gsc,
|
||||
const int mouse[2],
|
||||
const int mval[2],
|
||||
const float diff_mat[4][4])
|
||||
{
|
||||
bool hit = false;
|
||||
@ -3014,9 +3014,8 @@ bool ED_gpencil_stroke_point_is_inside(const bGPDstroke *gps,
|
||||
BLI_lasso_boundbox(&rect, mcoords, len);
|
||||
|
||||
/* Test if point inside stroke. */
|
||||
hit = ((!ELEM(V2D_IS_CLIPPED, mouse[0], mouse[1])) &&
|
||||
BLI_rcti_isect_pt(&rect, mouse[0], mouse[1]) &&
|
||||
BLI_lasso_is_point_inside(mcoords, len, mouse[0], mouse[1], INT_MAX));
|
||||
hit = ((!ELEM(V2D_IS_CLIPPED, mval[0], mval[1])) && BLI_rcti_isect_pt(&rect, mval[0], mval[1]) &&
|
||||
BLI_lasso_is_point_inside(mcoords, len, mval[0], mval[1], INT_MAX));
|
||||
|
||||
/* Free memory. */
|
||||
MEM_SAFE_FREE(mcoords);
|
||||
|
@ -579,7 +579,7 @@ void ED_gpencil_init_random_settings(struct Brush *brush,
|
||||
*/
|
||||
bool ED_gpencil_stroke_check_collision(const struct GP_SpaceConversion *gsc,
|
||||
struct bGPDstroke *gps,
|
||||
const float mouse[2],
|
||||
const float mval[2],
|
||||
int radius,
|
||||
const float diff_mat[4][4]);
|
||||
/**
|
||||
@ -587,13 +587,13 @@ bool ED_gpencil_stroke_check_collision(const struct GP_SpaceConversion *gsc,
|
||||
*
|
||||
* \param gps: Stroke to check.
|
||||
* \param gsc: Space conversion data.
|
||||
* \param mouse: Mouse position.
|
||||
* \param mval: Region relative cursor position.
|
||||
* \param diff_mat: View matrix.
|
||||
* \return True if the point is inside.
|
||||
*/
|
||||
bool ED_gpencil_stroke_point_is_inside(const struct bGPDstroke *gps,
|
||||
const struct GP_SpaceConversion *gsc,
|
||||
const int mouse[2],
|
||||
const int mval[2],
|
||||
const float diff_mat[4][4]);
|
||||
/**
|
||||
* Get the bigger 2D bound box points.
|
||||
|
@ -51,7 +51,7 @@ void ED_sculpt_face_sets_initialize_none_to_id(struct Mesh *mesh, int new_id);
|
||||
|
||||
int ED_sculpt_face_sets_active_update_and_get(struct bContext *C,
|
||||
struct Object *ob,
|
||||
const float mval[2]);
|
||||
const float mval_fl[2]);
|
||||
|
||||
/* Undo for changes happening on a base mesh for multires sculpting.
|
||||
* if there is no multi-res sculpt active regular undo is used. */
|
||||
|
@ -1359,7 +1359,7 @@ static void paint_cursor_sculpt_session_update_and_init(PaintCursorContext *pcon
|
||||
ViewContext *vc = &pcontext->vc;
|
||||
SculptCursorGeometryInfo gi;
|
||||
|
||||
const float mouse[2] = {
|
||||
const float mval_fl[2] = {
|
||||
pcontext->x - pcontext->region->winrct.xmin,
|
||||
pcontext->y - pcontext->region->winrct.ymin,
|
||||
};
|
||||
@ -1369,7 +1369,7 @@ static void paint_cursor_sculpt_session_update_and_init(PaintCursorContext *pcon
|
||||
pcontext->prev_active_vertex_index = ss->active_vertex_index;
|
||||
if (!ups->stroke_active) {
|
||||
pcontext->is_cursor_over_mesh = SCULPT_cursor_geometry_info_update(
|
||||
C, &gi, mouse, (pcontext->brush->falloff_shape == PAINT_FALLOFF_SHAPE_SPHERE));
|
||||
C, &gi, mval_fl, (pcontext->brush->falloff_shape == PAINT_FALLOFF_SHAPE_SPHERE));
|
||||
copy_v3_v3(pcontext->location, gi.location);
|
||||
copy_v3_v3(pcontext->normal, gi.normal);
|
||||
}
|
||||
|
@ -1584,9 +1584,9 @@ static int sculpt_trim_gesture_box_invoke(bContext *C, wmOperator *op, const wmE
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SculptCursorGeometryInfo sgi;
|
||||
const float mouse[2] = {event->mval[0], event->mval[1]};
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
if (ss->gesture_initial_hit) {
|
||||
copy_v3_v3(ss->gesture_initial_location, sgi.location);
|
||||
copy_v3_v3(ss->gesture_initial_normal, sgi.normal);
|
||||
@ -1625,9 +1625,9 @@ static int sculpt_trim_gesture_lasso_invoke(bContext *C, wmOperator *op, const w
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
SculptCursorGeometryInfo sgi;
|
||||
const float mouse[2] = {event->mval[0], event->mval[1]};
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
ss->gesture_initial_hit = SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
if (ss->gesture_initial_hit) {
|
||||
copy_v3_v3(ss->gesture_initial_location, sgi.location);
|
||||
copy_v3_v3(ss->gesture_initial_normal, sgi.normal);
|
||||
|
@ -506,7 +506,7 @@ static bool paint_stroke_use_jitter(ePaintMode mode, Brush *brush, bool invert)
|
||||
|
||||
/* Put the location of the next stroke dot into the stroke RNA and apply it to the mesh */
|
||||
static void paint_brush_stroke_add_step(
|
||||
bContext *C, wmOperator *op, PaintStroke *stroke, const float mouse_in[2], float pressure)
|
||||
bContext *C, wmOperator *op, PaintStroke *stroke, const float mval[2], float pressure)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
Paint *paint = BKE_paint_get_active_from_context(C);
|
||||
@ -546,7 +546,7 @@ static void paint_brush_stroke_add_step(
|
||||
|
||||
/* copy last position -before- jittering, or space fill code
|
||||
* will create too many dabs */
|
||||
copy_v2_v2(stroke->last_mouse_position, mouse_in);
|
||||
copy_v2_v2(stroke->last_mouse_position, mval);
|
||||
stroke->last_pressure = pressure;
|
||||
|
||||
if (paint_stroke_use_scene_spacing(brush, mode)) {
|
||||
@ -562,24 +562,24 @@ static void paint_brush_stroke_add_step(
|
||||
factor *= pressure;
|
||||
}
|
||||
|
||||
BKE_brush_jitter_pos(scene, brush, mouse_in, mouse_out);
|
||||
BKE_brush_jitter_pos(scene, brush, mval, mouse_out);
|
||||
|
||||
/* XXX: meh, this is round about because
|
||||
* BKE_brush_jitter_pos isn't written in the best way to
|
||||
* be reused here */
|
||||
if (factor != 1.0f) {
|
||||
sub_v2_v2v2(delta, mouse_out, mouse_in);
|
||||
sub_v2_v2v2(delta, mouse_out, mval);
|
||||
mul_v2_fl(delta, factor);
|
||||
add_v2_v2v2(mouse_out, mouse_in, delta);
|
||||
add_v2_v2v2(mouse_out, mval, delta);
|
||||
}
|
||||
}
|
||||
else {
|
||||
copy_v2_v2(mouse_out, mouse_in);
|
||||
copy_v2_v2(mouse_out, mval);
|
||||
}
|
||||
|
||||
bool is_location_is_set;
|
||||
ups->last_hit = paint_brush_update(
|
||||
C, brush, mode, stroke, mouse_in, mouse_out, pressure, location, &is_location_is_set);
|
||||
C, brush, mode, stroke, mval, mouse_out, pressure, location, &is_location_is_set);
|
||||
if (is_location_is_set) {
|
||||
copy_v3_v3(ups->last_location, location);
|
||||
}
|
||||
@ -605,7 +605,7 @@ static void paint_brush_stroke_add_step(
|
||||
/* Mouse coordinates modified by the stroke type options. */
|
||||
RNA_float_set_array(&itemptr, "mouse", mouse_out);
|
||||
/* Original mouse coordinates. */
|
||||
RNA_float_set_array(&itemptr, "mouse_event", mouse_in);
|
||||
RNA_float_set_array(&itemptr, "mouse_event", mval);
|
||||
RNA_boolean_set(&itemptr, "pen_flip", stroke->pen_flip);
|
||||
RNA_float_set(&itemptr, "pressure", pressure);
|
||||
RNA_float_set(&itemptr, "x_tilt", stroke->x_tilt);
|
||||
|
@ -1608,7 +1608,7 @@ static void smooth_brush_toggle_off(const bContext *C, Paint *paint, StrokeCache
|
||||
|
||||
/* Initialize the stroke cache invariants from operator properties */
|
||||
static void vwpaint_update_cache_invariants(
|
||||
bContext *C, VPaint *vp, SculptSession *ss, wmOperator *op, const float mouse[2])
|
||||
bContext *C, VPaint *vp, SculptSession *ss, wmOperator *op, const float mval[2])
|
||||
{
|
||||
StrokeCache *cache;
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
@ -1629,8 +1629,8 @@ static void vwpaint_update_cache_invariants(
|
||||
}
|
||||
|
||||
/* Initial mouse location */
|
||||
if (mouse) {
|
||||
copy_v2_v2(cache->initial_mouse, mouse);
|
||||
if (mval) {
|
||||
copy_v2_v2(cache->initial_mouse, mval);
|
||||
}
|
||||
else {
|
||||
zero_v2(cache->initial_mouse);
|
||||
|
@ -4174,7 +4174,7 @@ static void smooth_brush_toggle_off(const bContext *C, Paint *paint, StrokeCache
|
||||
|
||||
/* Initialize the stroke cache invariants from operator properties. */
|
||||
static void sculpt_update_cache_invariants(
|
||||
bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, const float mouse[2])
|
||||
bContext *C, Sculpt *sd, SculptSession *ss, wmOperator *op, const float mval[2])
|
||||
{
|
||||
StrokeCache *cache = MEM_callocN(sizeof(StrokeCache), "stroke cache");
|
||||
UnifiedPaintSettings *ups = &CTX_data_tool_settings(C)->unified_paint_settings;
|
||||
@ -4204,8 +4204,8 @@ static void sculpt_update_cache_invariants(
|
||||
sculpt_init_mirror_clipping(ob, ss);
|
||||
|
||||
/* Initial mouse location. */
|
||||
if (mouse) {
|
||||
copy_v2_v2(cache->initial_mouse, mouse);
|
||||
if (mval) {
|
||||
copy_v2_v2(cache->initial_mouse, mval);
|
||||
}
|
||||
else {
|
||||
zero_v2(cache->initial_mouse);
|
||||
@ -4374,7 +4374,7 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
StrokeCache *cache = ss->cache;
|
||||
const float mouse[2] = {
|
||||
const float mval[2] = {
|
||||
cache->mouse_event[0],
|
||||
cache->mouse_event[1],
|
||||
};
|
||||
@ -4415,9 +4415,9 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru
|
||||
add_v3_v3(cache->true_location, cache->grab_delta);
|
||||
}
|
||||
|
||||
/* Compute 3d coordinate at same z from original location + mouse. */
|
||||
/* Compute 3d coordinate at same z from original location + mval. */
|
||||
mul_v3_m4v3(loc, ob->obmat, cache->orig_grab_location);
|
||||
ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mouse, grab_location);
|
||||
ED_view3d_win_to_3d(cache->vc->v3d, cache->vc->region, loc, mval, grab_location);
|
||||
|
||||
/* Compute delta to move verts by. */
|
||||
if (!SCULPT_stroke_is_first_brush_step_of_symmetry_pass(ss->cache)) {
|
||||
@ -4785,7 +4785,7 @@ static void sculpt_find_nearest_to_ray_cb(PBVHNode *node, void *data_v, float *t
|
||||
}
|
||||
|
||||
float SCULPT_raycast_init(ViewContext *vc,
|
||||
const float mouse[2],
|
||||
const float mval[2],
|
||||
float ray_start[3],
|
||||
float ray_end[3],
|
||||
float ray_normal[3],
|
||||
@ -4799,7 +4799,7 @@ float SCULPT_raycast_init(ViewContext *vc,
|
||||
|
||||
/* TODO: what if the segment is totally clipped? (return == 0). */
|
||||
ED_view3d_win_to_segment_clipped(
|
||||
vc->depsgraph, vc->region, vc->v3d, mouse, ray_start, ray_end, true);
|
||||
vc->depsgraph, vc->region, vc->v3d, mval, ray_start, ray_end, true);
|
||||
|
||||
invert_m4_m4(obimat, ob->obmat);
|
||||
mul_m4_v3(obimat, ray_start);
|
||||
@ -4823,7 +4823,7 @@ float SCULPT_raycast_init(ViewContext *vc,
|
||||
|
||||
bool SCULPT_cursor_geometry_info_update(bContext *C,
|
||||
SculptCursorGeometryInfo *out,
|
||||
const float mouse[2],
|
||||
const float mval[2],
|
||||
bool use_sampled_normal)
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
@ -4852,7 +4852,7 @@ bool SCULPT_cursor_geometry_info_update(bContext *C,
|
||||
}
|
||||
|
||||
/* PBVH raycast to get active vertex and face normal. */
|
||||
depth = SCULPT_raycast_init(&vc, mouse, ray_start, ray_end, ray_normal, original);
|
||||
depth = SCULPT_raycast_init(&vc, mval, ray_start, ray_end, ray_normal, original);
|
||||
SCULPT_stroke_modifiers_check(C, ob, brush);
|
||||
|
||||
SculptRaycastData srd = {
|
||||
@ -4950,7 +4950,7 @@ bool SCULPT_cursor_geometry_info_update(bContext *C,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2])
|
||||
bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mval[2])
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
Object *ob;
|
||||
@ -4972,7 +4972,7 @@ bool SCULPT_stroke_get_location(bContext *C, float out[3], const float mouse[2])
|
||||
|
||||
SCULPT_stroke_modifiers_check(C, ob, brush);
|
||||
|
||||
depth = SCULPT_raycast_init(&vc, mouse, ray_start, ray_end, ray_normal, original);
|
||||
depth = SCULPT_raycast_init(&vc, mval, ray_start, ray_end, ray_normal, original);
|
||||
|
||||
if (BKE_pbvh_type(ss->pbvh) == PBVH_BMESH) {
|
||||
BM_mesh_elem_table_ensure(ss->bm, BM_VERT);
|
||||
@ -5277,14 +5277,10 @@ void SCULPT_flush_update_done(const bContext *C, Object *ob, SculptUpdateType up
|
||||
|
||||
/* Returns whether the mouse/stylus is over the mesh (1)
|
||||
* or over the background (0). */
|
||||
static bool over_mesh(bContext *C, struct wmOperator *UNUSED(op), float x, float y)
|
||||
static bool over_mesh(bContext *C, struct wmOperator *UNUSED(op), const float mval[2])
|
||||
{
|
||||
float mouse[2], co[3];
|
||||
|
||||
mouse[0] = x;
|
||||
mouse[1] = y;
|
||||
|
||||
return SCULPT_stroke_get_location(C, co, mouse);
|
||||
float co_dummy[3];
|
||||
return SCULPT_stroke_get_location(C, co_dummy, mval);
|
||||
}
|
||||
|
||||
bool SCULPT_handles_colors_report(SculptSession *ss, ReportList *reports)
|
||||
@ -5305,14 +5301,13 @@ bool SCULPT_handles_colors_report(SculptSession *ss, ReportList *reports)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool sculpt_stroke_test_start(bContext *C, struct wmOperator *op, const float mouse[2])
|
||||
static bool sculpt_stroke_test_start(bContext *C, struct wmOperator *op, const float mval[2])
|
||||
{
|
||||
/* Don't start the stroke until mouse goes over the mesh.
|
||||
* NOTE: mouse will only be null when re-executing the saved stroke.
|
||||
* We have exception for 'exec' strokes since they may not set 'mouse',
|
||||
/* Don't start the stroke until `mval` goes over the mesh.
|
||||
* NOTE: `mval` will only be null when re-executing the saved stroke.
|
||||
* We have exception for 'exec' strokes since they may not set `mval`,
|
||||
* only 'location', see: T52195. */
|
||||
if (((op->flag & OP_IS_INVOKE) == 0) || (mouse == NULL) ||
|
||||
over_mesh(C, op, mouse[0], mouse[1])) {
|
||||
if (((op->flag & OP_IS_INVOKE) == 0) || (mval == NULL) || over_mesh(C, op, mval)) {
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
|
||||
@ -5330,10 +5325,10 @@ static bool sculpt_stroke_test_start(bContext *C, struct wmOperator *op, const f
|
||||
|
||||
ED_view3d_init_mats_rv3d(ob, CTX_wm_region_view3d(C));
|
||||
|
||||
sculpt_update_cache_invariants(C, sd, ss, op, mouse);
|
||||
sculpt_update_cache_invariants(C, sd, ss, op, mval);
|
||||
|
||||
SculptCursorGeometryInfo sgi;
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval, false);
|
||||
|
||||
/* Setup the correct undo system. Image painting and sculpting are mutual exclusive.
|
||||
* Color attributes are part of the sculpting undo system. */
|
||||
@ -5525,7 +5520,7 @@ static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, const wmEvent
|
||||
/* For tablet rotation. */
|
||||
ignore_background_click = RNA_boolean_get(op->ptr, "ignore_background_click");
|
||||
|
||||
if (ignore_background_click && !over_mesh(C, op, event->mval[0], event->mval[1])) {
|
||||
if (ignore_background_click && !over_mesh(C, op, (const float[2]){UNPACK2(event->mval)})) {
|
||||
paint_stroke_free(C, op, op->customdata);
|
||||
return OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
@ -5785,7 +5780,8 @@ void SCULPT_connected_components_ensure(Object *ob)
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
/* Topology IDs already initialized. They only need to be recalculated when the PBVH is rebuild.
|
||||
/* Topology IDs already initialized. They only need to be recalculated when the PBVH is
|
||||
* rebuild.
|
||||
*/
|
||||
if (ss->vertex_info.connected_component) {
|
||||
return;
|
||||
@ -5849,7 +5845,8 @@ void SCULPT_fake_neighbors_ensure(Sculpt *sd, Object *ob, const float max_dist)
|
||||
SculptSession *ss = ob->sculpt;
|
||||
const int totvert = SCULPT_vertex_count_get(ss);
|
||||
|
||||
/* Fake neighbors were already initialized with the same distance, so no need to be recalculated.
|
||||
/* Fake neighbors were already initialized with the same distance, so no need to be
|
||||
* recalculated.
|
||||
*/
|
||||
if (ss->fake_neighbors.fake_neighbor_index &&
|
||||
ss->fake_neighbors.current_max_distance == max_dist) {
|
||||
|
@ -1553,11 +1553,9 @@ static int sculpt_cloth_filter_invoke(bContext *C, wmOperator *op, const wmEvent
|
||||
const eSculptClothFilterType filter_type = RNA_enum_get(op->ptr, "type");
|
||||
|
||||
/* Update the active vertex */
|
||||
float mouse[2];
|
||||
float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SculptCursorGeometryInfo sgi;
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
|
||||
|
@ -158,7 +158,7 @@ static EnumPropertyItem prop_sculpt_sample_detail_mode_types[] = {
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
static void sample_detail_voxel(bContext *C, ViewContext *vc, int mx, int my)
|
||||
static void sample_detail_voxel(bContext *C, ViewContext *vc, const int mval[2])
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
Object *ob = vc->obact;
|
||||
@ -169,8 +169,8 @@ static void sample_detail_voxel(bContext *C, ViewContext *vc, int mx, int my)
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
|
||||
/* Update the active vertex. */
|
||||
const float mouse[2] = {mx - vc->region->winrct.xmin, my - vc->region->winrct.ymin};
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
const float mval_fl[2] = {UNPACK2(mval)};
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, ob, true, false, false);
|
||||
|
||||
/* Average the edge length of the connected edges to the active vertex. */
|
||||
@ -201,7 +201,7 @@ static void sculpt_raycast_detail_cb(PBVHNode *node, void *data_v, float *tmin)
|
||||
}
|
||||
}
|
||||
|
||||
static void sample_detail_dyntopo(bContext *C, ViewContext *vc, ARegion *region, int mx, int my)
|
||||
static void sample_detail_dyntopo(bContext *C, ViewContext *vc, const int mval[2])
|
||||
{
|
||||
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
|
||||
Object *ob = vc->obact;
|
||||
@ -209,9 +209,9 @@ static void sample_detail_dyntopo(bContext *C, ViewContext *vc, ARegion *region,
|
||||
|
||||
SCULPT_stroke_modifiers_check(C, ob, brush);
|
||||
|
||||
const float mouse[2] = {mx - region->winrct.xmin, my - region->winrct.ymin};
|
||||
const float mval_fl[2] = {UNPACK2(mval)};
|
||||
float ray_start[3], ray_end[3], ray_normal[3];
|
||||
float depth = SCULPT_raycast_init(vc, mouse, ray_start, ray_end, ray_normal, false);
|
||||
float depth = SCULPT_raycast_init(vc, mval_fl, ray_start, ray_end, ray_normal, false);
|
||||
|
||||
SculptDetailRaycastData srd;
|
||||
srd.hit = 0;
|
||||
@ -228,14 +228,12 @@ static void sample_detail_dyntopo(bContext *C, ViewContext *vc, ARegion *region,
|
||||
}
|
||||
}
|
||||
|
||||
static int sample_detail(bContext *C, int mx, int my, int mode)
|
||||
static int sample_detail(bContext *C, const int event_xy[2], int mode)
|
||||
{
|
||||
/* Find 3D view to pick from. */
|
||||
bScreen *screen = CTX_wm_screen(C);
|
||||
ScrArea *area = BKE_screen_find_area_xy(screen, SPACE_VIEW3D, (const int[2]){mx, my});
|
||||
ARegion *region = (area) ?
|
||||
BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, (const int[2]){mx, my}) :
|
||||
NULL;
|
||||
ScrArea *area = BKE_screen_find_area_xy(screen, SPACE_VIEW3D, event_xy);
|
||||
ARegion *region = (area) ? BKE_area_find_region_xy(area, RGN_TYPE_WINDOW, event_xy) : NULL;
|
||||
if (region == NULL) {
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
@ -260,6 +258,11 @@ static int sample_detail(bContext *C, int mx, int my, int mode)
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
const int mval[2] = {
|
||||
event_xy[0] - region->winrct.xmin,
|
||||
event_xy[1] - region->winrct.ymin,
|
||||
};
|
||||
|
||||
/* Pick sample detail. */
|
||||
switch (mode) {
|
||||
case SAMPLE_DETAIL_DYNTOPO:
|
||||
@ -268,7 +271,7 @@ static int sample_detail(bContext *C, int mx, int my, int mode)
|
||||
CTX_wm_region_set(C, prev_region);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
sample_detail_dyntopo(C, &vc, region, mx, my);
|
||||
sample_detail_dyntopo(C, &vc, mval);
|
||||
break;
|
||||
case SAMPLE_DETAIL_VOXEL:
|
||||
if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) {
|
||||
@ -276,7 +279,7 @@ static int sample_detail(bContext *C, int mx, int my, int mode)
|
||||
CTX_wm_region_set(C, prev_region);
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
sample_detail_voxel(C, &vc, mx, my);
|
||||
sample_detail_voxel(C, &vc, mval);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -292,7 +295,7 @@ static int sculpt_sample_detail_size_exec(bContext *C, wmOperator *op)
|
||||
int ss_co[2];
|
||||
RNA_int_get_array(op->ptr, "location", ss_co);
|
||||
int mode = RNA_enum_get(op->ptr, "mode");
|
||||
return sample_detail(C, ss_co[0], ss_co[1], mode);
|
||||
return sample_detail(C, ss_co, mode);
|
||||
}
|
||||
|
||||
static int sculpt_sample_detail_size_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(e))
|
||||
@ -308,12 +311,10 @@ static int sculpt_sample_detail_size_modal(bContext *C, wmOperator *op, const wm
|
||||
switch (event->type) {
|
||||
case LEFTMOUSE:
|
||||
if (event->val == KM_PRESS) {
|
||||
const int ss_co[2] = {event->xy[0], event->xy[1]};
|
||||
|
||||
int mode = RNA_enum_get(op->ptr, "mode");
|
||||
sample_detail(C, ss_co[0], ss_co[1], mode);
|
||||
sample_detail(C, event->xy, mode);
|
||||
|
||||
RNA_int_set_array(op->ptr, "location", ss_co);
|
||||
RNA_int_set_array(op->ptr, "location", event->xy);
|
||||
WM_cursor_modal_restore(CTX_wm_window(C));
|
||||
ED_workspace_status_text(C, NULL);
|
||||
WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, NULL);
|
||||
|
@ -1450,13 +1450,11 @@ static void sculpt_expand_update_for_vertex(bContext *C, Object *ob, const int v
|
||||
* Updates the #SculptSession cursor data and gets the active vertex
|
||||
* if the cursor is over the mesh.
|
||||
*/
|
||||
static int sculpt_expand_target_vertex_update_and_get(bContext *C,
|
||||
Object *ob,
|
||||
const float mouse[2])
|
||||
static int sculpt_expand_target_vertex_update_and_get(bContext *C, Object *ob, const float mval[2])
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SculptCursorGeometryInfo sgi;
|
||||
if (SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false)) {
|
||||
if (SCULPT_cursor_geometry_info_update(C, &sgi, mval, false)) {
|
||||
return SCULPT_active_vertex_get(ss);
|
||||
}
|
||||
return SCULPT_EXPAND_VERTEX_NONE;
|
||||
@ -1588,16 +1586,16 @@ static void sculpt_expand_find_active_connected_components_from_vert(Object *ob,
|
||||
static void sculpt_expand_set_initial_components_for_mouse(bContext *C,
|
||||
Object *ob,
|
||||
ExpandCache *expand_cache,
|
||||
const float mouse[2])
|
||||
const float mval[2])
|
||||
{
|
||||
SculptSession *ss = ob->sculpt;
|
||||
int initial_vertex = sculpt_expand_target_vertex_update_and_get(C, ob, mouse);
|
||||
int initial_vertex = sculpt_expand_target_vertex_update_and_get(C, ob, mval);
|
||||
if (initial_vertex == SCULPT_EXPAND_VERTEX_NONE) {
|
||||
/* Cursor not over the mesh, for creating valid initial falloffs, fallback to the last active
|
||||
* vertex in the sculpt session. */
|
||||
initial_vertex = SCULPT_active_vertex_get(ss);
|
||||
}
|
||||
copy_v2_v2(ss->expand_cache->initial_mouse, mouse);
|
||||
copy_v2_v2(ss->expand_cache->initial_mouse, mval);
|
||||
expand_cache->initial_active_vertex = initial_vertex;
|
||||
expand_cache->initial_active_face_set = SCULPT_active_face_set_get(ss);
|
||||
|
||||
@ -1629,14 +1627,14 @@ static void sculpt_expand_move_propagation_origin(bContext *C,
|
||||
{
|
||||
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
|
||||
|
||||
const float mouse[2] = {event->mval[0], event->mval[1]};
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
float move_disp[2];
|
||||
sub_v2_v2v2(move_disp, mouse, expand_cache->initial_mouse_move);
|
||||
sub_v2_v2v2(move_disp, mval_fl, expand_cache->initial_mouse_move);
|
||||
|
||||
float new_mouse[2];
|
||||
add_v2_v2v2(new_mouse, move_disp, expand_cache->original_mouse_move);
|
||||
float new_mval[2];
|
||||
add_v2_v2v2(new_mval, move_disp, expand_cache->original_mouse_move);
|
||||
|
||||
sculpt_expand_set_initial_components_for_mouse(C, ob, expand_cache, new_mouse);
|
||||
sculpt_expand_set_initial_components_for_mouse(C, ob, expand_cache, new_mval);
|
||||
sculpt_expand_falloff_factors_from_vertex_and_symm_create(
|
||||
expand_cache,
|
||||
sd,
|
||||
@ -1697,8 +1695,8 @@ static int sculpt_expand_modal(bContext *C, wmOperator *op, const wmEvent *event
|
||||
sculpt_expand_ensure_sculptsession_data(ob);
|
||||
|
||||
/* Update and get the active vertex (and face) from the cursor. */
|
||||
const float mouse[2] = {event->mval[0], event->mval[1]};
|
||||
const int target_expand_vertex = sculpt_expand_target_vertex_update_and_get(C, ob, mouse);
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
const int target_expand_vertex = sculpt_expand_target_vertex_update_and_get(C, ob, mval_fl);
|
||||
|
||||
/* Handle the modal keymap state changes. */
|
||||
ExpandCache *expand_cache = ss->expand_cache;
|
||||
@ -1756,7 +1754,7 @@ static int sculpt_expand_modal(bContext *C, wmOperator *op, const wmEvent *event
|
||||
}
|
||||
expand_cache->move = true;
|
||||
expand_cache->move_original_falloff_type = expand_cache->falloff_type;
|
||||
copy_v2_v2(expand_cache->initial_mouse_move, mouse);
|
||||
copy_v2_v2(expand_cache->initial_mouse_move, mval_fl);
|
||||
copy_v2_v2(expand_cache->original_mouse_move, expand_cache->initial_mouse);
|
||||
if (expand_cache->falloff_type == SCULPT_EXPAND_FALLOFF_GEODESIC &&
|
||||
SCULPT_vertex_count_get(ss) > expand_cache->max_geodesic_move_preview) {
|
||||
|
@ -949,11 +949,9 @@ static int sculpt_face_sets_change_visibility_invoke(bContext *C,
|
||||
/* Update the active vertex and Face Set using the cursor position to avoid relying on the paint
|
||||
* cursor updates. */
|
||||
SculptCursorGeometryInfo sgi;
|
||||
float mouse[2];
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
|
||||
return sculpt_face_sets_change_visibility_exec(C, op);
|
||||
}
|
||||
@ -1401,8 +1399,8 @@ static int sculpt_face_set_edit_invoke(bContext *C, wmOperator *op, const wmEven
|
||||
/* Update the current active Face Set and Vertex as the operator can be used directly from the
|
||||
* tool without brush cursor. */
|
||||
SculptCursorGeometryInfo sgi;
|
||||
const float mouse[2] = {event->mval[0], event->mval[1]};
|
||||
if (!SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false)) {
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
if (!SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false)) {
|
||||
/* The cursor is not over the mesh. Cancel to avoid editing the last updated Face Set ID. */
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -339,11 +339,9 @@ static int sculpt_color_filter_invoke(bContext *C, wmOperator *op, const wmEvent
|
||||
if (use_automasking) {
|
||||
/* Update the active face set manually as the paint cursor is not enabled when using the Mesh
|
||||
* Filter Tool. */
|
||||
float mouse[2];
|
||||
float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SculptCursorGeometryInfo sgi;
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
}
|
||||
|
||||
/* Disable for multires and dyntopo for now */
|
||||
|
@ -675,11 +675,9 @@ static int sculpt_mesh_filter_invoke(bContext *C, wmOperator *op, const wmEvent
|
||||
if (use_automasking) {
|
||||
/* Update the active face set manually as the paint cursor is not enabled when using the Mesh
|
||||
* Filter Tool. */
|
||||
float mouse[2];
|
||||
float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SculptCursorGeometryInfo sgi;
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
}
|
||||
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
|
@ -167,10 +167,8 @@ static int sculpt_mask_expand_modal(bContext *C, wmOperator *op, const wmEvent *
|
||||
|
||||
if (RNA_boolean_get(op->ptr, "use_cursor")) {
|
||||
SculptCursorGeometryInfo sgi;
|
||||
float mouse[2];
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
if (SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false)) {
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
if (SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false)) {
|
||||
/* The cursor is over the mesh, get the update iteration from the updated active vertex. */
|
||||
mask_expand_update_it = ss->filter_cache->mask_update_it[(int)SCULPT_active_vertex_get(ss)];
|
||||
}
|
||||
@ -340,16 +338,14 @@ static int sculpt_mask_expand_invoke(bContext *C, wmOperator *op, const wmEvent
|
||||
const bool create_face_set = RNA_boolean_get(op->ptr, "create_face_set");
|
||||
|
||||
SculptCursorGeometryInfo sgi;
|
||||
float mouse[2];
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
|
||||
SCULPT_vertex_random_access_ensure(ss);
|
||||
|
||||
op->customdata = MEM_mallocN(sizeof(float[2]), "initial mouse position");
|
||||
copy_v2_v2(op->customdata, mouse);
|
||||
copy_v2_v2(op->customdata, mval_fl);
|
||||
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
|
||||
BKE_sculpt_update_object_for_edit(depsgraph, ob, true, true, false);
|
||||
|
||||
|
@ -1061,10 +1061,8 @@ static int sculpt_mask_by_color_invoke(bContext *C, wmOperator *op, const wmEven
|
||||
/* Tools that are not brushes do not have the brush gizmo to update the vertex as the mouse move,
|
||||
* so it needs to be updated here. */
|
||||
SculptCursorGeometryInfo sgi;
|
||||
float mouse[2];
|
||||
mouse[0] = event->mval[0];
|
||||
mouse[1] = event->mval[1];
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mouse, false);
|
||||
const float mval_fl[2] = {UNPACK2(event->mval)};
|
||||
SCULPT_cursor_geometry_info_update(C, &sgi, mval_fl, false);
|
||||
|
||||
SCULPT_undo_push_begin(ob, "Mask by color");
|
||||
BKE_sculpt_color_layer_create_if_needed(ob);
|
||||
|
@ -422,10 +422,11 @@ static int sculpt_set_pivot_position_exec(bContext *C, wmOperator *op)
|
||||
/* Pivot to ray-cast surface. */
|
||||
else if (mode == SCULPT_PIVOT_POSITION_CURSOR_SURFACE) {
|
||||
float stroke_location[3];
|
||||
float mouse[2];
|
||||
mouse[0] = RNA_float_get(op->ptr, "mouse_x");
|
||||
mouse[1] = RNA_float_get(op->ptr, "mouse_y");
|
||||
if (SCULPT_stroke_get_location(C, stroke_location, mouse)) {
|
||||
const float mval[2] = {
|
||||
RNA_float_get(op->ptr, "mouse_x"),
|
||||
RNA_float_get(op->ptr, "mouse_y"),
|
||||
};
|
||||
if (SCULPT_stroke_get_location(C, stroke_location, mval)) {
|
||||
copy_v3_v3(ss->pivot_pos, stroke_location);
|
||||
}
|
||||
}
|
||||
|
@ -4955,9 +4955,9 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
|
||||
/* In order to use window size and mouse position (pixels), we have to use a WM function. */
|
||||
|
||||
/* Check if outside, include top window bar. */
|
||||
int mval[2] = {event->xy[0], event->xy[1]};
|
||||
if (mval[0] < 0 || mval[1] < 0 || mval[0] > WM_window_pixels_x(win) ||
|
||||
mval[1] > WM_window_pixels_y(win) + 30) {
|
||||
int event_xy[2] = {UNPACK2(event->xy)};
|
||||
if (event_xy[0] < 0 || event_xy[1] < 0 || event_xy[0] > WM_window_pixels_x(win) ||
|
||||
event_xy[1] > WM_window_pixels_y(win) + 30) {
|
||||
/* Let's skip windows having modal handlers now. */
|
||||
/* Potential XXX ugly... I wouldn't have added a `modalhandlers` list
|
||||
* (introduced in rev 23331, ton). */
|
||||
@ -4967,9 +4967,9 @@ static wmWindow *wm_event_cursor_other_windows(wmWindowManager *wm, wmWindow *wi
|
||||
}
|
||||
}
|
||||
|
||||
wmWindow *win_other = WM_window_find_under_cursor(win, mval, mval);
|
||||
wmWindow *win_other = WM_window_find_under_cursor(win, event_xy, event_xy);
|
||||
if (win_other && win_other != win) {
|
||||
copy_v2_v2_int(event->xy, mval);
|
||||
copy_v2_v2_int(event->xy, event_xy);
|
||||
return win_other;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user