Commit: 55f31b11ef9a8b37ddca762ab6bb89161ba902b8
Author: Campbell Barton
Date:   Fri Dec 11 13:46:45 2015 +1100
Branches: bmesh-boolean-experiment
https://developer.blender.org/rB55f31b11ef9a8b37ddca762ab6bb89161ba902b8

Merge branch 'master' into bmesh-boolean-experiment

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



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

diff --cc source/blender/bmesh/tools/bmesh_intersect.c
index fd12ba6,0283004..8804b09
--- a/source/blender/bmesh/tools/bmesh_intersect.c
+++ b/source/blender/bmesh/tools/bmesh_intersect.c
@@@ -1046,8 -808,7 +1045,8 @@@ bool BM_mesh_intersect
          BMesh *bm,
          struct BMLoop *(*looptris)[3], const int looptris_tot,
          int (*test_fn)(BMFace *f, void *user_data), void *user_data,
-         const bool use_self, const bool use_separate, const bool use_dissolve,
 -        const bool use_self, const bool use_separate, const bool 
use_island_connect,
++        const bool use_self, const bool use_separate, const bool 
use_dissolve, const bool use_island_connect,
 +        const int boolean_mode,
          const float eps)
  {
        struct ISectState s;
diff --cc source/blender/bmesh/tools/bmesh_intersect.h
index c584fec,a733815..1049013
--- a/source/blender/bmesh/tools/bmesh_intersect.h
+++ b/source/blender/bmesh/tools/bmesh_intersect.h
@@@ -29,8 -29,7 +29,8 @@@ bool BM_mesh_intersect
          BMesh *bm,
          struct BMLoop *(*looptris)[3], const int looptris_tot,
          int (*test_fn)(BMFace *f, void *user_data), void *user_data,
-         const bool use_self, const bool use_separate, const bool use_dissolve,
 -        const bool use_self, const bool use_separate, const bool 
use_island_connect,
++        const bool use_self, const bool use_separate, const bool 
use_dissolve, const bool use_island_connect,
 +        const int boolean_mode,
          const float eps);
  
  #endif /* __BMESH_INTERSECT_H__ */
diff --cc source/blender/editors/mesh/editmesh_intersect.c
index 813fa90,bd5faff..0641701
--- a/source/blender/editors/mesh/editmesh_intersect.c
+++ b/source/blender/editors/mesh/editmesh_intersect.c
@@@ -123,8 -123,7 +123,8 @@@ static int edbm_intersect_exec(bContex
                bm,
                em->looptris, em->tottri,
                test_fn, NULL,
-               use_self, use_separate, false,
 -              use_self, use_separate, true,
++              use_self, use_separate, true, true,
 +              -1,
                eps);
  
  
diff --cc source/blender/makesdna/DNA_modifier_types.h
index 3744ff3,6f07d18..831de91
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@@ -650,16 -649,6 +650,17 @@@ typedef enum 
        eBooleanModifierOp_Difference = 2,
  } BooleanModifierOp;
  
 +typedef enum {
 +      eBooleanModifierMethod_Carve  = 0,
 +      eBooleanModifierMethod_BMesh  = 1,
 +} BooleanModifierMethod;
 +
 +typedef enum {
-       eBooleanModifierFlag_Dissolve   = (1 << 0),
-       eBooleanModifierFlag_Separate   = (1 << 1),
++      eBooleanModifierFlag_Dissolve           = (1 << 0),
++      eBooleanModifierFlag_Separate           = (1 << 1),
++      eBooleanModifierFlag_ConnectRegions     = (1 << 2),
 +} BooleanModifierFlag;
 +
  typedef struct MDefInfluence {
        int vertex;
        float weight;
diff --cc source/blender/makesrna/intern/rna_modifier.c
index 69a3380,4ca7493..09a0f05
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@@ -1868,18 -1868,6 +1868,19 @@@ static void rna_def_modifier_boolean(Bl
                {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}
 +      };
 +
 +      static EnumPropertyItem prop_option_items[] = {
 +              {eBooleanModifierFlag_Dissolve, "DISSOLVE", 0, "Dissolve", ""},
 +              {eBooleanModifierFlag_Separate, "SEPARATE", 0, "Separate", ""},
++              {eBooleanModifierFlag_ConnectRegions, "CONNECT_REGIONS", 0, 
"Fill Holes", ""},
 +              {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");
diff --cc source/blender/modifiers/intern/MOD_boolean.c
index cefd5b1,3fd2c8a..4a72926
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@@ -50,25 -48,6 +50,25 @@@
  #include "MOD_boolean_util.h"
  #include "MOD_util.h"
  
 +#ifdef USE_BMESH
 +#include "BLI_math_geom.h"
 +#include "MEM_guardedalloc.h"
 +
 +#include "bmesh.h"
 +#include "bmesh_tools.h"
 +#include "tools/bmesh_intersect.h"
 +#endif
 +
 +#include "PIL_time.h"
 +#include "PIL_time_utildefines.h"
 +
 +static void initData(ModifierData *md)
 +{
 +      BooleanModifierData *bmd = (BooleanModifierData *)md;
 +
-       bmd->flag = eBooleanModifierFlag_Dissolve;
++      bmd->flag = eBooleanModifierFlag_Dissolve | 
eBooleanModifierFlag_ConnectRegions;
 +}
 +
  static void copyData(ModifierData *md, ModifierData *target)
  {
  #if 0
@@@ -151,156 -129,10 +151,157 @@@ static DerivedMesh *get_quick_derivedMe
  
        return result;
  }
 +#endif  /* defined(USE_CARVE) || defined(USE_BMESH) */
 +
 +
 +/* -------------------------------------------------------------------- */
 +/* BMESH */
 +
 +#ifdef USE_BMESH
 +
 +/* has no meaning for faces, do this so we can tell which face is which */
 +#define BM_FACE_TAG BM_ELEM_DRAW
 +
 +/**
 + * Compare selected/unselected.
 + */
 +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_bmesh(
 +        ModifierData *md, Object *ob,
 +        DerivedMesh *dm,
 +        ModifierApplyFlag flag)
 +{
 +      BooleanModifierData *bmd = (BooleanModifierData *) md;
 +      DerivedMesh *dm_other;
 +
 +      if (!bmd->object)
 +              return dm;
 +
 +      dm_other = get_dm_for_modifier(bmd->object, flag);
 +
 +      if (dm_other) {
 +              DerivedMesh *result;
 +
 +              /* when one of objects is empty (has got no faces) we could 
speed up
 +               * calculation a bit returning one of objects' derived meshes 
(or empty one)
 +               * Returning mesh is depended on modifiers operation (sergey) */
 +              result = get_quick_derivedMesh(dm, dm_other, bmd->operation);
 +
 +              if (result == NULL) {
 +                      BMesh *bm;
 +                      const BMAllocTemplate allocsize = 
BMALLOC_TEMPLATE_FROM_DM(dm, dm_other);
 +
 +                      TIMEIT_START(boolean_bmesh);
 +                      bm = BM_mesh_create(&allocsize);
 +
 +                      DM_to_bmesh_ex(dm_other, bm, true);
 +                      DM_to_bmesh_ex(dm, bm, true);
 +
 +                      if (1) {
 +                              /* create tessface & intersect */
 +                              const int looptris_tot = 
poly_to_tri_count(bm->totface, bm->totloop);
 +                              int tottri;
 +                              BMLoop *(*looptris)[3];
 +
 +                              looptris = MEM_mallocN(sizeof(*looptris) * 
looptris_tot, __func__);
 +
 +                              BM_bmesh_calc_tessellation(bm, looptris, 
&tottri);
 +
 +                              /* postpone this until after tessellating
 +                               * so we can use the original normals before 
the vertex are moved */
 +                              {
 +                                      BMIter iter;
 +                                      int i;
 +                                      const int i_verts_end = 
dm_other->getNumVerts(dm_other);
 +                                      const int i_faces_end = 
dm_other->getNumPolys(dm_other);
 +
 +                                      float imat[4][4];
 +                                      float omat[4][4];
 +
 +                                      invert_m4_m4(imat, ob->obmat);
 +                                      mul_m4_m4m4(omat, imat, 
bmd->object->obmat);
 +
 +
 +                                      BMVert *eve;
 +                                      i = 0;
 +                                      BM_ITER_MESH (eve, &iter, bm, 
BM_VERTS_OF_MESH) {
 +                                              mul_m4_v3(omat, eve->co);
 +                                              if (++i == i_verts_end) {
 +                                                      break;
 +                                              }
 +                                      }
 +
 +                                      /* we need face normals because of 
'BM_face_split_edgenet'
 +                                       * we could calculate on the fly too 
(before calling split). */
 +                                      float nmat[4][4];
 +                                      invert_m4_m4(nmat, omat);
 +
 +                                      BMFace *efa;
 +                                      i = 0;
 +                                      BM_ITER_MESH (efa, &iter, bm, 
BM_FACES_OF_MESH) {
 +                                              mul_transposed_mat3_m4_v3(nmat, 
efa->no);
 +                                              normalize_v3(efa->no);
 +                                              BM_elem_flag_enable(efa, 
BM_FACE_TAG);  /* temp tag to test which side split faces are from */
 +                                              if (++i == i_faces_end) {
 +                                                      break;
 +                                              }
 +                                      }
 +                              }
 +
 +                              /* not needed, but normals for 'dm' will be 
invalid,
 +                               * currently this is ok for 'BM_mesh_intersect' 
*/
 +                              // BM_mesh_normals_update(bm);
 +
 +                              BM_mesh_intersect(
 +                                      bm,
 +                                      looptris, tottri,
 +                                      bm_face_isect_pair, NULL,
 +                                      false,
 +                                      (bmd->flag & 
eBooleanModifierFlag_Separate) != 0,
 +                                      (bmd->flag & 
eBooleanModifierFlag_Dissolve) != 0,
++                                      (bmd->flag & 
eBooleanModifierFlag_ConnectRegions) != 0,
 +                                      bmd->operation,
 +                                      bmd->threshold);
 +
 +                              MEM_freeN(looptris);
 +                      }
 +
 +                      result = CDDM_from_bmesh(bm, true);
 +
 +                      BM_mesh_free(bm);
 +
 +                      result->dirty |= DM_DIRTY_NORMALS;
 +
 +                      TIMEIT_END(boolean_bmesh);
 +
 +                      return result;
 +              }
 +
 +              /* if new mesh returned, return it; otherwise there was
 +               * an error, so delete the modifier object */
 +              if (result)
 +                      return result;
 +              else
 +                      modifier_setError(md, "Cannot execute boolean 
operation");
 +      }
 +
 +      return dm;
 +}
 +#endif  /* USE_BMESH */
 +
  
 -static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
 -                                  DerivedMesh *derivedData,
 -                                  ModifierApplyFlag flag)
 +/* -------------------------------------------------------------------- */
 +/* CARVE */
 +
 +#ifdef USE_CARVE
 +static DerivedMesh *applyModifier_carve(
 +        ModifierData *md, Object *ob,
 +        DerivedMesh *derivedData,
 +        ModifierApplyFlag flag)
  {
        BooleanModifierData *bmd = (BooleanModifierData *) md;
        DerivedMesh *dm;

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

Reply via email to