/// <summary>Requests to draw the given path at the given atlas location.</summary>
        public static void RequestDraw(AtlasLocation location, VectorPath path, float offsetX, float offsetY, float drawHeight)
        {
            DrawingTexture drawing = new DrawingTexture();

            drawing.Location = location;
            drawing.Path     = path;
            drawing.OffsetX  = offsetX;
            drawing.OffsetY  = offsetY;

            if (Camera == null)
            {
                Camera = new TextureCamera(CPUCopyMode);

                // Apply scale:
                Scale = drawHeight * Camera.WorldPerPixel.x;
            }

            if (Camera.IsDrawing || !Camera.TryFit(drawing))
            {
                // Add to global pending queue:
                drawing.NextDrawing = Pending;
                Pending             = drawing;
            }
        }
Example #2
0
        public void BuildMesh(float xOffset, float yOffset, TextureCamera camera)
        {
            // Hole sort it if needed:
            Path.HoleSort();

            // How many samples?
            int   samples     = 0;
            int   triCount    = 0;
            int   moveToCount = 0;
            float accuracy    = TextureCameras.Accuracy;

            VectorPoint current = Path.FirstPathNode;

            while (current != null)
            {
                if (current.IsClose || current.Next == null)
                {
                    moveToCount--;
                }

                if (!current.HasLine)
                {
                    // Ignore moveto's - Hop to the next one:
                    moveToCount++;
                    current = current.Next;
                    continue;
                }

                if (current.IsCurve || !TextureCameras.SD)
                {
                    // It's a curve (or a HD line) - get the line length:
                    VectorLine line = current as VectorLine;

                    float length = line.Length;

                    // And just add on extra points:
                    int count = (int)(length / accuracy);

                    if (count <= 0)
                    {
                        count = 1;
                    }

                    samples += count;

                    // Anything that isn't a moveto also has 6 additional triangle indices (2 tris):
                    triCount += count * 6;
                }
                else
                {
                    // Add the end node:
                    samples++;

                    // Anything that isn't a moveto also has 6 additional triangle indices (2 tris):
                    triCount += 6;
                }

                // Hop to the next one:
                current = current.Next;
            }


            // Each sample point has an associated line.
            // Each line generates 6 vertices and 4 triangles.
            int vertCount = samples * 6;

            triCount += samples * 4 * 3;

            // Triangulation set next.
            int triangulatedVerts = 0;

            current = Path.FirstPathNode;

            while (current != null)
            {
                if (current.HasLine && current.IsCurve)
                {
                    VectorLine line = current as VectorLine;

                    int extraPoints = (int)(line.Length / TextureCameras.TriangulationAccuracy);

                    if (extraPoints <= 0)
                    {
                        extraPoints = 1;
                    }

                    triangulatedVerts += extraPoints;
                }
                else
                {
                    triangulatedVerts++;
                }

                if (current.IsClose || current.Next == null)
                {
                    // End of a main contour.

                    vertCount += triangulatedVerts;

                    if (triangulatedVerts > 2)
                    {
                        triCount += (triangulatedVerts - 2) * 3;
                    }

                    triangulatedVerts = 0;
                }

                // Hop to the next one:
                current = current.Next;
            }

            camera.Triangulator.Clockwise = true;

            Mesh = TextureCameras.GetBuffer();

            // For each MoveToPair (moveToCount/2), add 4 tri's [2 tris for each "gap"]:
            if (moveToCount != 0)
            {
                moveToCount = moveToCount >> 1;
                triCount   += 12 * moveToCount;
            }

            Mesh.RequireSize(vertCount, triCount);

            // Map offsets:
            xOffset += OffsetX * Mesh.XScaleFactor;
            yOffset += OffsetY * Mesh.YScaleFactor;

            // Let's get generating!
            Mesh.AddMesh(Path, xOffset - ((float)X * 0.1f), yOffset + ((float)Y * 0.1f), camera.Triangulator);
        }