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);
            }
Esempio n. 2
0
            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);
            }
Esempio n. 3
0
 public Decompose3D(ICoreScene3D renderTarget, int cylinderLOD, int sphereLOD)
 {
     _RenderTarget             = renderTarget;
     _DecomposeSurfaceOutlines = true;
     _CylinderLod = cylinderLOD;
     _SphereLod   = sphereLOD;
 }
Esempio n. 4
0
 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;
 }
Esempio n. 6
0
            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);
            }
Esempio n. 8
0
            // 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;
                }
            }
Esempio n. 10
0
 public static Scene3DTransform Create(ICoreScene3D target, in Matrix4x4 xform)
Esempio n. 11
0
 public static bool DrawAsset(ICoreScene3D dc, in Matrix4x4 transform, ASSET asset)