[Bf-blender-cvs] [1715c396e45] master: Fix T65534 Eevee don't respect active UVmap

Clément Foucault noreply at git.blender.org
Mon Jul 8 18:19:01 CEST 2019


Commit: 1715c396e450d41550e70c665211354c303a7275
Author: Clément Foucault
Date:   Mon Jul 8 13:35:55 2019 +0200
Branches: master
https://developer.blender.org/rB1715c396e450d41550e70c665211354c303a7275

Fix T65534 Eevee don't respect active UVmap

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

M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/intern/draw_cache_impl_mesh.c
M	source/blender/draw/intern/draw_cache_impl_particles.c
M	source/blender/draw/intern/draw_hair_private.h
M	source/blender/draw/modes/shaders/paint_vertex_vert.glsl
M	source/blender/gpu/GPU_vertex_format.h

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
index 7872c1380ed..7eb12dbdeb9 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -2,14 +2,14 @@
 #ifndef HAIR_SHADER
 in vec3 pos;
 in vec3 nor;
-in vec2 u; /* active texture layer */
+in vec2 au; /* active texture layer */
 #  ifdef V3D_SHADING_VERTEX_COLOR
-in vec3 c; /* active color */
+in vec3 ac; /* active color */
 #  endif
-#  define uv u
+#  define uv au
 #else /* HAIR_SHADER */
 #  ifdef V3D_SHADING_TEXTURE_COLOR
-uniform samplerBuffer u; /* active texture layer */
+uniform samplerBuffer au; /* active texture layer */
 #  endif
 flat out float hair_rand;
 #endif /* HAIR_SHADER */
@@ -58,7 +58,7 @@ void main()
 {
 #ifdef HAIR_SHADER
 #  ifdef V3D_SHADING_TEXTURE_COLOR
-  vec2 uv = hair_get_customdata_vec2(u);
+  vec2 uv = hair_get_customdata_vec2(au);
 #  endif
   float time, thick_time, thickness;
   vec3 world_pos, tan, binor;
@@ -86,7 +86,7 @@ void main()
 
 #ifdef V3D_SHADING_VERTEX_COLOR
 #  ifndef HAIR_SHADER
-  vertexColor = srgb_to_linear_attr(c);
+  vertexColor = srgb_to_linear_attr(ac);
 #  endif
 #endif
 
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index c70c0aac662..f23eb97698c 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -246,17 +246,21 @@ typedef struct MeshRenderData {
   struct {
     struct {
       MLoopUV **uv;
+      MLoopCol **vcol;
+      float (**tangent)[4];
+
       int uv_len;
       int uv_active;
+      int uv_render;
       int uv_mask_active;
 
-      MLoopCol **vcol;
       int vcol_len;
       int vcol_active;
+      int vcol_render;
 
-      float (**tangent)[4];
       int tangent_len;
       int tangent_active;
+      int tangent_render;
 
       bool *auto_vcol;
     } layers;
@@ -471,7 +475,7 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
           case CD_MTFACE: {
             if (layer == -1) {
               layer = (name[0] != '\0') ? CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
-                                          CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+                                          CustomData_get_render_layer(cd_ldata, CD_MLOOPUV);
             }
             if (layer != -1) {
               cd_used.uv |= (1 << layer);
@@ -481,11 +485,11 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
           case CD_TANGENT: {
             if (layer == -1) {
               layer = (name[0] != '\0') ? CustomData_get_named_layer(cd_ldata, CD_MLOOPUV, name) :
-                                          CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+                                          CustomData_get_render_layer(cd_ldata, CD_MLOOPUV);
 
               /* Only fallback to orco (below) when we have no UV layers, see: T56545 */
               if (layer == -1 && name[0] != '\0') {
-                layer = CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+                layer = CustomData_get_render_layer(cd_ldata, CD_MLOOPUV);
               }
             }
             if (layer != -1) {
@@ -501,7 +505,7 @@ static DRW_MeshCDMask mesh_cd_calc_used_gpu_layers(const Mesh *me,
           case CD_MCOL: {
             if (layer == -1) {
               layer = (name[0] != '\0') ? CustomData_get_named_layer(cd_ldata, CD_MLOOPCOL, name) :
-                                          CustomData_get_active_layer(cd_ldata, CD_MLOOPCOL);
+                                          CustomData_get_render_layer(cd_ldata, CD_MLOOPCOL);
             }
             if (layer != -1) {
               cd_used.vcol |= (1 << layer);
@@ -885,9 +889,12 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
     }
 
     rdata->cd.layers.uv_active = CustomData_get_active_layer(cd_ldata, CD_MLOOPUV);
+    rdata->cd.layers.uv_render = CustomData_get_render_layer(cd_ldata, CD_MLOOPUV);
     rdata->cd.layers.uv_mask_active = CustomData_get_stencil_layer(cd_ldata, CD_MLOOPUV);
     rdata->cd.layers.vcol_active = CustomData_get_active_layer(cd_ldata, CD_MLOOPCOL);
+    rdata->cd.layers.vcol_render = CustomData_get_render_layer(cd_ldata, CD_MLOOPCOL);
     rdata->cd.layers.tangent_active = rdata->cd.layers.uv_active;
+    rdata->cd.layers.tangent_render = rdata->cd.layers.uv_render;
 
 #define CD_VALIDATE_ACTIVE_LAYER(active_index, used) \
   if ((active_index != -1) && (used & (1 << active_index)) == 0) { \
@@ -896,9 +903,12 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
   ((void)0)
 
     CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.uv_active, cd_used->uv);
+    CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.uv_render, cd_used->uv);
     CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.uv_mask_active, cd_used->uv);
     CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.tangent_active, cd_used->tan);
+    CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.tangent_render, cd_used->tan);
     CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.vcol_active, cd_used->vcol);
+    CD_VALIDATE_ACTIVE_LAYER(rdata->cd.layers.vcol_render, cd_used->vcol);
 
 #undef CD_VALIDATE_ACTIVE_LAYER
 
@@ -982,6 +992,7 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
      * NOTE 2 : Replicate changes to code_generate_vertex_new() in gpu_codegen.c */
     if (rdata->cd.layers.vcol_len != 0) {
       int act_vcol = rdata->cd.layers.vcol_active;
+      int ren_vcol = rdata->cd.layers.vcol_render;
       for (int i_src = 0, i_dst = 0; i_src < cd_layers_src.vcol_len; i_src++, i_dst++) {
         if ((cd_used->vcol & (1 << i_src)) == 0) {
           /* This is a non-used VCol slot. Skip. */
@@ -989,6 +1000,9 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
           if (rdata->cd.layers.vcol_active >= i_src) {
             act_vcol--;
           }
+          if (rdata->cd.layers.vcol_render >= i_src) {
+            ren_vcol--;
+          }
         }
         else {
           const char *name = CustomData_get_layer_name(cd_ldata, CD_MLOOPCOL, i_src);
@@ -1011,10 +1025,13 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
           }
         }
       }
+      /* Actual active Vcol slot inside vcol layers used for shading. */
       if (rdata->cd.layers.vcol_active != -1) {
-        /* Actual active Vcol slot inside vcol layers used for shading. */
         rdata->cd.layers.vcol_active = act_vcol;
       }
+      if (rdata->cd.layers.vcol_render != -1) {
+        rdata->cd.layers.vcol_render = ren_vcol;
+      }
     }
 
     /* Start Fresh */
@@ -1022,11 +1039,15 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
     CustomData_free_layers(cd_ldata, CD_MLOOPTANGENT, rdata->loop_len);
 
     if (rdata->cd.layers.uv_len != 0) {
+      int ren_uv = rdata->cd.layers.uv_render;
       int act_uv = rdata->cd.layers.uv_active;
       for (int i_src = 0, i_dst = 0; i_src < cd_layers_src.uv_len; i_src++, i_dst++) {
         if ((cd_used->uv & (1 << i_src)) == 0) {
           /* This is a non-used UV slot. Skip. */
           i_dst--;
+          if (rdata->cd.layers.uv_render >= i_src) {
+            ren_uv--;
+          }
           if (rdata->cd.layers.uv_active >= i_src) {
             act_uv--;
           }
@@ -1045,8 +1066,11 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
               rdata->cd.uuid.auto_mix[i_dst], sizeof(*rdata->cd.uuid.auto_mix), "a%u", hash);
         }
       }
+      /* Actual active / Render UV slot inside uv layers used for shading. */
+      if (rdata->cd.layers.uv_render != -1) {
+        rdata->cd.layers.uv_render = ren_uv;
+      }
       if (rdata->cd.layers.uv_active != -1) {
-        /* Actual active UV slot inside uv layers used for shading. */
         rdata->cd.layers.uv_active = act_uv;
       }
     }
@@ -1145,9 +1169,13 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
 
       int i_dst = 0;
       int act_tan = rdata->cd.layers.tangent_active;
+      int ren_tan = rdata->cd.layers.tangent_render;
       for (int i_src = 0; i_src < cd_layers_src.uv_len; i_src++, i_dst++) {
         if ((cd_used->tan & (1 << i_src)) == 0) {
           i_dst--;
+          if (rdata->cd.layers.tangent_render >= i_src) {
+            ren_tan--;
+          }
           if (rdata->cd.layers.tangent_active >= i_src) {
             act_tan--;
           }
@@ -1173,10 +1201,13 @@ static MeshRenderData *mesh_render_data_create_ex(Mesh *me,
           }
         }
       }
+      /* Actual active rangent slot inside uv layers used for shading. */
       if (rdata->cd.layers.tangent_active != -1) {
-        /* Actual active UV slot inside uv layers used for shading. */
         rdata->cd.layers.tangent_active = act_tan;
       }
+      if (rdata->cd.layers.tangent_render != -1) {
+        rdata->cd.layers.tangent_render = ren_tan;
+      }
 
       if (cd_used->tan_orco != 0) {
         const char *name = CustomData_get_layer_name(&rdata->cd.output.ldata, CD_TANGENT, i_dst);
@@ -3258,9 +3289,12 @@ static void mesh_create_loop_uv_and_tan(MeshRenderData *rdata, GPUVertBuf *vbo)
     attr_name = mesh_render_data_uv_auto_layer_uuid_get(rdata, i);
     GPU_vertformat_alias_add(&format, attr_name);
 
-    if (i == rdata->cd.layers.uv_active) {
+    if (i == rdata->cd.layers.uv_render) {
       GPU_vertformat_alias_add(&format, "u");
     }
+    if (i == rdata->cd.layers.uv_active) {
+      GPU_vertformat_alias_add(&format, "au");
+    }
     if (i == rdata->cd.layers.uv_mask_active) {
       GPU_vertformat_alias_add(&format, "mu");
     }
@@ -3274,9 +3308,12 @@ static void mesh_create_loop_uv_and_tan(MeshRenderData *rdata, GPUVertBuf *vbo)
 #else
     tangent_id[i] = GPU_vertformat_attr_add(&format, attr_name, GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
 #endif
-    if (i == rdata->cd.layers.tangent_active) {
+    if (i == rdata->cd.layers.tangent_render) {
       GPU_vertformat_alias_add(&format, "t");
     }
+    if (i == rdata->cd.layers.tangent_active) {
+      GPU_vertformat_alias_add(&f

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list