From d346ed3b105f830f5f1862054ca233d27afe28d5 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Mon, 28 Dec 2015 17:54:45 +0100 Subject: cdderivedmesh fix stippled faces not getting drawn at all Also rearranged code here to not issue a draw call (explicit flush) per face and not set shader per face either when stippled drawing is mixed with regular drawing. Not good at all for performance. --- source/blender/blenkernel/intern/cdderivedmesh.c | 27 +++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'source') diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 632403c5e25..24b79c1e566 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -748,6 +748,8 @@ static void cdDM_drawMappedFaces( draw_option = setMaterial(bufmat->mat_nr + 1, NULL); if (draw_option != DM_DRAW_OPTION_SKIP) { + DMDrawOption last_draw_option = DM_DRAW_OPTION_NORMAL; + for (i = 0; i < totpoly; i++) { int actualFace = next_actualFace; int flush = 0; @@ -766,17 +768,12 @@ static void cdDM_drawMappedFaces( } } - if (draw_option == DM_DRAW_OPTION_STIPPLE) { - GPU_basic_shader_bind(GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR); - GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_QUARTTONE); - } - /* Goal is to draw as long of a contiguous triangle * array as possible, so draw when we hit either an * invisible triangle or at the end of the array */ /* flush buffer if current triangle isn't drawable or it's last triangle... */ - flush = (ELEM(draw_option, DM_DRAW_OPTION_SKIP, DM_DRAW_OPTION_STIPPLE)) || (i == totpoly - 1); + flush = (draw_option != last_draw_option) || (i == totpoly - 1); if (!flush && compareDrawOptions) { flush |= compareDrawOptions(userData, actualFace, next_actualFace) == 0; @@ -786,18 +783,27 @@ static void cdDM_drawMappedFaces( tot_element += tot_tri_verts; if (flush) { - if (!ELEM(draw_option, DM_DRAW_OPTION_SKIP, DM_DRAW_OPTION_STIPPLE)) + if (draw_option != DM_DRAW_OPTION_SKIP) { tot_drawn += tot_tri_verts; + if (last_draw_option != draw_option) { + if (draw_option == DM_DRAW_OPTION_STIPPLE) { + GPU_basic_shader_bind(GPU_SHADER_STIPPLE | GPU_SHADER_USE_COLOR); + GPU_basic_shader_stipple(GPU_SHADER_STIPPLE_QUARTTONE); + } + else { + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); + } + } + } + if (tot_drawn) { GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, bufmat->start + start_element, tot_drawn); tot_drawn = 0; } + last_draw_option = draw_option; start_element = tot_element; - - if (draw_option == DM_DRAW_OPTION_STIPPLE) - GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); } else { tot_drawn += tot_tri_verts; @@ -807,6 +813,7 @@ static void cdDM_drawMappedFaces( } } + GPU_basic_shader_bind(GPU_SHADER_USE_COLOR); glShadeModel(GL_FLAT); GPU_buffers_unbind(); -- cgit v1.2.3