From 3f762dd76409a285bc0f40df0ff8a6bae6d065b0 Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 17 Apr 2018 22:11:56 +0200 Subject: Workbench: clean up the viewport shading code - added the drawtype_solid, drawtype_wireframe, drawtype_texture to View3D - enabled workbench panels for important render engines - merged workbench_materials to solid_flat_mode. All draw modes will get its own fast implementation in the workbench --- source/blender/draw/CMakeLists.txt | 3 +- .../engines/workbench/shaders/solid_flat_frag.glsl | 8 ++ .../draw/engines/workbench/shaders/solid_frag.glsl | 8 -- .../draw/engines/workbench/solid_flat_mode.c | 116 +++++++++++++---- .../engines/workbench/workbench_materials_solid.c | 143 --------------------- source/blender/draw/intern/draw_manager.c | 21 ++- source/blender/makesdna/DNA_object_types.h | 6 + source/blender/makesdna/DNA_view3d_types.h | 8 +- source/blender/makesrna/intern/rna_space.c | 25 ++++ 9 files changed, 151 insertions(+), 187 deletions(-) create mode 100644 source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl delete mode 100644 source/blender/draw/engines/workbench/shaders/solid_frag.glsl delete mode 100644 source/blender/draw/engines/workbench/workbench_materials_solid.c (limited to 'source') diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt index b22c97e352c..9fae5a6c3af 100644 --- a/source/blender/draw/CMakeLists.txt +++ b/source/blender/draw/CMakeLists.txt @@ -104,7 +104,6 @@ set(SRC engines/eevee/eevee_subsurface.c engines/eevee/eevee_temporal_sampling.c engines/eevee/eevee_volumes.c - engines/workbench/workbench_materials_solid.c engines/workbench/workbench_engine.c engines/workbench/solid_flat_mode.c engines/external/external_engine.c @@ -206,7 +205,7 @@ data_to_c_simple(engines/eevee/shaders/volumetric_resolve_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC) data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC) -data_to_c_simple(engines/workbench/shaders/solid_frag.glsl SRC) +data_to_c_simple(engines/workbench/shaders/solid_flat_frag.glsl SRC) data_to_c_simple(engines/workbench/shaders/workbench_vert.glsl SRC) data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC) diff --git a/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl new file mode 100644 index 00000000000..3a6700bdadc --- /dev/null +++ b/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl @@ -0,0 +1,8 @@ +uniform vec3 color; + +out vec4 fragColor; + +void main() +{ + fragColor = vec4(color, 1.0); +} diff --git a/source/blender/draw/engines/workbench/shaders/solid_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_frag.glsl deleted file mode 100644 index 3a6700bdadc..00000000000 --- a/source/blender/draw/engines/workbench/shaders/solid_frag.glsl +++ /dev/null @@ -1,8 +0,0 @@ -uniform vec3 color; - -out vec4 fragColor; - -void main() -{ - fragColor = vec4(color, 1.0); -} diff --git a/source/blender/draw/engines/workbench/solid_flat_mode.c b/source/blender/draw/engines/workbench/solid_flat_mode.c index 79f1fbd170d..e8d2c61152e 100644 --- a/source/blender/draw/engines/workbench/solid_flat_mode.c +++ b/source/blender/draw/engines/workbench/solid_flat_mode.c @@ -19,7 +19,7 @@ * */ -/** \file workbench_engine.c +/** \file solid_flat_mode.c * \ingroup draw_engine * * Simple engine for drawing color and/or depth. @@ -28,49 +28,112 @@ #include "DRW_render.h" -#include "BKE_icons.h" -#include "BKE_idprop.h" -#include "BKE_main.h" - #include "GPU_shader.h" -#include "workbench_engine.h" #include "workbench_private.h" /* Shaders */ -#define WORKBENCH_ENGINE "BLENDER_WORKBENCH" +extern char datatoc_solid_flat_frag_glsl[]; +extern char datatoc_workbench_vert_glsl[]; + +/* *********** STATIC *********** */ +static struct { + struct GPUShader *depth_sh; + + /* Shading Pass */ + struct GPUShader *solid_sh; + +} e_data = {NULL}; /* Functions */ -static void workbench_engine_init(void *UNUSED(vedata)) +static void workbench_solid_flat_engine_init(void *UNUSED(vedata)) { - workbench_solid_materials_init(); + if (!e_data.depth_sh) { + /* Depth pass */ + e_data.depth_sh = DRW_shader_create_3D_depth_only(); + + /* Shading pass */ + e_data.solid_sh = DRW_shader_create( + datatoc_workbench_vert_glsl, NULL, datatoc_solid_flat_frag_glsl, "\n"); + } } -static void workbench_cache_init(void *vedata) +static void workbench_solid_flat_cache_init(void *vedata) { - workbench_solid_materials_cache_init((WORKBENCH_Data *)vedata); + + WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; + WORKBENCH_PassList *psl = data->psl; + WORKBENCH_StorageList *stl = data->stl; + + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); + } + + /* Depth Pass */ + { + int state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; + psl->depth_pass = DRW_pass_create("Depth Pass", state); + stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + } + + /* Solid Pass */ + { + int state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + psl->solid_pass = DRW_pass_create("Solid Pass", state); + } + + /* Flat Lighting Pass */ + { + int state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; + psl->lighting_pass = DRW_pass_create("Lighting Pass", state); + } } -static void workbench_cache_populate(void *vedata, Object *ob) +static void workbench_solid_flat_cache_populate(void *vedata, Object *ob) { - workbench_solid_materials_cache_populate((WORKBENCH_Data *)vedata, ob); + WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; + + WORKBENCH_PassList *psl = data->psl; + WORKBENCH_StorageList *stl = data->stl; + + IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_WORKBENCH); + const float* color = BKE_collection_engine_property_value_get_float_array(props, "object_color"); + + if (!DRW_object_is_renderable(ob)) + return; + + struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob); + DRWShadingGroup *grp; + if (geom) { + /* Depth */ + DRW_shgroup_call_add(stl->g_data->depth_shgrp, geom, ob->obmat); + + /* Solid */ + grp = DRW_shgroup_create(e_data.solid_sh, psl->solid_pass); + DRW_shgroup_uniform_vec3(grp, "color", color, 1); + DRW_shgroup_call_add(grp, geom, ob->obmat); + } } -static void workbench_cache_finish(void *vedata) +static void workbench_solid_flat_cache_finish(void *UNUSED(vedata)) { - workbench_solid_materials_cache_finish((WORKBENCH_Data *)vedata); } -static void workbench_draw_scene(void *vedata) +static void workbench_solid_flat_draw_scene(void *vedata) { - workbench_solid_materials_draw_scene((WORKBENCH_Data *)vedata); + WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; + WORKBENCH_PassList *psl = ((WORKBENCH_Data *)vedata)->psl; + + DRW_draw_pass(psl->depth_pass); + DRW_draw_pass(psl->solid_pass); } -static void workbench_engine_free(void) +static void workbench_solid_flat_engine_free(void) { - workbench_solid_materials_free(); + DRW_SHADER_FREE_SAFE(e_data.solid_sh); } static const DrawEngineDataSize workbench_data_size = DRW_VIEWPORT_DATA_SIZE(WORKBENCH_Data); @@ -79,17 +142,14 @@ DrawEngineType draw_engine_workbench_solid_flat = { NULL, NULL, N_("Workbench"), &workbench_data_size, - &workbench_engine_init, - &workbench_engine_free, - &workbench_cache_init, - &workbench_cache_populate, - &workbench_cache_finish, + &workbench_solid_flat_engine_init, + &workbench_solid_flat_engine_free, + &workbench_solid_flat_cache_init, + &workbench_solid_flat_cache_populate, + &workbench_solid_flat_cache_finish, NULL, - &workbench_draw_scene, + &workbench_solid_flat_draw_scene, NULL, NULL, NULL, }; - - -#undef WORKBENCH_ENGINE diff --git a/source/blender/draw/engines/workbench/workbench_materials_solid.c b/source/blender/draw/engines/workbench/workbench_materials_solid.c deleted file mode 100644 index 6fb26609e90..00000000000 --- a/source/blender/draw/engines/workbench/workbench_materials_solid.c +++ /dev/null @@ -1,143 +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 workbench_materials.c - * \ingroup draw_engine - */ - -#include "workbench_private.h" -#include "GPU_shader.h" - -extern char datatoc_solid_frag_glsl[]; -extern char datatoc_flat_lighting_frag_glsl[]; -extern char datatoc_workbench_vert_glsl[]; - -/* *********** STATIC *********** */ -static struct { - struct GPUShader *depth_sh; - - /* Shading Pass */ - struct GPUShader *solid_sh; - -} e_data = {NULL}; - - -void workbench_solid_materials_init() { - if (!e_data.depth_sh) { - /* Depth pass */ - e_data.depth_sh = DRW_shader_create_3D_depth_only(); - - /* Shading pass */ - e_data.solid_sh = DRW_shader_create( - datatoc_workbench_vert_glsl, NULL, datatoc_solid_frag_glsl, "\n"); - } -} - -void workbench_solid_materials_cache_init(WORKBENCH_Data* vedata) -{ - WORKBENCH_PassList *psl = vedata->psl; - WORKBENCH_StorageList *stl = vedata->stl; - - if (!stl->g_data) { - /* Alloc transient pointers */ - stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); - } - - /* Depth Pass */ - { - int state = DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS; - psl->depth_pass = DRW_pass_create("Depth Pass", state); - stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - } - - /* Solid Pass */ - { - int state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - psl->solid_pass = DRW_pass_create("Solid Pass", state); - } - - /* Flat Lighting Pass */ - { - int state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL; - psl->lighting_pass = DRW_pass_create("Lighting Pass", state); - } -} - - void workbench_solid_materials_cache_populate(WORKBENCH_Data* vedata, Object *ob) -{ - WORKBENCH_PassList *psl = vedata->psl; - WORKBENCH_StorageList *stl = vedata->stl; - - IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_WORKBENCH); - const float* color = BKE_collection_engine_property_value_get_float_array(props, "object_color"); - - if (!DRW_object_is_renderable(ob)) - return; - - struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob); - DRWShadingGroup *grp; - if (geom) { - /* Depth */ - DRW_shgroup_call_add(stl->g_data->depth_shgrp, geom, ob->obmat); - - /* Solid */ - grp = DRW_shgroup_create(e_data.solid_sh, psl->solid_pass); - DRW_shgroup_uniform_vec3(grp, "color", color, 1); - DRW_shgroup_call_add(grp, geom, ob->obmat); - - /* Lighting */ - // if studio lighting - - } -} - -void workbench_solid_materials_cache_finish(WORKBENCH_Data *vedata) -{ - WORKBENCH_StorageList *stl = ((WORKBENCH_Data *)vedata)->stl; - - UNUSED_VARS(stl); -} - -void workbench_solid_materials_draw_scene(WORKBENCH_Data *vedata) -{ - - WORKBENCH_PassList *psl = ((WORKBENCH_Data *)vedata)->psl; -// DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); - - DRW_draw_pass(psl->depth_pass); -// if (studio lighting) { -// DRW_draw_pass(psl->lighting_pass); -// DRW_draw_pass(psl->solid_pass); -// TODO: COMPOSITE -// } - -// if (flat lighting) { - DRW_draw_pass(psl->solid_pass); -// } -} - -void workbench_solid_materials_free(void) -{ - DRW_SHADER_FREE_SAFE(e_data.solid_sh); -} - - - diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index c0a5b7e41fc..84aff8be786 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -895,11 +895,20 @@ static void drw_engines_enable_external(void) /* TODO revisit this when proper layering is implemented */ /* Gather all draw engines needed and store them in DST.enabled_engines * That also define the rendering order of engines */ -static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int draw_mode) +static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int draw_mode, + int UNUSED(draw_mode_wireframe), int draw_mode_solid, int UNUSED(draw_mode_texture)) { switch (draw_mode) { + case OB_WIRE: + break; + case OB_SOLID: - use_drw_engine(&draw_engine_workbench_solid_flat); + if (draw_mode_solid == OB_LIGHTING_FLAT) { + use_drw_engine(&draw_engine_workbench_solid_flat); + } + break; + + case OB_TEXTURE: break; default: @@ -984,9 +993,13 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t { Object *obact = OBACT(view_layer); const int mode = CTX_data_mode_enum_ex(DST.draw_ctx.object_edit, obact, DST.draw_ctx.object_mode); - const int draw_mode = DST.draw_ctx.v3d->drawtype; + View3D * v3d = DST.draw_ctx.v3d; + const int draw_mode = v3d->drawtype; + const int draw_mode_wireframe = v3d->drawtype_wireframe; + const int draw_mode_solid = v3d->drawtype_solid; + const int draw_mode_texture = v3d->drawtype_texture; - drw_engines_enable_from_engine(engine_type, draw_mode); + drw_engines_enable_from_engine(engine_type, draw_mode, draw_mode_wireframe, draw_mode_solid, draw_mode_texture); if (DRW_state_draw_support()) { drw_engines_enable_from_object_mode(); diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index bb17b10b299..e292e1a8456 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -446,6 +446,12 @@ enum { OB_PAINT = 100, /* temporary used in draw code */ }; +enum { + OB_LIGHTING_FLAT = 0, + OB_LIGHTING_STUDIO = 1, + OB_LIGHTING_SCENE = 2 +}; + /* dtx: flags (short) */ enum { OB_DRAWBOUNDOX = 1 << 0, diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index cc0389ec568..70d0d8c9d4d 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -238,8 +238,12 @@ typedef struct View3D { * Runtime-only, set in the rendered viewport toggle operator. */ short prev_drawtype; - short pad1; - float pad2; + /* drawtype subtype (visibility) used when drawtype == OB_WIRE */ + short drawtype_wireframe; + /* drawtype subtype (lighting) used when drawtype == OB_SOLID */ + short drawtype_solid; + /* drawtype subtype (lighting) used when drawtype == OB_TEXTURE */ + short drawtype_texture; View3DDebug debug; } View3D; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index fb9dae2badc..d983f529a48 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -194,6 +194,19 @@ const EnumPropertyItem rna_enum_viewport_shade_items[] = { {0, NULL, 0, NULL, NULL} }; +const EnumPropertyItem rna_enum_viewport_shade_solid_items[] = { + {OB_LIGHTING_FLAT, "FLAT", ICON_SOLID, "Flat Lighting", "Display using flat lighting"}, + {OB_LIGHTING_STUDIO, "STUDIO", ICON_SOLID, "Studio Lighting", "Display using studio lighting"}, + // {OB_LIGHTING_SCENE, "SCENE", ICON_SOLID, "Scene Lighting", "Display using scene lighting"}, + {0, NULL, 0, NULL, NULL} +}; +const EnumPropertyItem rna_enum_viewport_shade_texture_items[] = { + {OB_LIGHTING_FLAT, "FLAT", ICON_POTATO, "Flat Lighting", "Display using flat lighting"}, + {OB_LIGHTING_STUDIO, "STUDIO", ICON_POTATO, "Studio Lighting", "Display using studio lighting"}, + // {OB_LIGHTING_SCENE, "SCENE", ICON_POTATO, "Scene Lighting", "Display using scene lighting"}, + {0, NULL, 0, NULL, NULL} +}; + const EnumPropertyItem rna_enum_clip_editor_mode_items[] = { {SC_MODE_TRACKING, "TRACKING", ICON_ANIM_DATA, "Tracking", "Show tracking and solving tools"}, {SC_MODE_MASKEDIT, "MASK", ICON_MOD_MASK, "Mask", "Show mask editing tools"}, @@ -2373,6 +2386,18 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Viewport Shading", "Method to display/shade objects in the 3D View"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update"); + prop = RNA_def_property(srna, "viewport_shade_solid", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "drawtype_solid"); + RNA_def_property_enum_items(prop, rna_enum_viewport_shade_solid_items); + RNA_def_property_ui_text(prop, "Viewport Lighting (Solid)", "Lighting Method for Solid Viewport Shading"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update"); + + prop = RNA_def_property(srna, "viewport_shade_texture", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "drawtype_texture"); + RNA_def_property_enum_items(prop, rna_enum_viewport_shade_texture_items); + RNA_def_property_ui_text(prop, "Viewport Lighting (Texture)", "Lighting Method for Texture Viewport Shading"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update"); + prop = RNA_def_property(srna, "local_view", PROP_POINTER, PROP_NONE); RNA_def_property_pointer_sdna(prop, NULL, "localvd"); RNA_def_property_ui_text(prop, "Local View", -- cgit v1.2.3