axmol/extensions/dragonbones/model/AnimationData.cpp

122 lines
2.8 KiB
C++

#include "AnimationData.h"
#include "ArmatureData.h"
#include "ConstraintData.h"
DRAGONBONES_NAMESPACE_BEGIN
void AnimationData::_onClear()
{
for (const auto& pair : boneTimelines)
{
for (const auto timeline : pair.second)
{
timeline->returnToPool();
}
}
for (const auto& pair : slotTimelines)
{
for (const auto timeline : pair.second)
{
timeline->returnToPool();
}
}
for (const auto& pair : constraintTimelines)
{
for (const auto timeline : pair.second)
{
timeline->returnToPool();
}
}
if (actionTimeline != nullptr)
{
actionTimeline->returnToPool();
}
if (zOrderTimeline != nullptr)
{
zOrderTimeline->returnToPool();
}
frameIntOffset = 0;
frameFloatOffset = 0;
frameOffset = 0;
frameCount = 0;
playTimes = 0;
duration = 0.0f;
scale = 1.0f;
fadeInTime = 0.0f;
cacheFrameRate = 0.0f;
name = "";
cachedFrames.clear();
boneTimelines.clear();
slotTimelines.clear();
constraintTimelines.clear();
boneCachedFrameIndices.clear();
slotCachedFrameIndices.clear();
parent = nullptr;
actionTimeline = nullptr;
zOrderTimeline = nullptr;
}
void AnimationData::cacheFrames(unsigned frameRate)
{
if (cacheFrameRate > 0.0f) // TODO clear cache.
{
return;
}
cacheFrameRate = std::max(std::ceil(frameRate * scale), 1.0f);
const auto cacheFrameCount = std::ceil(cacheFrameRate * duration) + 1; // Cache one more frame.
cachedFrames.resize(cacheFrameCount, false);
for (const auto bone : parent->sortedBones)
{
boneCachedFrameIndices[bone->name].resize(cacheFrameCount, -1);
}
for (const auto slot : parent->sortedSlots)
{
slotCachedFrameIndices[slot->name].resize(cacheFrameCount, -1);
}
}
void AnimationData::addBoneTimeline(BoneData* bone, TimelineData* value)
{
auto& timelines = boneTimelines[bone->name];
if(std::find(timelines.cbegin(), timelines.cend(), value) == timelines.cend())
{
timelines.push_back(value);
}
}
void AnimationData::addSlotTimeline(SlotData* slot, TimelineData* value)
{
auto& timelines = slotTimelines[slot->name];
if (std::find(timelines.cbegin(), timelines.cend(), value) == timelines.cend())
{
timelines.push_back(value);
}
}
void AnimationData::addConstraintTimeline(ConstraintData* constraint, TimelineData* value)
{
auto& timelines = constraintTimelines[constraint->name];
if (std::find(timelines.cbegin(), timelines.cend(), value) == timelines.cend())
{
timelines.push_back(value);
}
}
void TimelineData::_onClear()
{
type = TimelineType::BoneAll;
offset = 0;
frameIndicesOffset = -1;
}
DRAGONBONES_NAMESPACE_END