private SpriteLoadingStatus GetSpriteInfo(uint spriteId, out Vector4 uv, out Vector2 size, out Texture2D texture) { SpriteTypeImpl match = _spriteSheet.Find(m => spriteId >= m.FirstSpriteId && spriteId <= m.LastSpriteId); var loadingStatus = SpriteLoadingStatus.Failed; if (match != null) { loadingStatus = SpriteLoadingStatus.Completed; texture = match.Texture; } else { texture = null; } if (texture == null) { uv = Vector4.zero; size = Vector2.zero; return(loadingStatus); } size = SpriteTypeSizeRefs[match.SpriteType - 1] * Constants.FieldSize; uint realId = spriteId - match.FirstSpriteId; int texPerRow = (int)(texture.width / size.x); float x = (realId % texPerRow) * size.x; float y = texture.width - (realId / texPerRow * size.y) - size.y; uv = new Vector4(size.x / texture.width, size.y / texture.height, x / texture.width, y / texture.height); return(loadingStatus); }
private SpriteLoadingStatus GetSpriteInfo(uint spriteId, out string filename, out Rect spriteRect, out Vector2 realSpriteSize, out Texture2D tex2D) { SpriteTypeImpl match = _spriteSheet.Find(m => spriteId >= m.FirstSpriteId && spriteId <= m.LastSpriteId); SpriteLoadingStatus loadingStatus = SpriteLoadingStatus.Failed; if (match != null) { loadingStatus = GetOrLoadTexture(match.File, out tex2D); } else { tex2D = null; } if (tex2D == null) { filename = null; spriteRect = Rect.zero; realSpriteSize = Vector2.zero; return(loadingStatus); } filename = match.File; realSpriteSize = SpriteTypeSizeRefs[match.SpriteType - 1] * Constants.FieldSize; uint realId = spriteId - match.FirstSpriteId; int texPerRow = (int)(tex2D.width / realSpriteSize.x); float x = (realId % texPerRow) * realSpriteSize.x; float y = tex2D.width - (realId / texPerRow * realSpriteSize.y) - realSpriteSize.y; spriteRect = new Rect(x / tex2D.width, y / tex2D.height, realSpriteSize.x / tex2D.width, realSpriteSize.y / tex2D.height); return(loadingStatus); }
private bool GetSpriteInfo(uint spriteId, out string filename, out Rect spriteRect, out Vector2 realSpriteSize, out Texture2D tex2D) { SpriteTypeImpl match = _spriteSheet.Find(m => spriteId >= m.FirstSpriteId && spriteId <= m.LastSpriteId); tex2D = match != null?GetOrLoadTexture(match.File) : null; if (match == null || match.SpriteType < 1 || match.SpriteType > 4 || tex2D == null) { filename = null; spriteRect = Rect.zero; realSpriteSize = Vector2.zero; tex2D = null; return(false); } filename = match.File; realSpriteSize = s_SpriteTypesSizesRef[match.SpriteType - 1] * Constants.FieldSize; uint realId = spriteId - match.FirstSpriteId; int texPerRow = (int)(tex2D.width / realSpriteSize.x); float x = (realId % texPerRow) * realSpriteSize.x; float y = tex2D.width - (realId / texPerRow * realSpriteSize.y) - realSpriteSize.y; spriteRect = new Rect(x / tex2D.width, y / tex2D.height, realSpriteSize.x / tex2D.width, realSpriteSize.y / tex2D.height); return(true); }
public IEnumerator Parse(System.IO.Stream stream) { using (var reader = new System.IO.BinaryReader(stream)) { uint total = reader.ReadUInt32(); _spriteSheet = new List <SpriteTypeImpl>((int)total); for (uint i = 0; i < total; i++) { var atlasId = reader.ReadUInt32(); var spriteType = reader.ReadUInt16(); var firstSpriteId = reader.ReadUInt32(); var lastSpriteId = reader.ReadUInt32(); var texture = new Texture2D(1, 1); var size = reader.ReadUInt32(); var data = new byte[size]; reader.Read(data, 0, (int)size); texture.LoadImage(data); var spriteImpl = new SpriteTypeImpl { AtlasId = atlasId, FirstSpriteId = firstSpriteId, LastSpriteId = lastSpriteId, SpriteType = spriteType, Texture = texture, }; _spriteSheet.Add(spriteImpl); // load a batch of 5 textures at once if (i % 500 == 100) { yield return(null); } } } }