From 43492fb8a648c15e7a7af038df8c8659e43715e6 Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 01:08:48 +0200 Subject: [PATCH 1/7] feat: add use_circular_points mask to activate circular points on all platforms but linux --- src/compas_viewer/renderer/shaders/model.frag | 3 ++- src/compas_viewer/renderer/shaders/shader.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/compas_viewer/renderer/shaders/model.frag b/src/compas_viewer/renderer/shaders/model.frag index 83542b1b0b..70a31fecb0 100644 --- a/src/compas_viewer/renderer/shaders/model.frag +++ b/src/compas_viewer/renderer/shaders/model.frag @@ -14,6 +14,7 @@ in float object_opacity; // Uniforms uniform float opacity; uniform bool is_lighted; +uniform bool use_circular_points; uniform vec3 selection_color; uniform int element_type; uniform bool is_instance; @@ -50,7 +51,7 @@ void main() { } // Draw circular points - if (element_type == 0) { + if (element_type == 0 && use_circular_points) { vec2 center = gl_PointCoord - vec2(0.5); if (length(center) > 0.5) { discard; diff --git a/src/compas_viewer/renderer/shaders/shader.py b/src/compas_viewer/renderer/shaders/shader.py index f42de7a8d4..d5d7f3202d 100644 --- a/src/compas_viewer/renderer/shaders/shader.py +++ b/src/compas_viewer/renderer/shaders/shader.py @@ -1,3 +1,4 @@ +import sys from pathlib import Path from typing import Any from typing import Union @@ -214,6 +215,11 @@ def draw_points(self, size: float = 1, elements: Any = None, n: int = 0, backgro background : bool, optional Draw in background. """ + use_circular_points = True + if sys.platform == "linux" or sys.platform == "linux2": + use_circular_points = False + self.uniform1i("use_circular_points", use_circular_points) + GL.glPointSize(size) if elements: if background: From 41915b2f2c6739dd8fff2e3cfad814ba29df5835 Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 01:15:12 +0200 Subject: [PATCH 2/7] feat: add new entry under Unreleased --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cc624483f..66cc8086f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added +* Added a use_circular_points flag in the Shader.draw_point() method to disable circular mask on points on linux because it did not work on opengl-linux. This flag is checked in model.frag before applying the mask on points ### Changed From c4e237afce09e0d132a1f6e5d455b8afb88f7346 Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 13:01:30 +0200 Subject: [PATCH 3/7] fix: use check in shader rather than creating new variable from python that flags the OS --- src/compas_viewer/renderer/shaders/model.frag | 18 ++++++++++++------ src/compas_viewer/renderer/shaders/shader.py | 4 ---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/compas_viewer/renderer/shaders/model.frag b/src/compas_viewer/renderer/shaders/model.frag index 70a31fecb0..f170c492a5 100644 --- a/src/compas_viewer/renderer/shaders/model.frag +++ b/src/compas_viewer/renderer/shaders/model.frag @@ -14,7 +14,6 @@ in float object_opacity; // Uniforms uniform float opacity; uniform bool is_lighted; -uniform bool use_circular_points; uniform vec3 selection_color; uniform int element_type; uniform bool is_instance; @@ -50,11 +49,18 @@ void main() { alpha = max(alpha, 0.5); } - // Draw circular points - if (element_type == 0 && use_circular_points) { - vec2 center = gl_PointCoord - vec2(0.5); - if (length(center) > 0.5) { - discard; + // Draw circular points if gl_PointCoord allows + if (element_type == 0) { + vec2 pc = gl_PointCoord; + + // Detect broken coords (Mesa/linux case) + if (pc.x == 0.0 && pc.y == 0.0) { + // fallback: don't discard anything + } else { + vec2 center = pc - vec2(0.5); + if (length(center) > 0.5) { + discard; + } } } diff --git a/src/compas_viewer/renderer/shaders/shader.py b/src/compas_viewer/renderer/shaders/shader.py index d5d7f3202d..252cd4daea 100644 --- a/src/compas_viewer/renderer/shaders/shader.py +++ b/src/compas_viewer/renderer/shaders/shader.py @@ -215,10 +215,6 @@ def draw_points(self, size: float = 1, elements: Any = None, n: int = 0, backgro background : bool, optional Draw in background. """ - use_circular_points = True - if sys.platform == "linux" or sys.platform == "linux2": - use_circular_points = False - self.uniform1i("use_circular_points", use_circular_points) GL.glPointSize(size) if elements: From 803cfbeca3edb6dd600cf1290f28d492b45c7c1a Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 13:11:02 +0200 Subject: [PATCH 4/7] fix: avoid exact equality check and rather use 1e-5 check for circular mask on point rendering --- src/compas_viewer/renderer/shaders/model.frag | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/compas_viewer/renderer/shaders/model.frag b/src/compas_viewer/renderer/shaders/model.frag index f170c492a5..f9b54d2462 100644 --- a/src/compas_viewer/renderer/shaders/model.frag +++ b/src/compas_viewer/renderer/shaders/model.frag @@ -51,13 +51,10 @@ void main() { // Draw circular points if gl_PointCoord allows if (element_type == 0) { - vec2 pc = gl_PointCoord; - // Detect broken coords (Mesa/linux case) - if (pc.x == 0.0 && pc.y == 0.0) { - // fallback: don't discard anything - } else { - vec2 center = pc - vec2(0.5); + // Only apply mask if gl_PointCoord is valid + if (gl_PointCoord.x > 1e-5 || gl_PointCoord.y > 1e-5){ + vec2 center = gl_PointCoord - vec2(0.5); if (length(center) > 0.5) { discard; } From ca0253189f664e76f173c1712ed695feb00c700a Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 13:12:53 +0200 Subject: [PATCH 5/7] fix: remove unneeded import detected by linter --- src/compas_viewer/renderer/shaders/shader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compas_viewer/renderer/shaders/shader.py b/src/compas_viewer/renderer/shaders/shader.py index 252cd4daea..9a10466958 100644 --- a/src/compas_viewer/renderer/shaders/shader.py +++ b/src/compas_viewer/renderer/shaders/shader.py @@ -1,4 +1,3 @@ -import sys from pathlib import Path from typing import Any from typing import Union From 495f06cd1061609d68fb8db9cc8255af2fd1c661 Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 13:20:06 +0200 Subject: [PATCH 6/7] fix: remove unneeded emptly line --- src/compas_viewer/renderer/shaders/shader.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compas_viewer/renderer/shaders/shader.py b/src/compas_viewer/renderer/shaders/shader.py index 9a10466958..f42de7a8d4 100644 --- a/src/compas_viewer/renderer/shaders/shader.py +++ b/src/compas_viewer/renderer/shaders/shader.py @@ -214,7 +214,6 @@ def draw_points(self, size: float = 1, elements: Any = None, n: int = 0, backgro background : bool, optional Draw in background. """ - GL.glPointSize(size) if elements: if background: From ff0c89815b0f2169eb3fb043108a2008b4b91f7f Mon Sep 17 00:00:00 2001 From: DamienGilliard Date: Mon, 6 Apr 2026 13:22:20 +0200 Subject: [PATCH 7/7] fix: update the change log to reflect latest change --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66cc8086f9..62fdcfe958 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added -* Added a use_circular_points flag in the Shader.draw_point() method to disable circular mask on points on linux because it did not work on opengl-linux. This flag is checked in model.frag before applying the mask on points +* Added a check before applying circular mask on points to be rendered, because with some drivers, gl_PointCoords can be invalid and thus no point is rendered (problem detected on Fedora 43 with intel igpu) ### Changed