From 9e0c876aadd9641fa9e8d6d8717c757b8b528d8b Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Tue, 2 Feb 2021 12:54:38 +0100 Subject: Fix T85301: Eevee does not respect collection instance offset for hair This resulted in hair drawing with an offset if an instance_offset was set. note: Usually the instance_offset gets combined with the objects obmat in 'make_duplis_collection' / 'make_dupli', see > /* Combine collection offset and `obmat`. */ Using the resulting DupliObject->mat instead does include the instance_offset, but this results in double-transforms (something that I have not investigated further), so now reconstruct the correct matrix from scratch. Maniphest Tasks: T85301 Differential Revision: https://developer.blender.org/D10285 --- source/blender/draw/intern/draw_hair.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'source/blender/draw/intern') diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c index cc0aa09ed97..86f1b0e0ebb 100644 --- a/source/blender/draw/intern/draw_hair.c +++ b/source/blender/draw/intern/draw_hair.c @@ -28,6 +28,7 @@ #include "BLI_string_utils.h" #include "BLI_utildefines.h" +#include "DNA_collection_types.h" #include "DNA_customdata_types.h" #include "DNA_modifier_types.h" #include "DNA_particle_types.h" @@ -195,7 +196,12 @@ void DRW_hair_duplimat_get(Object *object, if (psys) { if ((dupli_parent != NULL) && (dupli_object != NULL)) { if (dupli_object->type & OB_DUPLICOLLECTION) { - copy_m4_m4(dupli_mat, dupli_parent->obmat); + unit_m4(dupli_mat); + Collection *collection = dupli_parent->instance_collection; + if (collection != NULL) { + sub_v3_v3(dupli_mat[3], collection->instance_offset); + } + mul_m4_m4m4(dupli_mat, dupli_parent->obmat, dupli_mat); } else { copy_m4_m4(dupli_mat, dupli_object->ob->obmat); -- cgit v1.2.3