metaforce/DataSpec/DNAMP2/MREA.hpp

129 lines
4.2 KiB
C++
Raw Normal View History

2018-10-07 03:42:33 +00:00
#pragma once
2015-09-09 00:49:20 +00:00
2018-06-29 20:21:36 +00:00
#include "DataSpec/DNACommon/DNACommon.hpp"
2015-09-09 00:49:20 +00:00
#include "CMDLMaterials.hpp"
#include "CSKR.hpp"
2017-12-29 08:08:12 +00:00
namespace DataSpec::DNAMP2
2015-09-09 00:49:20 +00:00
{
struct MREA
{
2016-03-04 23:04:53 +00:00
class StreamReader : public athena::io::IStreamReader
2015-09-09 00:49:20 +00:00
{
2015-09-20 06:09:27 +00:00
protected:
2015-09-09 00:49:20 +00:00
struct BlockInfo : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
2015-09-09 00:49:20 +00:00
Value<atUint32> bufSize;
Value<atUint32> decompSize;
Value<atUint32> compSize;
Value<atUint32> secCount;
};
std::vector<BlockInfo> m_blockInfos;
size_t m_compBufSz;
std::unique_ptr<atUint8[]> m_compBuf;
size_t m_decompBufSz;
std::unique_ptr<atUint8[]> m_decompBuf;
2016-03-04 23:04:53 +00:00
athena::io::IStreamReader& m_source;
2015-09-09 00:49:20 +00:00
atUint64 m_blkBase;
atUint32 m_blkCount;
atUint32 m_totalDecompLen = 0;
atUint32 m_pos = 0;
atUint32 m_nextBlk = 0;
atUint32 m_posInBlk = 0;
atUint32 m_blkSz = 0;
void nextBlock();
2016-03-04 23:04:53 +00:00
StreamReader(athena::io::IStreamReader& source)
2015-09-20 06:09:27 +00:00
: m_compBufSz(0x4120), m_compBuf(new atUint8[0x4120]),
m_decompBufSz(0x4120), m_decompBuf(new atUint8[0x4120]),
m_source(source) {} /* Empty constructor for inheriting */
2015-09-09 00:49:20 +00:00
public:
2016-03-04 23:04:53 +00:00
StreamReader(athena::io::IStreamReader& source, atUint32 blkCount);
void seek(atInt64 diff, athena::SeekOrigin whence);
2015-09-09 00:49:20 +00:00
atUint64 position() const {return m_pos;}
atUint64 length() const {return m_totalDecompLen;}
atUint64 readUBytesToBuf(void* buf, atUint64 len);
2016-03-04 23:04:53 +00:00
void writeDecompInfos(athena::io::IStreamWriter& writer) const;
2015-09-09 00:49:20 +00:00
};
struct Header : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
2015-09-09 00:49:20 +00:00
Value<atUint32> magic;
Value<atUint32> version;
Value<atVec4f> localToWorldMtx[3];
Value<atUint32> meshCount;
Value<atUint32> sclyLayerCount;
Value<atUint32> secCount;
Value<atUint32> geomSecIdx;
Value<atUint32> sclySecIdx;
Value<atUint32> scgnSecIdx;
Value<atUint32> collisionSecIdx;
Value<atUint32> unkSecIdx;
Value<atUint32> lightSecIdx;
Value<atUint32> emptySecIdx;
Value<atUint32> pathSecIdx;
Value<atUint32> unk2SecIdx;
Value<atUint32> unk3SecIdx;
Value<atUint32> egmcSecIdx;
Value<atUint32> compressedBlockCount;
2016-03-04 23:04:53 +00:00
Seek<12, athena::Current> align1;
2018-02-25 08:23:27 +00:00
Vector<atUint32, AT_DNA_COUNT(secCount)> secSizes;
2015-09-09 00:49:20 +00:00
};
struct MeshHeader : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
2015-09-09 00:49:20 +00:00
struct VisorFlags : BigDNA
{
2018-02-22 07:24:51 +00:00
AT_DECL_DNA
2015-09-09 00:49:20 +00:00
Value<atUint32> flags;
2015-11-21 01:16:07 +00:00
enum class ThermalLevel
2015-09-09 00:49:20 +00:00
{
2015-11-21 01:16:07 +00:00
Cool,
Hot,
Warm
2015-09-09 00:49:20 +00:00
};
static const char* GetThermalLevelStr(ThermalLevel t)
{
switch (t)
{
2015-11-21 01:16:07 +00:00
case ThermalLevel::Cool: return "COOL";
case ThermalLevel::Hot: return "HOT";
case ThermalLevel::Warm: return "WARM";
2015-09-09 00:49:20 +00:00
default: break;
}
return nullptr;
}
bool disableEnviro() const {return flags >> 1 & 0x1;}
void setDisableEnviro(bool v) {flags &= ~0x2; flags |= v << 1;}
bool disableThermal() const {return flags >> 2 & 0x1;}
void setDisableThermal(bool v) {flags &= ~0x4; flags |= v << 2;}
bool disableXray() const {return flags >> 3 & 0x1;}
void setDisableXray(bool v) {flags &= ~0x8; flags |= v << 3;}
ThermalLevel thermalLevel() const {return ThermalLevel(flags >> 4 & 0x3);}
2015-11-21 01:16:07 +00:00
void setThermalLevel(ThermalLevel v) {flags &= ~0x30; flags |= atUint32(v) << 4;}
2015-09-09 00:49:20 +00:00
const char* thermalLevelStr() const {return GetThermalLevelStr(thermalLevel());}
} visorFlags;
Value<atVec4f> xfMtx[3];
Value<atVec3f> aabb[2];
};
static bool Extract(const SpecBase& dataSpec,
PAKEntryReadStream& rs,
2016-03-04 23:04:53 +00:00
const hecl::ProjectPath& outPath,
2015-09-09 00:49:20 +00:00
PAKRouter<PAKBridge>& pakRouter,
const DNAMP2::PAK::Entry& entry,
2015-09-09 00:49:20 +00:00
bool,
2017-12-29 08:08:12 +00:00
hecl::blender::Token& btok,
2016-03-04 23:04:53 +00:00
std::function<void(const hecl::SystemChar*)>);
2015-09-09 00:49:20 +00:00
};
}