From f7450bb8f3aa7f6c9fb524c80927a33a7f8a0817 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:44:05 +0100 Subject: [PATCH 01/14] Create line_stipple.frag --- src/shaders/line_stipple.frag | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/shaders/line_stipple.frag diff --git a/src/shaders/line_stipple.frag b/src/shaders/line_stipple.frag new file mode 100644 index 0000000..912cae1 --- /dev/null +++ b/src/shaders/line_stipple.frag @@ -0,0 +1,35 @@ +#version 330 core + +layout (location = 0) in vec3 position; +out vec4 color; + +uniform float line_width; +uniform float line_stipple_factor; +uniform float line_stipple_pattern; + + +void main() { + float step = 1.0 / line_stipple_factor; + float pattern = mod(position.x * step, line_stipple_pattern); + if (pattern > 0.5) { + discard; + } + gl_Position = vec4(position, 1.0); + color = vec4(1.0, 0.0, 0.0, 1.0); +} + +// Compile the shader +GLuint shader = glCreateShader(GL_VERTEX_SHADER); +glShaderSource(shader,1, &shader_source, NULL); +glCompileShader(shader); + +// Bind the shader to the current OpenGl context +glUseProgram(shader); + +// Set the uniforms +glUniform1f(glGetUniformLocation(shader, "line_width"), 1.0f); +glUniform1i(glGetUniformLocation(shader, "line_stipple_factor"), 1); +glUniform1ui(glGetUniformLocation(shader, "line_stipple_pattern"), 0xFFFF); + +// Draw the line +glDrawArrays(GL_LINE_STRIP, 0, 4); From d430343cf6538f715b471732dc0a344763880ec9 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Mon, 24 Jul 2023 10:51:03 +0100 Subject: [PATCH 02/14] Update shaders.qrc --- src/shaders.qrc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/shaders.qrc b/src/shaders.qrc index ac06ea9..482aa52 100644 --- a/src/shaders.qrc +++ b/src/shaders.qrc @@ -5,6 +5,7 @@ shaders/phong.frag shaders/phongpervertex.frag shaders/monochrome.frag + shaders/line_stipple.frag shaders/line_tesselator.geom From d5472f21d76393ee710bfa264e01b1c3451c28f0 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:30:19 +0100 Subject: [PATCH 03/14] Update material.cpp --- src/material.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/material.cpp b/src/material.cpp index 61f28a5..d6e3e26 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -71,6 +71,10 @@ RenderableMaterial::RenderableMaterial(Qt3DCore::QNode *parent, VertexShaderType shader3->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/monochrome.frag")))); break; + case (FragmentShaderType::LineStipple): + shader3->setFragmentShaderCode( + Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/line_stipple.frag")))); + break; case (FragmentShaderType::Phong): shader3->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/phong.frag")))); @@ -122,4 +126,4 @@ void RenderableMaterial::setSpecular(QColor specular) { specular_ = specular; specularParameter_->setValue(specular_); -} \ No newline at end of file +} From dd73a1683e5e10db3fae4c28b096c73cd38e9752 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Mon, 24 Jul 2023 11:31:19 +0100 Subject: [PATCH 04/14] Update material.h --- src/material.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/material.h b/src/material.h index 04977de..56567bf 100644 --- a/src/material.h +++ b/src/material.h @@ -26,7 +26,8 @@ class RenderableMaterial : public Qt3DRender::QMaterial { Monochrome, Phong, - PerVertexPhong + PerVertexPhong, + LineStipple }; explicit RenderableMaterial(Qt3DCore::QNode *parent, VertexShaderType vertexShader, GeometryShaderType geometryShader, FragmentShaderType fragmentShader); @@ -56,4 +57,4 @@ class RenderableMaterial : public Qt3DRender::QMaterial // Set specular colour component void setSpecular(QColor specular); }; -} // namespace Mildred \ No newline at end of file +} // namespace Mildred From 2341f19fcb0aac149da8425a6569dfa5b7c89ec2 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Tue, 25 Jul 2023 11:07:53 +0100 Subject: [PATCH 05/14] Update line_stipple.frag --- src/shaders/line_stipple.frag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shaders/line_stipple.frag b/src/shaders/line_stipple.frag index 912cae1..618e911 100644 --- a/src/shaders/line_stipple.frag +++ b/src/shaders/line_stipple.frag @@ -11,7 +11,7 @@ uniform float line_stipple_pattern; void main() { float step = 1.0 / line_stipple_factor; float pattern = mod(position.x * step, line_stipple_pattern); - if (pattern > 0.5) { + if (pattern > 0.5 || pattern > 0.5) { discard; } gl_Position = vec4(position, 1.0); From 7caca732e1e46f1b59c714af703ad7c3a5462a47 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Thu, 27 Jul 2023 12:08:54 +0100 Subject: [PATCH 06/14] Convert Line-Stipple shader to geometric shader --- .../{line_stipple.frag => line_stipple.geom} | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) rename src/shaders/{line_stipple.frag => line_stipple.geom} (78%) diff --git a/src/shaders/line_stipple.frag b/src/shaders/line_stipple.geom similarity index 78% rename from src/shaders/line_stipple.frag rename to src/shaders/line_stipple.geom index 618e911..2037c4a 100644 --- a/src/shaders/line_stipple.frag +++ b/src/shaders/line_stipple.geom @@ -3,19 +3,28 @@ layout (location = 0) in vec3 position; out vec4 color; + uniform float line_width; uniform float line_stipple_factor; uniform float line_stipple_pattern; +// Set the uniforms +glUniform1f(glGetUniformLocation(shader, "line_width"), 1.0f); +glUniform1i(glGetUniformLocation(shader, "line_stipple_factor"), 1); +glUniform1ui(glGetUniformLocation(shader, "line_stipple_pattern"), 0xFFFF); + void main() { float step = 1.0 / line_stipple_factor; - float pattern = mod(position.x * step, line_stipple_pattern); + float pattern = mod(dot(position.xy, vec2(1.0, line_width)), line_stipple_pattern); if (pattern > 0.5 || pattern > 0.5) { - discard; + color = vec4(0.0, 0.0, 0.0, 0.0); + } else { + color = vec4(1.0, 0.0, 0.0, 1.0); } gl_Position = vec4(position, 1.0); - color = vec4(1.0, 0.0, 0.0, 1.0); + EmitVertex(); + EndPrimitive(); } // Compile the shader @@ -26,10 +35,5 @@ glCompileShader(shader); // Bind the shader to the current OpenGl context glUseProgram(shader); -// Set the uniforms -glUniform1f(glGetUniformLocation(shader, "line_width"), 1.0f); -glUniform1i(glGetUniformLocation(shader, "line_stipple_factor"), 1); -glUniform1ui(glGetUniformLocation(shader, "line_stipple_pattern"), 0xFFFF); - // Draw the line glDrawArrays(GL_LINE_STRIP, 0, 4); From 1c130b9c299bdeea6f94b1192ebf24831054058b Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Thu, 27 Jul 2023 12:09:33 +0100 Subject: [PATCH 07/14] Update shaders.qrc --- src/shaders.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shaders.qrc b/src/shaders.qrc index 482aa52..8c8bfd4 100644 --- a/src/shaders.qrc +++ b/src/shaders.qrc @@ -5,7 +5,7 @@ shaders/phong.frag shaders/phongpervertex.frag shaders/monochrome.frag - shaders/line_stipple.frag + shaders/line_stipple.geom shaders/line_tesselator.geom From 2cc01b1bc00ca48ed00049727101514bd3e69d5e Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Thu, 27 Jul 2023 12:13:41 +0100 Subject: [PATCH 08/14] Update material.cpp --- src/material.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/material.cpp b/src/material.cpp index d6e3e26..c2070e2 100644 --- a/src/material.cpp +++ b/src/material.cpp @@ -62,6 +62,10 @@ RenderableMaterial::RenderableMaterial(Qt3DCore::QNode *parent, VertexShaderType shader3->setGeometryShaderCode( Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/line_tesselator.geom")))); break; + case (GeometryShaderType::LineStipple): + shader3->setGeometryShaderCode( + Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/line_stipple.geom")))); + break; default: throw(std::runtime_error("Unhandled geometry shader type.\n")); } @@ -71,10 +75,6 @@ RenderableMaterial::RenderableMaterial(Qt3DCore::QNode *parent, VertexShaderType shader3->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/monochrome.frag")))); break; - case (FragmentShaderType::LineStipple): - shader3->setFragmentShaderCode( - Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/line_stipple.frag")))); - break; case (FragmentShaderType::Phong): shader3->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource(QUrl(QStringLiteral("qrc:/shaders/shaders/phong.frag")))); From 23cdd81427b84663d269f7e61246cf674f23838c Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Thu, 27 Jul 2023 12:15:05 +0100 Subject: [PATCH 09/14] Update material.h --- src/material.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/material.h b/src/material.h index 56567bf..059ffcb 100644 --- a/src/material.h +++ b/src/material.h @@ -19,15 +19,15 @@ class RenderableMaterial : public Qt3DRender::QMaterial enum class GeometryShaderType { None, - LineTesselator + LineTesselator, + LineStipple, }; // Fragment Shader Types enum class FragmentShaderType { Monochrome, Phong, - PerVertexPhong, - LineStipple + PerVertexPhong }; explicit RenderableMaterial(Qt3DCore::QNode *parent, VertexShaderType vertexShader, GeometryShaderType geometryShader, FragmentShaderType fragmentShader); From 613f0b50afdd99053d934bec2cc8c07a611ec88c Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:19:00 +0100 Subject: [PATCH 10/14] Update material.cpp From 975aad080c8dcfe25b79dc6e5a54011df44d0a05 Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:23:42 +0100 Subject: [PATCH 11/14] Update material.h --- src/material.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/material.h b/src/material.h index 059ffcb..e593118 100644 --- a/src/material.h +++ b/src/material.h @@ -20,7 +20,7 @@ class RenderableMaterial : public Qt3DRender::QMaterial { None, LineTesselator, - LineStipple, + LineStipple }; // Fragment Shader Types enum class FragmentShaderType From ee619c0cff772c79c736cbcfce98a4c57ca5e7ac Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:24:55 +0100 Subject: [PATCH 12/14] Update shaders.qrc --- src/shaders.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shaders.qrc b/src/shaders.qrc index 8c8bfd4..7663dd7 100644 --- a/src/shaders.qrc +++ b/src/shaders.qrc @@ -5,7 +5,7 @@ shaders/phong.frag shaders/phongpervertex.frag shaders/monochrome.frag - shaders/line_stipple.geom shaders/line_tesselator.geom + shaders/line_stipple.geom From c46019379b93d19aebc72fb1cf09c8b6d71bc3bd Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:26:30 +0100 Subject: [PATCH 13/14] Update widget.cpp --- src/widget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widget.cpp b/src/widget.cpp index bde20f9..fbe1df9 100644 --- a/src/widget.cpp +++ b/src/widget.cpp @@ -195,7 +195,7 @@ Data1DEntity *MildredWidget::addData1D(std::string_view tag) // Add a material auto *material = createMaterial(entity, RenderableMaterial::VertexShaderType::ClippedToDataVolume, - RenderableMaterial::GeometryShaderType::LineTesselator, + RenderableMaterial::GeometryShaderType::LineStipple, RenderableMaterial::FragmentShaderType::PerVertexPhong); entity->setDataMaterial(material); entity->setErrorMaterial(material); @@ -214,4 +214,4 @@ DisplayGroup *MildredWidget::addDisplayGroup() auto newGroup = displayGroups_.emplace_back(std::make_shared()); return newGroup.get(); -} \ No newline at end of file +} From b810d3dc6e82f6f9d29a360bf4e4733052c8088f Mon Sep 17 00:00:00 2001 From: Pranavya Vivekanand <135618736+Pranavya-Vivek@users.noreply.github.com> Date: Fri, 4 Aug 2023 11:28:30 +0100 Subject: [PATCH 14/14] Update line_stipple.geom --- src/shaders/line_stipple.geom | 98 ++++++++++++++++++++++++----------- 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/src/shaders/line_stipple.geom b/src/shaders/line_stipple.geom index 2037c4a..38f942c 100644 --- a/src/shaders/line_stipple.geom +++ b/src/shaders/line_stipple.geom @@ -1,39 +1,79 @@ -#version 330 core +#version 330 -layout (location = 0) in vec3 position; -out vec4 color; +layout(lines) in; +layout(triangle_strip, max_vertices = 4) out; +// Input Vertex Data +in worldData +{ + vec3 position; + vec3 normal; + vec4 color; +} +vertices[]; + +// Output Fragment Data +out fragData +{ + vec3 position; + vec3 normal; + vec4 color; +} +frag; -uniform float line_width; -uniform float line_stipple_factor; -uniform float line_stipple_pattern; +uniform vec2 viewportSize; +uniform float lineWidth = 1.5; -// Set the uniforms -glUniform1f(glGetUniformLocation(shader, "line_width"), 1.0f); -glUniform1i(glGetUniformLocation(shader, "line_stipple_factor"), 1); -glUniform1ui(glGetUniformLocation(shader, "line_stipple_pattern"), 0xFFFF); +// Copy clip distances for specified input vertex +void applyClipping(int inVertexID) +{ + gl_ClipDistance[0] = gl_in[inVertexID].gl_ClipDistance[0]; + gl_ClipDistance[1] = gl_in[inVertexID].gl_ClipDistance[1]; + gl_ClipDistance[2] = gl_in[inVertexID].gl_ClipDistance[2]; + gl_ClipDistance[3] = gl_in[inVertexID].gl_ClipDistance[3]; + gl_ClipDistance[4] = gl_in[inVertexID].gl_ClipDistance[4]; + gl_ClipDistance[5] = gl_in[inVertexID].gl_ClipDistance[5]; +} + +void main() +{ + vec4 p1 = gl_in[0].gl_Position; + vec4 p2 = gl_in[1].gl_Position; + vec2 dir = normalize((p2.xy - p1.xy) * viewportSize); + vec2 offset = vec2(-dir.y, dir.x) * lineWidth / viewportSize; -void main() { - float step = 1.0 / line_stipple_factor; - float pattern = mod(dot(position.xy, vec2(1.0, line_width)), line_stipple_pattern); - if (pattern > 0.5 || pattern > 0.5) { - color = vec4(0.0, 0.0, 0.0, 0.0); - } else { - color = vec4(1.0, 0.0, 0.0, 1.0); - } - gl_Position = vec4(position, 1.0); + // Emit the four corners of our two triangles + gl_Position = p1 + vec4(offset.xy * p1.w, 0.0, 0.0); + applyClipping(0); + frag.position = vec3(gl_Position); + frag.color = vertices[0].color; + frag.normal = vertices[1].normal; EmitVertex(); - EndPrimitive(); -} + gl_Position = p1 - vec4(offset.xy * p1.w, 0.0, 0.0); + applyClipping(0); + frag.position = vec3(gl_Position); + frag.color = vertices[0].color; + frag.normal = vertices[0].normal; + EmitVertex(); + gl_Position = p2 + vec4(offset.xy * p2.w, 0.0, 0.0); + applyClipping(1); + frag.position = vec3(gl_Position); + frag.color = vertices[1].color; + frag.normal = vertices[1].normal; + EmitVertex(); + gl_Position = p2 - vec4(offset.xy * p2.w, 0.0, 0.0); + applyClipping(1); + frag.position = vec3(gl_Position); + frag.color = vertices[1].color; + frag.normal = vertices[1].normal; -// Compile the shader -GLuint shader = glCreateShader(GL_VERTEX_SHADER); -glShaderSource(shader,1, &shader_source, NULL); -glCompileShader(shader); + // To view line-stipple output, remove comment bars (//) from the following two lines + //gl_Position = p1 + vec4(offset.xy * p1.w, 0.0, 0.0); + //applyClipping(0); + + EmitVertex(); -// Bind the shader to the current OpenGl context -glUseProgram(shader); + EndPrimitive(); -// Draw the line -glDrawArrays(GL_LINE_STRIP, 0, 4); +}