Skip to content
This repository has been archived by the owner on Nov 5, 2020. It is now read-only.

Commit

Permalink
Simplified brush render-to-target
Browse files Browse the repository at this point in the history
  • Loading branch information
Apoorva Joshi committed Jan 27, 2017
1 parent 2de17e8 commit 0e29667
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 47 deletions.
11 changes: 7 additions & 4 deletions src/libpapaya/pagl.h
Expand Up @@ -11,6 +11,7 @@ enum Pagl_UniformType_ {
Pagl_UniformType_Vec2,
Pagl_UniformType_Matrix4,
Pagl_UniformType_Color,
Pagl_UniformType_Tex0,
Pagl_UniformType_COUNT
};

Expand Down Expand Up @@ -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) );

Expand Down Expand Up @@ -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);
Expand Down
19 changes: 17 additions & 2 deletions src/ui/common_ui.cpp
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) );
Expand Down Expand Up @@ -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,
Expand Down
79 changes: 38 additions & 41 deletions src/ui/components/brush.cpp
Expand Up @@ -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) );
Expand Down
5 changes: 5 additions & 0 deletions src/ui/components/eye_dropper.cpp
Expand Up @@ -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],
Expand Down

0 comments on commit 0e29667

Please sign in to comment.