From 5249a813f22f4eb8680666d4a2512acfd1e384be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 5 Aug 2020 22:12:47 +0200 Subject: Fix T78954 EEVEE: Motion Blur: Bug with hair particles on linked objects The cache key for particle system was the original Object data. But this is incorrect for particle systems as modifiers are not shared. --- source/blender/draw/engines/eevee/eevee_data.c | 39 +++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'source/blender/draw/engines/eevee/eevee_data.c') diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c index 87948f403a0..914c869fc91 100644 --- a/source/blender/draw/engines/eevee/eevee_data.c +++ b/source/blender/draw/engines/eevee/eevee_data.c @@ -28,6 +28,7 @@ #include "BLI_memblock.h" #include "BKE_duplilist.h" +#include "BKE_modifier.h" #include "DEG_depsgraph_query.h" @@ -147,28 +148,46 @@ EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData * return ob_step; } -EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb, - Object *ob, - bool hair) +static EEVEE_GeometryMotionData *motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb, + void *key, + bool hair) { if (mb->geom == NULL) { return NULL; } - - /* Use original data as key to ensure matching accross update. */ - Object *ob_orig = DEG_get_original_object(ob); - - void *key = (char *)ob_orig->data + hair; + key = (char *)key + (int)hair; EEVEE_GeometryMotionData *geom_step = BLI_ghash_lookup(mb->geom, key); if (geom_step == NULL) { geom_step = MEM_callocN(sizeof(EEVEE_GeometryMotionData), __func__); - geom_step->type = (hair) ? EEVEE_HAIR_GEOM_MOTION_DATA : EEVEE_MESH_GEOM_MOTION_DATA; + geom_step->type = hair ? EEVEE_HAIR_GEOM_MOTION_DATA : EEVEE_MESH_GEOM_MOTION_DATA; BLI_ghash_insert(mb->geom, key, geom_step); } - return geom_step; } +EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb, Object *ob) +{ + /* Use original data as key to ensure matching accross update. */ + return motion_blur_geometry_data_get(mb, DEG_get_original_object(ob)->data, false); +} + +EEVEE_GeometryMotionData *EEVEE_motion_blur_hair_data_get(EEVEE_MotionBlurData *mb, + Object *ob, + ModifierData *md) +{ + void *key; + if (md) { + /* Particle system. */ + key = BKE_modifier_get_original(md); + } + else { + /* Hair object. */ + key = DEG_get_original_object(ob)->data; + } + + return motion_blur_geometry_data_get(mb, DEG_get_original_object(ob), true); +} + /* View Layer data. */ void EEVEE_view_layer_data_free(void *storage) -- cgit v1.2.3