diff --git a/src/render/opengl/generated/render_opengl.meta.h b/src/render/opengl/generated/render_opengl.meta.h index 7ae7980b..b8c2117b 100644 --- a/src/render/opengl/generated/render_opengl.meta.h +++ b/src/render/opengl/generated/render_opengl.meta.h @@ -202,23 +202,23 @@ str8_lit_comp( " rect.xy,\n" " rect.zw,\n" " rect.zy);\n" -" float corner_radii_px[] = float[](corner_radii_px.y,\n" -" corner_radii_px.x,\n" -" corner_radii_px.w,\n" -" corner_radii_px.z);\n" +" float corner_radii[] = float[](corner_radii_px.y,\n" +" corner_radii_px.x,\n" +" corner_radii_px.w,\n" +" corner_radii_px.z);\n" " vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\n" " (gl_VertexID & 1) != 0 ? 0.f : 1.f);\n" " \n" " vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\n" " vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\n" " \n" -" vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" +" vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n" " \n" " gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n" " texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y);\n" -" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size;\n" -" rect_half_size = rect_half_size - 2.f;\n" -" corner_radius = corner_radii_px[gl_VertexID];\n" +" sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local;\n" +" rect_half_size = rect_half_size_local - 2.f;\n" +" corner_radius = corner_radii[gl_VertexID];\n" "}\n" "" ); diff --git a/src/render/opengl/render_opengl.c b/src/render/opengl/render_opengl.c index dc58659b..d9814293 100644 --- a/src/render/opengl/render_opengl.c +++ b/src/render/opengl/render_opengl.c @@ -95,6 +95,22 @@ r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum sever fprintf(stderr, "[OpenGL] %.*s\n", (int)length, message); } +internal B32 +r_ogl_scissor(Rng2F32 clip, Vec2F32 viewport_dim) +{ + S32 x0 = Clamp(0, (S32)floor_f32(clip.x0), (S32)viewport_dim.x); + S32 y0 = Clamp(0, (S32)floor_f32(clip.y0), (S32)viewport_dim.y); + S32 x1 = Clamp(0, (S32)ceil_f32(clip.x1), (S32)viewport_dim.x); + S32 y1 = Clamp(0, (S32)ceil_f32(clip.y1), (S32)viewport_dim.y); + S32 width = x1 - x0; + S32 height = y1 - y0; + if(width > 0 && height > 0) + { + glScissor(x0, (S32)viewport_dim.y - y1, width, height); + } + return width > 0 && height > 0; +} + //////////////////////////////// //~ rjf: Backend Hooks @@ -560,9 +576,10 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) group_params->clip.y0 != 0 || group_params->clip.y1 != 0) { - Rng2F32 clip = group_params->clip; - glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1); - glEnable(GL_SCISSOR_TEST); + if(r_ogl_scissor(group_params->clip, viewport_dim)) + { + glEnable(GL_SCISSOR_TEST); + } } //- rjf: draw @@ -650,9 +667,10 @@ r_window_submit(WM_Window window, R_Handle window_equip, R_PassList *passes) params->clip.y0 != 0 || params->clip.y1 != 0) { - Rng2F32 clip = params->clip; - glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1); - glEnable(GL_SCISSOR_TEST); + if(r_ogl_scissor(params->clip, viewport_dim)) + { + glEnable(GL_SCISSOR_TEST); + } } //- rjf: pass 1: stage -(horizontal)-> stage_scratch diff --git a/src/render/opengl/render_opengl.mdesk b/src/render/opengl/render_opengl.mdesk index a99e2c33..c2665929 100644 --- a/src/render/opengl/render_opengl.mdesk +++ b/src/render/opengl/render_opengl.mdesk @@ -226,23 +226,23 @@ void main(void) rect.xy, rect.zw, rect.zy); - float corner_radii_px[] = float[](corner_radii_px.y, - corner_radii_px.x, - corner_radii_px.w, - corner_radii_px.z); + float corner_radii[] = float[](corner_radii_px.y, + corner_radii_px.x, + corner_radii_px.w, + corner_radii_px.z); vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f, (gl_VertexID & 1) != 0 ? 0.f : 1.f); vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size; vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f; - vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2); + vec2 rect_half_size_local = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2); gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f); texcoord = vec2(vertex_position_pct.x, 1-vertex_position_pct.y); - sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size; - rect_half_size = rect_half_size - 2.f; - corner_radius = corner_radii_px[gl_VertexID]; + sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size_local; + rect_half_size = rect_half_size_local - 2.f; + corner_radius = corner_radii[gl_VertexID]; } ```