lib: document more of the MxOb structure

This commit is contained in:
Mason Back 2022-07-04 13:59:47 -04:00
parent 9fa1e4d137
commit 9412012a65
2 changed files with 69 additions and 9 deletions

View file

@ -18,6 +18,13 @@ Data ReadU16(std::ifstream &is)
return u;
}
Data ReadU8(std::ifstream &is)
{
u8 u;
is.read((char *) &u, sizeof(u));
return u;
}
Data ReadVector3(std::ifstream &is)
{
Vector3 u;
@ -127,6 +134,33 @@ const char *MxOb::GetTypeName(Type type)
return "Unknown";
}
std::vector<const char*> MxOb::GetFlagsName(Flags flags)
{
std::vector<const char*> names;
if (flags == FLAGS_COUNT) {
return names;
}
if (flags & Transparent) {
names.push_back("Transparent");
}
if (flags & NoLoop) {
names.push_back("NoLoop");
}
if (flags & LoopCache) {
names.push_back("LoopCache");
}
if (flags & LoopStream) {
names.push_back("LoopStream");
}
if (flags & Unknown) {
names.push_back("Unknown");
}
return names;
}
void MxOb::Read(std::ifstream &is, DataMap &data, u32 version, u32 size)
{
Data obj_type = ReadU16(is);
@ -135,10 +169,12 @@ void MxOb::Read(std::ifstream &is, DataMap &data, u32 version, u32 size)
data["Unknown1"] = ReadU32(is);
data["Name"] = ReadString(is);
data["ID"] = ReadU32(is);
data["Unknown3"] = ReadU32(is);
data["Flags"] = ReadU8(is);
data["Padding1"] = ReadU8(is);
data["Padding2"] = ReadU16(is);
data["Unknown4"] = ReadU32(is);
data["Unknown5"] = ReadU32(is);
data["Unknown6"] = ReadU32(is);
data["Duration"] = ReadU32(is);
data["Loops"] = ReadU32(is);
data["Position"] = ReadVector3(is);
data["Direction"] = ReadVector3(is);
data["Up"] = ReadVector3(is);

View file

@ -116,13 +116,15 @@ public:
* Unknown1 | 4 | u32 |
* Name | Variable | string | Null-terminated string identifying object's name
* ID | 4 | u32 | Unique object identifier within file (used to differentiate interleaved MxChs)
* Unknown3 | 4 | u32 |
* Unknown4 | 4 | u32 |
* Unknown5 | 4 | u32 |
* Unknown6 | 4 | u32 |
* Flags | 1 | u8 | Flags of object (member of MxOb::Flags enum)
* Padding1 | 1 | u8 |
* Padding2 | 2 | u16 |
* Unknown4 | 4 | u32 | Similar to Duration, but only used for Lego3DWavePresenter
* Duration | 4 | u32 | Duration in milliseconds * Loops
* Loops | 4 | u32 |
* Position | 24 | Vector3 | Position
* Direction | 24 | Vector3 | Position
* Up | 24 | Vector3 | Position
* Direction | 24 | Vector3 | Direction to look towards
* Up | 24 | Vector3 | Up vector
* ExtraLength | 2 | u16 |
* ExtraData | ExtraLength | bytearray |
* FileName | Variable | string | Original filename of the file represented by this object.
@ -167,9 +169,31 @@ public:
TYPE_COUNT
};
enum Flags
{
/// Object is transparent
Transparent = 0b00001000,
/// Object does not loop
NoLoop = 0b00000010,
/// Object loops via cache (i.e. hard disk)
LoopCache = 0b00000001,
/// Object loops via stream (i.e. CD-ROM)
LoopStream = 0b00000100,
/// Unknown flag, but set by every object thus far
Unknown = 0b00100000,
/// Total number of flags (not a real type)
FLAGS_COUNT
};
// FIXME: sitypes.h probably won't be part of the public API, so this should
// probably be moved
LIBWEAVER_EXPORT static const char *GetTypeName(Type type);
LIBWEAVER_EXPORT static std::vector<const char*> GetFlagsName(Flags flags);
virtual void Read(std::ifstream &is, DataMap &data, u32 version, u32 size);
};