Edit Mesh overlay: remove one extra buffer.

This commit is contained in:
Clément Foucault 2017-03-03 13:51:59 +01:00
parent 2a82162618
commit 0c5b197447
2 changed files with 6 additions and 35 deletions

View File

@ -49,14 +49,12 @@ typedef struct EDIT_MESH_PassList {
/* keep it under MAX_BUFFERS */
typedef struct EDIT_MESH_FramebufferList {
struct GPUFrameBuffer *occlude_wire_fb;
struct GPUFrameBuffer *occlude_face_fb;
} EDIT_MESH_FramebufferList;
/* keep it under MAX_TEXTURES */
typedef struct EDIT_MESH_TextureList {
struct GPUTexture *occlude_wire_depth_tx;
struct GPUTexture *occlude_wire_color_tx;
struct GPUTexture *occlude_face_color_tx;
} EDIT_MESH_TextureList;
static DRWShadingGroup *depth_shgrp_hidden_wire;
@ -110,11 +108,6 @@ void EDIT_MESH_init(void)
(int)viewport_size[0], (int)viewport_size[1],
tex, 2);
DRWFboTexture tex2 = {&txl->occlude_face_color_tx, DRW_BUF_RGBA_8};
DRW_framebuffer_init(&fbl->occlude_face_fb,
(int)viewport_size[0], (int)viewport_size[1],
&tex2, 1);
if (!overlay_tri_sh) {
overlay_tri_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl,
datatoc_edit_overlay_geom_tri_glsl,
@ -244,7 +237,7 @@ void EDIT_MESH_cache_init(void)
/* however we loose the front faces value (because we need the depth of occluded wires and
* faces are alpha blended ) so we recover them in a new pass. */
psl->facefill_occlude_pass = DRW_pass_create("Front Face Color", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS);
psl->facefill_occlude_pass = DRW_pass_create("Front Face Color", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND);
facefill_occluded_shgrp = DRW_shgroup_create(overlay_facefill_sh, psl->facefill_occlude_pass);
DRW_shgroup_uniform_block(facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0);
@ -260,7 +253,6 @@ void EDIT_MESH_cache_init(void)
DRW_shgroup_call_add(mix_shgrp, quad, mat);
DRW_shgroup_uniform_float(mix_shgrp, "alpha", &backwire_opacity, 1);
DRW_shgroup_uniform_buffer(mix_shgrp, "wireColor", &txl->occlude_wire_color_tx, 0);
DRW_shgroup_uniform_buffer(mix_shgrp, "faceColor", &txl->occlude_face_color_tx, 1);
DRW_shgroup_uniform_buffer(mix_shgrp, "wireDepth", &txl->occlude_wire_depth_tx, 2);
DRW_shgroup_uniform_buffer(mix_shgrp, "sceneDepth", &dtxl->depth, 3);
}
@ -366,12 +358,7 @@ void EDIT_MESH_draw(void)
if (psl->edit_face_occluded_pass) {
float clearcol[4] = {0.0f, 0.0f, 0.0f, 0.0f};
/* render facefill */
DRW_framebuffer_texture_detach(dtxl->depth);
DRW_framebuffer_texture_attach(fbl->occlude_face_fb, dtxl->depth, 0);
DRW_framebuffer_bind(fbl->occlude_face_fb);
DRW_framebuffer_clear(true, false, clearcol);
DRW_draw_pass(psl->facefill_occlude_pass);
DRW_framebuffer_texture_detach(dtxl->depth);
/* Render wires on a separate framebuffer */
DRW_framebuffer_bind(fbl->occlude_wire_fb);

View File

@ -3,38 +3,22 @@ out vec4 FragColor;
uniform sampler2D wireColor;
uniform sampler2D wireDepth;
uniform sampler2D faceColor;
uniform sampler2D sceneDepth;
uniform float alpha;
vec4 linear(vec4 col)
{
const float fac = 0.45454545;
return vec4(pow(col.r,fac), pow(col.g,fac), pow(col.b,fac), col.a);
}
vec4 srgb(vec4 col)
{
const float fac = 2.2;
return vec4(pow(col.r,fac), pow(col.g,fac), pow(col.b,fac), col.a);
}
void main()
{
ivec2 co = ivec2(gl_FragCoord.xy);
float wire_depth = texelFetch(wireDepth, co, 0).r;
float scene_depth = texelFetch(sceneDepth, co, 0).r;
vec4 wire_color = texelFetch(wireColor, co, 0).rgba;
vec4 face_color = texelFetch(faceColor, co, 0).rgba;
FragColor = wire_color;
/* this works because not rendered depth is 1.0 and the
* following test is always true even when no wires */
if (wire_depth > scene_depth) {
wire_color.a *= alpha;
FragColor.rgb = mix(face_color.rgb, wire_color.rgb, wire_color.a);
FragColor.a = face_color.a + wire_color.a;
}
else {
FragColor = wire_color;
if ((wire_depth > scene_depth) && (wire_color.a > 0)) {
/* Note : Using wire_color.a * alpha produce unwanted result */
FragColor.a = alpha;
}
}