[Bf-blender-cvs] [12dca31682c] sculpt-mode-features: Grab active vertex and dynamic mesh preview
Pablo Dobarro
noreply at git.blender.org
Mon Aug 12 03:37:09 CEST 2019
Commit: 12dca31682cee168a96eb006865d20902be62966
Author: Pablo Dobarro
Date: Mon Aug 12 03:35:13 2019 +0200
Branches: sculpt-mode-features
https://developer.blender.org/rB12dca31682cee168a96eb006865d20902be62966
Grab active vertex and dynamic mesh preview
===================================================================
M release/scripts/startup/bl_ui/space_view3d_toolbar.py
M source/blender/blenkernel/BKE_paint.h
M source/blender/editors/sculpt_paint/paint_cursor.c
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/editors/sculpt_paint/sculpt.c
M source/blender/editors/sculpt_paint/sculpt_intern.h
M source/blender/makesdna/DNA_brush_types.h
M source/blender/makesrna/intern/rna_brush.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index f644ba8d516..71a0a5925ce 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -332,6 +332,11 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
row = col.row()
row.prop(brush, "sculpt_color_mix_mode")
+ if brush.sculpt_tool == 'GRAB':
+ col.separator()
+ row = col.row()
+ row.prop(brush, "grab_active_vertex")
+
# topology_rake_factor
if (
capabilities.has_topology_rake and
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index caa4570cd5e..54cd51b3bff 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -283,6 +283,9 @@ typedef struct SculptSession {
RegionView3D *rv3d;
+ int *preview_vert_index_list;
+ int preview_vert_index_count;
+
union {
struct {
struct SculptVertexPaintGeomMap gmap;
diff --git a/source/blender/editors/sculpt_paint/paint_cursor.c b/source/blender/editors/sculpt_paint/paint_cursor.c
index 8a834446326..480b180ccc3 100644
--- a/source/blender/editors/sculpt_paint/paint_cursor.c
+++ b/source/blender/editors/sculpt_paint/paint_cursor.c
@@ -1188,6 +1188,24 @@ void cursor_draw_point_with_symmetry(const uint gpuattr,
}
}
+static void sculpt_geometry_preview_lines_draw(const uint gpuattr,
+ SculptSession *ss,
+ float obmat[4][4])
+{
+ immUniformColor4f(1.0f, 1.0f, 1.0f, 0.7f);
+ GPU_depth_test(true);
+ GPU_line_width(2.0f);
+ if (ss->preview_vert_index_count > 0) {
+ immBegin(GPU_PRIM_LINES, ss->preview_vert_index_count);
+ for (int i = 0; i < ss->preview_vert_index_count; i++) {
+ float v[3];
+ mul_v3_m4v3(v, obmat, sculpt_vertex_co_get(ss, ss->preview_vert_index_list[i]));
+ immVertex3fv(gpuattr, v);
+ }
+ immEnd();
+ }
+}
+
static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
{
Scene *scene = CTX_data_scene(C);
@@ -1326,6 +1344,16 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
}
/* draw brush cursor */
+
+ float cursor_mat4[4][4], cursor_rot_mat4[4][4];
+ float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f};
+ float quat[4];
+
+ copy_m4_m4(cursor_mat4, vc.obact->obmat);
+ translate_m4(cursor_mat4, gi.location[0], gi.location[1], gi.location[2]);
+ rotation_between_vecs_to_quat(quat, z_axis, gi.normal);
+ quat_to_mat4(cursor_rot_mat4, quat);
+
GPU_matrix_push_projection();
GPU_matrix_push();
ED_view3d_draw_setup_view(CTX_wm_window(C),
@@ -1337,20 +1365,24 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
NULL,
NULL);
- float cursor_mat4[4][4], cursor_rot_mat4[4][4];
- float z_axis[4] = {0.0f, 0.0f, 1.0f, 0.0f};
- float quat[4];
+ if (brush->sculpt_tool == SCULPT_TOOL_GRAB && brush->flag2 & BRUSH_GRAB_ACTIVE_VERTEX) {
+ if (vc.obact->sculpt) {
+ SculptSession *ss = vc.obact->sculpt;
+ if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+ sculpt_geometry_preview_lines_update(C, ss, rds);
+ sculpt_geometry_preview_lines_draw(pos3d, ss, vc.obact->obmat);
+ }
+ }
+ }
- copy_m4_m4(cursor_mat4, vc.obact->obmat);
- translate_m4(cursor_mat4, gi.location[0], gi.location[1], gi.location[2]);
- rotation_between_vecs_to_quat(quat, z_axis, gi.normal);
- quat_to_mat4(cursor_rot_mat4, quat);
+ GPU_line_width(4.0f);
GPU_matrix_mul(cursor_mat4);
GPU_matrix_mul(cursor_rot_mat4);
+ immUniformColor3fvAlpha(outline_col, outline_alpha);
imm_draw_circle_wire_3d(pos3d, 0, 0, rds, 40);
-
GPU_matrix_pop();
GPU_matrix_pop_projection();
+
wmWindowViewport(win);
}
else {
@@ -1369,6 +1401,24 @@ static void paint_draw_cursor(bContext *C, int x, int y, void *UNUSED(unused))
}
cursor_draw_point_with_symmetry(
pos3d, ar, cursor_location, sd, vc.obact, vc.rv3d->persmat, ss->cache->radius);
+
+ if (ss->cache->brush->sculpt_tool == SCULPT_TOOL_GRAB) {
+ if (brush->flag2 & BRUSH_GRAB_ACTIVE_VERTEX && BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+ GPU_matrix_push_projection();
+ GPU_matrix_push();
+ ED_view3d_draw_setup_view(CTX_wm_window(C),
+ CTX_data_depsgraph(C),
+ CTX_data_scene(C),
+ ar,
+ CTX_wm_view3d(C),
+ NULL,
+ NULL,
+ NULL);
+ sculpt_geometry_preview_lines_draw(pos3d, ss, vc.obact->obmat);
+ GPU_matrix_pop();
+ GPU_matrix_pop_projection();
+ }
+ }
wmWindowViewport(win);
}
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index d5e8c2a1825..6d6949b68ee 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2210,7 +2210,7 @@ static void wpaint_do_paint(bContext *C,
{
SculptSession *ss = ob->sculpt;
ss->cache->radial_symmetry_pass = i;
- sculpt_cache_calc_brushdata_symm(ss->cache, symm, axis, angle);
+ sculpt_cache_calc_brushdata_symm(ss, symm, axis, angle);
int totnode;
PBVHNode **nodes = vwpaint_pbvh_gather_generic(ob, wp, sd, brush, &totnode);
@@ -2265,7 +2265,7 @@ static void wpaint_do_symmetrical_brush_actions(
if ((symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5)))) {
cache->mirror_symmetry_pass = i;
cache->radial_symmetry_pass = 0;
- sculpt_cache_calc_brushdata_symm(cache, i, 0, 0);
+ sculpt_cache_calc_brushdata_symm(ss, i, 0, 0);
if (i & (1 << 0)) {
wpaint_do_paint(C, ob, wp, sd, wpd, wpi, me, brush, i, 'X', 0, 0);
@@ -3220,7 +3220,7 @@ static void vpaint_do_paint(bContext *C,
{
SculptSession *ss = ob->sculpt;
ss->cache->radial_symmetry_pass = i;
- sculpt_cache_calc_brushdata_symm(ss->cache, symm, axis, angle);
+ sculpt_cache_calc_brushdata_symm(ss, symm, axis, angle);
int totnode;
PBVHNode **nodes = vwpaint_pbvh_gather_generic(ob, vp, sd, brush, &totnode);
@@ -3275,7 +3275,7 @@ static void vpaint_do_symmetrical_brush_actions(
if (symm & i && (symm != 5 || i != 3) && (symm != 6 || (i != 3 && i != 5))) {
cache->mirror_symmetry_pass = i;
cache->radial_symmetry_pass = 0;
- sculpt_cache_calc_brushdata_symm(cache, i, 0, 0);
+ sculpt_cache_calc_brushdata_symm(ss, i, 0, 0);
if (i & (1 << 0)) {
vpaint_do_paint(C, sd, vp, vpd, ob, me, brush, i, 'X', 0, 0);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index ce195373f28..6803f01a26c 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -282,10 +282,8 @@ void sculpt_vertex_neighbours_get_faces(SculptSession *ss,
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) {
- if (vert_map->count != 2 || ss->pmap[f_adj_v[j]].count <= 2) {
- if (f_adj_v[j] != (int)index) {
- sculpt_vertex_neighbour_add(iter, f_adj_v[j]);
- }
+ if (f_adj_v[j] != (int)index) {
+ sculpt_vertex_neighbour_add(iter, f_adj_v[j]);
}
}
}
@@ -5045,6 +5043,7 @@ static float *sculpt_topology_automasking_init(Sculpt *sd, Object *ob, int initi
vertex_topology_it mevit;
mevit.v = initial_vertex_index;
mevit.it = 1;
+ automask_factor[initial_vertex_index] = 1.0f;
BLI_gsqueue_push(queue, &mevit);
while (!BLI_gsqueue_is_empty(queue)) {
@@ -5498,11 +5497,12 @@ static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob)
/* Flip all the editdata across the axis/axes specified by symm. Used to
* calculate multiple modifications to the mesh when symmetry is enabled. */
-void sculpt_cache_calc_brushdata_symm(StrokeCache *cache,
+void sculpt_cache_calc_brushdata_symm(SculptSession *ss,
const char symm,
const char axis,
const float angle)
{
+ StrokeCache *cache = ss->cache;
flip_v3_v3(cache->location, cache->true_location, symm);
flip_v3_v3(cache->last_location, cache->true_last_location, symm);
flip_v3_v3(cache->grab_delta_symmetry, cache->grab_delta, symm);
@@ -5618,7 +5618,7 @@ static void do_radial_symmetry(Sculpt *sd,
for (i = 1; i < sd->radial_symm[axis - 'X']; ++i) {
const float angle = 2 * M_PI * i / sd->radial_symm[axis - 'X'];
ss->cache->radial_symmetry_pass = i;
- sculpt_cache_calc_brushdata_symm(ss->cache, symm, axis, angle);
+ sculpt_cache_calc_brushdata_symm(ss, symm, axis, angle);
do_tiled(sd, ob, brush, ups, action);
}
}
@@ -5660,7 +5660,7 @@ static void do_symmetrical_brush_actions(Sculpt *sd,
cache->mirror_symmetry_pass = i;
cache->radial_symmetry_pass = 0;
- sculpt_cache_calc_brushdata_symm(cache, i, 0, 0);
+ sculpt_cache_calc_brushdata_symm(ss, i, 0, 0);
do_tiled(sd, ob, brush, ups, action);
do_radial_symmetry(sd, ob, brush, ups, action, i, 'X', feather);
@@ -6026,7 +6026,14 @@ static void sculpt_update_brush_delta(UnifiedPaintSettings *ups, Object *ob, Bru
float grab_location[3], imat[4][4], delta[3], loc[3];
if (cache->first_time) {
- copy_v3_v3(cache->orig_grab_location, cache->true_location);
+ if (tool
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list