[Bf-blender-cvs] [63108cbeff1] uvimage-editor-drawing: Initial commit for image unavailable texture

Jeroen Bakker noreply at git.blender.org
Mon Aug 17 15:05:15 CEST 2020


Commit: 63108cbeff19de2c8936dc4ca0fb9a7afcc4f8a4
Author: Jeroen Bakker
Date:   Mon Aug 17 15:04:49 2020 +0200
Branches: uvimage-editor-drawing
https://developer.blender.org/rB63108cbeff19de2c8936dc4ca0fb9a7afcc4f8a4

Initial commit for image unavailable texture

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/editors/editors_image.c
M	source/blender/draw/engines/editors/editors_private.h
M	source/blender/draw/engines/editors/editors_shaders.c
A	source/blender/draw/engines/editors/shaders/editors_image_unavailable_frag.glsl
A	source/blender/draw/engines/editors/shaders/editors_image_unavailable_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index d1bf4533d08..081d7a2ee25 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -424,8 +424,10 @@ data_to_c_simple(engines/overlay2d/shaders/uv_face_dots_vert.glsl SRC)
 data_to_c_simple(engines/overlay2d/shaders/uv_verts_vert.glsl SRC)
 data_to_c_simple(engines/overlay2d/shaders/uv_verts_frag.glsl SRC)
 
-data_to_c_simple(engines/editors/shaders/editors_image_vert.glsl SRC)
 data_to_c_simple(engines/editors/shaders/editors_image_frag.glsl SRC)
+data_to_c_simple(engines/editors/shaders/editors_image_unavailable_frag.glsl SRC)
+data_to_c_simple(engines/editors/shaders/editors_image_unavailable_vert.glsl SRC)
+data_to_c_simple(engines/editors/shaders/editors_image_vert.glsl SRC)
 
 list(APPEND INC
 )
diff --git a/source/blender/draw/engines/editors/editors_image.c b/source/blender/draw/engines/editors/editors_image.c
index d1ae4566f5f..b983f3c4623 100644
--- a/source/blender/draw/engines/editors/editors_image.c
+++ b/source/blender/draw/engines/editors/editors_image.c
@@ -162,6 +162,13 @@ static void editors_image_cache_image(EDITORS_PassList *psl,
     DRW_shgroup_call_instances_with_attrs(
         shgrp, NULL, e_data.gpu_batch_image, e_data.gpu_batch_instances);
   }
+  else {
+    /* No image available. use the image unavailable shader. */
+    GPUShader *shader = EDITORS_shaders_image_unavailable_get();
+    DRWShadingGroup *grp = DRW_shgroup_create(shader, psl->image_pass);
+    DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+    DRW_shgroup_call(grp, e_data.gpu_batch_image, NULL);
+  }
 }
 
 /* \} */
diff --git a/source/blender/draw/engines/editors/editors_private.h b/source/blender/draw/engines/editors/editors_private.h
index 1bcb70c1af3..f6dfa8f0c1f 100644
--- a/source/blender/draw/engines/editors/editors_private.h
+++ b/source/blender/draw/engines/editors/editors_private.h
@@ -47,6 +47,7 @@ void EDITORS_image_draw_scene(EDITORS_Data *vedata);
 
 /* editors_shaders.c */
 GPUShader *EDITORS_shaders_image_get(void);
+GPUShader *EDITORS_shaders_image_unavailable_get(void);
 void EDITORS_shader_library_ensure(void);
 void EDITORS_shaders_free(void);
 
diff --git a/source/blender/draw/engines/editors/editors_shaders.c b/source/blender/draw/engines/editors/editors_shaders.c
index e4a3d9baeda..3db45eec9e5 100644
--- a/source/blender/draw/engines/editors/editors_shaders.c
+++ b/source/blender/draw/engines/editors/editors_shaders.c
@@ -29,15 +29,18 @@
 #include "editors_engine.h"
 #include "editors_private.h"
 
-extern char datatoc_gpu_shader_2D_image_vert_glsl[];
-extern char datatoc_common_view_lib_glsl[];
 extern char datatoc_common_colormanagement_lib_glsl[];
+extern char datatoc_common_globals_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
 
-extern char datatoc_editors_image_vert_glsl[];
 extern char datatoc_editors_image_frag_glsl[];
+extern char datatoc_editors_image_unavailable_frag_glsl[];
+extern char datatoc_editors_image_unavailable_vert_glsl[];
+extern char datatoc_editors_image_vert_glsl[];
 
 typedef struct EDITORS_Shaders {
   GPUShader *image_sh;
+  GPUShader *image_unavailable_sh;
 } EDITORS_Shaders;
 
 static struct {
@@ -50,8 +53,9 @@ void EDITORS_shader_library_ensure(void)
   if (e_data.lib == NULL) {
     e_data.lib = DRW_shader_library_create();
     /* NOTE: Theses needs to be ordered by dependencies. */
-    DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
     DRW_SHADER_LIB_ADD(e_data.lib, common_colormanagement_lib);
+    DRW_SHADER_LIB_ADD(e_data.lib, common_globals_lib);
+    DRW_SHADER_LIB_ADD(e_data.lib, common_view_lib);
   }
 }
 
@@ -71,6 +75,20 @@ GPUShader *EDITORS_shaders_image_get(void)
   return sh_data->image_sh;
 }
 
+GPUShader *EDITORS_shaders_image_unavailable_get(void)
+{
+  EDITORS_Shaders *sh_data = &e_data.shaders;
+  if (!sh_data->image_unavailable_sh) {
+    sh_data->image_unavailable_sh = DRW_shader_create_with_shaderlib(
+        datatoc_editors_image_unavailable_vert_glsl,
+        NULL,
+        datatoc_editors_image_unavailable_frag_glsl,
+        e_data.lib,
+        NULL);
+  }
+  return sh_data->image_unavailable_sh;
+}
+/* \} */
 void EDITORS_shaders_free(void)
 {
   GPUShader **sh_data_as_array = (GPUShader **)&e_data.shaders;
diff --git a/source/blender/draw/engines/editors/shaders/editors_image_unavailable_frag.glsl b/source/blender/draw/engines/editors/shaders/editors_image_unavailable_frag.glsl
new file mode 100644
index 00000000000..6455747b97f
--- /dev/null
+++ b/source/blender/draw/engines/editors/shaders/editors_image_unavailable_frag.glsl
@@ -0,0 +1,23 @@
+#pragma BLENDER_REQUIRE(common_colormanagement_lib.glsl)
+#pragma BLENDER_REQUIRE(common_globals_lib.glsl)
+
+flat in vec4 origin;
+in vec2 uvs;
+
+out vec4 fragColor;
+
+/* XXX(jbakker): this is incomplete code. */
+void main()
+{
+  ivec2 view_coord = ivec2(gl_FragCoord.xy - origin.xy);
+  vec3 final_color = vec3(1.0, 0.0, 1.0);
+
+  if (view_coord.x % 100 == 0) {
+    final_color = vec3(0.0);
+  }
+  else {
+    final_color = colorBackground.rgb;
+  }
+
+  fragColor = vec4(final_color, 1.0);
+}
diff --git a/source/blender/draw/engines/editors/shaders/editors_image_unavailable_vert.glsl b/source/blender/draw/engines/editors/shaders/editors_image_unavailable_vert.glsl
new file mode 100644
index 00000000000..4bec1a31e9c
--- /dev/null
+++ b/source/blender/draw/engines/editors/shaders/editors_image_unavailable_vert.glsl
@@ -0,0 +1,21 @@
+#pragma BLENDER_REQUIRE(common_view_lib.glsl)
+
+in vec3 pos;
+
+out vec2 uvs;
+flat out vec4 origin;
+
+void main()
+{
+  vec3 world_pos = point_object_to_world(pos);
+  vec4 position = point_world_to_ndc(world_pos);
+  origin = point_world_to_ndc(vec3(0.0));
+  origin.z = 0.0;
+
+  /* Move drawn pixels to the front. In the overlay engine the depth is used
+   * to detect if a transparency texture or the background color should be drawn. */
+  position.z = 0.0;
+  gl_Position = position;
+
+  uvs = pos.xy;
+}



More information about the Bf-blender-cvs mailing list