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:
authorCampbell Barton <ideasman42@gmail.com>2017-05-24 15:33:21 +0300
committerCampbell Barton <ideasman42@gmail.com>2017-05-24 15:39:50 +0300
commit429f6bee2845489a82983b54b6d63cc260a76387 (patch)
tree9e882a12cf9469c60a84135f5be59442d8fdb871 /source/blender/draw
parenta6c60affffc99270e94a123092d8b9c0942cccaa (diff)
Fix T51561: Normal maps fail w/ quad + eevee
Generalize derived-mesh tangent calculation so it can be used by Batch cache creation too.
Diffstat (limited to 'source/blender/draw')
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c48
1 files changed, 38 insertions, 10 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 27580958504..62be8bab7ce 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -45,6 +45,7 @@
#include "BKE_editmesh.h"
#include "BKE_editmesh_tangent.h"
#include "BKE_mesh.h"
+#include "BKE_mesh_tangent.h"
#include "BKE_texture.h"
#include "bmesh.h"
@@ -497,18 +498,45 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
}
else {
#undef me
- if (!CustomData_has_layer(cd_ldata, CD_NORMAL)) {
- BKE_mesh_calc_normals_split(me);
- }
- float (*loopnors)[3] = CustomData_get_layer(cd_ldata, CD_NORMAL);
+ if (!CustomData_has_layer(&rdata->cd.output.ldata, CD_MLOOPTANGENT)) {
+ if (!CustomData_has_layer(cd_ldata, CD_NORMAL)) {
+ BKE_mesh_calc_normals_split(me);
+ }
+
+ bool calc_active_tangent = false;
+ const float (*poly_normals)[3] = rdata->poly_normals;
+ const float (*loop_normals)[3] = CustomData_get_layer(cd_ldata, CD_NORMAL);
+ char tangent_names[MAX_MTFACE][MAX_NAME];
+ int tangent_names_len = 0;
+ for (tangent_names_len = 0; tangent_names_len < rdata->cd.layers.uv_len; tangent_names_len++) {
+ BLI_strncpy(
+ tangent_names[tangent_names_len],
+ CustomData_get_layer_name(cd_ldata, CD_MLOOPUV, tangent_names_len), MAX_NAME);
+ }
+
+ BKE_mesh_calc_loop_tangent_ex(
+ me->mvert,
+ me->mpoly, me->totpoly,
+ me->mloop,
+ rdata->mlooptri, rdata->tri_len,
+ cd_ldata,
+ calc_active_tangent,
+ tangent_names, tangent_names_len,
+ poly_normals, loop_normals,
+ rdata->orco,
+ &rdata->cd.output.ldata, me->totloop,
+ &rdata->cd.output.tangent_mask);
- rdata->cd.layers.tangent[i] = CustomData_add_layer(
- cd_ldata, CD_MLOOPTANGENT, CD_CALLOC, NULL, me->totloop);
- CustomData_set_layer_flag(cd_ldata, CD_MLOOPTANGENT, CD_FLAG_TEMPORARY);
+ /* If we store tangents in the mesh, set temporary. */
+#if 0
+ CustomData_set_layer_flag(cd_ldata, CD_MLOOPTANGENT, CD_FLAG_TEMPORARY);
+#endif
+ }
+
+ rdata->cd.layers.tangent[i] = CustomData_get_layer_n(&rdata->cd.output.ldata, CD_TANGENT, i);
+ BLI_assert(rdata->cd.layers.tangent[i] != NULL);
- BKE_mesh_loop_tangents_ex(me->mvert, me->totvert, me->mloop, rdata->cd.layers.tangent[i],
- loopnors, rdata->cd.layers.uv[i], me->totloop, me->mpoly, me->totpoly, NULL);
#define me DONT_USE_THIS
#ifdef me /* quiet warning */
#endif
@@ -526,7 +554,7 @@ static MeshRenderData *mesh_render_data_create(Mesh *me, const int types)
#undef me
}
- return rdata;
+ return rdata;
}
static void mesh_render_data_free(MeshRenderData *rdata)