From b0d5e74fcce929c649391a9f694ee39649a84e1c Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 19 Apr 2018 12:44:37 +0200 Subject: Workbench: drawtype object color from collection to v3d Now every 3d view can have its own solid draw color setting --- .../scripts/startup/bl_ui/properties_collection.py | 3 +- release/scripts/startup/bl_ui/properties_render.py | 15 ---------- .../draw/engines/workbench/solid_flat_mode.c | 2 +- .../draw/engines/workbench/solid_studio_mode.c | 2 +- .../draw/engines/workbench/workbench_engine.c | 1 - .../draw/engines/workbench/workbench_materials.c | 33 ++++++++++++++++++---- .../draw/engines/workbench/workbench_private.h | 8 ++++-- .../blender/editors/space_view3d/view3d_header.c | 1 + source/blender/makesdna/DNA_view3d_types.h | 3 ++ source/blender/makesrna/intern/rna_layer.c | 14 --------- source/blender/makesrna/intern/rna_space.c | 26 ++++++++++------- 11 files changed, 55 insertions(+), 53 deletions(-) diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py index 25b4664ab83..8d795681d4c 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -87,7 +87,7 @@ class COLLECTION_PT_clay_settings(CollectionButtonsPanel, Panel): class COLLECTION_PT_workbench_settings(CollectionButtonsPanel, Panel): - bl_label = "Workbench Settings" + bl_label = "Collection Settings" def draw(self, context): layout = self.layout @@ -96,7 +96,6 @@ class COLLECTION_PT_workbench_settings(CollectionButtonsPanel, Panel): collection_props = collection.engine_overrides['BLENDER_WORKBENCH'] col = layout.column() - col.template_override_property(collection_props, scene_props, "object_color_type") col.template_override_property(collection_props, scene_props, "object_color") diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index a0d7e9b1026..779a77cf7ca 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -898,20 +898,6 @@ class RENDER_PT_eevee_film(RenderButtonsPanel, Panel): col.prop(rd, "alpha_mode", text="Alpha") -class RENDER_PT_workbench_collection_settings(RenderButtonsPanel, Panel): - bl_label = "Workbench Settings" - COMPAT_ENGINES = {'BLENDER_WORKBENCH', 'BLENDER_EEVEE', 'CYCLES'} - - def draw(self, context): - layout = self.layout - props = context.scene.collection_properties['BLENDER_WORKBENCH'] - - col = layout.column() - col.prop(props, "object_color_type") - if props.object_color_type == 'COLLECTION': - col.prop(props, "object_color") - - classes = ( RENDER_MT_presets, RENDER_MT_ffmpeg_presets, @@ -941,7 +927,6 @@ classes = ( RENDER_PT_eevee_motion_blur, RENDER_PT_eevee_depth_of_field, RENDER_PT_eevee_bloom, - RENDER_PT_workbench_collection_settings, ) if __name__ == "__main__": # only for live edit. diff --git a/source/blender/draw/engines/workbench/solid_flat_mode.c b/source/blender/draw/engines/workbench/solid_flat_mode.c index 91557832388..e98783446d6 100644 --- a/source/blender/draw/engines/workbench/solid_flat_mode.c +++ b/source/blender/draw/engines/workbench/solid_flat_mode.c @@ -68,7 +68,7 @@ static void workbench_solid_flat_cache_init(void *vedata) static void workbench_solid_flat_cache_populate(void *vedata, Object *ob) { WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; - workbench_materials_solid_cache_populate(data, ob, V3D_LIGHTING_FLAT); + workbench_materials_solid_cache_populate(data, ob); } static void workbench_solid_flat_cache_finish(void *UNUSED(vedata)) diff --git a/source/blender/draw/engines/workbench/solid_studio_mode.c b/source/blender/draw/engines/workbench/solid_studio_mode.c index 37a6f1dd4fd..046ad38fa91 100644 --- a/source/blender/draw/engines/workbench/solid_studio_mode.c +++ b/source/blender/draw/engines/workbench/solid_studio_mode.c @@ -68,7 +68,7 @@ static void workbench_solid_studio_cache_init(void *vedata) static void workbench_solid_studio_cache_populate(void *vedata, Object *ob) { WORKBENCH_Data * data = (WORKBENCH_Data *)vedata; - workbench_materials_solid_cache_populate(data, ob, V3D_LIGHTING_STUDIO); + workbench_materials_solid_cache_populate(data, ob); } static void workbench_solid_studio_cache_finish(void *UNUSED(vedata)) diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index 5a2c70ce810..2b6c95e301f 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -49,7 +49,6 @@ static void workbench_layer_collection_settings_create(RenderEngine *UNUSED(engi props->type == IDP_GROUP && props->subtype == IDP_GROUP_SUB_ENGINE_RENDER); float default_object_color[3] = {1.0, 1.0, 1.0}; - BKE_collection_engine_property_add_int(props, "object_color_type", V3D_OBJECT_COLOR_COLLECTION); BKE_collection_engine_property_add_float_array(props, "object_color", default_object_color, 3); } diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 1c80d9c3354..1338fccf61f 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -55,11 +55,10 @@ static uint get_material_hash(const float color[3]) return r + g * 4096 + b * 4096 * 4096; } -static const float* get_material_solid_color(Object *ob) +static const float* get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob) { IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_WORKBENCH); - int object_color_option = BKE_collection_engine_property_value_get_int(props, "object_color_type"); - switch (object_color_option) + switch (wpd->drawtype_object_color) { default: case V3D_OBJECT_COLOR_COLLECTION: @@ -104,11 +103,33 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata) WORKBENCH_PassList *psl = vedata->psl; WORKBENCH_PrivateData *wpd = stl->g_data; + const DRWContextState *DCS = DRW_context_state_get(); + wpd->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); wpd->material_hash = BLI_ghash_ptr_new("Workbench material_hash"); + + View3D *v3d = DCS->v3d; + if (v3d) { + wpd->drawtype_object_color = v3d->drawtype_object_color; +#if 0 + /* TODO: switch implementation when OB_TEXTURE is implemented */ + switch (v3d->drawtype) { + default: + case OB_SOLID: + wpd->drawtype_lighting = v3d->drawtype_solid; + break; + } +#else + wpd->drawtype_lighting = v3d->drawtype_solid; +#endif + } + else { + wpd->drawtype_object_color = V3D_OBJECT_COLOR_COLLECTION; + wpd->drawtype_lighting = V3D_LIGHTING_STUDIO; + } } -void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob, int lighting_mode) +void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) { WORKBENCH_StorageList *stl = vedata->stl; WORKBENCH_PassList *psl = vedata->psl; @@ -124,9 +145,9 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob DRW_shgroup_call_add(stl->g_data->depth_shgrp, geom, ob->obmat); /* Solid */ - GPUShader *shader = lighting_mode == V3D_LIGHTING_FLAT?e_data.solid_flat_sh:e_data.solid_studio_sh; + GPUShader *shader = wpd->drawtype_lighting == V3D_LIGHTING_FLAT?e_data.solid_flat_sh:e_data.solid_studio_sh; - const float *color = get_material_solid_color(ob); + const float *color = get_material_solid_color(wpd, ob); uint hash = get_material_hash(color); material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash)); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index fe0180e3f79..b2d79ec39ee 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -52,10 +52,12 @@ typedef struct WORKBENCH_Data { typedef struct WORKBENCH_PrivateData { DRWShadingGroup *depth_shgrp; - + DRWShadingGroup *shadeless_shgrp; - + struct GHash *material_hash; + short drawtype_object_color; + short drawtype_lighting; } WORKBENCH_PrivateData; /* Transient data */ typedef struct WORKBENCH_MaterialData { @@ -80,6 +82,6 @@ void workbench_materials_engine_init(void); void workbench_materials_engine_free(void); void workbench_materials_draw_scene_finish(WORKBENCH_Data *vedata); void workbench_materials_cache_init(WORKBENCH_Data *vedata); -void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob, int lighting_mode); +void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob); #endif diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c index 563ff188f0d..1c154947c10 100644 --- a/source/blender/editors/space_view3d/view3d_header.c +++ b/source/blender/editors/space_view3d/view3d_header.c @@ -307,6 +307,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C) uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NONE); if (v3d->drawtype == OB_SOLID) { uiItemR(layout, &v3dptr, "viewport_shade_solid", 0, "", ICON_NONE); + uiItemR(layout, &v3dptr, "viewport_object_color_type", 0, "", ICON_NONE); } row = uiLayoutRow(layout, true); diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index ed42a2e8b71..18b5ab70196 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -252,6 +252,9 @@ typedef struct View3D { short drawtype_solid; /* drawtype subtype (lighting) used when drawtype == OB_TEXTURE */ short drawtype_texture; + /* how to draw objects when drawtype == OB_SOLID */ + short drawtype_object_color; + char pad5[6]; View3DDebug debug; } View3D; diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index 245f368ce30..4ccf5d8bc33 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -363,7 +363,6 @@ RNA_LAYER_ENGINE_CLAY_GET_SET_FLOAT(hair_brightness_randomness) /* workbench engine */ /* LayerCollection settings. */ RNA_LAYER_ENGINE_WORKBENCH_GET_SET_FLOAT_ARRAY(object_color, 3) -RNA_LAYER_ENGINE_WORKBENCH_GET_SET_INT(object_color_type) /* eevee engine */ /* ViewLayer settings. */ @@ -1673,24 +1672,11 @@ static void rna_def_layer_collection_engine_settings_workbench(BlenderRNA *brna) StructRNA *srna; PropertyRNA *prop; - static const EnumPropertyItem object_color_type_items[] = { - {V3D_OBJECT_COLOR_COLLECTION, "COLLECTION", 0, "Collection", ""}, - {V3D_OBJECT_COLOR_OBJECT, "OBJECT", 0, "Object", ""}, - {0, NULL, 0, NULL, NULL} - }; - srna = RNA_def_struct(brna, "LayerCollectionEngineSettingsWorkbench", "LayerCollectionSettings"); RNA_def_struct_ui_text(srna, "Collections Workbench Engine Settings", "Workbench specific settings for this collection"); RNA_define_verify_sdna(0); /* not in sdna */ - prop = RNA_def_property(srna, "object_color_type", PROP_ENUM, PROP_COLOR); - RNA_def_property_enum_funcs(prop, "rna_LayerEngineSettings_Workbench_object_color_type_get", "rna_LayerEngineSettings_Workbench_object_color_type_set", NULL); - RNA_def_property_enum_items(prop, object_color_type_items); - RNA_def_property_ui_text(prop, "Object Color", "Way colors are given to the Object"); - RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_update(prop, 0, "rna_LayerCollectionEngineSettings_update"); - prop = RNA_def_property(srna, "object_color", PROP_FLOAT, PROP_COLOR); RNA_def_property_array(prop, 3); RNA_def_property_float_funcs(prop, "rna_LayerEngineSettings_Workbench_object_color_get", diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 80d23e14949..1937bb34a5d 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -182,16 +182,16 @@ const EnumPropertyItem rna_enum_viewport_shade_items[] = { {0, NULL, 0, NULL, NULL} }; -const EnumPropertyItem rna_enum_viewport_shade_solid_items[] = { - {V3D_LIGHTING_FLAT, "FLAT", ICON_SOLID, "Flat Lighting", "Display using flat lighting"}, - {V3D_LIGHTING_STUDIO, "STUDIO", ICON_SOLID, "Studio Lighting", "Display using studio lighting"}, - /* {V3D_LIGHTING_SCENE, "SCENE", ICON_SOLID, "Scene Lighting", "Display using scene lighting"}, */ +const EnumPropertyItem rna_enum_viewport_lighting_items[] = { + {V3D_LIGHTING_FLAT, "FLAT", 0, "Flat Lighting", "Display using flat lighting"}, + {V3D_LIGHTING_STUDIO, "STUDIO", 0, "Studio Lighting", "Display using studio lighting"}, + /* {V3D_LIGHTING_SCENE, "SCENE", 0, "Scene Lighting", "Display using scene lighting"}, */ {0, NULL, 0, NULL, NULL} }; -const EnumPropertyItem rna_enum_viewport_shade_texture_items[] = { - {V3D_LIGHTING_FLAT, "FLAT", ICON_POTATO, "Flat Lighting", "Display using flat lighting"}, - {V3D_LIGHTING_STUDIO, "STUDIO", ICON_POTATO, "Studio Lighting", "Display using studio lighting"}, - /* {V3D_LIGHTING_SCENE, "SCENE", ICON_POTATO, "Scene Lighting", "Display using scene lighting"}, */ + +const EnumPropertyItem rna_enum_viewport_object_color_type_items[] = { + {V3D_OBJECT_COLOR_COLLECTION, "COLLECTION", 0, "Collection", ""}, + {V3D_OBJECT_COLOR_OBJECT, "OBJECT", 0, "Object", ""}, {0, NULL, 0, NULL, NULL} }; @@ -2332,13 +2332,19 @@ static void rna_def_space_view3d(BlenderRNA *brna) 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_enum_items(prop, rna_enum_viewport_lighting_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_object_color_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "drawtype_object_color"); + RNA_def_property_enum_items(prop, rna_enum_viewport_object_color_type_items); + RNA_def_property_ui_text(prop, "Viewport Color", "Type of Color Distribution for Objects"); + 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_enum_items(prop, rna_enum_viewport_lighting_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"); -- cgit v1.2.3