Move FileFormats folder into Internal folder

This commit is contained in:
miku-666
2024-03-29 16:35:34 +01:00
parent ef05ed1dc7
commit 8b4d4e6cf3
11 changed files with 322 additions and 161 deletions

View File

@@ -1,8 +1,10 @@
using System.IO;
using System.Diagnostics;
using System.IO;
using System.Text;
using OMI;
using OMI.Workers;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using PckStudio.Internal;
namespace PckStudio.IO.CSMB
{
@@ -15,52 +17,135 @@ namespace PckStudio.IO.CSMB
using (var fs = File.OpenRead(filename))
{
return FromStream(fs);
}
}
}
throw new FileNotFoundException(filename);
}
public CSMBFile FromStream(Stream stream)
{
CSMBFile csmbFile = new CSMBFile();
using (var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian))
using var reader = new EndiannessAwareBinaryReader(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian);
var magic = reader.ReadString(3);
if (magic != CSMBFile.HEADER_MAGIC)
{
reader.ReadInt32();
int numOfParts = reader.ReadInt32();
for (int i = 0; i < numOfParts; i++)
{
CSMBPart part = new CSMBPart();
part.Name = ReadString(reader);
part.Parent = (CSMBParentPart)reader.ReadInt32();
part.posX = reader.ReadSingle();
part.posY = reader.ReadSingle();
part.posZ = reader.ReadSingle();
part.sizeX = reader.ReadSingle();
part.sizeY = reader.ReadSingle();
part.sizeZ = reader.ReadSingle();
part.uvX = reader.ReadInt32();
part.uvY = reader.ReadInt32();
part.MirrorTexture = reader.ReadBoolean();
part.HideWArmour = reader.ReadBoolean();
part.Inflation = reader.ReadSingle();
csmbFile.Parts.Add(part);
}
int numOfOffsets = reader.ReadInt32();
for (int i = 0; i < numOfOffsets; i++)
{
CSMBOffset offset = new CSMBOffset();
offset.offsetPart = (CSMBOffsetPart)reader.ReadInt32();
offset.VerticalOffset = reader.ReadSingle();
csmbFile.Offsets.Add(offset);
}
Trace.TraceError("CSMBFileReader.FromStream - Failed to load csmb.\n\tReason: Header magic mismatch.");
return new CSMBFile(byte.MaxValue);
}
byte version = reader.ReadByte();
if (version < 1 || version > 1)
{
Trace.TraceError("CSMBFileReader.FromStream - Failed to load csmb.\n\tReason: Unsupported version.");
return new CSMBFile(byte.MaxValue);
}
var skinANIM = SkinANIM.FromValue(reader.ReadInt32());
CSMBFile csmbFile = new CSMBFile(version, skinANIM);
int numOfParts = reader.ReadInt32();
for (int i = 0; i < numOfParts; i++)
{
SkinBOX part = ReadPart(reader);
csmbFile.Parts.Add(part);
}
int numOfOffsets = reader.ReadInt32();
for (int i = 0; i < numOfOffsets; i++)
{
SkinPartOffset offset = ReadOffset(reader);
csmbFile.Offsets.Add(offset);
}
return csmbFile;
}
private string ReadString(EndiannessAwareBinaryReader reader)
private SkinBOX ReadPart(EndiannessAwareBinaryReader reader)
{
ushort strlen = reader.ReadUInt16();
return reader.ReadString(strlen);
string type = GetParentType((CSMBParentType)reader.ReadByte());
float posX = reader.ReadSingle();
float posY = reader.ReadSingle();
float posZ = reader.ReadSingle();
float sizeX = reader.ReadSingle();
float sizeY = reader.ReadSingle();
float sizeZ = reader.ReadSingle();
byte mirrorAndUvX = reader.ReadByte();
byte hideWithArmorAndUvY = reader.ReadByte();
int uvX = mirrorAndUvX & 0x7f;
int uvY = hideWithArmorAndUvY & 0x7f;
bool mirror = (mirrorAndUvX & 0x80) != 0;
bool hideWithArmor = (hideWithArmorAndUvY & 0x80) != 0;
float scale = reader.ReadSingle();
return new SkinBOX(type, new System.Numerics.Vector3(posX, posY, posZ), new System.Numerics.Vector3(sizeX, sizeY, sizeZ), new System.Numerics.Vector2(uvX, uvY), hideWithArmor, mirror, scale);
}
private SkinPartOffset ReadOffset(EndiannessAwareBinaryReader reader)
{
CSMBOffsetType type = (CSMBOffsetType)reader.ReadByte();
float value = reader.ReadSingle();
return new SkinPartOffset(GetOffsetType(type), value);
}
private static string GetParentType(CSMBParentType type)
{
switch (type)
{
case CSMBParentType.HEAD:
return "HEAD";
case CSMBParentType.BODY:
return "BODY";
case CSMBParentType.ARM0:
return "ARM0";
case CSMBParentType.ARM1:
return "ARM1";
case CSMBParentType.LEG0:
return "LEG0";
case CSMBParentType.LEG1:
return "LEG1";
default:
throw new InvalidDataException(type.ToString());
}
}
private static string GetOffsetType(CSMBOffsetType type)
{
switch (type)
{
case CSMBOffsetType.HEAD:
return "HEAD";
case CSMBOffsetType.BODY:
return "BODY";
case CSMBOffsetType.ARM0:
return "ARM0";
case CSMBOffsetType.ARM1:
return "ARM1";
case CSMBOffsetType.LEG0:
return "LEG0";
case CSMBOffsetType.LEG1:
return "LEG1";
case CSMBOffsetType.TOOL0:
return "TOOL0";
case CSMBOffsetType.TOOL1:
return "TOOL1";
case CSMBOffsetType.HELMET:
return "HELMET";
case CSMBOffsetType.SHOULDER0:
return "SHOULDER0";
case CSMBOffsetType.SHOULDER1:
return "SHOULDER1";
case CSMBOffsetType.CHEST:
return "CHEST";
case CSMBOffsetType.WAIST:
return "WAIST";
case CSMBOffsetType.PANTS0:
return "PANTS0";
case CSMBOffsetType.PANTS1:
return "PANTS1";
case CSMBOffsetType.BOOT0:
return "BOOT0";
case CSMBOffsetType.BOOT1:
return "BOOT1";
default:
throw new InvalidDataException(type.ToString());
}
}
object IDataFormatReader.FromStream(Stream stream) => FromStream(stream);

View File

@@ -1,8 +1,11 @@
using System.IO;
using System.Text;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using OMI.Workers;
using OMI;
using PckStudio.Internal;
using System;
using OpenTK;
namespace PckStudio.IO.CSMB
{
@@ -27,32 +30,105 @@ namespace PckStudio.IO.CSMB
{
using (var writer = new EndiannessAwareBinaryWriter(stream, Encoding.ASCII, leaveOpen: true, Endianness.LittleEndian))
{
writer.Write(0);
writer.Write(CSMBFile.HEADER_MAGIC);
writer.Write(_CSMB.Version);
writer.Write(_CSMB.SkinANIM.ToValue());
writer.Write(_CSMB.Parts.Count);
foreach (CSMBPart part in _CSMB.Parts)
foreach (SkinBOX part in _CSMB.Parts)
{
writer.Write((short)part.Name.Length);
writer.WriteString(part.Name);
writer.Write((int)part.Parent);
writer.Write(part.posX);
writer.Write(part.posY);
writer.Write(part.posZ);
writer.Write(part.sizeX);
writer.Write(part.sizeY);
writer.Write(part.sizeZ);
writer.Write(part.uvX);
writer.Write(part.uvY);
writer.Write(part.MirrorTexture);
writer.Write(part.HideWArmour);
writer.Write(part.Inflation);
WritePart(writer, part);
}
writer.Write(_CSMB.Offsets.Count);
foreach (CSMBOffset offset in _CSMB.Offsets)
foreach (SkinPartOffset offset in _CSMB.Offsets)
{
writer.Write((int)offset.offsetPart);
writer.Write(offset.VerticalOffset);
writer.Write((byte)GetOffsetPart(offset.Type));
writer.Write(offset.Value);
}
}
}
private void WritePart(EndiannessAwareBinaryWriter writer, SkinBOX part)
{
writer.Write((byte)GetParentPart(part.Type));
writer.Write(part.Pos.X);
writer.Write(part.Pos.Y);
writer.Write(part.Pos.Z);
writer.Write(part.Size.X);
writer.Write(part.Size.Y);
writer.Write(part.Size.Z);
byte uvX = (byte)MathHelper.Clamp((int)part.UV.X, 0, 64);
byte uvY = (byte)MathHelper.Clamp((int)part.UV.Y, 0, 64);
byte mirrorAndUvX = (byte)(Convert.ToByte(part.Mirror) << 7 | uvX);
byte hideWithArmorAndUvY = (byte)(Convert.ToByte(part.HideWithArmor) << 7 | uvY);
writer.Write(mirrorAndUvX);
writer.Write(hideWithArmorAndUvY);
writer.Write(part.Scale);
}
private static CSMBParentType GetParentPart(string type)
{
switch (type)
{
case "HEAD":
return CSMBParentType.HEAD;
case "BODY":
return CSMBParentType.BODY;
case "ARM0":
return CSMBParentType.ARM0;
case "ARM1":
return CSMBParentType.ARM1;
case "LEG0":
return CSMBParentType.LEG0;
case "LEG1":
return CSMBParentType.LEG1;
default:
throw new InvalidDataException(type);
}
}
private static CSMBOffsetType GetOffsetPart(string type)
{
switch (type)
{
case "HEAD":
return CSMBOffsetType.HEAD;
case "BODY":
return CSMBOffsetType.BODY;
case "ARM0":
return CSMBOffsetType.ARM0;
case "ARM1":
return CSMBOffsetType.ARM1;
case "LEG0":
return CSMBOffsetType.LEG0;
case "LEG1":
return CSMBOffsetType.LEG1;
case "TOOL0":
return CSMBOffsetType.TOOL0;
case "TOOL1":
return CSMBOffsetType.TOOL1;
case "HELMET":
return CSMBOffsetType.HELMET;
case "SHOULDER0":
return CSMBOffsetType.SHOULDER0;
case "SHOULDER1":
return CSMBOffsetType.SHOULDER1;
case "CHEST":
return CSMBOffsetType.CHEST;
case "WAIST":
return CSMBOffsetType.WAIST;
case "PANTS0":
return CSMBOffsetType.PANTS0;
case "PANTS1":
return CSMBOffsetType.PANTS1;
case "BOOT0":
return CSMBOffsetType.BOOT0;
case "BOOT1":
return CSMBOffsetType.BOOT1;
default:
throw new InvalidDataException(type);
}
}
}
}

View File

@@ -1,6 +1,6 @@
using OMI;
using OMI.Workers;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using System;
using System.Collections.Generic;
using System.Diagnostics;

View File

@@ -1,6 +1,6 @@
using OMI;
using OMI.Workers;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using System.Collections.Generic;
using System.IO;
using System.Text;

View File

@@ -1,92 +0,0 @@
using System;
using System.Drawing;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PckStudio.FileFormats
{
#region File Structure
/*
Version - 4 bytes[int32]
NumberOfParts - 4 bytes[int32]
{
Part name length - 2 bytes[int16]
part name - x bytes
part parent - 4 bytes[int32] (HEAD=1, BODY=2, LEG0=3, LEG1=4, ARM0=5, ARM1=6)
Position-X - 4 bytes[float]
Position-Y - 4 bytes[float]
Position-Z - 4 bytes[float]
Size-X - 4 bytes[float]
Size-Y - 4 bytes[float]
Size-Z - 4 bytes[float]
UV-Y - 4 bytes[int32]
UV-X - 4 bytes[int32]
mirror texture - 1 byte[bool]
Hide with armour - 1 byte[bool]
inflation/scale value - 4 bytes[float]
}
NumberOfOffsets - 4 bytes[int32]
{
offset part - 4 bytes[int32]
vertical offset - 4 bytes[float]
}
*/
#endregion
class CSMBFile
{
public List<CSMBPart> Parts = new List<CSMBPart>();
public List<CSMBOffset> Offsets = new List<CSMBOffset>();
}
public class CSMBPart
{
public string Name = "Partname";
public CSMBParentPart Parent = 0;
public float posX, posY, posZ = 0.0f;
public float sizeX, sizeY, sizeZ = 0.0f;
public int uvX, uvY = 0;
public bool HideWArmour, MirrorTexture = false;
public float Inflation = 0.0f;
}
public class CSMBOffset
{
public CSMBOffsetPart offsetPart = 0;
public float VerticalOffset = 0.0f;
}
public enum CSMBOffsetType : byte
{
HEAD = 0,
BODY = 1,
ARM0 = 2,
ARM1 = 3,
LEG0 = 4,
LEG1 = 5,
TOOL0 = 6,
TOOL1 = 7,
HELMET = 8,
SHOULDER0 = 9,
SHOULDER1 = 10,
CHEST = 11,
WAIST = 12,
PANTS0 = 13,
PANTS1 = 14,
BOOT0 = 15,
BOOT1 = 16,
}
public enum CSMBParentPart
{
HEAD = 0,
BODY = 1,
ARM0 = 2,
ARM1 = 3,
LEG0 = 4,
LEG1 = 5,
}
}

View File

@@ -13,12 +13,12 @@ using NAudio.Wave;
using OMI.Formats.Pck;
using PckStudio.FileFormats;
using PckStudio.IO.PckAudio;
using PckStudio.Forms.Additional_Popups;
using PckStudio.Properties;
using PckStudio.API.Miles;
using PckStudio.Internal;
using PckStudio.Internal.FileFormats;
using PckStudio.Extensions;
// Audio Editor by MattNL and Miku-666

View File

@@ -10,7 +10,7 @@ using MetroFramework.Forms;
using PckStudio.Internal;
using PckStudio.Extensions;
using PckStudio.IO.CSMB;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using System.Linq;
using PckStudio.Forms.Additional_Popups;

View File

@@ -0,0 +1,97 @@
using System;
using System.Drawing;
using System.IO;
using System.Collections.Generic;
using System.Linq;
namespace PckStudio.Internal.FileFormats
{
#region File Structure
/*
Magic - 8 bytes[uint64]
Version - 1 byte [u8]
Anim - 4 bytes[int32]
NumberOfParts - 4 bytes[int32]
{
part parent - 1 byte (HEAD=0, BODY=1, LEG0=2, LEG1=3, ARM0=4, ARM1=5)
Position-X - 4 bytes (float32)
Position-Y - 4 bytes (float32)
Position-Z - 4 bytes (float32)
Size-X - 4 bytes (float32)
Size-Y - 4 bytes (float32)
Size-Z - 4 bytes (float32)
MirrorAndUvX - 1 bit flag 7 bits uv.x value(0-64) (s8)
HideWithArmorAndUvY - 1 bit flag 7 bits uv.y value(0-64) (s8)
inflation/scale value - 4 bytes (float32)
}
NumberOfOffsets - 4 bytes[int32]
{
offset part - 1 byte
vertical offset - 4 bytes[float]
}
*/
#endregion
class CSMBFile
{
internal static readonly string HEADER_MAGIC = "psm";
public readonly byte Version;
internal CSMBFile(byte version)
{
Version = version;
}
internal CSMBFile(byte version, SkinANIM skinANIM)
: this(version)
{
SkinANIM = skinANIM;
}
public SkinANIM SkinANIM { get; private set; }
public readonly List<SkinBOX> Parts = new List<SkinBOX>();
public readonly List<SkinPartOffset> Offsets = new List<SkinPartOffset>();
public static CSMBFile FromSkin(Skin skin)
{
var csmb = new CSMBFile(1);
csmb.SkinANIM = skin.ANIM;
csmb.Parts.AddRange(skin.AdditionalBoxes);
csmb.Offsets.AddRange(skin.PartOffsets);
return csmb;
}
}
public enum CSMBOffsetType : byte
{
HEAD = 0,
BODY = 1,
ARM0 = 2,
ARM1 = 3,
LEG0 = 4,
LEG1 = 5,
TOOL0 = 6,
TOOL1 = 7,
HELMET = 8,
SHOULDER0 = 9,
SHOULDER1 = 10,
CHEST = 11,
WAIST = 12,
PANTS0 = 13,
PANTS1 = 14,
BOOT0 = 15,
BOOT1 = 16,
}
public enum CSMBParentType : byte
{
HEAD = 0,
BODY = 1,
ARM0 = 2,
ARM1 = 3,
LEG0 = 4,
LEG1 = 5,
}
}

View File

@@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OMI.Formats.Languages;
namespace PckStudio.FileFormats
namespace PckStudio.Internal.FileFormats
{
public class PckAudioFile
{

View File

@@ -7,16 +7,14 @@ using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Diagnostics;
using System.Drawing.Imaging;
using OMI.Formats.Archive;
using OMI.Formats.Pck;
using OMI.Formats.GameRule;
using OMI.Formats.Languages;
using OMI.Workers.Archive;
using OMI.Workers.Pck;
using OMI.Workers.GameRule;
using OMI.Workers.Language;
using PckStudio.Properties;
using PckStudio.FileFormats;
using PckStudio.Internal.FileFormats;
using PckStudio.Forms;
using PckStudio.Forms.Editor;
using PckStudio.Forms.Additional_Popups.Animation;
@@ -30,7 +28,6 @@ using PckStudio.Extensions;
using PckStudio.Popups;
using PckStudio.Classes.Utils;
using PckStudio.Helper;
using PCKStudio_Updater;
namespace PckStudio
{

View File

@@ -233,8 +233,8 @@
<Compile Include="Extensions\ColorExtensions.cs" />
<Compile Include="Extensions\EnumerableExtensions.cs" />
<Compile Include="Extensions\GraphicsExtensions.cs" />
<Compile Include="FileFormats\CSMBFile.cs" />
<Compile Include="FileFormats\PckAudioFile.cs" />
<Compile Include="Internal\FileFormats\CSMBFile.cs" />
<Compile Include="Internal\FileFormats\PckAudioFile.cs" />
<Compile Include="Classes\API\Miles\Binka.cs" />
<Compile Include="Classes\IO\3DST\3DSTextureReader.cs" />
<Compile Include="Classes\IO\3DST\3DSTextureWriter.cs" />