Point Cloud: Add initial edit mode support

Similar to 5f16e24cc9, this adds support for edit mode
to the point cloud object type, which is currently hidden behind an
experimental option. No interaction is possible yet, for now this
can be used as a testing for a node-group-operator-only mode.
This commit is contained in:
Hans Goudey
2023-06-28 12:52:45 -04:00
parent a5b5623933
commit f89b32382a
13 changed files with 47 additions and 33 deletions

View File

@@ -2102,6 +2102,13 @@ class VIEW3D_MT_select_paint_mask_vertex(Menu):
layout.operator("paint.vert_select_linked", text="Select Linked")
class VIEW3D_MT_select_edit_point_cloud(Menu):
bl_label = "Select"
def draw(_self, _context):
pass
class VIEW3D_MT_edit_curves_select_more_less(Menu):
bl_label = "Select More/Less"
@@ -5478,6 +5485,13 @@ class VIEW3D_MT_edit_curves(Menu):
layout.operator("curves.delete")
class VIEW3D_MT_edit_pointcloud(Menu):
bl_label = "Point Cloud"
def draw(_self, _context):
pass
class VIEW3D_MT_object_mode_pie(Menu):
bl_label = "Mode"
@@ -8220,6 +8234,7 @@ classes = (
VIEW3D_MT_select_edit_gpencil,
VIEW3D_MT_select_paint_mask,
VIEW3D_MT_select_paint_mask_vertex,
VIEW3D_MT_select_edit_point_cloud,
VIEW3D_MT_edit_curves_select_more_less,
VIEW3D_MT_select_edit_curves,
VIEW3D_MT_select_sculpt_curves,
@@ -8347,6 +8362,7 @@ classes = (
VIEW3D_MT_edit_armature_delete,
VIEW3D_MT_edit_gpencil_transform,
VIEW3D_MT_edit_curves,
VIEW3D_MT_edit_pointcloud,
VIEW3D_MT_object_mode_pie,
VIEW3D_MT_view_pie,
VIEW3D_MT_transform_gizmo_pie,

View File

@@ -119,6 +119,7 @@ typedef enum eContextObjectMode {
CTX_MODE_EDIT_LATTICE,
CTX_MODE_EDIT_CURVES,
CTX_MODE_EDIT_GREASE_PENCIL,
CTX_MODE_EDIT_POINT_CLOUD,
CTX_MODE_POSE,
CTX_MODE_SCULPT,
CTX_MODE_PAINT_WEIGHT,

View File

@@ -1188,6 +1188,8 @@ enum eContextObjectMode CTX_data_mode_enum_ex(const Object *obedit,
return CTX_MODE_EDIT_CURVES;
case OB_GREASE_PENCIL:
return CTX_MODE_EDIT_GREASE_PENCIL;
case OB_POINTCLOUD:
return CTX_MODE_EDIT_POINT_CLOUD;
}
}
else {
@@ -1248,29 +1250,12 @@ enum eContextObjectMode CTX_data_mode_enum(const bContext *C)
* \note Must be aligned with above enum.
*/
static const char *data_mode_strings[] = {
"mesh_edit",
"curve_edit",
"surface_edit",
"text_edit",
"armature_edit",
"mball_edit",
"lattice_edit",
"curves_edit",
"grease_pencil_edit",
"posemode",
"sculpt_mode",
"weightpaint",
"vertexpaint",
"imagepaint",
"particlemode",
"objectmode",
"greasepencil_paint",
"greasepencil_edit",
"greasepencil_sculpt",
"greasepencil_weight",
"greasepencil_vertex",
"curves_sculpt",
nullptr,
"mesh_edit", "curve_edit", "surface_edit", "text_edit",
"armature_edit", "mball_edit", "lattice_edit", "curves_edit",
"grease_pencil_edit", "point_cloud_edit", "posemode", "sculpt_mode",
"weightpaint", "vertexpaint", "imagepaint", "particlemode",
"objectmode", "greasepencil_paint", "greasepencil_edit", "greasepencil_sculpt",
"greasepencil_weight", "greasepencil_vertex", "curves_sculpt", nullptr,
};
BLI_STATIC_ASSERT(ARRAY_SIZE(data_mode_strings) == CTX_MODE_NUM + 1,
"Must have a string for each context mode")

View File

@@ -1963,8 +1963,7 @@ bool BKE_object_is_in_editmode(const Object *ob)
/* Grease Pencil object has no edit mode data. */
return GPENCIL_EDIT_MODE((bGPdata *)ob->data);
case OB_CURVES:
/* Curves object has no edit mode data. */
return ob->mode == OB_MODE_EDIT;
case OB_POINTCLOUD:
case OB_GREASE_PENCIL:
return ob->mode == OB_MODE_EDIT;
default:
@@ -1994,6 +1993,7 @@ bool BKE_object_data_is_in_editmode(const Object *ob, const ID *id)
case ID_AR:
return ((const bArmature *)id)->edbo != nullptr;
case ID_CV:
case ID_PT:
case ID_GP:
if (ob) {
return BKE_object_is_in_editmode(ob);
@@ -2046,14 +2046,10 @@ char *BKE_object_data_editmode_flush_ptr_get(ID *id)
bArmature *arm = (bArmature *)id;
return &arm->needs_flush_to_id;
}
case ID_CV: {
/* Curves have no edit mode data. */
case ID_GP:
case ID_PT:
case ID_CV:
return nullptr;
}
case ID_GP: {
/* Grease Pencil has no edit mode data. */
return nullptr;
}
default:
BLI_assert_unreachable();
return nullptr;

View File

@@ -211,6 +211,7 @@ static void OVERLAY_cache_init(void *vedata)
case CTX_MODE_SCULPT_CURVES:
OVERLAY_sculpt_curves_cache_init(data);
break;
case CTX_MODE_EDIT_POINT_CLOUD:
case CTX_MODE_OBJECT:
break;
default:

View File

@@ -247,6 +247,7 @@ bool Instance::object_is_edit_mode(const Object *ob)
case OB_CURVES:
return state.ctx_mode == CTX_MODE_EDIT_CURVES;
case OB_POINTCLOUD:
return state.ctx_mode == CTX_MODE_EDIT_POINT_CLOUD;
case OB_VOLUME:
/* No edit mode yet. */
return false;

View File

@@ -687,7 +687,7 @@ static bool ED_object_editmode_load_free_ex(Main *bmain,
ED_mball_editmball_free(obedit);
}
}
else if (ELEM(obedit->type, OB_CURVES, OB_GREASE_PENCIL)) {
else if (ELEM(obedit->type, OB_CURVES, OB_GREASE_PENCIL, OB_POINTCLOUD)) {
/* Object doesn't have specific edit mode data, so pass. */
}
else {
@@ -883,6 +883,10 @@ bool ED_object_editmode_enter_ex(Main *bmain, Scene *scene, Object *ob, int flag
ok = true;
WM_main_add_notifier(NC_SCENE | ND_MODE | NS_EDITMODE_GREASE_PENCIL, scene);
}
else if (ob->type == OB_POINTCLOUD) {
ok = true;
WM_main_add_notifier(NC_SCENE | ND_MODE | NS_EDITMODE_POINT_CLOUD, scene);
}
if (ok) {
DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);

View File

@@ -130,6 +130,7 @@ bool ED_object_mode_compat_test(const Object *ob, eObjectMode mode)
case OB_SURF:
case OB_FONT:
case OB_MBALL:
case OB_POINTCLOUD:
if (mode & OB_MODE_EDIT) {
return true;
}

View File

@@ -1701,6 +1701,9 @@ void ED_view3d_buttons_region_layout_ex(const bContext *C,
case CTX_MODE_EDIT_GREASE_PENCIL:
ARRAY_SET_ITEMS(contexts, ".grease_pencil_edit");
break;
case CTX_MODE_EDIT_POINT_CLOUD:
ARRAY_SET_ITEMS(contexts, ".point_cloud_edit");
break;
case CTX_MODE_POSE:
ARRAY_SET_ITEMS(contexts, ".posemode");
break;

View File

@@ -614,6 +614,7 @@ typedef enum ObjectType {
OB_LATTICE, \
OB_ARMATURE, \
OB_CURVES, \
OB_POINTCLOUD, \
OB_GREASE_PENCIL))
#define OB_TYPE_SUPPORT_PARVERT(_type) \
(ELEM(_type, OB_MESH, OB_SURF, OB_CURVES_LEGACY, OB_LATTICE))

View File

@@ -31,6 +31,7 @@ const EnumPropertyItem rna_enum_context_mode_items[] = {
{CTX_MODE_EDIT_METABALL, "EDIT_METABALL", 0, "Metaball Edit", ""},
{CTX_MODE_EDIT_LATTICE, "EDIT_LATTICE", 0, "Lattice Edit", ""},
{CTX_MODE_EDIT_GREASE_PENCIL, "EDIT_GREASE_PENCIL", 0, "Grease Pencil Edit", ""},
{CTX_MODE_EDIT_POINT_CLOUD, "EDIT_POINT_CLOUD", 0, "Point Cloud Edit", ""},
{CTX_MODE_POSE, "POSE", 0, "Pose", ""},
{CTX_MODE_SCULPT, "SCULPT", 0, "Sculpt", ""},
{CTX_MODE_PAINT_WEIGHT, "PAINT_WEIGHT", 0, "Weight Paint", ""},

View File

@@ -515,6 +515,7 @@ typedef struct wmNotifier {
#define NS_MODE_PARTICLE (10 << 8)
#define NS_EDITMODE_CURVES (11 << 8)
#define NS_EDITMODE_GREASE_PENCIL (12 << 8)
#define NS_EDITMODE_POINT_CLOUD (13 << 8)
/* subtype 3d view editing */
#define NS_VIEW3D_GPU (16 << 8)

View File

@@ -109,6 +109,9 @@ wmKeyMap *WM_keymap_guess_from_context(const bContext *C)
case CTX_MODE_EDIT_GREASE_PENCIL:
km_id = "Grease Pencil Edit Mode";
break;
case CTX_MODE_EDIT_POINT_CLOUD:
km_id = "Point Cloud Edit Mode";
break;
case CTX_MODE_POSE:
km_id = "Pose";
break;