[Bf-blender-cvs] [89e2e80] fracture_modifier: dynamic fracture: slightly improved caching behavior, but it still flickers and doesnt continue simulation properly after cache ends
Martin Felke
noreply at git.blender.org
Tue Jun 2 15:49:41 CEST 2015
Commit: 89e2e80ef6caf35775d21a75c0310738faeef239
Author: Martin Felke
Date: Tue Jun 2 15:44:25 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB89e2e80ef6caf35775d21a75c0310738faeef239
dynamic fracture: slightly improved caching behavior, but it still flickers and doesnt continue simulation properly after cache ends
===================================================================
M source/blender/modifiers/intern/MOD_fracture.c
===================================================================
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 6c70c7f..fe8a111 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -75,7 +75,6 @@
#include "DNA_rigidbody_types.h"
#include "DNA_scene_types.h"
#include "DNA_curve_types.h"
-
#include "MOD_util.h"
#include "../../rigidbody/RBI_api.h"
@@ -84,6 +83,7 @@
#include "depsgraph_private.h" /* for depgraph updates */
#include "limits.h"
+static int lookup_mesh_state(FractureModifierData *fmd, int frame);
static FracMesh* copy_fracmesh(FracMesh* fm)
{
@@ -209,6 +209,7 @@ static void initData(ModifierData *md)
fmd->last_frame = FLT_MIN;
fmd->dynamic_force = 10.0f;
fmd->update_dynamic = false;
+
}
static void freeMeshIsland(FractureModifierData *rmd, MeshIsland *mi, bool remove_rigidbody)
@@ -3600,6 +3601,46 @@ static void get_prev_entries(FractureModifierData *fmd)
}
}
+static int lookup_mesh_state(FractureModifierData *fmd, int frame)
+{
+ bool changed = false;
+ bool forward = false;
+ bool backward = false;
+
+ backward = ((fmd->last_frame > frame) && fmd->current_mi_entry && fmd->current_mi_entry->prev);
+ forward = ((fmd->last_frame < frame) && (fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
+ (fmd->current_mi_entry->next->is_new == false));
+
+ if (backward)
+ {
+ while (fmd->current_mi_entry && fmd->current_mi_entry->prev &&
+ frame < fmd->current_mi_entry->prev->frame + 1)
+ {
+ changed = true;
+ free_constraints(fmd);
+ get_prev_entries(fmd);
+ }
+ }
+ else if (forward)
+ {
+ while ((fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
+ (fmd->current_mi_entry->next->is_new == false) &&
+ frame >= fmd->current_mi_entry->frame)
+ {
+ changed = true;
+ free_constraints(fmd);
+ get_next_entries(fmd);
+ }
+ }
+
+ if (changed)
+ {
+ fmd->modifier.scene->rigidbody_world->object_changed = true;
+ }
+
+ return forward || backward;
+}
+
static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
{
if (fmd->refresh)
@@ -3680,39 +3721,9 @@ static void do_modifier(FractureModifierData *fmd, Object *ob, DerivedMesh *dm)
else
{
int frame = (int)BKE_scene_frame_get(fmd->modifier.scene);
- int start = fmd->modifier.scene->rigidbody_world->pointcache->startframe;
- int end = fmd->modifier.scene->rigidbody_world->pointcache->endframe;
- /*handle looping here*/
- if (fmd->last_frame == end && frame == start)
- {
- fmd->last_frame = INT_MIN;
- }
-
- if ((fmd->last_frame > frame) && fmd->current_mi_entry && fmd->current_mi_entry->prev)
- {
- /*backward playback*/
- /*is frame < current entry->frame ?
- *then update*/
- if (frame < fmd->current_mi_entry->prev->frame + 1)
- {
- free_constraints(fmd);
- get_prev_entries(fmd);
- fmd->modifier.scene->rigidbody_world->object_changed = true;
- }
- }
- else if ((fmd->last_frame < frame) && (fmd->current_mi_entry) && (fmd->current_mi_entry->next != NULL) &&
- (fmd->current_mi_entry->next->is_new == false))
+ if (!(lookup_mesh_state(fmd, frame)))
{
- /*forward playback*/
- if (frame >= fmd->current_mi_entry->frame)
- {
- free_constraints(fmd);
- get_next_entries(fmd);
- fmd->modifier.scene->rigidbody_world->object_changed = true;
- }
- }
- else {
/*simulation mode*/
/* bullet callbacks may happen multiple times per frame, in next frame we can evaluate them all,
* so we need some array of shardIDs or shards to fracture each *
More information about the Bf-blender-cvs
mailing list