2016-04-11 07:10:28 +00:00
|
|
|
#include "IMetaAnim.hpp"
|
|
|
|
#include "CCharAnimTime.hpp"
|
|
|
|
#include "IAnimReader.hpp"
|
|
|
|
#include "CBoolPOINode.hpp"
|
2016-08-27 21:16:44 +00:00
|
|
|
#include "CAnimTreeNode.hpp"
|
2016-04-11 07:10:28 +00:00
|
|
|
|
|
|
|
namespace urde
|
|
|
|
{
|
|
|
|
|
|
|
|
std::shared_ptr<CAnimTreeNode>
|
|
|
|
IMetaAnim::GetAnimationTree(const CAnimSysContext& animSys,
|
|
|
|
const CMetaAnimTreeBuildOrders& orders) const
|
|
|
|
{
|
2017-12-20 06:06:54 +00:00
|
|
|
if (orders.x44_singleAdvance)
|
2016-08-27 21:16:44 +00:00
|
|
|
{
|
|
|
|
std::shared_ptr<CAnimTreeNode> tree =
|
|
|
|
VGetAnimationTree(animSys, CMetaAnimTreeBuildOrders::NoSpecialOrders());
|
2017-12-20 06:06:54 +00:00
|
|
|
if (orders.x44_singleAdvance->IsTime() || orders.x44_singleAdvance->IsString())
|
2016-08-27 21:16:44 +00:00
|
|
|
{
|
2017-12-20 06:06:54 +00:00
|
|
|
CCharAnimTime time = GetTime(*orders.x44_singleAdvance, *tree);
|
2016-08-27 21:16:44 +00:00
|
|
|
AdvanceAnim(*tree, time);
|
|
|
|
}
|
|
|
|
return tree;
|
|
|
|
}
|
|
|
|
return VGetAnimationTree(animSys, CMetaAnimTreeBuildOrders::NoSpecialOrders());
|
2016-04-11 07:10:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void IMetaAnim::AdvanceAnim(IAnimReader& anim, const CCharAnimTime& dt)
|
|
|
|
{
|
|
|
|
CCharAnimTime remDt = dt;
|
|
|
|
while (remDt > CCharAnimTime())
|
|
|
|
{
|
|
|
|
SAdvancementResults res = anim.VAdvanceView(remDt);
|
|
|
|
remDt = res.x0_remTime;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
CCharAnimTime IMetaAnim::GetTime(const CPreAdvanceIndicator& ind, const IAnimReader& anim)
|
|
|
|
{
|
|
|
|
if (ind.IsTime())
|
|
|
|
return ind.GetTime();
|
|
|
|
|
|
|
|
CBoolPOINode nodes[64];
|
2016-04-11 07:47:21 +00:00
|
|
|
CCharAnimTime rem = anim.VGetTimeRemaining();
|
|
|
|
u32 count = anim.VGetBoolPOIList(rem, nodes, 64, 0, 0);
|
|
|
|
const char* cmpStr = ind.GetString();
|
|
|
|
for (u32 i=0 ; i<count ; ++i)
|
|
|
|
{
|
|
|
|
CBoolPOINode& node = nodes[i];
|
2016-09-11 18:40:33 +00:00
|
|
|
if (node.GetString().compare(cmpStr) || !node.GetValue())
|
2016-04-11 07:47:21 +00:00
|
|
|
continue;
|
|
|
|
return node.GetTime();
|
|
|
|
}
|
2016-04-11 07:10:28 +00:00
|
|
|
|
2016-04-11 07:47:21 +00:00
|
|
|
return {};
|
2016-04-11 07:10:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|