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:
authorLukas Tönne <lukas.toenne@gmail.com>2015-05-22 18:25:48 +0300
committerLukas Tönne <lukas.toenne@gmail.com>2015-05-22 18:25:48 +0300
commit7125b76c9a0a1cf126e44850e7c4802bc0e3e37a (patch)
treed767a50c3070937ad4151541a9181147590bba03 /source/blender/blenkernel
parentbd027416c4ccfa8aee2054381de0b3fbff116b27 (diff)
Take transformation of the duplicator object into accound for hair
cutting. When using a dupli object from the same group as a target it is sufficient to calculate the relative transform in the shared duplicator local space. When using an external object though we have to transform into world space first.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/cache_library.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c
index 411ed78dafa..2188023cd48 100644
--- a/source/blender/blenkernel/intern/cache_library.c
+++ b/source/blender/blenkernel/intern/cache_library.c
@@ -1960,12 +1960,19 @@ static void haircut_process(HaircutCacheModifier *hmd, CacheProcessContext *ctx,
if (dob->ob != ob)
continue;
- /* instances are calculated relative to the strands object */
- invert_m4_m4(mat, dob->mat);
-
memset(&haircut, 0, sizeof(haircut));
haircut_data_get_bvhtree(&haircut, target_dm, true);
- haircut_data_get_instances(&haircut, hmd->target, mat, dupli_target ? &data->dupcache->duplilist : NULL);
+ if (dupli_target) {
+ /* instances are calculated relative to the strands object */
+ invert_m4_m4(mat, dob->mat);
+ haircut_data_get_instances(&haircut, hmd->target, mat, &data->dupcache->duplilist);
+ }
+ else {
+ /* instances are calculated relative to the strands object */
+ mul_m4_m4m4(mat, data->mat, dob->mat);
+ invert_m4(mat);
+ haircut_data_get_instances(&haircut, hmd->target, mat, NULL);
+ }
haircut_apply(hmd, ctx, eval_mode, &haircut, parents, strands);