/// <summary> /// 实例化资源接口中间回调 /// </summary> /// <param name="assetKey"></param> /// <param name="initObject"></param> private void OnLoadAssetCallBack(AssetKey assetKey, UnityEngine.Object initObject) { string assetKeyName = assetKey.ToString(); if (m_AssetToGameObjectInstantiateData.ContainsKey(assetKeyName)) { Queue <GameObjectInstantiateData> mGameObjectInstantiateQueue = m_AssetToGameObjectInstantiateData[assetKeyName]; while (mGameObjectInstantiateQueue.Count > 0) { GameObjectInstantiateData gameObjectInstantiateData = mGameObjectInstantiateQueue.Dequeue(); GameObject gameObject = null; if (initObject is GameObject) { gameObject = GameObject.Instantiate(initObject) as GameObject; if (!gameObjectInstantiateData.BasicData.IsWorldSpace) { if (gameObjectInstantiateData.BasicData.Parent != null) { gameObject.transform.SetParent(gameObjectInstantiateData.BasicData.Parent); } } gameObject.transform.localPosition = gameObjectInstantiateData.BasicData.Position; gameObject.transform.localScale = Vector3.one; } gameObjectInstantiateData.GameObjectCallback(assetKey, gameObject); } } }
public object Process(ICoreFactory factory, AssetKey key, object asset, Func <AssetKey, object> loaderFunc) { var bitmap = (InterlacedBitmap)asset; return(new TrueColorTexture( key.ToString(), (uint)bitmap.Width, (uint)bitmap.Height, bitmap.Palette, bitmap.ImageData)); }
public object Load(BinaryReader br, long streamLength, AssetKey key, AssetInfo config) { ApiUtil.Assert(config.Transposed != true); long initialPosition = br.BaseStream.Position; var sizes = ParseSpriteSizes(config.SubSprites); AlbionSprite sprite = new AlbionSprite { Name = key.ToString(), Width = 0, UniformFrames = false, Frames = new List <AlbionSprite.Frame>() }; int currentY = 0; var frameBytes = new List <byte[]>(); foreach (var(width, height) in sizes) { if (br.BaseStream.Position >= initialPosition + streamLength) { break; } var bytes = br.ReadBytes(width * height); sprite.Frames.Add(new AlbionSprite.Frame(0, currentY, width, height)); frameBytes.Add(bytes); currentY += height; if (width > sprite.Width) { sprite.Width = width; } } sprite.Height = currentY; sprite.PixelData = new byte[sprite.Frames.Count * sprite.Width * currentY]; for (int n = 0; n < sprite.Frames.Count; n++) { var frame = sprite.Frames[n]; for (int j = 0; j < frame.Height; j++) { for (int i = 0; i < frame.Width; i++) { sprite.PixelData[(frame.Y + j) * sprite.Width + frame.X + i] = frameBytes[n][j * frame.Width + i]; } } } ApiUtil.Assert(br.BaseStream.Position == initialPosition + streamLength); return(sprite); }
/// <summary> /// 实例化GameObject /// </summary> /// <param name="assetKey"></param> /// <param name="callback"></param> /// <param name="instantiateBasicData"></param> public void InstantiateGameObjectAsync(AssetKey assetKey, Action <AssetKey, UnityEngine.Object> callback, InstantiateBasicData instantiateBasicData = default) { GameObjectInstantiateData gameObjectInstantiateData = new GameObjectInstantiateData() { BasicData = instantiateBasicData, GameObjectCallback = callback }; string assetKeyName = assetKey.ToString(); if (!m_AssetToGameObjectInstantiateData.ContainsKey(assetKeyName)) { Queue <GameObjectInstantiateData> queue = new Queue <GameObjectInstantiateData>(); m_AssetToGameObjectInstantiateData.Add(assetKeyName, queue); } m_AssetToGameObjectInstantiateData[assetKeyName].Enqueue(gameObjectInstantiateData); LoadAssetAsync(assetKey, OnLoadAssetCallBack); }
public object Process(ICoreFactory factory, AssetKey key, object asset, Func <AssetKey, object> loaderFunc) => new ImageSharpTrueColorTexture(key.ToString(), (Image <Rgba32>)asset);
public object Load(BinaryReader br, long streamLength, AssetKey key, AssetInfo config) { ApiUtil.Assert(config.Transposed != true); var sprite = new AlbionSprite(); long initialPosition = br.BaseStream.Position; sprite.Name = key.ToString(); sprite.UniformFrames = config.Format == FileFormat.SingleHeaderSprite; int width = br.ReadUInt16(); int height = br.ReadUInt16(); int something = br.ReadByte(); ApiUtil.Assert(something == 0); int spriteCount = br.ReadByte(); sprite.Frames = new AlbionSprite.Frame[spriteCount]; var frameBytes = new List <byte[]>(); int currentY = 0; sprite.Width = 0; for (int i = 0; i < spriteCount; i++) { if (!sprite.UniformFrames && i > 0) { width = br.ReadUInt16(); height = br.ReadUInt16(); something = br.ReadByte(); ApiUtil.Assert(something == 0); int spriteCount2 = br.ReadByte(); ApiUtil.Assert(spriteCount2 == spriteCount); } var bytes = br.ReadBytes(width * height); sprite.Frames[i] = new AlbionSprite.Frame(0, currentY, width, height); frameBytes.Add(bytes); currentY += height; if (width > sprite.Width) { sprite.Width = width; } } sprite.Height = currentY; sprite.PixelData = new byte[spriteCount * sprite.Width * currentY]; for (int n = 0; n < spriteCount; n++) { var frame = sprite.Frames[n]; for (int j = 0; j < frame.Height; j++) { for (int i = 0; i < frame.Width; i++) { sprite.PixelData[(frame.Y + j) * sprite.Width + frame.X + i] = frameBytes[n][j * frame.Width + i]; } } } ApiUtil.Assert(br.BaseStream.Position == initialPosition + streamLength); return(sprite); }
public object Load(BinaryReader br, long streamLength, AssetKey key, AssetInfo config) { if (streamLength == 0) { return(null); } int width = config.EffectiveWidth; int height = config.EffectiveHeight; if (width == 0) { width = (int)Math.Sqrt(streamLength); } if (height == 0) { height = (int)streamLength / width; } // ApiUtil.Assert(streamLength % width == 0); // ApiUtil.Assert(streamLength % (width * height) == 0); // long initialPosition = br.BaseStream.Position; int spriteCount = Math.Max(1, unchecked ((int)(streamLength / (width * height)))); height = (int)streamLength / (width * spriteCount); var sprite = new AlbionSprite { Name = key.ToString(), Width = width, Height = height * spriteCount, Frames = new AlbionSprite.Frame[spriteCount], UniformFrames = true, PixelData = new byte[spriteCount * width * height] }; int currentY = 0; for (int n = 0; n < spriteCount; n++) { sprite.Frames[n] = new AlbionSprite.Frame(0, currentY, width, height); var bytes = br.ReadBytes(width * height); for (int i = 0; i < width * height; i++) { sprite.PixelData[n * width * height + i] = bytes[i]; } currentY += height; } if (config.Transposed) { var rotatedSprite = new AlbionSprite { Name = key.ToString(), Width = height, Height = width * spriteCount, Frames = new AlbionSprite.Frame[spriteCount], UniformFrames = true, PixelData = new byte[spriteCount * width * height] }; int rotatedFrameHeight = width; for (int n = 0; n < spriteCount; n++) { rotatedSprite.Frames[n] = new AlbionSprite.Frame( 0, rotatedFrameHeight * n, rotatedSprite.Width, rotatedFrameHeight); ApiUtil.RotateImage(width, height, new Span <byte>(sprite.PixelData, n * width * height, width * height), new Span <byte>(rotatedSprite.PixelData, n * width * height, width * height)); } return(rotatedSprite); } // ApiUtil.Assert(br.BaseStream.Position == initialPosition + streamLength); return(sprite); }