GPv3: Use GPv2 object mode flag for weight painting #120983
|
@ -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,
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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},
|
||||
};
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue