diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-19 10:45:52 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-19 10:45:52 +0300 |
commit | 16fac020e07d7ad0caa5901c0740c88e9772194f (patch) | |
tree | 505cf49b33f2ce6d8edae69b7355ca1ea092aca9 /source/blender/draw | |
parent | 1f5d51e44ecf99f34d8e733559a9312e5ae3ef33 (diff) |
Workbench: Option to use Object color
- added `object_color_type` where the user can set if the collection
determines the color, or the object will be used for the color.
Implemented it as an enum as later this can have a random color option.
- moved OB_LIGHTING_* to DNA_view3d_types and renamed it.
- Fixed some DRY in workbench_materials.c. Can remove more DRY's but
will need to discuss the responsibility of the workbench engine as it
might become part of the eevee renderer.
Diffstat (limited to 'source/blender/draw')
6 files changed, 59 insertions, 81 deletions
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); |