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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs