From 0e29667259413774332aa01de39f1dd85c35dccb Mon Sep 17 00:00:00 2001 From: Apoorva Joshi Date: Fri, 27 Jan 2017 19:14:10 +0530 Subject: [PATCH] Simplified brush render-to-target --- src/libpapaya/pagl.h | 11 +++-- src/ui/common_ui.cpp | 19 +++++++- src/ui/components/brush.cpp | 79 +++++++++++++++---------------- src/ui/components/eye_dropper.cpp | 5 ++ 4 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/libpapaya/pagl.h b/src/libpapaya/pagl.h index d251ef2..dd571a4 100644 --- a/src/libpapaya/pagl.h +++ b/src/libpapaya/pagl.h @@ -11,6 +11,7 @@ enum Pagl_UniformType_ { Pagl_UniformType_Vec2, Pagl_UniformType_Matrix4, Pagl_UniformType_Color, + Pagl_UniformType_Tex0, Pagl_UniformType_COUNT }; @@ -366,10 +367,6 @@ void pagl_draw_mesh(PaglMesh* mesh, PaglProgram* pgm, i32 num_uniforms, ...) GLint last_program, last_texture; GLCHK( glGetIntegerv(GL_CURRENT_PROGRAM, &last_program) ); GLCHK( glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture) ); - GLCHK( glEnable(GL_BLEND) ); - GLCHK( glBlendEquation(GL_FUNC_ADD) ); - GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); - GLCHK( glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo_handle) ); GLCHK( glUseProgram(pgm->id) ); @@ -397,6 +394,12 @@ void pagl_draw_mesh(PaglMesh* mesh, PaglProgram* pgm, i32 num_uniforms, ...) Color col = va_arg(args, Color); GLCHK( glUniform4f(u, col.r, col.g, col.b, col.a) ); } break; + + case Pagl_UniformType_Tex0: { + u32 tex = va_arg(args, u32); + GLCHK( glActiveTexture(GL_TEXTURE0) ); + GLCHK( glBindTexture(GL_TEXTURE_2D, tex) ); + } break; } } va_end(args); diff --git a/src/ui/common_ui.cpp b/src/ui/common_ui.cpp index bd81fc8..4b4baa2 100644 --- a/src/ui/common_ui.cpp +++ b/src/ui/common_ui.cpp @@ -673,6 +673,10 @@ void core::update(PapayaMemory* mem) Vec2((f32)(mem->window.width - mem->cur_doc->width) / 2, top_margin + (f32)(mem->window.height - top_margin - mem->cur_doc->height) / 2), Vec2((f32)mem->cur_doc->width, (f32)mem->cur_doc->height)); + GLCHK( glEnable(GL_BLEND) ); + GLCHK( glBlendEquation(GL_FUNC_ADD) ); + GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); + pagl_draw_mesh(mem->meshes[PapayaMesh_ImageSizePreview], mem->shaders[PapayaShader_ImageSizePreview], 5, @@ -829,6 +833,10 @@ void core::update(PapayaMemory* mem) mat4x4_dup(m, r); } + GLCHK( glEnable(GL_BLEND) ); + GLCHK( glBlendEquation(GL_FUNC_ADD) ); + GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); + pagl_draw_mesh(mem->meshes[PapayaMesh_AlphaGrid], mem->shaders[PapayaShader_AlphaGrid], 6, @@ -870,13 +878,16 @@ void core::update(PapayaMemory* mem) GLCHK( glBindTexture(GL_TEXTURE_2D, mem->misc.canvas_tex) ); GLCHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ) ); GLCHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ); + GLCHK( glEnable(GL_BLEND) ); + GLCHK( glBlendEquation(GL_FUNC_ADD) ); + GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); + pagl_draw_mesh(mem->meshes[PapayaMesh_Canvas], mem->shaders[PapayaShader_ImGui], 1, Pagl_UniformType_Matrix4, m); - if (mem->misc.draw_overlay) - { + if (mem->brush->being_dragged) { GLCHK( glBindTexture (GL_TEXTURE_2D, (GLuint)(intptr_t)mem->misc.fbo_sample_tex) ); GLCHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ) ); GLCHK( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ); @@ -908,6 +919,10 @@ void core::update(PapayaMemory* mem) - (Vec2(ScaledDiameter,ScaledDiameter) * 0.5f), Vec2(ScaledDiameter,ScaledDiameter)); + GLCHK( glEnable(GL_BLEND) ); + GLCHK( glBlendEquation(GL_FUNC_ADD) ); + GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); + pagl_draw_mesh(mem->brush->mesh_cursor, mem->brush->pgm_cursor, 4, diff --git a/src/ui/components/brush.cpp b/src/ui/components/brush.cpp index f564c32..f99c224 100644 --- a/src/ui/components/brush.cpp +++ b/src/ui/components/brush.cpp @@ -102,62 +102,59 @@ static void draw_brush_stroke(PapayaMemory* mem) GLCHK( glDisable(GL_BLEND) ); GLCHK( glDisable(GL_SCISSOR_TEST) ); - // TODO: Call pagl_draw_mesh { GLCHK( glUseProgram(b->pgm_stroke->id) ); - f32 width = (f32)mem->cur_doc->width; - f32 height = (f32)mem->cur_doc->height; - Vec2 Correction = (b->diameter % 2 == 0 ? Vec2() : Vec2(0.5f/width, 0.5f/height)); - Vec2 CorrectedPos = mem->mouse.uv + Correction; - Vec2 CorrectedLastPos = (b->draw_line_segment ? b->line_segment_start_uv : mem->mouse.last_uv) + Correction; + // TODO: Tidy up the uniform calculation variables + f32 w = (f32)mem->cur_doc->width; + f32 h = (f32)mem->cur_doc->height; + Vec2 c = (b->diameter % 2 == 0 ? Vec2() : + Vec2(0.5f / w, 0.5f / h)); // Pixel correction + + Vec2 pos = mem->mouse.uv + c; + Vec2 last_pos = (b->draw_line_segment ? + b->line_segment_start_uv : mem->mouse.last_uv) + c; + pos.y *= mem->cur_doc->inverse_aspect; + last_pos.y *= mem->cur_doc->inverse_aspect; b->draw_line_segment = false; - PaglProgram* pgm = b->pgm_stroke; - GLCHK( glUniformMatrix4fv(pgm->uniforms[0], 1, GL_FALSE, &mem->cur_doc->proj_mtx[0][0]) ); - GLCHK( glUniform2f(pgm->uniforms[2], CorrectedPos.x, CorrectedPos.y * mem->cur_doc->inverse_aspect) ); // Pos uniform - GLCHK( glUniform2f(pgm->uniforms[3], CorrectedLastPos.x, CorrectedLastPos.y * mem->cur_doc->inverse_aspect) ); // Lastpos uniform - GLCHK( glUniform1f(pgm->uniforms[4], (f32)b->diameter / ((f32)mem->cur_doc->width * 2.0f)) ); - f32 Opacity = b->opacity; - //if (mem->tablet.Pressure > 0.0f) { Opacity *= mem->tablet.Pressure; } - GLCHK( glUniform4f(pgm->uniforms[5], mem->color_panel->current_color.r, - mem->color_panel->current_color.g, - mem->color_panel->current_color.b, - Opacity) ); - // Brush hardness + f32 hardness; { - f32 Hardness; - if (b->anti_alias && b->diameter > 2) - { - f32 AAWidth = 1.0f; // The width of pixels over which the antialiased falloff occurs - f32 Radius = b->diameter / 2.0f; - Hardness = math::min(b->hardness, 1.0f - (AAWidth / Radius)); - } - else - { - Hardness = b->hardness; + if (b->anti_alias && b->diameter > 2) { + f32 aa_width = 1.0f; // The width of pixels over which the antialiased falloff occurs + f32 radius = b->diameter / 2.0f; + hardness = math::min(b->hardness, 1.0f - (aa_width / radius)); + } else { + hardness = b->hardness; } - - GLCHK( glUniform1f(pgm->uniforms[6], Hardness) ); } - GLCHK( glUniform1f(pgm->uniforms[7], mem->cur_doc->inverse_aspect) ); // Inverse Aspect uniform + f32 uv_dia = (f32)b->diameter / ((f32)mem->cur_doc->width * 2.0f); + Color* a = &mem->color_panel->current_color; + Color col = Color(a->r, a->g, a->b, b->opacity); - GLCHK( glBindBuffer(GL_ARRAY_BUFFER, b->mesh_RTTBrush->vbo_handle) ); - pagl_set_vertex_attribs(pgm); - GLCHK( glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)mem->misc.fbo_sample_tex) ); - GLCHK( glDrawArrays(GL_TRIANGLES, 0, 6) ); + pagl_draw_mesh(b->mesh_RTTBrush, b->pgm_stroke, 8, + Pagl_UniformType_Matrix4, &mem->cur_doc->proj_mtx[0][0], + Pagl_UniformType_Tex0, mem->misc.fbo_sample_tex, + Pagl_UniformType_Vec2, pos, + Pagl_UniformType_Vec2, last_pos, + Pagl_UniformType_Float, uv_dia, + Pagl_UniformType_Color, col, + Pagl_UniformType_Float, hardness, + Pagl_UniformType_Float, mem->cur_doc->inverse_aspect); } // Swap textures - u32 Temp = mem->misc.fbo_render_tex; - mem->misc.fbo_render_tex = mem->misc.fbo_sample_tex; - mem->misc.fbo_sample_tex = Temp; - // TODO: Necessary? - GLCHK( glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, mem->misc.fbo_render_tex, 0) ); + { + u32 temp = mem->misc.fbo_render_tex; + mem->misc.fbo_render_tex = mem->misc.fbo_sample_tex; + mem->misc.fbo_sample_tex = temp; + GLCHK( glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, mem->misc.fbo_render_tex, + 0) ); + } // Reset frame buffer and viewport GLCHK( glBindFramebuffer(GL_FRAMEBUFFER, 0) ); diff --git a/src/ui/components/eye_dropper.cpp b/src/ui/components/eye_dropper.cpp index 6b2a1ed..7670287 100644 --- a/src/ui/components/eye_dropper.cpp +++ b/src/ui/components/eye_dropper.cpp @@ -39,6 +39,11 @@ void update_and_render_eye_dropper(PapayaMemory* mem) pagl_push_state(); pagl_enable(1, GL_SCISSOR_TEST); + + GLCHK( glEnable(GL_BLEND) ); + GLCHK( glBlendEquation(GL_FUNC_ADD) ); + GLCHK( glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); + pagl_draw_mesh(mem->eye_dropper->mesh, mem->eye_dropper->pgm, 3, Pagl_UniformType_Matrix4, &mem->window.proj_mtx[0][0],