diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2015-05-22 13:30:55 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2015-05-22 13:30:55 +0300 |
commit | 89f17783285be016b36255368c618ed80ec42235 (patch) | |
tree | 83b0c51fc50a5df99198f75163bb4fad4028fcd3 /source/blender/blenkernel | |
parent | 3b089c1b904a2a534b008ca11e89277b1127e473 (diff) |
Option for the haircut cache modifier to either use a scene object or
an "internal" object from the group.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/cache_library.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/cache_library.c b/source/blender/blenkernel/intern/cache_library.c index d934c9da9a1..07b24a52879 100644 --- a/source/blender/blenkernel/intern/cache_library.c +++ b/source/blender/blenkernel/intern/cache_library.c @@ -1793,20 +1793,29 @@ static void haircut_apply(HaircutCacheModifier *hmd, HaircutCacheData *data, Str } } -static void haircut_process(HaircutCacheModifier *hmd, CacheProcessContext *UNUSED(ctx), CacheProcessData *data, int UNUSED(frame), int UNUSED(frame_prev), eCacheLibrary_EvalMode UNUSED(eval_mode)) +static void haircut_process(HaircutCacheModifier *hmd, CacheProcessContext *ctx, CacheProcessData *data, int UNUSED(frame), int UNUSED(frame_prev), eCacheLibrary_EvalMode UNUSED(eval_mode)) { Object *ob = hmd->object; DupliObject *dob; Strands *strands; - DupliObjectData *target_data; + DerivedMesh *target_dm; float mat[4][4]; HaircutCacheData shrinkwrap; if (!BKE_cache_modifier_find_strands(data->dupcache, ob, hmd->hair_system, NULL, &strands, NULL)) return; - if (!BKE_cache_modifier_find_object(data->dupcache, hmd->target, &target_data)) - return; + if (hmd->flag & eHaircutCacheModifier_Flag_InternalTarget) { + DupliObjectData *target_data; + if (!BKE_cache_modifier_find_object(data->dupcache, hmd->target, &target_data)) + return; + target_dm = target_data->dm; + } + else { + if (!hmd->target) + return; + target_dm = mesh_get_derived_final(ctx->scene, hmd->target, CD_MASK_BAREMESH); + } for (dob = data->dupcache->duplilist.first; dob; dob = dob->next) { if (dob->ob != ob) @@ -1816,7 +1825,7 @@ static void haircut_process(HaircutCacheModifier *hmd, CacheProcessContext *UNUS invert_m4_m4(mat, dob->mat); memset(&shrinkwrap, 0, sizeof(shrinkwrap)); - haircut_data_get_bvhtree(&shrinkwrap, target_data->dm, true); + haircut_data_get_bvhtree(&shrinkwrap, target_dm, true); haircut_data_get_instances(&shrinkwrap, hmd->target, mat, &data->dupcache->duplilist); haircut_apply(hmd, &shrinkwrap, strands); |