Textured linear_sweep() scale and twist bugfixes.

This commit is contained in:
Revar Desmera 2024-02-19 21:35:34 -08:00
parent aab04247a8
commit 4c25633893
2 changed files with 59 additions and 44 deletions

View file

@ -1629,7 +1629,8 @@ function cyl(
texture=texture, tex_reps=tex_reps, tex_size=tex_size, texture=texture, tex_reps=tex_reps, tex_size=tex_size,
tex_inset=tex_inset, tex_rot=tex_rot, tex_inset=tex_inset, tex_rot=tex_rot,
tex_depth=tex_depth, tex_samples=tex_samples, tex_depth=tex_depth, tex_samples=tex_samples,
tex_taper=tex_taper, style=style, closed=false tex_taper=tex_taper, style=style, closed=false,
_tex_inhibit_y_slicing=true
), ),
skmat = down(l/2) * skmat = down(l/2) *
skew(sxz=shift.x/l, syz=shift.y/l) * skew(sxz=shift.x/l, syz=shift.y/l) *

100
skin.scad
View file

@ -966,7 +966,8 @@ function rotate_sweep(
tex_taper, shift=[0,0], closed=true, tex_taper, shift=[0,0], closed=true,
style="min_edge", cp="centroid", style="min_edge", cp="centroid",
atype="hull", anchor="origin", atype="hull", anchor="origin",
spin=0, orient=UP spin=0, orient=UP,
_tex_inhibit_y_slicing=false
) = ) =
assert(num_defined([tex_reps,tex_counts])<2, "In rotate_sweep() the 'tex_counts' parameters has been replaced by 'tex_reps'. You cannot give both.") assert(num_defined([tex_reps,tex_counts])<2, "In rotate_sweep() the 'tex_counts' parameters has been replaced by 'tex_reps'. You cannot give both.")
assert(num_defined([tex_scale,tex_depth])<2, "In linear_sweep() the 'tex_scale' parameter has been replaced by 'tex_depth'. You cannot give both.") assert(num_defined([tex_scale,tex_depth])<2, "In linear_sweep() the 'tex_scale' parameter has been replaced by 'tex_depth'. You cannot give both.")
@ -995,6 +996,7 @@ function rotate_sweep(
inset=tex_inset, inset=tex_inset,
rot=tex_rot, rot=tex_rot,
samples=tex_samples, samples=tex_samples,
inhibit_y_slicing=_tex_inhibit_y_slicing,
taper=tex_taper, taper=tex_taper,
shift=shift, shift=shift,
closed=closed, closed=closed,
@ -1032,7 +1034,8 @@ module rotate_sweep(
atype="hull", atype="hull",
anchor="origin", anchor="origin",
spin=0, spin=0,
orient=UP orient=UP,
_tex_inhibit_y_slicing=false
) { ) {
dummy = dummy =
assert(num_defined([tex_reps,tex_counts])<2, "In rotate_sweep() the 'tex_counts' parameters has been replaced by 'tex_reps'. You cannot give both.") assert(num_defined([tex_reps,tex_counts])<2, "In rotate_sweep() the 'tex_counts' parameters has been replaced by 'tex_reps'. You cannot give both.")
@ -1063,6 +1066,7 @@ module rotate_sweep(
taper=tex_taper, taper=tex_taper,
shift=shift, shift=shift,
closed=closed, closed=closed,
inhibit_y_slicing=_tex_inhibit_y_slicing,
angle=angle, angle=angle,
style=style, style=style,
atype=atype, anchor=anchor, atype=atype, anchor=anchor,
@ -3676,7 +3680,9 @@ function _textured_linear_sweep(
s = 1 / max(1, samples), s = 1 / max(1, samples),
vnf = samples<=1? texture : vnf = samples<=1? texture :
let( let(
vnft = vnf_slice(texture, "X", list([s:s:1-s/2])), slice_us = list([s:s:1-s/2]),
vnft1 = vnf_slice(texture, "X", slice_us),
vnft = twist? vnf_slice(vnft1, "Y", slice_us) : vnft1,
zvnf = [ zvnf = [
[ [
for (p=vnft[0]) [ for (p=vnft[0]) [
@ -3713,44 +3719,49 @@ function _textured_linear_sweep(
bases = list_wrap(obases), bases = list_wrap(obases),
norms = list_wrap(onorms), norms = list_wrap(onorms),
vnf = is_vnf(texture) vnf = is_vnf(texture)
? let( // VNF tile texture ? vnf_join( // VNF tile texture
row_vnf = vnf_join([ let(
for (j = [0:1:counts.x-1]) [ row_vnf = vnf_join([
[ for (i = [0:1:(scale==1?0:counts.y-1)], j = [0:1:counts.x-1]) [
for (group = vertzs) [
each [ for (group = vertzs)
for (vert = group) let( each [
u = floor((j + vert.x) * samples), for (vert = group) let(
uu = ((j + vert.x) * samples) - u, u = floor((j + vert.x) * samples),
texh = tex_scale<0 ? -(1-vert.z - inset) * tex_scale uu = ((j + vert.x) * samples) - u,
: (vert.z - inset) * tex_scale, texh = tex_scale<0 ? -(1-vert.z - inset) * tex_scale
base = lerp(bases[u], select(bases,u+1), uu), : (vert.z - inset) * tex_scale,
norm = unit(lerp(norms[u], select(norms,u+1), uu)), base = lerp(bases[u], select(bases,u+1), uu),
xy = base + norm * texh norm = unit(lerp(norms[u], select(norms,u+1), uu)),
) point3d(xy,vert.y) xy = base + norm * texh,
] pt = point3d(xy,vert.y),
], v = vert.y / counts.y,
sorted_tile[1] vv = i / counts.y,
] sc = lerp([1,1,1], scale, vv+v),
]), mat =
sorted_row = _vnf_sort_vertices(row_vnf, idx=[1,0]), up((vv-0.5)*h) *
rvertzs = group_sort(sorted_row[0], idx=1), scale(sc) *
vnf1 = vnf_join([ zrot(twist*(v+vv)) *
for (i = [0:1:counts.y-1]) [ zscale(h/counts.y)
[ ) apply(mat, pt)
for (group = rvertzs) let( ]
v = (i + group[0].z) / counts.y, ],
sc = lerp([1,1,1], scale, v), sorted_tile[1]
mat = scale(sc) * ]
zrot(twist*v) * ])
up(((i/counts.y)-0.5)*h) * ) [
zscale(h/counts.y) for (i = [0:1:0*(scale!=1?0:counts.y-1)])
) each apply(mat, group) let(
], v = i / (scale==1?counts.y:1),
sorted_row[1] sc = lerp([1,1,1], scale, v),
] mat =
]) up((v)*h) *
) vnf1 scale(sc) *
zrot(twist*v)
)
apply(mat, row_vnf)
]
)
: let( // Heightfield texture : let( // Heightfield texture
texcnt = [len(texture[0]), len(texture)], texcnt = [len(texture[0]), len(texture)],
tile_rows = [ tile_rows = [
@ -3898,6 +3909,7 @@ function _textured_revolution(
shape, texture, tex_size, tex_scale=1, shape, texture, tex_size, tex_scale=1,
inset=false, rot=false, shift=[0,0], inset=false, rot=false, shift=[0,0],
taper, closed=true, angle=360, taper, closed=true, angle=360,
inhibit_y_slicing=false,
counts, samples, counts, samples,
style="min_edge", atype="intersect", style="min_edge", atype="intersect",
anchor=CENTER, spin=0, orient=UP anchor=CENTER, spin=0, orient=UP
@ -3953,7 +3965,7 @@ function _textured_revolution(
s = 1 / samples, s = 1 / samples,
slices = list([s : s : 1-s/2]), slices = list([s : s : 1-s/2]),
vnfx = vnf_slice(texture, "X", slices), vnfx = vnf_slice(texture, "X", slices),
vnfy = vnf_slice(vnfx, "Y", slices), vnfy = inhibit_y_slicing? vnfx : vnf_slice(vnfx, "Y", slices),
vnft = vnf_triangulate(vnfy), vnft = vnf_triangulate(vnfy),
zvnf = [ zvnf = [
[ [
@ -4171,6 +4183,7 @@ module _textured_revolution(
inset=false, rot=false, shift=[0,0], inset=false, rot=false, shift=[0,0],
taper, closed=true, angle=360, taper, closed=true, angle=360,
style="min_edge", atype="intersect", style="min_edge", atype="intersect",
inhibit_y_slicing=false,
convexity=10, counts, samples, convexity=10, counts, samples,
anchor=CENTER, spin=0, orient=UP anchor=CENTER, spin=0, orient=UP
) { ) {
@ -4180,7 +4193,8 @@ module _textured_revolution(
tex_scale=tex_scale, inset=inset, rot=rot, tex_scale=tex_scale, inset=inset, rot=rot,
taper=taper, closed=closed, style=style, taper=taper, closed=closed, style=style,
shift=shift, angle=angle, shift=shift, angle=angle,
samples=samples, counts=counts samples=samples, counts=counts,
inhibit_y_slicing=inhibit_y_slicing
); );
geom = atype=="intersect" geom = atype=="intersect"
? attach_geom(vnf=vnf, extent=false) ? attach_geom(vnf=vnf, extent=false)