[Bf-blender-cvs] [5759e2d6c40] tmp-workbench-rewrite: Workbench: Refactor: Add support for texpaint & vertpaint

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


Commit: 5759e2d6c40d6cd253d6627458fc13f5bbdb9488
Author: Clément Foucault
Date:   Sat Feb 29 16:12:05 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB5759e2d6c40d6cd253d6627458fc13f5bbdb9488

Workbench: Refactor: Add support for texpaint & vertpaint

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_image_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_engine.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/makesdna/DNA_view3d_types.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a79a1c4cc0b..6478bc46333 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -262,6 +262,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl
 data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_image_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
 data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
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 effa0a8f4df..de6029434f3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
@@ -26,6 +26,5 @@ void main()
   vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic);
 
   fragColor.rgb = get_world_lighting(diffuse_color, specular_color, roughness, normal, I_vs);
-
   fragColor.a = 1.0;
 }
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
index f014804eecc..6f99739f259 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
@@ -1,4 +1,5 @@
 
+/* TODO(fclem) deduplicate code.  */
 bool node_tex_tile_lookup(inout vec3 co, sampler2DArray ima, sampler1DArray map)
 {
   vec2 tile_pos = floor(co.xy);
@@ -21,30 +22,19 @@ bool node_tex_tile_lookup(inout vec3 co, sampler2DArray ima, sampler1DArray map)
   return true;
 }
 
-vec4 workbench_sample_texture(sampler2D image,
-                              vec2 coord,
-                              bool nearest_sampling,
-                              bool premultiplied)
+vec4 workbench_sample_texture(sampler2D image, vec2 coord, bool nearest_sampling)
 {
   vec2 tex_size = vec2(textureSize(image, 0).xy);
   /* TODO(fclem) We could do the same with sampler objects.
    * But this is a quick workaround instead of messing with the GPUTexture itself. */
   vec2 uv = nearest_sampling ? (floor(coord * tex_size) + 0.5) / tex_size : coord;
-  vec4 color = texture(image, uv);
-
-  /* Unpremultiply if stored multiplied, since straight alpha is expected by shaders. */
-  if (premultiplied && !(color.a == 0.0 || color.a == 1.0)) {
-    color.rgb = color.rgb / color.a;
-  }
-
-  return color;
+  return texture(image, uv);
 }
 
 vec4 workbench_sample_texture_array(sampler2DArray tile_array,
                                     sampler1DArray tile_data,
                                     vec2 coord,
-                                    bool nearest_sampling,
-                                    bool premultiplied)
+                                    bool nearest_sampling)
 {
   vec2 tex_size = vec2(textureSize(tile_array, 0).xy);
 
@@ -55,37 +45,36 @@ vec4 workbench_sample_texture_array(sampler2DArray tile_array,
   /* TODO(fclem) We could do the same with sampler objects.
    * But this is a quick workaround instead of messing with the GPUTexture itself. */
   uv.xy = nearest_sampling ? (floor(uv.xy * tex_size) + 0.5) / tex_size : uv.xy;
-  vec4 color = texture(tile_array, uv);
-
-  /* Unpremultiply if stored multiplied, since straight alpha is expected by shaders. */
-  if (premultiplied && !(color.a == 0.0 || color.a == 1.0)) {
-    color.rgb = color.rgb / color.a;
-  }
-
-  return color;
+  return texture(tile_array, uv);
 }
 
-uniform sampler2DArray image_tile_array;
-uniform sampler1DArray image_tile_data;
-uniform sampler2D image;
+uniform sampler2DArray imageTileArray;
+uniform sampler1DArray imageTileData;
+uniform sampler2D imageTexture;
 
 uniform float imageTransparencyCutoff = 0.1;
 uniform bool imageNearest;
-uniform bool imagePremultiplied;
+uniform bool imagePremult;
 
 vec3 workbench_image_color(vec2 uvs)
 {
-#if defined(V3D_SHADING_TEXTURE_COLOR)
+#ifdef V3D_SHADING_TEXTURE_COLOR
 #  ifdef TEXTURE_IMAGE_ARRAY
-  vec4 color = workbench_sample_texture_array(
-      image_tile_array, image_tile_data, uvs, imageNearest, imagePremultiplied);
+  vec4 color = workbench_sample_texture_array(imageTileArray, imageTileData, uvs, imageNearest);
 #  else
-  vec4 color = workbench_sample_texture(image, uvs, imageNearest, imagePremultiplied);
+  vec4 color = workbench_sample_texture(imageTexture, uvs, imageNearest);
 #  endif
 
-  if (color.a < ImageTransparencyCutoff) {
+  /* Unpremultiply if stored multiplied, since straight alpha is expected by shaders. */
+  if (imagePremult && !(color.a == 0.0 || color.a == 1.0)) {
+    color.rgb /= color.a;
+  }
+
+#  ifdef GPU_FRAGMENT_SHADER
+  if (color.a < imageTransparencyCutoff) {
     discard;
   }
+#  endif
 
   return color.rgb;
 #else
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 6875cb6bd94..18301062df4 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
@@ -2,6 +2,7 @@
 #pragma BLENDER_REQUIRE(common_view_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
 #pragma BLENDER_REQUIRE(workbench_material_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_image_lib.glsl)
 
 IN_OUT ShaderStageInterface
 {
@@ -19,6 +20,8 @@ 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);
@@ -29,21 +32,18 @@ void main()
 #  endif
 
   uv_interp = au;
-  color_interp = vec3(0.9);  // ac.rgb;
 
   normal_interp = normalize(normal_object_to_view(nor));
 
   float alpha, metallic, roughness;
   workbench_material_data_get(resource_handle, color_interp, alpha, roughness, metallic);
 
-  if (metallic == -1.0) {
-    /* Matcap Case. */
-    packed_rough_metal = -1.0;
-  }
-  else {
-    packed_rough_metal = workbench_float_pair_encode(roughness, metallic);
+  if (useVertexColor) {
+    color_interp = ac.rgb;
   }
 
+  packed_rough_metal = workbench_float_pair_encode(roughness, metallic);
+
   object_id = int((uint(resource_id) + 1u) & 0xFFu);
 }
 
@@ -53,6 +53,8 @@ layout(location = 0) out vec4 materialData;
 layout(location = 1) out WB_Normal normalData;
 layout(location = 2) out uint objectId;
 
+uniform bool useMatcap = false;
+
 void main()
 {
   normalData = workbench_normal_encode(gl_FrontFacing, normal_interp);
@@ -61,12 +63,14 @@ void main()
 
   objectId = uint(object_id);
 
-  if (materialData.a == -1.0) {
+  if (useMatcap) {
     /* For matcaps, save front facing in alpha channel. */
     materialData.a = float(gl_FrontFacing);
   }
 
-  // materialData.rgb *= workbench_image_color(uv_interp);
+#  ifdef V3D_SHADING_TEXTURE_COLOR
+  materialData.rgb = workbench_image_color(uv_interp);
+#  endif
 }
 
 #endif
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 08342f29c2a..88d099f91ba 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -163,6 +163,9 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   RegionView3D *rv3d = draw_ctx->rv3d;
   View3D *v3d = draw_ctx->v3d;
 
+  wpd->ctx_mode = CTX_data_mode_enum_ex(
+      draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
+
   wpd->preferences = &U;
   wpd->sh_cfg = draw_ctx->sh_cfg;
 
@@ -198,11 +201,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
     wpd->studio_light = BKE_studiolight_find(wpd->shading.studio_light, STUDIOLIGHT_TYPE_STUDIO);
   }
 
-  const bool use_material_index = USE_MATERIAL_INDEX(wpd);
-
-  if (use_material_index) {
-    wpd->material_hash = BLI_ghash_ptr_new(__func__);
-  }
+  wpd->material_hash = BLI_ghash_ptr_new(__func__);
 
   float shadow_focus = scene->display.shadow_focus;
   /* Clamp to avoid overshadowing and shading errors. */
@@ -216,6 +215,10 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
 
   studiolight_update_world(wpd, wpd->studio_light, wd);
 
+  /* Init default material used by vertex color & texture. */
+  workbench_material_ubo_data(
+      wpd, NULL, NULL, &wpd->material_ubo_data_curr[0], V3D_SHADING_MATERIAL_COLOR);
+
   copy_v3_v3(wd->object_outline_color, wpd->shading.object_outline_color);
   wd->object_outline_color[3] = 1.0f;
 
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 1b027ed7612..7fcaa074a12 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -46,6 +46,7 @@ static void workbench_engine_init(void *ved)
 {
   WORKBENCH_Data *vedata = ved;
   WORKBENCH_StorageList *stl = vedata->stl;
+  WORKBENCH_TextureList *txl = vedata->txl;
   const DRWContextState *draw_ctx = DRW_context_state_get();
   RegionView3D *rv3d = draw_ctx->rv3d;
   View3D *v3d = draw_ctx->v3d;
@@ -73,6 +74,12 @@ static void workbench_engine_init(void *ved)
   WORKBENCH_PrivateData *wpd = stl->wpd;
   workbench_private_data_init(wpd);
 
+  if (txl->dummy_image_tx == NULL) {
+    float fpixel[4] = {1.0f, 0.0f, 1.0f, 1.0f};
+    txl->dummy_image_tx = DRW_texture_create_2d(1, 1, GPU_RGBA8, 0, fpixel);
+  }
+  wpd->dummy_image_tx = txl->dummy_image_tx;
+
   workbench_opaque_engine_init(vedata);
   //   workbench_volume_engine_init();
   //   workbench_fxaa_engine_init();
@@ -94,28 +101,142 @@ static void workbench_cache_init(void *ved)
 
 /* TODO(fclem) DRW_cache_object_surface_material_get needs a re

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list