| 93 | } |
| 94 | |
| 95 | AnimationData* BinaryDataParser::_parseAnimation(const rapidjson::Value& rawData) |
| 96 | { |
| 97 | const auto animation = BaseObject::borrowObject<AnimationData>(); |
| 98 | animation->frameCount = std::max(_getNumber(rawData, DURATION, 1), 1); |
| 99 | animation->playTimes = _getNumber(rawData, PLAY_TIMES, 1); |
| 100 | animation->duration = (float)(animation->frameCount) / _armature->frameRate; // float |
| 101 | animation->fadeInTime = _getNumber(rawData, FADE_IN_TIME, 0.0f); |
| 102 | animation->scale = _getNumber(rawData, SCALE, 1.0f); |
| 103 | animation->name = _getString(rawData, NAME, DEFAULT_NAME); |
| 104 | if (animation->name.empty()) |
| 105 | { |
| 106 | animation->name = DEFAULT_NAME; |
| 107 | } |
| 108 | |
| 109 | // Offsets. |
| 110 | const auto& offsets = rawData[OFFSET]; |
| 111 | animation->frameIntOffset = offsets[0].GetUint(); |
| 112 | animation->frameFloatOffset = offsets[1].GetUint(); |
| 113 | animation->frameOffset = offsets[2].GetUint(); |
| 114 | |
| 115 | _animation = animation; |
| 116 | |
| 117 | if (rawData.HasMember(ACTION)) |
| 118 | { |
| 119 | animation->actionTimeline = _parseBinaryTimeline(TimelineType::Action, rawData[ACTION].GetUint()); |
| 120 | } |
| 121 | |
| 122 | if (rawData.HasMember(Z_ORDER)) |
| 123 | { |
| 124 | animation->zOrderTimeline = _parseBinaryTimeline(TimelineType::ZOrder, rawData[Z_ORDER].GetUint()); |
| 125 | } |
| 126 | |
| 127 | if (rawData.HasMember(BONE)) |
| 128 | { |
| 129 | const auto& rawTimeliness = rawData[BONE]; |
| 130 | for (auto iterator = rawTimeliness.MemberBegin(); iterator != rawTimeliness.MemberEnd(); ++iterator) |
| 131 | { |
| 132 | const auto bone = _armature->getBone(iterator->name.GetString()); |
| 133 | if (bone == nullptr) |
| 134 | { |
| 135 | continue; |
| 136 | } |
| 137 | |
| 138 | const auto& rawTimelines = *&(iterator->value); |
| 139 | for (std::size_t i = 0, l = rawTimelines.Size(); i < l; i += 2) |
| 140 | { |
| 141 | const auto timelineType = (TimelineType)rawTimelines[(rapidjson::SizeType)i].GetInt(); |
| 142 | const auto timelineOffset = rawTimelines[(rapidjson::SizeType)i + 1].GetUint(); |
| 143 | const auto timeline = _parseBinaryTimeline(timelineType, timelineOffset); |
| 144 | _animation->addBoneTimeline(bone, timeline); |
| 145 | } |
| 146 | } |
| 147 | } |
| 148 | |
| 149 | if (rawData.HasMember(SLOT)) |
| 150 | { |
| 151 | const auto& rawTimeliness = rawData[SLOT]; |
| 152 | for (auto iterator = rawTimeliness.MemberBegin(); iterator != rawTimeliness.MemberEnd(); ++iterator) |
nothing calls this directly
no test coverage detected