diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index e5382eb..863a736 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -953,9 +953,9 @@ void CanvasModeTransform::enter() p2d.y = canvas->m_box.w - p2d.y - 1; auto p2d_clip = ((p2d / zw(canvas->m_box)) * 2.f - 1.f); auto p3d_plane = canvas->m_plane_unproject[plane] * glm::vec4(p2d_clip, 0, 1); - auto p3d_norm = -p3d_plane / p3d_plane.z; - if (p3d_norm.w < 0) + if (p3d_plane.w < 0) continue; + auto p3d_norm = -p3d_plane / p3d_plane.z; auto p2d_plane = xy(p3d_norm); auto p2d_plane_raster = (p2d_plane * 0.5f + 0.5f) * canvas->m_size; auto p3d_world = canvas->m_plane_transform[plane] * glm::vec4(p2d_plane, -1, 1); @@ -1034,7 +1034,7 @@ void CanvasModeTransform::enter() for (auto p : m_points_face[j]) { auto p_clip = mvp * p.pos; - auto p_norm = p_clip / p_clip.z; + auto p_norm = p_clip / p_clip.w; if (p_clip.w < 0 || glm::any(glm::greaterThan(glm::abs(xy(p_norm)), { 1, 1 }))) continue; auto p_raster = (xy(p_norm) * 0.5f + 0.5f) * canvas->m_size; @@ -1268,9 +1268,9 @@ void CanvasModeTransform::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, for (int i = 0; i < corners.size(); i++) { auto c = m2d * glm::vec4(corners[i], 1); - auto c3d = c / c.z; - if (c3d.w < 0) + if (c.w < 0) continue; + auto c3d = c / c.w; auto c2d = (xy(c3d) * 0.5f + 0.5f) * zw(canvas->m_box); ShaderManager::u_mat4(kShaderUniform::MVP, diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 9480763..d627a8a 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -268,7 +268,7 @@ void NodeCanvas::draw() mode->on_Draw(ortho_proj, proj, camera); glDisable(GL_DEPTH_TEST); - if (m_canvas->m_smask_active) + if (m_canvas->m_smask_active || m_canvas->m_state == Canvas::kCanvasMode::Transform) { m_canvas->modes[(int)Canvas::kCanvasMode::MaskFree][0]->on_Draw(ortho_proj, proj, camera); m_canvas->modes[(int)Canvas::kCanvasMode::MaskLine][0]->on_Draw(ortho_proj, proj, camera);