[Bf-blender-cvs] [73162d80c25] tmp-overlay-engine: Overlay Engine: Image Empties

Clément Foucault noreply at git.blender.org
Fri Nov 15 01:35:33 CET 2019


Commit: 73162d80c2502333471cbb88268967996e814b73
Author: Clément Foucault
Date:   Thu Nov 14 02:00:45 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB73162d80c2502333471cbb88268967996e814b73

Overlay Engine: Image Empties

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_extra.c
A	source/blender/draw/engines/overlay/overlay_image.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
A	source/blender/draw/engines/overlay/shaders/image_frag.glsl
A	source/blender/draw/engines/overlay/shaders/image_vert.glsl
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/modes/object_mode.c
M	source/blender/makesdna/DNA_world_types.h

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 0139d452baa..69261ac8369 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -140,6 +140,7 @@ set(SRC
   engines/overlay/overlay_extra.c
   engines/overlay/overlay_facing.c
   engines/overlay/overlay_grid.c
+  engines/overlay/overlay_image.c
   engines/overlay/overlay_outline.c
   engines/overlay/overlay_shader.c
   engines/overlay/overlay_wireframe.c
@@ -406,6 +407,8 @@ data_to_c_simple(engines/overlay/shaders/facing_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/facing_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/grid_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/grid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/image_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/image_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/outline_detect_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/outline_expand_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/outline_prepass_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index 38a059f3b83..eab0d0701db 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -153,6 +153,7 @@ static void OVERLAY_cache_init(void *vedata)
   OVERLAY_extra_cache_init(vedata);
   OVERLAY_facing_cache_init(vedata);
   OVERLAY_grid_cache_init(vedata);
+  OVERLAY_image_cache_init(vedata);
   OVERLAY_outline_cache_init(vedata);
   OVERLAY_wireframe_cache_init(vedata);
 }
@@ -250,9 +251,6 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   //   if (scuplt_mode) {
   //     OVERLAY_sculpt_cache_populate();
   //   }
-  //   if (draw_wires) {
-  //     OVERLAY_wireframe_cache_populate();
-  //   }
   // }
 
   switch (ob->type) {
@@ -300,11 +298,17 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   }
 }
 
+static void OVERLAY_cache_finish(void *vedata)
+{
+  OVERLAY_image_cache_finish(vedata);
+}
+
 static void OVERLAY_draw_scene(void *vedata)
 {
   OVERLAY_Data *data = vedata;
   OVERLAY_PrivateData *pd = data->stl->pd;
 
+  OVERLAY_image_draw(vedata);
   OVERLAY_facing_draw(vedata);
   OVERLAY_wireframe_draw(vedata);
   OVERLAY_extra_draw(vedata);
@@ -343,7 +347,7 @@ DrawEngineType draw_engine_overlay_type = {
     &OVERLAY_engine_free,
     &OVERLAY_cache_init,
     &OVERLAY_cache_populate,
-    NULL,
+    &OVERLAY_cache_finish,
     NULL,
     &OVERLAY_draw_scene,
     NULL,
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 430818d807e..b89561c9f2d 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -139,6 +139,7 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
       cb->empty_cone = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cone_get());
       cb->empty_cube = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cube_get());
       cb->empty_cylinder = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cylinder_get());
+      cb->empty_image_frame = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_image_frame_get());
       cb->empty_plain_axes = BUF_INSTANCE(grp_sub, format, DRW_cache_plain_axes_get());
       cb->empty_single_arrow = BUF_INSTANCE(grp_sub, format, DRW_cache_single_arrow_get());
       cb->empty_sphere = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_sphere_get());
@@ -247,7 +248,7 @@ void OVERLAY_extra_line(OVERLAY_ExtraCallBuffers *cb,
   DRW_buffer_add_entry(cb->extra_lines, end, &color_id);
 }
 
-static OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
+OVERLAY_ExtraCallBuffers *OVERLAY_extra_call_buffer_get(OVERLAY_Data *vedata, Object *ob)
 {
   bool do_in_front = (ob->dtx & OB_DRAWXRAY) != 0;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
@@ -291,7 +292,8 @@ void OVERLAY_empty_shape(OVERLAY_ExtraCallBuffers *cb,
       DRW_buffer_add_entry(cb->empty_axes, color, instdata);
       break;
     case OB_EMPTY_IMAGE:
-      BLI_assert(!"Should never happen, use DRW_shgroup_empty instead.");
+      /* This only show the frame. See OVERLAY_image_empty_cache_populate() for the image. */
+      DRW_buffer_add_entry(cb->empty_image_frame, color, instdata);
       break;
   }
 }
@@ -321,7 +323,7 @@ void OVERLAY_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
       OVERLAY_empty_shape(cb, ob->obmat, ob->empty_drawsize, ob->empty_drawtype, color);
       break;
     case OB_EMPTY_IMAGE:
-      // DRW_shgroup_empty_image(sh_data, sgl, ob, color, rv3d, sh_cfg);
+      OVERLAY_image_empty_cache_populate(vedata, ob);
       break;
   }
 }
diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c
new file mode 100644
index 00000000000..91cb026e8c4
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_image.c
@@ -0,0 +1,185 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include "DRW_render.h"
+
+#include "BKE_object.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_image_cache_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL;
+  DRW_PASS_CREATE(psl->image_background_ps, state);
+
+  state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
+  DRW_PASS_CREATE(psl->image_empties_ps, state | pd->clipping_state);
+
+  state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+  DRW_PASS_CREATE(psl->image_empties_back_ps, state | pd->clipping_state);
+  DRW_PASS_CREATE(psl->image_empties_blend_ps, state | pd->clipping_state);
+
+  state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
+  DRW_PASS_CREATE(psl->image_empties_front_ps, state);
+  DRW_PASS_CREATE(psl->image_foreground_ps, state);
+}
+
+static void overlay_image_calc_aspect(Image *ima, const int size[2], float r_image_aspect[2])
+{
+  float ima_x, ima_y;
+  if (ima) {
+    ima_x = size[0];
+    ima_y = size[1];
+  }
+  else {
+    /* if no image, make it a 1x1 empty square, honor scale & offset */
+    ima_x = ima_y = 1.0f;
+  }
+  /* Get the image aspect even if the buffer is invalid */
+  float sca_x = 1.0f, sca_y = 1.0f;
+  if (ima) {
+    if (ima->aspx > ima->aspy) {
+      sca_y = ima->aspy / ima->aspx;
+    }
+    else if (ima->aspx < ima->aspy) {
+      sca_x = ima->aspx / ima->aspy;
+    }
+  }
+
+  const float scale_x_inv = ima_x * sca_x;
+  const float scale_y_inv = ima_y * sca_y;
+  if (scale_x_inv > scale_y_inv) {
+    r_image_aspect[0] = 1.0f;
+    r_image_aspect[1] = scale_y_inv / scale_x_inv;
+  }
+  else {
+    r_image_aspect[0] = scale_x_inv / scale_y_inv;
+    r_image_aspect[1] = 1.0f;
+  }
+}
+
+void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+  // OVERLAY_PrivateData *pd = vedata->stl->pd;
+  // DRWShadingGroup *grp = DRW_shgroup_create_sub(pd->image_background);
+  // DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
+  // DRW_shgroup_call_obmat(grp, batch, NULL);
+}
+
+void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  const RegionView3D *rv3d = draw_ctx->rv3d;
+  GPUTexture *tex = NULL;
+  Image *ima = ob->data;
+  float mat[4][4];
+
+  const bool show_frame = BKE_object_empty_image_frame_is_visible_in_view3d(ob, rv3d);
+  const bool show_image = show_frame && BKE_object_empty_image_data_is_visible_in_view3d(ob, rv3d);
+  const bool use_alpha_blend = (ob->empty_image_flag & OB_EMPTY_IMAGE_USE_ALPHA_BLEND) != 0;
+  const bool use_alpha_premult = ima && (ima->alpha_mode == IMA_ALPHA_PREMUL);
+
+  if (!show_frame) {
+    return;
+  }
+
+  {
+    /* Calling 'BKE_image_get_size' may free the texture. Get the size from 'tex' instead,
+     * see: T59347 */
+    int size[2] = {0};
+    if (ima != NULL) {
+      tex = GPU_texture_from_blender(ima, ob->iuser, GL_TEXTURE_2D);
+      if (tex) {
+        size[0] = GPU_texture_orig_width(tex);
+        size[1] = GPU_texture_orig_height(tex);
+      }
+    }
+    CLAMP_MIN(size[0], 1);
+    CLAMP_MIN(size[1], 1);
+
+    float image_aspect[2];
+    overlay_image_calc_aspect(ob->data, size, image_aspect);
+
+    copy_m4_m4(mat, ob->obmat);
+    mul_v3_fl(mat[0], image_aspect[0] * 0.5f * ob->empty_drawsize);
+    mul_v3_fl(mat[1], image_aspect[1] * 0.5f * ob->empty_drawsize);
+    madd_v3_v3fl(mat[3], mat[0], ob->ima_ofs[0] * 2.0f + 1.0f);
+    madd_v3_v3fl(mat[3], mat[1], ob->ima_ofs[1] * 2.0f + 1.0f);
+  }
+
+  /* Use the actual depth if we are doing depth tests to determine the distance to the object */
+  char depth_mode = DRW_state_is_depth() ? OB_EMPTY_IMAGE_DEPTH_DEFAULT : ob->empty_image_depth;
+  DRWPass *pass = NULL;
+  switch (depth_mode) {
+    case OB_EMPTY_IMAGE_DEPTH_DEFAULT:
+      pass = (use_alpha_blend) ? psl->image_empties_blend_ps : psl->image_empties_ps;
+      break;
+    case OB_EMPTY_IMAGE_DEPTH_BACK:
+      pass = psl->image_empties_back_ps;
+      break;
+    case OB_EMPTY_IMAGE_DEPTH_FRONT:
+      pass = psl->image_empties_front_ps;
+      break;
+  }
+
+  if (show_frame) {
+    OVERLAY_ExtraCallBuffers *cb = OVERL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list