[Bf-blender-cvs] [2922a30] bmesh-boolean-experiment: Allow to switch between bmesh and carve boolean from the modifier UI

Campbell Barton noreply at git.blender.org
Thu Dec 3 03:53:28 CET 2015


Commit: 2922a30523b6ce76457b60c31bde3681f90f7815
Author: Campbell Barton
Date:   Thu Dec 3 13:46:42 2015 +1100
Branches: bmesh-boolean-experiment
https://developer.blender.org/rB2922a30523b6ce76457b60c31bde3681f90f7815

Allow to switch between bmesh and carve boolean from the modifier UI

===================================================================

M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_boolean.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 57f121c..e7877e1 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -146,12 +146,14 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         layout.row().prop(md, "offset_type", expand=True)
 
     def BOOLEAN(self, layout, ob, md):
+        layout.row().prop(md, "method", expand=True)
         split = layout.split()
 
         col = split.column()
         col.label(text="Operation:")
         col.prop(md, "operation", text="")
-        col.prop(md, "threshold")
+        if md.method == 'BMESH':
+            col.prop(md, "threshold")
 
         col = split.column()
         col.label(text="Object:")
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 61bb384..8887d8b 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -640,7 +640,7 @@ typedef struct BooleanModifierData {
 	ModifierData modifier;
 
 	struct Object *object;
-	int operation;
+	short operation, method;
 	float threshold;
 } BooleanModifierData;
 
@@ -650,6 +650,11 @@ typedef enum {
 	eBooleanModifierOp_Difference = 2,
 } BooleanModifierOp;
 
+typedef enum {
+	eBooleanModifierMethod_Carve  = 0,
+	eBooleanModifierMethod_BMesh  = 1,
+} BooleanModifierMethod;
+
 typedef struct MDefInfluence {
 	int vertex;
 	float weight;
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 20b1a61..0be06f2 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1868,6 +1868,12 @@ static void rna_def_modifier_boolean(BlenderRNA *brna)
 		{0, NULL, 0, NULL, NULL}
 	};
 
+	static EnumPropertyItem prop_method_items[] = {
+		{eBooleanModifierMethod_Carve, "CARVE", 0, "Carve", ""},
+		{eBooleanModifierMethod_BMesh, "BMESH", 0, "BMesh", ""},
+		{0, NULL, 0, NULL, NULL}
+	};
+
 	srna = RNA_def_struct(brna, "BooleanModifier", "Modifier");
 	RNA_def_struct_ui_text(srna, "Boolean Modifier", "Boolean operations modifier");
 	RNA_def_struct_sdna(srna, "BooleanModifierData");
@@ -1884,6 +1890,11 @@ static void rna_def_modifier_boolean(BlenderRNA *brna)
 	RNA_def_property_ui_text(prop, "Operation", "");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+	prop = RNA_def_property(srna, "method", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, prop_method_items);
+	RNA_def_property_ui_text(prop, "Method", "");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
 	prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_DISTANCE);
 	RNA_def_property_float_sdna(prop, NULL, "threshold");
 	RNA_def_property_range(prop, 0, 1.0f);
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index fb47ab1..c28c6f9 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -1,6 +1,3 @@
-#define USE_BMESH
-#define WITH_MOD_BOOLEAN
-
 /*
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
@@ -35,6 +32,9 @@
  *  \ingroup modifiers
  */
 
+#define USE_BMESH
+#define USE_CARVE WITH_MOD_BOOLEAN
+
 #include <stdio.h>
 
 #include "DNA_object_types.h"
@@ -118,7 +118,8 @@ static void updateDepsgraph(ModifierData *md,
 	DEG_add_object_relation(node, ob, DEG_OB_COMP_TRANSFORM, "Boolean Modifier");
 }
 
-#ifdef WITH_MOD_BOOLEAN
+#if defined(USE_CARVE) || defined(USE_BMESH)
+
 static DerivedMesh *get_quick_derivedMesh(DerivedMesh *derivedData, DerivedMesh *dm, int operation)
 {
 	DerivedMesh *result = NULL;
@@ -143,6 +144,11 @@ static DerivedMesh *get_quick_derivedMesh(DerivedMesh *derivedData, DerivedMesh
 
 	return result;
 }
+#endif  /* defined(USE_CARVE) || defined(USE_BMESH) */
+
+
+/* -------------------------------------------------------------------- */
+/* BMESH */
 
 #ifdef USE_BMESH
 
@@ -157,7 +163,7 @@ static int bm_face_isect_pair(BMFace *f, void *UNUSED(user_data))
 	return BM_elem_flag_test_bool(f, BM_FACE_TAG);
 }
 
-static DerivedMesh *applyModifier(
+static DerivedMesh *applyModifier_bmesh(
         ModifierData *md, Object *ob,
         DerivedMesh *dm,
         ModifierApplyFlag flag)
@@ -182,7 +188,7 @@ static DerivedMesh *applyModifier(
 			BMesh *bm;
 			const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_DM(dm, dm_other);
 
-			TIMEIT_START(NewBooleanDerivedMesh);
+			TIMEIT_START(boolean_bmesh);
 			bm = BM_mesh_create(&allocsize);
 
 			DM_to_bmesh_ex(dm_other, bm, true);
@@ -260,7 +266,7 @@ static DerivedMesh *applyModifier(
 
 			result->dirty |= DM_DIRTY_NORMALS;
 
-			TIMEIT_END(NewBooleanDerivedMesh);
+			TIMEIT_END(boolean_bmesh);
 
 			return result;
 		}
@@ -275,10 +281,17 @@ static DerivedMesh *applyModifier(
 
 	return dm;
 }
-#else // USE_BMESH
-static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
-                                  DerivedMesh *derivedData,
-                                  ModifierApplyFlag flag)
+#endif  /* USE_BMESH */
+
+
+/* -------------------------------------------------------------------- */
+/* CARVE */
+
+#ifdef USE_CARVE
+static DerivedMesh *applyModifier_carve(
+        ModifierData *md, Object *ob,
+        DerivedMesh *derivedData,
+        ModifierApplyFlag flag)
 {
 	BooleanModifierData *bmd = (BooleanModifierData *) md;
 	DerivedMesh *dm;
@@ -297,12 +310,12 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 		result = get_quick_derivedMesh(derivedData, dm, bmd->operation);
 
 		if (result == NULL) {
-			TIMEIT_START(NewBooleanDerivedMesh);
+			TIMEIT_START(boolean_carve);
 
 			result = NewBooleanDerivedMesh(dm, bmd->object, derivedData, ob,
 			                               1 + bmd->operation);
 
-			TIMEIT_END(NewBooleanDerivedMesh);
+			TIMEIT_END(boolean_carve);
 		}
 
 		/* if new mesh returned, return it; otherwise there was
@@ -315,15 +328,16 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 	
 	return derivedData;
 }
-#endif // USE_BMESH
-#else // WITH_MOD_BOOLEAN
-static DerivedMesh *applyModifier(ModifierData *UNUSED(md), Object *UNUSED(ob),
-                                  DerivedMesh *derivedData,
-                                  ModifierApplyFlag UNUSED(flag))
+#endif  /* USE_CARVE */
+
+
+static DerivedMesh *applyModifier_nop(
+        ModifierData *UNUSED(md), Object *UNUSED(ob),
+        DerivedMesh *derivedData,
+        ModifierApplyFlag UNUSED(flag))
 {
 	return derivedData;
 }
-#endif // WITH_MOD_BOOLEAN
 
 static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(md))
 {
@@ -334,6 +348,27 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *UNUSED(
 	return dataMask;
 }
 
+static DerivedMesh *applyModifier(
+        ModifierData *md, Object *ob,
+        DerivedMesh *derivedData,
+        ModifierApplyFlag flag)
+{
+	BooleanModifierData *bmd = (BooleanModifierData *)md;
+
+	switch (bmd->method) {
+#ifdef USE_CARVE
+		case eBooleanModifierMethod_Carve:
+			return applyModifier_carve(md, ob, derivedData, flag);
+#endif
+#ifdef USE_BMESH
+		case eBooleanModifierMethod_BMesh:
+			return applyModifier_bmesh(md, ob, derivedData, flag);
+#endif
+		default:
+			return applyModifier_nop(md, ob, derivedData, flag);
+	}
+}
+
 
 ModifierTypeInfo modifierType_Boolean = {
 	/* name */              "Boolean",




More information about the Bf-blender-cvs mailing list