Ejemplo n.º 1
0
        public override void Load(IResourceCache cache, ResourcePath path)
        {
            var clyde = IoCManager.Resolve <IClyde>();

            var loadStepData = new LoadStepData {
                Path = path
            };

            LoadPreTexture(cache, loadStepData);

            // Load atlas.
            LoadTexture(clyde, loadStepData);

            LoadPostTexture(loadStepData);
            LoadFinish(cache, loadStepData);

            loadStepData.AtlasSheet.Dispose();
        }
Ejemplo n.º 2
0
        internal static void LoadPreTexture(IResourceCache cache, LoadStepData data)
        {
            var metadata = LoadRsiMetadata(cache, data.Path);

            var stateCount = metadata.States.Length;
            var toAtlas    = new StateReg[stateCount];

            var frameSize = metadata.Size;
            var rsi       = new RSI(frameSize, data.Path, metadata.States.Length);

            var callbackOffsets = new Dictionary <RSI.StateId, Vector2i[][]>(stateCount);

            // Check for duplicate states
            for (var i = 0; i < metadata.States.Length; i++)
            {
                var stateId = metadata.States[i].StateId;

                for (int j = i + 1; j < metadata.States.Length; j++)
                {
                    if (stateId == metadata.States[j].StateId)
                    {
                        throw new RSILoadException($"RSI '{data.Path}' has a duplicate stateId '{stateId}'.");
                    }
                }
            }

            // Do every state.
            for (var index = 0; index < metadata.States.Length; index++)
            {
                ref var reg = ref toAtlas[index];

                var stateObject = metadata.States[index];
                // Load image from disk.
                var texPath = data.Path / (stateObject.StateId + ".png");
                using (var stream = cache.ContentFileRead(texPath))
                {
                    reg.Src = Image.Load <Rgba32>(stream);
                }

                if (reg.Src.Width % frameSize.X != 0 || reg.Src.Height % frameSize.Y != 0)
                {
                    var regDims  = $"{reg.Src.Width}x{reg.Src.Height}";
                    var iconDims = $"{frameSize.X}x{frameSize.Y}";
                    throw new RSILoadException($"State '{stateObject.StateId}' image size ({regDims}) is not a multiple of the icon size ({iconDims}).");
                }

                // Load all frames into a list so we can operate on it more sanely.
                reg.TotalFrameCount = stateObject.Delays.Sum(delayList => delayList.Length);

                var(foldedDelays, foldedIndices) = FoldDelays(stateObject.Delays);

                var textures       = new Texture[foldedIndices.Length][];
                var callbackOffset = new Vector2i[foldedIndices.Length][];

                for (var i = 0; i < textures.Length; i++)
                {
                    textures[i]       = new Texture[foldedIndices[0].Length];
                    callbackOffset[i] = new Vector2i[foldedIndices[0].Length];
                }

                reg.Output  = textures;
                reg.Indices = foldedIndices;
                reg.Offsets = callbackOffset;

                var state = new RSI.State(frameSize, rsi, stateObject.StateId, stateObject.DirType, foldedDelays,
                                          textures);
                rsi.AddState(state);

                callbackOffsets[stateObject.StateId] = callbackOffset;
            }
Ejemplo n.º 3
0
 internal static void LoadTexture(IClyde clyde, LoadStepData loadStepData)
 {
     loadStepData.AtlasTexture = clyde.LoadTextureFromImage(
         loadStepData.AtlasSheet,
         loadStepData.Path.ToString());
 }