diff --git a/ZXBStudio/DocumentEditors/ZXGraphics/SelectExportTypeControl.axaml.cs b/ZXBStudio/DocumentEditors/ZXGraphics/SelectExportTypeControl.axaml.cs index 5b92408..aca2dab 100644 --- a/ZXBStudio/DocumentEditors/ZXGraphics/SelectExportTypeControl.axaml.cs +++ b/ZXBStudio/DocumentEditors/ZXGraphics/SelectExportTypeControl.axaml.cs @@ -56,6 +56,13 @@ public bool InitializeSprite() Image = "/Svg/Seal.svg", Name = "PutChars" }); + ExportTypesList.Add(new ExportTypeDescrioptionItem() + { + Description = "Conrado Badenas MaskedSprites library.", + ExportType = ExportTypes.MaskedSprites, + Image = "/Svg/Mask.svg", + Name = "MaskedSprites" + }); /* ExportTypesList.Add(new ExportTypeDescrioptionItem() { @@ -73,7 +80,6 @@ public bool InitializeSprite() }); */ lstOptions.ItemsSource = ExportTypesList; - lstOptions.SelectionChanged += LstOptions_SelectionChanged; return true; diff --git a/ZXBStudio/DocumentEditors/ZXGraphics/SpriteExportDialog.axaml.cs b/ZXBStudio/DocumentEditors/ZXGraphics/SpriteExportDialog.axaml.cs index 70ce1f8..6dfce7c 100644 --- a/ZXBStudio/DocumentEditors/ZXGraphics/SpriteExportDialog.axaml.cs +++ b/ZXBStudio/DocumentEditors/ZXGraphics/SpriteExportDialog.axaml.cs @@ -119,6 +119,13 @@ private void Refresh() CreateExample_PutChars(); } break; + case ExportTypes.MaskedSprites: + CreateExportPath(".bas"); + if (canExport) + { + CreateExample_MaskedSprites(); + } + break; default: grdOptions.IsVisible = false; break; @@ -264,6 +271,143 @@ private void CreateExample_PutChars() txtCode.Text = sb.ToString(); } + + private void CreateExample_MaskedSprites() + { + if (sprites == null || sprites.Count() == 0) + { + txtCode.Text = ""; + } + + var sb = new StringBuilder(); + switch (exportConfig.ExportDataType) + { + case ExportDataTypes.DIM: + { + var sprite = sprites.ElementAt(0); + sb.AppendLine("'- Includes -----------------------------------------------"); + sb.AppendLine("#INCLUDE "); + sb.AppendLine("#INCLUDE \"maskedsprites.bas\""); + sb.AppendLine(""); + sb.AppendLine("'- Sprites definition -------------------------------------"); + sb.AppendLine(string.Format("' Can use: #INCLUDE \"{0}\"", + Path.GetFileName(exportConfig.ExportFilePath))); + sb.AppendLine(ExportManager.Export_Sprite_MaskedSprites(exportConfig, sprites)); + sb.AppendLine("' - Init vars ---------------------------------------------"); + sb.AppendLine("#define NumberofMaskedSprites 1"); + sb.AppendLine("DIM sprDir, sprBackDir AS UInteger"); + sb.AppendLine(""); + sb.AppendLine("'- Initialise the sprite engine ---------------------------"); + sb.AppendLine("InitMaskedSpritesFileSystem()"); + sb.AppendLine("' Create sprite"); + sb.AppendLine($"sprDir = RegisterSpriteImageInMSFS(@{exportConfig.LabelName}{sprite.Name.Replace(" ", "_")}(0))"); + sb.AppendLine("' Save background for first time"); + sb.AppendLine("sprBackDir = MaskedSpritesBackground(0)"); + sb.AppendLine(""); + sb.AppendLine("'- Draw sprite --------------------------------------------"); + sb.AppendLine("DIM n AS UByte"); + sb.AppendLine("DO"); + sb.AppendLine(" ' Sync with raytrace"); + sb.AppendLine(" waitretrace"); + sb.AppendLine(" ' Restore background"); + sb.AppendLine(" RestoreBackground(100,52,sprBackDir)"); + sb.AppendLine(" "); + sb.AppendLine(" ' Print a number"); + sb.AppendLine(" PRINT AT 7,12;n;"); + sb.AppendLine(" n = n + 1"); + sb.AppendLine(" ' Draw sprite"); + sb.AppendLine(" SaveBackgroundAndDrawSpriteRegisteredInMSFS(100,52,sprBackDir,sprDir) "); + sb.AppendLine("LOOP"); + sb.AppendLine(""); + } + break; + + case ExportDataTypes.ASM: + { + var sprite = sprites.ElementAt(0); + sb.AppendLine("'- Includes -----------------------------------------------"); + sb.AppendLine("#INCLUDE "); + sb.AppendLine("#INCLUDE \"maskedsprites.bas\""); + sb.AppendLine(""); + sb.AppendLine("' - Init vars ---------------------------------------------"); + sb.AppendLine("#define NumberofMaskedSprites 1"); + sb.AppendLine("DIM sprDir, sprBackDir AS UInteger"); + sb.AppendLine(""); + sb.AppendLine("'- Initialise the sprite engine ---------------------------"); + sb.AppendLine("InitMaskedSpritesFileSystem()"); + sb.AppendLine("' Create sprite"); + sb.AppendLine($"sprDir = RegisterSpriteImageInMSFS(@{exportConfig.LabelName}_{sprite.Name.Replace(" ", "_")})"); + sb.AppendLine("' Save background for first time"); + sb.AppendLine("sprBackDir = MaskedSpritesBackground(0)"); + sb.AppendLine(""); + sb.AppendLine("'- Draw sprite --------------------------------------------"); + sb.AppendLine("DIM n AS UByte"); + sb.AppendLine("DO"); + sb.AppendLine(" ' Sync with raytrace"); + sb.AppendLine(" waitretrace"); + sb.AppendLine(" ' Restore background"); + sb.AppendLine(" RestoreBackground(100,52,sprBackDir)"); + sb.AppendLine(" "); + sb.AppendLine(" ' Print a number"); + sb.AppendLine(" PRINT AT 7,12;n;"); + sb.AppendLine(" n = n + 1"); + sb.AppendLine(" ' Draw sprite"); + sb.AppendLine(" SaveBackgroundAndDrawSpriteRegisteredInMSFS(100,52,sprBackDir,sprDir) "); + sb.AppendLine("LOOP"); + sb.AppendLine(""); + sb.AppendLine("' - This section must not be executed --------------------"); + sb.AppendLine(string.Format("' Can use: #INCLUDE \"{0}\"", + Path.GetFileName(exportConfig.ExportFilePath))); + sb.AppendLine(ExportManager.Export_Sprite_MaskedSprites(exportConfig, sprites)); + } + break; + + case ExportDataTypes.BIN: + { + sb.AppendLine("'- Includes -----------------------------------------------"); + sb.AppendLine("#INCLUDE "); + sb.AppendLine(""); + sb.AppendLine("'- Draw sprite --------------------------------------------"); + var sprite = sprites.ElementAt(0); + sb.AppendLine(string.Format( + "putChars(10,5,{0},{1},@{2})", + sprite.Width / 8, + sprite.Height / 8, + exportConfig.LabelName)); + sb.AppendLine(""); + sb.AppendLine("' This section must not be executed"); + sb.AppendLine(string.Format( + "{0}:", + exportConfig.LabelName)); + sb.AppendLine("ASM"); + sb.AppendLine(string.Format("\tINCBIN \"{0}\"", + Path.GetFileName(exportConfig.ExportFilePath))); + sb.AppendLine("END ASM"); + } + break; + + case ExportDataTypes.TAP: + { + sb.AppendLine("'- Includes -----------------------------------------------"); + sb.AppendLine("#INCLUDE "); + sb.AppendLine(""); + sb.AppendLine("' Load .tap data ------------------------------------------"); + sb.AppendLine("LOAD \"\" CODE"); + sb.AppendLine(""); + sb.AppendLine("'- Draw sprite --------------------------------------------"); + var sprite = sprites.ElementAt(0); + sb.AppendLine(string.Format( + "putChars(10,5,{0},{1},@{2})", + sprite.Width / 8, + sprite.Height / 8, + exportConfig.LabelName)); + sb.AppendLine(""); + } + break; + } + + txtCode.Text = sb.ToString(); + } #endregion diff --git a/ZXBStudio/DocumentEditors/ZXGraphics/log/ExportManager.cs b/ZXBStudio/DocumentEditors/ZXGraphics/log/ExportManager.cs index 45aa1b0..69700ec 100644 --- a/ZXBStudio/DocumentEditors/ZXGraphics/log/ExportManager.cs +++ b/ZXBStudio/DocumentEditors/ZXGraphics/log/ExportManager.cs @@ -9,6 +9,7 @@ using ZXBasicStudio.BuildSystem; using ZXBasicStudio.Classes; using ZXBasicStudio.Common; +using ZXBasicStudio.Common.TAPTools; using ZXBasicStudio.DocumentEditors.ZXGraphics.neg; using ZXBasicStudio.DocumentModel.Enums; using ZXBasicStudio.DocumentModel.Interfaces; @@ -439,6 +440,10 @@ public bool ExportSprites(ExportConfig exportConfig, IEnumerable sprites exportedData = Export_Sprite_PutChars(exportConfig, sprites); createTextFile = true; break; + case ExportTypes.MaskedSprites: + exportedData = Export_Sprite_MaskedSprites(exportConfig, sprites); + createTextFile = true; + break; default: return true; } @@ -458,6 +463,8 @@ public bool ExportSprites(ExportConfig exportConfig, IEnumerable sprites } + #region PutChars + /// /// Generate the export data for PutChars Sprites /// @@ -483,6 +490,7 @@ public static string Export_Sprite_PutChars(ExportConfig exportConfig, IEnumerab #region DIM + public static string Export_Sprite_PutChars_DIM(ExportConfig exportConfig, IEnumerable sprites) { int min = 0; @@ -1024,7 +1032,7 @@ public static string Export_Sprite_PutChars_TAP(ExportConfig exportConfig, IEnum private static byte[] Export_Sprite_PutChars_GetBinaryData(IEnumerable sprites) { - var binData=new List(); + var binData = new List(); foreach (var sprite in sprites) { @@ -1043,6 +1051,266 @@ private static byte[] Export_Sprite_PutChars_GetBinaryData(IEnumerable s #endregion + + #endregion + + + #region MaskedSprites + + /// + /// Generate the export data for Masked Sprites + /// + /// ExportConfig information + /// Sprites to convert + /// string with the conversion commands for the export dialog samble textbox + public static string Export_Sprite_MaskedSprites(ExportConfig exportConfig, IEnumerable sprites) + { + switch (exportConfig.ExportDataType) + { + case ExportDataTypes.DIM: + return Export_Sprite_MaskedSprites_DIM(exportConfig, sprites); + case ExportDataTypes.ASM: + return Export_Sprite_MaskedSprites_ASM(exportConfig, sprites); + case ExportDataTypes.BIN: + return Export_Sprite_MaskedSprites_BIN(exportConfig, sprites); + case ExportDataTypes.TAP: + return Export_Sprite_MaskedSprites_TAP(exportConfig, sprites); + default: + return "ERROR: Not implemented!"; + } + } + + + private static byte[] Export_Sprite_MaskedSprites_GenerateData(ExportConfig exportConfig, Sprite sprite) + { + try + { + var lst = new List(); + for (int n = 0; n < sprite.Frames; n += 2) + { + var data = ServiceLayer.Files_CreateBinDataUpDown(sprite.Patterns[n], sprite.Width, sprite.Height); + var mask = ServiceLayer.Files_CreateBinDataUpDown(sprite.Patterns[n + 1], sprite.Width, sprite.Height); + for (int row = 0; row < 16; row++) + { + for (int col = 0; col < 2; col++) + { + int i = row; + if (col == 1) + { + i += 16; + } + lst.Add(mask[i]); + lst.Add(data[i]); + } + } + } + return lst.ToArray(); + } + catch (Exception ex) + { + return null; + } + } + + + #region DIM + + + public static string Export_Sprite_MaskedSprites_DIM(ExportConfig exportConfig, IEnumerable sprites) + { + var sb = new StringBuilder(); + sb.AppendLine("'- Sprite definitions --------------------------------------"); + + // All sprites + foreach (var sprite in sprites) + { + if (sprite == null || !sprite.Export) + { + continue; + } + + if (sprite.Frames == 0) + { + continue; + } + + // Header + if (sprite.Frames == 2) + { + sb.AppendLine( + $"DIM {exportConfig.LabelName}{sprite.Name.Replace(" ", "_")}(63) AS UByte => {{ _"); + } + else + { + sb.AppendLine( + $"DIM {exportConfig.LabelName}{sprite.Name.Replace(" ", "_")}({(sprite.Frames/2)-1},63) AS UByte => {{ _"); + } + var rawData = Export_Sprite_MaskedSprites_GenerateData(exportConfig, sprite); + int i = 0; + for (int idFrame = 0; idFrame < sprite.Frames; idFrame += 2) + { + if (sprite.Frames != 2) + { + sb.AppendLine("\t{ _"); + } + for (int n = 0; n < 63; n += 4) + { + sb.Append("\t"); + if (sprite.Frames != 2) + { + sb.Append("\t"); + } + for (int m = 0; m < 4; m++) + { + var b = Convert.ToString(rawData[i++], 2).PadLeft(8, '0'); + sb.Append($"%{b}"); + if (m < 3) + { + sb.Append(","); + } + } + if (n >= 59) + { + sb.AppendLine(" _"); + } + else + { + sb.AppendLine(", _"); + } + } + if (sprite.Frames != 2) + { + if (idFrame >= sprite.Frames - 2) + { + sb.AppendLine("\t} _"); + } + else + { + sb.AppendLine("\t}, _"); + } + } + } + sb.AppendLine("}"); + sb.AppendLine(""); + } + + return sb.ToString(); + } + + #endregion + + + #region ASM + + public static string Export_Sprite_MaskedSprites_ASM(ExportConfig exportConfig, IEnumerable sprites) + { + var sb = new StringBuilder(); + sb.AppendLine("'- Sprite definitions --------------------------------------"); + + // All sprites + foreach (var sprite in sprites) + { + if (sprite == null || !sprite.Export) + { + continue; + } + + if (sprite.Frames == 0) + { + continue; + } + + // Header + sb.AppendLine(string.Format( + "{0}{1}:", + exportConfig.LabelName, + sprite.Name.Replace(" ", "_"))); + sb.AppendLine("ASM"); + + var rawData = Export_Sprite_MaskedSprites_GenerateData(exportConfig, sprite); + int i = 0; + for (int idFrame = 0; idFrame < sprite.Frames; idFrame += 2) + { + if (idFrame > 0) + { + sb.AppendLine(""); + } + for (int n = 0; n < 63; n += 4) + { + sb.Append("\tDB "); + for (int m = 0; m < 4; m++) + { + var b = Convert.ToString(rawData[i++], 2).PadLeft(8, '0'); + sb.Append($"%{b}"); + if (m < 3) + { + sb.Append(","); + } + } + sb.AppendLine(""); + } + } + sb.AppendLine("END ASM"); + sb.AppendLine(""); + } + + return sb.ToString(); + } + + #endregion + + + #region TAP and BIN + + + public static string Export_Sprite_MaskedSprites_BIN(ExportConfig exportConfig, IEnumerable sprites) + { + var binData = new List(); + foreach (var sprite in sprites) + { + if (sprite == null || !sprite.Export) + { + continue; + } + if (sprite.Frames == 0) + { + continue; + } + var data = Export_Sprite_MaskedSprites_GenerateData(exportConfig, sprite); + binData.AddRange(data); + } + ServiceLayer.Files_SaveFileData(exportConfig.ExportFilePath, binData.ToArray()); + return ""; + } + + + public static string Export_Sprite_MaskedSprites_TAP(ExportConfig exportConfig, IEnumerable sprites) + { + var binData = new List(); + foreach (var sprite in sprites) + { + if (sprite == null || !sprite.Export) + { + continue; + } + if (sprite.Frames == 0) + { + continue; + } + var data = Export_Sprite_MaskedSprites_GenerateData(exportConfig, sprite); + binData.AddRange(data); + } + var tapData = ServiceLayer.Bin2Tap(exportConfig.ZXFileName, exportConfig.ZXAddress, binData.ToArray()); + ServiceLayer.Files_SaveFileData(exportConfig.ExportFilePath, tapData); + return ""; + } + + + #endregion + + #endregion + + #endregion } } diff --git a/ZXBStudio/DocumentEditors/ZXGraphics/log/ServiceLayer.cs b/ZXBStudio/DocumentEditors/ZXGraphics/log/ServiceLayer.cs index 2694d88..da4a606 100644 --- a/ZXBStudio/DocumentEditors/ZXGraphics/log/ServiceLayer.cs +++ b/ZXBStudio/DocumentEditors/ZXGraphics/log/ServiceLayer.cs @@ -241,7 +241,7 @@ public static byte[] Files_CreateBinData_GDUorFont(FileTypeConfig fileType, IEnu /// - /// Creates the binary data for a file of type sprite or tile de arriba hacia abajo + /// Creates the binary data for a file of type sprite or tile from up to down /// /// File information /// Sprite or tile data diff --git a/ZXBStudio/DocumentEditors/ZXGraphics/neg/ExportTypes.cs b/ZXBStudio/DocumentEditors/ZXGraphics/neg/ExportTypes.cs index b2d9ca0..b08d00b 100644 --- a/ZXBStudio/DocumentEditors/ZXGraphics/neg/ExportTypes.cs +++ b/ZXBStudio/DocumentEditors/ZXGraphics/neg/ExportTypes.cs @@ -22,6 +22,7 @@ public enum ExportTypes // Sprites PutChars, + MaskedSprites, GUSprite, FourSprites } diff --git a/ZXBStudio/ZXBasicStudio.csproj b/ZXBStudio/ZXBasicStudio.csproj index e2235c5..7abf409 100644 --- a/ZXBStudio/ZXBasicStudio.csproj +++ b/ZXBStudio/ZXBasicStudio.csproj @@ -13,7 +13,7 @@ ZX Basic Studio False - 1.8.0.2 + 1.8.0.3 diff --git a/ZXBStudio/version.txt b/ZXBStudio/version.txt index f43c0d5..782251b 100644 --- a/ZXBStudio/version.txt +++ b/ZXBStudio/version.txt @@ -1 +1 @@ -1.8.0.2 \ No newline at end of file +1.8.0.3 \ No newline at end of file