Commit: 735ad525a6e72a7a52bf4e81ca03a7b1c435a857
Author: Clément Foucault
Date:   Sat Nov 17 14:52:03 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB735ad525a6e72a7a52bf4e81ca03a7b1c435a857

Fix T53750: Mirrored UV have bad tangent space

I feel silly because it was my fault all along! (see the WATCH IT warning)

===================================================================

M       source/blender/draw/intern/draw_cache_impl_mesh.c

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c 
b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 4615810e31d..a24702368de 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2418,7 +2418,6 @@ void DRW_mesh_batch_cache_free(Mesh *me)
 static GPUVertBuf *mesh_batch_cache_get_tri_shading_data(MeshRenderData 
*rdata, MeshBatchCache *cache)
 {
        BLI_assert(rdata->types & (MR_DATATYPE_VERT | MR_DATATYPE_LOOPTRI | 
MR_DATATYPE_LOOP | MR_DATATYPE_POLY));
-#define USE_COMP_MESH_DATA
 
        if (cache->shaded_triangles_data == NULL) {
                const uint uv_len = rdata->cd.layers.uv_len;
@@ -2466,6 +2465,8 @@ static GPUVertBuf 
*mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
                cache->auto_layer_names = MEM_callocN(auto_names_len * 
sizeof(char), "Auto layer name buf");
                cache->auto_layer_is_srgb = MEM_mallocN(cache->auto_layer_len * 
sizeof(int), "Auto layer value buf");
 
+#define USE_COMP_MESH_DATA
+
                for (uint i = 0; i < uv_len; i++) {
                        /* UV */
                        const char *attrib_name = 
mesh_render_data_uv_layer_uuid_get(rdata, i);
@@ -2491,13 +2492,11 @@ static GPUVertBuf 
*mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
 
                for (uint i = 0; i < tangent_len; i++) {
                        const char *attrib_name = 
mesh_render_data_tangent_layer_uuid_get(rdata, i);
-                       /* WATCH IT : only specifying 3 component instead of 4 
(4th is sign).
-                        * That may cause some problem but I could not make it 
to fail (fclem) */
 #ifdef USE_COMP_MESH_DATA
                        /* Tangents need more precision than 10_10_10 */
-                       tangent_id[i] = GPU_vertformat_attr_add(format, 
attrib_name, GPU_COMP_I16, 3, GPU_FETCH_INT_TO_FLOAT_UNIT);
+                       tangent_id[i] = GPU_vertformat_attr_add(format, 
attrib_name, GPU_COMP_I16, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
 #else
-                       tangent_id[i] = GPU_vertformat_attr_add(format, 
attrib_name, GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+                       tangent_id[i] = GPU_vertformat_attr_add(format, 
attrib_name, GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
 #endif
 
                        if (i == rdata->cd.layers.tangent_active) {
@@ -2576,7 +2575,11 @@ static GPUVertBuf 
*mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
                                        float (*layer_data)[4] = 
rdata->cd.layers.tangent[j];
                                        for (uint t = 0; t < 3; t++) {
                                                const float *elem = 
layer_data[BM_elem_index_get(bm_looptri[t])];
-                                               
normal_float_to_short_v3(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
+#ifdef USE_COMP_MESH_DATA
+                                               
normal_float_to_short_v4(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
+#else
+                                               
copy_v4_v4(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
+#endif
                                        }
                                }
                                /* VCOLs */
@@ -2607,9 +2610,9 @@ static GPUVertBuf 
*mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata,
                                        for (uint t = 0; t < 3; t++) {
                                                const float *elem = 
layer_data[mlt->tri[t]];
 #ifdef USE_COMP_MESH_DATA
-                                               
normal_float_to_short_v3(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
+                                               
normal_float_to_short_v4(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
 #else
-                                               
copy_v3_v3(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
+                                               
copy_v4_v4(GPU_vertbuf_raw_step(&tangent_step[j]), elem);
 #endif
                                        }
                                }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to