mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-08-20 05:21:38 +02:00
improved hollow performance
This commit is contained in:
@@ -12,12 +12,13 @@
|
|||||||
**/
|
**/
|
||||||
|
|
||||||
module polysections(sections, triangles = "SOLID") {
|
module polysections(sections, triangles = "SOLID") {
|
||||||
module solid_sections(sects) {
|
function side_indexes(sects, begin_idx = 0) =
|
||||||
leng_sects = len(sects);
|
let(
|
||||||
leng_pts_sect = len(sects[0]);
|
leng_sects = len(sects),
|
||||||
|
leng_pts_sect = len(sects[0])
|
||||||
side_idxes = [
|
)
|
||||||
for(j = [0:leng_pts_sect:(leng_sects - 2) * leng_pts_sect])
|
[
|
||||||
|
for(j = [begin_idx:leng_pts_sect:begin_idx + (leng_sects - 2) * leng_pts_sect])
|
||||||
for(i = [0:leng_pts_sect - 1])
|
for(i = [0:leng_pts_sect - 1])
|
||||||
[
|
[
|
||||||
j + i,
|
j + i,
|
||||||
@@ -27,22 +28,74 @@ module polysections(sections, triangles = "SOLID") {
|
|||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
first_idxes = [for(i = [0:leng_pts_sect - 1]) i];
|
module solid_sections(sects) {
|
||||||
|
leng_pts_sect = len(sects[0]);
|
||||||
|
|
||||||
|
first_idxes = [for(i = [0:leng_pts_sect - 1]) i];
|
||||||
last_idxes = [
|
last_idxes = [
|
||||||
for(i = [0:leng_pts_sect - 1])
|
for(i = [0:leng_pts_sect - 1])
|
||||||
i + leng_pts_sect * (leng_sects - 1)
|
i + leng_pts_sect * (len(sects) - 1)
|
||||||
];
|
];
|
||||||
|
|
||||||
v_pts = [
|
v_pts = [
|
||||||
for(section = sections)
|
for(sect = sects)
|
||||||
for(pt = section)
|
for(pt = sect)
|
||||||
pt
|
pt
|
||||||
];
|
];
|
||||||
|
|
||||||
polyhedron(
|
polyhedron(
|
||||||
v_pts,
|
v_pts,
|
||||||
concat([first_idxes], side_idxes, [last_idxes])
|
concat([first_idxes], side_indexes(sects), [last_idxes])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
module hollow_sections(sects) {
|
||||||
|
leng_sects = len(sects);
|
||||||
|
leng_sect = len(sects[0]);
|
||||||
|
half_leng_sect = leng_sect / 2;
|
||||||
|
half_leng_v_pts = leng_sects * half_leng_sect;
|
||||||
|
|
||||||
|
function strip_sects(begin_idx, end_idx) =
|
||||||
|
[
|
||||||
|
for(i = [0:leng_sects - 1])
|
||||||
|
[
|
||||||
|
for(j = [begin_idx:end_idx])
|
||||||
|
sects[i][j]
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
function end_idxes(begin_idx) =
|
||||||
|
[
|
||||||
|
for(i = [0:half_leng_sect - 1])
|
||||||
|
[
|
||||||
|
begin_idx + i,
|
||||||
|
begin_idx + (i + 1) % half_leng_sect,
|
||||||
|
begin_idx + (i + 1) % half_leng_sect + half_leng_v_pts,
|
||||||
|
begin_idx + i + half_leng_v_pts
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
outer_sects = strip_sects(0, half_leng_sect - 1);
|
||||||
|
inner_sects = strip_sects(half_leng_sect, leng_sect - 1);
|
||||||
|
|
||||||
|
function to_v_pts(sects) =
|
||||||
|
[
|
||||||
|
for(sect = sects)
|
||||||
|
for(pt = sect)
|
||||||
|
pt
|
||||||
|
];
|
||||||
|
|
||||||
|
outer_v_pts = to_v_pts(outer_sects);
|
||||||
|
inner_v_pts = to_v_pts(inner_sects);
|
||||||
|
|
||||||
|
outer_idxes = side_indexes(outer_sects);
|
||||||
|
inner_idxes = side_indexes(inner_sects, half_leng_v_pts);
|
||||||
|
first_idxes = end_idxes(0);
|
||||||
|
last_idxes = end_idxes(half_leng_v_pts - half_leng_sect);
|
||||||
|
|
||||||
|
polyhedron(
|
||||||
|
concat(outer_v_pts, inner_v_pts),
|
||||||
|
concat(first_idxes, outer_idxes, inner_idxes, last_idxes)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,29 +112,8 @@ module polysections(sections, triangles = "SOLID") {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function hollow_tris() =
|
|
||||||
let(
|
|
||||||
leng_section = len(sections[0]),
|
|
||||||
inner_i_begin = leng_section / 2,
|
|
||||||
idxes = concat(
|
|
||||||
[
|
|
||||||
for(i = [0:inner_i_begin - 1])
|
|
||||||
let(n = inner_i_begin + i + 1)
|
|
||||||
[i, inner_i_begin + i, n % inner_i_begin + inner_i_begin]
|
|
||||||
],
|
|
||||||
[
|
|
||||||
for(i = [0:inner_i_begin - 1])
|
|
||||||
let(n = inner_i_begin + i + 1)
|
|
||||||
[i, i + 1, n % leng_section]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
) idxes;
|
|
||||||
|
|
||||||
function tris() =
|
|
||||||
triangles == "HOLLOW" ? hollow_tris() : triangles;
|
|
||||||
|
|
||||||
module two_sections(section1, section2) {
|
module two_sections(section1, section2) {
|
||||||
for(idx = tris()) {
|
for(idx = triangles) {
|
||||||
// hull is for preventing from WARNING: Object may not be a valid 2-manifold
|
// hull is for preventing from WARNING: Object may not be a valid 2-manifold
|
||||||
hull() tri_sections(
|
hull() tri_sections(
|
||||||
[
|
[
|
||||||
@@ -106,10 +138,12 @@ module polysections(sections, triangles = "SOLID") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
if(triangles == "SOLID") {
|
if(triangles == "SOLID") {
|
||||||
solid_sections(sections);
|
solid_sections(sections);
|
||||||
} else {
|
} else if(triangles == "HOLLOW") {
|
||||||
|
hollow_sections(sections);
|
||||||
|
}
|
||||||
|
else {
|
||||||
triangles_defined_sections();
|
triangles_defined_sections();
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user