diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-20 15:38:55 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-04-20 15:38:55 +0300 |
commit | c7d3eb2a7e30bbd34e299faeb81f3a777023c8b1 (patch) | |
tree | a9d8e7a65120ea0424a06710018de230f675c400 | |
parent | f18213ae3a31a77fe47efcd444f455cf6b3649e8 (diff) |
Workbench: Draw random object colors
Basic implementation hashes the ob->id.name. In the future we should use
an golden ratio offset algorithm as it can make a better random
palettte.
5 files changed, 25 insertions, 4 deletions
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 75f84893160..6e61ad975d3 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -3447,6 +3447,7 @@ class VIEW3D_PT_view3d_display(Panel): col.prop(view, "show_all_objects_origin") col.prop(view, "show_relationship_lines") col.prop(view, "show_face_orientation_overlay") + col.prop(view, "show_random_object_colors") col = layout.column() col.active = display_all diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 801ee3069b3..f9646deca8e 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -55,9 +55,15 @@ static uint get_material_hash(const float color[3]) return r + g * 4096 + b * 4096 * 4096; } -static const float* get_material_solid_color(WORKBENCH_PrivateData *UNUSED(wpd), Object *ob) +static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, float *color) { - return ob->col; + if (wpd->drawtype_options & V3D_DRAWOPTION_RANDOMIZE) { + unsigned int obhash = BLI_ghashutil_strhash(ob->id.name); + cpack_to_rgb(obhash, &color[0], &color[1], &color[2]); + + } else { + copy_v3_v3(color, ob->col); + } } void workbench_materials_engine_init(void) @@ -111,10 +117,12 @@ void workbench_materials_cache_init(WORKBENCH_Data *vedata) } #else wpd->drawtype_lighting = v3d->drawtype_lighting; + wpd->drawtype_options = v3d->drawtype_options; #endif } else { wpd->drawtype_lighting = V3D_LIGHTING_STUDIO; + wpd->drawtype_options = 0; } } @@ -136,8 +144,9 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob /* Solid */ 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(wpd, ob); - uint hash = get_material_hash(color); + float color[3]; + get_material_solid_color(wpd, ob, color); + unsigned int hash = get_material_hash(color); material = BLI_ghash_lookup(wpd->material_hash, SET_UINT_IN_POINTER(hash)); if (material == NULL) { diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 4a4014c70a0..1bae8f3a53b 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -57,6 +57,7 @@ typedef struct WORKBENCH_PrivateData { struct GHash *material_hash; short drawtype_lighting; + short drawtype_options; } WORKBENCH_PrivateData; /* Transient data */ typedef struct WORKBENCH_MaterialData { diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h index 46eb8081af2..7c6ddb50f4b 100644 --- a/source/blender/makesdna/DNA_view3d_types.h +++ b/source/blender/makesdna/DNA_view3d_types.h @@ -81,6 +81,10 @@ enum { }; enum { + V3D_DRAWOPTION_RANDOMIZE = (1<<0), +}; + +enum { V3D_OVERLAY_FACE_ORIENTATION = (1 << 0), }; diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c index 6c96c5ff9da..3c02b60140a 100644 --- a/source/blender/makesrna/intern/rna_space.c +++ b/source/blender/makesrna/intern/rna_space.c @@ -2281,6 +2281,12 @@ static void rna_def_space_view3d(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Face Orientation", "Show the Face Orientation Overlay"); RNA_def_property_update(prop, NC_SPACE | ND_SPACE_VIEW3D, "rna_SpaceView3D_viewport_shade_update"); + prop = RNA_def_property(srna, "show_random_object_colors", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "drawtype_options", V3D_DRAWOPTION_RANDOMIZE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Random Colors", "Show random object colors"); + 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", |