Cursor: Change face set color and wireframe preview

This commit is contained in:
Pablo Dobarro 2021-08-04 22:17:48 +02:00
parent b2dc8bd92e
commit 01965a275c
2 changed files with 104 additions and 1 deletions

View File

@ -1827,7 +1827,7 @@ void BKE_sculpt_update_object_for_edit(
Mesh *me_eval = BKE_object_get_evaluated_mesh(ob_eval);
BLI_assert(me_eval != NULL);
sculpt_update_object(depsgraph, ob_orig, me_eval, need_pmap, need_mask, need_colors);
sculpt_update_object(depsgraph, ob_orig, me_eval, true, need_mask, need_colors);
}
int BKE_sculpt_mask_layers_ensure(Object *ob, MultiresModifierData *mmd)

View File

@ -37,6 +37,7 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "DNA_mesh_types.h"
#include "BKE_brush.h"
#include "BKE_colortools.h"
@ -1464,6 +1465,103 @@ static void paint_draw_3D_view_inactive_brush_cursor(PaintCursorContext *pcontex
80);
}
static void sculpt_cursor_draw_active_face_set_color_set(PaintCursorContext *pcontext) {
SculptSession *ss = pcontext->ss;
if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) {
return;
}
const int active_face_set = SCULPT_active_face_set_get(ss);
uchar color[4] = {UCHAR_MAX, UCHAR_MAX, UCHAR_MAX, UCHAR_MAX};
Object *ob = CTX_data_active_object(pcontext->C);
Mesh *mesh = ob->data;
if (active_face_set != mesh->face_sets_color_default) {
BKE_paint_face_set_overlay_color_get(active_face_set, mesh->face_sets_color_seed, color);
color[3] = UCHAR_MAX;
}
else {
color[3] /= 2;
}
immUniformColor4ubv(color);
}
static void sculpt_cursor_draw_3D_face_set_preview(PaintCursorContext *pcontext)
{
SculptSession *ss = pcontext->ss;
if (BKE_pbvh_type(ss->pbvh) != PBVH_FACES) {
return;
}
GPU_line_width(1.0f);
sculpt_cursor_draw_active_face_set_color_set(pcontext);
MPoly *poly = &ss->mpoly[ss->active_face_index];
MLoop *loops = ss->mloop;
const int totpoints = poly->totloop;
/*
immBegin(GPU_PRIM_LINE_STRIP, totpoints + 1);
for (int i = 0; i < totpoints; i++) {
float co[3];
copy_v3_v3(co, SCULPT_vertex_co_get(ss, loops[poly->loopstart + i].v));
immVertex3fv(pcontext->pos, co);
}
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, loops[poly->loopstart].v));
immEnd();
*/
/*
int v_in_poly = 0;
for (int i = 0; i < totpoints; i++) {
if (ss->active_vertex_index == loops[poly->loopstart + i].v) {
v_in_poly = i;
}
}
const int next_v = v_in_poly == poly->totloop - 1? 0 : v_in_poly + 1;
const int prev_v = v_in_poly == 0? poly->totloop - 1 : v_in_poly - 1;
immBegin(GPU_PRIM_LINES, 4);
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, ss->active_vertex_index));
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, loops[poly->loopstart + next_v].v));
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, ss->active_vertex_index));
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, loops[poly->loopstart + prev_v].v));
immEnd();
*/
if (!ss->pmap) {
return;
}
int total = 0;
SculptVertexNeighborIter ni;
SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, ss->active_vertex_index, ni) {
total++;
}
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
immBegin(GPU_PRIM_LINES, total * 2);
SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, ss->active_vertex_index, ni) {
immVertex3fv(pcontext->pos, SCULPT_active_vertex_co_get(ss));
immVertex3fv(pcontext->pos, SCULPT_vertex_co_get(ss, ni.index));
}
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
immEnd();
}
static void paint_cursor_update_object_space_radius(PaintCursorContext *pcontext)
{
if (!BKE_brush_use_locked_size(pcontext->scene, pcontext->brush)) {
@ -1609,6 +1707,7 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext *
}
if (len_v3v3(active_vertex_co, pcontext->location) < pcontext->radius) {
immUniformColor3fvAlpha(pcontext->outline_col, pcontext->outline_alpha);
sculpt_cursor_draw_active_face_set_color_set(pcontext);
cursor_draw_point_with_symmetry(pcontext->pos,
pcontext->region,
active_vertex_co,
@ -1654,6 +1753,7 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext *
2);
}
/* Transform Pivot. */
if (pcontext->paint && pcontext->paint->flags & PAINT_SCULPT_SHOW_PIVOT) {
cursor_draw_point_screen_space(
@ -1698,6 +1798,9 @@ static void paint_cursor_draw_3d_view_brush_cursor_inactive(PaintCursorContext *
SCULPT_boundary_pivot_line_preview_draw(pcontext->pos, pcontext->ss);
}
/* Face Set Preview. */
sculpt_cursor_draw_3D_face_set_preview(pcontext);
GPU_matrix_pop();
/* Drawing Cursor overlays in Paint Cursor space (as additional info on top of the brush cursor)