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
Cpp11BracedListStyle: true
NamespaceIndentation: None
ReflowComments: true
BinPackArguments: true
BinPackParameters: true
SortIncludes: false

View File

@ -2,6 +2,7 @@
namespace DataSpec
{
extern hecl::Database::DataSpecEntry SpecEntMP1;
extern hecl::Database::DataSpecEntry SpecEntMP1PC;
namespace DNAMP1
@ -1075,6 +1076,7 @@ bool ANCS::Extract(const SpecBase& dataSpec,
bool ANCS::Cook(const hecl::ProjectPath& outPath,
const hecl::ProjectPath& inPath,
const DNAANCS::Actor& actor,
hecl::BlenderConnection::DataStream& ds,
const std::function<bool(const hecl::ProjectPath& modelPath)>& modelCookFunc)
{
/* Search for yaml */
@ -1138,30 +1140,52 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
});
std::unordered_map<std::string, atInt32> boneIdMap;
std::experimental::optional<DNAANIM::RigInverter<CINF>> rigInv;
/* Write out CINF resources */
for (const DNAANCS::Actor::Armature& arm : actor.armatures)
{
{
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);
if (w.hasError())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),
pathOut.getRelativePath().c_str());
CINF cinf(arm, boneIdMap);
cinf.write(w);
if (!rigInv)
{
auto matrices = ds.getBoneMatrices(arm.name);
rigInv.emplace(cinf, matrices);
}
}
ds.close();
/* Write out CSKR resources */
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)
Log.report(logvisor::Fatal, _S("unable to resolve '%s'"), modelPath.getRelativePath().c_str());
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))
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();
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);
if (skinOut.hasError())
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::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())
Log.report(logvisor::Fatal, _S("unable to open '%s' for writing"),
pathOut.getRelativePath().c_str());
ANIM anim(act, boneIdMap);
cookedOut.getRelativePath().c_str());
ANIM anim(act, boneIdMap, *rigInv);
ancs.animationSet.animResources.emplace_back();
ancs.animationSet.animResources.back().animId = pathOut;
@ -1245,7 +1271,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath,
fclose(fp);
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);
if (w.hasError())
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,
const hecl::ProjectPath& inPath,
const DNAANCS::Actor& actor,
hecl::BlenderConnection::DataStream& ds,
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);
}
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);
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());
for (const BlenderAction::Channel::Key& key : chan.keys)
{
rotVals.emplace_back(key.rotation.val.vec[0],
key.rotation.val.vec[1],
key.rotation.val.vec[2],
key.rotation.val.vec[3]);
zeus::CQuaternion q(key.rotation.val);
q = rig.restoreRotation(newChan.id, q);
rotVals.emplace_back(q.w, q.x, q.y, q.z);
}
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());
for (const BlenderAction::Channel::Key& key : chan.keys)
{
transVals.emplace_back(key.position.val.vec[0],
key.position.val.vec[1],
key.position.val.vec[2]);
zeus::CVector3f pos(key.position.val);
pos = rig.restorePosition(newChan.id, pos, true);
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;
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())
{
int curId = 4;
RecursiveAddArmatureBone(armature, armature.getChild(bone, 0), 3, curId, idMap, nameMap);
RecursiveAddArmatureBone(armature, bone, 3, curId, idMap, nameMap);
}
bones.emplace_back();

View File

@ -354,7 +354,7 @@ struct SpecMP1 : SpecBase
BlendStream& ds, bool fast, hecl::BlenderToken& btok,
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(hecl::SysFormat(_S("%d"), surfCount).c_str());
@ -371,7 +371,7 @@ struct SpecMP1 : SpecBase
FCookProgress progress)
{
Actor actor = ds.compileActor();
DNAMP1::ANCS::Cook(out, in, actor,
DNAMP1::ANCS::Cook(out, in, actor, ds,
[&](const hecl::ProjectPath& modelPath) -> bool
{
hecl::ProjectPath cooked;

View File

@ -26,6 +26,8 @@ namespace urde
void ViewManager::BuildTestPART(urde::IObjectStore& objStore)
{
m_modelTest = objStore.GetObj("MP1/Shared/CMDL_B2B41738.blend");
CModel* ridley = m_modelTest.GetObj();
#if 1
SObjectTag samusCharSet = m_projManager.TagFromPath(_S("MP1/Shared/ANCS_77289A4A.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);
//m_modelTest = objStore.GetObj("gun_cmdl");
m_modelTest = objStore.GetObj("MP1/Shared/CMDL_B2B41738.blend");
//m_modelTest = objStore.GetObj("CMDL_GameCube");
//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