diff --git a/src/canvas.cpp b/src/canvas.cpp index a7712b0..cf249b6 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -2202,6 +2202,50 @@ Image Canvas::thumbnail_read(std::string file_path) return thumb; } +void Canvas::draw_objects_direct(std::function observer, Layer& layer) +{ + // save viewport and clear color states + GLint vp[4]; + GLfloat cc[4]; + glGetIntegerv(GL_VIEWPORT, vp); + glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); + GLboolean blend = glIsEnabled(GL_BLEND); + + // prepare common states + glViewport(0, 0, layer.w, layer.h); + glDisable(GL_BLEND); + + GLuint rboID; + glGenRenderbuffers(1, &rboID); + glBindRenderbuffer(GL_RENDERBUFFER, rboID); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, layer.w, layer.h); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + glm::mat4 proj = glm::perspective(glm::radians(90.f), 1.f, .01f, 1000.f); + for (int i = 0; i < 6; i++) + { + glm::mat4 plane_camera = glm::lookAt(glm::vec3(0), m_plane_origin[i], m_plane_tangent[i]); + layer.m_rtt[i].bindFramebuffer(); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID); + + observer(plane_camera, proj, i); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + layer.m_rtt[i].unbindFramebuffer(); + + layer.m_dirty_face[i] = true; + layer.m_dirty_box[i] = { 0, 0, layer.w, layer.h }; + } + + glDeleteRenderbuffers(1, &rboID); + + // restore viewport and clear color states + blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); + glViewport(vp[0], vp[1], vp[2], vp[3]); + glClearColor(cc[0], cc[1], cc[2], cc[3]); + glActiveTexture(GL_TEXTURE0); +} + void Canvas::draw_objects(std::function observer, Layer& layer) { // save viewport and clear color states diff --git a/src/canvas.h b/src/canvas.h index f0a46ac..a3083dc 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -254,6 +254,7 @@ public: Image thumbnail_read(std::string file_path); void draw_objects(std::function); void draw_objects(std::function, Layer& layer); + void draw_objects_direct(std::function, Layer& layer); void point_unproject(glm::vec2 loc, glm::vec4 vp, glm::mat4 camera, glm::mat4 proj, glm::vec3 &out_origin, glm::vec3 &out_dir); void point_unproject(glm::vec2 loc, glm::vec3 &out_origin, glm::vec3 &out_dir); diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 555e74c..bc4561f 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -510,6 +510,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) //m_points2d = poly_intersect(poly_remove_duplicate(m_points2d), canvas->face_to_shape2D(0)); auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) { //glEnable(GL_BLEND); + glDisable(GL_DEPTH_TEST); ShaderManager::use(kShader::Color); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera); ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1}); @@ -519,7 +520,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) auto v = canvas->triangulate(poly_remove_duplicate(m_points2d)); canvas->project2Dpoints(v); m_shape.update_vertices(v.data(), (int)v.size()); - canvas->draw_objects(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); + canvas->draw_objects_direct(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); // close the path and reset m_shape to contour rendering m_points.push_back(m_points.back()); @@ -639,7 +640,7 @@ void CanvasModeMaskLine::leave() ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1}); m_shape.draw_fill(); }; - canvas->draw_objects(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); + canvas->draw_objects_direct(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); //m_points.clear(); // close the path @@ -763,7 +764,7 @@ void CanvasModeFill::leave() ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1}); m_shape.draw_fill(); }; - canvas->draw_objects(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); + canvas->draw_objects_direct(std::bind(drawer, std::placeholders::_1, std::placeholders::_2), canvas->m_smask); m_points.clear(); canvas->m_smask_active = true; }