diff --git a/src/surface/_impl/_sf_square_surfaces.scad b/src/surface/_impl/_sf_square_surfaces.scad index 999a61e4..66decd36 100644 --- a/src/surface/_impl/_sf_square_surfaces.scad +++ b/src/surface/_impl/_sf_square_surfaces.scad @@ -2,13 +2,14 @@ function _sf_square_surfaces(levels, thickness, depth, invert) = let( rows = len(levels), columns = len(levels[0]), - offset_z = invert ? 0 : thickness - depth, + lv_offset = invert ? function(lv) (255 - lv) / 255 * depth : + function(lv) lv / 255 * depth + (thickness - depth), surface1 = [ for(r = [0:rows - 1]) + let(level = levels[rows - r - 1]) [ for(c = [0:columns - 1]) - let(lv = invert ? 255 - levels[rows - r - 1][c] : levels[rows - r - 1][c]) - [c, r, lv / 255 * depth + offset_z] + [c, r, lv_offset(level[c])] ] ], surface2 = [ diff --git a/src/surface/sf_hull.scad b/src/surface/sf_hull.scad index ae3c3af8..2e7a8653 100644 --- a/src/surface/sf_hull.scad +++ b/src/surface/sf_hull.scad @@ -22,20 +22,19 @@ module sf_hull(points, thickness) { twintri_lt = [ - for(yi = yi_range) - for(xi = xi_range) - [ - [ - points[yi][xi], - points[yi][xi + 1], - points[yi + 1][xi] - ], - [ - points[yi + 1][xi], - points[yi][xi + 1], - points[yi + 1][xi + 1] - ] - ] + for(yi = yi_range, xi = xi_range) + [ + [ + points[yi][xi], + points[yi][xi + 1], + points[yi + 1][xi] + ], + [ + points[yi + 1][xi], + points[yi][xi + 1], + points[yi + 1][xi + 1] + ] + ] ]; for(twintri = twintri_lt) { diff --git a/src/surface/sf_ring.scad b/src/surface/sf_ring.scad index 94518363..ae93fa7b 100644 --- a/src/surface/sf_ring.scad +++ b/src/surface/sf_ring.scad @@ -19,7 +19,6 @@ module sf_ring(levels, radius, thickness, depth, angle = 360, twist = 0, invert columns = len(levels[0]); size = [columns - 1, rows - 1]; - offset_z = invert ? thickness : 0; centered = invert ? [0, 0, thickness] : [0, 0, thickness / 2]; if(invert) { mirror([0, 0, 1]) @@ -46,7 +45,7 @@ module sf_ring(levels, radius, thickness, depth, angle = 360, twist = 0, invert for(row = surface[0]) [ for(p = row) - ptf_ring(size, p - centered, radius, angle, twist) + [0, 0, offset_z] + ptf_ring(size, p - centered, radius, angle, twist) ] ], [ diff --git a/src/surface/sf_solidifyT.scad b/src/surface/sf_solidifyT.scad index 1584ba9e..8acc986f 100644 --- a/src/surface/sf_solidifyT.scad +++ b/src/surface/sf_solidifyT.scad @@ -54,11 +54,12 @@ module sf_solidifyT(points1, points2, triangles, convexity = 1) { ] ]; + off = [leng, leng, leng]; polyhedron( points = concat(points1, points2), faces = concat( tris, - [for(tri = triangles) tri + [leng, leng, leng]], + [for(tri = triangles) tri + off], side_faces ), convexity = convexity diff --git a/src/surface/sf_square.scad b/src/surface/sf_square.scad index 6cadfe85..f29ca47e 100644 --- a/src/surface/sf_square.scad +++ b/src/surface/sf_square.scad @@ -17,14 +17,14 @@ module sf_square(levels, thickness, depth, x_twist = 0, y_twist = 0, invert = fa size = [len(levels[0]), len(levels)]; dp = is_undef(depth) ? thickness / 2 : depth; surface = _sf_square_surfaces(levels, thickness, dp, invert); - offset_z = invert ? thickness : 0; + off = [0, 0, invert ? thickness : 0]; sf_solidify( [ for(row = surface[0]) [ for(p = row) ptf_y_twist(size, - ptf_x_twist(size, p + [0, 0, offset_z], x_twist), + ptf_x_twist(size, p + off, x_twist), y_twist ) ] diff --git a/src/surface/sf_thicken.scad b/src/surface/sf_thicken.scad index 05fb4d46..1aeb9e00 100644 --- a/src/surface/sf_thicken.scad +++ b/src/surface/sf_thicken.scad @@ -19,7 +19,12 @@ module sf_thicken(points, thickness, direction = "BOTH", convexity = 1) { let( xy = [xi, yi], // clockwise - vi = [for(coord_offset = [[1, 0], [0, -1], [-1, 0], [0, 1]]) coord_offset + xy], + vi = [ + [1, 0] + xy, + [0, -1] + xy, + [-1, 0] + xy, + [0, 1] + xy + ], normals = [ for(i = [0:3]) let( @@ -36,18 +41,20 @@ module sf_thicken(points, thickness, direction = "BOTH", convexity = 1) { ) sum(normals) / len(normals); + leng_points = len(points); + leng_point0 = len(points[0]); if(is_list(direction)) { dir_v = direction / norm(direction); surface_another = points + thickness * [ - for(y = [0:len(points) - 1]) + for(y = [0:leng_points - 1]) [ - for(x = [0:len(points[0]) - 1]) + for(x = [0:leng_point0 - 1]) dir_v ] ]; - midy = len(points) / 2; - midx = len(points[0]) / 2; + midy = leng_points / 2; + midx = leng_point0 / 2; nv = tri_normal([points[midy][midx], points[midy + 1][midx], points[midy][midx + 1]]); if(nv * dir_v > 0) { @@ -59,9 +66,9 @@ module sf_thicken(points, thickness, direction = "BOTH", convexity = 1) { } else { vertex_normals = [ - for(y = [0:len(points) - 1]) + for(y = [0:leng_points - 1]) [ - for(x = [0:len(points[0]) - 1]) + for(x = [0:leng_point0 - 1]) vertex_normal(points, x, y) ] ]; diff --git a/src/surface/sf_thickenT.scad b/src/surface/sf_thickenT.scad index 18e06731..ddbfcbac 100644 --- a/src/surface/sf_thickenT.scad +++ b/src/surface/sf_thickenT.scad @@ -49,7 +49,8 @@ module sf_thickenT(points, thickness, triangles = undef, direction = "BOTH", con mid = sort(points)[leng_pts / 2]; tri = cnn_tris[find_index(points, function(p) p == mid)][0]; nv = _face_normal([points[tri[0]], points[tri[1]], points[tri[2]]]); - pts = [for(p = points) p + dir_v * thickness]; + off = dir_v * thickness; + pts = [for(p = points) p + off]; if(nv * dir_v > 0) { sf_solidifyT(pts, points, real_triangles, convexity = convexity);