[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 = &region->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 = &region->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