[Bf-blender-cvs] [dc5fb28c272] tmp-workbench-rewrite2: texture mode
Miguel Pozo
noreply at git.blender.org
Thu Oct 13 13:06:49 CEST 2022
Commit: dc5fb28c2723adbb10136a7714e9535754ff074d
Author: Miguel Pozo
Date: Thu Oct 13 12:34:06 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBdc5fb28c2723adbb10136a7714e9535754ff074d
texture mode
===================================================================
M source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
M source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
M source/blender/draw/engines/workbench/workbench_defines.hh
M source/blender/draw/engines/workbench/workbench_mesh_passes.cc
===================================================================
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
index f4db7bc522f..22f24c99e7b 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
@@ -127,8 +127,10 @@ GPU_SHADER_CREATE_INFO(workbench_color_material)
GPU_SHADER_CREATE_INFO(workbench_color_texture)
.define("WORKBENCH_COLOR_TEXTURE")
.define("WORKBENCH_TEXTURE_IMAGE_ARRAY")
+ .sampler(1, ImageType::FLOAT_2D, "imageTexture", Frequency::BATCH)
.sampler(2, ImageType::FLOAT_2D_ARRAY, "imageTileArray", Frequency::BATCH)
.sampler(3, ImageType::FLOAT_1D_ARRAY, "imageTileData", Frequency::BATCH)
+ .push_constant(Type::BOOL, "isImageTile")
.push_constant(Type::BOOL, "imagePremult")
.push_constant(Type::FLOAT, "imageTransparencyCutoff");
@@ -247,4 +249,4 @@ WORKBENCH_GEOMETRY_VARIATIONS(workbench_next_prepass, "workbench_next_prepass");
#undef WORKBENCH_DATATYPE_VARIATIONS
#undef WORKBENCH_PIPELINE_VARIATIONS
-/** \} */
\ No newline at end of file
+/** \} */
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 1f074b62b8a..b107963575c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
@@ -30,7 +30,24 @@ vec3 workbench_image_color(vec2 uvs)
#ifdef WORKBENCH_COLOR_TEXTURE
vec4 color;
-# ifdef WORKBENCH_TEXTURE_IMAGE_ARRAY
+# ifdef WORKBENCH_NEXT
+
+ vec3 co = vec3(uvs, 0.0);
+ if (isImageTile) {
+ if (node_tex_tile_lookup(co, imageTileArray, imageTileData)) {
+ color = texture(imageTileArray, co);
+ }
+ else {
+ color = vec4(1.0, 0.0, 1.0, 1.0);
+ }
+ }
+ else {
+ color = texture(imageTexture, uvs);
+ }
+
+# else // WORKBENCH_NEXT
+
+# ifdef WORKBENCH_TEXTURE_IMAGE_ARRAY
vec3 co = vec3(uvs, 0.0);
if (node_tex_tile_lookup(co, imageTileArray, imageTileData)) {
color = texture(imageTileArray, co);
@@ -38,10 +55,12 @@ vec3 workbench_image_color(vec2 uvs)
else {
color = vec4(1.0, 0.0, 1.0, 1.0);
}
-# else
+# else
color = texture(imageTexture, uvs);
-# endif
+# endif
+
+# endif // WORKBENCH_NEXT
/* Unpremultiply if stored multiplied, since straight alpha is expected by shaders. */
if (imagePremult && !(color.a == 0.0 || color.a == 1.0)) {
diff --git a/source/blender/draw/engines/workbench/workbench_defines.hh b/source/blender/draw/engines/workbench/workbench_defines.hh
index 2b85c19b0a3..4dfd69d9d50 100644
--- a/source/blender/draw/engines/workbench/workbench_defines.hh
+++ b/source/blender/draw/engines/workbench/workbench_defines.hh
@@ -2,7 +2,8 @@
#define WB_MATCAP_SLOT 0
#define WB_TEXTURE_SLOT 1
-#define WB_TILEMAP_SLOT 2
+#define WB_TILE_ARRAY_SLOT 2
+#define WB_TILE_DATA_SLOT 3
#define WB_MATERIAL_SLOT 0
#define WB_WORLD_SLOT 4
diff --git a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
index 6977c96543a..171b094634b 100644
--- a/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
+++ b/source/blender/draw/engines/workbench/workbench_mesh_passes.cc
@@ -104,18 +104,23 @@ PassMain::Sub &MeshPass::sub_pass_get(eGeometryType geometry_type,
GPUTexture *texture = nullptr;
GPUTexture *tilemap = nullptr;
eGPUSamplerState sampler_state = GPU_SAMPLER_DEFAULT;
- StringRefNull name = "Null Texture";
get_image(ref.object, material_index, image, texture, tilemap, sampler_state);
if (image && texture) {
/* TODO(pragma37): Should be lib.name + name ??? */
- name = image->id.name;
+ StringRefNull name = image->id.name;
auto add_cb = [&] {
PassMain::Sub *sub_pass =
passes_[static_cast<int>(geometry_type)][static_cast<int>(color_type)];
sub_pass = &sub_pass->sub(name.c_str());
- sub_pass->bind_texture(WB_TEXTURE_SLOT, texture, sampler_state);
- sub_pass->bind_texture(WB_TILEMAP_SLOT, tilemap);
+ if (tilemap) {
+ sub_pass->bind_texture(WB_TILE_ARRAY_SLOT, texture, sampler_state);
+ sub_pass->bind_texture(WB_TILE_DATA_SLOT, tilemap);
+ }
+ else {
+ sub_pass->bind_texture(WB_TEXTURE_SLOT, texture, sampler_state);
+ }
+ sub_pass->push_constant("isImageTile", tilemap != nullptr);
sub_pass->push_constant("imagePremult", image && image->alpha_mode == IMA_ALPHA_PREMUL);
/*TODO(pragma37): What's the point? This could be a constant in the shader. */
sub_pass->push_constant("imageTransparencyCutoff", 0.1f);
More information about the Bf-blender-cvs
mailing list