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(); }
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; }
internal static void LoadTexture(IClyde clyde, LoadStepData loadStepData) { loadStepData.AtlasTexture = clyde.LoadTextureFromImage( loadStepData.AtlasSheet, loadStepData.Path.ToString()); }