예제 #1
0
 private void ResetGroupFlags(SVGSpritesList spritesList)
 {
     // now we can unflag sprites
     foreach (SVGSpriteRef spriteRef in spritesList.Sprites)
     {
         // get sprite and its data
         SVGSpriteAssetFile spriteAsset;
         if (this.m_GeneratedSpritesFiles.TryGetValue(spriteRef, out spriteAsset))
         {
             SVGSpriteData spriteData = spriteAsset.SpriteData;
             spriteData.InCurrentInstancesGroup = false;
         }
     }
 }
예제 #2
0
    private void NextInstancesGroup(SVGAssetInput svgAsset, SVGSpritesList spritesList, int instantiationCount)
    {
        int spritesCount = spritesList.Sprites.Count;

        svgAsset.InstanceBaseIdx += spritesCount;
        if (this.InstancesGroupWrap(svgAsset, spritesCount))
        {
            // try to compact used sorting orders (looping game objects that reference this svg)
            this.SortingOrdersCompact(svgAsset);

            // after compaction, if the instantiation of one or all sprites belonging to the new instances group will wrap
            // we have two options:
            //
            // 1. to instantiate sprites in the normal consecutive way, wrapping aroung SPRITES_SORTING_MAX_INSTANCES: in this case a part of sprites will
            // result (sortingOrder) consistent, but the whole sprites group won't
            //
            // 2. to reset the base index to 0 and generate the sprites according to their natural z-order: in this case the whole sprites group will
            // be (sortingOrder) consistent, but it is not granted to be totally (z)separated from other sprites/instances
            //

            if (this.InstancesGroupWrap(svgAsset, spritesCount))
            {
                svgAsset.InstanceBaseIdx = 0;

                /*
                 * // option 2
                 * if (instantiationCount > 1)
                 *  packedSvg.InstanceBaseIdx = 0;
                 * // for single sprite instantiation we implicitly use option 1
                 */
            }
        }

        // now we can unflag sprites
        this.ResetGroupFlags(spritesList);
    }
    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);
    }