Exemple #1
0
    private Texture2D DrawSVG(string svgXml,
                              uint texWidth, uint texHeight,
                              Color clearColor,
                              bool fastUpload)
    {
        SVGDocument document;
        SVGSurface  surface;
        Texture2D   texture = null;

        // create a drawing surface, with the same texture dimensions
        surface = SVGAssets.CreateSurface(texWidth, texHeight);
        if (surface == null)
        {
            return(null);
        }
        // create the SVG document
        document = SVGAssets.CreateDocument(svgXml);
        if (document == null)
        {
            surface.Dispose();
            return(null);
        }
        // draw the SVG document onto the surface
        if (surface.Draw(document, new SVGColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a), SVGRenderingQuality.Better))
        {
            // create a 2D texture compatible with the drawing surface
            texture = surface.CreateCompatibleTexture(true, false);
            if (texture != null)
            {
                texture.hideFlags = HideFlags.DontSave;
                // copy the surface content into the texture
                if (fastUpload && Application.isPlaying)
                {
                    surface.CopyAndDestroy(texture);
                }
                else
                {
                    if (surface.Copy(texture))
                    {
                        // call Apply() so it's actually uploaded to the GPU
                        texture.Apply(false, true);
                    }
                }
            }
        }

        // destroy SVG surface and document
        surface.Dispose();
        document.Dispose();
        // return the created texture
        return(texture);
    }
Exemple #2
0
    private Texture2D DrawAtlas(string svgXml1, string svgXml2, string svgXml3, string svgXml4,
                                uint texWidth, uint texHeight,
                                Color clearColor,
                                bool fastUpload)
    {
        SVGDocument document1;
        SVGDocument document2;
        SVGDocument document3;
        SVGDocument document4;
        SVGSurface  surface;
        Texture2D   texture = null;

        // create a drawing surface, with the same texture dimensions
        surface = SVGAssets.CreateSurface(texWidth, texHeight);
        if (surface == null)
        {
            return(null);
        }
        // create the SVG document
        document1 = SVGAssets.CreateDocument(svgXml1);
        if (document1 == null)
        {
            surface.Dispose();
            return(null);
        }
        document2 = SVGAssets.CreateDocument(svgXml2);
        if (document2 == null)
        {
            surface.Dispose();
            document1.Dispose();
            return(null);
        }
        document3 = SVGAssets.CreateDocument(svgXml3);
        if (document3 == null)
        {
            surface.Dispose();
            document1.Dispose();
            document2.Dispose();
            return(null);
        }
        document4 = SVGAssets.CreateDocument(svgXml4);
        if (document4 == null)
        {
            surface.Dispose();
            document1.Dispose();
            document2.Dispose();
            document3.Dispose();
            return(null);
        }

        // draw the SVG document1 onto the surface
        surface.Viewport = new SVGViewport(0.0f, 0.0f, texWidth / 2.0f, texHeight / 2.0f);
        surface.Draw(document1, new SVGColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a), SVGRenderingQuality.Better);
        // draw the SVG document2 onto the surface
        surface.Viewport = new SVGViewport(texWidth / 2.0f, 0.0f, texWidth / 2.0f, texHeight / 2.0f);
        surface.Draw(document2, null, SVGRenderingQuality.Better);
        // draw the SVG document3 onto the surface
        surface.Viewport = new SVGViewport(0.0f, texHeight / 2.0f, texWidth / 2.0f, texHeight / 2.0f);
        surface.Draw(document3, null, SVGRenderingQuality.Better);
        // draw the SVG document4 onto the surface
        surface.Viewport = new SVGViewport(texWidth / 2.0f, texHeight / 2.0f, texWidth / 2.0f, texHeight / 2.0f);
        surface.Draw(document4, null, SVGRenderingQuality.Better);

        // create a 2D texture compatible with the drawing surface
        texture = surface.CreateCompatibleTexture(true, false);
        if (texture != null)
        {
            texture.hideFlags = HideFlags.DontSave;
            // copy the surface content into the texture
            if (fastUpload && Application.isPlaying)
            {
                surface.CopyAndDestroy(texture);
            }
            else
            {
                if (surface.Copy(texture))
                {
                    // call Apply() so it's actually uploaded to the GPU
                    texture.Apply(false, true);
                }
            }
        }
        // destroy SVG surface and document
        surface.Dispose();
        document1.Dispose();
        document2.Dispose();
        document3.Dispose();
        document4.Dispose();
        // return the created texture
        return(texture);
    }
    private static bool GenerateSpritesFromBins(// input
        SVGPackedBin[] bins,
        Dictionary <uint, PackedSvgDocRef> loadedDocuments,
        float generationScale,
        Color clearColor,
        bool fastUpload,
        SVGSpritesDictionary previousSprites,
        // output
        List <Texture2D> textures, List <KeyValuePair <SVGSpriteRef, SVGSpriteData> > sprites,
        SVGSpritesListDictionary spritesListDict)
    {
        if (bins == null || loadedDocuments == null || textures == null || sprites == null)
        {
            return(false);
        }

        // sprite reference/key used to get pivot
        SVGSpriteRef tmpRef = new SVGSpriteRef(null, 0);

        for (int i = 0; i < bins.Length; ++i)
        {
            // extract the bin
            SVGPackedBin bin = bins[i];
            // create drawing surface
            SVGSurface surface = SVGAssets.CreateSurface(bin.Width, bin.Height);

            if (surface != null)
            {
                // draw packed rectangles of the current bin
                if (surface.Draw(bin, new SVGColor(clearColor.r, clearColor.g, clearColor.b, clearColor.a), SVGRenderingQuality.Better))
                {
                    // bin rectangles
                    SVGPackedRectangle[] rectangles = bin.Rectangles;
                    // create a 2D texture compatible with the drawing surface
                    Texture2D texture = surface.CreateCompatibleTexture(true, false);

                    if (texture != null)
                    {
                        // push the created texture
                        textures.Add(texture);
                        for (int j = 0; j < rectangles.Length; ++j)
                        {
                            PackedSvgDocRef    svgDocRef;
                            SVGPackedRectangle rect = rectangles[j];
                            // get access to the referenced SVG document
                            if (loadedDocuments.TryGetValue(rect.DocHandle, out svgDocRef))
                            {
                                SVGSpriteAssetFile spriteAsset;
                                Vector2            pivot;
                                Vector4            border;
                                bool inCurrentInstancesGroup;
                                // try to see if this sprite was previously generated, and if so get its pivot
                                tmpRef.TxtAsset = svgDocRef.TxtAsset;
                                tmpRef.ElemIdx  = (int)rect.ElemIdx;
                                // get the previous pivot if present, else start with a default centered pivot
                                if (previousSprites.TryGetValue(tmpRef, out spriteAsset))
                                {
                                    float deltaScaleRatio = generationScale / spriteAsset.SpriteData.GenerationScale;
                                    pivot  = spriteAsset.SpriteData.Pivot;
                                    border = spriteAsset.SpriteData.Border * deltaScaleRatio;
                                    inCurrentInstancesGroup = spriteAsset.SpriteData.InCurrentInstancesGroup;
                                }
                                else
                                {
                                    pivot  = new Vector2(0.5f, 0.5f);
                                    border = Vector4.zero;
                                    inCurrentInstancesGroup = false;
                                }
                                // create a new sprite
                                Sprite sprite = Sprite.Create(texture, new Rect((float)rect.X, (float)((int)bin.Height - rect.Y - rect.Height), (float)rect.Width, (float)rect.Height), pivot, SVGBasicAtlas.SPRITE_PIXELS_PER_UNIT, 0, SpriteMeshType.FullRect, border);
                                sprite.name = svgDocRef.Name + "_" + rect.Name;
                                // push the sprite reference
                                SVGSpriteRef  key   = new SVGSpriteRef(svgDocRef.TxtAsset, (int)rect.ElemIdx);
                                SVGSpriteData value = new SVGSpriteData(sprite, pivot, border, rect.ZOrder, rect.OriginalX, rect.OriginalY, generationScale, inCurrentInstancesGroup);
                                sprites.Add(new KeyValuePair <SVGSpriteRef, SVGSpriteData>(key, value));
                                // check if we are interested in getting, for each SVG document, the list of its generated sprites
                                if (spritesListDict != null)
                                {
                                    SVGSpritesList spritesList;
                                    if (!spritesListDict.TryGetValue(svgDocRef.TxtAsset.GetInstanceID(), out spritesList))
                                    {
                                        // create the list of sprites location relative to the SVG text asset
                                        spritesList = new SVGSpritesList();
                                        spritesListDict.Add(svgDocRef.TxtAsset.GetInstanceID(), spritesList);
                                    }
                                    // add the new sprite the its list
                                    spritesList.Sprites.Add(key);
                                }

                                // decrement document references
                                if (svgDocRef.Dec(1) == 0)
                                {
                                    // we can free AmanithSVG native SVG document
                                    svgDocRef.Document.Dispose();
                                }
                            }
                        }
                        // copy the surface content into the texture
                        if (fastUpload && (Application.isPlaying))
                        {
                            surface.CopyAndDestroy(texture);
                        }
                        else
                        {
                            if (surface.Copy(texture))
                            {
                                // call Apply() so it's actually uploaded to the GPU
                                texture.Apply(false, false);
                            }
                        }
                    }
                }
                // destroy the AmanithSVG rendering surface
                surface.Dispose();
            }
        }
        return(true);
    }
    private static SVGPackedBin[] GenerateBins(// input
        List <SVGAssetInput> svgList,
        int maxTexturesDimension,
        int border,
        bool pow2Textures,
        float scale,
        // output
        Dictionary <int, PackedSvgAssetDocLink> processedAssets, Dictionary <uint, PackedSvgDocRef> loadedDocuments)
    {
        SVGPacker packer = SVGAssets.CreatePacker(scale, (uint)maxTexturesDimension, (uint)border, pow2Textures);

        // start the packing process
        if (packer.Begin())
        {
            foreach (SVGAssetInput svgAsset in svgList)
            {
                int assetKey = svgAsset.TxtAsset.GetInstanceID();
                // if the text asset has not been already processed, lets create an SVG document out of it
                if (!processedAssets.ContainsKey(assetKey))
                {
                    // create the SVG document
                    SVGDocument svgDoc = SVGAssets.CreateDocument(svgAsset.TxtAsset.text);
                    if (svgDoc != null)
                    {
                        PackedSvgDocRef svgDocRef = new PackedSvgDocRef(svgDoc, svgAsset.TxtAsset);
                        // add the document to the packer, and get back the actual number of packed bounding boxes
                        uint[] info = packer.Add(svgDoc, svgAsset.SeparateGroups, svgAsset.Scale);
                        // info[0] = number of collected bounding boxes
                        // info[1] = the actual number of packed bounding boxes
                        if (info != null && info[1] == info[0])
                        {
                            // increment references
                            svgDocRef.Inc(info[1]);
                            // keep track of the processed asset / created document
                            processedAssets.Add(assetKey, new PackedSvgAssetDocLink(svgAsset, svgDoc));
                            loadedDocuments.Add(svgDoc.Handle, svgDocRef);
                        }
                        else
                        {
                        #if UNITY_EDITOR
                            if (info[1] < info[0])
                            {
                                EditorUtility.DisplayDialog("Some SVG elements cannot be packed!",
                                                            "Specified maximum texture dimensions do not allow to pack all SVG elements, please increase the value",
                                                            "Ok");
                            }
                        #else
                            UnityEngine.Debug.Log("Some SVG elements cannot be packed! Specified maximum texture dimensions do not allow to pack all SVG elements, please increase the value");
                        #endif
                            // close the packing process without doing anything
                            packer.End(false);
                            // free memory allocated by all loaded SVG documents
                            foreach (PackedSvgAssetDocLink docLink in processedAssets.Values)
                            {
                                docLink.Document.Dispose();
                            }
                            // return the error
                            return(null);
                        }
                    }
                }
                else
                {
                    PackedSvgAssetDocLink existingAsset;
                    // get the (already processed svg) asset
                    if (processedAssets.TryGetValue(assetKey, out existingAsset))
                    {
                        PackedSvgDocRef svgDocRef;
                        // get the (already created) svg document
                        if (loadedDocuments.TryGetValue(existingAsset.Document.Handle, out svgDocRef))
                        {
                            // add the document to the packer, and get back the actual number of packed bounding boxes
                            uint[] info = packer.Add(svgDocRef.Document, svgAsset.SeparateGroups, svgAsset.Scale);
                            // info[0] = number of collected bounding boxes
                            // info[1] = the actual number of packed bounding boxes
                            if (info != null && info[1] == info[0])
                            {
                                // increment references
                                svgDocRef.Inc(info[1]);
                            }
                            else
                            {
                            #if UNITY_EDITOR
                                if (info[1] < info[0])
                                {
                                    EditorUtility.DisplayDialog("Some SVG elements cannot be packed!",
                                                                "Specified maximum texture dimensions do not allow to pack all SVG elements, please increase the value",
                                                                "Ok");
                                }
                            #else
                                UnityEngine.Debug.Log("Some SVG elements cannot be packed! Specified maximum texture dimensions do not allow to pack all SVG elements, please increase the value");
                            #endif
                                // close the packing process without doing anything
                                packer.End(false);
                                // free memory allocated by all loaded SVG documents
                                foreach (PackedSvgAssetDocLink docLink in processedAssets.Values)
                                {
                                    docLink.Document.Dispose();
                                }
                                // return the error
                                return(null);
                            }
                        }
                    }
                }
            }
            // return generated bins
            return(packer.End(true));
        }
        else
        {
            return(null);
        }
    }
 private void LoadSVG()
 {
     // create and load SVG document
     this.m_SvgDoc = (this.SVGFile != null) ? SVGAssets.CreateDocument(this.SVGFile.text) : null;
 }