Commit: 797b15e6842577324af4bbf367b48ed22bf5e6e3
Author: Martin Felke
Date:   Thu Aug 9 17:47:35 2018 +0200
Branches: temp-fracture-modifier-2.8
https://developer.blender.org/rB797b15e6842577324af4bbf367b48ed22bf5e6e3

simulation jumps and interrupts itself still, regular rigidbodies crash...

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

M       intern/rigidbody/rb_bullet_api.cpp
M       source/blender/blenkernel/BKE_rigidbody.h
M       source/blender/blenkernel/intern/fracture.c
M       source/blender/blenkernel/intern/fracture_rigidbody.c
M       source/blender/blenkernel/intern/pointcache.c
M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/editors/object/object_modifier.c
M       source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp 
b/intern/rigidbody/rb_bullet_api.cpp
index 8d150ea22fb..844b69d870e 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -326,7 +326,7 @@ static void tickCallback(btDynamicsWorld *world, btScalar 
timeStep)
                                        rbContactPoint* cp = 
tworld->make_contact_point(pt, obA, obB);
                                        broken = weakenCompound(obA, 
cp->contact_force, pt.getPositionWorldOnA(), fworld);
                                        broken = broken || weakenCompound(obB, 
cp->contact_force, pt.getPositionWorldOnB(), fworld);
-                                       tworld->m_contactCallback(cp, 
tworld->m_bworld);
+                                       tworld->m_contactCallback(cp, 
tworld->m_bscene);
                                        delete cp;
                                }
 
@@ -739,7 +739,7 @@ struct rbFilterCallback : public btOverlapFilterCallback
                collides = collides && (rb0->col_groups & rb1->col_groups);
                if (this->callback != NULL && collides) {
 
-                       int result = this->callback(rb0->world->blenderWorld, 
rb0->meshIsland, rb1->meshIsland,
+                       int result = this->callback(rb0->world->blenderScene, 
rb0->meshIsland, rb1->meshIsland,
                                                                                
rb0->blenderOb, rb1->blenderOb, activate);
 
                        collides = collides && (bool)result;
@@ -898,7 +898,7 @@ public:
                rbRigidBody *rb0 = (rbRigidBody*)colObj0->getUserPointer();
                rbRigidBody *rb1 = (rbRigidBody*)colObj1->getUserPointer();
 
-               do_collide = 
((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderWorld,
+               do_collide = 
((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderScene,
                                                                                
             rb0->meshIsland, rb1->meshIsland,
                                                                                
                                                                                
     rb0->blenderOb, rb1->blenderOb, false);
                return !do_collide;
@@ -972,7 +972,7 @@ static void nearCallback(btBroadphasePair &collisionPair, 
btCollisionDispatcher
 
                                //handle_activation(manifold, rb0, rb1);
                                //handle_activation(manifold, rb1, rb0);
-                               
((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderWorld,
 rb0->meshIsland, rb1->meshIsland,
+                               
((rbFilterCallback*)(rb0->world->filterCallback))->callback(rb0->world->blenderScene,
 rb0->meshIsland, rb1->meshIsland,
                                                           rb0->blenderOb, 
rb1->blenderOb, true);
                        }
                }
@@ -1005,7 +1005,7 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], 
void* blenderWorld, void*
 
        TickDiscreteDynamicsWorld *tworld = new 
TickDiscreteDynamicsWorld(world->dispatcher,
                                                                          
world->pairCache,
-                                                             
world->constraintSolver,
+                                                                               
                                  world->constraintSolver,
                                                              
world->collisionConfiguration,
                                                              contactCallback, 
blenderWorld, blenderScene, idCallback, tickCallback);
 
@@ -1013,6 +1013,7 @@ rbDynamicsWorld *RB_dworld_new(const float gravity[3], 
void* blenderWorld, void*
        world->dynamicsWorld = tworld;
        world->blenderWorld = blenderWorld;
        world->idOutCallback = idCallbackOut;
+       world->blenderScene = blenderScene;
 
        RB_dworld_set_gravity(world, gravity);
 
diff --git a/source/blender/blenkernel/BKE_rigidbody.h 
b/source/blender/blenkernel/BKE_rigidbody.h
index f4d3416e972..aff826c7196 100644
--- a/source/blender/blenkernel/BKE_rigidbody.h
+++ b/source/blender/blenkernel/BKE_rigidbody.h
@@ -146,7 +146,7 @@ void BKE_rigidbody_update_sim_ob(struct Scene *scene, 
struct RigidBodyWorld *rbw
 struct MeshIsland* BKE_rigidbody_closest_meshisland_to_point(struct 
FractureModifierData* fmd, struct Object *ob,
                                                              struct Object 
*ob2, struct Scene* scene, struct RigidBodyCon *con);
 
-int BKE_rigidbody_filter_callback(void* world, void* island1, void* island2, 
void *blenderOb1, void* blenderOb2, bool activate);
+int BKE_rigidbody_filter_callback(void* scene, void* island1, void* island2, 
void *blenderOb1, void* blenderOb2, bool activate);
 void BKE_rigidbody_contact_callback(struct rbContactPoint* cp, void* world);
 void BKE_rigidbody_id_callback(void *world, void* island, int* objectId, int* 
islandId);
 
diff --git a/source/blender/blenkernel/intern/fracture.c 
b/source/blender/blenkernel/intern/fracture.c
index 23096a4fd78..9d332147558 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -5524,7 +5524,9 @@ static void do_post_island_creation(FractureModifierData 
*fmd, Object *ob, Mesh
        if (fmd->shared->refresh)
        {
                fmd->shared->refresh = false;
-               BKE_rigidbody_update_ob_array(scene->rigidbody_world, false);
+               BKE_rigidbody_update_ob_array(scene->rigidbody_world, true);
+
+               DEG_id_tag_update(&ob->id, OB_RECALC_OB);
        }
 
        fmd->shared->refresh_constraints = true;
diff --git a/source/blender/blenkernel/intern/fracture_rigidbody.c 
b/source/blender/blenkernel/intern/fracture_rigidbody.c
index a29588bed22..dd5d0b3df6a 100644
--- a/source/blender/blenkernel/intern/fracture_rigidbody.c
+++ b/source/blender/blenkernel/intern/fracture_rigidbody.c
@@ -16,7 +16,7 @@
 #include "DNA_ID.h"
 #include "DNA_fracture_types.h"
 
-#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_query.h"
 
 #ifdef WITH_BULLET
 #include "RBI_api.h"
@@ -701,8 +701,8 @@ void BKE_rigidbody_validate_sim_shard(RigidBodyWorld *rbw, 
MeshIsland *mi, Objec
                BKE_rigidbody_validate_sim_shard_shape(mi, ob, true);
 
        if (rbo->shared->physics_object) {
-               if (rebuild == false /*|| mi->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD*/)
-                       RB_dworld_remove_body(rbw->shared->physics_world, 
rbo->shared->physics_object);
+               //if (rebuild == false /*|| mi->rigidbody->flag & 
RBO_FLAG_KINEMATIC_REBUILD*/)
+               RB_dworld_remove_body(rbw->shared->physics_world, 
rbo->shared->physics_object);
        }
 
        if (!rbo->shared->physics_object || rebuild /*|| 
(fmd->use_animated_mesh && fmd->anim_mesh_ob)*/) {
@@ -1328,19 +1328,30 @@ static bool 
check_constraint_island(FractureModifierData* fmd, MeshIsland *mi1,
 }
 
 /* this allows partial object activation, only some shards will be activated, 
called from bullet(!) */
-int BKE_rigidbody_filter_callback(void* world, void* island1, void* island2, 
void *blenderOb1, void* blenderOb2, bool activate)
+int BKE_rigidbody_filter_callback(void* scene, void* island1, void* island2, 
void *blenderOb1, void* blenderOb2, bool activate)
 {
+       //pass scene here, in order to hopefully get the original one from DEG
        MeshIsland* mi1, *mi2;
-       RigidBodyWorld *rbw = (RigidBodyWorld*)world;
+       Scene *sc = (Scene*)scene, *sc_orig;
+
+       RigidBodyWorld *rbw;
        Object* ob1, *ob2;
        int ob_index1 = -1, ob_index2 = -1;
        bool validOb = true, check_activate = false;
 
+       // oh man... the pleasures of CoW...
+       sc_orig = DEG_get_original_id(sc);
+       rbw = sc_orig->rigidbody_world;
+
        mi1 = (MeshIsland*)island1;
        mi2 = (MeshIsland*)island2;
 
-       FractureModifierData *fmd1 = 
(FractureModifierData*)modifiers_findByType((Object*)blenderOb1, 
eModifierType_Fracture);
-       FractureModifierData *fmd2 = 
(FractureModifierData*)modifiers_findByType((Object*)blenderOb2, 
eModifierType_Fracture);
+       //MOOOOO
+       ob1 = DEG_get_original_object((Object*)blenderOb1);
+       ob2 = DEG_get_original_object((Object*)blenderOb2);
+
+       FractureModifierData *fmd1 = 
(FractureModifierData*)modifiers_findByType(ob1, eModifierType_Fracture);
+       FractureModifierData *fmd2 = 
(FractureModifierData*)modifiers_findByType(ob2, eModifierType_Fracture);
 
 #if 0
        if ((fmd1 && fmd1->fracture_mode == MOD_FRACTURE_EXTERNAL) ||
@@ -1723,7 +1734,8 @@ static void check_fracture(rbContactPoint* cp, 
RigidBodyWorld *rbw, Object *obA,
 
 void BKE_rigidbody_contact_callback(rbContactPoint* cp, void* world)
 {
-       RigidBodyWorld *rbw = (RigidBodyWorld*)world;
+       Scene* scene = DEG_get_original_id(world);
+       RigidBodyWorld *rbw = scene->rigidbody_world;
        check_fracture(cp, rbw, NULL, NULL);
 }
 
@@ -2274,16 +2286,9 @@ bool BKE_rigidbody_modifier_update(Scene* scene, Object* 
ob, RigidBodyWorld *rbw
        short laststeps = rbw->steps_per_second;
        float lastscale = rbw->time_scale;
        int i = 0;
-       ModifierData *md;
-       FractureModifierData *fmd;
+       FractureModifierData *fmd = NULL;
 
-       /* check for fractured objects which want to participate first, then 
handle other normal objects*/
-       for (md = ob->modifiers.first; md; md = md->next) {
-               if (md->type == eModifierType_Fracture) {
-                       fmd = (FractureModifierData *)md;
-                       break;
-               }
-       }
+       fmd = (FractureModifierData*) 
modifiers_findByType(DEG_get_original_object(ob), eModifierType_Fracture);
 
        if (BKE_rigidbody_modifier_active(fmd)) {
                float max_con_mass = 0;
@@ -2310,7 +2315,7 @@ bool BKE_rigidbody_modifier_update(Scene* scene, Object* 
ob, RigidBodyWorld *rbw
                        int fr = (int)BKE_scene_frame_get(scene);
                        if (BKE_fracture_dynamic_lookup_mesh_state(fmd, fr, 
true, scene))
                        {
-                               BKE_rigidbody_update_ob_array(rbw, false);
+                               BKE_rigidbody_update_ob_array(rbw, true);
                        }
                }
                //else
@@ -2609,7 +2614,7 @@ bool BKE_rigidbody_modifier_sync(ModifierData *md, Object 
*ob, Scene *scene, flo
 
                                if (BKE_fracture_dynamic_lookup_mesh_state(fmd, 
frame, true, scene))
                                {
-                                       BKE_rigidbody_update_ob_array(rbw, 
false);
+                                       BKE_rigidbody_update_ob_array(rbw, 
true);
                                }
                        }
 
diff --git a/source/blender/blenkernel/intern/pointcache.c 
b/source/blender/blenkernel/intern/pointcache.c
index 84d8a9c39d3..e0632e3ccc4 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1299,7 +1299,7 @@ static int  ptcache_rigidbody_write(int index, void 
*rb_v, void **data, int cfra
                return 1;
        }
 
-    if (rbo && rbo->shared->physics_object)
+    if (rbo && rbo->shared && rbo->shared->physics_object)
        {
 
 #ifdef WITH_BULLET
diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index e419886a12c..096dc6ef489 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1044,7 +1044,7 @@ void BKE_rigidbody_validate_sim_world(Scene *scene, 
RigidBodyWorld *rbw, bool re
        if (rebuild || rbw->shared->physics_world == NULL) {
                if (rbw->shared->physics_world)
                        RB_dworld_delete(rbw->shared->physics_world);
-               rbw->shared->physics_world = RB_d

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to