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

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)

Differential Revision: https://developer.blender.org/D3175

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

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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to