[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