Commit: fe5f201a0d48eeb69768cff0657589f6658b6422
Author: Lukas Tönne
Date:   Mon Aug 4 18:36:41 2014 +0200
Branches: hair_system
https://developer.blender.org/rBfe5f201a0d48eeb69768cff0657589f6658b6422

Fix NULL access to the RigidBodyWorld.group pointer in various cases
which were previously filtered out by strict non-caching requirement.

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

M       source/blender/blenkernel/intern/rigidbody.c
M       source/blender/blenkernel/intern/rigidbody_objects.c

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

diff --git a/source/blender/blenkernel/intern/rigidbody.c 
b/source/blender/blenkernel/intern/rigidbody.c
index a373600..922e44f 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -710,16 +710,22 @@ static void rigidbody_update_ob_array(RigidBodyWorld *rbw)
        GroupObject *go;
        int i, n;
 
-       n = BLI_countlist(&rbw->group->gobject);
-
-       if (rbw->numbodies != n) {
-               rbw->numbodies = n;
-               rbw->objects = realloc(rbw->objects, sizeof(Object *) * 
rbw->numbodies);
+       if (rbw->group) {
+               n = BLI_countlist(&rbw->group->gobject);
+               
+               if (rbw->numbodies != n) {
+                       rbw->numbodies = n;
+                       rbw->objects = realloc(rbw->objects, sizeof(Object *) * 
rbw->numbodies);
+               }
+               
+               for (go = rbw->group->gobject.first, i = 0; go; go = go->next, 
i++) {
+                       Object *ob = go->ob;
+                       rbw->objects[i] = ob;
+               }
        }
-
-       for (go = rbw->group->gobject.first, i = 0; go; go = go->next, i++) {
-               Object *ob = go->ob;
-               rbw->objects[i] = ob;
+       else {
+               rbw->numbodies = 0;
+               rbw->objects = NULL;
        }
 }
 
@@ -748,7 +754,7 @@ static void rigidbody_sync_world(Scene *scene, 
RigidBodyWorld *rbw)
  *
  * \param rebuild Rebuild entire simulation
  */
-static void rigidbody_world_build(Scene *scene, RigidBodyWorld *rbw, int 
rebuild)
+static void rigidbody_world_build(Scene *scene, RigidBodyWorld *rbw, bool 
rebuild)
 {
        /* update world */
        if (rebuild)
@@ -829,7 +835,7 @@ void BKE_rigidbody_rebuild_world(Scene *scene, float ctime)
        cache = rbw->pointcache;
 
        /* flag cache as outdated if we don't have a world or number of objects 
in the simulation has changed */
-       if (rbw->physics_world == NULL || rbw->numbodies != 
BLI_countlist(&rbw->group->gobject)) {
+       if (rbw->physics_world == NULL || (rbw->group && rbw->numbodies != 
BLI_countlist(&rbw->group->gobject))) {
                cache->flag |= PTCACHE_OUTDATED;
        }
 
diff --git a/source/blender/blenkernel/intern/rigidbody_objects.c 
b/source/blender/blenkernel/intern/rigidbody_objects.c
index 67ac4a0..caaee2b 100644
--- a/source/blender/blenkernel/intern/rigidbody_objects.c
+++ b/source/blender/blenkernel/intern/rigidbody_objects.c
@@ -197,6 +197,8 @@ static void rigidbody_validate_sim_object(RigidBodyWorld 
*rbw, Object *ob, bool
 void BKE_rigidbody_objects_build(Scene *scene, struct RigidBodyWorld *rbw, 
bool rebuild)
 {
        GroupObject *go;
+       if (!rbw->group)
+               return;
        for (go = rbw->group->gobject.first; go; go = go->next) {
                Object *ob = go->ob;
                RigidBodyOb *rbo;
@@ -487,7 +489,8 @@ static void rigidbody_world_apply_object(Scene 
*UNUSED(scene), Object *ob)
 void BKE_rigidbody_objects_apply(Scene *scene, RigidBodyWorld *rbw)
 {
        GroupObject *go;
-       
+       if (!rbw->group)
+               return;
        for (go = rbw->group->gobject.first; go; go = go->next) {
                Object *ob = go->ob;

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

Reply via email to