[Bf-blender-cvs] [9e0c876aadd] blender-v2.92-release: Fix T85301: Eevee does not respect collection instance offset for hair

Philipp Oeser noreply at git.blender.org
Tue Feb 2 15:34:03 CET 2021


Commit: 9e0c876aadd9641fa9e8d6d8717c757b8b528d8b
Author: Philipp Oeser
Date:   Tue Feb 2 12:54:38 2021 +0100
Branches: blender-v2.92-release
https://developer.blender.org/rB9e0c876aadd9641fa9e8d6d8717c757b8b528d8b

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

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

M	source/blender/draw/engines/overlay/overlay_wireframe.c
M	source/blender/draw/intern/draw_hair.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 617dda56421..7ba5fb3a426 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -20,6 +20,7 @@
  * \ingroup draw_engine
  */
 
+#include "DNA_collection_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_particle_types.h"
 #include "DNA_view3d_types.h"
@@ -141,7 +142,12 @@ static void wireframe_hair_cache_populate(OVERLAY_Data *vedata, Object *ob, Part
   float dupli_mat[4][4];
   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);
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);



More information about the Bf-blender-cvs mailing list