Commit: c2110213ca7a6b8ba2392cf6e8f5a61b7ba4b554
Author: Brecht Van Lommel
Date:   Mon Jun 25 14:21:15 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBc2110213ca7a6b8ba2392cf6e8f5a61b7ba4b554

Physics: update softbody and dynamic paint to get colliders from depsgraph.

Because looping over the scene is unsafe and slow.

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

M       source/blender/blenkernel/BKE_collection.h
M       source/blender/blenkernel/intern/collection.c
M       source/blender/blenkernel/intern/collision.c
M       source/blender/blenkernel/intern/dynamicpaint.c
M       source/blender/blenkernel/intern/effect.c
M       source/blender/blenkernel/intern/softbody.c
M       source/blender/depsgraph/intern/depsgraph_physics.cc

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

diff --git a/source/blender/blenkernel/BKE_collection.h 
b/source/blender/blenkernel/BKE_collection.h
index f543286d01e..175ee61c690 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -96,10 +96,7 @@ bool BKE_collection_object_cyclic_check(struct Main *bmain, 
struct Object *objec
 struct ListBase BKE_collection_object_cache_get(struct Collection *collection);
 void BKE_collection_object_cache_free(struct Collection *collection);
 
-struct Base *BKE_collection_or_layer_objects(const struct Depsgraph *depsgraph,
-                                             const struct Scene *scene,
-                                             const struct ViewLayer 
*view_layer,
-                                             struct Collection *collection);
+struct Base *BKE_collection_or_layer_objects(const struct ViewLayer 
*view_layer, struct Collection *collection);
 
 /* Editing. */
 
diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index 8a3d27ca790..1d9cc9bb8d0 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -364,36 +364,13 @@ void BKE_collection_object_cache_free(Collection 
*collection)
        collection_object_cache_free(collection);
 }
 
-Base *BKE_collection_or_layer_objects(const Depsgraph *depsgraph,
-                                      const Scene *scene,
-                                      const ViewLayer *view_layer,
-                                      Collection *collection)
+Base *BKE_collection_or_layer_objects(const ViewLayer *view_layer, Collection 
*collection)
 {
-       // TODO: this is used by physics to get objects from a collection, but 
the
-       // the physics systems are not all using the depsgraph correctly which 
means
-       // we try different things. Instead we should explicitly get evaluated 
or
-       // non-evaluated data and always have the depsgraph available when 
needed
-
        if (collection) {
                return BKE_collection_object_cache_get(collection).first;
        }
-       else if (depsgraph) {
-               view_layer = DEG_get_evaluated_view_layer(depsgraph);
-
-               if (view_layer) {
-                       return FIRSTBASE(view_layer);
-               }
-               else {
-                       view_layer = DEG_get_input_view_layer(depsgraph);
-                       return FIRSTBASE(view_layer);
-               }
-       }
-       else if (view_layer) {
-               return FIRSTBASE(view_layer);
-       }
        else {
-               /* depsgraph is NULL during deg build */
-               return 
FIRSTBASE(BKE_view_layer_context_active_PLACEHOLDER(scene));
+               return FIRSTBASE(view_layer);
        }
 }
 
diff --git a/source/blender/blenkernel/intern/collision.c 
b/source/blender/blenkernel/intern/collision.c
index 1debdbb847e..a734e140932 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -518,7 +518,7 @@ static void add_collision_object(ListBase *relations, 
Object *ob, int level, uns
 ListBase *BKE_collision_relations_create(Depsgraph *depsgraph, Collection 
*collection, unsigned int modifier_type)
 {
        ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
-       Base *base = BKE_collection_or_layer_objects(NULL, NULL, view_layer, 
collection);
+       Base *base = BKE_collection_or_layer_objects(view_layer, collection);
        const bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
        const int base_flag = (for_render) ? BASE_ENABLED_RENDER : 
BASE_ENABLED_VIEWPORT;
 
@@ -548,6 +548,7 @@ Object **BKE_collision_objects_create(Depsgraph *depsgraph, 
Object *self, Collec
        ListBase *relations = DEG_get_collision_relations(depsgraph, 
collection, modifier_type);
 
        if (!relations) {
+               *numcollobj = 0;
                return NULL;
        }
 
diff --git a/source/blender/blenkernel/intern/dynamicpaint.c 
b/source/blender/blenkernel/intern/dynamicpaint.c
index 0d694a4d25c..c1bdfc42a05 100644
--- a/source/blender/blenkernel/intern/dynamicpaint.c
+++ b/source/blender/blenkernel/intern/dynamicpaint.c
@@ -56,6 +56,7 @@
 #include "BKE_armature.h"
 #include "BKE_bvhutils.h"   /* bvh tree */
 #include "BKE_collection.h"
+#include "BKE_collision.h"
 #include "BKE_colorband.h"
 #include "BKE_cdderivedmesh.h"
 #include "BKE_constraint.h"
@@ -490,28 +491,17 @@ static void scene_setSubframe(Scene *scene, float 
subframe)
        scene->r.subframe = subframe;
 }
 
-static int surface_getBrushFlags(DynamicPaintSurface *surface, const Depsgraph 
*depsgraph)
+static int surface_getBrushFlags(DynamicPaintSurface *surface, Depsgraph 
*depsgraph)
 {
-       Base *base = BKE_collection_or_layer_objects(depsgraph, NULL, NULL, 
surface->brush_group);
-       Object *brushObj = NULL;
-       ModifierData *md = NULL;
+       unsigned int numobjects;
+       Object **objects = BKE_collision_objects_create(depsgraph, NULL, 
surface->brush_group, &numobjects, eModifierType_DynamicPaint);
 
        int flags = 0;
 
-       while (base) {
-               brushObj = NULL;
+       for (int i = 0; i < numobjects; i++) {
+               Object *brushObj = objects[i];
 
-               /* select object */
-               brushObj = base->object;
-
-               /* next item */
-               base = base->next;
-
-               if (!brushObj) {
-                       continue;
-               }
-
-               md = modifiers_findByType(brushObj, eModifierType_DynamicPaint);
+               ModifierData *md = modifiers_findByType(brushObj, 
eModifierType_DynamicPaint);
                if (md && md->mode & (eModifierMode_Realtime | 
eModifierMode_Render)) {
                        DynamicPaintModifierData *pmd2 = 
(DynamicPaintModifierData *)md;
 
@@ -524,6 +514,8 @@ static int surface_getBrushFlags(DynamicPaintSurface 
*surface, const Depsgraph *
                }
        }
 
+       BKE_collision_objects_free(objects);
+
        return flags;
 }
 
@@ -5758,7 +5750,7 @@ static void dynamic_paint_generate_bake_data_cb(
        }
 }
 
-static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const 
Depsgraph *depsgraph, Object *ob)
+static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, 
Depsgraph *depsgraph, Object *ob)
 {
        PaintSurfaceData *sData = surface->data;
        PaintBakeData *bData = sData->bData;
@@ -5911,29 +5903,18 @@ static int dynamicPaint_doStep(
         * Loop through surface's target paint objects and do painting
         */
        {
-               Object *brushObj = NULL;
-               ModifierData *md = NULL;
-               Base *base = BKE_collection_or_layer_objects(depsgraph, NULL, 
NULL, surface->brush_group);
+               unsigned int numobjects;
+               Object **objects = BKE_collision_objects_create(depsgraph, 
NULL, surface->brush_group, &numobjects, eModifierType_DynamicPaint);
 
                /* backup current scene frame */
                int scene_frame = scene->r.cfra;
                float scene_subframe = scene->r.subframe;
 
-               while (base) {
-                       brushObj = NULL;
-                       /* select object */
-                       brushObj = base->object;
-
-                       /* next item */
-                       base = base->next;
-
-                       if (!brushObj) {
-                               /* skip item */
-                               continue;
-                       }
+               for (int i = 0; i < numobjects; i++) {
+                       Object *brushObj = objects[i];
 
                        /* check if target has an active dp modifier    */
-                       md = modifiers_findByType(brushObj, 
eModifierType_DynamicPaint);
+                       ModifierData *md = modifiers_findByType(brushObj, 
eModifierType_DynamicPaint);
                        if (md && md->mode & (eModifierMode_Realtime | 
eModifierMode_Render)) {
                                DynamicPaintModifierData *pmd2 = 
(DynamicPaintModifierData *)md;
                                /* make sure we're dealing with a brush */
@@ -5995,6 +5976,8 @@ static int dynamicPaint_doStep(
                                }
                        }
                }
+
+               BKE_collision_objects_free(objects);
        }
 
        /* surfaces operations that use adjacency data */
diff --git a/source/blender/blenkernel/intern/effect.c 
b/source/blender/blenkernel/intern/effect.c
index a3a766b2d1d..bb4cf1c5753 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -228,7 +228,7 @@ ListBase *BKE_effector_relations_create(
         ViewLayer *view_layer,
         Collection *collection)
 {
-       Base *base = BKE_collection_or_layer_objects(NULL, NULL, view_layer, 
collection);
+       Base *base = BKE_collection_or_layer_objects(view_layer, collection);
        const bool for_render = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
        const int base_flag = (for_render) ? BASE_ENABLED_RENDER : 
BASE_ENABLED_VIEWPORT;
 
diff --git a/source/blender/blenkernel/intern/softbody.c 
b/source/blender/blenkernel/intern/softbody.c
index 7a8dbeed031..49280821667 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -72,6 +72,7 @@ variables on the UI for now
 #include "BLI_threads.h"
 
 #include "BKE_collection.h"
+#include "BKE_collision.h"
 #include "BKE_curve.h"
 #include "BKE_effect.h"
 #include "BKE_global.h"
@@ -521,20 +522,18 @@ static void ccd_build_deflector_hash(Depsgraph 
*depsgraph, Collection *collectio
 {
        if (!hash) return;
 
-       /* Explicit collision collection. */
-       Base *base = BKE_collection_or_layer_objects(depsgraph, NULL, NULL, 
collection);
+       unsigned int numobjects;
+       Object **objects = BKE_collision_objects_create(depsgraph, vertexowner, 
collection, &numobjects, eModifierType_Collision);
 
-       for (; base; base = base->next) {
-               /* Only proceed for mesh object in same layer. */
-               if (base->object->type == OB_MESH) {
-                       Object *ob = base->object;
-                       if (ob == vertexowner) {
-                               /* If vertexowner is given  we don't want to 
check collision with owner object. */
-                               continue;
-                       }
+       for (int i = 0; i < numobjects; i++) {
+               Object *ob = objects[i];
+
+               if (ob->type == OB_MESH) {
                        ccd_build_deflector_hash_single(hash, ob);
                }
        }
+
+       BKE_collision_objects_free(objects);
 }
 
 static void ccd_update_deflector_hash_single(GHash *hash, Object *ob)
@@ -554,23 +553,19 @@ static void ccd_update_deflector_hash(Depsgraph 
*depsgraph, Collection *collecti
 {
        if ((!hash) || (!vertexowner)) return;
 
-       /* Explicit collision collection. */
-       Base *base = BKE_collection_or_layer_objects(depsgraph, NULL, NULL, 
collection);
+       unsigned int numobjects;
+       Object **objects = BKE_collision_objects_create(depsgraph, vertexowner, 
collection, &numobjects, eModifierType_Collision);
 
-       for (; base; base = base->next) {
-               /* Only proceed for mesh object in same layer. */
-               if (base->object->type == OB_MESH) {
-                       Object *ob = base->object;
-                       if (ob == vertexowner) {
-                               /* If vertexowner is given  we don't want to 
check collision with owner object. */
-                               continue;
-                       }
+       for (int i = 0; i < numobjects; i++) {
+               Object *ob = objects[i];
 
+               if (ob->type == OB_MESH) {
                        ccd_update_deflector_hash_single(h

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to