Commit: 0eae9ab1152974f026ec14db0d231ac0682feb40
Author: Martin Felke
Date:   Sat Oct 17 17:49:10 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB0eae9ab1152974f026ec14db0d231ac0682feb40

fix attempt for splinters, did crash.. now works but its incorrect for multiple 
settings

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

M       source/blender/blenkernel/intern/fracture.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index f0ff619..3ebe3c8 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -795,18 +795,25 @@ static void parse_cells(cell *cells, int expected_shards, 
ShardID parent_id, Fra
                return;
        }
 
-       if (mode == MOD_FRACTURE_PREFRACTURED && reset)
+/*     if (mode == MOD_FRACTURE_PREFRACTURED && reset)
        {
-               while (fm->shard_map.first)
+               Shard *t = fm->shard_map.first, *next = NULL;
+               while (t && t->next)
                {
-                       Shard *t = fm->shard_map.first;
-                       BLI_remlink_safe(&fm->shard_map, t);
-                       printf("Resetting shard: %d\n", t->shard_id);
-                       BKE_shard_free(t, true);
+                       next = t->next;
+
+                       if (t != p)
+                       {
+                               BLI_remlink_safe(&fm->shard_map, t);
+                               printf("Resetting shard: %d\n", t->shard_id);
+                               BKE_shard_free(t, true);
+                       }
+
+                       t = next;
                }
-       }
+       }*/
 
-       if (mode == MOD_FRACTURE_PREFRACTURED && !reset)
+       if (mode == MOD_FRACTURE_PREFRACTURED /*&& !reset*/)
        {
                //rebuild tree
                if (!fm->last_shard_tree && (fm->shard_count > 0) && mode == 
MOD_FRACTURE_PREFRACTURED)
@@ -2026,6 +2033,7 @@ void BKE_fracture_load_settings(FractureModifierData 
*fmd, FractureSetting *fs)
        fmd->point_source = fs->point_source;
 
        fmd->use_particle_birth_coordinates = 
fs->use_particle_birth_coordinates;
+       fmd->splinter_axis = fs->splinter_axis;
        fmd->splinter_length = fs->splinter_length;
        fmd->cluster_solver_iterations_override = 
fs->cluster_solver_iterations_override;
 
@@ -2096,6 +2104,7 @@ void BKE_fracture_store_settings(FractureModifierData 
*fs, FractureSetting *fmd)
 
        fmd->use_particle_birth_coordinates = 
fs->use_particle_birth_coordinates;
        fmd->splinter_length = fs->splinter_length;
+       fmd->splinter_axis = fs->splinter_axis;
        fmd->cluster_solver_iterations_override = 
fs->cluster_solver_iterations_override;
 
        fmd->cluster_breaking_angle = fs->cluster_breaking_angle;
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index fb4fb03..b443c82 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -1130,11 +1130,22 @@ static Material* find_material(const char* name)
        return BKE_material_add(G.main, name);
 }
 
-static void do_splinters(FractureModifierData *fmd, FracPointCloud points, 
DerivedMesh *dm, float(*mat)[4][4])
+static Shard* do_splinters(FractureModifierData *fmd, FracPointCloud points, 
float(*mat)[4][4], ShardID id, DerivedMesh *dm)
 {
        float imat[4][4];
+
+       /*need to add island / shard centroid...*/
+       Shard *s = BKE_shard_by_id(fmd->frac_mesh, id, NULL);
+
        unit_m4(*mat);
 
+       /* copy location to matrix */
+       if (s) {
+               (*mat)[3][0] = s->centroid[0];
+               (*mat)[3][1] = s->centroid[1];
+               (*mat)[3][2] = s->centroid[2];
+       }
+
        /*splinters... just global axises and a length, for rotation rotate the 
object */
        if (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X)
        {
@@ -1153,20 +1164,32 @@ static void do_splinters(FractureModifierData *fmd, 
FracPointCloud points, Deriv
                (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Y) ||
                (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Z))
        {
-               int i = 0;
-               MVert* mvert = dm->getVertArray(dm), *mv;
+               int i = 0, num_verts = 0;
+               MVert* mvert = NULL, *mv;
                invert_m4_m4(imat, *mat);
 
+               if (s) {
+                       mvert = s->mvert;
+                       num_verts = s->totvert;
+               }
+               else
+               {
+                       mvert = dm->getVertArray(dm);
+                       num_verts = dm->getNumVerts(dm);
+               }
+
                for (i = 0; i < points.totpoints; i++)
                {
                        mul_m4_v3(imat, points.points[i].co);
                }
 
-               for (i = 0, mv = mvert; i < dm->getNumVerts(dm); i++, mv++)
+               for (i = 0, mv = mvert; i < num_verts; i++, mv++)
                {
                        mul_m4_v3(imat, mv->co);
                }
        }
+
+       return s;
 }
 
 static short do_materials(FractureModifierData *fmd, Object* obj)
@@ -1237,15 +1260,26 @@ static short do_materials(FractureModifierData *fmd, 
Object* obj)
        return mat_index;
 }
 
-static void cleanup_splinters(FractureModifierData *fmd, DerivedMesh *dm, 
float mat[4][4])
+static void cleanup_splinters(FractureModifierData *fmd, float mat[4][4], 
Shard *s, DerivedMesh *dm)
 {
        if ((fmd->splinter_axis & MOD_FRACTURE_SPLINTER_X) ||
                (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Y) ||
                (fmd->splinter_axis & MOD_FRACTURE_SPLINTER_Z))
        {
-               int i = 0;
-               MVert* mvert = dm->getVertArray(dm), *mv;
-               for (i = 0, mv = mvert; i < dm->getNumVerts(dm); i++, mv++)
+               int i = 0, num_verts = 0;
+               MVert* mvert = NULL, *mv;
+
+               if (s) {
+                       mvert = s->mvert;
+                       num_verts = s->totvert;
+               }
+               else
+               {
+                       mvert = dm->getVertArray(dm);
+                       num_verts = dm->getNumVerts(dm);
+               }
+
+               for (i = 0, mv = mvert; i < num_verts; i++, mv++)
                {
                        mul_m4_v3(mat, mv->co);
                }
@@ -1263,9 +1297,10 @@ static void do_fracture(FractureModifierData *fmd, 
ShardID id, Object *obj, Deri
                bool temp = fmd->shards_to_islands;
                short mat_index = 0;
                float mat[4][4];
+               Shard *s = NULL;
 
                /*splinters... just global axises and a length, for rotation 
rotate the object */
-               do_splinters(fmd, points, dm, &mat);
+               s = do_splinters(fmd, points, &mat, id, dm);
 
                mat_index = do_materials(fmd, obj);
                mat_index = mat_index > 0 ? mat_index - 1 : mat_index;
@@ -1302,7 +1337,7 @@ static void do_fracture(FractureModifierData *fmd, 
ShardID id, Object *obj, Deri
                BKE_fracture_create_dm(fmd, true);
                fmd->shards_to_islands = temp;
 
-               cleanup_splinters(fmd, dm, mat);
+               cleanup_splinters(fmd, mat, s, dm);
                fmd->reset_shards = false;
        }
        MEM_freeN(points.points);

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

Reply via email to