[Bf-blender-cvs] [a3ee3b8f245] draw-colormanagement: Overlay: Move Alt+B clipping bounds display from workbench to overlay
Clément Foucault
noreply at git.blender.org
Fri Jan 31 04:22:22 CET 2020
Commit: a3ee3b8f245e5fda257b10281efc7361287137a4
Author: Clément Foucault
Date: Wed Jan 29 04:02:17 2020 +0100
Branches: draw-colormanagement
https://developer.blender.org/rBa3ee3b8f245e5fda257b10281efc7361287137a4
Overlay: Move Alt+B clipping bounds display from workbench to overlay
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_background.c
M source/blender/draw/engines/overlay/overlay_private.h
M source/blender/draw/engines/overlay/overlay_shader.c
A source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
M source/blender/draw/engines/workbench/workbench_data.c
M source/blender/draw/engines/workbench/workbench_deferred.c
M source/blender/draw/engines/workbench/workbench_forward.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/intern/draw_cache.c
M source/blender/draw/intern/draw_common.c
M source/blender/draw/intern/draw_common.h
M source/blender/draw/intern/draw_view.c
M source/blender/draw/intern/draw_view.h
M source/blender/draw/intern/shaders/common_globals_lib.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index a7aedbc7192..458f85d892a 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -329,6 +329,7 @@ data_to_c_simple(engines/overlay/shaders/armature_stick_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_wire_frag.glsl SRC)
data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/background_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/clipbound_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
data_to_c_simple(engines/overlay/shaders/edit_curve_handle_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_background.c b/source/blender/draw/engines/overlay/overlay_background.c
index 37767bb3b76..13654544a64 100644
--- a/source/blender/draw/engines/overlay/overlay_background.c
+++ b/source/blender/draw/engines/overlay/overlay_background.c
@@ -25,6 +25,7 @@
#include "UI_resources.h"
#include "overlay_private.h"
+#include "draw_manager_text.h"
#define BG_SOLID 0
#define BG_GRADIENT 1
@@ -33,30 +34,52 @@
void OVERLAY_background_cache_init(OVERLAY_Data *vedata)
{
OVERLAY_PassList *psl = vedata->psl;
+ OVERLAY_PrivateData *pd = vedata->stl->pd;
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ const DRWContextState *draw_ctx = DRW_context_state_get();
+ const RegionView3D *rv3d = draw_ctx->rv3d;
+ const BoundBox *bb = rv3d->clipbb;
+ bool draw_clipping_bounds = (pd->clipping_state != 0);
- int background_type;
+ {
+ int background_type;
+ if (!DRW_state_draw_background()) {
+ background_type = BG_CHECKER;
+ }
+ else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
+ background_type = BG_GRADIENT;
+ }
+ else {
+ background_type = BG_SOLID;
+ }
- if (!DRW_state_draw_background()) {
- background_type = BG_CHECKER;
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
+ DRW_PASS_CREATE(psl->background_ps, state);
+
+ GPUShader *sh = OVERLAY_shader_background();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps);
+ DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+ DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color);
+ DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
+ DRW_shgroup_uniform_int_copy(grp, "bgType", background_type);
+ DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
- else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
- background_type = BG_GRADIENT;
+
+ if (draw_clipping_bounds) {
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA | DRW_STATE_CULL_BACK;
+ DRW_PASS_CREATE(psl->clipping_frustum_ps, state);
+
+ GPUShader *sh = OVERLAY_shader_clipbound();
+ DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->clipping_frustum_ps);
+ DRW_shgroup_uniform_vec4_copy(grp, "color", G_draw.block.colorClippingBorder);
+ DRW_shgroup_uniform_vec3(grp, "boundbox", &bb->vec[0][0], 8);
+
+ struct GPUBatch *cube = DRW_cache_cube_get();
+ DRW_shgroup_call(grp, cube, NULL);
}
else {
- background_type = BG_SOLID;
+ psl->clipping_frustum_ps = NULL;
}
-
- DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_BACKGROUND;
- DRW_PASS_CREATE(psl->background_ps, state);
-
- GPUShader *sh = OVERLAY_shader_background();
- DRWShadingGroup *grp = DRW_shgroup_create(sh, psl->background_ps);
- DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
- DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", &dtxl->color);
- DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_uniform_int_copy(grp, "bgType", background_type);
- DRW_shgroup_call_procedural_triangles(grp, NULL, 1);
}
void OVERLAY_background_draw(OVERLAY_Data *vedata)
@@ -64,6 +87,10 @@ void OVERLAY_background_draw(OVERLAY_Data *vedata)
OVERLAY_PassList *psl = vedata->psl;
if (DRW_state_is_fbo()) {
+ if (psl->clipping_frustum_ps) {
+ DRW_draw_pass(psl->clipping_frustum_ps);
+ }
+
DRW_draw_pass(psl->background_ps);
}
}
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 7a1ec41c485..2bce6c5e78d 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -56,6 +56,7 @@ typedef struct OVERLAY_PassList {
DRWPass *armature_bone_select_ps;
DRWPass *armature_transp_ps;
DRWPass *background_ps;
+ DRWPass *clipping_frustum_ps;
DRWPass *edit_curve_wire_ps[2];
DRWPass *edit_curve_handle_ps;
DRWPass *edit_lattice_ps;
@@ -530,6 +531,7 @@ GPUShader *OVERLAY_shader_armature_sphere(bool use_outline);
GPUShader *OVERLAY_shader_armature_stick(void);
GPUShader *OVERLAY_shader_armature_wire(void);
GPUShader *OVERLAY_shader_background(void);
+GPUShader *OVERLAY_shader_clipbound(void);
GPUShader *OVERLAY_shader_depth_only(void);
GPUShader *OVERLAY_shader_edit_curve_handle(void);
GPUShader *OVERLAY_shader_edit_curve_point(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 9d61f0125de..6b8c5b23e58 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -48,6 +48,7 @@ extern char datatoc_armature_stick_vert_glsl[];
extern char datatoc_armature_wire_frag_glsl[];
extern char datatoc_armature_wire_vert_glsl[];
extern char datatoc_background_frag_glsl[];
+extern char datatoc_clipbound_vert_glsl[];
extern char datatoc_depth_only_vert_glsl[];
extern char datatoc_edit_curve_handle_geom_glsl[];
extern char datatoc_edit_curve_handle_vert_glsl[];
@@ -131,6 +132,7 @@ typedef struct OVERLAY_Shaders {
GPUShader *armature_stick;
GPUShader *armature_wire;
GPUShader *background;
+ GPUShader *clipbound;
GPUShader *depth_only;
GPUShader *edit_curve_handle;
GPUShader *edit_curve_point;
@@ -213,6 +215,18 @@ GPUShader *OVERLAY_shader_background(void)
return sh_data->background;
}
+GPUShader *OVERLAY_shader_clipbound(void)
+{
+ OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+ if (!sh_data->clipbound) {
+ sh_data->clipbound = GPU_shader_create_from_arrays({
+ .vert = (const char *[]){datatoc_common_view_lib_glsl, datatoc_clipbound_vert_glsl, NULL},
+ .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
+ });
+ }
+ return sh_data->clipbound;
+}
+
GPUShader *OVERLAY_shader_depth_only(void)
{
const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl b/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
new file mode 100644
index 00000000000..1bfa5dadc32
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/clipbound_vert.glsl
@@ -0,0 +1,13 @@
+
+uniform vec3 boundbox[8];
+
+void main()
+{
+ vec3 world_pos = boundbox[gl_VertexID];
+ gl_Position = point_world_to_ndc(world_pos);
+
+ /* Result in a position at 1.0 (far plane). Small epsilon to avoid precision issue.
+ * This mimics the effect of infinite projection matrix
+ * (see http://www.terathon.com/gdc07_lengyel.pdf). */
+ gl_Position.z = gl_Position.w - 2.4e-7;
+}
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index f07b21ebcc2..051a1c9240a 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -197,13 +197,6 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
/* Will be NULL when rendering. */
if (RV3D_CLIPPING_ENABLED(v3d, rv3d)) {
wpd->world_clip_planes = rv3d->clip;
- UI_GetThemeColor4fv(TH_V3D_CLIPPING_BORDER, wpd->world_clip_planes_color);
- if (wpd->use_color_management) {
- srgb_to_linearrgb_v3_v3(wpd->world_clip_planes_color, wpd->world_clip_planes_color);
- }
- else {
- copy_v3_v3(wpd->world_clip_planes_color, wpd->world_clip_planes_color);
- }
}
else {
wpd->world_clip_planes = NULL;
@@ -298,5 +291,4 @@ void workbench_private_data_free(WORKBENCH_PrivateData *wpd)
}
DRW_UBO_FREE_SAFE(wpd->dof_ubo);
- GPU_BATCH_DISCARD_SAFE(wpd->world_clip_planes_batch);
}
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 4c86ffc74d8..393f6009379 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -726,14 +726,6 @@ void workbench_deferred_cache_init(WORKBENCH_Data *vedata)
DRW_shgroup_uniform_texture_ref(grp, "objectId", &e_data.object_id_tx);
}
DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
-
- if (RV3D_CLIPPING_ENABLED(draw_ctx->v3d, draw_ctx->rv3d)) {
- GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR_BACKGROUND);
- grp = DRW_shgroup_create(shader, psl->background_pass);
- wpd->world_clip_planes_batch = DRW_draw_background_clipping_batch_from_rv3d(draw_ctx->rv3d);
- DRW_shgroup_call(grp, wpd->world_clip_planes_batch, NULL);
- DRW_shgroup_uniform_vec4(grp, "color", &wpd->world_clip_planes_color[0], 1);
- }
}
/* Deferred Mix Pass */
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 19ccf072f21..a09d295a4c6 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -431,19 +431,6 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata)
DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL);
}
- /* TODO(campbell): displays but masks geometry,
- * only use with wire or solid-without-xray for now. */
- if ((wpd->shading.type != OB_WIRE && !XRAY_FLAG_ENABLED(wpd)) &&
- RV3D_CLIPPING_ENA
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list