e4722ed1af
General - Always allow multiple instances of the tool by default. (UseSingleInstance in config.XML) - Yaz0 now uses a new library using c code. This improves compression times and is comparable to wzst's yaz0 compressor. Thanks to AboodXD for helping port the code. - Add flat buffer templates for gfbmdl and gfbanm. - Redid UV editor. Now using new 2D engine with some improvements. Should work better with mutliple file formats than just bfres. - Auto compress bfres with .sbfres extension. BFLYT: -Add animation reference list to panes if they have any animations. - Note the animation editor in it is not functional yet. GFBMDL - Progress on model importing. Currently crashes on many tests so saving is currently disabled till i figure out why. - Add new texture map display with UV coordinates shown. Displays how transforms are handled. - Add option to export materials and models entirely as .json files. DAE - improve bone/joint check.
179 lines
5.0 KiB
C#
179 lines
5.0 KiB
C#
using Syroot.BinaryData;
|
|
using System.IO;
|
|
using System.Text;
|
|
|
|
namespace Toolbox.Library.IO
|
|
{
|
|
public class FileWriter : BinaryDataWriter
|
|
{
|
|
public void CheckByteOrderMark(uint ByteOrderMark)
|
|
{
|
|
if (ByteOrderMark == 0xFEFF)
|
|
ByteOrder = ByteOrder.BigEndian;
|
|
else
|
|
ByteOrder = ByteOrder.LittleEndian;
|
|
}
|
|
|
|
public FileWriter(Stream stream, bool leaveOpen = false)
|
|
: base(stream, Encoding.ASCII, leaveOpen)
|
|
{
|
|
}
|
|
|
|
public FileWriter(string fileName)
|
|
: this(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Read))
|
|
{
|
|
}
|
|
|
|
public FileWriter(byte[] data)
|
|
: this(new MemoryStream(data))
|
|
{
|
|
}
|
|
|
|
public void WriteHalfFloat(float v) {
|
|
Write((Syroot.IOExtension.Half)v);
|
|
}
|
|
|
|
public void Write(Syroot.IOExtension.Half v) {
|
|
Write(v.Raw);
|
|
}
|
|
|
|
public void Write(Syroot.Maths.Vector2F v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
}
|
|
|
|
public void Write(Syroot.Maths.Vector3F v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
Write(v.Z);
|
|
}
|
|
|
|
public void Write(Syroot.Maths.Vector4F v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
Write(v.Z);
|
|
Write(v.W);
|
|
}
|
|
|
|
public void Write(STColor color) {
|
|
Write(color.ToBytes());
|
|
}
|
|
|
|
public void Write(STColor8 color) {
|
|
Write(color.ToBytes());
|
|
}
|
|
|
|
public void Write(STColor8[] colors)
|
|
{
|
|
foreach (var color in colors)
|
|
Write(color.ToBytes());
|
|
}
|
|
|
|
public void WriteStruct<T>(T item) => Write(item.StructToBytes(ByteOrder == ByteOrder.BigEndian));
|
|
|
|
public void WriteSignature(string value)
|
|
{
|
|
Write(Encoding.ASCII.GetBytes(value));
|
|
}
|
|
|
|
public void WriteString(string value, Encoding encoding = null)
|
|
{
|
|
Write(value, BinaryStringFormat.ZeroTerminated, encoding ?? Encoding);
|
|
}
|
|
|
|
public void WriteUint64Offset(long target)
|
|
{
|
|
long pos = Position;
|
|
using (TemporarySeek(target, SeekOrigin.Begin))
|
|
{
|
|
Write(pos);
|
|
}
|
|
}
|
|
|
|
public void SetByteOrder(bool IsBigEndian)
|
|
{
|
|
if (IsBigEndian)
|
|
ByteOrder = ByteOrder.BigEndian;
|
|
else
|
|
ByteOrder = ByteOrder.LittleEndian;
|
|
}
|
|
|
|
public void WriteString(string text, uint fixedSize, Encoding encoding = null)
|
|
{
|
|
long pos = Position;
|
|
WriteString(text, encoding);
|
|
SeekBegin(pos + fixedSize);
|
|
}
|
|
|
|
public void Write(object value, long pos)
|
|
{
|
|
using (TemporarySeek(pos, SeekOrigin.Begin)) {
|
|
if (value is uint) Write((uint)value);
|
|
else if (value is int) Write((int)value);
|
|
else if (value is long) Write((long)value);
|
|
else if (value is ulong) Write((ulong)value);
|
|
else if (value is ushort) Write((ushort)value);
|
|
else if (value is short) Write((short)value);
|
|
else if (value is sbyte) Write((sbyte)value);
|
|
else if (value is byte) Write((byte)value);
|
|
}
|
|
}
|
|
|
|
//Writes the total size of a section as a uint.
|
|
public void WriteSectionSizeU32(long position, long startPosition, long endPosition)
|
|
{
|
|
using (TemporarySeek(position, System.IO.SeekOrigin.Begin))
|
|
{
|
|
Write((uint)(endPosition - startPosition));
|
|
}
|
|
}
|
|
|
|
//
|
|
// RelativeOffsetPosition controls the relative position the offset starts at
|
|
//
|
|
public void WriteUint32Offset(long target, long relativePosition = 0)
|
|
{
|
|
long pos = Position;
|
|
using (TemporarySeek(target, SeekOrigin.Begin))
|
|
{
|
|
Write((uint)(pos - relativePosition));
|
|
}
|
|
}
|
|
|
|
public void WriteUint16Offset(long target, long relativePosition)
|
|
{
|
|
long pos = Position;
|
|
using (TemporarySeek(target, SeekOrigin.Begin))
|
|
{
|
|
Write((ushort)(pos - relativePosition));
|
|
}
|
|
}
|
|
|
|
public void SeekBegin(uint Offset) { Seek(Offset, SeekOrigin.Begin); }
|
|
public void SeekBegin(int Offset) { Seek(Offset, SeekOrigin.Begin); }
|
|
public void SeekBegin(long Offset) { Seek(Offset, SeekOrigin.Begin); }
|
|
|
|
public void Write(OpenTK.Vector2 v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
}
|
|
public void Write(OpenTK.Vector3 v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
Write(v.Z);
|
|
}
|
|
public void Write(OpenTK.Vector4 v)
|
|
{
|
|
Write(v.X);
|
|
Write(v.Y);
|
|
Write(v.Z);
|
|
Write(v.W);
|
|
}
|
|
}
|
|
}
|