1
0
mirror of synced 2024-12-03 19:47:29 +01:00
Switch-Toolbox/Switch_Toolbox_Library/IO/FileWriter.cs
KillzXGaming 9c3ac9ae9f Improve DAE exporting.
A brand new DAE exporter is now used built off the one used by Ploaj and Crossmod devs. This replaces the old assimp exporter which was very buggy.
The DAE exporter has many improvments such as multiple materials per mesh, node tree fixes, material improvements, and lots more.
Single binded bfres (only using a bone index) will now be rigged if exported as DAE.
More progress on CMB saving. It's almost done, still needs some adjustments.
Fixed GFMDL rigging on certain models (thanks to RTB's script to reference what controlled the bone type).
2019-11-15 19:27:03 -05:00

171 lines
4.8 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 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);
}
}
}