[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