diff --git a/src/experimental/_impl/_sf_square_surfaces.scad b/src/experimental/_impl/_sf_square_surfaces.scad new file mode 100644 index 00000000..82294dc4 --- /dev/null +++ b/src/experimental/_impl/_sf_square_surfaces.scad @@ -0,0 +1,21 @@ +function _sf_square_surfaces(levels, thickness, invert) = + let( + rows = len(levels), + columns = len(levels[0]), + surface1 = [ + for(r = [0:rows - 1]) + [ + for(c = [0:columns - 1]) + let(lv = invert ? 255 - levels[rows - r - 1][c] : levels[rows - r - 1][c]) + [c, r, lv / 255 * thickness] + ] + ], + surface2 = [ + for(r = [0:rows - 1]) + [ + for(c = [0:columns - 1]) + [c, r, 0] + ] + ] + ) + [surface1, surface2]; diff --git a/src/experimental/sf_square.scad b/src/experimental/sf_square.scad index ce12358b..7ba0c2c5 100644 --- a/src/experimental/sf_square.scad +++ b/src/experimental/sf_square.scad @@ -1,4 +1,4 @@ -use ; +use ; use ; /* @@ -7,26 +7,17 @@ use ; invert: inverts how the gray levels are translated into height values. */ module sf_square(levels, thickness, invert = false) { - rows = len(levels); - columns = len(levels[0]); + surface = _sf_square_surfaces(levels, thickness, invert); offset_z = invert ? thickness : 0; - size = [columns - 1, rows - 1]; - + sf_solidify( [ - for(r = [0:rows - 1]) + for(row = surface[0]) [ - for(c = [0:columns - 1]) - let(lv = invert ? 255 - levels[rows - r - 1][c] : levels[rows - r - 1][c]) - [c, r, lv / 255 * thickness + offset_z] + for(p = row) + p + [0, 0, offset_z] ] ], - [ - for(r = [0:rows - 1]) - [ - for(c = [0:columns - 1]) - [c, r, 0] - ] - ] + surface[1] ); } \ No newline at end of file