Several world-cooking bug fixes

This commit is contained in:
Jack Andersen 2016-10-07 17:41:08 -10:00
parent 2503e04b9f
commit 647643f579
8 changed files with 98 additions and 40 deletions

View File

@ -57,12 +57,14 @@ hecl::ProjectPath UniqueIDBridge::TranslatePakIdToPath(const UniqueID64& id, boo
template <class IDType> template <class IDType>
hecl::ProjectPath UniqueIDBridge::MakePathFromString(const std::string& str) hecl::ProjectPath UniqueIDBridge::MakePathFromString(const std::string& str)
{ {
if (str.empty())
return {};
hecl::Database::Project* project = s_Project.get(); hecl::Database::Project* project = s_Project.get();
if (!project) if (!project)
LogDNACommon.report(logvisor::Fatal, LogDNACommon.report(logvisor::Fatal,
"UniqueIDBridge::setGlobalProject must be called before MakePathFromString"); "UniqueIDBridge::setGlobalProject must be called before MakePathFromString");
hecl::ProjectPath path = hecl::ProjectPath(*project, str); hecl::ProjectPath path = hecl::ProjectPath(*project, str);
project->addBridgePathToCache(IDType(path), path); project->addBridgePathToCache(IDType(path).toUint64(), path);
return path; return path;
} }
template template
@ -101,7 +103,9 @@ void UniqueID32::write(athena::io::YAMLDocWriter& writer) const
hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this); hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this);
if (!path) if (!path)
return; return;
writer.writeString(nullptr, path.getRelativePathUTF8()); writer.writeString(nullptr, path.getAuxInfo().size() ?
(path.getRelativePathUTF8() + _S('|') + path.getAuxInfoUTF8()) :
path.getRelativePathUTF8());
} }
size_t UniqueID32::binarySize(size_t __isz) const size_t UniqueID32::binarySize(size_t __isz) const
{return __isz + 4;} {return __isz + 4;}
@ -181,7 +185,9 @@ void UniqueID64::write(athena::io::YAMLDocWriter& writer) const
hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this); hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this);
if (!path) if (!path)
return; return;
writer.writeString(nullptr, path.getRelativePathUTF8()); writer.writeString(nullptr, path.getAuxInfo().size() ?
(path.getRelativePathUTF8() + _S('|') + path.getAuxInfoUTF8()) :
path.getRelativePathUTF8());
} }
size_t UniqueID64::binarySize(size_t __isz) const size_t UniqueID64::binarySize(size_t __isz) const
{return __isz + 8;} {return __isz + 8;}
@ -215,7 +221,9 @@ void UniqueID128::write(athena::io::YAMLDocWriter& writer) const
hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this); hecl::ProjectPath path = UniqueIDBridge::TranslatePakIdToPath(*this);
if (!path) if (!path)
return; return;
writer.writeString(nullptr, path.getRelativePathUTF8()); writer.writeString(nullptr, path.getAuxInfo().size() ?
(path.getRelativePathUTF8() + _S('|') + path.getAuxInfoUTF8()) :
path.getRelativePathUTF8());
} }
size_t UniqueID128::binarySize(size_t __isz) const size_t UniqueID128::binarySize(size_t __isz) const
{return __isz + 16;} {return __isz + 16;}

View File

@ -1156,6 +1156,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
{ {
hecl::SystemStringView sysStr(arm.name); hecl::SystemStringView sysStr(arm.name);
hecl::ProjectPath pathOut = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".CINF")).getCookedPath(SpecEntMP1); hecl::ProjectPath pathOut = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".CINF")).getCookedPath(SpecEntMP1);
pathOut.makeDirChain(false);
athena::io::FileWriter w(pathOut.getAbsolutePath(), true, false); athena::io::FileWriter w(pathOut.getAbsolutePath(), true, false);
if (w.hasError()) if (w.hasError())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"), Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),
@ -1227,6 +1228,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
hecl::SystemStringView sysStr(ch.name); hecl::SystemStringView sysStr(ch.name);
hecl::ProjectPath skinPath = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".CSKR")).getCookedPath(SpecEntMP1PC); hecl::ProjectPath skinPath = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".CSKR")).getCookedPath(SpecEntMP1PC);
skinPath.makeDirChain(false);
athena::io::FileWriter skinOut(skinPath.getAbsolutePath(), true, false); athena::io::FileWriter skinOut(skinPath.getAbsolutePath(), true, false);
if (skinOut.hasError()) if (skinOut.hasError())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"), Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),
@ -1255,6 +1257,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
hecl::SystemStringView sysStr(act.name); hecl::SystemStringView sysStr(act.name);
hecl::ProjectPath pathOut = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".ANIM")); hecl::ProjectPath pathOut = inPath.ensureAuxInfo(sysStr.sys_str() + _S(".ANIM"));
hecl::ProjectPath cookedOut = pathOut.getCookedPath(SpecEntMP1PC); hecl::ProjectPath cookedOut = pathOut.getCookedPath(SpecEntMP1PC);
cookedOut.makeDirChain(false);
athena::io::FileWriter w(cookedOut.getAbsolutePath(), true, false); athena::io::FileWriter w(cookedOut.getAbsolutePath(), true, false);
if (w.hasError()) if (w.hasError())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"), Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),
@ -1277,6 +1280,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
evnt.fromYAMLStream(reader); evnt.fromYAMLStream(reader);
hecl::ProjectPath evntCookedOut = evntYamlPath.getCookedPath(SpecEntMP1); hecl::ProjectPath evntCookedOut = evntYamlPath.getCookedPath(SpecEntMP1);
evntCookedOut.makeDirChain(false);
athena::io::FileWriter w(evntCookedOut.getAbsolutePath(), true, false); athena::io::FileWriter w(evntCookedOut.getAbsolutePath(), true, false);
if (w.hasError()) if (w.hasError())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"), Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),

View File

@ -48,9 +48,12 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
mlvl.magic = 0xDEAFBABE; mlvl.magic = 0xDEAFBABE;
mlvl.version = 0x11; mlvl.version = 0x11;
hecl::ProjectPath savwPath = inPath.ensureAuxInfo(_S(".SAVW")); hecl::ProjectPath namePath(inPath.getParentPath(), _S("!name.yaml"));
if (namePath.isFile())
mlvl.worldNameId = namePath;
hecl::ProjectPath savwPath = inPath.ensureAuxInfo(_S("SAVW"));
mlvl.saveWorldId = savwPath; mlvl.saveWorldId = savwPath;
hecl::ProjectPath mapwPath = inPath.ensureAuxInfo(_S(".MAPW")); hecl::ProjectPath mapwPath = inPath.ensureAuxInfo(_S("MAPW"));
mlvl.worldMap = mapwPath; mlvl.worldMap = mapwPath;
std::vector<urde::SObjectTag> mapaTags; std::vector<urde::SObjectTag> mapaTags;
@ -112,14 +115,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
if (!areaInit) if (!areaInit)
{ {
/* Finish last area */ /* Finish last area */
if (mlvl.areas.size()) mlvl.finishLastArea();
{
MLVL::Area& areaLast = mlvl.areas.back();
areaLast.attachedAreaCount = areaLast.attachedAreas.size();
areaLast.depCount = areaLast.deps.size();
areaLast.depLayerCount = areaLast.depLayers.size();
areaLast.dockCount = areaLast.docks.size();
}
/* Area map */ /* Area map */
hecl::ProjectPath mapPath(area.path, _S("/!map.blend")); hecl::ProjectPath mapPath(area.path, _S("/!map.blend"));
@ -143,7 +139,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
areaOut.areaId = 0xffffffff; areaOut.areaId = 0xffffffff;
hecl::ProjectPath memIdPath(area.path, _S("/!memoryid.yaml")); hecl::ProjectPath memIdPath(area.path, _S("/!memoryid.yaml"));
if (namePath.isFile()) if (memIdPath.isFile())
{ {
athena::io::FileReader fr(memIdPath.getAbsolutePath()); athena::io::FileReader fr(memIdPath.getAbsolutePath());
athena::io::YAMLDocReader r; athena::io::YAMLDocReader r;
@ -159,16 +155,14 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
{ {
areaOut.docks.emplace_back(); areaOut.docks.emplace_back();
MLVL::Area::Dock& dockOut = areaOut.docks.back(); MLVL::Area::Dock& dockOut = areaOut.docks.back();
if (dock.targetArea != -1 && dock.targetDock != -1)
{
dockOut.endpointCount = 1; dockOut.endpointCount = 1;
dockOut.endpoints.emplace_back(); dockOut.endpoints.emplace_back();
MLVL::Area::Dock::Endpoint& ep = dockOut.endpoints.back(); MLVL::Area::Dock::Endpoint& ep = dockOut.endpoints.back();
ep.areaIdx = dock.targetArea; ep.areaIdx = dock.targetArea;
ep.dockIdx = dock.targetDock; ep.dockIdx = dock.targetDock;
dockOut.planeVertCount = 4;
dockOut.planeVerts.push_back(dock.verts[0]);
dockOut.planeVerts.push_back(dock.verts[1]);
dockOut.planeVerts.push_back(dock.verts[2]);
dockOut.planeVerts.push_back(dock.verts[3]);
if (addedAreas.find(dock.targetArea) == addedAreas.cend()) if (addedAreas.find(dock.targetArea) == addedAreas.cend())
{ {
@ -176,6 +170,17 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
areaOut.attachedAreas.push_back(dock.targetArea); areaOut.attachedAreas.push_back(dock.targetArea);
} }
} }
else
{
dockOut.endpointCount = 0;
}
dockOut.planeVertCount = 4;
dockOut.planeVerts.push_back(dock.verts[0]);
dockOut.planeVerts.push_back(dock.verts[1]);
dockOut.planeVerts.push_back(dock.verts[2]);
dockOut.planeVerts.push_back(dock.verts[3]);
}
areaOut.attachedAreaCount = areaOut.attachedAreas.size(); areaOut.attachedAreaCount = areaOut.attachedAreas.size();
} }
@ -252,6 +257,8 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
std::unordered_set<UniqueID32> addedScans; std::unordered_set<UniqueID32> addedScans;
for (const Scan& scan : scans) for (const Scan& scan : scans)
{ {
if (!scan.scanId)
continue;
if (addedScans.find(scan.scanId) == addedScans.cend()) if (addedScans.find(scan.scanId) == addedScans.cend())
{ {
addedScans.insert(scan.scanId); addedScans.insert(scan.scanId);
@ -275,9 +282,39 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
++layerIdx; ++layerIdx;
} }
/* Cull duplicate area paths and add typed hash to list */
auto& conn = hecl::BlenderConnection::SharedConnection();
if (conn.openBlend(areaPath))
{
MLVL::Area& areaOut = mlvl.areas.back();
areaOut.depLayers.push_back(areaOut.deps.size());
auto ds = conn.beginData();
std::vector<hecl::ProjectPath> texs = ds.getTextures();
ds.close();
std::unordered_set<hecl::Hash> addedPaths;
for (const hecl::ProjectPath& path : texs)
{
if (addedPaths.find(path.hash()) == addedPaths.cend())
{
addedPaths.insert(path.hash());
urde::SObjectTag tag = g_curSpec->BuildTagFromPath(path, hecl::SharedBlenderToken);
areaOut.deps.emplace_back(tag.id, tag.type);
}
}
urde::SObjectTag tag = g_curSpec->BuildTagFromPath(areaPath, hecl::SharedBlenderToken);
areaOut.deps.emplace_back(tag.id, tag.type);
}
++areaIdx; ++areaIdx;
} }
/* Finish last area */
mlvl.finishLastArea();
mlvl.memRelayLinkCount = mlvl.memRelayLinks.size(); mlvl.memRelayLinkCount = mlvl.memRelayLinks.size();
mlvl.areaCount = mlvl.areas.size(); mlvl.areaCount = mlvl.areas.size();
mlvl.layerFlagCount = mlvl.layerFlags.size(); mlvl.layerFlagCount = mlvl.layerFlags.size();
@ -294,6 +331,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
{ {
hecl::ProjectPath mapwCooked = hecl::ProjectPath mapwCooked =
mapwPath.getCookedPath(*g_curSpec->overrideDataSpec(mapwPath, nullptr, hecl::SharedBlenderToken)); mapwPath.getCookedPath(*g_curSpec->overrideDataSpec(mapwPath, nullptr, hecl::SharedBlenderToken));
mapwCooked.makeDirChain(false);
athena::io::FileWriter fo(mapwCooked.getAbsolutePath()); athena::io::FileWriter fo(mapwCooked.getAbsolutePath());
fo.writeUint32Big(0xDEADF00D); fo.writeUint32Big(0xDEADF00D);
fo.writeUint32Big(1); fo.writeUint32Big(1);
@ -313,6 +351,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat
hecl::ProjectPath savwCooked = hecl::ProjectPath savwCooked =
savwPath.getCookedPath(*g_curSpec->overrideDataSpec(savwPath, nullptr, hecl::SharedBlenderToken)); savwPath.getCookedPath(*g_curSpec->overrideDataSpec(savwPath, nullptr, hecl::SharedBlenderToken));
savwCooked.makeDirChain(false);
athena::io::FileWriter fo(savwCooked.getAbsolutePath()); athena::io::FileWriter fo(savwCooked.getAbsolutePath());
savw.write(fo); savw.write(fo);
} }

View File

@ -81,6 +81,18 @@ struct MLVL : BigYAML
}; };
Vector<Area, DNA_COUNT(areaCount)> areas; Vector<Area, DNA_COUNT(areaCount)> areas;
void finishLastArea()
{
if (areas.size())
{
MLVL::Area& areaLast = areas.back();
areaLast.attachedAreaCount = areaLast.attachedAreas.size();
areaLast.depCount = areaLast.deps.size();
areaLast.depLayerCount = areaLast.depLayers.size();
areaLast.dockCount = areaLast.docks.size();
}
}
UniqueID32 worldMap; UniqueID32 worldMap;
Value<atUint8> unknown2; Value<atUint8> unknown2;
Value<atUint32> unknown3; Value<atUint32> unknown3;

View File

@ -318,7 +318,7 @@ void SpecBase::flattenDependencies(const hecl::ProjectPath& path,
case hecl::BlenderConnection::BlendType::Actor: case hecl::BlenderConnection::BlendType::Actor:
{ {
hecl::BlenderConnection::DataStream ds = conn.beginData(); hecl::BlenderConnection::DataStream ds = conn.beginData();
hecl::BlenderConnection::DataStream::Actor actor = ds.compileActor(); hecl::BlenderConnection::DataStream::Actor actor = ds.compileActorCharacterOnly();
for (auto& sub : actor.subtypes) for (auto& sub : actor.subtypes)
{ {
if (sub.armature >= 0) if (sub.armature >= 0)

View File

@ -415,9 +415,9 @@ struct SpecMP1 : SpecBase
{ {
if (path.getAuxInfo().size()) if (path.getAuxInfo().size())
{ {
if (hecl::StringUtils::EndsWith(path.getAuxInfo(), _S(".MAPW"))) if (hecl::StringUtils::EndsWith(path.getAuxInfo(), _S("MAPW")))
return {SBIG('MAPW'), path.hash().val32()}; return {SBIG('MAPW'), path.hash().val32()};
else if (hecl::StringUtils::EndsWith(path.getAuxInfo(), _S(".SAVW"))) else if (hecl::StringUtils::EndsWith(path.getAuxInfo(), _S("SAVW")))
return {SBIG('SAVW'), path.hash().val32()}; return {SBIG('SAVW'), path.hash().val32()};
} }
return {SBIG('MLVL'), path.hash().val32()}; return {SBIG('MLVL'), path.hash().val32()};

View File

@ -14,9 +14,9 @@ static void WriteTag(athena::io::YAMLDocWriter& cacheWriter,
snprintf(idStr, 9, "%08X", uint32_t(pathTag.id)); snprintf(idStr, 9, "%08X", uint32_t(pathTag.id));
cacheWriter.enterSubVector(idStr); cacheWriter.enterSubVector(idStr);
cacheWriter.writeString(nullptr, pathTag.type.toString().c_str()); cacheWriter.writeString(nullptr, pathTag.type.toString().c_str());
cacheWriter.writeString(nullptr, path.getRelativePathUTF8().c_str()); cacheWriter.writeString(nullptr, path.getAuxInfo().size() ?
if (path.getAuxInfo().size()) (path.getRelativePathUTF8() + _S('|') + path.getAuxInfoUTF8()) :
cacheWriter.writeString(nullptr, path.getAuxInfoUTF8().c_str()); path.getRelativePathUTF8());
cacheWriter.leaveSubVector(); cacheWriter.leaveSubVector();
} }
@ -221,7 +221,7 @@ bool ProjectResourceFactoryBase::AddFileToIndex(const hecl::ProjectPath& path,
pathTag = {SBIG('MLVL'), asGlob.hash().val32()}; pathTag = {SBIG('MLVL'), asGlob.hash().val32()};
useGlob = true; useGlob = true;
hecl::ProjectPath subPath = asGlob.ensureAuxInfo(_S(".MAPW")); hecl::ProjectPath subPath = asGlob.ensureAuxInfo(_S("MAPW"));
SObjectTag pathTag = BuildTagFromPath(subPath, m_backgroundBlender); SObjectTag pathTag = BuildTagFromPath(subPath, m_backgroundBlender);
m_tagToPath[pathTag] = subPath; m_tagToPath[pathTag] = subPath;
m_pathToTag[subPath.hash()] = pathTag; m_pathToTag[subPath.hash()] = pathTag;
@ -229,7 +229,7 @@ bool ProjectResourceFactoryBase::AddFileToIndex(const hecl::ProjectPath& path,
DumpCacheAdd(pathTag, subPath); DumpCacheAdd(pathTag, subPath);
#endif #endif
subPath = asGlob.ensureAuxInfo(_S(".SAVW")); subPath = asGlob.ensureAuxInfo(_S("SAVW"));
pathTag = BuildTagFromPath(subPath, m_backgroundBlender); pathTag = BuildTagFromPath(subPath, m_backgroundBlender);
m_tagToPath[pathTag] = subPath; m_tagToPath[pathTag] = subPath;
m_pathToTag[subPath.hash()] = pathTag; m_pathToTag[subPath.hash()] = pathTag;
@ -320,11 +320,6 @@ void ProjectResourceFactoryBase::BackgroundIndexProc()
hecl::FourCC type(node.m_seqChildren.at(0)->m_scalarString.c_str()); hecl::FourCC type(node.m_seqChildren.at(0)->m_scalarString.c_str());
hecl::ProjectPath path(m_proj->getProjectWorkingPath(), hecl::ProjectPath path(m_proj->getProjectWorkingPath(),
node.m_seqChildren.at(1)->m_scalarString); node.m_seqChildren.at(1)->m_scalarString);
if (node.m_seqChildren.size() >= 3)
{
hecl::SystemStringView sys(node.m_seqChildren[2]->m_scalarString);
path = path.ensureAuxInfo(sys.sys_str());
}
if (path.isFileOrGlob()) if (path.isFileOrGlob())
{ {

2
hecl

@ -1 +1 @@
Subproject commit 2cc14eaa3642f003b0c71945e23c4a70482c1bda Subproject commit 043e2eaae8e1ff9e40619bd8fa56597b4b29dde2