Commit: 2d1b5121df86a69108b23317e8ab73ff5bb1eef3
Author: Martin Felke
Date:   Wed Feb 18 20:46:15 2015 +0100
Branches: fracture_modifier
https://developer.blender.org/rB2d1b5121df86a69108b23317e8ab73ff5bb1eef3

added greasepencil edge fracture, the direction of cutting is currently limited 
to global X, Y or Z axis

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

M       release/scripts/startup/bl_operators/presets.py
M       release/scripts/startup/bl_ui/properties_physics_fracture.py
M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/fracture_util.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/makesdna/DNA_modifier_types.h
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_operators/presets.py 
b/release/scripts/startup/bl_operators/presets.py
index ff83bf1..b8c8aa7 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -591,7 +591,12 @@ class AddPresetFracture(AddPresetBase, Operator):
         "fracture.execute_threaded",
         "fracture.use_breaking",
         "fracture.nor_range",
-        "fracture.cluster_group"
+        "fracture.cluster_group",
+        "fracture.cutter_group",
+        "fracture.grease_offset",
+        "fracture.grease_decimate",
+        "fracture.use_greasepencil_edges",
+        "fracture.cutter_axis",
     ]
 
     preset_subdir = "fracture"
diff --git a/release/scripts/startup/bl_ui/properties_physics_fracture.py 
b/release/scripts/startup/bl_ui/properties_physics_fracture.py
index 25ab354..5e5eb04 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fracture.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fracture.py
@@ -103,6 +103,11 @@ class PHYSICS_PT_fracture(PhysicButtonsPanel, Panel):
             box.label("Fracture Point Source:")
             col = box.column()
             col.prop(md, "point_source")
+            if 'GREASE_PENCIL' in md.point_source:
+                col.prop(md, "use_greasepencil_edges")
+                col.prop(md, "grease_offset")
+                col.prop(md, "grease_decimate")
+                col.prop(md, "cutter_axis")
             col.prop(md, "extra_group")
             col.prop(md, "dm_group")
             col.prop(md, "use_particle_birth_coordinates")
diff --git a/source/blender/blenkernel/BKE_fracture.h 
b/source/blender/blenkernel/BKE_fracture.h
index c513d1e..cc16c7a 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -88,5 +88,6 @@ void BKE_fracture_shard_by_points(struct FracMesh *fmesh, 
ShardID id, struct Fra
 
 /* create shards from a base mesh and a set of other objects / cutter planes */
 void BKE_fracture_shard_by_planes(struct FractureModifierData *fmd, struct 
Object *obj, short inner_material_index, float mat[4][4]);
+void BKE_fracture_shard_by_greasepencil(struct FractureModifierData *fmd, 
struct Object *obj, short inner_material_index, float mat[4][4]);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 1b0be06..e2fac9b 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -52,6 +52,7 @@
 #include "BLI_utildefines.h"
 
 #include "DNA_fracture_types.h"
+#include "DNA_gpencil_types.h"
 #include "DNA_group_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
@@ -59,6 +60,7 @@
 #include "bmesh.h"
 
 #include "RBI_api.h"
+//#include "GPU_glew.h" /* uaahh, direct access to modelview matrix */
 
 /* debug timing */
 #define USE_DEBUG_TIMER
@@ -394,7 +396,7 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
        DerivedMesh *dm_p = NULL;
        Shard **tempshards;
        Shard **tempresults;
-       int max_retries = 50;
+       int max_retries = 20;
 
        tempshards = MEM_mallocN(sizeof(Shard *) * expected_shards, 
"tempshards");
        tempresults = MEM_mallocN(sizeof(Shard *) * expected_shards, 
"tempresults");
@@ -817,11 +819,292 @@ static void parse_cell_neighbors(cell c, int *neighbors, 
int totpoly)
        }
 }
 
-void BKE_fracture_shard_by_planes(FractureModifierData *fmd, Object *obj, 
short inner_material_index, float mat[4][4])
+static void stroke_to_faces(FractureModifierData *fmd, Object* ob, BMesh** bm, 
bGPDstroke *gps, int inner_material_index)
+{
+       BMVert *lastv = NULL;
+       BMEdge *laste = NULL;
+       int p = 0;
+       float imat[4][4];
+       float thresh = (float)fmd->grease_decimate / 100.0f;
+       float half[3];
+
+       invert_m4_m4(imat, ob->obmat);
+
+       for (p = 0; p < gps->totpoints; p++) {
+               if ((BLI_frand() < thresh) || (p == 0) || (p == 
gps->totpoints-1)) {
+                       BMVert *v;
+                       float point[3] = {0, 0, 0};
+
+                       point[0] = gps->points[p].x;
+                       point[1] = gps->points[p].y;
+                       point[2] = gps->points[p].z;
+
+                       mul_m4_v3(imat, point);
+                       v = BM_vert_create(*bm, point, NULL, 0);
+
+                       if (lastv) {
+                               BMFace* f;
+                               BMEdge* e, *e1, *e2, *e3;
+                               BMVert* v1, *v2;
+
+                               float nvec[3], co1[3], co2[3];
+                               e = BM_edge_create(*bm, lastv, v, NULL, 0);
+
+                               /*also "extrude" this along the normal, 
no...use global axises instead*/
+                               if (fmd->cutter_axis == MOD_FRACTURE_CUTTER_X)
+                               {
+                                       nvec[0] = 1.0f;
+                                       nvec[1] = 0.0f;
+                                       nvec[2] = 0.0f;
+                               }
+
+                               if (fmd->cutter_axis == MOD_FRACTURE_CUTTER_Y)
+                               {
+                                       nvec[0] = 0.0f;
+                                       nvec[1] = 1.0f;
+                                       nvec[2] = 0.0f;
+                               }
+
+                               if (fmd->cutter_axis == MOD_FRACTURE_CUTTER_Z)
+                               {
+                                       nvec[0] = 0.0f;
+                                       nvec[1] = 0.0f;
+                                       nvec[2] = 1.0f;
+                               }
+#if 0
+                               copy_v3_v3(vec, fmd->forward_vector);
+                               if (is_zero_v3(vec))
+                               {
+                                       sub_v3_v3v3(vec, v->co, lastv->co);
+                               }
+
+                               ortho_v3_v3(nvec, vec);
+                               /*glGetFloatv(GL_MODELVIEW_MATRIX, viewmat);
+                               nvec[0] = viewmat[2];
+                               nvec[1] = viewmat[6];
+                               nvec[2] = viewmat[10];*/
+
+                               normalize_v3(nvec);
+#endif
+
+                               mul_v3_fl(nvec, fmd->grease_offset);
+                               mul_v3_v3fl(half, nvec, 0.5f);
+
+                               /* move v and lastv a bit into the opposite 
direction */
+                               //sub_v3_v3(v->co, half);
+/*
+                               if (firstv != NULL) {
+                                       sub_v3_v3(firstv->co, half);
+                                       firstv = NULL;
+                               } */
+
+                               /* create orthogonal edge */
+                               add_v3_v3v3(co1, v->co, nvec);
+                               v1 = BM_vert_create(*bm, co1, NULL, 0);
+                               e1 = BM_edge_create(*bm, v, v1, NULL, 0);
+                               if (!laste)
+                               {
+                                       /* no last edge, connect last vert with 
displaced one */
+                                       //sub_v3_v3(lastv->co, half);
+                                       add_v3_v3v3(co2, lastv->co, nvec);
+                                       v2 = BM_vert_create(*bm, co2, NULL, 0);
+                                       laste = e1;
+                               }
+                               else
+                               {
+                                       /* update last edge with current */
+                                       e2 = laste;
+                                       v2 = laste->v2;
+                                       laste = e1;
+                               }
+
+                               /*create displaced edge */
+                               e3 = BM_edge_create(*bm, v1, v2, NULL, 0);
+
+                               /*create a quad face */
+                               f = BM_face_create_quad_tri(*bm, lastv, v, v1, 
v2, NULL, 0);
+                               f->mat_nr = inner_material_index;
+                       }
+#if 0
+                       else
+                       {
+                               firstv = v;
+                       }
+#endif
+
+                       lastv = v;
+               }
+       }
+
+       {
+               /* move the stroke mesh a bit out, half of offset */
+               BMIter iter;
+               BMVert *v;
+
+               BM_ITER_MESH(v, &iter, *bm, BM_VERTS_OF_MESH)
+               {
+                       sub_v3_v3(v->co, half);
+               }
+       }
+}
+
+
+
+static void intersect_shards_by_dm(FractureModifierData* fmd, DerivedMesh *d, 
Object* ob, Object* ob2, short inner_mat_index, float mat[4][4])
 {
+       Shard *t = NULL, *s = NULL, *s2 = NULL;
+       int i = 0, count = 0, k = 0, shards = 0, j = 0;
+       float imat[4][4];
+       int* shard_counts = NULL;
+       bool is_zero = false;
+       MVert *mv;
        DerivedMesh *dm_parent = NULL;
-       int shards = 0;
 
+       t = BKE_create_fracture_shard(d->getVertArray(d), d->getPolyArray(d), 
d->getLoopArray(d),
+                                     d->getNumVerts(d), d->getNumPolys(d), 
d->getNumLoops(d), true);
+       t = BKE_custom_data_to_shard(t, d);
+
+
+       invert_m4_m4(imat, ob->obmat);
+       for (i = 0, mv = t->mvert; i < t->totvert; mv++, i++){
+               if (ob2)
+                       mul_m4_v3(ob2->obmat, mv->co);
+               mul_m4_v3(imat, mv->co);
+       }
+
+       count = fmd->frac_mesh->shard_count;
+
+       /*TODO, pass modifier mesh here !!! */
+       if (count == 0) {
+               if (ob->derivedFinal != NULL) {
+                       dm_parent = CDDM_copy(ob->derivedFinal);
+               }
+
+               if (dm_parent == NULL) {
+                       dm_parent = CDDM_from_mesh(ob->data);
+               }
+
+               count = 1;
+               is_zero = true;
+       }
+
+       shard_counts = MEM_mallocN(sizeof(int) * count, "shard_counts");
+
+       for (k = 0; k < count; k++) {
+               /*just keep appending items at the end here */
+               MPoly *mpoly, *mp;
+               int totpoly;
+               Shard *parent = NULL;
+
+               if (is_zero == false) {
+                       parent = BLI_findlink(&fmd->frac_mesh->shard_map, k);
+                       dm_parent = BKE_shard_create_dm(parent, true);
+               }
+
+               mpoly = dm_parent->getPolyArray(dm_parent);
+               totpoly = dm_parent->getNumPolys(dm_parent);
+
+               for (j = 0, mp = mpoly; j < totpoly; j++, mp++) {
+                       mp->flag &= ~ME_FACE_SEL;
+               }
+
+               s = BKE_fracture_shard_boolean(ob, dm_parent, t, 
inner_mat_index, 0, 0.0f, &s2, NULL, 0.0f, false, 0);
+               printf("Fractured: %d\n", k);
+
+               if (s != NULL) {
+                       add_shard(fmd->frac_mesh, s, mat);
+                       shards++;
+                       s = NULL;
+               }
+
+               if (s2 != NULL) {
+                       add_shard(fmd->frac_mesh, s2, mat);
+                       shards++;
+                       s2 = NULL;
+               }
+
+               if ((is_zero && ob->derivedFinal == NULL) || !is_zero) {
+                       if (is_zero) {
+                               count = 0;
+                       }
+
+                       dm_parent->needsFree = 1;
+                       dm_parent->release(dm_parent);
+                       dm_parent = NULL;
+               }
+
+               if (is_zero) {
+                       shards = 0;
+               }
+
+               shard_counts[k] = shards;
+               //printf("k, shards: %d %d \n", k, shards);
+               shards = 0;
+       }
+
+       for (k = 0; k < count; k++)
+       {
+               int cnt = shard_counts[k];
+
+               if (cnt > 0)
+               {
+                       /*clean up old entries here to avoid unnecessary 
shards*/
+                       Shard *first = fmd->frac_mesh->shard_map.first;
+                       BLI_remlink_safe(&fmd->frac_mesh->shard_map,first);
+                       BKE_shard_free(first, true);
+                       first = NULL;
+                       fmd->frac_mesh->shard_count--;
+               }
+       }
+
+       MEM_freeN(shard_counts);
+       shard_counts = NULL;
+
+       BKE_shard_free(t, true);
+}
+
+void BKE_fracture_shard_by_greasepencil(FractureModifierData *fmd, Object 
*obj, short inner_material_index, float mat[4][4])
+{
+       bGPDlayer *gpl;
+       bGPDframe *gpf;
+       bGPDstroke *gps;
+
+       if ((obj->gpd) && (obj->gpd->layers.first)) {
+
+               float imat[4][4];
+               invert_m4_m4(imat, mat);
+               for (gpl = obj->gpd->layers.first; gpl; gpl = gpl->next) {
+                       for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
+                               for (gps = gpf->strokes.first; gps; gps = 
gps->next) {
+                                       BMesh *bm = 
BM_mesh_create(&bm_mesh_allocsize_default);
+                                       DerivedMesh *dm = NULL;
+//                                     Object* o;
+
+                                       /*create stroke mesh */
+                                       stroke_to_faces(fmd, obj, &bm, gps, 
inner_material_index);
+                                       dm = CDDM_from_bmesh(bm, true);
+#if 0
+                                       /*create debug mesh*/
+                                       o = BKE_object_add(G.main, 
fmd->modifier.scene, OB_MESH);
+                                       BM_mesh_bm_to_me(bm, o->data, true);
+#endif
+
+                                       BM_mesh_free(bm);
+
+                                       /*do intersection*/
+                                       intersect_shards_by_dm(fmd, dm, obj, 
NULL, inner_material_index, mat);
+
+                                       dm->needsFree = 1;
+                                       dm->releas

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to