GPv3: Add initial weight paint mode support #117945

Merged
Falk David merged 2 commits from filedescriptor/blender:gpv3-weight-paint-mode into main 2024-02-07 17:19:52 +01:00
6 changed files with 69 additions and 20 deletions

View File

@ -1134,11 +1134,12 @@ class VIEW3D_MT_editor_menus(Menu):
elif mode_string == 'VERTEX_GPENCIL':
layout.menu("VIEW3D_MT_select_edit_gpencil")
elif mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
mesh = obj.data
if mesh.use_paint_mask:
layout.menu("VIEW3D_MT_select_paint_mask")
elif mesh.use_paint_mask_vertex and mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX'}:
layout.menu("VIEW3D_MT_select_paint_mask_vertex")
if obj.type == 'MESH':
mesh = obj.data
if mesh.use_paint_mask:
layout.menu("VIEW3D_MT_select_paint_mask")
elif mesh.use_paint_mask_vertex and mode_string in {'PAINT_WEIGHT', 'PAINT_VERTEX'}:
layout.menu("VIEW3D_MT_select_paint_mask_vertex")
elif mode_string not in {'SCULPT', 'SCULPT_CURVES', 'PAINT_GREASE_PENCIL'}:
layout.menu("VIEW3D_MT_select_%s" % mode_string.lower())
@ -3559,8 +3560,10 @@ class VIEW3D_MT_paint_weight(Menu):
layout.menu("VIEW3D_MT_paint_weight_lock", text="Locks")
def draw(self, _context):
self.draw_generic(self.layout, is_editmode=False)
def draw(self, context):
obj = context.active_object
if obj.type == 'MESH':
self.draw_generic(self.layout, is_editmode=False)
class VIEW3D_MT_sculpt(Menu):

View File

@ -249,7 +249,16 @@ void OVERLAY_paint_vertex_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_paint_weight_cache_populate(OVERLAY_Data *vedata, Object *ob)
{
OVERLAY_paint_vertex_cache_populate(vedata, ob);
switch (ob->type) {
case OB_MESH:
OVERLAY_paint_vertex_cache_populate(vedata, ob);
break;
case OB_GREASE_PENCIL:
/* TODO */
break;
default:
BLI_assert_unreachable();
}
}
void OVERLAY_paint_draw(OVERLAY_Data *vedata)

View File

@ -152,7 +152,7 @@ bool ED_object_mode_compat_test(const Object *ob, eObjectMode mode)
}
break;
case OB_GREASE_PENCIL:
if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL)) {
if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL | OB_MODE_WEIGHT_PAINT)) {
return true;
}
break;

View File

@ -404,7 +404,7 @@ void mode_exit_generic(Object *ob, const eObjectMode mode_flag)
bool mode_toggle_poll_test(bContext *C)
{
Object *ob = CTX_data_active_object(C);
if (ob == nullptr || ob->type != OB_MESH) {
if (ob == nullptr || !ELEM(ob->type, OB_MESH, OB_GREASE_PENCIL)) {
return false;
}
if (!ob->data || ID_IS_LINKED(ob->data)) {

View File

@ -1538,9 +1538,31 @@ static void wpaint_paint_leaves(bContext *C,
/** \name Enter Weight Paint Mode
* \{ */
static void grease_pencil_wpaintmode_enter(Scene *scene, Object *ob)
{
const PaintMode paint_mode = PaintMode::Weight;
Paint *weight_paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
BKE_paint_ensure(scene->toolsettings, &weight_paint);
ob->mode |= OB_MODE_WEIGHT_PAINT;
/* Flush object mode. */
DEG_id_tag_update(&ob->id, ID_RECALC_COPY_ON_WRITE);
}
void ED_object_wpaintmode_enter_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
{
vwpaint::mode_enter_generic(bmain, depsgraph, scene, ob, OB_MODE_WEIGHT_PAINT);
switch (ob->type) {
case OB_MESH:
vwpaint::mode_enter_generic(bmain, depsgraph, scene, ob, OB_MODE_WEIGHT_PAINT);
break;
case OB_GREASE_PENCIL:
grease_pencil_wpaintmode_enter(scene, ob);
break;
default:
BLI_assert_unreachable();
break;
}
}
void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph)
{
@ -1557,7 +1579,18 @@ void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph)
void ED_object_wpaintmode_exit_ex(Object *ob)
{
vwpaint::mode_exit_generic(ob, OB_MODE_WEIGHT_PAINT);
switch (ob->type) {
case OB_MESH:
vwpaint::mode_exit_generic(ob, OB_MODE_WEIGHT_PAINT);
break;
case OB_GREASE_PENCIL: {
ob->mode &= ~OB_MODE_WEIGHT_PAINT;
break;
}
default:
BLI_assert_unreachable();
break;
}
}
void ED_object_wpaintmode_exit(bContext *C)
{
@ -1630,8 +1663,6 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
}
}
Mesh *mesh = BKE_mesh_from_object(ob);
if (is_mode_set) {
ED_object_wpaintmode_exit_ex(ob);
}
@ -1647,12 +1678,15 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
/* Prepare armature posemode. */
ED_object_posemode_set_for_weight_paint(C, bmain, ob, is_mode_set);
/* Weight-paint works by overriding colors in mesh,
* so need to make sure we recalculate on enter and
* exit (exit needs doing regardless because we
* should re-deform).
*/
DEG_id_tag_update(&mesh->id, 0);
if (ob->type == OB_MESH) {
/* Weight-paint works by overriding colors in mesh,
* so need to make sure we recalculate on enter and
* exit (exit needs doing regardless because we
* should re-deform).
*/
Mesh *mesh = BKE_mesh_from_object(ob);
DEG_id_tag_update(&mesh->id, 0);
}
WM_event_add_notifier(C, NC_SCENE | ND_MODE, scene);

View File

@ -127,6 +127,9 @@ static void uiTemplatePaintModeSelection(uiLayout *layout, bContext *C)
ViewLayer *view_layer = CTX_data_view_layer(C);
BKE_view_layer_synced_ensure(scene, view_layer);
Object *ob = BKE_view_layer_active_object_get(view_layer);
if (ob->type != OB_MESH) {
return;
}
/* Gizmos aren't used in paint modes */
if (!ELEM(ob->mode, OB_MODE_SCULPT, OB_MODE_PARTICLE_EDIT)) {