public void AddPoint(float x, float y)
        {
            if (Triangulator != null)
            {
                x *= XScaleFactor;
                y *= YScaleFactor;

                x += XOffset;
                y += YOffset;

                // Create vert:
                Vector3 vert = new Vector3(x, y, -ExtrudeAmount - 0.05f);

                // Add triangulator vertex:
                Triangulator.AddVertex(vert, ref FirstInContour, ref LastInContour);

                // Add it:
                Vertices[CurrentVertex] = vert;
                Colours[CurrentVertex]  = FrontColor;
                CurrentVertex++;

                return;
            }

            if (IsClosing && x == CloseX && y == CloseY)
            {
                Triangles[CurrentTriangle++] = CurrentVertex;
                Triangles[CurrentTriangle++] = StartIndex;
                Triangles[CurrentTriangle++] = CurrentVertex + 1;

                Triangles[CurrentTriangle++] = StartIndex;
                Triangles[CurrentTriangle++] = StartIndex + 1;
                Triangles[CurrentTriangle++] = CurrentVertex + 1;
            }

            x *= XScaleFactor;
            y *= YScaleFactor;

            x += XOffset;
            y += YOffset;

            // Triangles (connections):
            if (Moved)
            {
                // Clear moved:
                Moved = false;
            }
            else
            {
                Triangles[CurrentTriangle++] = CurrentVertex;
                Triangles[CurrentTriangle++] = CurrentVertex + 1;
                Triangles[CurrentTriangle++] = CurrentVertex - 2;

                Triangles[CurrentTriangle++] = CurrentVertex - 1;
                Triangles[CurrentTriangle++] = CurrentVertex - 2;
                Triangles[CurrentTriangle++] = CurrentVertex + 1;
            }

            // Top line:
            Colours[CurrentVertex]  = FrontColor;
            Vertices[CurrentVertex] = new Vector3(x, y, -0.05f);
            CurrentVertex++;
            Colours[CurrentVertex]  = FrontColor;
            Vertices[CurrentVertex] = new Vector3(x, y, -ExtrudeAmount - 0.05f);
            CurrentVertex++;

            PreviousX = x;
            PreviousY = y;
        }
示例#2
0
        public void AddPoint(float x, float y)
        {
            if (Triangulator != null)
            {
                x *= XScaleFactor;
                y *= YScaleFactor;

                x += XOffset;
                y += YOffset;

                // Create vert:
                Vector3 vert = new Vector3(x, y, 0f);

                // Add triangulator vertex:
                Triangulator.AddVertex(vert, ref FirstInContour, ref LastInContour);

                // Add it:
                Vertices[CurrentVertex] = vert;
                Colours[CurrentVertex]  = White;
                CurrentVertex++;

                return;
            }

            if (IsClosing && x == CloseX && y == CloseY)
            {
                // Add the connection triangles back to the move to node:
                Triangles[CurrentTriangle++] = CurrentVertex + 1;
                Triangles[CurrentTriangle++] = StartIndex + 2;
                Triangles[CurrentTriangle++] = CurrentVertex + 3;

                Triangles[CurrentTriangle++] = CurrentVertex + 1;
                Triangles[CurrentTriangle++] = CurrentVertex + 5;
                Triangles[CurrentTriangle++] = StartIndex + 4;
            }

            x *= XScaleFactor;
            y *= YScaleFactor;

            x += XOffset;
            y += YOffset;

            // Get deltas:
            float dx = x - PreviousX;
            float dy = y - PreviousY;

            // Dx/dy (inner):
            float dxInner;
            float dyInner;

            // Previous values:
            float previousOuterDY;
            float previousOuterDX;
            float previousInnerDY;
            float previousInnerDX;

            // Spread of the SDF distance:
            float innerSpread;
            float outerSpread;

            if (DistanceSpread.Custom)
            {
                innerSpread = DistanceSpread.GetInner(x, y, CurrentVertex, TotalVertices);

                if (DistanceSpread.InnerOuterDiff)
                {
                    outerSpread = DistanceSpread.GetOuter(x, y, CurrentVertex, TotalVertices);
                }
                else
                {
                    outerSpread = innerSpread;
                }
            }
            else
            {
                innerSpread = DistanceSpread.DefaultInner;
                outerSpread = DistanceSpread.DefaultOuter;
            }

            if (Moved)
            {
                // Previous is the same:
                PreviousOuterSpread = outerSpread;
                PreviousInnerSpread = innerSpread;
            }

            // Previous got a different spread?
            bool  previousDiff = (PreviousInnerSpread != innerSpread);
            float length;

            if (DistanceSpread.InnerOuterDiff)
            {
                float root = (float)Math.Sqrt((dx * dx) + (dy * dy));

                // Normalise inner:
                length  = innerSpread / root;
                dxInner = dx * length;
                dyInner = dy * length;

                if (previousDiff)
                {
                    // Normalise them:
                    length          = PreviousInnerSpread / root;
                    previousInnerDX = dx * length;
                    previousInnerDY = dy * length;
                }
                else
                {
                    previousInnerDY = dyInner;
                    previousInnerDX = dxInner;
                }

                // Normalise outer:
                length = outerSpread / root;
                dx    *= length;
                dy    *= length;

                if (PreviousOuterSpread == outerSpread)
                {
                    previousOuterDY = dy;
                    previousOuterDX = dx;
                }
                else
                {
                    // Normalise them:
                    length          = PreviousOuterSpread / outerSpread;
                    previousOuterDX = dx * length;
                    previousOuterDY = dy * length;
                }
            }
            else if (innerSpread == 0f)
            {
                if (previousDiff)
                {
                    // Normalise using previous spread:
                    // Note that because its different, we also know it's non-zero.
                    length = PreviousInnerSpread / (float)Math.Sqrt((dx * dx) + (dy * dy));

                    previousOuterDY = dy * length;
                    previousOuterDX = dx * length;
                }
                else
                {
                    // Previous spread is also zero - results are all zero:
                    previousOuterDY = 0f;
                    previousOuterDX = 0f;
                }

                // Inner is the same:
                previousInnerDY = previousOuterDY;
                previousInnerDX = previousOuterDX;

                // All zero:
                dxInner = 0f;
                dyInner = 0f;
                dx      = 0f;
                dy      = 0f;
            }
            else
            {
                // Normalise them:
                length = innerSpread / (float)Math.Sqrt((dx * dx) + (dy * dy));
                dx    *= length;
                dy    *= length;

                // Dx/dy (inner):
                dxInner = dx;
                dyInner = dy;

                if (previousDiff)
                {
                    // What's the difference?
                    length = PreviousInnerSpread / innerSpread;

                    // Apply:
                    previousOuterDY = dy * length;
                    previousOuterDX = dx * length;
                }
                else
                {
                    previousOuterDY = dy;
                    previousOuterDX = dx;
                }

                // Inner is the same:
                previousInnerDY = previousOuterDY;
                previousInnerDX = previousOuterDX;
            }

            // Triangles (connections):
            if (Moved)
            {
                // Clear moved:
                Moved = false;
            }
            else
            {
                Triangles[CurrentTriangle++] = CurrentVertex;
                Triangles[CurrentTriangle++] = CurrentVertex + 2;
                Triangles[CurrentTriangle++] = CurrentVertex - 3;

                Triangles[CurrentTriangle++] = CurrentVertex;
                Triangles[CurrentTriangle++] = CurrentVertex + 4;
                Triangles[CurrentTriangle++] = CurrentVertex - 1;
            }

            // Triangles (outer):
            Triangles[CurrentTriangle++] = CurrentVertex;
            Triangles[CurrentTriangle++] = CurrentVertex + 2;
            Triangles[CurrentTriangle++] = CurrentVertex + 1;

            Triangles[CurrentTriangle++] = CurrentVertex + 1;
            Triangles[CurrentTriangle++] = CurrentVertex + 2;
            Triangles[CurrentTriangle++] = CurrentVertex + 3;

            // Triangles (inner):
            Triangles[CurrentTriangle++] = CurrentVertex;
            Triangles[CurrentTriangle++] = CurrentVertex + 1;
            Triangles[CurrentTriangle++] = CurrentVertex + 4;

            Triangles[CurrentTriangle++] = CurrentVertex + 1;
            Triangles[CurrentTriangle++] = CurrentVertex + 5;
            Triangles[CurrentTriangle++] = CurrentVertex + 4;

            Color32 inner;
            Color32 outer;

            if (Winding)
            {
                inner = White;
                outer = Black;
            }
            else
            {
                inner = Black;
                outer = White;
            }

            // Top line:
            Colours[CurrentVertex]  = MidGrey;
            Vertices[CurrentVertex] = new Vector3(PreviousX, PreviousY, 1f);
            CurrentVertex++;
            Colours[CurrentVertex]  = MidGrey;
            Vertices[CurrentVertex] = new Vector3(x, y, 1f);
            CurrentVertex++;

            // Bottom line (outer):
            Colours[CurrentVertex]  = outer;
            Vertices[CurrentVertex] = new Vector3(PreviousX + previousOuterDY, PreviousY - previousOuterDX, 0f);
            CurrentVertex++;
            Colours[CurrentVertex]  = outer;
            Vertices[CurrentVertex] = new Vector3(x + dy, y - dx, 0f);
            CurrentVertex++;

            // Bottom line (inner):
            Colours[CurrentVertex]  = inner;
            Vertices[CurrentVertex] = new Vector3(PreviousX - previousInnerDY, PreviousY + previousInnerDX, 0f);
            CurrentVertex++;
            Colours[CurrentVertex]  = inner;
            Vertices[CurrentVertex] = new Vector3(x - dyInner, y + dxInner, 0f);
            CurrentVertex++;

            PreviousX           = x;
            PreviousY           = y;
            PreviousOuterSpread = outerSpread;
            PreviousInnerSpread = innerSpread;
        }