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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to