diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 5941518afb7..e81f4d96b54 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -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, diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 44a6a056a69..468e7a0b33d 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -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, diff --git a/source/blender/blenkernel/intern/context.cc b/source/blender/blenkernel/intern/context.cc index 3c183d6f8c8..2d46c585837 100644 --- a/source/blender/blenkernel/intern/context.cc +++ b/source/blender/blenkernel/intern/context.cc @@ -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") diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 6cc90516692..5f17178cd0f 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -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; diff --git a/source/blender/draw/engines/overlay/overlay_engine.cc b/source/blender/draw/engines/overlay/overlay_engine.cc index d29c3935131..e9e8bd65637 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.cc +++ b/source/blender/draw/engines/overlay/overlay_engine.cc @@ -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: diff --git a/source/blender/draw/engines/overlay/overlay_next_instance.cc b/source/blender/draw/engines/overlay/overlay_next_instance.cc index a728c5b2119..284e74e0ed8 100644 --- a/source/blender/draw/engines/overlay/overlay_next_instance.cc +++ b/source/blender/draw/engines/overlay/overlay_next_instance.cc @@ -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; diff --git a/source/blender/editors/object/object_edit.cc b/source/blender/editors/object/object_edit.cc index 7200dc1039c..a5a742469d3 100644 --- a/source/blender/editors/object/object_edit.cc +++ b/source/blender/editors/object/object_edit.cc @@ -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); diff --git a/source/blender/editors/object/object_modes.cc b/source/blender/editors/object/object_modes.cc index 5e0e5e511a5..da5812de2b8 100644 --- a/source/blender/editors/object/object_modes.cc +++ b/source/blender/editors/object/object_modes.cc @@ -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; } diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 81c25602e46..1e70d638f71 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -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; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index 1caf1e16760..9f91ec5fcb4 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -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)) diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c index c35308236e8..b2a5cb217af 100644 --- a/source/blender/makesrna/intern/rna_context.c +++ b/source/blender/makesrna/intern/rna_context.c @@ -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", ""}, diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 72b98d7b5ba..469735445c6 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -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) diff --git a/source/blender/windowmanager/intern/wm_keymap_utils.c b/source/blender/windowmanager/intern/wm_keymap_utils.c index 05983fe6389..943500b9fc1 100644 --- a/source/blender/windowmanager/intern/wm_keymap_utils.c +++ b/source/blender/windowmanager/intern/wm_keymap_utils.c @@ -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;