Пример #1
0
        void DecodeDirection(int directionIndex)
        {
            UnityEngine.Profiling.Profiler.BeginSample("DCC.DecodeDirection");
            int internalIndex = DirectionMapping.MapToInternal(header.directionCount, directionIndex);

            sprites[directionIndex] = new Sprite[header.framesPerDir];
            var       bitReader = new BitReader(bytes, header.dirOffset[internalIndex] * 8);
            Direction dir       = new Direction();

            ReadDirection(bitReader, dir);

            int optionalBytesSum = 0;

            dir.frames = new Frame[header.framesPerDir];

            for (int f = 0; f < header.framesPerDir; ++f)
            {
                Frame frame = new Frame();
                dir.frames[f] = frame;
                ReadFrame(bitReader, dir, frame);

                optionalBytesSum += frame.optionalBytes;

                if (frame.bottomUp != 0)
                {
                    Debug.LogWarning("BottomUp frames are not implemented yet (" + filename + ")");
                    continue;
                }

                if (f == 0)
                {
                    dir.box = frame.box;
                }
                else
                {
                    dir.box.xMin = Mathf.Min(dir.box.xMin, frame.box.xMin);
                    dir.box.yMin = Mathf.Min(dir.box.yMin, frame.box.yMin);
                    dir.box.xMax = Mathf.Max(dir.box.xMax, frame.box.xMax);
                    dir.box.yMax = Mathf.Max(dir.box.yMax, frame.box.yMax);
                }
            }

            if (optionalBytesSum != 0)
            {
                Debug.LogWarning("optionalBytesSum != 0, not tested");
            }
            bitReader.ReadBits(optionalBytesSum * 8);

            Streams streams = new Streams();

            ReadStreamsInfo(bitReader, dir, bytes, streams);

            FrameBuffer frameBuffer = CreateFrameBuffer(dir.box);                             // dcc_prepare_buffer_cells

            FillPixelBuffer(header, frameBuffer, dir, streams);                               // dcc_fill_pixel_buffer
            MakeFrames(header, dir, frameBuffer, streams, textures, sprites[directionIndex]); // dcc_make_frames

            UnityEngine.Profiling.Profiler.EndSample();
        }
Пример #2
0
        private Direction ReadFrames(Stream stream, BinaryReader reader, int dirIndex)
        {
            int internalIndex = DirectionMapping.MapToInternal(directionCount, dirIndex);
            var dir           = new Direction();

            dir.frames  = new Frame[framesPerDirection];
            dir.sprites = new Sprite[framesPerDirection];
            int maxWidth  = 0;
            int maxHeight = 0;

            for (int frameIndex = 0; frameIndex < framesPerDirection; frameIndex++)
            {
                int offset = offsets[internalIndex * framesPerDirection + frameIndex];
                stream.Seek(offset, SeekOrigin.Begin);

                var frame = new Frame();
                reader.ReadInt32(); // skip
                frame.width   = reader.ReadInt32();
                frame.height  = reader.ReadInt32();
                frame.offsetX = reader.ReadInt32();
                frame.offsetY = reader.ReadInt32();
                reader.ReadInt32(); // skip
                reader.ReadInt32(); // skip
                frame.dataSize         = reader.ReadInt32();
                frame.dataOffset       = (int)stream.Position;
                dir.frames[frameIndex] = frame;

                maxWidth  = Mathf.Max(maxWidth, frame.width);
                maxHeight = Mathf.Max(maxHeight, frame.height);
            }

            TexturePacker packer;
            int           padding = framesPerDirection > 1 ? 2 : 0;

            if (textureSize == -1)
            {
                int textureWidth  = Mathf.NextPowerOfTwo((maxWidth + padding) * framesPerDirection);
                int textureHeight = Mathf.NextPowerOfTwo(maxHeight + padding);
                textureWidth = Mathf.Min(1024, textureWidth);
                packer       = new TexturePacker(textureWidth, textureHeight, padding);
            }
            else
            {
                packer = new TexturePacker(textureSize, textureSize, padding);
            }

            DrawFrames(dir, packer);

            return(dir);
        }