Commit: 3553669d125bafc5241f4a5739fbac87e18e1c47
Author: Martin Felke
Date:   Wed Jan 20 00:23:33 2016 +0100
Branches: fracture_modifier
https://developer.blender.org/rB3553669d125bafc5241f4a5739fbac87e18e1c47

attempt to make mesh island packing faster when being called in a loop, create 
the dm only once after packing

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

M       source/blender/blenkernel/BKE_fracture.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/makesrna/intern/rna_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/source/blender/blenkernel/BKE_fracture.h 
b/source/blender/blenkernel/BKE_fracture.h
index d12f7e4..ae45fb0 100644
--- a/source/blender/blenkernel/BKE_fracture.h
+++ b/source/blender/blenkernel/BKE_fracture.h
@@ -105,8 +105,8 @@ void BKE_fracture_store_settings(struct 
FractureModifierData *fs, struct Fractur
 struct Shard* BKE_create_initial_shard(struct DerivedMesh *dm);
 void BKE_copy_customdata_layers(struct CustomData* dest, struct CustomData 
*src, int type, int count);
 
-struct MeshIsland *BKE_fracture_mesh_island_add(struct FractureModifierData 
*fmd, struct Object *own, struct Object *target, int index);
-void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct 
MeshIsland *mi);
+struct MeshIsland *BKE_fracture_mesh_island_add(struct FractureModifierData 
*fmd, struct Object *own, struct Object *target, int index, bool update);
+void BKE_fracture_mesh_island_remove(struct FractureModifierData *fmd, struct 
MeshIsland *mi, bool update);
 void BKE_fracture_mesh_island_remove_all(struct FractureModifierData *fmd);
 
 struct RigidBodyShardCon* BKE_fracture_mesh_islands_connect(struct 
FractureModifierData *fmd, struct MeshIsland *mi1, struct MeshIsland *mi2, 
short con_type, int index);
@@ -114,5 +114,6 @@ void BKE_fracture_mesh_constraint_remove(struct 
FractureModifierData* fmd, struc
 void BKE_fracture_mesh_constraint_remove_all(struct FractureModifierData *fmd);
 
 void BKE_fracture_free_mesh_island(struct FractureModifierData *rmd, struct 
MeshIsland *mi, bool remove_rigidbody);
+int BKE_fracture_update_visual_mesh(struct FractureModifierData *fmd, bool 
do_custom_data);
 
 #endif /* BKE_FRACTURE_H */
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 75b3194..61cda42 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -1729,6 +1729,10 @@ static DerivedMesh *create_dm(FractureModifierData *fmd, 
bool doCustomData)
                }
        }
        else {
+
+               if (!fmd->frac_mesh)
+                       return NULL;
+
                for (s = fmd->frac_mesh->shard_map.first; s; s = s->next) {
                        num_verts += s->totvert;
                        num_polys += s->totpoly;
@@ -2210,7 +2214,10 @@ static void fracture_update_shards(FractureModifierData 
*fmd, Shard *s, int inde
        FracMesh* fm;
 
        if (!fmd->frac_mesh)
+       {
                fmd->frac_mesh = BKE_create_fracture_container();
+               fmd->frac_mesh->progress_counter = 0; //XXXX ABUSE this for 
vertstart now, threading doesnt work anyway yet
+       }
 
        fm = fmd->frac_mesh;
        BLI_addtail(&fm->shard_map, s);
@@ -2227,7 +2234,7 @@ static MeshIsland* 
fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 {
        MeshIsland *mi;
        int k = 0, j = 0, totvert;
-       MVert *mverts, *verts, *mv;
+       MVert *mverts = NULL, *verts, *mv;
 
        //create mesh island and intialize
        mi = MEM_callocN(sizeof(MeshIsland), "meshIsland");
@@ -2240,11 +2247,19 @@ static MeshIsland* 
fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
 
        //link up the visual mesh verts
        mi->vertices_cached = MEM_mallocN(sizeof(MVert *) * s->totvert, 
"vert_cache");
-       mverts = CDDM_get_verts(fmd->visible_mesh_cached);
+       if (fmd->visible_mesh_cached) /*ensure to be NULL in "pack, unpack" 
methods */
+               mverts = CDDM_get_verts(fmd->visible_mesh_cached);
        mi->vertex_indices = MEM_mallocN(sizeof(int) * mi->vertex_count, 
"mi->vertex_indices");
 
        for (k = 0; k < s->totvert; k++) {
-               mi->vertices_cached[k] = mverts + vertstart + k;
+               if (mverts)
+               {
+                       mi->vertices_cached[k] = mverts + vertstart + k;
+               }
+               else
+               {
+                       mi->vertices_cached[k] = NULL;
+               }
                mi->vertex_indices[k] = vertstart + k;
        }
 
@@ -2296,7 +2311,7 @@ static MeshIsland* 
fracture_shard_to_island(FractureModifierData *fmd, Shard *s,
        return mi;
 }
 
-static int fracture_update_visual_mesh(FractureModifierData *fmd, bool 
do_custom_data)
+int BKE_fracture_update_visual_mesh(FractureModifierData *fmd, bool 
do_custom_data)
 {
        MeshIsland *mi;
        DerivedMesh *dm = fmd->visible_mesh_cached;
@@ -2312,6 +2327,10 @@ static int 
fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom
        }
 
        fmd->visible_mesh_cached = create_dm(fmd, do_custom_data);
+
+       if (!fmd->visible_mesh_cached)
+               return 0;
+
        dm = fmd->visible_mesh_cached;
        mv = dm->getVertArray(dm);
        totvert = dm->getNumVerts(dm);
@@ -2354,11 +2373,11 @@ static int 
fracture_update_visual_mesh(FractureModifierData *fmd, bool do_custom
        return vertstart;
 }
 
-MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* 
own, Object *target, int index)
+MeshIsland* BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* 
own, Object *target, int index, bool update)
 {
        MeshIsland *mi;
        Shard *s;
-       int vertstart;
+       int vertstart = 0;
        float loc[3], rot[4];
 
        if (fmd->fracture_mode != MOD_FRACTURE_EXTERNAL || own->type != OB_MESH)
@@ -2366,7 +2385,14 @@ MeshIsland* 
BKE_fracture_mesh_island_add(FractureModifierData *fmd, Object* own,
 
        s = fracture_object_to_shard(own, target);
        fracture_update_shards(fmd, s, index);
-       vertstart = fracture_update_visual_mesh(fmd, true);
+       if (update) {
+               vertstart = BKE_fracture_update_visual_mesh(fmd, true);
+       }
+       else
+       {
+               vertstart = fmd->frac_mesh->progress_counter;
+               fmd->frac_mesh->progress_counter += s->totvert;
+       }
 
        //hrm need to rebuild ALL islands since vertex refs are bonkers now 
after mesh has changed
        mi = fracture_shard_to_island(fmd, s, vertstart);
@@ -2450,7 +2476,7 @@ void BKE_fracture_free_mesh_island(FractureModifierData 
*rmd, MeshIsland *mi, bo
        mi = NULL;
 }
 
-void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland *mi)
+void BKE_fracture_mesh_island_remove(FractureModifierData *fmd, MeshIsland 
*mi, bool update)
 {
        if (BLI_listbase_is_single(&fmd->meshIslands))
        {
@@ -2479,7 +2505,8 @@ void BKE_fracture_mesh_island_remove(FractureModifierData 
*fmd, MeshIsland *mi)
 
                        BKE_fracture_free_mesh_island(fmd, mi, true);
 
-                       fracture_update_visual_mesh(fmd, true);
+                       if (update)
+                               BKE_fracture_update_visual_mesh(fmd, true);
                }
        }
 }
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index e6d0ac2..33a4132 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -486,8 +486,8 @@ void BKE_rigidbody_update_cell(struct MeshIsland *mi, 
Object *ob, float loc[3],
                }
                
                vert = mi->vertices_cached[j];
-               //if (vert == NULL) break;
-               //if (vert->co == NULL) break;
+               if (vert == NULL) break;
+               if (vert->co == NULL) break;
                //if (rmd->refresh == true) break;
 
                startco[0] = mi->vertco[j * 3];
diff --git a/source/blender/editors/object/object_modifier.c 
b/source/blender/editors/object/object_modifier.c
index b520376..caf8fd0 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -62,6 +62,7 @@
 #include "BKE_displist.h"
 #include "BKE_DerivedMesh.h"
 #include "BKE_effect.h"
+#include "BKE_fracture.h"
 #include "BKE_global.h"
 #include "BKE_key.h"
 #include "BKE_lattice.h"
@@ -2438,6 +2439,19 @@ static int fracture_refresh_exec(bContext *C, wmOperator 
*op)
 
        rmd->reset_shards = RNA_boolean_get(op->ptr, "reset");
 
+       if (rmd->fracture_mode == MOD_FRACTURE_EXTERNAL)
+       {
+               DerivedMesh *dm = rmd->visible_mesh_cached;
+               if (dm)
+               {
+                       dm->needsFree = 1;
+                       dm->release(dm);
+                       dm = rmd->visible_mesh_cached = NULL;
+               }
+
+               BKE_fracture_update_visual_mesh(rmd, true);
+       }
+
        if (scene->rigidbody_world != NULL)
        {
                start = (double)scene->rigidbody_world->pointcache->startframe;
diff --git a/source/blender/makesrna/intern/rna_modifier.c 
b/source/blender/makesrna/intern/rna_modifier.c
index ba2cc0e..2435302 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1216,7 +1216,7 @@ static MeshIsland 
*rna_FractureModifier_mesh_island_new(ID* id, FractureModifier
        Object *owner = (Object*)id;
        if (ob != owner)
        {
-               MeshIsland* mi = BKE_fracture_mesh_island_add(fmd, owner, ob, 
index);
+               MeshIsland* mi = BKE_fracture_mesh_island_add(fmd, owner, ob, 
index, update);
 
                if (update)
                {
@@ -1239,7 +1239,7 @@ static void rna_FractureModifier_mesh_island_remove(ID 
*id, FractureModifierData
                return;
        }
 
-       BKE_fracture_mesh_island_remove(fmd, mi);
+       BKE_fracture_mesh_island_remove(fmd, mi, update);
        RNA_POINTER_INVALIDATE(mi_ptr);
 
        if (update)
diff --git a/source/blender/modifiers/intern/MOD_fracture.c 
b/source/blender/modifiers/intern/MOD_fracture.c
index 26d7fef..96bd98a 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -4231,6 +4231,12 @@ static DerivedMesh *applyModifier(ModifierData *md, 
Object *ob,
        {
                fmd->refresh = false;
                fmd->shards_to_islands = false;
+
+               if (!fmd->visible_mesh_cached)
+               {
+                       BKE_fracture_update_visual_mesh(fmd, true);
+               }
+
                if (fmd->visible_mesh_cached)
                        return CDDM_copy(fmd->visible_mesh_cached);
        }

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

Reply via email to