[Bf-blender-cvs] [0c28626de60] tmp-overlay-engine: Overlay Engine: Add Outline

Clément Foucault noreply at git.blender.org
Wed Nov 6 03:14:14 CET 2019


Commit: 0c28626de6094828bfede6f8f0e28c1ff601b096
Author: Clément Foucault
Date:   Sat Nov 2 01:39:59 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB0c28626de6094828bfede6f8f0e28c1ff601b096

Overlay Engine: Add Outline

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_facing.c
A	source/blender/draw/engines/overlay/overlay_outline.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
M	source/blender/draw/engines/overlay/overlay_wireframe.c
A	source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl
A	source/blender/draw/engines/overlay/shaders/outline_expand_frag.glsl
A	source/blender/draw/engines/overlay/shaders/outline_lightprobe_grid_vert.glsl
A	source/blender/draw/engines/overlay/shaders/outline_prepass_frag.glsl
A	source/blender/draw/engines/overlay/shaders/outline_prepass_geom.glsl
A	source/blender/draw/engines/overlay/shaders/outline_prepass_vert.glsl
A	source/blender/draw/engines/overlay/shaders/outline_resolve_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 2840903c9c7..d31b58fc7ad 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -135,10 +135,11 @@ set(SRC
   engines/select/select_draw_utils.c
   engines/select/select_engine.c
   engines/overlay/overlay_engine.c
-  engines/overlay/overlay_shader.c
-  engines/overlay/overlay_wireframe.c
   engines/overlay/overlay_facing.c
   engines/overlay/overlay_grid.c
+  engines/overlay/overlay_outline.c
+  engines/overlay/overlay_shader.c
+  engines/overlay/overlay_wireframe.c
 
   DRW_engine.h
   DRW_select_buffer.h
@@ -383,6 +384,13 @@ 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/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)
+data_to_c_simple(engines/overlay/shaders/outline_prepass_geom.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/outline_prepass_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/outline_lightprobe_grid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/outline_resolve_frag.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_geom.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/wireframe_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index f0d737e216c..61a86b0e2a3 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -25,6 +25,10 @@
 #include "DRW_engine.h"
 #include "DRW_render.h"
 
+#include "ED_view3d.h"
+
+#include "BKE_object.h"
+
 #include "overlay_engine.h"
 #include "overlay_private.h"
 
@@ -47,6 +51,7 @@ static void OVERLAY_engine_init(void *vedata)
 
   OVERLAY_grid_init(vedata);
   OVERLAY_facing_init(vedata);
+  OVERLAY_outline_init(vedata);
   OVERLAY_wireframe_init(vedata);
 }
 
@@ -62,9 +67,11 @@ static void OVERLAY_cache_init(void *vedata)
 
   if (v3d && !(v3d->flag2 & V3D_HIDE_OVERLAYS)) {
     pd->overlay = v3d->overlay;
+    pd->v3d_flag = v3d->flag;
   }
   else {
     memset(&pd->overlay, 0, sizeof(pd->overlay));
+    pd->v3d_flag = 0;
   }
 
   if (v3d->shading.type == OB_WIRE) {
@@ -72,26 +79,66 @@ static void OVERLAY_cache_init(void *vedata)
   }
 
   pd->clipping_state = (rv3d->rflag & RV3D_CLIPPING) ? DRW_STATE_CLIP_PLANES : 0;
+  pd->xray_enabled = XRAY_ACTIVE(v3d);
+  pd->xray_enabled_and_not_wire = pd->xray_enabled && v3d->shading.type > OB_WIRE;
 
   OVERLAY_grid_cache_init(vedata);
   OVERLAY_facing_cache_init(vedata);
+  OVERLAY_outline_cache_init(vedata);
   OVERLAY_wireframe_cache_init(vedata);
 }
 
+BLI_INLINE OVERLAY_DupliData *OVERLAY_duplidata_get(Object *ob, void *vedata, bool *init)
+{
+  OVERLAY_DupliData **dupli_data = (OVERLAY_DupliData **)DRW_duplidata_get(vedata);
+  *init = false;
+  if (!ELEM(ob->type, OB_MESH, OB_SURF, OB_LATTICE, OB_CURVE, OB_FONT)) {
+    return NULL;
+  }
+
+  if (dupli_data) {
+    if (*dupli_data == NULL) {
+      *dupli_data = MEM_callocN(sizeof(OVERLAY_DupliData), __func__);
+      *init = true;
+    }
+    else if ((*dupli_data)->base_flag != ob->base_flag) {
+      /* Select state might have change, reinit. */
+      *init = true;
+    }
+    return *dupli_data;
+  }
+  return NULL;
+}
+
 static void OVERLAY_cache_populate(void *vedata, Object *ob)
 {
   OVERLAY_Data *data = vedata;
   OVERLAY_PrivateData *pd = data->stl->pd;
+  const DRWContextState *draw_ctx = DRW_context_state_get();
   const bool renderable = DRW_object_is_renderable(ob);
+  const bool in_edit_mode = BKE_object_is_in_editmode(ob);
+  const bool in_paint_mode = (ob == draw_ctx->obact) &&
+                             (draw_ctx->object_mode & OB_MODE_ALL_PAINT);
   const bool draw_surface = !((ob->dt < OB_WIRE) || (!renderable && (ob->dt != OB_WIRE)));
   const bool draw_facing = draw_surface && (pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION);
   const bool draw_wires = draw_surface && ((pd->overlay.flag & V3D_OVERLAY_WIREFRAMES) ||
                                            (ob->dtx & OB_DRAWWIRE) || (ob->dt == OB_WIRE));
+  const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable &&
+                             (pd->v3d_flag & V3D_SELECT_OUTLINE) &&
+                             ((ob->base_flag & BASE_SELECTED) ||
+                              (DRW_state_is_select() && ob->type == OB_LIGHTPROBE));
+
+  bool init;
+  OVERLAY_DupliData *dupli = OVERLAY_duplidata_get(ob, vedata, &init);
+
   if (draw_facing) {
     OVERLAY_facing_cache_populate(vedata, ob);
   }
   if (draw_wires) {
-    OVERLAY_wireframe_cache_populate(vedata, ob);
+    OVERLAY_wireframe_cache_populate(vedata, ob, dupli, init);
+  }
+  if (draw_outlines) {
+    OVERLAY_outline_cache_populate(vedata, ob, dupli, init);
   }
   // if (is_geom) {
   //   if (edit_mode) {
@@ -159,6 +206,10 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob)
   // if (draw_extra) {
   //   OVERLAY_extra_cache_populate();
   // }
+
+  if (dupli) {
+    dupli->base_flag = ob->base_flag;
+  }
 }
 
 static void OVERLAY_draw_scene(void *vedata)
@@ -166,6 +217,7 @@ static void OVERLAY_draw_scene(void *vedata)
   OVERLAY_grid_draw(vedata);
   OVERLAY_facing_draw(vedata);
   OVERLAY_wireframe_draw(vedata);
+  OVERLAY_outline_draw(vedata);
 }
 
 static void OVERLAY_engine_free(void)
diff --git a/source/blender/draw/engines/overlay/overlay_facing.c b/source/blender/draw/engines/overlay/overlay_facing.c
index 1a8b9a536bd..ea6f088e8e1 100644
--- a/source/blender/draw/engines/overlay/overlay_facing.c
+++ b/source/blender/draw/engines/overlay/overlay_facing.c
@@ -37,7 +37,7 @@ void OVERLAY_facing_cache_init(OVERLAY_Data *vedata)
   DRW_PASS_CREATE(psl->facing_ps, state | pd->clipping_state);
 
   GPUShader *sh = OVERLAY_shader_facing();
-  pd->facing_shgrp = DRW_shgroup_create(sh, psl->facing_ps);
+  pd->facing_grp = DRW_shgroup_create(sh, psl->facing_ps);
 }
 
 void OVERLAY_facing_cache_populate(OVERLAY_Data *vedata, Object *ob)
@@ -46,7 +46,7 @@ void OVERLAY_facing_cache_populate(OVERLAY_Data *vedata, Object *ob)
 
   struct GPUBatch *geom = DRW_cache_object_surface_get(ob);
   if (geom) {
-    DRW_shgroup_call(pd->facing_shgrp, geom, ob);
+    DRW_shgroup_call(pd->facing_grp, geom, ob);
   }
 }
 
diff --git a/source/blender/draw/engines/overlay/overlay_outline.c b/source/blender/draw/engines/overlay/overlay_outline.c
new file mode 100644
index 00000000000..c917bfa876b
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_outline.c
@@ -0,0 +1,380 @@
+/*
+ * 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 "DNA_lightprobe_types.h"
+
+#include "UI_resources.h"
+
+#include "overlay_private.h"
+
+void OVERLAY_outline_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_FramebufferList *fbl = vedata->fbl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+  if (DRW_state_is_fbo()) {
+    const float *size = DRW_viewport_size_get();
+
+    /* XXX TODO GPU_R16UI can overflow, it would cause no harm
+     * (only bad colored or missing outlines) but we should
+     * use 32bits only if the scene have that many objects */
+    pd->outlines_id_tx = DRW_texture_pool_query_2d(
+        size[0], size[1], GPU_R16UI, (DrawEngineType *)&OVERLAY_outline_init);
+    pd->outlines_depth_tx = DRW_texture_pool_query_2d(
+        size[0], size[1], GPU_DEPTH_COMPONENT24, (DrawEngineType *)&OVERLAY_outline_init);
+
+    GPU_framebuffer_ensure_config(&fbl->outlines_prepass_fb,
+                                  {GPU_ATTACHMENT_TEXTURE(pd->outlines_depth_tx),
+                                   GPU_ATTACHMENT_TEXTURE(pd->outlines_id_tx)});
+
+    for (int i = 0; i < 2; i++) {
+      pd->outlines_color_tx[i] = DRW_texture_pool_query_2d(
+          size[0], size[1], GPU_RGBA8, (DrawEngineType *)&OVERLAY_outline_init);
+      GPU_framebuffer_ensure_config(
+          &fbl->outlines_process_fb[i],
+          {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(pd->outlines_color_tx[i])});
+    }
+  }
+}
+
+static DRWShadingGroup *shgroup_theme_id_to_outline_or_null(OVERLAY_PrivateData *pd,
+                                                            int theme_id,
+                                                            const int base_flag)
+{
+  if (UNLIKELY(base_flag & BASE_FROM_DUPLI)) {
+    switch (theme_id) {
+      case TH_ACTIVE:
+      case TH_SELECT:
+        return pd->outlines_select_dupli_grp;
+      case TH_TRANSFORM:
+        return pd->outlines_transform_grp;
+      default:
+        return NULL;
+    }
+  }
+
+  switch (theme_id) {
+    case TH_ACTIVE:
+      return pd->outlines_active_grp;
+    case TH_SELECT:
+      return pd->outlines_select_grp;
+    case TH_TRANSFORM:
+      return pd->outlines_transform_grp;
+    default:
+      return NULL;
+  }
+}
+
+static DRWShadingGroup *shgroup_theme_id_to_probe_outline_or_null(OVERLAY_PrivateData *pd,
+                                                                  int theme_id,
+                                                                  const int bas

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list