2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-15 00:46:08 +00:00

Reimplement CSkinRules/CSkinnedModel; skinning kinda works!

This commit is contained in:
2022-03-10 01:33:17 -05:00
parent 8714fbf844
commit cd963c4a5c
35 changed files with 346 additions and 284 deletions

View File

@@ -4,7 +4,8 @@
namespace metaforce {
CPoseAsTransforms::CPoseAsTransforms(u8 boneCount) : x1_count(boneCount), xd0_transformArr(new Transform[boneCount]) {}
CPoseAsTransforms::CPoseAsTransforms(u8 boneCount)
: x1_count(boneCount), xd0_transformArr(std::make_unique<zeus::CTransform[]>(boneCount)) {}
bool CPoseAsTransforms::ContainsDataFor(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
@@ -24,32 +25,23 @@ void CPoseAsTransforms::AccumulateScaledTransform(const CSegId& id, zeus::CMatri
const zeus::CTransform& CPoseAsTransforms::GetTransform(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
assert(link.second.IsValid());
return xd0_transformArr[link.second].m_originToAccum;
}
const zeus::CTransform& CPoseAsTransforms::GetRestToAccumTransform(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
assert(link.second.IsValid());
return xd0_transformArr[link.second].m_restPoseToAccum;
return xd0_transformArr[link.second];
}
const zeus::CVector3f& CPoseAsTransforms::GetOffset(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
assert(link.second.IsValid());
return xd0_transformArr[link.second].m_originToAccum.origin;
return xd0_transformArr[link.second].origin;
}
const zeus::CMatrix3f& CPoseAsTransforms::GetRotation(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
assert(link.second.IsValid());
return xd0_transformArr[link.second].m_originToAccum.basis;
return xd0_transformArr[link.second].basis;
}
void CPoseAsTransforms::Insert(const CSegId& id, const zeus::CMatrix3f& rotation, const zeus::CVector3f& offset,
const zeus::CVector3f& restOffset) {
Transform& xfOut = xd0_transformArr[x0_nextId];
xfOut.m_originToAccum = zeus::CTransform(rotation, offset);
xfOut.m_restPoseToAccum = xfOut.m_originToAccum * zeus::CTransform::Translate(-restOffset);
void CPoseAsTransforms::Insert(const CSegId& id, const zeus::CMatrix3f& rotation, const zeus::CVector3f& offset) {
xd0_transformArr[x0_nextId] = zeus::CTransform(rotation, offset);
std::pair<CSegId, CSegId>& link = x8_links[id];
link.first = xd4_lastInserted;
@@ -58,4 +50,10 @@ void CPoseAsTransforms::Insert(const CSegId& id, const zeus::CMatrix3f& rotation
++x0_nextId;
}
CSegId CPoseAsTransforms::GetParent(const CSegId& id) const {
const std::pair<CSegId, CSegId>& link = x8_links[id];
assert(link.first.IsValid());
return link.first;
}
} // namespace metaforce