fix mask
This commit is contained in:
@@ -2202,6 +2202,50 @@ Image Canvas::thumbnail_read(std::string file_path)
|
|||||||
return thumb;
|
return thumb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Canvas::draw_objects_direct(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)> 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<void(const glm::mat4& camera, const glm::mat4& proj, int i)> observer, Layer& layer)
|
void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)> observer, Layer& layer)
|
||||||
{
|
{
|
||||||
// save viewport and clear color states
|
// save viewport and clear color states
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ public:
|
|||||||
Image thumbnail_read(std::string file_path);
|
Image thumbnail_read(std::string file_path);
|
||||||
void draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)>);
|
void draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)>);
|
||||||
void draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)>, Layer& layer);
|
void draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)>, Layer& layer);
|
||||||
|
void draw_objects_direct(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)>, Layer& layer);
|
||||||
void point_unproject(glm::vec2 loc, glm::vec4 vp, glm::mat4 camera, glm::mat4 proj,
|
void point_unproject(glm::vec2 loc, glm::vec4 vp, glm::mat4 camera, glm::mat4 proj,
|
||||||
glm::vec3 &out_origin, glm::vec3 &out_dir);
|
glm::vec3 &out_origin, glm::vec3 &out_dir);
|
||||||
void point_unproject(glm::vec2 loc, glm::vec3 &out_origin, glm::vec3 &out_dir);
|
void point_unproject(glm::vec2 loc, glm::vec3 &out_origin, glm::vec3 &out_dir);
|
||||||
|
|||||||
@@ -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));
|
//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) {
|
auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) {
|
||||||
//glEnable(GL_BLEND);
|
//glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
ShaderManager::use(kShader::Color);
|
ShaderManager::use(kShader::Color);
|
||||||
ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera);
|
ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera);
|
||||||
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
|
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));
|
auto v = canvas->triangulate(poly_remove_duplicate(m_points2d));
|
||||||
canvas->project2Dpoints(v);
|
canvas->project2Dpoints(v);
|
||||||
m_shape.update_vertices(v.data(), (int)v.size());
|
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
|
// close the path and reset m_shape to contour rendering
|
||||||
m_points.push_back(m_points.back());
|
m_points.push_back(m_points.back());
|
||||||
@@ -639,7 +640,7 @@ void CanvasModeMaskLine::leave()
|
|||||||
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
|
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
|
||||||
m_shape.draw_fill();
|
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();
|
//m_points.clear();
|
||||||
// close the path
|
// close the path
|
||||||
@@ -763,7 +764,7 @@ void CanvasModeFill::leave()
|
|||||||
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
|
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
|
||||||
m_shape.draw_fill();
|
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();
|
m_points.clear();
|
||||||
canvas->m_smask_active = true;
|
canvas->m_smask_active = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user