diff options
14 files changed, 105 insertions, 101 deletions
diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py index e0ac7786b50..25b4664ab83 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -96,6 +96,7 @@ 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 9b9cfee5dc7..a0d7e9b1026 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -907,7 +907,9 @@ class RENDER_PT_workbench_collection_settings(RenderButtonsPanel, Panel): props = context.scene.collection_properties['BLENDER_WORKBENCH'] col = layout.column() - col.prop(props, "object_color") + col.prop(props, "object_color_type") + if props.object_color_type == 'COLLECTION': + col.prop(props, "object_color") classes = ( diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index b2bb2fd792b..d6cf411c31c 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -913,8 +913,8 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main) for (SpaceLink *sl = sa->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_VIEW3D) { View3D *v3d = (View3D *)sl; - v3d->drawtype_solid = OB_LIGHTING_STUDIO; - v3d->drawtype_wireframe = OB_LIGHTING_STUDIO; + v3d->drawtype_solid = V3D_LIGHTING_STUDIO; + v3d->drawtype_wireframe = V3D_LIGHTING_STUDIO; /* Assume (demo) files written with 2.8 want to show * Eevee renders in the viewport. */ diff --git a/source/blender/draw/engines/workbench/solid_flat_mode.c b/source/blender/draw/engines/workbench/solid_flat_mode.c index bed87518f39..1d8eb3b4362 100644 --- a/source/blender/draw/engines/workbench/solid_flat_mode.c +++ b/source/blender/draw/engines/workbench/solid_flat_mode.c @@ -68,24 +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_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); - WORKBENCH_MaterialData *material; - if (geom) { - /* Depth */ - DRW_shgroup_call_add(stl->g_data->depth_shgrp, geom, ob->obmat); - - /* Solid */ - material = workbench_get_or_create_solid_flat_material_data(data, color); - DRW_shgroup_call_add(material->shgrp, geom, ob->obmat); - } + workbench_materials_solid_cache_populate(data, ob, V3D_LIGHTING_FLAT); } static void workbench_solid_flat_cache_finish(void *vedata) diff --git a/source/blender/draw/engines/workbench/solid_studio_mode.c b/source/blender/draw/engines/workbench/solid_studio_mode.c index 6ac63fbca67..e687debe319 100644 --- a/source/blender/draw/engines/workbench/solid_studio_mode.c +++ b/source/blender/draw/engines/workbench/solid_studio_mode.c @@ -68,24 +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_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); - WORKBENCH_MaterialData *material; - if (geom) { - /* Depth */ - DRW_shgroup_call_add(stl->g_data->depth_shgrp, geom, ob->obmat); - - /* Solid */ - material = workbench_get_or_create_solid_studio_material_data(data, color); - DRW_shgroup_call_add(material->shgrp, geom, ob->obmat); - } + workbench_materials_solid_cache_populate(data, ob, V3D_LIGHTING_STUDIO); } static void workbench_solid_studio_cache_finish(void *vedata) diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index 2b6c95e301f..5a2c70ce810 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -49,6 +49,7 @@ 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 873d24116a1..eafeda324d7 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -55,48 +55,19 @@ static uint get_material_hash(const float color[3]) return r + g * 4096 + b * 4096 * 4096; } -WORKBENCH_MaterialData *workbench_get_or_create_solid_flat_material_data(WORKBENCH_Data *vedata, const float color[3]) +static const float* get_material_solid_color(Object *ob) { - WORKBENCH_StorageList *stl = vedata->stl; - WORKBENCH_PassList *psl = vedata->psl; - WORKBENCH_PrivateData *wpd = stl->g_data; - - uint hash = get_material_hash(color); - WORKBENCH_MaterialData *material; - - material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash)); - if (material == NULL) { - material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), "WORKBENCH_MaterialData"); - material->shgrp = DRW_shgroup_create(e_data.solid_flat_sh, psl->solid_pass); - material->color[0] = color[0]; - material->color[1] = color[1]; - material->color[2] = color[2]; - DRW_shgroup_uniform_vec3(material->shgrp, "color", material->color, 1); - BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), material); + 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) + { + default: + case V3D_OBJECT_COLOR_COLLECTION: + return BKE_collection_engine_property_value_get_float_array(props, "object_color"); + + case V3D_OBJECT_COLOR_OBJECT: + return ob->col; } - return material; -} - -WORKBENCH_MaterialData *workbench_get_or_create_solid_studio_material_data(WORKBENCH_Data *vedata, const float color[3]) -{ - WORKBENCH_StorageList *stl = vedata->stl; - WORKBENCH_PassList *psl = vedata->psl; - WORKBENCH_PrivateData *wpd = stl->g_data; - - uint hash = get_material_hash(color); - WORKBENCH_MaterialData *material; - - material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash)); - if (material == NULL) { - material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), "WORKBENCH_MaterialData"); - material->shgrp = DRW_shgroup_create(e_data.solid_studio_sh, psl->solid_pass); - material->color[0] = color[0]; - material->color[1] = color[1]; - material->color[2] = color[2]; - DRW_shgroup_uniform_vec3(material->shgrp, "color", material->color, 1); - BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), material); - } - return material; } void workbench_materials_engine_init(void) @@ -127,6 +98,44 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata) wpd->material_hash = BLI_ghash_ptr_new("Workbench material_hash"); } +void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob, int lighting_mode) +{ + WORKBENCH_StorageList *stl = vedata->stl; + WORKBENCH_PassList *psl = vedata->psl; + WORKBENCH_PrivateData *wpd = stl->g_data; + + if (!DRW_object_is_renderable(ob)) + return; + + struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob); + WORKBENCH_MaterialData *material; + if (geom) { + /* Depth */ + 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; + + const float *color = get_material_solid_color(ob); + uint hash = get_material_hash(color); + WORKBENCH_MaterialData *material; + + material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash)); + if (material == NULL) { + material = MEM_mallocN(sizeof(WORKBENCH_MaterialData), "WORKBENCH_MaterialData"); + material->shgrp = DRW_shgroup_create(shader, psl->solid_pass); + material->color[0] = color[0]; + material->color[1] = color[1]; + material->color[2] = color[2]; + DRW_shgroup_uniform_vec3(material->shgrp, "color", material->color, 1); + BLI_ghash_insert(wpd->material_hash, SET_UINT_IN_POINTER(hash), material); + } + + DRW_shgroup_call_add(material->shgrp, geom, ob->obmat); + } + +} + void workbench_materials_cache_finish(WORKBENCH_Data *vedata) { WORKBENCH_StorageList *stl = vedata->stl; diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index e45ee9bd043..f6702a9f511 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -28,6 +28,7 @@ #include "DRW_render.h" +#include "DNA_view3d_types.h" #define WORKBENCH_ENGINE "BLENDER_WORKBENCH" @@ -78,8 +79,7 @@ void workbench_solid_materials_free(void); void workbench_materials_engine_init(void); void workbench_materials_engine_finish(void); void workbench_materials_cache_init(WORKBENCH_Data *vedata); -WORKBENCH_MaterialData *workbench_get_or_create_solid_flat_material_data(WORKBENCH_Data *vedata, const float color[3]); -WORKBENCH_MaterialData *workbench_get_or_create_solid_studio_material_data(WORKBENCH_Data *vedata, const float color[3]); +void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob, int lighting_mode); void workbench_materials_cache_finish(WORKBENCH_Data *vedata); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index c99cd25df67..2c1e8612d51 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -903,10 +903,11 @@ static void drw_engines_enable_from_engine(RenderEngineType *engine_type, int dr break; case OB_SOLID: - if (drawtype_solid == OB_LIGHTING_FLAT) { + if (drawtype_solid == V3D_LIGHTING_FLAT) { use_drw_engine(&draw_engine_workbench_solid_flat); - } - else if (drawtype_solid == OB_LIGHTING_STUDIO) { + + } + else if (drawtype_solid == V3D_LIGHTING_STUDIO) { use_drw_engine(&draw_engine_workbench_solid_studio); } @@ -1948,6 +1949,7 @@ void DRW_engines_register(void) RE_engines_register(NULL, &DRW_engine_viewport_workbench_type); DRW_engine_register(&draw_engine_workbench_solid_flat); + DRW_engine_register(&draw_engine_workbench_solid_studio); DRW_engine_register(&draw_engine_object_type); DRW_engine_register(&draw_engine_edit_armature_type); diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 883722105ee..5e9d6f4ea1c 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -333,8 +333,8 @@ static SpaceLink *view3d_new(const bContext *C) v3d->gridlines = 16; v3d->gridsubdiv = 10; v3d->drawtype = OB_SOLID; - v3d->drawtype_solid = OB_LIGHTING_STUDIO; - v3d->drawtype_texture = OB_LIGHTING_STUDIO; + v3d->drawtype_solid = V3D_LIGHTING_STUDIO; + v3d->drawtype_texture = V3D_LIGHTING_STUDIO; v3d->gridflag = V3D_SHOW_X | V3D_SHOW_Y | V3D_SHOW_FLOOR; diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index e292e1a8456..bb17b10b299 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -446,12 +446,6 @@ 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 2b82638a6b8..ed42a2e8b71 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -74,6 +74,16 @@ typedef struct View3DDebug { } View3DDebug; /* ********************************* */ +enum { + V3D_LIGHTING_FLAT = 0, + V3D_LIGHTING_STUDIO = 1, + V3D_LIGHTING_SCENE = 2 +}; + +enum { + V3D_OBJECT_COLOR_COLLECTION = 0, + V3D_OBJECT_COLOR_OBJECT = 1, +}; typedef struct RegionView3D { diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index dce85f0e91c..245f368ce30 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -26,6 +26,7 @@ #include "DNA_scene_types.h" #include "DNA_layer_types.h" +#include "DNA_view3d_types.h" #include "BLI_math.h" #include "BLI_string_utils.h" @@ -312,6 +313,9 @@ static void rna_LayerEngineSettings_##_ENGINE_##_##_NAME_##_set(PointerRNA *ptr, #define RNA_LAYER_ENGINE_WORKBENCH_GET_SET_FLOAT_ARRAY(_NAME_, _LEN_) \ RNA_LAYER_ENGINE_GET_SET_ARRAY(float, Workbench, COLLECTION_MODE_NONE, _NAME_, _LEN_) +#define RNA_LAYER_ENGINE_WORKBENCH_GET_SET_INT(_NAME_) \ + RNA_LAYER_ENGINE_GET_SET(int, Workbench, COLLECTION_MODE_NONE, _NAME_) + /* mode engines */ #define RNA_LAYER_MODE_OBJECT_GET_SET_FLOAT(_NAME_) \ @@ -359,6 +363,7 @@ 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. */ @@ -1662,21 +1667,35 @@ static void rna_def_layer_collection_engine_settings_clay(BlenderRNA *brna) } #endif /* WITH_CLAY_ENGINE */ +/* Workbench engine */ 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", "Engine specific settings for this collection"); + 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", "rna_LayerEngineSettings_Workbench_object_color_set", NULL); - RNA_def_property_ui_text(prop, "Object Color", "Color for Drawing Objects"); + RNA_def_property_ui_text(prop, "Collection Color", "Color for Drawing Objects in this Collection"); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); RNA_def_property_update(prop, 0, "rna_LayerCollectionEngineSettings_update"); } diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 47ae2cb8951..80d23e14949 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -183,15 +183,15 @@ const EnumPropertyItem rna_enum_viewport_shade_items[] = { }; 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"}, + {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"}, */ {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"}, + {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"}, */ {0, NULL, 0, NULL, NULL} }; |