Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2018-04-17 23:11:56 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-04-17 23:11:56 +0300
commit3f762dd76409a285bc0f40df0ff8a6bae6d065b0 (patch)
tree9fbaf7813ea25c34c3dfa0a76d876dec30992f05 /source/blender
parentdd8d55b31ac693aed0510551d080bbaca9c3cb7e (diff)
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
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/CMakeLists.txt3
-rw-r--r--source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl (renamed from source/blender/draw/engines/workbench/shaders/solid_frag.glsl)0
-rw-r--r--source/blender/draw/engines/workbench/solid_flat_mode.c116
-rw-r--r--source/blender/draw/engines/workbench/workbench_materials_solid.c143
-rw-r--r--source/blender/draw/intern/draw_manager.c21
-rw-r--r--source/blender/makesdna/DNA_object_types.h6
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h8
-rw-r--r--source/blender/makesrna/intern/rna_space.c25
8 files changed, 143 insertions, 179 deletions
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_frag.glsl b/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl
index 3a6700bdadc..3a6700bdadc 100644
--- a/source/blender/draw/engines/workbench/shaders/solid_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/solid_flat_frag.glsl
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",