[Bf-blender-cvs] [46f8367eaca] tmp-workbench-rewrite: Workbench: Refactor: Add support for Flat shading

Clément Foucault noreply at git.blender.org
Tue Mar 3 17:35:48 CET 2020


Commit: 46f8367eaca30607ef9623ae8e020d0ae210bec4
Author: Clément Foucault
Date:   Sat Feb 29 17:22:04 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB46f8367eaca30607ef9623ae8e020d0ae210bec4

Workbench: Refactor: Add support for Flat shading

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

M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_opaque.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_shader.c
M	source/blender/draw/engines/workbench/workbench_studiolight.c

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
index de6029434f3..19f6ce5f14c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -25,6 +25,17 @@ void main()
   vec3 specular_color = mix(vec3(0.05), base_color.rgb, metallic);
   vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic);
 
+#ifdef V3D_LIGHTING_MATCAP
+  fragColor.rgb = vec3(1.0);
+#endif
+
+#ifdef V3D_LIGHTING_STUDIO
   fragColor.rgb = get_world_lighting(diffuse_color, specular_color, roughness, normal, I_vs);
+#endif
+
+#ifdef V3D_LIGHTING_FLAT
+  fragColor.rgb = base_color.rgb;
+#endif
+
   fragColor.a = 1.0;
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
index aa3a0a30408..1d8950e34b3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
@@ -5,12 +5,12 @@ layout(std140) uniform material_block
 };
 
 /* If set to -1, the resource handle is used instead. */
-uniform int material_index;
+uniform int materialIndex;
 
 void workbench_material_data_get(
     int handle, out vec3 color, out float alpha, out float roughness, out float metallic)
 {
-  handle = (material_index != -1) ? material_index : handle;
+  handle = (materialIndex != -1) ? materialIndex : handle;
   vec4 data = mat_data[uint(handle) & 0xFFFu];
   color = data.rgb;
 
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 18301062df4..5f960bdeba9 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -20,8 +20,6 @@ in vec3 nor;
 in vec4 ac; /* active color */
 in vec2 au; /* active texture layer */
 
-uniform bool useVertexColor = false;
-
 void main()
 {
   vec3 world_pos = point_object_to_world(pos);
@@ -38,7 +36,7 @@ void main()
   float alpha, metallic, roughness;
   workbench_material_data_get(resource_handle, color_interp, alpha, roughness, metallic);
 
-  if (useVertexColor) {
+  if (materialIndex == 0) {
     color_interp = ac.rgb;
   }
 
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 88d099f91ba..b89ef1e9ad8 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -160,7 +160,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   const DRWContextState *draw_ctx = DRW_context_state_get();
   const Scene *scene = draw_ctx->scene;
   WORKBENCH_ViewLayerData *vldata = workbench_view_layer_data_ensure_ex(draw_ctx->view_layer);
-  RegionView3D *rv3d = draw_ctx->rv3d;
   View3D *v3d = draw_ctx->v3d;
 
   wpd->ctx_mode = CTX_data_mode_enum_ex(
@@ -225,14 +224,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   wd->curvature_ridge = 0.5f / max_ff(SQUARE(wpd->shading.curvature_ridge_factor), 1e-4f);
   wd->curvature_valley = 0.7f / max_ff(SQUARE(wpd->shading.curvature_valley_factor), 1e-4f);
 
-  /* Will be NULL when rendering. */
-  if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
-    wpd->world_clip_planes = rv3d->clip;
-  }
-  else {
-    wpd->world_clip_planes = NULL;
-  }
-
   workbench_world_data_update_shadow_direction_vs(wpd);
   workbench_viewvecs_update(wpd->world_data.viewvecs);
 
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 99fd2e09a4c..f6fe90dbab8 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -509,7 +509,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
       DRWShadingGroup *grp = wpd->prepass_shgrp;
       *grp_mat = grp = DRW_shgroup_create_sub(grp);
       DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
-      DRW_shgroup_uniform_int_copy(grp, "material_index", id & 0xFFFu);
+      DRW_shgroup_uniform_int_copy(grp, "materialIndex", id & 0xFFFu);
       return grp;
     }
     case V3D_SHADING_VERTEX_COLOR: {
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index f662302cf86..07692abebcb 100644
--- a/source/blender/draw/engines/workbench/workbench_opaque.c
+++ b/source/blender/draw/engines/workbench/workbench_opaque.c
@@ -65,13 +65,16 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data)
 {
   WORKBENCH_PassList *psl = data->psl;
   WORKBENCH_PrivateData *wpd = data->stl->wpd;
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  RegionView3D *rv3d = draw_ctx->rv3d;
+  View3D *v3d = draw_ctx->v3d;
   struct GPUShader *sh;
   DRWShadingGroup *grp;
 
   const bool use_matcap = (wpd->shading.light == V3D_LIGHTING_MATCAP);
 
   {
-    DRWState clip_state = WORLD_CLIPPING_ENABLED(wpd) ? DRW_STATE_CLIP_PLANES : 0;
+    DRWState clip_state = RV3D_CLIPPING_ENABLED(v3d, rv3d) ? DRW_STATE_CLIP_PLANES : 0;
     DRWState cull_state = CULL_BACKFACE_ENABLED(wpd) ? DRW_STATE_CULL_BACK : 0;
     DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
 
@@ -81,27 +84,24 @@ void workbench_opaque_cache_init(WORKBENCH_Data *data)
 
     wpd->prepass_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
     DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
-    DRW_shgroup_uniform_int_copy(grp, "material_index", -1);
-    DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
-    DRW_shgroup_uniform_bool_copy(grp, "useVertexColor", false);
+    DRW_shgroup_uniform_int_copy(grp, "materialIndex", -1);
 
     wpd->prepass_vcol_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
     DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
-    DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
-    DRW_shgroup_uniform_bool_copy(grp, "useVertexColor", true);
+    DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. (uses vcol) */
 
     sh = workbench_shader_opaque_image_get(wpd, false);
 
     wpd->prepass_image_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
     DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
-    DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
+    DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
     DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
 
     sh = workbench_shader_opaque_image_get(wpd, true);
 
     wpd->prepass_image_tiled_shgrp = grp = DRW_shgroup_create(sh, psl->prepass_pass);
     DRW_shgroup_uniform_block_persistent(grp, "material_block", wpd->material_ubo_curr);
-    DRW_shgroup_uniform_int_copy(grp, "material_index", 0); /* Default material. */
+    DRW_shgroup_uniform_int_copy(grp, "materialIndex", 0); /* Default material. */
     DRW_shgroup_uniform_bool_copy(grp, "useMatcap", use_matcap);
 
     // DRW_PASS_CREATE(psl->ghost_prepass_pass, state | cull_state | clip_state);
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index dcb28b59df3..b6580c9cacc 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -35,7 +35,7 @@
 #include "workbench_engine.h"
 
 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
-#define MAX_COMPOSITE_SHADERS (1 << 7)
+#define MAX_COMPOSITE_SHADERS (1 << 3)
 #define MAX_PREPASS_SHADERS (1 << 8)
 #define MAX_ACCUM_SHADERS (1 << 8)
 #define MAX_CAVITY_SHADERS (1 << 3)
@@ -85,7 +85,8 @@
 #define NORMAL_VIEWPORT_PASS_ENABLED(wpd) \
   (NORMAL_VIEWPORT_COMP_PASS_ENABLED(wpd) || SSAO_ENABLED(wpd) || CURVATURE_ENABLED(wpd))
 #define NORMAL_ENCODING_ENABLED() (true)
-#define WORLD_CLIPPING_ENABLED(wpd) (wpd->world_clip_planes != NULL)
+/* TODO remove */
+#define WORLD_CLIPPING_ENABLED(wpd) (false)
 
 struct RenderEngine;
 struct RenderLayer;
@@ -254,8 +255,6 @@ typedef struct WORKBENCH_PrivateData {
   bool shadow_changed;
   bool is_playback;
 
-  float (*world_clip_planes)[4];
-
   /* Opaque pipeline */
   struct GPUTexture *object_id_tx;
   struct GPUTexture *material_buffer_tx;
diff --git a/source/blender/draw/engines/workbench/workbench_shader.c b/source/blender/draw/engines/workbench/workbench_shader.c
index c99dd56a836..7a0883e632d 100644
--- a/source/blender/draw/engines/workbench/workbench_shader.c
+++ b/source/blender/draw/engines/workbench/workbench_shader.c
@@ -89,12 +89,22 @@ void workbench_shader_library_ensure(void)
   }
 }
 
-static char *workbench_build_defines(WORKBENCH_PrivateData *UNUSED(wpd))
+static char *workbench_build_defines(WORKBENCH_PrivateData *wpd)
 {
   char *str = NULL;
 
   DynStr *ds = BLI_dynstr_new();
 
+  if (wpd->shading.light == V3D_LIGHTING_STUDIO) {
+    BLI_dynstr_append(ds, "#define V3D_LIGHTING_STUDIO\n");
+  }
+  else if (wpd->shading.light == V3D_LIGHTING_MATCAP) {
+    BLI_dynstr_append(ds, "#define V3D_LIGHTING_MATCAP\n");
+  }
+  else {
+    BLI_dynstr_append(ds, "#define V3D_LIGHTING_FLAT\n");
+  }
+
   if (NORMAL_ENCODING_ENABLED()) {
     BLI_dynstr_append(ds, "#define WORKBENCH_ENCODE_NORMALS\n");
   }
@@ -174,7 +184,8 @@ GPUShader *workbench_shader_opaque_hair_get(WORKBENCH_PrivateData *UNUSED(wpd))
 
 GPUShader *workbench_shader_composite_get(WORKBENCH_PrivateData *wpd)
 {
-  int index = 0;
+  int index = wpd->shading.light;
+  BLI_assert(index < MAX_COMPOSITE_SHADERS);
   if (e_data.composite_sh[index] == NULL) {
     char *defines = workbench_build_defines(wpd);
     char *frag = DRW_shader_library_create_shader_string(e_data.lib,
diff --git a/source/blender/draw/engines/workbe

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list