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:
authorClément Foucault <foucault.clem@gmail.com>2020-08-05 23:12:47 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-08-05 23:12:53 +0300
commit5249a813f22f4eb8680666d4a2512acfd1e384be (patch)
treecd07495c2e0807484d1027a1d8c69de9f9db5154 /source/blender/draw/engines
parent315ae005c3e99541e7440ff57a2f624bf0461d6a (diff)
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.
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r--source/blender/draw/engines/eevee/eevee_data.c39
-rw-r--r--source/blender/draw/engines/eevee/eevee_motion_blur.c8
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h6
3 files changed, 37 insertions, 16 deletions
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)
diff --git a/source/blender/draw/engines/eevee/eevee_motion_blur.c b/source/blender/draw/engines/eevee/eevee_motion_blur.c
index 586ee780f1d..0d55d92ce6f 100644
--- a/source/blender/draw/engines/eevee/eevee_motion_blur.c
+++ b/source/blender/draw/engines/eevee/eevee_motion_blur.c
@@ -288,8 +288,8 @@ void EEVEE_motion_blur_hair_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata),
/* Store transform */
DRW_hair_duplimat_get(ob, psys, md, mb_data->obmat[mb_step]);
- EEVEE_GeometryMotionData *mb_geom = EEVEE_motion_blur_geometry_data_get(
- &effects->motion_blur, ob, true);
+ EEVEE_GeometryMotionData *mb_geom = EEVEE_motion_blur_hair_data_get(
+ &effects->motion_blur, ob, md);
if (mb_step == MB_CURR) {
/* Fill missing matrices if the object was hidden in previous or next frame. */
@@ -346,8 +346,8 @@ void EEVEE_motion_blur_cache_populate(EEVEE_ViewLayerData *UNUSED(sldata),
/* Store transform */
copy_m4_m4(mb_data->obmat[mb_step], ob->obmat);
- EEVEE_GeometryMotionData *mb_geom = EEVEE_motion_blur_geometry_data_get(
- &effects->motion_blur, ob, false);
+ EEVEE_GeometryMotionData *mb_geom = EEVEE_motion_blur_geometry_data_get(&effects->motion_blur,
+ ob);
if (mb_step == MB_CURR) {
GPUBatch *batch = DRW_cache_object_surface_get(ob);
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 51831e5506d..2f54c839d80 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -971,8 +971,10 @@ EEVEE_ObjectMotionData *EEVEE_motion_blur_object_data_get(EEVEE_MotionBlurData *
Object *ob,
bool hair);
EEVEE_GeometryMotionData *EEVEE_motion_blur_geometry_data_get(EEVEE_MotionBlurData *mb,
- Object *ob,
- bool hair);
+ Object *ob);
+EEVEE_GeometryMotionData *EEVEE_motion_blur_hair_data_get(EEVEE_MotionBlurData *mb,
+ Object *ob,
+ struct ModifierData *md);
EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_get(Object *ob);
EEVEE_LightProbeEngineData *EEVEE_lightprobe_data_ensure(Object *ob);
EEVEE_LightEngineData *EEVEE_light_data_get(Object *ob);