[Bf-blender-cvs] [c7d3eb2a7e3] blender2.8: Workbench: Draw random object colors

Jeroen Bakker noreply at git.blender.org
Fri Apr 20 14:54:38 CEST 2018


Commit: c7d3eb2a7e30bbd34e299faeb81f3a777023c8b1
Author: Jeroen Bakker
Date:   Fri Apr 20 14:38:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBc7d3eb2a7e30bbd34e299faeb81f3a777023c8b1

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.

===================================================================

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

===================================================================

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
@@ -80,6 +80,10 @@ enum {
 	V3D_LIGHTING_SCENE  = 2
 };
 
+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",



More information about the Bf-blender-cvs mailing list