GPv3: Use GPv2 object mode flag for weight painting #120983

Merged
Falk David merged 6 commits from filedescriptor/blender:gpv3-use-legacy-weight-paint-mode into main 2024-04-23 15:48:38 +02:00
16 changed files with 101 additions and 95 deletions

View File

@ -2667,6 +2667,23 @@ class _defs_gpencil_weight:
)
class _defs_grease_pencil_weight:
@staticmethod
def generate_from_brushes(context):
return generate_from_enum_ex(
context,
idname_prefix="builtin_brush.",
icon_prefix="ops.gpencil.sculpt_",
type=bpy.types.Brush,
# Uses GPv2 tool settings
attr="gpencil_weight_tool",
# tooldef_keywords=dict(
# operator="grease_pencil.weight_paint",
# ),
)
class _defs_curves_sculpt:
@staticmethod
@ -3470,6 +3487,11 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
None,
*_tools_annotate,
],
'WEIGHT_GREASE_PENCIL': [
_defs_grease_pencil_weight.generate_from_brushes,
None,
*_tools_annotate,
],
'VERTEX_GPENCIL': [
_defs_gpencil_vertex.generate_from_brushes,
None,

View File

@ -1188,12 +1188,11 @@ 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'}:
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")
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', 'SCULPT_GREASE_PENCIL'}:
layout.menu("VIEW3D_MT_select_%s" % mode_string.lower())
@ -3628,10 +3627,8 @@ class VIEW3D_MT_paint_weight(Menu):
layout.menu("VIEW3D_MT_paint_weight_lock", text="Locks")
def draw(self, context):
obj = context.active_object
if obj.type == 'MESH':
self.draw_generic(self.layout, is_editmode=False)
def draw(self, _context):
self.draw_generic(self.layout, is_editmode=False)
class VIEW3D_MT_sculpt(Menu):

View File

@ -142,8 +142,9 @@ enum eContextObjectMode {
CTX_MODE_SCULPT_CURVES,
CTX_MODE_PAINT_GREASE_PENCIL,
CTX_MODE_SCULPT_GREASE_PENCIL,
CTX_MODE_WEIGHT_GREASE_PENCIL,
};
#define CTX_MODE_NUM (CTX_MODE_SCULPT_GREASE_PENCIL + 1)
#define CTX_MODE_NUM (CTX_MODE_WEIGHT_GREASE_PENCIL + 1)
/* Context */

View File

@ -1197,7 +1197,12 @@ enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit,
}
}
if (object_mode & OB_MODE_WEIGHT_GPENCIL_LEGACY) {
return CTX_MODE_WEIGHT_GPENCIL_LEGACY;
if (ob->type == OB_GPENCIL_LEGACY) {
return CTX_MODE_WEIGHT_GPENCIL_LEGACY;
}
if (ob->type == OB_GREASE_PENCIL) {
return CTX_MODE_WEIGHT_GREASE_PENCIL;
}
}
if (object_mode & OB_MODE_VERTEX_GPENCIL_LEGACY) {
return CTX_MODE_VERTEX_GPENCIL_LEGACY;
@ -1252,6 +1257,7 @@ static const char *data_mode_strings[] = {
"curves_sculpt",
"grease_pencil_paint",
"grease_pencil_sculpt",
"grease_pencil_weight",
nullptr,
};
BLI_STATIC_ASSERT(ARRAY_SIZE(data_mode_strings) == CTX_MODE_NUM + 1,

View File

@ -660,6 +660,7 @@ PaintMode BKE_paintmode_get_from_tool(const bToolRef *tref)
return PaintMode::VertexGPencil;
case CTX_MODE_SCULPT_GPENCIL_LEGACY:
return PaintMode::SculptGPencil;
case CTX_MODE_WEIGHT_GREASE_PENCIL:
case CTX_MODE_WEIGHT_GPENCIL_LEGACY:
return PaintMode::WeightGPencil;
case CTX_MODE_SCULPT_CURVES:

View File

@ -184,6 +184,7 @@ static void OVERLAY_cache_init(void *vedata)
case CTX_MODE_PAINT_GREASE_PENCIL:
case CTX_MODE_SCULPT_GREASE_PENCIL:
case CTX_MODE_EDIT_GREASE_PENCIL:
case CTX_MODE_WEIGHT_GREASE_PENCIL:
OVERLAY_edit_grease_pencil_cache_init(data);
break;
case CTX_MODE_PARTICLE:

View File

@ -249,16 +249,7 @@ void OVERLAY_paint_vertex_cache_populate(OVERLAY_Data *vedata, Object *ob)
void OVERLAY_paint_weight_cache_populate(OVERLAY_Data *vedata, Object *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();
}
OVERLAY_paint_vertex_cache_populate(vedata, ob);
}
void OVERLAY_paint_draw(OVERLAY_Data *vedata)

View File

@ -601,10 +601,10 @@ static bool gpencil_weightmode_toggle_poll(bContext *C)
{
/* if using gpencil object, use this gpd */
Object *ob = CTX_data_active_object(C);
if ((ob) && (ob->type == OB_GPENCIL_LEGACY)) {
if ((ob) && (ELEM(ob->type, OB_GPENCIL_LEGACY, OB_GREASE_PENCIL))) {
return ob->data != nullptr;
}
return ED_gpencil_data_get_active(C) != nullptr;
return false;
}
static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
@ -615,36 +615,45 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
const bool back = RNA_boolean_get(op->ptr, "back");
wmMsgBus *mbus = CTX_wm_message_bus(C);
bGPdata *gpd = ED_gpencil_data_get_active(C);
bool is_object = false;
short mode;
/* if using a gpencil object, use this datablock */
Object *ob = CTX_data_active_object(C);
const bool is_mode_set = (ob->mode & OB_MODE_WEIGHT_GPENCIL_LEGACY) != 0;
if ((ob) && (ob->type == OB_GPENCIL_LEGACY)) {
gpd = static_cast<bGPdata *>(ob->data);
bGPdata *gpd = static_cast<bGPdata *>(ob->data);
if (gpd == nullptr) {
return OPERATOR_CANCELLED;
}
is_object = true;
}
const int mode_flag = OB_MODE_WEIGHT_GPENCIL_LEGACY;
const bool is_mode_set = (ob->mode & mode_flag) != 0;
if (gpd == nullptr) {
return OPERATOR_CANCELLED;
/* Just toggle weightmode flag... */
gpd->flag ^= GP_DATA_STROKE_WEIGHTMODE;
/* set mode */
if (gpd->flag & GP_DATA_STROKE_WEIGHTMODE) {
mode = OB_MODE_WEIGHT_GPENCIL_LEGACY;
}
else {
mode = OB_MODE_OBJECT;
}
}
/* Just toggle weightmode flag... */
gpd->flag ^= GP_DATA_STROKE_WEIGHTMODE;
/* set mode */
if (gpd->flag & GP_DATA_STROKE_WEIGHTMODE) {
mode = OB_MODE_WEIGHT_GPENCIL_LEGACY;
}
else {
mode = OB_MODE_OBJECT;
else if ((ob) && (ob->type == OB_GREASE_PENCIL)) {
is_object = true;
if (!is_mode_set) {
mode = OB_MODE_WEIGHT_GPENCIL_LEGACY;
}
else {
mode = OB_MODE_OBJECT;
}
}
if (is_object) {
/* try to back previous mode */
if ((ob->restore_mode) && ((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && (back == 1)) {
mode = ob->restore_mode;
if (ob->type == OB_GPENCIL_LEGACY) {
bGPdata *gpd = static_cast<bGPdata *>(ob->data);
if ((ob->restore_mode) && ((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && (back == 1)) {
mode = ob->restore_mode;
}
}
ob->restore_mode = ob->mode;
ob->mode = mode;
@ -664,9 +673,16 @@ static int gpencil_weightmode_toggle_exec(bContext *C, wmOperator *op)
}
/* setup other modes */
ED_gpencil_setup_modes(C, gpd, mode);
/* set cache as dirty */
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
if (ob->type == OB_GPENCIL_LEGACY) {
bGPdata *gpd = static_cast<bGPdata *>(ob->data);
ED_gpencil_setup_modes(C, gpd, mode);
/* set cache as dirty */
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
}
else if (ob->type == OB_GREASE_PENCIL) {
GreasePencil *grease_pencil = static_cast<GreasePencil *>(ob->data);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
}
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, nullptr);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, nullptr);

View File

@ -148,8 +148,8 @@ bool mode_compat_test(const Object *ob, eObjectMode mode)
}
break;
case OB_GREASE_PENCIL:
if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL | OB_MODE_WEIGHT_PAINT |
OB_MODE_SCULPT_GPENCIL_LEGACY))
if (mode & (OB_MODE_EDIT | OB_MODE_PAINT_GREASE_PENCIL | OB_MODE_SCULPT_GPENCIL_LEGACY |
OB_MODE_WEIGHT_GPENCIL_LEGACY))
{
return true;
}

View File

@ -408,7 +408,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 || !ELEM(ob->type, OB_MESH, OB_GREASE_PENCIL)) {
if (ob == nullptr || ob->type != OB_MESH) {
return false;
}
if (!ob->data || ID_IS_LINKED(ob->data)) {

View File

@ -1543,31 +1543,9 @@ 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_SYNC_TO_EVAL);
}
void ED_object_wpaintmode_enter_ex(Main *bmain, Depsgraph *depsgraph, Scene *scene, Object *ob)
{
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;
}
vwpaint::mode_enter_generic(bmain, depsgraph, scene, ob, OB_MODE_WEIGHT_PAINT);
}
void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph)
{
@ -1584,18 +1562,7 @@ void ED_object_wpaintmode_enter(bContext *C, Depsgraph *depsgraph)
void ED_object_wpaintmode_exit_ex(Object *ob)
{
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;
}
vwpaint::mode_exit_generic(ob, OB_MODE_WEIGHT_PAINT);
}
void ED_object_wpaintmode_exit(bContext *C)
{
@ -1668,6 +1635,8 @@ 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);
}
@ -1683,15 +1652,12 @@ static int wpaint_mode_toggle_exec(bContext *C, wmOperator *op)
/* Prepare armature posemode. */
blender::ed::object::posemode_set_for_weight_paint(C, bmain, ob, is_mode_set);
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);
}
/* 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);
WM_event_add_notifier(C, NC_SCENE | ND_MODE, scene);

View File

@ -1714,6 +1714,9 @@ void ED_view3d_buttons_region_layout_ex(const bContext *C,
case CTX_MODE_SCULPT_GREASE_PENCIL:
ARRAY_SET_ITEMS(contexts, ".paint_common", ".grease_pencil_sculpt");
break;
case CTX_MODE_WEIGHT_GREASE_PENCIL:
ARRAY_SET_ITEMS(contexts, ".grease_pencil_weight");
break;
case CTX_MODE_EDIT_POINT_CLOUD:
ARRAY_SET_ITEMS(contexts, ".point_cloud_edit");
break;

View File

@ -121,9 +121,6 @@ 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)) {

View File

@ -47,6 +47,7 @@ const EnumPropertyItem rna_enum_context_mode_items[] = {
{CTX_MODE_SCULPT_CURVES, "SCULPT_CURVES", 0, "Curves Sculpt", ""},
{CTX_MODE_PAINT_GREASE_PENCIL, "PAINT_GREASE_PENCIL", 0, "Grease Pencil Paint", ""},
{CTX_MODE_SCULPT_GREASE_PENCIL, "SCULPT_GREASE_PENCIL", 0, "Grease Pencil Sculpt", ""},
{CTX_MODE_WEIGHT_GREASE_PENCIL, "WEIGHT_GREASE_PENCIL", 0, "Grease Pencil Weight Paint", ""},
{0, nullptr, 0, nullptr, nullptr},
};

View File

@ -159,6 +159,9 @@ wmKeyMap *WM_keymap_guess_from_context(const bContext *C)
case CTX_MODE_SCULPT_GREASE_PENCIL:
km_id = "Grease Pencil Sculpt Mode";
break;
case CTX_MODE_WEIGHT_GREASE_PENCIL:
km_id = "Grease Pencil Weight Mode";
break;
}
}
else if (sl->spacetype == SPACE_IMAGE) {

View File

@ -723,6 +723,7 @@ static const char *toolsystem_default_tool(const bToolKey *tkey)
case CTX_MODE_SCULPT_GREASE_PENCIL:
return "builtin_brush.Push";
case CTX_MODE_WEIGHT_GPENCIL_LEGACY:
case CTX_MODE_WEIGHT_GREASE_PENCIL:
return "builtin_brush.Weight";
case CTX_MODE_VERTEX_GPENCIL_LEGACY:
return "builtin_brush.Draw";