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
