[Bf-blender-cvs] [c9537ee5c3f] master: Overlay: Remove use of NormalMatrix

Clément Foucault noreply at git.blender.org
Wed May 8 23:31:00 CEST 2019


Commit: c9537ee5c3f58105f553a32f337f7c5d1be8b1a4
Author: Clément Foucault
Date:   Wed May 8 23:13:09 2019 +0200
Branches: master
https://developer.blender.org/rBc9537ee5c3f58105f553a32f337f7c5d1be8b1a4

Overlay: Remove use of NormalMatrix

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

M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
M	source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
M	source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
M	source/blender/draw/modes/shaders/edit_normals_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index e832b8bc742..76fca6fc72d 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -233,6 +233,7 @@ extern char datatoc_armature_stick_frag_glsl[];
 extern char datatoc_armature_dof_vert_glsl[];
 
 extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
 
 extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
@@ -826,8 +827,14 @@ DRWShadingGroup *shgroup_instance_bone_shape_outline(DRWPass *pass,
   if (sh_data->shape_outline == NULL) {
     const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg];
     sh_data->shape_outline = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_armature_shape_outline_vert_glsl, NULL},
-        .geom = (const char *[]){sh_cfg_data->lib, datatoc_armature_shape_outline_geom_glsl, NULL},
+        .vert = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_armature_shape_outline_vert_glsl,
+                                 NULL},
+        .geom = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_armature_shape_outline_geom_glsl,
+                                 NULL},
         .frag = (const char *[]){datatoc_gpu_shader_flat_color_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, NULL},
     });
@@ -857,7 +864,10 @@ DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass,
   if (sh_data->shape_solid == NULL) {
     const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[sh_cfg];
     sh_data->shape_solid = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_armature_shape_solid_vert_glsl, NULL},
+        .vert = (const char *[]){sh_cfg_data->lib,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_armature_shape_solid_vert_glsl,
+                                 NULL},
         .frag = (const char *[]){datatoc_armature_shape_solid_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, NULL},
     });
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index ffe7fe5845c..655b0428743 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -60,6 +60,7 @@ extern char datatoc_edit_mesh_overlay_mesh_analysis_vert_glsl[];
 extern char datatoc_edit_normals_vert_glsl[];
 extern char datatoc_edit_normals_geom_glsl[];
 extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
 
 extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
 extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
@@ -207,6 +208,7 @@ static void EDIT_MESH_engine_init(void *vedata)
 
     char *lib = BLI_string_joinN(sh_cfg_data->lib,
                                  datatoc_common_globals_lib_glsl,
+                                 datatoc_common_view_lib_glsl,
                                  datatoc_edit_mesh_overlay_common_lib_glsl);
     /* Use geometry shader to draw edge wireframe. This ensure us
      * the same result accross platforms and more flexibility. But
@@ -265,27 +267,31 @@ static void EDIT_MESH_engine_init(void *vedata)
     sh_data->overlay_mix = DRW_shader_create_fullscreen(datatoc_edit_mesh_overlay_mix_frag_glsl,
                                                         NULL);
 
+    lib = BLI_string_joinN(sh_cfg_data->lib, datatoc_common_view_lib_glsl);
+
     sh_data->normals_face = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_vert_glsl, NULL},
-        .geom = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_geom_glsl, NULL},
+        .vert = (const char *[]){lib, datatoc_edit_normals_vert_glsl, NULL},
+        .geom = (const char *[]){lib, datatoc_edit_normals_geom_glsl, NULL},
         .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, "#define FACE_NORMALS\n", NULL},
     });
 
     sh_data->normals_loop = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_vert_glsl, NULL},
-        .geom = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_geom_glsl, NULL},
+        .vert = (const char *[]){lib, datatoc_edit_normals_vert_glsl, NULL},
+        .geom = (const char *[]){lib, datatoc_edit_normals_geom_glsl, NULL},
         .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, "#define LOOP_NORMALS\n", NULL},
     });
 
     sh_data->normals = GPU_shader_create_from_arrays({
-        .vert = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_vert_glsl, NULL},
-        .geom = (const char *[]){sh_cfg_data->lib, datatoc_edit_normals_geom_glsl, NULL},
+        .vert = (const char *[]){lib, datatoc_edit_normals_vert_glsl, NULL},
+        .geom = (const char *[]){lib, datatoc_edit_normals_geom_glsl, NULL},
         .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
         .defs = (const char *[]){sh_cfg_data->def, NULL},
     });
 
+    MEM_freeN(lib);
+
     /* Mesh Analysis */
     sh_data->mesh_analysis_face = GPU_shader_create_from_arrays({
         .vert = (const char *[]){sh_cfg_data->lib,
diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
index 54315863a2e..dc84b8924d1 100644
--- a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
@@ -9,7 +9,6 @@ in vec2 ssNor[];
 in vec4 vColSize[];
 
 flat out vec4 finalColor;
-uniform mat4 ProjectionMatrix;
 uniform vec2 viewportSize;
 uniform float lineThickness = 2.0;
 
diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
index 82a483d91a5..365f2004e37 100644
--- a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
@@ -1,8 +1,4 @@
 
-uniform mat3 NormalMatrix;
-
-uniform mat4 ViewMatrix;
-uniform mat4 ProjectionMatrix;
 uniform vec2 viewportSize;
 
 /* ---- Instantiated Attrs ---- */
@@ -27,20 +23,19 @@ vec2 proj(vec4 pos)
 
 void main()
 {
-  /* This is slow and run per vertex, but it's still faster than
-   * doing it per instance on CPU and sending it on via instance attribute. */
-  mat3 NormalMatrix = transpose(inverse(mat3(ViewMatrix * InstanceModelMatrix)));
-
   vec4 worldPosition = InstanceModelMatrix * vec4(pos, 1.0);
   vec4 viewpos = ViewMatrix * worldPosition;
 
   vPos = viewpos.xyz;
   pPos = ProjectionMatrix * viewpos;
 
+  /* This is slow and run per vertex, but it's still faster than
+   * doing it per instance on CPU and sending it on via instance attribute. */
+  mat3 normal_mat = transpose(inverse(mat3(InstanceModelMatrix)));
   /* TODO FIX: there is still a problem with this vector
    * when the bone is scaled or in persp mode. But it's
    * barelly visible at the outline corners. */
-  ssNor = normalize((NormalMatrix * snor).xy);
+  ssNor = normalize(transform_normal_world_to_view(normal_mat * snor).xy);
 
   ssPos = proj(pPos);
 
diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
index 2df25bf0e03..4107aab03ff 100644
--- a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
@@ -1,11 +1,4 @@
 
-uniform mat3 NormalMatrix;
-uniform mat4 ViewMatrixInverse;
-uniform mat4 ViewProjectionMatrix;
-
-uniform mat4 ViewMatrix;
-uniform mat4 ProjectionMatrix;
-
 /* ---- Instantiated Attrs ---- */
 in vec3 pos;
 in vec3 nor;
@@ -19,8 +12,10 @@ out vec4 finalColor;
 
 void main()
 {
-  mat3 NormalMatrix = transpose(inverse(mat3(ViewMatrix * InstanceModelMatrix)));
-  vec3 normal = normalize(NormalMatrix * nor);
+  /* This is slow and run per vertex, but it's still faster than
+   * doing it per instance on CPU and sending it on via instance attribute. */
+  mat3 normal_mat = transpose(inverse(mat3(InstanceModelMatrix)));
+  vec3 normal = normalize(transform_normal_world_to_view(normal_mat * nor));
 
   /* Do lighting at an angle to avoid flat shading on front facing bone. */
   const vec3 light = vec3(0.1, 0.1, 0.8);
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
index d700e69fb57..5466e4b1950 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
@@ -1,9 +1,9 @@
 
-uniform mat3 NormalMatrix;
-uniform mat4 ProjectionMatrix;
 uniform mat4 ModelViewMatrix;
 uniform mat4 ModelViewProjectionMatrix;
 uniform mat4 ModelMatrix;
+uniform mat4 ModelMatrixInverse;
+
 uniform float faceAlphaMod;
 uniform ivec4 dataMask = ivec4(0xFF);
 uniform float ofs;
@@ -77,7 +77,7 @@ void main()
 #if !defined(FACE)
   /* Facing based color blend */
   vec4 vpos = ModelViewMatrix * vec4(pos, 1.0);
-  vec3 view_normal = normalize(NormalMatrix * vnor + 1e-4);
+  vec3 view_normal = normalize(transform_normal_object_to_view(vnor) + 1e-4);
   vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos.xyz) : vec3(0.0, 0.0, 1.0);
   float facing = dot(view_vec, view_normal);
   facing = 1.0 - abs(facing) * 0.2;
diff --git a/source/blender/draw/modes/shaders/edit_normals_vert.glsl b/source/blender/draw/modes/shaders/edit_normals_vert.glsl
index 2e34a132cb0..59b8430dcc0 100644
--- a/source/blender/draw/modes/shaders/edit_normals_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_normals_vert.glsl
@@ -1,8 +1,8 @@
 
 uniform mat4 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list