diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2016-04-20 17:45:29 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2016-04-20 17:45:29 +0300 |
commit | aae0598aa233d43d0ffc81a070b2ce20d6871c1d (patch) | |
tree | 378100f45cf1db972c671a6886496a5604f7ab29 /source/blender/modifiers/intern/MOD_uvwarp.c | |
parent | 95d7d3c2a6aa91f1dcb33ff0cdfc751e2886d8cd (diff) | |
parent | d7e4f920fd93a4ae5679e0eb6b228a349ab3b082 (diff) |
Merge branch 'master' into temp_depsgraph_split_ubereval
Diffstat (limited to 'source/blender/modifiers/intern/MOD_uvwarp.c')
-rw-r--r-- | source/blender/modifiers/intern/MOD_uvwarp.c | 87 |
1 files changed, 54 insertions, 33 deletions
diff --git a/source/blender/modifiers/intern/MOD_uvwarp.c b/source/blender/modifiers/intern/MOD_uvwarp.c index 3c4ca66485d..89994c3ae22 100644 --- a/source/blender/modifiers/intern/MOD_uvwarp.c +++ b/source/blender/modifiers/intern/MOD_uvwarp.c @@ -31,11 +31,13 @@ #include "DNA_object_types.h" #include "BLI_math.h" +#include "BLI_task.h" #include "BLI_utildefines.h" #include "BKE_action.h" /* BKE_pose_channel_find_name */ #include "BKE_cdderivedmesh.h" #include "BKE_deform.h" +#include "BKE_library_query.h" #include "BKE_modifier.h" #include "depsgraph_private.h" @@ -97,16 +99,58 @@ static void matrix_from_obj_pchan(float mat[4][4], Object *ob, const char *bonen } } -#ifdef _OPENMP -# define OMP_LIMIT 1000 -#endif +typedef struct UVWarpData { + MPoly *mpoly; + MLoop *mloop; + MLoopUV *mloopuv; + + MDeformVert *dvert; + int defgrp_index; + + float (*warp_mat)[4]; + int axis_u; + int axis_v; +} UVWarpData; + +static void uv_warp_compute(void *userdata, const int i) +{ + const UVWarpData *data = userdata; + + const MPoly *mp = &data->mpoly[i]; + const MLoop *ml = &data->mloop[mp->loopstart]; + MLoopUV *mluv = &data->mloopuv[mp->loopstart]; + + const MDeformVert *dvert = data->dvert; + const int defgrp_index = data->defgrp_index; + + float (*warp_mat)[4] = data->warp_mat; + const int axis_u = data->axis_u; + const int axis_v = data->axis_v; + + int l; + + if (dvert) { + for (l = 0; l < mp->totloop; l++, ml++, mluv++) { + float uv[2]; + const float weight = defvert_find_weight(&dvert[ml->v], defgrp_index); + + uv_warp_from_mat4_pair(uv, mluv->uv, warp_mat, axis_u, axis_v); + interp_v2_v2v2(mluv->uv, mluv->uv, uv, weight); + } + } + else { + for (l = 0; l < mp->totloop; l++, ml++, mluv++) { + uv_warp_from_mat4_pair(mluv->uv, mluv->uv, warp_mat, axis_u, axis_v); + } + } +} static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, ModifierApplyFlag UNUSED(flag)) { UVWarpModifierData *umd = (UVWarpModifierData *) md; - int i, numPolys, numLoops; + int numPolys, numLoops; MPoly *mpoly; MLoop *mloop; MLoopUV *mloopuv; @@ -163,33 +207,10 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, mloopuv = CustomData_duplicate_referenced_layer_named(&dm->loopData, CD_MLOOPUV, uvname, numLoops); modifier_get_vgroup(ob, dm, umd->vgroup_name, &dvert, &defgrp_index); - if (dvert) { -#pragma omp parallel for if (numPolys > OMP_LIMIT) - for (i = 0; i < numPolys; i++) { - float uv[2]; - MPoly *mp = &mpoly[i]; - MLoop *ml = &mloop[mp->loopstart]; - MLoopUV *mluv = &mloopuv[mp->loopstart]; - int l; - for (l = 0; l < mp->totloop; l++, ml++, mluv++) { - const float weight = defvert_find_weight(&dvert[ml->v], defgrp_index); - uv_warp_from_mat4_pair(uv, mluv->uv, warp_mat, axis_u, axis_v); - interp_v2_v2v2(mluv->uv, mluv->uv, uv, weight); - } - } - } - else { -#pragma omp parallel for if (numPolys > OMP_LIMIT) - for (i = 0; i < numPolys; i++) { - MPoly *mp = &mpoly[i]; - // MLoop *ml = &mloop[mp->loopstart]; - MLoopUV *mluv = &mloopuv[mp->loopstart]; - int l; - for (l = 0; l < mp->totloop; l++, /* ml++, */ mluv++) { - uv_warp_from_mat4_pair(mluv->uv, mluv->uv, warp_mat, axis_u, axis_v); - } - } - } + UVWarpData data = {.mpoly = mpoly, .mloop = mloop, .mloopuv = mloopuv, + .dvert = dvert, .defgrp_index = defgrp_index, + .warp_mat = warp_mat, .axis_u = axis_u, .axis_v = axis_v}; + BLI_task_parallel_range(0, numPolys, &data, uv_warp_compute, numPolys > 1000); dm->dirty |= DM_DIRTY_TESS_CDLAYERS; @@ -200,8 +221,8 @@ static void foreachObjectLink(ModifierData *md, Object *ob, ObjectWalkFunc walk, { UVWarpModifierData *umd = (UVWarpModifierData *) md; - walk(userData, ob, &umd->object_dst); - walk(userData, ob, &umd->object_src); + walk(userData, ob, &umd->object_dst, IDWALK_NOP); + walk(userData, ob, &umd->object_src, IDWALK_NOP); } static void uv_warp_deps_object_bone(DagForest *forest, DagNode *obNode, |