[Bf-blender-cvs] [86f988cedea] blender2.8-workbench: Overlay: Object Overlap overlay

Jeroen Bakker noreply at git.blender.org
Mon Apr 23 15:03:49 CEST 2018


Commit: 86f988cedea7d16ef05b6fac32b36f2b669c11d8
Author: Jeroen Bakker
Date:   Mon Apr 23 14:46:52 2018 +0200
Branches: blender2.8-workbench
https://developer.blender.org/rB86f988cedea7d16ef05b6fac32b36f2b669c11d8

Overlay: Object Overlap overlay

- Added UInt R support to framebuffers
- Added the overlap as an overlay so should be reusable by other engines
(Scene lighted Solid mode)

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/draw/modes/overlay_mode.c
A	source/blender/draw/modes/shaders/overlay_object_data_frag.glsl
A	source/blender/draw/modes/shaders/overlay_object_data_vert.glsl
A	source/blender/draw/modes/shaders/overlay_object_overlap_frag.glsl
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_layer.c
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 6e61ad975d3..6af12f59948 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -3437,6 +3437,9 @@ class VIEW3D_PT_view3d_display(Panel):
         col.prop(view, "show_only_render")
         col.prop(view, "show_world")
 
+        if view.viewport_shade == "SOLID":
+            col.prop(view, "show_random_object_colors")
+
         if context.mode in {'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
             col.prop(view, "show_mode_shade_override")
 
@@ -3447,7 +3450,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.prop(view, "show_object_overlap_overlay")
 
         col = layout.column()
         col.active = display_all
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 22106c55bda..d3ae680980e 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -237,6 +237,9 @@ data_to_c_simple(modes/shaders/edit_lattice_overlay_loosevert_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_normals_geom.glsl SRC)
 data_to_c_simple(modes/shaders/overlay_face_orientation_frag.glsl SRC)
+data_to_c_simple(modes/shaders/overlay_object_data_vert.glsl SRC)
+data_to_c_simple(modes/shaders/overlay_object_data_frag.glsl SRC)
+data_to_c_simple(modes/shaders/overlay_object_overlap_frag.glsl SRC)
 data_to_c_simple(modes/shaders/overlay_face_orientation_vert.glsl SRC)
 data_to_c_simple(modes/shaders/object_empty_image_frag.glsl SRC)
 data_to_c_simple(modes/shaders/object_empty_image_vert.glsl SRC)
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index c93ff5cb2e9..8fdf3095607 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -48,6 +48,9 @@ static void workbench_layer_collection_settings_create(RenderEngine *UNUSED(engi
 	BLI_assert(props &&
 	           props->type == IDP_GROUP &&
 	           props->subtype == IDP_GROUP_SUB_ENGINE_RENDER);
+
+	BKE_collection_engine_property_add_float(props, "random_object_color_saturation", 0.5f);
+	BKE_collection_engine_property_add_float(props, "random_object_color_value", 0.9f);
 }
 
 /* Note: currently unused, we may want to register so we can see this when debugging the view. */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 97d370795bc..2782654984d 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -45,6 +45,8 @@ extern char datatoc_workbench_vert_glsl[];
 extern char datatoc_workbench_studio_vert_glsl[];
 extern char datatoc_workbench_diffuse_lib_glsl[];
 
+extern DrawEngineType draw_engine_workbench_solid_studio;
+
 /* Functions */
 static uint get_material_hash(const float color[3])
 {
@@ -54,13 +56,20 @@ static uint get_material_hash(const float color[3])
 
 	return r + g * 4096 + b * 4096 * 4096;
 }
+static uint NEXT_RANDOM_COLOR_OFFSET = 0;
+static void workbench_init_object_data(ObjectEngineData *engine_data) {
+	WORKBENCH_ObjectData *data = (WORKBENCH_ObjectData*)engine_data;
+	data->random_color_offset = NEXT_RANDOM_COLOR_OFFSET++;
+}
 
-static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, float *color)
+static void get_material_solid_color(WORKBENCH_PrivateData *wpd, Object *ob, float *color, float hsv_saturation, float hsv_value)
 {
 	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]);
-
+		ObjectEngineData *engine_data = DRW_object_engine_data_ensure(ob, &draw_engine_workbench_solid_studio, sizeof(WORKBENCH_ObjectData), &workbench_init_object_data, NULL);
+		WORKBENCH_ObjectData *data = (WORKBENCH_ObjectData*)engine_data;
+		float offset = fmodf(data->random_color_offset * M_GOLDEN_RATION_CONJUGATE, 1.0);
+		float hsv[3] = {offset, hsv_saturation, hsv_value};
+		hsv_to_rgb_v(hsv, color);
 	}
 	else {
 		copy_v3_v3(color, ob->col);
@@ -137,6 +146,8 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob
 		return;
 
 	struct Gwn_Batch *geom = DRW_cache_object_surface_get(ob);
+	IDProperty *props = BKE_layer_collection_engine_evaluated_get(ob, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_WORKBENCH);
+
 	WORKBENCH_MaterialData *material;
 	if (geom) {
 		/* Depth */
@@ -146,7 +157,9 @@ void workbench_materials_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob
 		GPUShader *shader = wpd->drawtype_lighting == V3D_LIGHTING_FLAT ? e_data.solid_flat_sh : e_data.solid_studio_sh;
 
 		float color[3];
-		get_material_solid_color(wpd, ob, color);
+		const float hsv_saturation = BKE_collection_engine_property_value_get_float(props, "random_object_color_saturation");
+		const float hsv_value = BKE_collection_engine_property_value_get_float(props, "random_object_color_value");
+		get_material_solid_color(wpd, ob, color, hsv_saturation, hsv_value);
 		unsigned int 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 8e61828f063..6be2f1d4d38 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -31,7 +31,7 @@
 #include "DNA_view3d_types.h"
 
 #define WORKBENCH_ENGINE "BLENDER_WORKBENCH"
-
+#define M_GOLDEN_RATION_CONJUGATE 0.618033988749895
 
 typedef struct WORKBENCH_StorageList {
 	struct WORKBENCH_PrivateData *g_data;
@@ -68,6 +68,16 @@ typedef struct WORKBENCH_MaterialData {
 	DRWShadingGroup *shgrp;
 } WORKBENCH_MaterialData;
 
+typedef struct WORKBENCH_ObjectData {
+	struct ObjectEngineData *next, *prev;
+	struct DrawEngineType *engine_type;
+	/* Only nested data, NOT the engine data itself. */
+	ObjectEngineDataFreeCb free;
+	/* Accumulated recalc flags, which corresponds to ID->recalc flags. */
+	int recalc;
+
+	uint random_color_offset;
+} WORKBENCH_ObjectData;
 
 /* workbench_engine.c */
 void workbench_solid_materials_init(void);
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 17537e295a6..37d79080c9b 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -189,6 +189,7 @@ typedef enum {
 	DRW_TEX_R_16I,
 	DRW_TEX_R_16U,
 	DRW_TEX_R_32,
+	DRW_TEX_R_32U,
 	DRW_TEX_DEPTH_16,
 	DRW_TEX_DEPTH_24,
 	DRW_TEX_DEPTH_24_STENCIL_8,
diff --git a/source/blender/draw/intern/draw_manager_texture.c b/source/blender/draw/intern/draw_manager_texture.c
index f083e399ac2..f531f73d3fa 100644
--- a/source/blender/draw/intern/draw_manager_texture.c
+++ b/source/blender/draw/intern/draw_manager_texture.c
@@ -38,6 +38,7 @@ void drw_texture_get_format(
 			case DRW_TEX_R_16I:
 			case DRW_TEX_R_16U:
 			case DRW_TEX_R_32:
+			case DRW_TEX_R_32U:
 			case DRW_TEX_RG_8:
 			case DRW_TEX_RG_16:
 			case DRW_TEX_RG_16I:
@@ -75,6 +76,7 @@ void drw_texture_get_format(
 		case DRW_TEX_R_16I: *r_data_type = GPU_R16I; break;
 		case DRW_TEX_R_16U: *r_data_type = GPU_R16UI; break;
 		case DRW_TEX_R_32: *r_data_type = GPU_R32F; break;
+		case DRW_TEX_R_32U: *r_data_type = GPU_R32UI; break;
 #if 0
 		case DRW_TEX_RGB_8: *r_data_type = GPU_RGB8; break;
 		case DRW_TEX_RGB_32: *r_data_type = GPU_RGB32F; break;
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index e4a137b06f3..69dac8699b2 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -23,23 +23,31 @@
  *  \ingroup draw_engine
  */
 
-#include "DRW_render.h"
+ #include "DNA_view3d_types.h"
 
 #include "GPU_shader.h"
-#include "DNA_view3d_types.h"
+#include "DRW_render.h"
+
+#include "draw_mode_engines.h"
 
 /* Structures */
+typedef struct OVERLAY_FramebufferList {
+	struct GPUFrameBuffer *object_data_fb;
+} OVERLAY_FramebufferList;
+
 typedef struct OVERLAY_StorageList {
 	struct OVERLAY_PrivateData *g_data;
 } OVERLAY_StorageList;
 
 typedef struct OVERLAY_PassList {
 	struct DRWPass *face_orientation_pass;
+	struct DRWPass *object_data_pass;
+	struct DRWPass *object_overlap_pass;
 } OVERLAY_PassList;
 
 typedef struct OVERLAY_Data {
 	void *engine_type;
-	DRWViewportEmptyList *fbl;
+	OVERLAY_FramebufferList *fbl;
 	DRWViewportEmptyList *txl;
 	OVERLAY_PassList *psl;
 	OVERLAY_StorageList *stl;
@@ -48,34 +56,75 @@ typedef struct OVERLAY_Data {
 typedef struct OVERLAY_PrivateData {
 	DRWShadingGroup *face_orientation_shgrp;
 	int overlays;
+	int next_object_id;
+	ListBase materials;
+
+
 } OVERLAY_PrivateData; /* Transient data */
 
 typedef struct OVERLAY_MaterialData {
-	/* Solid color */
-	float color[3];
-
-	/* Linked shgroup for drawing */
-	DRWShadingGroup *shgrp;
+	struct Link *next, *prev;
+	DRWShadingGroup *object_data_shgrp;
+	int object_id;
 } OVERLAY_MaterialData;
 
+typedef struct OVERLAY_ObjectData {
+	struct ObjectEngineData *next, *prev;
+	struct DrawEngineType *engine_type;
+	/* Only nested data, NOT the engine data itself. */
+	ObjectEngineDataFreeCb free;
+	/* Accumulated recalc flags, which corresponds to ID->recalc flags. */
+	int recalc;
+} OVERLAY_ObjectData;
+
 /* *********** STATIC *********** */
 static struct {
 	/* Face orientation shader */
 	struct GPUShader *face_orientation_sh;
+	struct GPUShader *object_data_sh;
+	struct GPUShader *object_overlap_sh;
 
+	struct GPUTexture *object_id_tx; /* ref only, not alloced */
 } e_data = {NULL};
 
 /* Shaders */
 extern char datatoc_overlay_face_orientation_frag_glsl[];
 extern char datatoc_overlay_face_orientation_ver

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list