mirror of https://github.com/axmolengine/axmol.git
122 lines
2.9 KiB
C++
122 lines
2.9 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
|