mirror of https://github.com/AxioDL/metaforce.git
MAPA/MAPU bug fixes
This commit is contained in:
parent
c8e22a6873
commit
5a6e40c5aa
|
@ -13,6 +13,8 @@ namespace DataSpec
|
||||||
namespace DNAMAPA
|
namespace DNAMAPA
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static logvisor::Module Log("DNAMAPA");
|
||||||
|
|
||||||
void MAPA::read(athena::io::IStreamReader& __dna_reader)
|
void MAPA::read(athena::io::IStreamReader& __dna_reader)
|
||||||
{
|
{
|
||||||
/* magic */
|
/* magic */
|
||||||
|
@ -147,14 +149,14 @@ bool ReadMAPAToBlender(hecl::BlenderConnection& conn,
|
||||||
int moIdx = 0;
|
int moIdx = 0;
|
||||||
for (const std::unique_ptr<MAPA::IMappableObject>& mo : mapa.mappableObjects)
|
for (const std::unique_ptr<MAPA::IMappableObject>& mo : mapa.mappableObjects)
|
||||||
{
|
{
|
||||||
const MAPA::MappableObjectMP1_2* moMP12 = dynamic_cast<const MAPA::MappableObjectMP1_2*>(mo.get());
|
if (mapa.version < 5)
|
||||||
if (moMP12)
|
|
||||||
{
|
{
|
||||||
|
const MAPA::MappableObjectMP1_2* moMP12 = static_cast<const MAPA::MappableObjectMP1_2*>(mo.get());
|
||||||
os.format("obj = bpy.data.objects.new('MAPOBJ_%02d', None)\n"
|
os.format("obj = bpy.data.objects.new('MAPOBJ_%02d', None)\n"
|
||||||
"bpy.context.scene.objects.link(obj)\n"
|
"bpy.context.scene.objects.link(obj)\n"
|
||||||
"obj.retro_mappable_type = %d\n"
|
"obj.retro_mappable_type = %d\n"
|
||||||
"obj.retro_mappable_unk = %d\n"
|
"obj.retro_mappable_unk = %d\n"
|
||||||
"obj.retro_mappable_sclyid = '%08X'\n"
|
"obj.retro_mappable_sclyid = '0x%08X'\n"
|
||||||
"mtx = Matrix(((%f,%f,%f,%f),(%f,%f,%f,%f),(%f,%f,%f,%f),(0.0,0.0,0.0,1.0)))\n"
|
"mtx = Matrix(((%f,%f,%f,%f),(%f,%f,%f,%f),(%f,%f,%f,%f),(0.0,0.0,0.0,1.0)))\n"
|
||||||
"mtxd = mtx.decompose()\n"
|
"mtxd = mtx.decompose()\n"
|
||||||
"obj.rotation_mode = 'QUATERNION'\n"
|
"obj.rotation_mode = 'QUATERNION'\n"
|
||||||
|
@ -168,14 +170,14 @@ bool ReadMAPAToBlender(hecl::BlenderConnection& conn,
|
||||||
++moIdx;
|
++moIdx;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const MAPA::MappableObjectMP3* moMP3 = dynamic_cast<const MAPA::MappableObjectMP3*>(mo.get());
|
else
|
||||||
if (moMP3)
|
|
||||||
{
|
{
|
||||||
|
const MAPA::MappableObjectMP3* moMP3 = static_cast<const MAPA::MappableObjectMP3*>(mo.get());
|
||||||
os.format("obj = bpy.data.objects.new('MAPOBJ_%02d', None)\n"
|
os.format("obj = bpy.data.objects.new('MAPOBJ_%02d', None)\n"
|
||||||
"bpy.context.scene.objects.link(obj)\n"
|
"bpy.context.scene.objects.link(obj)\n"
|
||||||
"obj.retro_mappable_type = %d\n"
|
"obj.retro_mappable_type = %d\n"
|
||||||
"obj.retro_mappable_unk = %d\n"
|
"obj.retro_mappable_unk = %d\n"
|
||||||
"obj.retro_mappable_sclyid = '%08X'\n"
|
"obj.retro_mappable_sclyid = '0x%08X'\n"
|
||||||
"mtx = Matrix(((%f,%f,%f,%f),(%f,%f,%f,%f),(%f,%f,%f,%f),(0.0,0.0,0.0,1.0)))\n"
|
"mtx = Matrix(((%f,%f,%f,%f),(%f,%f,%f,%f),(%f,%f,%f,%f),(0.0,0.0,0.0,1.0)))\n"
|
||||||
"mtxd = mtx.decompose()\n"
|
"mtxd = mtx.decompose()\n"
|
||||||
"obj.rotation_mode = 'QUATERNION'\n"
|
"obj.rotation_mode = 'QUATERNION'\n"
|
||||||
|
@ -342,6 +344,13 @@ template bool ReadMAPAToBlender<PAKRouter<DNAMP3::PAKBridge>>
|
||||||
template <typename MAPAType>
|
template <typename MAPAType>
|
||||||
bool Cook(const hecl::BlenderConnection::DataStream::MapArea& mapaIn, const hecl::ProjectPath& out)
|
bool Cook(const hecl::BlenderConnection::DataStream::MapArea& mapaIn, const hecl::ProjectPath& out)
|
||||||
{
|
{
|
||||||
|
if (mapaIn.verts.size() >= 256)
|
||||||
|
{
|
||||||
|
Log.report(logvisor::Error, _S("MAPA %s vertex range exceeded [%d/%d]"),
|
||||||
|
out.getRelativePath().c_str(), mapaIn.verts.size(), 255);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
MAPAType mapa;
|
MAPAType mapa;
|
||||||
mapa.magic = 0xDEADD00D;
|
mapa.magic = 0xDEADD00D;
|
||||||
mapa.version = MAPAType::Version();
|
mapa.version = MAPAType::Version();
|
||||||
|
@ -351,7 +360,6 @@ bool Cook(const hecl::BlenderConnection::DataStream::MapArea& mapaIn, const hecl
|
||||||
aabb.accumulateBounds(vert.val);
|
aabb.accumulateBounds(vert.val);
|
||||||
|
|
||||||
mapa.header = std::make_unique<typename MAPAType::Header>();
|
mapa.header = std::make_unique<typename MAPAType::Header>();
|
||||||
memset((void*)mapa.header.get(), 0, sizeof(typename MAPAType::Header));
|
|
||||||
typename MAPAType::Header& header = static_cast<typename MAPAType::Header&>(*mapa.header);
|
typename MAPAType::Header& header = static_cast<typename MAPAType::Header&>(*mapa.header);
|
||||||
header.unknown1 = 0;
|
header.unknown1 = 0;
|
||||||
header.unknown2 = 1;
|
header.unknown2 = 1;
|
||||||
|
@ -383,7 +391,7 @@ bool Cook(const hecl::BlenderConnection::DataStream::MapArea& mapaIn, const hecl
|
||||||
for (const auto& mo : mapa.mappableObjects)
|
for (const auto& mo : mapa.mappableObjects)
|
||||||
offsetCur = mo->binarySize(offsetCur);
|
offsetCur = mo->binarySize(offsetCur);
|
||||||
offsetCur += mapa.vertices.size() * 12;
|
offsetCur += mapa.vertices.size() * 12;
|
||||||
offsetCur += mapaIn.surfaces.size() * sizeof(DNAMAPA::MAPA::SurfaceHeader);
|
offsetCur += mapaIn.surfaces.size() * 32;
|
||||||
|
|
||||||
mapa.surfaceHeaders.reserve(mapaIn.surfaces.size());
|
mapa.surfaceHeaders.reserve(mapaIn.surfaces.size());
|
||||||
mapa.surfaces.reserve(mapaIn.surfaces.size());
|
mapa.surfaces.reserve(mapaIn.surfaces.size());
|
||||||
|
@ -405,26 +413,36 @@ bool Cook(const hecl::BlenderConnection::DataStream::MapArea& mapaIn, const hecl
|
||||||
for (auto it = itBegin ; it != itEnd ; ++it)
|
for (auto it = itBegin ; it != itEnd ; ++it)
|
||||||
prim.indices.push_back(it->val);
|
prim.indices.push_back(it->val);
|
||||||
|
|
||||||
surf.borderCount = 1;
|
surf.borderCount = surfIn.borders.size();
|
||||||
|
surf.borders.reserve(surfIn.borders.size());
|
||||||
|
for (const auto& borderIn : surfIn.borders)
|
||||||
|
{
|
||||||
surf.borders.emplace_back();
|
surf.borders.emplace_back();
|
||||||
DNAMAPA::MAPA::Surface::Border& border = surf.borders.back();
|
DNAMAPA::MAPA::Surface::Border& border = surf.borders.back();
|
||||||
border.indexCount = surfIn.borderCount;
|
border.indexCount = borderIn.second.val;
|
||||||
border.indices.reserve(surfIn.borderCount);
|
border.indices.reserve(borderIn.second.val);
|
||||||
auto it2Begin = mapaIn.indices.begin() + surfIn.borderStart.val;
|
auto it2Begin = mapaIn.indices.begin() + borderIn.first.val;
|
||||||
auto it2End = itBegin + surfIn.borderCount;
|
auto it2End = it2Begin + borderIn.second.val;
|
||||||
for (auto it = it2Begin ; it != it2End ; ++it)
|
for (auto it = it2Begin ; it != it2End ; ++it)
|
||||||
border.indices.push_back(it->val);
|
border.indices.push_back(it->val);
|
||||||
|
}
|
||||||
|
|
||||||
surfHead.normal = surfIn.normal.val;
|
surfHead.normal = surfIn.normal.val;
|
||||||
surfHead.centroid = surfIn.centerOfMass;
|
surfHead.centroid = surfIn.centerOfMass;
|
||||||
surfHead.polyOff = offsetCur;
|
surfHead.polyOff = offsetCur;
|
||||||
offsetCur = prim.binarySize(offsetCur + 4);
|
offsetCur = prim.binarySize(offsetCur + 4);
|
||||||
surfHead.edgeOff = offsetCur;
|
surfHead.edgeOff = offsetCur;
|
||||||
offsetCur = border.binarySize(offsetCur + 4);
|
offsetCur += 4;
|
||||||
|
for (const auto& border : surf.borders)
|
||||||
|
offsetCur = border.binarySize(offsetCur);
|
||||||
}
|
}
|
||||||
|
|
||||||
athena::io::FileWriter f(out.getAbsolutePath());
|
athena::io::FileWriter f(out.getAbsolutePath());
|
||||||
mapa.write(f);
|
mapa.write(f);
|
||||||
|
int64_t rem = f.position() % 32;
|
||||||
|
if (rem)
|
||||||
|
for (int64_t i=0 ; i<32-rem ; ++i)
|
||||||
|
f.writeBytes((atInt8*)"\xff", 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,12 +25,12 @@ struct MAPA : BigDNA
|
||||||
struct HeaderMP1 : IMAPAHeader
|
struct HeaderMP1 : IMAPAHeader
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_DNA
|
||||||
Value<atUint32> unknown1;
|
Value<atUint32> unknown1 = 0;
|
||||||
Value<atUint32> unknown2;
|
Value<atUint32> unknown2 = 0;
|
||||||
Value<atVec3f> boundingBox[2];
|
Value<atVec3f> boundingBox[2] = {};
|
||||||
Value<atUint32> moCount;
|
Value<atUint32> moCount = 0;
|
||||||
Value<atUint32> vtxCount;
|
Value<atUint32> vtxCount = 0;
|
||||||
Value<atUint32> surfCount;
|
Value<atUint32> surfCount = 0;
|
||||||
virtual atUint32 mappableObjectCount() const { return moCount;}
|
virtual atUint32 mappableObjectCount() const { return moCount;}
|
||||||
virtual atUint32 vertexCount() const { return vtxCount; }
|
virtual atUint32 vertexCount() const { return vtxCount; }
|
||||||
virtual atUint32 surfaceCount() const { return surfCount; }
|
virtual atUint32 surfaceCount() const { return surfCount; }
|
||||||
|
@ -39,15 +39,15 @@ struct MAPA : BigDNA
|
||||||
struct HeaderMP2 : IMAPAHeader
|
struct HeaderMP2 : IMAPAHeader
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_DNA
|
||||||
Value<atUint32> unknown1;
|
Value<atUint32> unknown1 = 0;
|
||||||
Value<atUint32> unknown2;
|
Value<atUint32> unknown2 = 0;
|
||||||
Value<atVec3f> boundingBox[2];
|
Value<atVec3f> boundingBox[2] = {};
|
||||||
Value<atUint32> unknown3;
|
Value<atUint32> unknown3 = 0;
|
||||||
Value<atUint32> unknown4;
|
Value<atUint32> unknown4 = 0;
|
||||||
Value<atUint32> unknown5;
|
Value<atUint32> unknown5 = 0;
|
||||||
Value<atUint32> moCount;
|
Value<atUint32> moCount = 0;
|
||||||
Value<atUint32> vtxCount;
|
Value<atUint32> vtxCount = 0;
|
||||||
Value<atUint32> surfCount;
|
Value<atUint32> surfCount = 0;
|
||||||
atUint32 mappableObjectCount() const { return moCount;}
|
atUint32 mappableObjectCount() const { return moCount;}
|
||||||
atUint32 vertexCount() const { return vtxCount; }
|
atUint32 vertexCount() const { return vtxCount; }
|
||||||
atUint32 surfaceCount() const { return surfCount; }
|
atUint32 surfaceCount() const { return surfCount; }
|
||||||
|
@ -56,18 +56,18 @@ struct MAPA : BigDNA
|
||||||
struct HeaderMP3 : IMAPAHeader
|
struct HeaderMP3 : IMAPAHeader
|
||||||
{
|
{
|
||||||
DECL_DNA
|
DECL_DNA
|
||||||
Value<atUint32> unknown1;
|
Value<atUint32> unknown1 = 0;
|
||||||
Value<atUint32> unknown2;
|
Value<atUint32> unknown2 = 0;
|
||||||
Value<atVec3f> boundingBox[2];
|
Value<atVec3f> boundingBox[2] = {};
|
||||||
Value<atUint32> unknown3;
|
Value<atUint32> unknown3 = 0;
|
||||||
Value<atUint32> unknown4;
|
Value<atUint32> unknown4 = 0;
|
||||||
Value<atUint32> unknown5;
|
Value<atUint32> unknown5 = 0;
|
||||||
Value<atUint32> unknown6;
|
Value<atUint32> unknown6 = 0;
|
||||||
Value<atUint32> moCount;
|
Value<atUint32> moCount = 0;
|
||||||
Value<atUint32> vtxCount;
|
Value<atUint32> vtxCount = 0;
|
||||||
Value<atUint32> surfCount;
|
Value<atUint32> surfCount = 0;
|
||||||
Value<atUint32> internalNameLength;
|
Value<atUint32> internalNameLength = 0;
|
||||||
Value<atUint32> unknown7;
|
Value<atUint32> unknown7 = 0;
|
||||||
String<DNA_COUNT(internalNameLength)> internalName;
|
String<DNA_COUNT(internalNameLength)> internalName;
|
||||||
atUint32 mappableObjectCount() const { return moCount;}
|
atUint32 mappableObjectCount() const { return moCount;}
|
||||||
atUint32 vertexCount() const { return vtxCount; }
|
atUint32 vertexCount() const { return vtxCount; }
|
||||||
|
@ -118,9 +118,9 @@ struct MAPA : BigDNA
|
||||||
Value<Type> type;
|
Value<Type> type;
|
||||||
Value<atUint32> unknown1;
|
Value<atUint32> unknown1;
|
||||||
Value<atUint32> sclyId;
|
Value<atUint32> sclyId;
|
||||||
Seek<DNA_COUNT(4), athena::Current> seek1;
|
Value<atInt32> seek1 = -1;
|
||||||
Value<atVec4f> transformMtx[3];
|
Value<atVec4f> transformMtx[3];
|
||||||
Seek<DNA_COUNT(0x10), athena::Current> seek2;
|
Value<atInt32> seek2[4] = {-1, -1, -1, -1};
|
||||||
virtual ~MappableObjectMP1_2() {}
|
virtual ~MappableObjectMP1_2() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -131,9 +131,9 @@ struct MAPA : BigDNA
|
||||||
Value<atUint32> unknown1;
|
Value<atUint32> unknown1;
|
||||||
Value<atUint32> sclyId;
|
Value<atUint32> sclyId;
|
||||||
Buffer<DNA_COUNT(0x10)> unknownHash;
|
Buffer<DNA_COUNT(0x10)> unknownHash;
|
||||||
Seek<DNA_COUNT(4), athena::Current> seek1;
|
Value<atInt32> seek1 = -1;
|
||||||
Value<atVec4f> transformMtx[3];
|
Value<atVec4f> transformMtx[3];
|
||||||
Seek<DNA_COUNT(0x10), athena::Current> seek2;
|
Value<atInt32> seek2[4] = {-1, -1, -1, -1};
|
||||||
virtual ~MappableObjectMP3() {}
|
virtual ~MappableObjectMP3() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,8 @@ bool ReadMAPUToBlender(hecl::BlenderConnection& conn,
|
||||||
|
|
||||||
os.centerView();
|
os.centerView();
|
||||||
os.close();
|
os.close();
|
||||||
return conn.saveBlend();
|
conn.saveBlend();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
template bool ReadMAPUToBlender<PAKRouter<DNAMP1::PAKBridge>>
|
template bool ReadMAPUToBlender<PAKRouter<DNAMP1::PAKBridge>>
|
||||||
|
@ -144,6 +145,10 @@ bool MAPU::Cook(const hecl::BlenderConnection::DataStream::MapUniverse& mapuIn,
|
||||||
|
|
||||||
athena::io::FileWriter f(out.getAbsolutePath());
|
athena::io::FileWriter f(out.getAbsolutePath());
|
||||||
mapu.write(f);
|
mapu.write(f);
|
||||||
|
int64_t rem = f.position() % 32;
|
||||||
|
if (rem)
|
||||||
|
for (int64_t i=0 ; i<32-rem ; ++i)
|
||||||
|
f.writeBytes((atInt8*)"\xff", 1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
hecl
2
hecl
|
@ -1 +1 @@
|
||||||
Subproject commit 5d11c53fea3e554c8c93a8c055edcc22dedaa084
|
Subproject commit 63980109fd91e72b4ec668918879af2779255c27
|
Loading…
Reference in New Issue