From cc2b8da6a4cb1a7aa2fbcc136fa07d003e6f748a Mon Sep 17 00:00:00 2001 From: enricoturri1966 Date: Tue, 14 Dec 2021 13:53:37 +0100 Subject: #7461 - Use three floats for defining vertex normal to render travel toolpaths. This fixes a crash on NVIDIA Quadro graphics cards when turning on travel moves visibility in preview. --- resources/shaders/toolpaths_lines.vs | 14 ++------------ src/slic3r/GUI/GCodeViewer.cpp | 14 +++++++++----- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/resources/shaders/toolpaths_lines.vs b/resources/shaders/toolpaths_lines.vs index 85d5c641f..c008aedc6 100644 --- a/resources/shaders/toolpaths_lines.vs +++ b/resources/shaders/toolpaths_lines.vs @@ -2,18 +2,8 @@ varying vec3 eye_normal; -vec3 world_normal() -{ - // the world normal is always parallel to the world XY plane - // the x component is stored into gl_Vertex.w - float x = gl_Vertex.w; - float y = sqrt(1.0 - x * x); - return vec3(x, y, 0.0); -} - void main() { - vec4 world_position = vec4(gl_Vertex.xyz, 1.0); - gl_Position = gl_ModelViewProjectionMatrix * world_position; - eye_normal = gl_NormalMatrix * world_normal(); + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; + eye_normal = gl_NormalMatrix * gl_Normal; } diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 5f61c84cc..6b9ba5da9 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -608,7 +608,7 @@ void GCodeViewer::init() } case EMoveType::Travel: { buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line; - buffer.vertices.format = VBuffer::EFormat::PositionNormal1; + buffer.vertices.format = VBuffer::EFormat::PositionNormal3; buffer.shader = "toolpaths_lines"; break; } @@ -1140,15 +1140,19 @@ void GCodeViewer::load_toolpaths(const GCodeProcessorResult& gcode_result) // format data into the buffers to be rendered as lines auto add_vertices_as_line = [](const GCodeProcessorResult::MoveVertex& prev, const GCodeProcessorResult::MoveVertex& curr, VertexBuffer& vertices) { // x component of the normal to the current segment (the normal is parallel to the XY plane) - const float normal_x = (curr.position - prev.position).normalized().y(); + const Vec3f dir = (curr.position - prev.position).normalized(); + Vec3f normal(dir.y(), -dir.x(), 0.0); + normal.normalize(); - auto add_vertex = [&vertices, normal_x](const GCodeProcessorResult::MoveVertex& vertex) { + auto add_vertex = [&vertices, &normal](const GCodeProcessorResult::MoveVertex& vertex) { // add position vertices.push_back(vertex.position.x()); vertices.push_back(vertex.position.y()); vertices.push_back(vertex.position.z()); - // add normal x component - vertices.push_back(normal_x); + // add normal + vertices.push_back(normal.x()); + vertices.push_back(normal.y()); + vertices.push_back(normal.z()); }; // add previous vertex -- cgit v1.2.3