private static VECTOR3 _Extrude(ICoreScene3D dc, ReadOnlySpan <PointNode> nodes, bool closed, int divisions, ColorStyle color, bool flipFaces) { Span <POINT3> aa = stackalloc POINT3[divisions]; Span <POINT3> bb = stackalloc POINT3[divisions]; var maixAxis = _GetMainAxis(nodes); if (closed) { var n = nodes[nodes.Length - 1]; n._FillSection(aa, divisions, maixAxis + n.Axis); // aa.Reverse(); } for (int s = 0; s < nodes.Length; ++s) { var n = nodes[s]; n._FillSection(bb, divisions, maixAxis + n.Axis); if (s > 0 || closed) { for (int i = 0; i < bb.Length; ++i) { var j = (i + 1) % bb.Length; if (flipFaces) { dc.DrawConvexSurface(POINT3.Array(aa[i], aa[j], bb[j], bb[i]), color); } else { dc.DrawConvexSurface(POINT3.Array(aa[j], aa[i], bb[i], bb[j]), color); } } } bb.CopyTo(aa); } return(maixAxis); }
private readonly void _DrawCap(ICoreScene3D dc, ColorStyle fillColor, LineCapStyle cap, Span <POINT3> corners, bool dir) { var axis = Direction * (Diameter * 0.5f); if (dir) { axis = -axis; } switch (cap) { case LineCapStyle.Round: for (int i = 0; i < corners.Length; ++i) { var j = (i + 1) % corners.Length; var i0 = corners[i].XYZ; var j0 = corners[j].XYZ; var i1 = VECTOR3.Lerp(Point, i0 + axis, 0.7f); var j1 = VECTOR3.Lerp(Point, j0 + axis, 0.7f); dc.DrawConvexSurface(POINT3.Array(i0, j0, j1, i1), fillColor); dc.DrawConvexSurface(POINT3.Array(Point + axis, i1, j1), fillColor); } break; case LineCapStyle.Triangle: for (int i = 0; i < corners.Length; ++i) { var j = (i + 1) % corners.Length; dc.DrawConvexSurface(POINT3.Array(Point + axis, corners[i], corners[j]), fillColor); } break; default: dc.DrawConvexSurface(corners, fillColor); break; } }