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);
+}