From 3143ec29d0577948f2f7750c47a6a84ab33f39d7 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sun, 14 Feb 2016 01:54:09 +0100 Subject: Fix T45606: cycles multires tangent space normal map bake issues. --- source/blender/editors/object/object_bake_api.c | 17 +++++++++++++++++ source/blender/render/intern/source/bake_api.c | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index 51affb3e1fc..3c9b43b4278 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -647,6 +647,9 @@ static int bake( Mesh *me_low = NULL; Mesh *me_cage = NULL; + MultiresModifierData *mmd_low = NULL; + int mmd_flags_low = 0; + float *result = NULL; BakePixel *pixel_array_low = NULL; @@ -762,6 +765,17 @@ static int bake( pixel_array_high = MEM_mallocN(sizeof(BakePixel) * num_pixels, "bake pixels high poly"); result = MEM_callocN(sizeof(float) * depth * num_pixels, "bake return pixels"); + /* for multires bake, use linear UV subdivision to match low res UVs */ + if (pass_type == SCE_PASS_NORMAL && normal_space == R_BAKE_SPACE_TANGENT && !is_selected_to_active) + { + mmd_low = (MultiresModifierData *) modifiers_findByType(ob_low, eModifierType_Multires); + if (mmd_low) + { + mmd_flags_low = mmd_low->flags; + mmd_low->flags |= eMultiresModifierFlag_PlainUv; + } + } + /* get the mesh as it arrives in the renderer */ me_low = bake_mesh_new_from_object(bmain, scene, ob_low); @@ -1063,6 +1077,9 @@ cleanup: ob_low->restrictflag = restrict_flag_low; + if (mmd_low) + mmd_low->flags = mmd_flags_low; + if (ob_cage) ob_cage->restrictflag = restrict_flag_cage; diff --git a/source/blender/render/intern/source/bake_api.c b/source/blender/render/intern/source/bake_api.c index bac8df4e0b1..21460c701e6 100644 --- a/source/blender/render/intern/source/bake_api.c +++ b/source/blender/render/intern/source/bake_api.c @@ -792,7 +792,10 @@ void RE_bake_normal_world_to_tangent( offset = i * depth; if (primitive_id == -1) { - copy_v3_fl3(&result[offset], 0.5f, 0.5f, 1.0f); + if (depth == 4) + copy_v4_fl4(&result[offset], 0.5f, 0.5f, 1.0f, 1.0f); + else + copy_v3_fl3(&result[offset], 0.5f, 0.5f, 1.0f); continue; } -- cgit v1.2.3