| 146 | } |
| 147 | |
| 148 | ArmatureData* JSONDataParser::_parseArmature(const rapidjson::Value& rawData, float scale) |
| 149 | { |
| 150 | const auto armature = BaseObject::borrowObject<ArmatureData>(); |
| 151 | armature->name = _getString(rawData, NAME, ""); |
| 152 | armature->frameRate = _getNumber(rawData, FRAME_RATE, _data->frameRate); |
| 153 | armature->scale = scale; |
| 154 | |
| 155 | if (rawData.HasMember(TYPE) && rawData[TYPE].IsString()) |
| 156 | { |
| 157 | armature->type = _getArmatureType(rawData[TYPE].GetString()); |
| 158 | } |
| 159 | else |
| 160 | { |
| 161 | armature->type = (ArmatureType)_getNumber(rawData, TYPE, (int)ArmatureType::Armature); |
| 162 | } |
| 163 | |
| 164 | if (armature->frameRate == 0) // Data error. |
| 165 | { |
| 166 | armature->frameRate = 24; |
| 167 | } |
| 168 | |
| 169 | _armature = armature; |
| 170 | |
| 171 | if (rawData.HasMember(CANVAS)) |
| 172 | { |
| 173 | const auto& rawCanvas = rawData[CANVAS]; |
| 174 | const auto canvas = BaseObject::borrowObject<CanvasData>(); |
| 175 | canvas->hasBackground = rawCanvas.HasMember(COLOR); |
| 176 | canvas->color = _getNumber(rawCanvas, COLOR, 0); |
| 177 | canvas->aabb.x = _getNumber(rawCanvas, X, 0.0f) * armature->scale; |
| 178 | canvas->aabb.y = _getNumber(rawCanvas, Y, 0.0f) * armature->scale; |
| 179 | canvas->aabb.width = _getNumber(rawCanvas, WIDTH, 0.0f) * armature->scale; |
| 180 | canvas->aabb.height = _getNumber(rawCanvas, HEIGHT, 0.0f) * armature->scale; |
| 181 | // |
| 182 | armature->canvas = canvas; |
| 183 | } |
| 184 | |
| 185 | if (rawData.HasMember(AABB)) |
| 186 | { |
| 187 | const auto& rawAABB = rawData[AABB]; |
| 188 | armature->aabb.x = _getNumber(rawAABB, X, 0.0f) * armature->scale; |
| 189 | armature->aabb.y = _getNumber(rawAABB, Y, 0.0f) * armature->scale; |
| 190 | armature->aabb.width = _getNumber(rawAABB, WIDTH, 0.0f) * armature->scale; |
| 191 | armature->aabb.height = _getNumber(rawAABB, HEIGHT, 0.0f) * armature->scale; |
| 192 | } |
| 193 | |
| 194 | if (rawData.HasMember(BONE)) |
| 195 | { |
| 196 | const auto& rawBones = rawData[BONE]; |
| 197 | for (std::size_t i = 0, l = rawBones.Size(); i < l; ++i) |
| 198 | { |
| 199 | const auto& rawBone = rawBones[(rapidjson::SizeType)i]; |
| 200 | const auto& parentName = _getString(rawBone, PARENT, ""); |
| 201 | const auto bone = _parseBone(rawBone); |
| 202 | |
| 203 | if (!parentName.empty()) // Get bone parent. |
| 204 | { |
| 205 | const auto parent = armature->getBone(parentName); |
nothing calls this directly
no test coverage detected