public SpriteMesh_Managed AddSprite(SpriteRoot sprite) { if (sprite.manager == this && sprite.AddedToManager) { return((SpriteMesh_Managed)sprite.spriteMesh); } if (!this.initialized) { if (this.spriteAddQueue == null) { this.spriteAddQueue = new List <SpriteRoot>(); } this.spriteAddQueue.Add(sprite); return(null); } if (this.availableBlocks.Empty) { this.EnlargeArrays(this.allocBlockSize); } int index = this.availableBlocks.Head.index; this.availableBlocks.Remove(this.availableBlocks.Head); SpriteMesh_Managed spriteMesh_Managed = this.sprites[index]; sprite.spriteMesh = spriteMesh_Managed; sprite.manager = this; sprite.AddedToManager = true; spriteMesh_Managed.drawLayer = sprite.drawLayer; this.bones[index] = sprite.gameObject.transform; this.bindPoses[index] = this.bones[index].worldToLocalMatrix * sprite.transform.localToWorldMatrix; this.activeBlocks.Add(spriteMesh_Managed); spriteMesh_Managed.Init(); this.SortDrawingOrder(); this.vertCountChanged = true; this.vertsChanged = true; this.uvsChanged = true; return(spriteMesh_Managed); }
/// <summary> /// Adds the specified sprite to the SpriteManager. /// </summary> /// <param name="go">Reference to the desired sprite.</param> /// <returns>A reference to the sprite's managed mesh.</returns> public SpriteMesh_Managed AddSprite(SpriteRoot sprite) { int spriteIndex; // See if the sprite is already added: if(sprite.manager == this && sprite.AddedToManager) return (SpriteMesh_Managed)sprite.spriteMesh; /* if (ensureUnique) if (AlreadyAdded(sprite)) return (SpriteMesh_Managed) sprite.spriteMesh; */ // See if we're ready to add sprites yet, // and if not, add the sprite to our deferred // add queue: if(!initialized) { if (spriteAddQueue == null) spriteAddQueue = new List<SpriteRoot>(); spriteAddQueue.Add(sprite); return null; } // Get an available sprite: if (availableBlocks.Empty) EnlargeArrays(allocBlockSize); // If we're out of available sprites, allocate some more: // Use a sprite from the list of available blocks: spriteIndex = availableBlocks.Head.index; availableBlocks.Remove(availableBlocks.Head); // Now that we're using this one, remove it from the available list // Assign the new sprite: SpriteMesh_Managed newSpritesMesh = sprites[spriteIndex]; sprite.spriteMesh = newSpritesMesh; sprite.manager = this; sprite.AddedToManager = true; newSpritesMesh.drawLayer = sprite.drawLayer; // Associate the sprite's bone: bones[spriteIndex] = sprite.gameObject.transform; // meshRenderer.bones = bones; bindPoses[spriteIndex] = bones[spriteIndex].worldToLocalMatrix * sprite.transform.localToWorldMatrix; /* // Save this to an active list now that it is in-use: if (billboarded) { newSprite.billboarded = true; activeBillboards.Add(newSprite); } else */ activeBlocks.Add(newSpritesMesh); newSpritesMesh.Init(); // Sort the draw layers: SortDrawingOrder(); // Set our flags: vertCountChanged = true; vertsChanged = true; uvsChanged = true; return newSpritesMesh; }