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; } } }
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); }