GPv3: Add initial weight paint mode support #117945
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
|
|
Loading…
Reference in New Issue