Пример #1
0
        /// <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);
                }
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
 public object Process(ICoreFactory factory, AssetKey key, object asset, Func <AssetKey, object> loaderFunc)
 => new ImageSharpTrueColorTexture(key.ToString(), (Image <Rgba32>)asset);
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }