diff --git a/engine/app.cpp b/engine/app.cpp index 538e141..20a1993 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -240,6 +240,28 @@ void App::initShaders() " frag = vec4(rgb, alpha_tot);\n" "}\n"; + static const char* shader_checkerboard_v = + SHADER_VERSION + "uniform mat4 mvp;\n" + "in vec4 pos;\n" + "in vec2 uvs;\n" + "out vec2 uv;\n" + "void main(){\n" + " uv = uvs;\n" + " gl_Position = mvp * vec4(pos.xyz, 1.0);\n" + "}"; + static const char* shader_checkerboard_f = + SHADER_VERSION + "in mediump vec2 uv;\n" + "out mediump vec4 frag;\n" + "void main(){\n" + " const vec4 c1 = vec4(1.0, 1.0, 1.0, 1.0);\n" + " const vec4 c2 = vec4(0.9, 0.9, 0.9, 1.0);\n" + " vec2 c = floor(fract(uv * 10.0) * 2.0);\n" + " float alpha = mix(c.x, 1.0 - c.x, c.y);\n" + " frag = mix(c1, c2, alpha);\n" + "}"; + LOG("initializing shaders"); if (!ShaderManager::create(kShader::Texture, shader_v, shader_f)) LOG("Failed to create shader Texture"); @@ -263,6 +285,8 @@ void App::initShaders() LOG("Failed to create shader StrokeErase"); if (!ShaderManager::create(kShader::StrokeLayer, shader_stroke_layer_v, shader_stroke_layer_f)) LOG("Failed to create shader StrokeLayer"); + if (!ShaderManager::create(kShader::Checkerboard, shader_checkerboard_v, shader_checkerboard_f)) + LOG("Failed to create shader Checkerboard"); LOG("shaders initialized"); } diff --git a/engine/layout.h b/engine/layout.h index 098168e..f06839a 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -1932,19 +1932,24 @@ public: // auto plane_mvp = proj * camera * transform * // glm::scale(glm::vec3(sz, 1)); + m_sampler.bind(0); - ui::ShaderManager::use(kShader::TextureAlpha); - ui::ShaderManager::u_int(kShaderUniform::Tex, 0); - auto blend = glIsEnabled(GL_BLEND); glEnable(GL_BLEND); - for (auto layer_index : m_canvas->m_order) + for (int plane_index = 0; plane_index < 6; plane_index++) { - for (int plane_index = 0; plane_index < 6; plane_index++) + auto plane_mvp = proj * camera * m_canvas->m_plane_transform[plane_index] * glm::translate(glm::vec3(0, 0, -1)); + + ui::ShaderManager::use(kShader::Checkerboard); + ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp); + m_face_plane.draw_fill(); + + ui::ShaderManager::use(kShader::TextureAlpha); + ui::ShaderManager::u_int(kShaderUniform::Tex, 0); + ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp); + for (auto layer_index : m_canvas->m_order) { - auto plane_mvp = proj * camera * m_canvas->m_plane_transform[plane_index] * glm::translate(glm::vec3(0, 0, -1)); - ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp); if (!(m_canvas->m_erase && m_canvas->m_show_tmp && m_canvas->m_current_layer_idx == layer_index)) { ui::ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index].m_opacity); diff --git a/engine/shader.h b/engine/shader.h index f603566..3d55eda 100644 --- a/engine/shader.h +++ b/engine/shader.h @@ -29,6 +29,7 @@ enum class kShader : uint16_t Stroke = const_hash("stroke"), StrokeErase = const_hash("stroke-erase"), StrokeLayer = const_hash("stroke-layer"), + Checkerboard= const_hash("checkerboard"), }; class Shader