Added triangulate= option to vnf_vertex_array()

This commit is contained in:
Revar Desmera 2023-11-28 21:44:35 -08:00
parent 84a302b582
commit e94365556c

View file

@ -33,7 +33,7 @@ EMPTY_VNF = [[],[]]; // The standard empty VNF with no vertices or faces.
// Topics: VNF Generators, Lists // Topics: VNF Generators, Lists
// See Also: vnf_tri_array(), vnf_join(), vnf_from_polygons(), vnf_from_region() // See Also: vnf_tri_array(), vnf_join(), vnf_from_polygons(), vnf_from_region()
// Usage: // Usage:
// vnf = vnf_vertex_array(points, [caps=], [cap1=], [cap2=], [style=], [reverse=], [col_wrap=], [row_wrap=]); // vnf = vnf_vertex_array(points, [caps=], [cap1=], [cap2=], [style=], [reverse=], [col_wrap=], [row_wrap=], [triangulate=]);
// Description: // Description:
// Creates a VNF structure from a rectangular vertex list, by dividing the vertices into columns and rows, // Creates a VNF structure from a rectangular vertex list, by dividing the vertices into columns and rows,
// adding faces to tile the surface. You can optionally have faces added to wrap the last column // adding faces to tile the surface. You can optionally have faces added to wrap the last column
@ -55,6 +55,7 @@ EMPTY_VNF = [[],[]]; // The standard empty VNF with no vertices or faces.
// row_wrap = If true, add faces to connect the last row to the first. // row_wrap = If true, add faces to connect the last row to the first.
// reverse = If true, reverse all face normals. // reverse = If true, reverse all face normals.
// style = The style of subdividing the quads into faces. Valid options are "default", "alt", "min_edge", "quincunx", "convex" and "concave". // style = The style of subdividing the quads into faces. Valid options are "default", "alt", "min_edge", "quincunx", "convex" and "concave".
// triangulate = If true, triangulates endcaps to resolve possible CGAL issues. This can be an expensive operation if the endcaps are complex. Default: false
// Example(3D): // Example(3D):
// vnf = vnf_vertex_array( // vnf = vnf_vertex_array(
// points=[ // points=[
@ -131,13 +132,15 @@ function vnf_vertex_array(
col_wrap=false, col_wrap=false,
row_wrap=false, row_wrap=false,
reverse=false, reverse=false,
style="default" style="default",
triangulate = false
) = ) =
assert(!(any([caps,cap1,cap2]) && !col_wrap), "col_wrap must be true if caps are requested") assert(!(any([caps,cap1,cap2]) && !col_wrap), "col_wrap must be true if caps are requested")
assert(!(any([caps,cap1,cap2]) && row_wrap), "Cannot combine caps with row_wrap") assert(!(any([caps,cap1,cap2]) && row_wrap), "Cannot combine caps with row_wrap")
assert(in_list(style,["default","alt","quincunx", "convex","concave", "min_edge","min_area"])) assert(in_list(style,["default","alt","quincunx", "convex","concave", "min_edge","min_area"]))
assert(is_matrix(points[0], n=3),"Point array has the wrong shape or points are not 3d") assert(is_matrix(points[0], n=3),"Point array has the wrong shape or points are not 3d")
assert(is_consistent(points), "Non-rectangular or invalid point array") assert(is_consistent(points), "Non-rectangular or invalid point array")
assert(is_bool(triangulate))
let( let(
pts = flatten(points), pts = flatten(points),
pcnt = len(pts), pcnt = len(pts),
@ -226,9 +229,9 @@ function vnf_vertex_array(
rfaces = reverse? [for (face=culled_faces) reverse(face)] : culled_faces rfaces = reverse? [for (face=culled_faces) reverse(face)] : culled_faces
) )
rfaces, rfaces,
] ],
) vnf = [verts, allfaces]
[verts,allfaces]; ) triangulate? vnf_triangulate(vnf) : vnf;
// Function: vnf_tri_array() // Function: vnf_tri_array()