Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-06-25 15:21:15 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-06-25 18:15:07 +0300
commitc2110213ca7a6b8ba2392cf6e8f5a61b7ba4b554 (patch)
treedfdf68849767fc5f04dda17b0b8db5c97b3e7e07 /source/blender/blenkernel/intern/dynamicpaint.c
parent2c9b32949bc00e73603bcabadb74e5b3176a161a (diff)
Physics: update softbody and dynamic paint to get colliders from depsgraph.
Because looping over the scene is unsafe and slow.
Diffstat (limited to 'source/blender/blenkernel/intern/dynamicpaint.c')
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c51
1 files changed, 17 insertions, 34 deletions
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 */