diff options
Diffstat (limited to 'source/blender/editors/sculpt_paint')
8 files changed, 59 insertions, 43 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c index 19b4b9f569c..cf796c7dd3c 100644 --- a/source/blender/editors/sculpt_paint/paint_cursor.c +++ b/source/blender/editors/sculpt_paint/paint_cursor.c @@ -1103,8 +1103,11 @@ static void cursor_draw_point_screen_space( copy_v3_v3(location, true_location); mul_m4_v3(obmat, location); ED_view3d_project(ar, location, translation_vertex_cursor); - imm_draw_circle_fill_3d( - gpuattr, translation_vertex_cursor[0], translation_vertex_cursor[1], size, 10); + /* Do not draw points behind the view. Z [near, far] is mapped to [-1, 1]. */ + if (translation_vertex_cursor[2] <= 1.0f) { + imm_draw_circle_fill_3d( + gpuattr, translation_vertex_cursor[0], translation_vertex_cursor[1], size, 10); + } } static void cursor_draw_tiling_preview(const uint gpuattr, diff --git a/source/blender/editors/sculpt_paint/paint_curve.c b/source/blender/editors/sculpt_paint/paint_curve.c index 62c31c91f8d..8a98b15088f 100644 --- a/source/blender/editors/sculpt_paint/paint_curve.c +++ b/source/blender/editors/sculpt_paint/paint_curve.c @@ -87,39 +87,35 @@ static PaintCurvePoint *paintcurve_point_get_closest( { PaintCurvePoint *pcp, *closest = NULL; int i; - float dist, closest_dist = FLT_MAX; + float closest_dist = threshold; for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) { - dist = len_manhattan_v2v2(pos, pcp->bez.vec[0]); - if (dist < threshold) { - if (dist < closest_dist) { - closest = pcp; - closest_dist = dist; - if (point) { - *point = SEL_F1; - } - } + float dist[3]; + char point_sel = 0; + + dist[0] = len_manhattan_v2v2(pos, pcp->bez.vec[0]); + dist[1] = len_manhattan_v2v2(pos, pcp->bez.vec[1]); + dist[2] = len_manhattan_v2v2(pos, pcp->bez.vec[2]); + + if (dist[1] < closest_dist) { + closest_dist = dist[1]; + point_sel = SEL_F2; } - if (!ignore_pivot) { - dist = len_manhattan_v2v2(pos, pcp->bez.vec[1]); - if (dist < threshold) { - if (dist < closest_dist) { - closest = pcp; - closest_dist = dist; - if (point) { - *point = SEL_F2; - } - } - } + if (dist[0] < closest_dist) { + closest_dist = dist[0]; + point_sel = SEL_F1; + } + if (dist[2] < closest_dist) { + closest_dist = dist[2]; + point_sel = SEL_F3; } - dist = len_manhattan_v2v2(pos, pcp->bez.vec[2]); - if (dist < threshold) { - if (dist < closest_dist) { - closest = pcp; - closest_dist = dist; - if (point) { - *point = SEL_F3; + if (point_sel) { + closest = pcp; + if (point) { + if (ignore_pivot && point_sel == SEL_F2) { + point_sel = (dist[0] < dist[2]) ? SEL_F1 : SEL_F3; } + *point = point_sel; } } } diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c index 7f71110b360..a667c7062e6 100644 --- a/source/blender/editors/sculpt_paint/paint_image_2d.c +++ b/source/blender/editors/sculpt_paint/paint_image_2d.c @@ -1646,7 +1646,7 @@ void paint_2d_stroke(void *ps, continue; } - ImBuf *ibuf = BKE_image_acquire_ibuf(s->image, &tile->iuser, NULL); + ImBuf *ibuf = tile->canvas; /* OCIO_TODO: float buffers are now always linear, so always use color correction * this should probably be changed when texture painting color space is supported @@ -1711,6 +1711,7 @@ void *paint_2d_new_stroke(bContext *C, wmOperator *op, int mode) } if (ibuf->channels != 4) { + BKE_image_release_ibuf(s->image, ibuf, NULL); BKE_report(op->reports, RPT_WARNING, "Image requires 4 color channels to paint"); MEM_freeN(s->tiles); MEM_freeN(s); diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index 8faf5cba341..34cde8ff48c 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -66,7 +66,7 @@ #include "BKE_customdata.h" #include "BKE_idprop.h" #include "BKE_image.h" -#include "BKE_library.h" +#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_material.h" #include "BKE_mesh.h" diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 7863e18394c..8c8fc412663 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -33,7 +33,7 @@ #include "BKE_brush.h" #include "BKE_context.h" -#include "BKE_library.h" +#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_paint.h" diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c index e799e54188d..37cc543872e 100644 --- a/source/blender/editors/sculpt_paint/paint_utils.c +++ b/source/blender/editors/sculpt_paint/paint_utils.c @@ -545,7 +545,7 @@ void paint_sample_color( } ImBuf *ibuf = BKE_image_acquire_ibuf(image, &iuser, NULL); - if (ibuf && ibuf->rect) { + if (ibuf && (ibuf->rect || ibuf->rect_float)) { sample_success = true; u = u * ibuf->x; diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index 015657318b2..23521b8496c 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -50,7 +50,7 @@ #include "BKE_image.h" #include "BKE_kelvinlet.h" #include "BKE_key.h" -#include "BKE_library.h" +#include "BKE_lib_id.h" #include "BKE_main.h" #include "BKE_mesh.h" #include "BKE_mesh_mapping.h" @@ -291,7 +291,7 @@ static void sculpt_vertex_neighbors_get_faces(SculptSession *ss, for (i = 0; i < ss->pmap[(int)index].count; i++) { const MPoly *p = &ss->mpoly[vert_map->indices[i]]; - unsigned f_adj_v[2]; + uint f_adj_v[2]; if (poly_get_adj_loops_from_vert(p, ss->mloop, (int)index, f_adj_v) != -1) { int j; for (j = 0; j < ARRAY_SIZE(f_adj_v); j += 1) { @@ -2203,7 +2203,7 @@ static void update_brush_local_mat(Sculpt *sd, Object *ob) /* For the smooth brush, uses the neighboring vertices around vert to calculate * a smoothed location for vert. Skips corner vertices (used by only one * polygon.) */ -static void neighbor_average(SculptSession *ss, float avg[3], unsigned vert) +static void neighbor_average(SculptSession *ss, float avg[3], uint vert) { const MeshElemMap *vert_map = &ss->pmap[vert]; const MVert *mvert = ss->mvert; @@ -2217,7 +2217,7 @@ static void neighbor_average(SculptSession *ss, float avg[3], unsigned vert) for (i = 0; i < vert_map->count; i++) { const MPoly *p = &ss->mpoly[vert_map->indices[i]]; - unsigned f_adj_v[2]; + uint f_adj_v[2]; if (poly_get_adj_loops_from_vert(p, ss->mloop, vert, f_adj_v) != -1) { int j; @@ -2243,7 +2243,7 @@ static void neighbor_average(SculptSession *ss, float avg[3], unsigned vert) /* Similar to neighbor_average(), but returns an averaged mask value * instead of coordinate. Also does not restrict based on border or * corner vertices. */ -static float neighbor_average_mask(SculptSession *ss, unsigned vert) +static float neighbor_average_mask(SculptSession *ss, uint vert) { const float *vmask = ss->vmask; float avg = 0; @@ -2251,7 +2251,7 @@ static float neighbor_average_mask(SculptSession *ss, unsigned vert) for (i = 0; i < ss->pmap[vert].count; i++) { const MPoly *p = &ss->mpoly[ss->pmap[vert].indices[i]]; - unsigned f_adj_v[2]; + uint f_adj_v[2]; if (poly_get_adj_loops_from_vert(p, ss->mloop, vert, f_adj_v) != -1) { int j; @@ -7537,7 +7537,9 @@ static void sculpt_flush_update_step(bContext *C, SculptUpdateType update_flags) ED_region_tag_redraw(ar); } else { - /* Fast path where we just update the BVH nodes that changed. */ + /* Fast path where we just update the BVH nodes that changed, and redraw + * only the part of the 3D viewport where changes happened. */ + rcti r; if (update_flags & SCULPT_UPDATE_COORDS) { BKE_pbvh_update_bounds(ss->pbvh, PBVH_UpdateBB); @@ -7547,7 +7549,21 @@ static void sculpt_flush_update_step(bContext *C, SculptUpdateType update_flags) sculpt_update_object_bounding_box(ob); } - ED_region_tag_redraw(ar); + if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) { + if (ss->cache) { + ss->cache->current_r = r; + } + + /* previous is not set in the current cache else + * the partial rect will always grow */ + sculpt_extend_redraw_rect_previous(ob, &r); + + r.xmin += ar->winrct.xmin - 2; + r.xmax += ar->winrct.xmin + 2; + r.ymin += ar->winrct.ymin - 2; + r.ymax += ar->winrct.ymin + 2; + ED_region_tag_redraw_partial(ar, &r, true); + } } } diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h index 5d92b202997..b29bbfd1fb0 100644 --- a/source/blender/editors/sculpt_paint/sculpt_intern.h +++ b/source/blender/editors/sculpt_paint/sculpt_intern.h @@ -35,9 +35,9 @@ struct KeyBlock; struct Object; +struct SculptPoseIKChainSegment; struct SculptUndoNode; struct bContext; -struct SculptPoseIKChainSegment; bool sculpt_mode_poll(struct bContext *C); bool sculpt_mode_poll_view3d(struct bContext *C); |