diff options
author | Germano Cavalcante <mano-wii> | 2021-08-03 19:39:30 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-08-05 17:56:51 +0300 |
commit | cc4e674e41f9ddca9d3b6aee8c21ddcb3fdfea26 (patch) | |
tree | 533ae983e35b1c34bc9538b1100213e9642aa47f /source/blender/draw/engines | |
parent | e844e9e8f3bb6814e24749316003814156e2e2ce (diff) |
DRW: New Select Debug Engine
This is a simple engine used only to debug the texture of select ids.
It is only used when the `WITH_DRAW_DEBUG` option is enabled and the
debug value is 31.
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D5490
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r-- | source/blender/draw/engines/select/select_debug_engine.c | 135 | ||||
-rw-r--r-- | source/blender/draw/engines/select/select_engine.h | 6 |
2 files changed, 141 insertions, 0 deletions
diff --git a/source/blender/draw/engines/select/select_debug_engine.c b/source/blender/draw/engines/select/select_debug_engine.c new file mode 100644 index 00000000000..ded96be23f3 --- /dev/null +++ b/source/blender/draw/engines/select/select_debug_engine.c @@ -0,0 +1,135 @@ +/* + * 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 + * + * Engine for debuging the selection map drawing. + */ + +#include "DNA_ID.h" +#include "DNA_vec_types.h" + +#include "DRW_engine.h" +#include "DRW_select_buffer.h" + +#include "draw_cache.h" +#include "draw_manager.h" + +#include "select_engine.h" + +#define SELECT_DEBUG_ENGINE "SELECT_DEBUG_ENGINE" + +/* -------------------------------------------------------------------- */ +/** \name Structs and static variables + * \{ */ + +typedef struct SELECTIDDEBUG_PassList { + struct DRWPass *debug_pass; +} SELECTIDDEBUG_PassList; + +typedef struct SELECTIDDEBUG_Data { + void *engine_type; + DRWViewportEmptyList *fbl; + DRWViewportEmptyList *txl; + SELECTIDDEBUG_PassList *psl; + DRWViewportEmptyList *stl; +} SELECTIDDEBUG_Data; + +static struct { + struct GPUShader *select_debug_sh; +} e_data = {{NULL}}; /* Engine data */ + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Engine Functions + * \{ */ + +static void select_debug_engine_init(void *vedata) +{ + SELECTIDDEBUG_PassList *psl = ((SELECTIDDEBUG_Data *)vedata)->psl; + + if (!e_data.select_debug_sh) { + e_data.select_debug_sh = DRW_shader_create_fullscreen( + "uniform usampler2D image;" + "in vec4 uvcoordsvar;" + "out vec4 fragColor;" + "void main() {" + " uint px = texture(image, uvcoordsvar.xy).r;" + " fragColor = vec4(1.0, 1.0, 1.0, 0.0);" + " if (px != 0u) {" + " fragColor.a = 1.0;" + " px &= 0x3Fu;" + " fragColor.r = ((px >> 0) & 0x3u) / float(0x3u);" + " fragColor.g = ((px >> 2) & 0x3u) / float(0x3u);" + " fragColor.b = ((px >> 4) & 0x3u) / float(0x3u);" + " }" + "}\n", + NULL); + } + + psl->debug_pass = DRW_pass_create("Debug Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA); + GPUTexture *texture_u32 = DRW_engine_select_texture_get(); + if (texture_u32) { + DRWShadingGroup *shgrp = DRW_shgroup_create(e_data.select_debug_sh, psl->debug_pass); + DRW_shgroup_uniform_texture(shgrp, "image", texture_u32); + DRW_shgroup_call_procedural_triangles(shgrp, NULL, 1); + } +} + +static void select_debug_draw_scene(void *vedata) +{ + SELECTIDDEBUG_PassList *psl = ((SELECTIDDEBUG_Data *)vedata)->psl; + DRW_draw_pass(psl->debug_pass); +} + +static void select_debug_engine_free(void) +{ + DRW_SHADER_FREE_SAFE(e_data.select_debug_sh); +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name Engine Type + * \{ */ + +static const DrawEngineDataSize select_debug_data_size = DRW_VIEWPORT_DATA_SIZE( + SELECTIDDEBUG_Data); + +DrawEngineType draw_engine_debug_select_type = { + NULL, + NULL, + N_("Select ID Debug"), + &select_debug_data_size, + &select_debug_engine_init, + &select_debug_engine_free, + NULL, + NULL, + NULL, + &select_debug_draw_scene, + NULL, + NULL, + NULL, + NULL, +}; + +/** \} */ + +#undef SELECT_DEBUG_ENGINE diff --git a/source/blender/draw/engines/select/select_engine.h b/source/blender/draw/engines/select/select_engine.h index 2b35cf6bee5..d6192103178 100644 --- a/source/blender/draw/engines/select/select_engine.h +++ b/source/blender/draw/engines/select/select_engine.h @@ -22,9 +22,15 @@ #pragma once +/* select_engine.c */ extern DrawEngineType draw_engine_select_type; extern RenderEngineType DRW_engine_viewport_select_type; +#ifdef WITH_DRAW_DEBUG +/* select_debug_engine.c */ +extern DrawEngineType draw_engine_debug_select_type; +#endif + struct SELECTID_Context *DRW_select_engine_context_get(void); struct GPUFrameBuffer *DRW_engine_select_framebuffer_get(void); |