Character cooking fixes

This commit is contained in:
Jack Andersen 2016-08-21 14:11:18 -10:00
parent 5eab081c60
commit bf049843e1
11 changed files with 57 additions and 26 deletions

View File

@ -22,7 +22,6 @@ AlwaysBreakAfterDefinitionReturnType: None
AllowShortFunctionsOnASingleLine: All AllowShortFunctionsOnASingleLine: All
Cpp11BracedListStyle: true Cpp11BracedListStyle: true
NamespaceIndentation: None NamespaceIndentation: None
ReflowComments: true
BinPackArguments: true BinPackArguments: true
BinPackParameters: true BinPackParameters: true
SortIncludes: false SortIncludes: false

View File

@ -2,6 +2,7 @@
namespace DataSpec namespace DataSpec
{ {
extern hecl::Database::DataSpecEntry SpecEntMP1;
extern hecl::Database::DataSpecEntry SpecEntMP1PC; extern hecl::Database::DataSpecEntry SpecEntMP1PC;
namespace DNAMP1 namespace DNAMP1
@ -1075,6 +1076,7 @@ bool ANCS::Extract(const SpecBase& dataSpec,
bool ANCS::Cook(const hecl::ProjectPath& outPath, bool ANCS::Cook(const hecl::ProjectPath& outPath,
const hecl::ProjectPath& inPath, const hecl::ProjectPath& inPath,
const DNAANCS::Actor& actor, const DNAANCS::Actor& actor,
hecl::BlenderConnection::DataStream& ds,
const std::function<bool(const hecl::ProjectPath& modelPath)>& modelCookFunc) const std::function<bool(const hecl::ProjectPath& modelPath)>& modelCookFunc)
{ {
/* Search for yaml */ /* Search for yaml */
@ -1138,30 +1140,52 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
}); });
std::unordered_map<std::string, atInt32> boneIdMap; std::unordered_map<std::string, atInt32> boneIdMap;
std::experimental::optional<DNAANIM::RigInverter<CINF>> rigInv;
/* Write out CINF resources */ /* Write out CINF resources */
for (const DNAANCS::Actor::Armature& arm : actor.armatures) for (const DNAANCS::Actor::Armature& arm : actor.armatures)
{ {
hecl::SystemStringView sysStr(arm.name); hecl::SystemStringView sysStr(arm.name);
hecl::ProjectPath pathOut = inPath.getWithExtension((_S('.') + sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("CINF")); hecl::ProjectPath pathOut = inPath.getCookedPath(SpecEntMP1).getWithExtension((_S('.') +
sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("CINF"));
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"),
pathOut.getRelativePath().c_str()); pathOut.getRelativePath().c_str());
CINF cinf(arm, boneIdMap); CINF cinf(arm, boneIdMap);
cinf.write(w); cinf.write(w);
if (!rigInv)
{
auto matrices = ds.getBoneMatrices(arm.name);
rigInv.emplace(cinf, matrices);
}
} }
ds.close();
/* Write out CSKR resources */ /* Write out CSKR resources */
for (ANCS::CharacterSet::CharacterInfo& ch : ancs.characterSet.characters) for (ANCS::CharacterSet::CharacterInfo& ch : ancs.characterSet.characters)
{ {
hecl::ProjectPath modelPath = UniqueIDBridge::TranslatePakIdToPath(ch.cmdl); const DNAANCS::Actor::Subtype* subtype = nullptr;
for (const DNAANCS::Actor::Subtype& sub : actor.subtypes)
{
if (!sub.name.compare(ch.name))
{
subtype = &sub;
break;
}
}
if (!subtype)
Log.report(logvisor::Fatal, "unable to find subtype '%s'", ch.name.c_str());
const hecl::ProjectPath& modelPath = subtype->mesh;
if (modelPath.getPathType() != hecl::ProjectPath::Type::File) if (modelPath.getPathType() != hecl::ProjectPath::Type::File)
Log.report(logvisor::Fatal, _S("unable to resolve '%s'"), modelPath.getRelativePath().c_str()); Log.report(logvisor::Fatal, _S("unable to resolve '%s'"), modelPath.getRelativePath().c_str());
hecl::ProjectPath skinIntPath = modelPath.getCookedPath(SpecEntMP1PC).getWithExtension(_S(".skinint")); hecl::ProjectPath skinIntPath = modelPath.getCookedPath(SpecEntMP1PC).getWithExtension(_S(".skinint"));
if (skinIntPath.getModtime() < modelPath.getModtime()) if (skinIntPath.getPathType() != hecl::ProjectPath::Type::File ||
skinIntPath.getModtime() < modelPath.getModtime())
if (!modelCookFunc(modelPath)) if (!modelCookFunc(modelPath))
Log.report(logvisor::Fatal, _S("unable to cook '%s'"), modelPath.getRelativePath().c_str()); Log.report(logvisor::Fatal, _S("unable to cook '%s'"), modelPath.getRelativePath().c_str());
@ -1194,7 +1218,8 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
skinIO.close(); skinIO.close();
hecl::SystemStringView sysStr(ch.name); hecl::SystemStringView sysStr(ch.name);
hecl::ProjectPath skinPath = inPath.getCookedPath(SpecEntMP1PC).getWithExtension((_S('.') + sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("CSKR")); hecl::ProjectPath skinPath = inPath.getCookedPath(SpecEntMP1PC).getWithExtension((_S('.') +
sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("CSKR"));
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"),
@ -1222,11 +1247,12 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
{ {
hecl::SystemStringView sysStr(act.name); hecl::SystemStringView sysStr(act.name);
hecl::ProjectPath pathOut = inPath.getWithExtension((_S('.') + sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("ANIM")); hecl::ProjectPath pathOut = inPath.getWithExtension((_S('.') + sysStr.sys_str()).c_str(), true).ensureAuxInfo(_S("ANIM"));
athena::io::FileWriter w(pathOut.getAbsolutePath(), true, false); hecl::ProjectPath cookedOut = inPath.getCookedPath(SpecEntMP1).getWithExtension((_S('.') + sysStr.sys_str()).c_str(), true);
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"),
pathOut.getRelativePath().c_str()); cookedOut.getRelativePath().c_str());
ANIM anim(act, boneIdMap); ANIM anim(act, boneIdMap, *rigInv);
ancs.animationSet.animResources.emplace_back(); ancs.animationSet.animResources.emplace_back();
ancs.animationSet.animResources.back().animId = pathOut; ancs.animationSet.animResources.back().animId = pathOut;
@ -1245,7 +1271,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
fclose(fp); fclose(fp);
anim.m_anim->evnt = evntYamlPath; anim.m_anim->evnt = evntYamlPath;
hecl::ProjectPath evntYamlOut = pathOut.getWithExtension(_S(".evnt")); hecl::ProjectPath evntYamlOut = cookedOut.getWithExtension(_S(".evnt"));
athena::io::FileWriter w(evntYamlOut.getAbsolutePath(), true, false); athena::io::FileWriter w(evntYamlOut.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

@ -539,6 +539,7 @@ struct ANCS : BigYAML
static bool Cook(const hecl::ProjectPath& outPath, static bool Cook(const hecl::ProjectPath& outPath,
const hecl::ProjectPath& inPath, const hecl::ProjectPath& inPath,
const DNAANCS::Actor& actor, const DNAANCS::Actor& actor,
hecl::BlenderConnection::DataStream& ds,
const std::function<bool(const hecl::ProjectPath& modelPath)>& modelCookFunc); const std::function<bool(const hecl::ProjectPath& modelPath)>& modelCookFunc);
}; };

View File

@ -422,7 +422,9 @@ size_t ANIM::ANIM2::binarySize(size_t __isz) const
return __isz + DNAANIM::ComputeBitstreamSize(frames.size(), channels); return __isz + DNAANIM::ComputeBitstreamSize(frames.size(), channels);
} }
ANIM::ANIM(const BlenderAction& act, const std::unordered_map<std::string, atInt32>& idMap) ANIM::ANIM(const BlenderAction& act,
const std::unordered_map<std::string, atInt32>& idMap,
const DNAANIM::RigInverter<CINF>& rig)
{ {
m_anim.reset(new struct ANIM0); m_anim.reset(new struct ANIM0);
IANIM& newAnim = *m_anim; IANIM& newAnim = *m_anim;
@ -465,10 +467,9 @@ ANIM::ANIM(const BlenderAction& act, const std::unordered_map<std::string, atInt
rotVals.reserve(chan.keys.size()); rotVals.reserve(chan.keys.size());
for (const BlenderAction::Channel::Key& key : chan.keys) for (const BlenderAction::Channel::Key& key : chan.keys)
{ {
rotVals.emplace_back(key.rotation.val.vec[0], zeus::CQuaternion q(key.rotation.val);
key.rotation.val.vec[1], q = rig.restoreRotation(newChan.id, q);
key.rotation.val.vec[2], rotVals.emplace_back(q.w, q.x, q.y, q.z);
key.rotation.val.vec[3]);
} }
if (chan.attrMask & 0x2) if (chan.attrMask & 0x2)
@ -483,9 +484,9 @@ ANIM::ANIM(const BlenderAction& act, const std::unordered_map<std::string, atInt
transVals.reserve(chan.keys.size()); transVals.reserve(chan.keys.size());
for (const BlenderAction::Channel::Key& key : chan.keys) for (const BlenderAction::Channel::Key& key : chan.keys)
{ {
transVals.emplace_back(key.position.val.vec[0], zeus::CVector3f pos(key.position.val);
key.position.val.vec[1], pos = rig.restorePosition(newChan.id, pos, true);
key.position.val.vec[2]); transVals.emplace_back(pos.x, pos.y, pos.z);
} }
} }
} }

View File

@ -182,7 +182,9 @@ struct ANIM : BigDNA
using BlenderAction = hecl::BlenderConnection::DataStream::Actor::Action; using BlenderAction = hecl::BlenderConnection::DataStream::Actor::Action;
ANIM() = default; ANIM() = default;
ANIM(const BlenderAction& act, const std::unordered_map<std::string, atInt32>& idMap); ANIM(const BlenderAction& act,
const std::unordered_map<std::string, atInt32>& idMap,
const DNAANIM::RigInverter<CINF>& rig);
}; };
} }

View File

@ -135,7 +135,7 @@ CINF::CINF(const Armature& armature, std::unordered_map<std::string, atInt32>& i
if (bone->children.size()) if (bone->children.size())
{ {
int curId = 4; int curId = 4;
RecursiveAddArmatureBone(armature, armature.getChild(bone, 0), 3, curId, idMap, nameMap); RecursiveAddArmatureBone(armature, bone, 3, curId, idMap, nameMap);
} }
bones.emplace_back(); bones.emplace_back();

View File

@ -354,7 +354,7 @@ struct SpecMP1 : SpecBase
BlendStream& ds, bool fast, hecl::BlenderToken& btok, BlendStream& ds, bool fast, hecl::BlenderToken& btok,
FCookProgress progress) FCookProgress progress)
{ {
Mesh mesh = ds.compileMesh(fast ? hecl::HMDLTopology::Triangles : hecl::HMDLTopology::TriStrips, -1, Mesh mesh = ds.compileMesh(fast ? hecl::HMDLTopology::Triangles : hecl::HMDLTopology::TriStrips, m_pc ? 16 : -1,
[&progress](int surfCount) [&progress](int surfCount)
{ {
progress(hecl::SysFormat(_S("%d"), surfCount).c_str()); progress(hecl::SysFormat(_S("%d"), surfCount).c_str());
@ -371,7 +371,7 @@ struct SpecMP1 : SpecBase
FCookProgress progress) FCookProgress progress)
{ {
Actor actor = ds.compileActor(); Actor actor = ds.compileActor();
DNAMP1::ANCS::Cook(out, in, actor, DNAMP1::ANCS::Cook(out, in, actor, ds,
[&](const hecl::ProjectPath& modelPath) -> bool [&](const hecl::ProjectPath& modelPath) -> bool
{ {
hecl::ProjectPath cooked; hecl::ProjectPath cooked;

View File

@ -26,6 +26,8 @@ namespace urde
void ViewManager::BuildTestPART(urde::IObjectStore& objStore) void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
{ {
m_modelTest = objStore.GetObj("MP1/Shared/CMDL_B2B41738.blend");
CModel* ridley = m_modelTest.GetObj();
#if 1 #if 1
SObjectTag samusCharSet = m_projManager.TagFromPath(_S("MP1/Shared/ANCS_77289A4A.blend")); SObjectTag samusCharSet = m_projManager.TagFromPath(_S("MP1/Shared/ANCS_77289A4A.blend"));
SObjectTag platModel = m_projManager.TagFromPath(_S("MP1/Shared/CMDL_6FA561D0.blend")); SObjectTag platModel = m_projManager.TagFromPath(_S("MP1/Shared/CMDL_6FA561D0.blend"));
@ -41,7 +43,7 @@ void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
auto areaData = m_projManager.resourceFactoryMP1().LoadResourceSync(areaTag); auto areaData = m_projManager.resourceFactoryMP1().LoadResourceSync(areaTag);
//m_modelTest = objStore.GetObj("gun_cmdl"); //m_modelTest = objStore.GetObj("gun_cmdl");
m_modelTest = objStore.GetObj("MP1/Shared/CMDL_B2B41738.blend");
//m_modelTest = objStore.GetObj("CMDL_GameCube"); //m_modelTest = objStore.GetObj("CMDL_GameCube");
//m_partGenDesc = objStore.GetObj({hecl::FOURCC('PART'), 0x972A5CD2}); //m_partGenDesc = objStore.GetObj({hecl::FOURCC('PART'), 0x972A5CD2});

2
amuse

@ -1 +1 @@
Subproject commit 055e73183ac86ee9bedb65802149516bd2d821a1 Subproject commit 28cac7ff8373e0386d44492f27e717d6dee0e44a

2
hecl

@ -1 +1 @@
Subproject commit 667c476f2e78ac6aedef9faba4783ade01dfbd47 Subproject commit 3bc81a3fe2711d9d7817e6f24afe7e29ca5e99d3

@ -1 +1 @@
Subproject commit 4260ea58f19648d6548b0c25488bfb8b47d0263b Subproject commit 5e695dab622d5095120224297b3c2fea4b3b85ca