diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2015-05-22 18:25:48 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-05-22 18:25:48 +0300 |
commit | 7125b76c9a0a1cf126e44850e7c4802bc0e3e37a (patch) | |
tree | d767a50c3070937ad4151541a9181147590bba03 /source/blender/blenkernel | |
parent | bd027416c4ccfa8aee2054381de0b3fbff116b27 (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.c | 15 |
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); |