From 795e839d3b3ab473677624a22ae791cb6c82482d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 27 Apr 2017 02:49:13 +1000 Subject: Cleanup: rename select engine -> basic This is used by depth drawing too and had no selection specific code. --- source/blender/draw/CMakeLists.txt | 4 +- source/blender/draw/engines/basic/basic_engine.c | 258 +++++++++++++++++++++ source/blender/draw/engines/basic/basic_engine.h | 31 +++ source/blender/draw/engines/select/select_engine.c | 249 -------------------- source/blender/draw/engines/select/select_engine.h | 31 --- source/blender/draw/intern/draw_manager.c | 13 +- 6 files changed, 299 insertions(+), 287 deletions(-) create mode 100644 source/blender/draw/engines/basic/basic_engine.c create mode 100644 source/blender/draw/engines/basic/basic_engine.h delete mode 100644 source/blender/draw/engines/select/select_engine.c delete mode 100644 source/blender/draw/engines/select/select_engine.h (limited to 'source') diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index d0e6002bb22..8502b34651c 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -73,8 +73,8 @@ set(SRC engines/eevee/eevee_probes.c engines/eevee/eevee_private.h - engines/select/select_engine.c - engines/select/select_engine.h + engines/basic/basic_engine.c + engines/basic/basic_engine.h modes/object_mode.c modes/edit_armature_mode.c diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c new file mode 100644 index 00000000000..17028e3ac2a --- /dev/null +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -0,0 +1,258 @@ +/* + * Copyright 2016, Blender Foundation. + * + * 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. + * + * Contributor(s): Blender Institute + * + */ + +/** \file basic_engine.h + * \ingroup draw_engine + * + * Simple engine for drawing color and/or depth. + * When we only need simple flat shaders. + */ + +#include "DRW_render.h" + +#include "BKE_icons.h" +#include "BKE_idprop.h" +#include "BKE_main.h" + +#include "GPU_shader.h" + +#include "basic_engine.h" +/* Shaders */ + +#define BASIC_ENGINE "BLENDER_BASIC" + +/* we may want this later? */ +#define USE_DEPTH + +/* *********** LISTS *********** */ + +/* GPUViewport.storage + * Is freed everytime the viewport engine changes */ +typedef struct BASIC_Storage { + int dummy; +} BASIC_Storage; + +typedef struct BASIC_StorageList { + struct BASIC_Storage *storage; + struct g_data *g_data; +} BASIC_StorageList; + +typedef struct BASIC_FramebufferList { + /* default */ + struct GPUFrameBuffer *default_fb; + /* engine specific */ +#ifdef USE_DEPTH + struct GPUFrameBuffer *dupli_depth; +#endif +} BASIC_FramebufferList; + +typedef struct BASIC_TextureList { + /* default */ + struct GPUTexture *color; +#ifdef USE_DEPTH + struct GPUTexture *depth; + /* engine specific */ + struct GPUTexture *depth_dup; +#endif +} BASIC_TextureList; + +typedef struct BASIC_PassList { +#ifdef USE_DEPTH + struct DRWPass *depth_pass; + struct DRWPass *depth_pass_cull; +#endif + struct DRWPass *color_pass; + struct g_data *g_data; +} BASIC_PassList; + +typedef struct BASIC_Data { + void *engine_type; + BASIC_FramebufferList *fbl; + BASIC_TextureList *txl; + BASIC_PassList *psl; + BASIC_StorageList *stl; +} BASIC_Data; + +/* *********** STATIC *********** */ + +static struct { +#ifdef USE_DEPTH + /* Depth Pre Pass */ + struct GPUShader *depth_sh; +#endif + /* Shading Pass */ + struct GPUShader *color_sh; +} e_data = {NULL}; /* Engine data */ + +typedef struct g_data { +#ifdef USE_DEPTH + DRWShadingGroup *depth_shgrp; + DRWShadingGroup *depth_shgrp_cull; +#endif + DRWShadingGroup *color_shgrp; +} g_data; /* Transient data */ + +/* Functions */ + +static void BASIC_engine_init(void *vedata) +{ + BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; + BASIC_TextureList *txl = ((BASIC_Data *)vedata)->txl; + BASIC_FramebufferList *fbl = ((BASIC_Data *)vedata)->fbl; + +#ifdef USE_DEPTH + /* Depth prepass */ + if (!e_data.depth_sh) { + e_data.depth_sh = DRW_shader_create_3D_depth_only(); + } +#endif + + /* Shading pass */ + if (!e_data.color_sh) { + e_data.color_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + } + + if (!stl->storage) { + stl->storage = MEM_callocN(sizeof(BASIC_Storage), "BASIC_Storage"); + } + +#ifdef USE_DEPTH + if (DRW_state_is_fbo()) { + const float *viewport_size = DRW_viewport_size_get(); + DRWFboTexture tex = {&txl->depth_dup, DRW_BUF_DEPTH_24, 0}; + DRW_framebuffer_init(&fbl->dupli_depth, + (int)viewport_size[0], (int)viewport_size[1], + &tex, 1); + } +#endif +} + +static void BASIC_cache_init(void *vedata) +{ + BASIC_PassList *psl = ((BASIC_Data *)vedata)->psl; + BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; + + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } + +#ifdef USE_DEPTH + /* Depth Pass */ + { + psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); + stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + + psl->depth_pass_cull = DRW_pass_create( + "Depth Pass Cull", + DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); + stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + } +#endif + + /* Color Pass */ + { + psl->color_pass = DRW_pass_create("Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL); + stl->g_data->color_shgrp = DRW_shgroup_create(e_data.color_sh, psl->color_pass); + } +} + +static void BASIC_cache_populate(void *vedata, Object *ob) +{ + BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; + + if (!DRW_is_object_renderable(ob)) + return; + + struct Batch *geom = DRW_cache_object_surface_get(ob); + if (geom) { + bool do_cull = false; /* TODO (we probably wan't to take this from the viewport?) */ +#ifdef USE_DEPTH + /* Depth Prepass */ + DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat); +#endif + /* Shading */ + DRW_shgroup_call_add(stl->g_data->color_shgrp, geom, ob->obmat); + } +} + +static void BASIC_cache_finish(void *vedata) +{ + BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl; + + UNUSED_VARS(stl); +} + +static void BASIC_draw_scene(void *vedata) +{ + + BASIC_PassList *psl = ((BASIC_Data *)vedata)->psl; + BASIC_FramebufferList *fbl = ((BASIC_Data *)vedata)->fbl; + DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); + +#ifdef USE_DEPTH + /* Pass 1 : Depth pre-pass */ + DRW_draw_pass(psl->depth_pass); + DRW_draw_pass(psl->depth_pass_cull); + + /* Pass 2 : Duplicate depth */ + /* Unless we go for deferred shading we need this to avoid manual depth test and artifacts */ + if (DRW_state_is_fbo()) { + DRW_framebuffer_blit(dfbl->default_fb, fbl->dupli_depth, true); + } +#endif + + /* Pass 3 : Shading */ + DRW_draw_pass(psl->color_pass); +} + +static void BASIC_engine_free(void) +{ + /* all shaders are builtin */ +} + +static const DrawEngineDataSize BASIC_data_size = DRW_VIEWPORT_DATA_SIZE(BASIC_Data); + +DrawEngineType draw_engine_basic_type = { + NULL, NULL, + N_("Basic"), + &BASIC_data_size, + &BASIC_engine_init, + &BASIC_engine_free, + &BASIC_cache_init, + &BASIC_cache_populate, + &BASIC_cache_finish, + NULL, + &BASIC_draw_scene +}; + +/* Note: currently unused, we may want to register so we can see this when debugging the view. */ + +RenderEngineType DRW_engine_viewport_basic_type = { + NULL, NULL, + BASIC_ENGINE, N_("Basic"), RE_INTERNAL | RE_USE_OGL_PIPELINE, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, + &draw_engine_basic_type, + {NULL, NULL, NULL} +}; + + +#undef BASIC_ENGINE diff --git a/source/blender/draw/engines/basic/basic_engine.h b/source/blender/draw/engines/basic/basic_engine.h new file mode 100644 index 00000000000..d1daa30b89f --- /dev/null +++ b/source/blender/draw/engines/basic/basic_engine.h @@ -0,0 +1,31 @@ +/* + * Copyright 2016, Blender Foundation. + * + * 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. + * + * Contributor(s): Blender Institute + * + */ + +/** \file basic_engine.h + * \ingroup draw_engine + */ + +#ifndef __BASIC_ENGINE_H__ +#define __BASIC_ENGINE_H__ + +extern RenderEngineType DRW_engine_viewport_basic_type; + +#endif /* __SELECT_ENGINE_H__ */ diff --git a/source/blender/draw/engines/select/select_engine.c b/source/blender/draw/engines/select/select_engine.c deleted file mode 100644 index 6687a7be927..00000000000 --- a/source/blender/draw/engines/select/select_engine.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2016, Blender Foundation. - * - * 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. - * - * Contributor(s): Blender Institute - * - */ - -#include "DRW_render.h" - -#include "BKE_icons.h" -#include "BKE_idprop.h" -#include "BKE_main.h" - -#include "GPU_shader.h" - -#include "select_engine.h" -/* Shaders */ - -#define SELECT_ENGINE "BLENDER_SELECT" - -/* we may want this later? */ -#define USE_DEPTH - -/* *********** LISTS *********** */ - -/* GPUViewport.storage - * Is freed everytime the viewport engine changes */ -typedef struct SELECT_Storage { - int dummy; -} SELECT_Storage; - -typedef struct SELECT_StorageList { - struct SELECT_Storage *storage; - struct g_data *g_data; -} SELECT_StorageList; - -typedef struct SELECT_FramebufferList { - /* default */ - struct GPUFrameBuffer *default_fb; - /* engine specific */ -#ifdef USE_DEPTH - struct GPUFrameBuffer *dupli_depth; -#endif -} SELECT_FramebufferList; - -typedef struct SELECT_TextureList { - /* default */ - struct GPUTexture *color; -#ifdef USE_DEPTH - struct GPUTexture *depth; - /* engine specific */ - struct GPUTexture *depth_dup; -#endif -} SELECT_TextureList; - -typedef struct SELECT_PassList { -#ifdef USE_DEPTH - struct DRWPass *depth_pass; - struct DRWPass *depth_pass_cull; -#endif - struct DRWPass *color_pass; - struct g_data *g_data; -} SELECT_PassList; - -typedef struct SELECT_Data { - void *engine_type; - SELECT_FramebufferList *fbl; - SELECT_TextureList *txl; - SELECT_PassList *psl; - SELECT_StorageList *stl; -} SELECT_Data; - -/* *********** STATIC *********** */ - -static struct { -#ifdef USE_DEPTH - /* Depth Pre Pass */ - struct GPUShader *depth_sh; -#endif - /* Shading Pass */ - struct GPUShader *color_sh; -} e_data = {NULL}; /* Engine data */ - -typedef struct g_data { -#ifdef USE_DEPTH - DRWShadingGroup *depth_shgrp; - DRWShadingGroup *depth_shgrp_cull; -#endif - DRWShadingGroup *color_shgrp; -} g_data; /* Transient data */ - -/* Functions */ - -static void SELECT_engine_init(void *vedata) -{ - SELECT_StorageList *stl = ((SELECT_Data *)vedata)->stl; - SELECT_TextureList *txl = ((SELECT_Data *)vedata)->txl; - SELECT_FramebufferList *fbl = ((SELECT_Data *)vedata)->fbl; - -#ifdef USE_DEPTH - /* Depth prepass */ - if (!e_data.depth_sh) { - e_data.depth_sh = DRW_shader_create_3D_depth_only(); - } -#endif - - /* Shading pass */ - if (!e_data.color_sh) { - e_data.color_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); - } - - if (!stl->storage) { - stl->storage = MEM_callocN(sizeof(SELECT_Storage), "SELECT_Storage"); - } - -#ifdef USE_DEPTH - if (DRW_state_is_fbo()) { - const float *viewport_size = DRW_viewport_size_get(); - DRWFboTexture tex = {&txl->depth_dup, DRW_BUF_DEPTH_24, 0}; - DRW_framebuffer_init(&fbl->dupli_depth, - (int)viewport_size[0], (int)viewport_size[1], - &tex, 1); - } -#endif -} - -static void SELECT_cache_init(void *vedata) -{ - SELECT_PassList *psl = ((SELECT_Data *)vedata)->psl; - SELECT_StorageList *stl = ((SELECT_Data *)vedata)->stl; - - if (!stl->g_data) { - /* Alloc transient pointers */ - stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); - } - -#ifdef USE_DEPTH - /* Depth Pass */ - { - psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - - psl->depth_pass_cull = DRW_pass_create( - "Depth Pass Cull", - DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - } -#endif - - /* Color Pass */ - { - psl->color_pass = DRW_pass_create("Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL); - stl->g_data->color_shgrp = DRW_shgroup_create(e_data.color_sh, psl->color_pass); - } -} - -static void SELECT_cache_populate(void *vedata, Object *ob) -{ - SELECT_StorageList *stl = ((SELECT_Data *)vedata)->stl; - - if (!DRW_is_object_renderable(ob)) - return; - - struct Batch *geom = DRW_cache_object_surface_get(ob); - if (geom) { - bool do_cull = false; /* TODO (we probably wan't to take this from the viewport?) */ -#ifdef USE_DEPTH - /* Depth Prepass */ - DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat); -#endif - /* Shading */ - DRW_shgroup_call_add(stl->g_data->color_shgrp, geom, ob->obmat); - } -} - -static void SELECT_cache_finish(void *vedata) -{ - SELECT_StorageList *stl = ((SELECT_Data *)vedata)->stl; - - UNUSED_VARS(stl); -} - -static void SELECT_draw_scene(void *vedata) -{ - - SELECT_PassList *psl = ((SELECT_Data *)vedata)->psl; - SELECT_FramebufferList *fbl = ((SELECT_Data *)vedata)->fbl; - DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); - -#ifdef USE_DEPTH - /* Pass 1 : Depth pre-pass */ - DRW_draw_pass(psl->depth_pass); - DRW_draw_pass(psl->depth_pass_cull); - - /* Pass 2 : Duplicate depth */ - /* Unless we go for deferred shading we need this to avoid manual depth test and artifacts */ - if (DRW_state_is_fbo()) { - DRW_framebuffer_blit(dfbl->default_fb, fbl->dupli_depth, true); - } -#endif - - /* Pass 3 : Shading */ - DRW_draw_pass(psl->color_pass); -} - -static void SELECT_engine_free(void) -{ - /* all shaders are builtin */ -} - -static const DrawEngineDataSize SELECT_data_size = DRW_VIEWPORT_DATA_SIZE(SELECT_Data); - -DrawEngineType draw_engine_select_type = { - NULL, NULL, - N_("SelectID"), - &SELECT_data_size, - &SELECT_engine_init, - &SELECT_engine_free, - &SELECT_cache_init, - &SELECT_cache_populate, - &SELECT_cache_finish, - NULL, - &SELECT_draw_scene -}; - -RenderEngineType DRW_engine_viewport_select_type = { - NULL, NULL, - SELECT_ENGINE, N_("SelectID"), RE_INTERNAL | RE_USE_OGL_PIPELINE, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &draw_engine_select_type, - {NULL, NULL, NULL} -}; - - -#undef SELECT_ENGINE diff --git a/source/blender/draw/engines/select/select_engine.h b/source/blender/draw/engines/select/select_engine.h deleted file mode 100644 index 653ada7e82f..00000000000 --- a/source/blender/draw/engines/select/select_engine.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2016, Blender Foundation. - * - * 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. - * - * Contributor(s): Blender Institute - * - */ - -/** \file select_engine.h - * \ingroup draw_engine - */ - -#ifndef __SELECT_ENGINE_H__ -#define __SELECT_ENGINE_H__ - -extern RenderEngineType DRW_engine_viewport_select_type; - -#endif /* __SELECT_ENGINE_H__ */ diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index b380ec671ef..a9b3da13b60 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -71,7 +71,7 @@ #include "engines/clay/clay_engine.h" #include "engines/eevee/eevee_engine.h" -#include "engines/select/select_engine.h" +#include "engines/basic/basic_engine.h" #include "DEG_depsgraph.h" #include "DEG_depsgraph_query.h" @@ -1848,9 +1848,12 @@ static void DRW_engines_enable_from_mode(int mode) } } -static void DRW_engines_enable_select(void) +/** + * Use for select and depth-drawing. + */ +static void DRW_engines_enable_basic(void) { - use_drw_engine(DRW_engine_viewport_select_type.draw_engine); + use_drw_engine(DRW_engine_viewport_basic_type.draw_engine); } static void DRW_engines_enable(const bContext *C) @@ -2138,7 +2141,7 @@ void DRW_draw_select_loop( DRW_engines_enable_from_mode(obedit_mode); } else { - DRW_engines_enable_select(); + DRW_engines_enable_basic(); DRW_engines_enable_from_object_mode(); } @@ -2224,7 +2227,7 @@ void DRW_draw_depth_loop( /* Get list of enabled engines */ { - DRW_engines_enable_select(); + DRW_engines_enable_basic(); DRW_engines_enable_from_object_mode(); } -- cgit v1.2.3