[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