From 71449ee3ac8216a92357d5d29e01ecbfa96e75e5 Mon Sep 17 00:00:00 2001 From: Adrian Mariano Date: Sat, 4 Feb 2023 16:13:49 -0500 Subject: [PATCH] fix tri_grid texture, add more error handling for texture args --- skin.scad | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/skin.scad b/skin.scad index c02de66..06d20b9 100644 --- a/skin.scad +++ b/skin.scad @@ -2681,7 +2681,7 @@ function associate_vertices(polygons, split, curpoly=0) = // "pyramids_vnf" = VNF Tile = VNF version of "pyramids". // "ribs" = Heightfield = Vertically aligned triangular ribs. Giving `n=` sets the number of heightfield samples to `n` by 1. Default: 2. The choice of style does not matter. // "rough" = Heightfield = A pseudo-randomized rough texture. Giving `n=` sets the number of heightfield samples to `n` by `n`. Default: 32. The `roughness=` parameter specifies the height of the random texture. Default: 0.2. -// "tri_grid" = VNF Tile = A triangular grid defined by V-groove borders Giving `inset=` specifies the horizontal inset of the triangular tops, relative to their bottoms, along all three sides. This means the V-groove top width will be double the inset value. Inset must be strictly between 0 and 0.5, default: 0.1. +// "tri_grid" = VNF Tile = A triangular grid defined by V-groove borders Giving `inset=` specifies the horizontal inset of the triangular tops, relative to their bottoms, along the horizontal edges of the triangles. This means the V-groove top width of the horizontal grooves will be double the inset value. If the tile is scaled in the Y direction by sqrt(3) then the groove will be uniform on the three sides of the triangle. The inset must be strictly between 0 and 1/6, default: 0.05. // "trunc_diamonds" = VNF Tile = Truncated diamonds, four-sided pyramids with the base corners aligned with the axes and the top cut off. Or you can interpret it as V-groove lines at 45ยบ angles. Giving `inset=` specifies the horizontal inset of the square top face compared to the bottom face along all four edges. This means the V-groove top width will be double the inset value. The inset must be strictly between 0 and sqrt(2)/4, which is about 0.35. Default: 0.1. // "trunc_pyramids" = Heightfield = Truncated pyramids, four sided pyramids with the base edges aligned to the axes and the top cut off. Giving `n=` sets the number of heightfield samples to `n` by `n`. Default: 6. Set `style="convex"`. // "trunc_pyramids_vnf" = VNF Tile = Truncated pyramids, four sided pyramids with the base edges aligned to the axes and the top cut off. You can also regard this as a grid of V-grooves. Giving `inset=` specifies the horizontal inset of the flat square tops on all four sides relative to their bottoms. This means the V-groove top width will be double the inset value. The inset must be strictly between 0 and 0.5. Default: 0.1. @@ -2878,6 +2878,8 @@ function texture(tex, n, inset, gap, roughness) = assert(is_undef(gap) || is_finite(gap), "gap must be a number if given") assert(is_undef(roughness) || all_nonnegative([roughness]), "roughness must be a nonnegative value if given") tex=="ribs"? + assert(num_defined([gap, inset, roughness])==0, "ribs texture does not accept gap, inset or roughness") + let( n = quantup(default(n,2),2) ) [[ @@ -2885,6 +2887,7 @@ function texture(tex, n, inset, gap, roughness) = each lerpn(0,1,n/2,endpoint=false), ]] : tex=="trunc_ribs"? + assert(num_defined([gap, inset, roughness])==0, "trunc_ribs texture does not accept gap, inset or roughness") let( n = quantup(default(n,4),4) ) [[ @@ -2894,6 +2897,7 @@ function texture(tex, n, inset, gap, roughness) = each lerpn(1,0,n/4,endpoint=false), ]] : tex=="trunc_ribs_vnf"? + assert(is_undef(n), "trunc_ribs_vnf texture does not accept n") let( inset = default(inset,1/4)*2, gap = default(gap,1/4) @@ -2913,6 +2917,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="wave_ribs"? + assert(num_defined([gap, inset, roughness])==0, "wave_ribs texture does not accept gap, inset or roughness") let( n = max(6,default(n,8)) ) [[ @@ -2920,6 +2925,7 @@ function texture(tex, n, inset, gap, roughness) = (cos(a)+1)/2 ]] : tex=="diamonds"? + assert(num_defined([gap, inset, roughness])==0, "diamonds texture does not accept gap, inset or roughness") let( n = quantup(default(n,2),2) ) [ @@ -2937,6 +2943,7 @@ function texture(tex, n, inset, gap, roughness) = ], ] : tex=="diamonds_vnf"? + assert(num_defined([n,gap, inset, roughness])==0, "diamonds_vnf texture does not accept n, gap, inset or roughness") [ [ [0, 1, 1], [1/2, 1, 0], [1, 1, 1], @@ -2948,6 +2955,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="pyramids"? + assert(num_defined([gap, inset, roughness])==0, "pyramids texture does not accept gap, inset or roughness") let( n = quantup(default(n,2),2) ) [ @@ -2957,11 +2965,13 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="pyramids_vnf"? + assert(num_defined([n,gap, inset, roughness])==0, "pyramids_Vnf texture does not accept n, gap, inset or roughness") [ [ [0,1,0], [1,1,0], [1/2,1/2,1], [0,0,0], [1,0,0] ], [ [2,0,1], [2,1,4], [2,4,3], [2,3,0] ] ] : tex=="trunc_pyramids"? + assert(num_defined([gap, inset, roughness])==0, "trunc_pyramids texture does not accept gap, inset or roughness") let( n = quantup(default(n,6),3) ) [ @@ -2971,6 +2981,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="trunc_pyramids_vnf"? + assert(num_defined([gap, n, roughness])==0, "trunc_pyramids_vnf texture does not accept gap, n or roughness") let( inset = default(inset,0.1) ) @@ -2988,6 +2999,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="hills"? + assert(num_defined([gap, inset, roughness])==0, "hills texture does not accept gap, inset or roughness") let( n = default(n,12) ) [ @@ -2997,6 +3009,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="bricks"? + assert(num_defined([gap,inset])==0, "bricks texture does not accept gap or inset") let( n = quantup(default(n,24),2), rough = default(roughness,0.05) @@ -3010,6 +3023,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="bricks_vnf"? + assert(num_defined([n,roughness])==0, "bricks_vnf texture does not accept n or roughness") let( inset = default(inset,0.05), gap = default(gap,0.05) @@ -3039,6 +3053,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="checkers"? + assert(num_defined([gap, n, roughness])==0, "checkers texture does not accept gap, n or roughness") let( inset = default(inset,0.05) ) @@ -3066,6 +3081,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="cones"? + assert(num_defined([gap,roughness])==0, "cones texture does not accept gap or roughness") let( n = quant(default(n,16),4), inset = default(inset,0) @@ -3083,6 +3099,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="cubes"? + assert(num_defined([n, gap, inset, roughness])==0, "cubes texture does not accept n, gap, inset or roughness") [ [ [0,1,1/2], [1,1,1/2], [1/2,5/6,1], [0,4/6,0], [1,4/6,0], @@ -3095,6 +3112,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="trunc_diamonds"? + assert(num_defined([gap, n, roughness])==0, "trunc_diamonds texture does not accept gap, n or roughness") let( inset = default(inset,0.1)/sqrt(2)*2 ) @@ -3113,6 +3131,7 @@ function texture(tex, n, inset, gap, roughness) = ] ] : tex=="dimples" || tex=="dots" ? + assert(num_defined([gap,roughness])==0, str(tex," texture does not accept gap or roughness")) let( n = quant(default(n,16),4), inset = default(inset,0.05) @@ -3145,32 +3164,30 @@ function texture(tex, n, inset, gap, roughness) = ] ) [verts, faces] : tex=="tri_grid"? + assert(num_defined([gap, n, roughness])==0, str(tex," texture does not accept gap, n or roughness")) let( - inset = default(inset,0.1) + inset = default(inset,0.1)*sqrt(3) ) - assert(inset>0 && inset<0.5, "tri_grid texture requires inset in (0,0.5)") - let( - aspect = 1 / adj_ang_to_opp(1,60), + assert(inset>0 && inset