[Bf-blender-cvs] [229f0c4b802] hair_guides_grooming: Add "remove" operator for groom regions.
Lukas Tönne
noreply at git.blender.org
Sat Jun 9 10:59:03 CEST 2018
Commit: 229f0c4b80224e6eaf593b9e47d164c4c832ec2d
Author: Lukas Tönne
Date: Sat Jun 9 09:53:00 2018 +0100
Branches: hair_guides_grooming
https://developer.blender.org/rB229f0c4b80224e6eaf593b9e47d164c4c832ec2d
Add "remove" operator for groom regions.
===================================================================
M release/scripts/startup/bl_ui/properties_data_groom.py
M source/blender/blenkernel/BKE_groom.h
M source/blender/blenkernel/intern/groom.c
M source/blender/editors/groom/editgroom_region.c
M source/blender/editors/groom/groom_intern.h
M source/blender/editors/groom/groom_ops.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_data_groom.py b/release/scripts/startup/bl_ui/properties_data_groom.py
index bb47091ea88..6d57f57780e 100644
--- a/release/scripts/startup/bl_ui/properties_data_groom.py
+++ b/release/scripts/startup/bl_ui/properties_data_groom.py
@@ -102,7 +102,7 @@ class DATA_PT_groom_regions(DataButtonsPanel, Panel):
col = row.column(align=True)
col.operator("groom.region_add", icon='ZOOMIN', text="")
- #col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
+ col.operator("groom.region_remove", icon='ZOOMOUT', text="")
if region:
col = layout.column()
diff --git a/source/blender/blenkernel/BKE_groom.h b/source/blender/blenkernel/BKE_groom.h
index 20952819939..fc45cdb23d0 100644
--- a/source/blender/blenkernel/BKE_groom.h
+++ b/source/blender/blenkernel/BKE_groom.h
@@ -66,6 +66,9 @@ void BKE_groom_curve_cache_clear(struct Groom *groom);
/* === Scalp regions === */
+struct GroomRegion* BKE_groom_region_add(struct Groom *groom);
+void BKE_groom_region_remove(struct Groom *groom, struct GroomRegion *region);
+
struct Mesh* BKE_groom_get_scalp(const struct Depsgraph *depsgraph, const struct Groom *groom);
/* Set the region's facemap name.
diff --git a/source/blender/blenkernel/intern/groom.c b/source/blender/blenkernel/intern/groom.c
index 0cf3c952da2..58020eaf682 100644
--- a/source/blender/blenkernel/intern/groom.c
+++ b/source/blender/blenkernel/intern/groom.c
@@ -102,35 +102,41 @@ void BKE_groom_bundle_curve_cache_clear(GroomBundle *bundle)
}
}
+/* Note: Only frees content, does not free region itself */
+static void groom_region_free_data(GroomRegion *region)
+{
+ if (region->scalp_samples)
+ {
+ MEM_freeN(region->scalp_samples);
+ }
+
+ GroomBundle *bundle = ®ion->bundle;
+
+ BKE_groom_bundle_curve_cache_clear(bundle);
+
+ if (bundle->sections)
+ {
+ MEM_freeN(bundle->sections);
+ }
+ if (bundle->verts)
+ {
+ MEM_freeN(bundle->verts);
+ }
+ if (bundle->guides)
+ {
+ MEM_freeN(bundle->guides);
+ }
+ if (bundle->guide_shape_weights)
+ {
+ MEM_freeN(bundle->guide_shape_weights);
+ }
+}
+
static void groom_regions_free(ListBase *regions)
{
for (GroomRegion *region = regions->first; region; region = region->next)
{
- if (region->scalp_samples)
- {
- MEM_freeN(region->scalp_samples);
- }
-
- GroomBundle *bundle = ®ion->bundle;
-
- BKE_groom_bundle_curve_cache_clear(bundle);
-
- if (bundle->sections)
- {
- MEM_freeN(bundle->sections);
- }
- if (bundle->verts)
- {
- MEM_freeN(bundle->verts);
- }
- if (bundle->guides)
- {
- MEM_freeN(bundle->guides);
- }
- if (bundle->guide_shape_weights)
- {
- MEM_freeN(bundle->guide_shape_weights);
- }
+ groom_region_free_data(region);
}
BLI_freelistN(regions);
}
@@ -295,6 +301,25 @@ void BKE_groom_boundbox_calc(Groom *groom)
/* === Scalp regions === */
+GroomRegion* BKE_groom_region_add(Groom *groom)
+{
+ ListBase *regions = (groom->editgroom ? &groom->editgroom->regions : &groom->regions);
+
+ GroomRegion *region = MEM_callocN(sizeof(GroomRegion), "groom region");
+ BLI_addtail(regions, region);
+
+ return region;
+}
+
+void BKE_groom_region_remove(Groom *groom, GroomRegion *region)
+{
+ ListBase *regions = (groom->editgroom ? &groom->editgroom->regions : &groom->regions);
+
+ BLI_remlink(regions, region);
+ groom_region_free_data(region);
+ MEM_freeN(region);
+}
+
Mesh* BKE_groom_get_scalp(const Depsgraph *depsgraph, const Groom *groom)
{
if (groom->scalp_object)
diff --git a/source/blender/editors/groom/editgroom_region.c b/source/blender/editors/groom/editgroom_region.c
index ea5ba59cd31..c9b11a52485 100644
--- a/source/blender/editors/groom/editgroom_region.c
+++ b/source/blender/editors/groom/editgroom_region.c
@@ -147,11 +147,7 @@ static int region_add_exec(bContext *C, wmOperator *op)
}
BLI_strncpy(scalp_facemap_name, fmap->name, sizeof(scalp_facemap_name));
- WM_operator_view3d_unit_defaults(C, op);
-
- GroomRegion *region = MEM_callocN(sizeof(GroomRegion), "groom region");
- ListBase *regions = (groom->editgroom ? &groom->editgroom->regions : &groom->regions);
- BLI_addtail(regions, region);
+ GroomRegion *region = BKE_groom_region_add(groom);
float scalp_loc[3];
float scalp_rot[3][3];
@@ -201,6 +197,47 @@ void GROOM_OT_region_add(wmOperatorType *ot)
ot->prop = prop;
}
+/* GROOM_OT_region_remove */
+
+static int region_remove_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_context(C);
+ Groom *groom = ob->data;
+
+ ListBase *regions = (groom->editgroom ? &groom->editgroom->regions : &groom->regions);
+ GroomRegion *region = CTX_data_pointer_get_type(C, "groom_region", &RNA_GroomRegion).data;
+ if (region == NULL)
+ {
+ region = BLI_findlink(regions, groom->active_region);
+ if (region == NULL)
+ {
+ return OPERATOR_CANCELLED;
+ }
+ }
+
+ BKE_groom_region_remove(groom, region);
+
+ WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+
+ return OPERATOR_FINISHED;
+}
+
+void GROOM_OT_region_remove(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Remove Region";
+ ot->description = "Remove a region from the groom object";
+ ot->idname = "GROOM_OT_region_remove";
+
+ /* api callbacks */
+ ot->exec = region_remove_exec;
+ ot->poll = ED_groom_object_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
/* GROOM_OT_region_bind */
static int region_bind_poll(bContext *C)
diff --git a/source/blender/editors/groom/groom_intern.h b/source/blender/editors/groom/groom_intern.h
index b398408ffd2..768aed63d63 100644
--- a/source/blender/editors/groom/groom_intern.h
+++ b/source/blender/editors/groom/groom_intern.h
@@ -37,6 +37,7 @@ struct wmOperatorType;
/* editgroom_region.c */
void GROOM_OT_region_add(struct wmOperatorType *ot);
+void GROOM_OT_region_remove(struct wmOperatorType *ot);
void GROOM_OT_region_bind(struct wmOperatorType *ot);
/* editgroom_select.c */
diff --git a/source/blender/editors/groom/groom_ops.c b/source/blender/editors/groom/groom_ops.c
index f5ff8989a6b..74e9c632158 100644
--- a/source/blender/editors/groom/groom_ops.c
+++ b/source/blender/editors/groom/groom_ops.c
@@ -53,6 +53,7 @@
void ED_operatortypes_groom(void)
{
WM_operatortype_append(GROOM_OT_region_add);
+ WM_operatortype_append(GROOM_OT_region_remove);
WM_operatortype_append(GROOM_OT_region_bind);
WM_operatortype_append(GROOM_OT_select_all);
More information about the Bf-blender-cvs
mailing list