public static void Extrude(ICoreScene3D dc, ReadOnlySpan <POINT3> points, float diameter, bool closed, int divisions, bool flipFaces, LineStyle brush) { System.Diagnostics.Debug.Assert(points.Length > 1); System.Diagnostics.Debug.Assert(points[0] != points[points.Length - 1]); Span <PointNode> nodes = stackalloc PointNode[points.Length]; _Fill(nodes, POINT3.AsNumerics(points), diameter, closed); var mainAxis = _Extrude(dc, nodes, closed, divisions, brush.FillColor, flipFaces); if (closed) { return; } Span <POINT3> corners = stackalloc POINT3[divisions]; var n = nodes[0]; n._FillSection(corners, divisions, mainAxis + n.Axis); if (flipFaces) { corners.Reverse(); } n._DrawCap(dc, brush.FillColor, brush.StartCap, corners, true); n = nodes[nodes.Length - 1]; n._FillSection(corners, divisions, mainAxis + n.Axis); if (!flipFaces) { corners.Reverse(); } n._DrawCap(dc, brush.FillColor, brush.EndCap, corners, false); }
public static void DrawOctahedron(ICoreScene3D dc, XYZ center, float radius, int lod, ColorStyle color, bool faceFlip) { if (lod < 0) { return; } var ctx = new PlatonicFactory { _Center = center, _Radius = radius, _Color = color, _FaceFlip = faceFlip, _Context = dc }; // top 4 ctx.DrawTriangle(lod, XYZ.UnitX, XYZ.UnitY, XYZ.UnitZ); ctx.DrawTriangle(lod, XYZ.UnitZ, XYZ.UnitY, -XYZ.UnitX); ctx.DrawTriangle(lod, -XYZ.UnitX, XYZ.UnitY, -XYZ.UnitZ); ctx.DrawTriangle(lod, -XYZ.UnitZ, XYZ.UnitY, XYZ.UnitX); // bottom 4 ctx._FaceFlip = !ctx._FaceFlip; ctx.DrawTriangle(lod, XYZ.UnitX, -XYZ.UnitY, XYZ.UnitZ); ctx.DrawTriangle(lod, XYZ.UnitZ, -XYZ.UnitY, -XYZ.UnitX); ctx.DrawTriangle(lod, -XYZ.UnitX, -XYZ.UnitY, -XYZ.UnitZ); ctx.DrawTriangle(lod, -XYZ.UnitZ, -XYZ.UnitY, XYZ.UnitX); }
public Decompose3D(ICoreScene3D renderTarget, int cylinderLOD, int sphereLOD) { _RenderTarget = renderTarget; _DecomposeSurfaceOutlines = true; _CylinderLod = cylinderLOD; _SphereLod = sphereLOD; }
public Decompose3D(ICoreScene3D renderTarget) { _RenderTarget = renderTarget; _DecomposeSurfaceOutlines = true; _CylinderLod = 6; _SphereLod = 3; }
/// <summary> /// Sets the target <see cref="ICoreScene3D"/> to where the drawing calls will be redirected. /// </summary> /// <param name="target">The drawing target.</param> protected void SetPassThroughTarget(ICoreScene3D target) { if (object.ReferenceEquals(target, this)) { throw new ArgumentException($"{nameof(target)} must not reference itself to avod a circular dependency. Derive from {nameof(PassToSelf)} instead."); } _Target = target; }
public static void DrawIcosahedron(ICoreScene3D dc, XYZ center, float radius, int lod, ColorStyle color, bool faceFlip) { if (lod < 0) { return; } var ctx = new PlatonicFactory { _Center = center, _Radius = radius, _Color = color, _FaceFlip = faceFlip, _Context = dc }; // 5 faces around point 0 ctx.DrawTriangle(lod, _ICOVRT0, _ICOVRT11, _ICOVRT5); ctx.DrawTriangle(lod, _ICOVRT0, _ICOVRT5, _ICOVRT1); ctx.DrawTriangle(lod, _ICOVRT0, _ICOVRT1, _ICOVRT7); ctx.DrawTriangle(lod, _ICOVRT0, _ICOVRT7, _ICOVRT10); ctx.DrawTriangle(lod, _ICOVRT0, _ICOVRT10, _ICOVRT11); // 5 adjacent faces ctx.DrawTriangle(lod, _ICOVRT1, _ICOVRT5, _ICOVRT9); ctx.DrawTriangle(lod, _ICOVRT5, _ICOVRT11, _ICOVRT4); ctx.DrawTriangle(lod, _ICOVRT11, _ICOVRT10, _ICOVRT2); ctx.DrawTriangle(lod, _ICOVRT10, _ICOVRT7, _ICOVRT6); ctx.DrawTriangle(lod, _ICOVRT7, _ICOVRT1, _ICOVRT8); // 5 faces around point 3 ctx.DrawTriangle(lod, _ICOVRT3, _ICOVRT9, _ICOVRT4); ctx.DrawTriangle(lod, _ICOVRT3, _ICOVRT4, _ICOVRT2); ctx.DrawTriangle(lod, _ICOVRT3, _ICOVRT2, _ICOVRT6); ctx.DrawTriangle(lod, _ICOVRT3, _ICOVRT6, _ICOVRT8); ctx.DrawTriangle(lod, _ICOVRT3, _ICOVRT8, _ICOVRT9); // 5 adjacent faces ctx.DrawTriangle(lod, _ICOVRT4, _ICOVRT9, _ICOVRT5); ctx.DrawTriangle(lod, _ICOVRT2, _ICOVRT4, _ICOVRT11); ctx.DrawTriangle(lod, _ICOVRT6, _ICOVRT2, _ICOVRT10); ctx.DrawTriangle(lod, _ICOVRT8, _ICOVRT6, _ICOVRT7); ctx.DrawTriangle(lod, _ICOVRT9, _ICOVRT8, _ICOVRT1); }
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); }
// https://en.wikipedia.org/wiki/Platonic_solid public static void DrawTetrahedron(ICoreScene3D dc, XYZ center, float radius, int lod, ColorStyle color, bool faceFlip) { if (lod < 0) { return; } var ctx = new PlatonicFactory { _Center = center, _Radius = radius, _Color = color, _FaceFlip = faceFlip, _Context = dc }; ctx.DrawTriangle(lod, _TETRAVRT0, _TETRAVRT1, _TETRAVRT2); ctx.DrawTriangle(lod, _TETRAVRT3, _TETRAVRT0, _TETRAVRT2); ctx.DrawTriangle(lod, _TETRAVRT3, _TETRAVRT1, _TETRAVRT0); ctx.DrawTriangle(lod, _TETRAVRT3, _TETRAVRT2, _TETRAVRT1); }
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; } }
public static Scene3DTransform Create(ICoreScene3D target, in Matrix4x4 xform)
public static bool DrawAsset(ICoreScene3D dc, in Matrix4x4 transform, ASSET asset)