Files
YarikStudio/AssetStudio/ObjectReader.cs
2023-11-24 21:17:13 +04:00

104 lines
3.0 KiB
C#

using System;
using System.IO;
namespace AssetStudio
{
public class ObjectReader : EndianBinaryReader
{
public SerializedFile assetsFile;
public Game Game;
public long m_PathID;
public long byteStart;
public uint byteSize;
public ClassIDType type;
public SerializedType serializedType;
public BuildTarget platform;
public SerializedFileFormatVersion m_Version;
public int[] version => assetsFile.version;
public BuildType buildType => assetsFile.buildType;
public ObjectReader(EndianBinaryReader reader, SerializedFile assetsFile, ObjectInfo objectInfo, Game game) : base(reader.BaseStream, reader.Endian)
{
this.assetsFile = assetsFile;
Game = game;
m_PathID = objectInfo.m_PathID;
byteStart = objectInfo.byteStart;
byteSize = objectInfo.byteSize;
if (Enum.IsDefined(typeof(ClassIDType), objectInfo.classID))
{
type = (ClassIDType)objectInfo.classID;
}
else
{
type = ClassIDType.UnknownType;
}
serializedType = objectInfo.serializedType;
platform = assetsFile.m_TargetPlatform;
m_Version = assetsFile.header.m_Version;
Logger.Verbose($"Initialized reader for {type} object with {m_PathID} in file {assetsFile.fileName} !!");
}
public override int Read(byte[] buffer, int index, int count)
{
var pos = Position - byteStart;
if (pos + count > byteSize)
{
throw new EndOfStreamException("Unable to read beyond the end of the stream.");
}
return base.Read(buffer, index, count);
}
public void Reset()
{
Logger.Verbose($"Resetting reader position to object offset 0x{byteStart:X8}...");
Position = byteStart;
}
public Vector3 ReadVector3()
{
if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))
{
return new Vector3(ReadSingle(), ReadSingle(), ReadSingle());
}
else
{
return new Vector4(ReadSingle(), ReadSingle(), ReadSingle(), ReadSingle());
}
}
public XForm ReadXForm()
{
var t = ReadVector3();
var q = ReadQuaternion();
var s = ReadVector3();
return new XForm(t, q, s);
}
public XForm ReadXForm4()
{
var t = ReadVector4();
var q = ReadQuaternion();
var s = ReadVector4();
return new XForm(t, q, s);
}
public Vector3[] ReadVector3Array(int length = 0)
{
if (length == 0)
{
length = ReadInt32();
}
return ReadArray(ReadVector3, length);
}
public XForm[] ReadXFormArray()
{
return ReadArray(ReadXForm, ReadInt32());
}
}
}