[Bf-blender-cvs] [3553669] fracture_modifier: attempt to make mesh island packing faster when being called in a loop, create the dm only once after packing
Martin Felke
noreply at git.blender.org
Wed Jan 20 00:23:43 CET 2016
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);
}
More information about the Bf-blender-cvs
mailing list