From eededd48e1a86ef6417a38b67d2e99cd83ba9d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fj=C3=A4llstr=C3=B6m?= Date: Tue, 9 Dec 2025 15:04:25 +0100 Subject: [PATCH 1/2] feat: prevent Z-fighting/flicker in OpenSCAD preview This adds the constant EPSILON to prevent Z-fighting / Z-flicker. Could be conceded "code smell" but is well known OpenSCAD approach: * https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/FAQ#What_are_those_strange_flickering_artifacts_in_the_preview? * https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/CSG_Modelling (search for eps) This makes it easier for the eyes when working in OpenSCAD and preview. --- models/core/lib/connector.scad | 6 +++--- models/core/lib/constants.scad | 3 +++ models/core/lib/lockpin.scad | 2 +- models/core/lib/support.scad | 2 +- models/core/makerworld/connector.scad | 11 ++++++----- models/core/makerworld/lockpin.scad | 11 ++++++----- models/core/makerworld/support.scad | 11 ++++++----- 7 files changed, 26 insertions(+), 20 deletions(-) diff --git a/models/core/lib/connector.scad b/models/core/lib/connector.scad index edcbe0e..ed6a1ad 100644 --- a/models/core/lib/connector.scad +++ b/models/core/lib/connector.scad @@ -187,8 +187,8 @@ module connectorArmOuter(is_foot=false) { difference() { color(HR_YELLOW) cuboid(arm_dimensions_outer, chamfer=BASE_CHAMFER,except=BOTTOM); if(!is_foot){ - color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); - color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); } } } @@ -200,7 +200,7 @@ module connectorArmOuter(is_foot=false) { */ module connectorArmInner() { - arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT]; + arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT + EPSILON]; color(HR_GREEN) cuboid(arm_dimensions_inner, chamfer=BASE_CHAMFER,edges=BOTTOM); } diff --git a/models/core/lib/constants.scad b/models/core/lib/constants.scad index 10ce0ba..5aa5a15 100644 --- a/models/core/lib/constants.scad +++ b/models/core/lib/constants.scad @@ -24,6 +24,9 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +// Prevent OpenSCAD Z-fighting +EPSILON = 0.001; + // Fitting tolerance between mating parts TOLERANCE = 0.2; // in mm diff --git a/models/core/lib/lockpin.scad b/models/core/lib/lockpin.scad index 7e8a510..c7f16c4 100644 --- a/models/core/lib/lockpin.scad +++ b/models/core/lib/lockpin.scad @@ -191,6 +191,6 @@ module tension_hole_half(){ lockpin_tension_angle = 86.5; // in degrees lockpin_tension_hole_width_inner = PRINTING_LAYER_WIDTH * 4; // widest/middle point of the tension hole lockpin_tension_hole_height = BASE_UNIT / 2; - lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height]; // planar + lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height + EPSILON ]; // planar prismoid(size1=lockpin_tension_hole_inner_dimension, height=lockpin_tension_hole_height, xang=lockpin_tension_angle, yang=90); } diff --git a/models/core/lib/support.scad b/models/core/lib/support.scad index 1e618f1..9a329b6 100644 --- a/models/core/lib/support.scad +++ b/models/core/lib/support.scad @@ -89,7 +89,7 @@ module lock_pin_hole() { union() { prismoid(size1=lock_pin_center_dimension, size2=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, h=lock_pin_prismoid_inner_length); translate([0, 0, lock_pin_prismoid_inner_length]) { - prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length); + prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length + EPSILON); } } } diff --git a/models/core/makerworld/connector.scad b/models/core/makerworld/connector.scad index 7f11d49..8ceb0ff 100644 --- a/models/core/makerworld/connector.scad +++ b/models/core/makerworld/connector.scad @@ -18,6 +18,7 @@ is_foot = false; // [true,false] optimal_orientation = true; // [true,false] /* [Hidden] */ +EPSILON = 0.001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2; @@ -85,7 +86,7 @@ module lock_pin_hole() { union() { prismoid(size1=lock_pin_center_dimension, size2=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, h=lock_pin_prismoid_inner_length); translate([0, 0, lock_pin_prismoid_inner_length]) { - prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length); + prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length + EPSILON); } } } @@ -203,15 +204,15 @@ module connectorArmOuter(is_foot=false) { difference() { color(HR_YELLOW) cuboid(arm_dimensions_outer, chamfer=BASE_CHAMFER,except=BOTTOM); if(!is_foot){ - color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); - color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); } } } module connectorArmInner() { - arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT]; + arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT + EPSILON]; color(HR_GREEN) cuboid(arm_dimensions_inner, chamfer=BASE_CHAMFER,edges=BOTTOM); } @@ -373,7 +374,7 @@ module tension_hole_half(){ lockpin_tension_angle = 86.5; lockpin_tension_hole_width_inner = PRINTING_LAYER_WIDTH * 4; lockpin_tension_hole_height = BASE_UNIT / 2; - lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height]; + lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height + EPSILON ]; prismoid(size1=lockpin_tension_hole_inner_dimension, height=lockpin_tension_hole_height, xang=lockpin_tension_angle, yang=90); } diff --git a/models/core/makerworld/lockpin.scad b/models/core/makerworld/lockpin.scad index 0b208b4..77b6908 100644 --- a/models/core/makerworld/lockpin.scad +++ b/models/core/makerworld/lockpin.scad @@ -18,6 +18,7 @@ color(HR_YELLOW) lockpin(grip_type=grip_type); /* [Hidden] */ +EPSILON = 0.001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2; @@ -85,7 +86,7 @@ module lock_pin_hole() { union() { prismoid(size1=lock_pin_center_dimension, size2=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, h=lock_pin_prismoid_inner_length); translate([0, 0, lock_pin_prismoid_inner_length]) { - prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length); + prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length + EPSILON); } } } @@ -203,15 +204,15 @@ module connectorArmOuter(is_foot=false) { difference() { color(HR_YELLOW) cuboid(arm_dimensions_outer, chamfer=BASE_CHAMFER,except=BOTTOM); if(!is_foot){ - color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); - color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); } } } module connectorArmInner() { - arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT]; + arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT + EPSILON]; color(HR_GREEN) cuboid(arm_dimensions_inner, chamfer=BASE_CHAMFER,edges=BOTTOM); } @@ -373,7 +374,7 @@ module tension_hole_half(){ lockpin_tension_angle = 86.5; lockpin_tension_hole_width_inner = PRINTING_LAYER_WIDTH * 4; lockpin_tension_hole_height = BASE_UNIT / 2; - lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height]; + lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height + EPSILON ]; prismoid(size1=lockpin_tension_hole_inner_dimension, height=lockpin_tension_hole_height, xang=lockpin_tension_angle, yang=90); } diff --git a/models/core/makerworld/support.scad b/models/core/makerworld/support.scad index 78b8f9c..c13f7ec 100644 --- a/models/core/makerworld/support.scad +++ b/models/core/makerworld/support.scad @@ -20,6 +20,7 @@ x_holes = false; support(units=units, x_holes=x_holes); /* [Hidden] */ +EPSILON = 0.001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2; @@ -87,7 +88,7 @@ module lock_pin_hole() { union() { prismoid(size1=lock_pin_center_dimension, size2=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, h=lock_pin_prismoid_inner_length); translate([0, 0, lock_pin_prismoid_inner_length]) { - prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length); + prismoid(size1=LOCKPIN_HOLE_SIDE_LENGTH_DIMENSION, size2=lock_pin_outer_dimension, h=lock_pin_prismoid_outer_length + EPSILON); } } } @@ -205,15 +206,15 @@ module connectorArmOuter(is_foot=false) { difference() { color(HR_YELLOW) cuboid(arm_dimensions_outer, chamfer=BASE_CHAMFER,except=BOTTOM); if(!is_foot){ - color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); - color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 0]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); + color(HR_RED) rotate([90, 0, 90]) cuboid([LOCKPIN_HOLE_SIDE_LENGTH, LOCKPIN_HOLE_SIDE_LENGTH, connector_outer_side_length + EPSILON], chamfer=-LOCKPIN_HOLE_CHAMFER); } } } module connectorArmInner() { - arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT]; + arm_dimensions_inner = [arm_side_length_inner, arm_side_length_inner, BASE_UNIT + EPSILON]; color(HR_GREEN) cuboid(arm_dimensions_inner, chamfer=BASE_CHAMFER,edges=BOTTOM); } @@ -375,7 +376,7 @@ module tension_hole_half(){ lockpin_tension_angle = 86.5; lockpin_tension_hole_width_inner = PRINTING_LAYER_WIDTH * 4; lockpin_tension_hole_height = BASE_UNIT / 2; - lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height]; + lockpin_tension_hole_inner_dimension = [lockpin_tension_hole_width_inner, lockpin_height + EPSILON ]; prismoid(size1=lockpin_tension_hole_inner_dimension, height=lockpin_tension_hole_height, xang=lockpin_tension_angle, yang=90); } From 1415d3cd5ea6b70fcfaaf66d4990fa2e3dec774d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fj=C3=A4llstr=C3=B6m?= Date: Wed, 10 Dec 2025 08:59:30 +0100 Subject: [PATCH 2/2] fix(core): Difference EPSILON in preview and render. Increase EPSILON in preview to limit Z-fighting artifacts, and decrease when render. If EPSILON is 0 it generates an error in BOSL2 math.scad, so I keep it small even if rendering. --- models/core/lib/constants.scad | 4 ++-- models/core/makerworld/connector.scad | 2 +- models/core/makerworld/lockpin.scad | 2 +- models/core/makerworld/support.scad | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/models/core/lib/constants.scad b/models/core/lib/constants.scad index 5aa5a15..f4b1a86 100644 --- a/models/core/lib/constants.scad +++ b/models/core/lib/constants.scad @@ -24,8 +24,8 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -// Prevent OpenSCAD Z-fighting -EPSILON = 0.001; +// Prevent OpenSCAD Z-fighting in peview +EPSILON = $preview ? 0.01 : 0.00001; // Fitting tolerance between mating parts TOLERANCE = 0.2; // in mm diff --git a/models/core/makerworld/connector.scad b/models/core/makerworld/connector.scad index 8ceb0ff..6fadc1c 100644 --- a/models/core/makerworld/connector.scad +++ b/models/core/makerworld/connector.scad @@ -18,7 +18,7 @@ is_foot = false; // [true,false] optimal_orientation = true; // [true,false] /* [Hidden] */ -EPSILON = 0.001; +EPSILON = $preview ? 0.01 : 0.00001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2; diff --git a/models/core/makerworld/lockpin.scad b/models/core/makerworld/lockpin.scad index 77b6908..ca1a421 100644 --- a/models/core/makerworld/lockpin.scad +++ b/models/core/makerworld/lockpin.scad @@ -18,7 +18,7 @@ color(HR_YELLOW) lockpin(grip_type=grip_type); /* [Hidden] */ -EPSILON = 0.001; +EPSILON = $preview ? 0.01 : 0.00001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2; diff --git a/models/core/makerworld/support.scad b/models/core/makerworld/support.scad index c13f7ec..f811ba9 100644 --- a/models/core/makerworld/support.scad +++ b/models/core/makerworld/support.scad @@ -20,7 +20,7 @@ x_holes = false; support(units=units, x_holes=x_holes); /* [Hidden] */ -EPSILON = 0.001; +EPSILON = $preview ? 0.01 : 0.00001; TOLERANCE = 0.2; PRINTING_LAYER_WIDTH = 0.4; PRINTING_LAYER_HEIGHT = 0.2;