[Bf-blender-cvs] [d2f4b4962fc] blender2.8-workbench: Overlay: Object Overlap overlay
Jeroen Bakker
noreply at git.blender.org
Tue Apr 24 07:59:55 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list