#ifndef Spine_SkeletonSerializer_h #define Spine_SkeletonSerializer_h #include #include "JsonWriter.h" #include #include namespace spine { class SkeletonSerializer { private: HashMap _visitedObjects; JsonWriter _json; public: SkeletonSerializer() {} ~SkeletonSerializer() {} String serializeSkeletonData(SkeletonData* data) { _visitedObjects.clear(); _json = JsonWriter(); writeSkeletonData(data); return _json.getString(); } String serializeSkeleton(Skeleton* skeleton) { _visitedObjects.clear(); _json = JsonWriter(); writeSkeleton(skeleton); return _json.getString(); } String serializeAnimationState(AnimationState* state) { _visitedObjects.clear(); _json = JsonWriter(); writeAnimationState(state); return _json.getString(); } private: void writeAnimation(Animation* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Animation"); _json.writeName("timelines"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getTimelines().size(); i++) { writeTimeline(obj->getTimelines()[i]); } _json.writeArrayEnd(); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeName("bones"); writeIntArray(obj->getBones()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeAlphaTimeline(AlphaTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("AlphaTimeline"); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeAttachmentTimeline(AttachmentTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("AttachmentTimeline"); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("attachmentNames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getAttachmentNames().size(); i++) { _json.writeValue(obj->getAttachmentNames()[i]); } _json.writeArrayEnd(); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeDeformTimeline(DeformTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("DeformTimeline"); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("attachment"); writeVertexAttachment(obj->getAttachment()); _json.writeName("vertices"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getVertices().size(); i++) { Array& nestedArray = obj->getVertices()[i]; _json.writeArrayStart(); for (size_t j = 0; j < nestedArray.size(); j++) { _json.writeValue(nestedArray[j]); } _json.writeArrayEnd(); } _json.writeArrayEnd(); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeDrawOrderTimeline(DrawOrderTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("DrawOrderTimeline"); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("drawOrders"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getDrawOrders().size(); i++) { Array& nestedArray = obj->getDrawOrders()[i]; _json.writeArrayStart(); for (size_t j = 0; j < nestedArray.size(); j++) { _json.writeValue(nestedArray[j]); } _json.writeArrayEnd(); } _json.writeArrayEnd(); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeEventTimeline(EventTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("EventTimeline"); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("events"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getEvents().size(); i++) { writeEvent(obj->getEvents()[i]); } _json.writeArrayEnd(); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeIkConstraintTimeline(IkConstraintTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("IkConstraintTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeInheritTimeline(InheritTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("InheritTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePathConstraintMixTimeline(PathConstraintMixTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraintMixTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePathConstraintPositionTimeline(PathConstraintPositionTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraintPositionTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePathConstraintSpacingTimeline(PathConstraintSpacingTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraintSpacingTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintDampingTimeline(PhysicsConstraintDampingTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintDampingTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintGravityTimeline(PhysicsConstraintGravityTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintGravityTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintInertiaTimeline(PhysicsConstraintInertiaTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintInertiaTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintMassTimeline(PhysicsConstraintMassTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintMassTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintMixTimeline(PhysicsConstraintMixTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintMixTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintResetTimeline(PhysicsConstraintResetTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintResetTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintStrengthTimeline(PhysicsConstraintStrengthTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintStrengthTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writePhysicsConstraintWindTimeline(PhysicsConstraintWindTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintWindTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeRGB2Timeline(RGB2Timeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RGB2Timeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeRGBA2Timeline(RGBA2Timeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RGBA2Timeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeRGBATimeline(RGBATimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RGBATimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeRGBTimeline(RGBTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RGBTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeRotateTimeline(RotateTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RotateTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeScaleTimeline(ScaleTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ScaleTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeScaleXTimeline(ScaleXTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ScaleXTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeScaleYTimeline(ScaleYTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ScaleYTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeSequenceTimeline(SequenceTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SequenceTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("slotIndex"); _json.writeValue(obj->getSlotIndex()); _json.writeName("attachment"); writeAttachment(obj->getAttachment()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeShearTimeline(ShearTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ShearTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeShearXTimeline(ShearXTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ShearXTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeShearYTimeline(ShearYTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ShearYTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeSliderMixTimeline(SliderMixTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SliderMixTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeSliderTimeline(SliderTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SliderTimeline"); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeTimeline(Timeline* obj) { if (obj->getRTTI().instanceOf(AlphaTimeline::rtti)) { writeAlphaTimeline((AlphaTimeline*)obj); } else if (obj->getRTTI().instanceOf(AttachmentTimeline::rtti)) { writeAttachmentTimeline((AttachmentTimeline*)obj); } else if (obj->getRTTI().instanceOf(DeformTimeline::rtti)) { writeDeformTimeline((DeformTimeline*)obj); } else if (obj->getRTTI().instanceOf(DrawOrderTimeline::rtti)) { writeDrawOrderTimeline((DrawOrderTimeline*)obj); } else if (obj->getRTTI().instanceOf(EventTimeline::rtti)) { writeEventTimeline((EventTimeline*)obj); } else if (obj->getRTTI().instanceOf(IkConstraintTimeline::rtti)) { writeIkConstraintTimeline((IkConstraintTimeline*)obj); } else if (obj->getRTTI().instanceOf(InheritTimeline::rtti)) { writeInheritTimeline((InheritTimeline*)obj); } else if (obj->getRTTI().instanceOf(PathConstraintMixTimeline::rtti)) { writePathConstraintMixTimeline((PathConstraintMixTimeline*)obj); } else if (obj->getRTTI().instanceOf(PathConstraintPositionTimeline::rtti)) { writePathConstraintPositionTimeline((PathConstraintPositionTimeline*)obj); } else if (obj->getRTTI().instanceOf(PathConstraintSpacingTimeline::rtti)) { writePathConstraintSpacingTimeline((PathConstraintSpacingTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintDampingTimeline::rtti)) { writePhysicsConstraintDampingTimeline((PhysicsConstraintDampingTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintGravityTimeline::rtti)) { writePhysicsConstraintGravityTimeline((PhysicsConstraintGravityTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintInertiaTimeline::rtti)) { writePhysicsConstraintInertiaTimeline((PhysicsConstraintInertiaTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintMassTimeline::rtti)) { writePhysicsConstraintMassTimeline((PhysicsConstraintMassTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintMixTimeline::rtti)) { writePhysicsConstraintMixTimeline((PhysicsConstraintMixTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintResetTimeline::rtti)) { writePhysicsConstraintResetTimeline((PhysicsConstraintResetTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintStrengthTimeline::rtti)) { writePhysicsConstraintStrengthTimeline((PhysicsConstraintStrengthTimeline*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintWindTimeline::rtti)) { writePhysicsConstraintWindTimeline((PhysicsConstraintWindTimeline*)obj); } else if (obj->getRTTI().instanceOf(RGB2Timeline::rtti)) { writeRGB2Timeline((RGB2Timeline*)obj); } else if (obj->getRTTI().instanceOf(RGBA2Timeline::rtti)) { writeRGBA2Timeline((RGBA2Timeline*)obj); } else if (obj->getRTTI().instanceOf(RGBATimeline::rtti)) { writeRGBATimeline((RGBATimeline*)obj); } else if (obj->getRTTI().instanceOf(RGBTimeline::rtti)) { writeRGBTimeline((RGBTimeline*)obj); } else if (obj->getRTTI().instanceOf(RotateTimeline::rtti)) { writeRotateTimeline((RotateTimeline*)obj); } else if (obj->getRTTI().instanceOf(ScaleTimeline::rtti)) { writeScaleTimeline((ScaleTimeline*)obj); } else if (obj->getRTTI().instanceOf(ScaleXTimeline::rtti)) { writeScaleXTimeline((ScaleXTimeline*)obj); } else if (obj->getRTTI().instanceOf(ScaleYTimeline::rtti)) { writeScaleYTimeline((ScaleYTimeline*)obj); } else if (obj->getRTTI().instanceOf(SequenceTimeline::rtti)) { writeSequenceTimeline((SequenceTimeline*)obj); } else if (obj->getRTTI().instanceOf(ShearTimeline::rtti)) { writeShearTimeline((ShearTimeline*)obj); } else if (obj->getRTTI().instanceOf(ShearXTimeline::rtti)) { writeShearXTimeline((ShearXTimeline*)obj); } else if (obj->getRTTI().instanceOf(ShearYTimeline::rtti)) { writeShearYTimeline((ShearYTimeline*)obj); } else if (obj->getRTTI().instanceOf(SliderMixTimeline::rtti)) { writeSliderMixTimeline((SliderMixTimeline*)obj); } else if (obj->getRTTI().instanceOf(SliderTimeline::rtti)) { writeSliderTimeline((SliderTimeline*)obj); } else if (obj->getRTTI().instanceOf(TransformConstraintTimeline::rtti)) { writeTransformConstraintTimeline((TransformConstraintTimeline*)obj); } else if (obj->getRTTI().instanceOf(TranslateTimeline::rtti)) { writeTranslateTimeline((TranslateTimeline*)obj); } else if (obj->getRTTI().instanceOf(TranslateXTimeline::rtti)) { writeTranslateXTimeline((TranslateXTimeline*)obj); } else if (obj->getRTTI().instanceOf(TranslateYTimeline::rtti)) { writeTranslateYTimeline((TranslateYTimeline*)obj); } else { fprintf(stderr, "Error: Unknown Timeline type\n"); exit(1); } } void writeTransformConstraintTimeline(TransformConstraintTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TransformConstraintTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("constraintIndex"); _json.writeValue(obj->getConstraintIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeTranslateTimeline(TranslateTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TranslateTimeline"); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeTranslateXTimeline(TranslateXTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TranslateXTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeTranslateYTimeline(TranslateYTimeline* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TranslateYTimeline"); _json.writeName("boneIndex"); _json.writeValue(obj->getBoneIndex()); _json.writeName("frameEntries"); _json.writeValue(obj->getFrameEntries()); _json.writeName("propertyIds"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPropertyIds().size(); i++) { _json.writeValue(obj->getPropertyIds()[i]); } _json.writeArrayEnd(); _json.writeName("frames"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getFrames().size(); i++) { _json.writeValue(obj->getFrames()[i]); } _json.writeArrayEnd(); _json.writeName("frameCount"); _json.writeValue(obj->getFrameCount()); _json.writeName("duration"); _json.writeValue(obj->getDuration()); _json.writeObjectEnd(); } void writeAnimationState(AnimationState* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("AnimationState"); _json.writeName("timeScale"); _json.writeValue(obj->getTimeScale()); _json.writeName("data"); writeAnimationStateData(obj->getData()); _json.writeName("tracks"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getTracks().size(); i++) { writeTrackEntry(obj->getTracks()[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeTrackEntry(TrackEntry* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TrackEntry"); _json.writeName("trackIndex"); _json.writeValue(obj->getTrackIndex()); _json.writeName("animation"); writeAnimation(obj->getAnimation()); _json.writeName("loop"); _json.writeValue(obj->getLoop()); _json.writeName("delay"); _json.writeValue(obj->getDelay()); _json.writeName("trackTime"); _json.writeValue(obj->getTrackTime()); _json.writeName("trackEnd"); _json.writeValue(obj->getTrackEnd()); _json.writeName("trackComplete"); _json.writeValue(obj->getTrackComplete()); _json.writeName("animationStart"); _json.writeValue(obj->getAnimationStart()); _json.writeName("animationEnd"); _json.writeValue(obj->getAnimationEnd()); _json.writeName("animationLast"); _json.writeValue(obj->getAnimationLast()); _json.writeName("animationTime"); _json.writeValue(obj->getAnimationTime()); _json.writeName("timeScale"); _json.writeValue(obj->getTimeScale()); _json.writeName("alpha"); _json.writeValue(obj->getAlpha()); _json.writeName("eventThreshold"); _json.writeValue(obj->getEventThreshold()); _json.writeName("alphaAttachmentThreshold"); _json.writeValue(obj->getAlphaAttachmentThreshold()); _json.writeName("mixAttachmentThreshold"); _json.writeValue(obj->getMixAttachmentThreshold()); _json.writeName("mixDrawOrderThreshold"); _json.writeValue(obj->getMixDrawOrderThreshold()); _json.writeName("next"); if (obj->getNext() == nullptr) { _json.writeNull(); } else { writeTrackEntry(obj->getNext()); } _json.writeName("previous"); if (obj->getPrevious() == nullptr) { _json.writeNull(); } else { writeTrackEntry(obj->getPrevious()); } _json.writeName("mixTime"); _json.writeValue(obj->getMixTime()); _json.writeName("mixDuration"); _json.writeValue(obj->getMixDuration()); _json.writeName("mixBlend"); _json.writeValue([&]() -> String { switch(obj->getMixBlend()) { case MixBlend_Setup: return "setup"; case MixBlend_First: return "first"; case MixBlend_Replace: return "replace"; case MixBlend_Add: return "add"; default: return "unknown"; } }()); _json.writeName("mixingFrom"); if (obj->getMixingFrom() == nullptr) { _json.writeNull(); } else { writeTrackEntry(obj->getMixingFrom()); } _json.writeName("mixingTo"); if (obj->getMixingTo() == nullptr) { _json.writeNull(); } else { writeTrackEntry(obj->getMixingTo()); } _json.writeName("holdPrevious"); _json.writeValue(obj->getHoldPrevious()); _json.writeName("shortestRotation"); _json.writeValue(obj->getShortestRotation()); _json.writeName("reverse"); _json.writeValue(obj->getReverse()); _json.writeObjectEnd(); } void writeAnimationStateData(AnimationStateData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("AnimationStateData"); _json.writeName("skeletonData"); writeSkeletonData(obj->getSkeletonData()); _json.writeName("defaultMix"); _json.writeValue(obj->getDefaultMix()); _json.writeObjectEnd(); } void writeAttachment(Attachment* obj) { if (obj->getRTTI().instanceOf(BoundingBoxAttachment::rtti)) { writeBoundingBoxAttachment((BoundingBoxAttachment*)obj); } else if (obj->getRTTI().instanceOf(ClippingAttachment::rtti)) { writeClippingAttachment((ClippingAttachment*)obj); } else if (obj->getRTTI().instanceOf(MeshAttachment::rtti)) { writeMeshAttachment((MeshAttachment*)obj); } else if (obj->getRTTI().instanceOf(PathAttachment::rtti)) { writePathAttachment((PathAttachment*)obj); } else if (obj->getRTTI().instanceOf(PointAttachment::rtti)) { writePointAttachment((PointAttachment*)obj); } else if (obj->getRTTI().instanceOf(RegionAttachment::rtti)) { writeRegionAttachment((RegionAttachment*)obj); } else { fprintf(stderr, "Error: Unknown Attachment type\n"); exit(1); } } void writeBone(Bone* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Bone"); _json.writeName("parent"); if (obj->getParent() == nullptr) { _json.writeNull(); } else { writeBone(obj->getParent()); } _json.writeName("children"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getChildren().size(); i++) { writeBone(obj->getChildren()[i]); } _json.writeArrayEnd(); _json.writeName("data"); writeBoneData(obj->getData()); _json.writeName("pose"); writeBoneLocal(obj->getPose()); _json.writeName("appliedPose"); writeBonePose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writeBoneData(BoneData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("BoneData"); _json.writeName("index"); _json.writeValue(obj->getIndex()); _json.writeName("parent"); if (obj->getParent() == nullptr) { _json.writeNull(); } else { writeBoneData(obj->getParent()); } _json.writeName("length"); _json.writeValue(obj->getLength()); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("icon"); _json.writeValue(obj->getIcon()); _json.writeName("visible"); _json.writeValue(obj->getVisible()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writeBoneLocal(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writeBoneLocal(BoneLocal* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("BoneLocal"); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("rotation"); _json.writeValue(obj->getRotation()); _json.writeName("scaleX"); _json.writeValue(obj->getScaleX()); _json.writeName("scaleY"); _json.writeValue(obj->getScaleY()); _json.writeName("shearX"); _json.writeValue(obj->getShearX()); _json.writeName("shearY"); _json.writeValue(obj->getShearY()); _json.writeName("inherit"); _json.writeValue([&]() -> String { switch(obj->getInherit()) { case Inherit_Normal: return "normal"; case Inherit_OnlyTranslation: return "onlyTranslation"; case Inherit_NoRotationOrReflection: return "noRotationOrReflection"; case Inherit_NoScale: return "noScale"; case Inherit_NoScaleOrReflection: return "noScaleOrReflection"; default: return "unknown"; } }()); _json.writeObjectEnd(); } void writeBonePose(BonePose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("BonePose"); _json.writeName("a"); _json.writeValue(obj->getA()); _json.writeName("b"); _json.writeValue(obj->getB()); _json.writeName("c"); _json.writeValue(obj->getC()); _json.writeName("d"); _json.writeValue(obj->getD()); _json.writeName("worldX"); _json.writeValue(obj->getWorldX()); _json.writeName("worldY"); _json.writeValue(obj->getWorldY()); _json.writeName("worldRotationX"); _json.writeValue(obj->getWorldRotationX()); _json.writeName("worldRotationY"); _json.writeValue(obj->getWorldRotationY()); _json.writeName("worldScaleX"); _json.writeValue(obj->getWorldScaleX()); _json.writeName("worldScaleY"); _json.writeValue(obj->getWorldScaleY()); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("rotation"); _json.writeValue(obj->getRotation()); _json.writeName("scaleX"); _json.writeValue(obj->getScaleX()); _json.writeName("scaleY"); _json.writeValue(obj->getScaleY()); _json.writeName("shearX"); _json.writeValue(obj->getShearX()); _json.writeName("shearY"); _json.writeValue(obj->getShearY()); _json.writeName("inherit"); _json.writeValue([&]() -> String { switch(obj->getInherit()) { case Inherit_Normal: return "normal"; case Inherit_OnlyTranslation: return "onlyTranslation"; case Inherit_NoRotationOrReflection: return "noRotationOrReflection"; case Inherit_NoScale: return "noScale"; case Inherit_NoScaleOrReflection: return "noScaleOrReflection"; default: return "unknown"; } }()); _json.writeObjectEnd(); } void writeBoundingBoxAttachment(BoundingBoxAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("BoundingBoxAttachment"); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { _json.writeValue(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("vertices"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getVertices().size(); i++) { _json.writeValue(obj->getVertices()[i]); } _json.writeArrayEnd(); _json.writeName("worldVerticesLength"); _json.writeValue(obj->getWorldVerticesLength()); _json.writeName("timelineAttachment"); if (obj->getTimelineAttachment() == nullptr) { _json.writeNull(); } else { writeAttachment(obj->getTimelineAttachment()); } _json.writeName("id"); _json.writeValue(obj->getId()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeClippingAttachment(ClippingAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ClippingAttachment"); _json.writeName("endSlot"); if (obj->getEndSlot() == nullptr) { _json.writeNull(); } else { writeSlotData(obj->getEndSlot()); } _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { _json.writeValue(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("vertices"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getVertices().size(); i++) { _json.writeValue(obj->getVertices()[i]); } _json.writeArrayEnd(); _json.writeName("worldVerticesLength"); _json.writeValue(obj->getWorldVerticesLength()); _json.writeName("timelineAttachment"); if (obj->getTimelineAttachment() == nullptr) { _json.writeNull(); } else { writeAttachment(obj->getTimelineAttachment()); } _json.writeName("id"); _json.writeValue(obj->getId()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeConstraint(Constraint* obj) { if (obj->getRTTI().instanceOf(IkConstraint::rtti)) { writeIkConstraint((IkConstraint*)obj); } else if (obj->getRTTI().instanceOf(PathConstraint::rtti)) { writePathConstraint((PathConstraint*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraint::rtti)) { writePhysicsConstraint((PhysicsConstraint*)obj); } else if (obj->getRTTI().instanceOf(Slider::rtti)) { writeSlider((Slider*)obj); } else if (obj->getRTTI().instanceOf(TransformConstraint::rtti)) { writeTransformConstraint((TransformConstraint*)obj); } else { fprintf(stderr, "Error: Unknown Constraint type\n"); exit(1); } } void writeConstraintData(ConstraintData* obj) { if (obj->getRTTI().instanceOf(IkConstraintData::rtti)) { writeIkConstraintData((IkConstraintData*)obj); } else if (obj->getRTTI().instanceOf(PathConstraintData::rtti)) { writePathConstraintData((PathConstraintData*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraintData::rtti)) { writePhysicsConstraintData((PhysicsConstraintData*)obj); } else if (obj->getRTTI().instanceOf(SliderData::rtti)) { writeSliderData((SliderData*)obj); } else if (obj->getRTTI().instanceOf(TransformConstraintData::rtti)) { writeTransformConstraintData((TransformConstraintData*)obj); } else { fprintf(stderr, "Error: Unknown ConstraintData type\n"); exit(1); } } void writeEvent(Event* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Event"); _json.writeName("int"); _json.writeValue(obj->getInt()); _json.writeName("float"); _json.writeValue(obj->getFloat()); _json.writeName("string"); _json.writeValue(obj->getString()); _json.writeName("volume"); _json.writeValue(obj->getVolume()); _json.writeName("balance"); _json.writeValue(obj->getBalance()); _json.writeName("time"); _json.writeValue(obj->getTime()); _json.writeName("data"); writeEventData(obj->getData()); _json.writeObjectEnd(); } void writeEventData(EventData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("EventData"); _json.writeName("int"); _json.writeValue(obj->getInt()); _json.writeName("float"); _json.writeValue(obj->getFloat()); _json.writeName("string"); _json.writeValue(obj->getString()); _json.writeName("audioPath"); _json.writeValue(obj->getAudioPath()); _json.writeName("volume"); _json.writeValue(obj->getVolume()); _json.writeName("balance"); _json.writeValue(obj->getBalance()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeIkConstraint(IkConstraint* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("IkConstraint"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBonePose(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("target"); writeBone(obj->getTarget()); _json.writeName("data"); writeIkConstraintData(obj->getData()); _json.writeName("pose"); writeIkConstraintPose(obj->getPose()); _json.writeName("appliedPose"); writeIkConstraintPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writeIkConstraintData(IkConstraintData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("IkConstraintData"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBoneData(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("target"); writeBoneData(obj->getTarget()); _json.writeName("uniform"); _json.writeValue(obj->getUniform()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writeIkConstraintPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writeIkConstraintPose(IkConstraintPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("IkConstraintPose"); _json.writeName("mix"); _json.writeValue(obj->getMix()); _json.writeName("softness"); _json.writeValue(obj->getSoftness()); _json.writeName("bendDirection"); _json.writeValue(obj->getBendDirection()); _json.writeName("compress"); _json.writeValue(obj->getCompress()); _json.writeName("stretch"); _json.writeValue(obj->getStretch()); _json.writeObjectEnd(); } void writeMeshAttachment(MeshAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("MeshAttachment"); _json.writeName("region"); if (obj->getRegion() == nullptr) { _json.writeNull(); } else { writeTextureRegion(obj->getRegion()); } _json.writeName("triangles"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getTriangles().size(); i++) { _json.writeValue(obj->getTriangles()[i]); } _json.writeArrayEnd(); _json.writeName("regionUVs"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getRegionUVs().size(); i++) { _json.writeValue(obj->getRegionUVs()[i]); } _json.writeArrayEnd(); _json.writeName("uVs"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getUVs().size(); i++) { _json.writeValue(obj->getUVs()[i]); } _json.writeArrayEnd(); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("path"); _json.writeValue(obj->getPath()); _json.writeName("hullLength"); _json.writeValue(obj->getHullLength()); _json.writeName("edges"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getEdges().size(); i++) { _json.writeValue(obj->getEdges()[i]); } _json.writeArrayEnd(); _json.writeName("width"); _json.writeValue(obj->getWidth()); _json.writeName("height"); _json.writeValue(obj->getHeight()); _json.writeName("sequence"); if (obj->getSequence() == nullptr) { _json.writeNull(); } else { writeSequence(obj->getSequence()); } _json.writeName("parentMesh"); if (obj->getParentMesh() == nullptr) { _json.writeNull(); } else { writeMeshAttachment(obj->getParentMesh()); } _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { _json.writeValue(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("vertices"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getVertices().size(); i++) { _json.writeValue(obj->getVertices()[i]); } _json.writeArrayEnd(); _json.writeName("worldVerticesLength"); _json.writeValue(obj->getWorldVerticesLength()); _json.writeName("timelineAttachment"); if (obj->getTimelineAttachment() == nullptr) { _json.writeNull(); } else { writeAttachment(obj->getTimelineAttachment()); } _json.writeName("id"); _json.writeValue(obj->getId()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writePathAttachment(PathAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathAttachment"); _json.writeName("closed"); _json.writeValue(obj->getClosed()); _json.writeName("constantSpeed"); _json.writeValue(obj->getConstantSpeed()); _json.writeName("lengths"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getLengths().size(); i++) { _json.writeValue(obj->getLengths()[i]); } _json.writeArrayEnd(); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { _json.writeValue(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("vertices"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getVertices().size(); i++) { _json.writeValue(obj->getVertices()[i]); } _json.writeArrayEnd(); _json.writeName("worldVerticesLength"); _json.writeValue(obj->getWorldVerticesLength()); _json.writeName("timelineAttachment"); if (obj->getTimelineAttachment() == nullptr) { _json.writeNull(); } else { writeAttachment(obj->getTimelineAttachment()); } _json.writeName("id"); _json.writeValue(obj->getId()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writePathConstraint(PathConstraint* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraint"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBonePose(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("slot"); writeSlot(obj->getSlot()); _json.writeName("data"); writePathConstraintData(obj->getData()); _json.writeName("pose"); writePathConstraintPose(obj->getPose()); _json.writeName("appliedPose"); writePathConstraintPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writePathConstraintData(PathConstraintData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraintData"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBoneData(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("slot"); writeSlotData(obj->getSlot()); _json.writeName("positionMode"); _json.writeValue([&]() -> String { switch(obj->getPositionMode()) { case PositionMode_Fixed: return "fixed"; case PositionMode_Percent: return "percent"; default: return "unknown"; } }()); _json.writeName("spacingMode"); _json.writeValue([&]() -> String { switch(obj->getSpacingMode()) { case SpacingMode_Length: return "length"; case SpacingMode_Fixed: return "fixed"; case SpacingMode_Percent: return "percent"; case SpacingMode_Proportional: return "proportional"; default: return "unknown"; } }()); _json.writeName("rotateMode"); _json.writeValue([&]() -> String { switch(obj->getRotateMode()) { case RotateMode_Tangent: return "tangent"; case RotateMode_Chain: return "chain"; case RotateMode_ChainScale: return "chainScale"; default: return "unknown"; } }()); _json.writeName("offsetRotation"); _json.writeValue(obj->getOffsetRotation()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writePathConstraintPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writePathConstraintPose(PathConstraintPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PathConstraintPose"); _json.writeName("position"); _json.writeValue(obj->getPosition()); _json.writeName("spacing"); _json.writeValue(obj->getSpacing()); _json.writeName("mixRotate"); _json.writeValue(obj->getMixRotate()); _json.writeName("mixX"); _json.writeValue(obj->getMixX()); _json.writeName("mixY"); _json.writeValue(obj->getMixY()); _json.writeObjectEnd(); } void writePhysicsConstraint(PhysicsConstraint* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraint"); _json.writeName("bone"); writeBonePose(obj->getBone()); _json.writeName("data"); writePhysicsConstraintData(obj->getData()); _json.writeName("pose"); writePhysicsConstraintPose(obj->getPose()); _json.writeName("appliedPose"); writePhysicsConstraintPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writePhysicsConstraintData(PhysicsConstraintData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintData"); _json.writeName("bone"); writeBoneData(obj->getBone()); _json.writeName("step"); _json.writeValue(obj->getStep()); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("rotate"); _json.writeValue(obj->getRotate()); _json.writeName("scaleX"); _json.writeValue(obj->getScaleX()); _json.writeName("shearX"); _json.writeValue(obj->getShearX()); _json.writeName("limit"); _json.writeValue(obj->getLimit()); _json.writeName("inertiaGlobal"); _json.writeValue(obj->getInertiaGlobal()); _json.writeName("strengthGlobal"); _json.writeValue(obj->getStrengthGlobal()); _json.writeName("dampingGlobal"); _json.writeValue(obj->getDampingGlobal()); _json.writeName("massGlobal"); _json.writeValue(obj->getMassGlobal()); _json.writeName("windGlobal"); _json.writeValue(obj->getWindGlobal()); _json.writeName("gravityGlobal"); _json.writeValue(obj->getGravityGlobal()); _json.writeName("mixGlobal"); _json.writeValue(obj->getMixGlobal()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writePhysicsConstraintPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writePhysicsConstraintPose(PhysicsConstraintPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PhysicsConstraintPose"); _json.writeName("inertia"); _json.writeValue(obj->getInertia()); _json.writeName("strength"); _json.writeValue(obj->getStrength()); _json.writeName("damping"); _json.writeValue(obj->getDamping()); _json.writeName("massInverse"); _json.writeValue(obj->getMassInverse()); _json.writeName("wind"); _json.writeValue(obj->getWind()); _json.writeName("gravity"); _json.writeValue(obj->getGravity()); _json.writeName("mix"); _json.writeValue(obj->getMix()); _json.writeObjectEnd(); } void writePointAttachment(PointAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("PointAttachment"); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("rotation"); _json.writeValue(obj->getRotation()); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeRegionAttachment(RegionAttachment* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("RegionAttachment"); _json.writeName("region"); if (obj->getRegion() == nullptr) { _json.writeNull(); } else { writeTextureRegion(obj->getRegion()); } _json.writeName("offset"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getOffset().size(); i++) { _json.writeValue(obj->getOffset()[i]); } _json.writeArrayEnd(); _json.writeName("uVs"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getUVs().size(); i++) { _json.writeValue(obj->getUVs()[i]); } _json.writeArrayEnd(); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("scaleX"); _json.writeValue(obj->getScaleX()); _json.writeName("scaleY"); _json.writeValue(obj->getScaleY()); _json.writeName("rotation"); _json.writeValue(obj->getRotation()); _json.writeName("width"); _json.writeValue(obj->getWidth()); _json.writeName("height"); _json.writeValue(obj->getHeight()); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("path"); _json.writeValue(obj->getPath()); _json.writeName("sequence"); if (obj->getSequence() == nullptr) { _json.writeNull(); } else { writeSequence(obj->getSequence()); } _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeObjectEnd(); } void writeSequence(Sequence* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Sequence"); _json.writeName("start"); _json.writeValue(obj->getStart()); _json.writeName("digits"); _json.writeValue(obj->getDigits()); _json.writeName("setupIndex"); _json.writeValue(obj->getSetupIndex()); _json.writeName("regions"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getRegions().size(); i++) { writeTextureRegion(obj->getRegions()[i]); } _json.writeArrayEnd(); _json.writeName("id"); _json.writeValue(obj->getId()); _json.writeObjectEnd(); } void writeSkeleton(Skeleton* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Skeleton"); _json.writeName("data"); writeSkeletonData(obj->getData()); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBone(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("updateCache"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getUpdateCache().size(); i++) { writeUpdate(obj->getUpdateCache()[i]); } _json.writeArrayEnd(); _json.writeName("rootBone"); writeBone(obj->getRootBone()); _json.writeName("slots"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getSlots().size(); i++) { writeSlot(obj->getSlots()[i]); } _json.writeArrayEnd(); _json.writeName("drawOrder"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getDrawOrder().size(); i++) { writeSlot(obj->getDrawOrder()[i]); } _json.writeArrayEnd(); _json.writeName("skin"); if (obj->getSkin() == nullptr) { _json.writeNull(); } else { writeSkin(obj->getSkin()); } _json.writeName("constraints"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getConstraints().size(); i++) { writeConstraint(obj->getConstraints()[i]); } _json.writeArrayEnd(); _json.writeName("physicsConstraints"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getPhysicsConstraints().size(); i++) { writePhysicsConstraint(obj->getPhysicsConstraints()[i]); } _json.writeArrayEnd(); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("scaleX"); _json.writeValue(obj->getScaleX()); _json.writeName("scaleY"); _json.writeValue(obj->getScaleY()); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("windX"); _json.writeValue(obj->getWindX()); _json.writeName("windY"); _json.writeValue(obj->getWindY()); _json.writeName("gravityX"); _json.writeValue(obj->getGravityX()); _json.writeName("gravityY"); _json.writeValue(obj->getGravityY()); _json.writeName("time"); _json.writeValue(obj->getTime()); _json.writeObjectEnd(); } void writeSkeletonData(SkeletonData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SkeletonData"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBoneData(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("slots"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getSlots().size(); i++) { writeSlotData(obj->getSlots()[i]); } _json.writeArrayEnd(); _json.writeName("defaultSkin"); if (obj->getDefaultSkin() == nullptr) { _json.writeNull(); } else { writeSkin(obj->getDefaultSkin()); } _json.writeName("skins"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getSkins().size(); i++) { writeSkin(obj->getSkins()[i]); } _json.writeArrayEnd(); _json.writeName("events"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getEvents().size(); i++) { writeEventData(obj->getEvents()[i]); } _json.writeArrayEnd(); _json.writeName("animations"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getAnimations().size(); i++) { writeAnimation(obj->getAnimations()[i]); } _json.writeArrayEnd(); _json.writeName("constraints"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getConstraints().size(); i++) { writeConstraintData(obj->getConstraints()[i]); } _json.writeArrayEnd(); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("x"); _json.writeValue(obj->getX()); _json.writeName("y"); _json.writeValue(obj->getY()); _json.writeName("width"); _json.writeValue(obj->getWidth()); _json.writeName("height"); _json.writeValue(obj->getHeight()); _json.writeName("referenceScale"); _json.writeValue(obj->getReferenceScale()); _json.writeName("version"); _json.writeValue(obj->getVersion()); _json.writeName("hash"); _json.writeValue(obj->getHash()); _json.writeName("imagesPath"); _json.writeValue(obj->getImagesPath()); _json.writeName("audioPath"); _json.writeValue(obj->getAudioPath()); _json.writeName("fps"); _json.writeValue(obj->getFps()); _json.writeObjectEnd(); } void writeSkin(Skin* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Skin"); _json.writeName("attachments"); _json.writeArrayStart(); Skin::AttachmentMap::Entries entries = obj->getAttachments(); while (entries.hasNext()) { Skin::AttachmentMap::Entry& entry = entries.next(); writeSkinEntry(&entry); } _json.writeArrayEnd(); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { BoneData* item = obj->getBones()[i]; writeBoneData(item); } _json.writeArrayEnd(); _json.writeName("constraints"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getConstraints().size(); i++) { ConstraintData* item = obj->getConstraints()[i]; writeConstraintData(item); } _json.writeArrayEnd(); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("color"); writeColor(&obj->getColor()); _json.writeObjectEnd(); } void writeSkinEntry(Skin::AttachmentMap::Entry* obj) { _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SkinEntry"); _json.writeName("slotIndex"); _json.writeValue((int)obj->_slotIndex); _json.writeName("name"); _json.writeValue(obj->_name); _json.writeName("attachment"); writeAttachment(obj->_attachment); _json.writeObjectEnd(); } void writeSlider(Slider* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Slider"); _json.writeName("bone"); writeBone(obj->getBone()); _json.writeName("data"); writeSliderData(obj->getData()); _json.writeName("pose"); writeSliderPose(obj->getPose()); _json.writeName("appliedPose"); writeSliderPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writeSliderData(SliderData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SliderData"); _json.writeName("animation"); writeAnimation(obj->getAnimation()); _json.writeName("additive"); _json.writeValue(obj->getAdditive()); _json.writeName("loop"); _json.writeValue(obj->getLoop()); _json.writeName("bone"); if (obj->getBone() == nullptr) { _json.writeNull(); } else { writeBoneData(obj->getBone()); } _json.writeName("property"); if (obj->getProperty() == nullptr) { _json.writeNull(); } else { writeFromProperty(obj->getProperty()); } _json.writeName("offset"); _json.writeValue(obj->getOffset()); _json.writeName("scale"); _json.writeValue(obj->getScale()); _json.writeName("local"); _json.writeValue(obj->getLocal()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writeSliderPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writeSliderPose(SliderPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SliderPose"); _json.writeName("time"); _json.writeValue(obj->getTime()); _json.writeName("mix"); _json.writeValue(obj->getMix()); _json.writeObjectEnd(); } void writeSlot(Slot* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("Slot"); _json.writeName("bone"); writeBone(obj->getBone()); _json.writeName("data"); writeSlotData(obj->getData()); _json.writeName("pose"); writeSlotPose(obj->getPose()); _json.writeName("appliedPose"); writeSlotPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writeSlotData(SlotData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SlotData"); _json.writeName("index"); _json.writeValue(obj->getIndex()); _json.writeName("boneData"); writeBoneData(obj->getBoneData()); _json.writeName("attachmentName"); _json.writeValue(obj->getAttachmentName()); _json.writeName("blendMode"); _json.writeValue([&]() -> String { switch(obj->getBlendMode()) { case BlendMode_Normal: return "normal"; case BlendMode_Additive: return "additive"; case BlendMode_Multiply: return "multiply"; case BlendMode_Screen: return "screen"; default: return "unknown"; } }()); _json.writeName("visible"); _json.writeValue(obj->getVisible()); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writeSlotPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writeSlotPose(SlotPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("SlotPose"); _json.writeName("color"); writeColor(obj->getColor()); _json.writeName("darkColor"); if (obj->hasDarkColor()) { writeColor(&obj->getDarkColor()); } else { _json.writeNull(); } _json.writeName("attachment"); if (obj->getAttachment() == nullptr) { _json.writeNull(); } else { writeAttachment(obj->getAttachment()); } _json.writeName("sequenceIndex"); _json.writeValue(obj->getSequenceIndex()); _json.writeName("deform"); writeFloatArray(obj->getDeform()); _json.writeObjectEnd(); } void writeTransformConstraint(TransformConstraint* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TransformConstraint"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBonePose(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("source"); writeBone(obj->getSource()); _json.writeName("data"); writeTransformConstraintData(obj->getData()); _json.writeName("pose"); writeTransformConstraintPose(obj->getPose()); _json.writeName("appliedPose"); writeTransformConstraintPose(obj->getAppliedPose()); _json.writeObjectEnd(); } void writeTransformConstraintData(TransformConstraintData* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TransformConstraintData"); _json.writeName("bones"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getBones().size(); i++) { writeBoneData(obj->getBones()[i]); } _json.writeArrayEnd(); _json.writeName("source"); writeBoneData(obj->getSource()); _json.writeName("offsetRotation"); _json.writeValue(obj->getOffsetRotation()); _json.writeName("offsetX"); _json.writeValue(obj->getOffsetX()); _json.writeName("offsetY"); _json.writeValue(obj->getOffsetY()); _json.writeName("offsetScaleX"); _json.writeValue(obj->getOffsetScaleX()); _json.writeName("offsetScaleY"); _json.writeValue(obj->getOffsetScaleY()); _json.writeName("offsetShearY"); _json.writeValue(obj->getOffsetShearY()); _json.writeName("localSource"); _json.writeValue(obj->getLocalSource()); _json.writeName("localTarget"); _json.writeValue(obj->getLocalTarget()); _json.writeName("additive"); _json.writeValue(obj->getAdditive()); _json.writeName("clamp"); _json.writeValue(obj->getClamp()); _json.writeName("properties"); _json.writeArrayStart(); for (size_t i = 0; i < obj->getProperties().size(); i++) { writeFromProperty(obj->getProperties()[i]); } _json.writeArrayEnd(); _json.writeName("name"); _json.writeValue(obj->getName()); _json.writeName("setupPose"); writeTransformConstraintPose(obj->getSetupPose()); _json.writeName("skinRequired"); _json.writeValue(obj->getSkinRequired()); _json.writeObjectEnd(); } void writeFromProperty(FromProperty* obj) { if (obj->getRTTI().instanceOf(FromRotate::rtti)) { writeFromRotate((FromRotate*)obj); } else if (obj->getRTTI().instanceOf(FromScaleX::rtti)) { writeFromScaleX((FromScaleX*)obj); } else if (obj->getRTTI().instanceOf(FromScaleY::rtti)) { writeFromScaleY((FromScaleY*)obj); } else if (obj->getRTTI().instanceOf(FromShearY::rtti)) { writeFromShearY((FromShearY*)obj); } else if (obj->getRTTI().instanceOf(FromX::rtti)) { writeFromX((FromX*)obj); } else if (obj->getRTTI().instanceOf(FromY::rtti)) { writeFromY((FromY*)obj); } else { fprintf(stderr, "Error: Unknown FromProperty type\n"); exit(1); } } void writeFromRotate(FromRotate* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromRotate"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeFromScaleX(FromScaleX* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromScaleX"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeFromScaleY(FromScaleY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromScaleY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeFromShearY(FromShearY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromShearY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeFromX(FromX* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromX"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeFromY(FromY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("FromY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("to"); _json.writeArrayStart(); for (size_t i = 0; i < obj->_to.size(); i++) { writeToProperty(obj->_to[i]); } _json.writeArrayEnd(); _json.writeObjectEnd(); } void writeToProperty(ToProperty* obj) { if (obj->getRTTI().instanceOf(ToRotate::rtti)) { writeToRotate((ToRotate*)obj); } else if (obj->getRTTI().instanceOf(ToScaleX::rtti)) { writeToScaleX((ToScaleX*)obj); } else if (obj->getRTTI().instanceOf(ToScaleY::rtti)) { writeToScaleY((ToScaleY*)obj); } else if (obj->getRTTI().instanceOf(ToShearY::rtti)) { writeToShearY((ToShearY*)obj); } else if (obj->getRTTI().instanceOf(ToX::rtti)) { writeToX((ToX*)obj); } else if (obj->getRTTI().instanceOf(ToY::rtti)) { writeToY((ToY*)obj); } else { fprintf(stderr, "Error: Unknown ToProperty type\n"); exit(1); } } void writeToRotate(ToRotate* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToRotate"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeToScaleX(ToScaleX* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToScaleX"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeToScaleY(ToScaleY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToScaleY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeToShearY(ToShearY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToShearY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeToX(ToX* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToX"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeToY(ToY* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("ToY"); _json.writeName("offset"); _json.writeValue(obj->_offset); _json.writeName("max"); _json.writeValue(obj->_max); _json.writeName("scale"); _json.writeValue(obj->_scale); _json.writeObjectEnd(); } void writeTransformConstraintPose(TransformConstraintPose* obj) { if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; } _visitedObjects.put(obj, true); _json.writeObjectStart(); _json.writeName("type"); _json.writeValue("TransformConstraintPose"); _json.writeName("mixRotate"); _json.writeValue(obj->getMixRotate()); _json.writeName("mixX"); _json.writeValue(obj->getMixX()); _json.writeName("mixY"); _json.writeValue(obj->getMixY()); _json.writeName("mixScaleX"); _json.writeValue(obj->getMixScaleX()); _json.writeName("mixScaleY"); _json.writeValue(obj->getMixScaleY()); _json.writeName("mixShearY"); _json.writeValue(obj->getMixShearY()); _json.writeObjectEnd(); } void writeUpdate(Update* obj) { if (obj->getRTTI().instanceOf(BonePose::rtti)) { writeBonePose((BonePose*)obj); } else if (obj->getRTTI().instanceOf(IkConstraint::rtti)) { writeIkConstraint((IkConstraint*)obj); } else if (obj->getRTTI().instanceOf(PathConstraint::rtti)) { writePathConstraint((PathConstraint*)obj); } else if (obj->getRTTI().instanceOf(PhysicsConstraint::rtti)) { writePhysicsConstraint((PhysicsConstraint*)obj); } else if (obj->getRTTI().instanceOf(Slider::rtti)) { writeSlider((Slider*)obj); } else if (obj->getRTTI().instanceOf(TransformConstraint::rtti)) { writeTransformConstraint((TransformConstraint*)obj); } else { fprintf(stderr, "Error: Unknown Update type\n"); exit(1); } } void writeVertexAttachment(VertexAttachment* obj) { if (obj->getRTTI().instanceOf(BoundingBoxAttachment::rtti)) { writeBoundingBoxAttachment((BoundingBoxAttachment*)obj); } else if (obj->getRTTI().instanceOf(ClippingAttachment::rtti)) { writeClippingAttachment((ClippingAttachment*)obj); } else if (obj->getRTTI().instanceOf(MeshAttachment::rtti)) { writeMeshAttachment((MeshAttachment*)obj); } else if (obj->getRTTI().instanceOf(PathAttachment::rtti)) { writePathAttachment((PathAttachment*)obj); } else { fprintf(stderr, "Error: Unknown VertexAttachment type\n"); exit(1); } } // Custom helper methods void writeColor(Color* obj) { if (obj == nullptr) { _json.writeNull(); } else { _json.writeObjectStart(); _json.writeName("r"); _json.writeValue(obj->r); _json.writeName("g"); _json.writeValue(obj->g); _json.writeName("b"); _json.writeValue(obj->b); _json.writeName("a"); _json.writeValue(obj->a); _json.writeObjectEnd(); } } void writeColor(const Color& obj) { _json.writeObjectStart(); _json.writeName("r"); _json.writeValue(obj.r); _json.writeName("g"); _json.writeValue(obj.g); _json.writeName("b"); _json.writeValue(obj.b); _json.writeName("a"); _json.writeValue(obj.a); _json.writeObjectEnd(); } void writeTextureRegion(TextureRegion* obj) { if (obj == nullptr) { _json.writeNull(); } else { _json.writeObjectStart(); _json.writeName("u"); _json.writeValue(obj->getU()); _json.writeName("v"); _json.writeValue(obj->getV()); _json.writeName("u2"); _json.writeValue(obj->getU2()); _json.writeName("v2"); _json.writeValue(obj->getV2()); _json.writeName("width"); _json.writeValue(obj->getRegionWidth()); _json.writeName("height"); _json.writeValue(obj->getRegionHeight()); _json.writeObjectEnd(); } } void writeTextureRegion(const TextureRegion& obj) { _json.writeObjectStart(); _json.writeName("u"); _json.writeValue(obj.getU()); _json.writeName("v"); _json.writeValue(obj.getV()); _json.writeName("u2"); _json.writeValue(obj.getU2()); _json.writeName("v2"); _json.writeValue(obj.getV2()); _json.writeName("width"); _json.writeValue(obj.getRegionWidth()); _json.writeName("height"); _json.writeValue(obj.getRegionHeight()); _json.writeObjectEnd(); } void writeIntArray(const Array& obj) { _json.writeArrayStart(); for (size_t i = 0; i < obj.size(); i++) { _json.writeValue(obj[i]); } _json.writeArrayEnd(); } void writeFloatArray(const Array& obj) { _json.writeArrayStart(); for (size_t i = 0; i < obj.size(); i++) { _json.writeValue(obj[i]); } _json.writeArrayEnd(); } // Reference versions of write methods void writeAnimation(const Animation& obj) { writeAnimation(const_cast(&obj)); } void writeAlphaTimeline(const AlphaTimeline& obj) { writeAlphaTimeline(const_cast(&obj)); } void writeAttachmentTimeline(const AttachmentTimeline& obj) { writeAttachmentTimeline(const_cast(&obj)); } void writeDeformTimeline(const DeformTimeline& obj) { writeDeformTimeline(const_cast(&obj)); } void writeDrawOrderTimeline(const DrawOrderTimeline& obj) { writeDrawOrderTimeline(const_cast(&obj)); } void writeEventTimeline(const EventTimeline& obj) { writeEventTimeline(const_cast(&obj)); } void writeIkConstraintTimeline(const IkConstraintTimeline& obj) { writeIkConstraintTimeline(const_cast(&obj)); } void writeInheritTimeline(const InheritTimeline& obj) { writeInheritTimeline(const_cast(&obj)); } void writePathConstraintMixTimeline(const PathConstraintMixTimeline& obj) { writePathConstraintMixTimeline(const_cast(&obj)); } void writePathConstraintPositionTimeline(const PathConstraintPositionTimeline& obj) { writePathConstraintPositionTimeline(const_cast(&obj)); } void writePathConstraintSpacingTimeline(const PathConstraintSpacingTimeline& obj) { writePathConstraintSpacingTimeline(const_cast(&obj)); } void writePhysicsConstraintDampingTimeline(const PhysicsConstraintDampingTimeline& obj) { writePhysicsConstraintDampingTimeline(const_cast(&obj)); } void writePhysicsConstraintGravityTimeline(const PhysicsConstraintGravityTimeline& obj) { writePhysicsConstraintGravityTimeline(const_cast(&obj)); } void writePhysicsConstraintInertiaTimeline(const PhysicsConstraintInertiaTimeline& obj) { writePhysicsConstraintInertiaTimeline(const_cast(&obj)); } void writePhysicsConstraintMassTimeline(const PhysicsConstraintMassTimeline& obj) { writePhysicsConstraintMassTimeline(const_cast(&obj)); } void writePhysicsConstraintMixTimeline(const PhysicsConstraintMixTimeline& obj) { writePhysicsConstraintMixTimeline(const_cast(&obj)); } void writePhysicsConstraintResetTimeline(const PhysicsConstraintResetTimeline& obj) { writePhysicsConstraintResetTimeline(const_cast(&obj)); } void writePhysicsConstraintStrengthTimeline(const PhysicsConstraintStrengthTimeline& obj) { writePhysicsConstraintStrengthTimeline(const_cast(&obj)); } void writePhysicsConstraintWindTimeline(const PhysicsConstraintWindTimeline& obj) { writePhysicsConstraintWindTimeline(const_cast(&obj)); } void writeRGB2Timeline(const RGB2Timeline& obj) { writeRGB2Timeline(const_cast(&obj)); } void writeRGBA2Timeline(const RGBA2Timeline& obj) { writeRGBA2Timeline(const_cast(&obj)); } void writeRGBATimeline(const RGBATimeline& obj) { writeRGBATimeline(const_cast(&obj)); } void writeRGBTimeline(const RGBTimeline& obj) { writeRGBTimeline(const_cast(&obj)); } void writeRotateTimeline(const RotateTimeline& obj) { writeRotateTimeline(const_cast(&obj)); } void writeScaleTimeline(const ScaleTimeline& obj) { writeScaleTimeline(const_cast(&obj)); } void writeScaleXTimeline(const ScaleXTimeline& obj) { writeScaleXTimeline(const_cast(&obj)); } void writeScaleYTimeline(const ScaleYTimeline& obj) { writeScaleYTimeline(const_cast(&obj)); } void writeSequenceTimeline(const SequenceTimeline& obj) { writeSequenceTimeline(const_cast(&obj)); } void writeShearTimeline(const ShearTimeline& obj) { writeShearTimeline(const_cast(&obj)); } void writeShearXTimeline(const ShearXTimeline& obj) { writeShearXTimeline(const_cast(&obj)); } void writeShearYTimeline(const ShearYTimeline& obj) { writeShearYTimeline(const_cast(&obj)); } void writeSliderMixTimeline(const SliderMixTimeline& obj) { writeSliderMixTimeline(const_cast(&obj)); } void writeSliderTimeline(const SliderTimeline& obj) { writeSliderTimeline(const_cast(&obj)); } void writeTransformConstraintTimeline(const TransformConstraintTimeline& obj) { writeTransformConstraintTimeline(const_cast(&obj)); } void writeTranslateTimeline(const TranslateTimeline& obj) { writeTranslateTimeline(const_cast(&obj)); } void writeTranslateXTimeline(const TranslateXTimeline& obj) { writeTranslateXTimeline(const_cast(&obj)); } void writeTranslateYTimeline(const TranslateYTimeline& obj) { writeTranslateYTimeline(const_cast(&obj)); } void writeAnimationState(const AnimationState& obj) { writeAnimationState(const_cast(&obj)); } void writeTrackEntry(const TrackEntry& obj) { writeTrackEntry(const_cast(&obj)); } void writeAnimationStateData(const AnimationStateData& obj) { writeAnimationStateData(const_cast(&obj)); } void writeBone(const Bone& obj) { writeBone(const_cast(&obj)); } void writeBoneData(const BoneData& obj) { writeBoneData(const_cast(&obj)); } void writeBoneLocal(const BoneLocal& obj) { writeBoneLocal(const_cast(&obj)); } void writeBonePose(const BonePose& obj) { writeBonePose(const_cast(&obj)); } void writeBoundingBoxAttachment(const BoundingBoxAttachment& obj) { writeBoundingBoxAttachment(const_cast(&obj)); } void writeClippingAttachment(const ClippingAttachment& obj) { writeClippingAttachment(const_cast(&obj)); } void writeEvent(const Event& obj) { writeEvent(const_cast(&obj)); } void writeEventData(const EventData& obj) { writeEventData(const_cast(&obj)); } void writeIkConstraint(const IkConstraint& obj) { writeIkConstraint(const_cast(&obj)); } void writeIkConstraintData(const IkConstraintData& obj) { writeIkConstraintData(const_cast(&obj)); } void writeIkConstraintPose(const IkConstraintPose& obj) { writeIkConstraintPose(const_cast(&obj)); } void writeMeshAttachment(const MeshAttachment& obj) { writeMeshAttachment(const_cast(&obj)); } void writePathAttachment(const PathAttachment& obj) { writePathAttachment(const_cast(&obj)); } void writePathConstraint(const PathConstraint& obj) { writePathConstraint(const_cast(&obj)); } void writePathConstraintData(const PathConstraintData& obj) { writePathConstraintData(const_cast(&obj)); } void writePathConstraintPose(const PathConstraintPose& obj) { writePathConstraintPose(const_cast(&obj)); } void writePhysicsConstraint(const PhysicsConstraint& obj) { writePhysicsConstraint(const_cast(&obj)); } void writePhysicsConstraintData(const PhysicsConstraintData& obj) { writePhysicsConstraintData(const_cast(&obj)); } void writePhysicsConstraintPose(const PhysicsConstraintPose& obj) { writePhysicsConstraintPose(const_cast(&obj)); } void writePointAttachment(const PointAttachment& obj) { writePointAttachment(const_cast(&obj)); } void writeRegionAttachment(const RegionAttachment& obj) { writeRegionAttachment(const_cast(&obj)); } void writeSequence(const Sequence& obj) { writeSequence(const_cast(&obj)); } void writeSkeleton(const Skeleton& obj) { writeSkeleton(const_cast(&obj)); } void writeSkeletonData(const SkeletonData& obj) { writeSkeletonData(const_cast(&obj)); } void writeSlider(const Slider& obj) { writeSlider(const_cast(&obj)); } void writeSliderData(const SliderData& obj) { writeSliderData(const_cast(&obj)); } void writeSliderPose(const SliderPose& obj) { writeSliderPose(const_cast(&obj)); } void writeSlot(const Slot& obj) { writeSlot(const_cast(&obj)); } void writeSlotData(const SlotData& obj) { writeSlotData(const_cast(&obj)); } void writeSlotPose(const SlotPose& obj) { writeSlotPose(const_cast(&obj)); } void writeTransformConstraint(const TransformConstraint& obj) { writeTransformConstraint(const_cast(&obj)); } void writeTransformConstraintData(const TransformConstraintData& obj) { writeTransformConstraintData(const_cast(&obj)); } void writeFromRotate(const FromRotate& obj) { writeFromRotate(const_cast(&obj)); } void writeFromScaleX(const FromScaleX& obj) { writeFromScaleX(const_cast(&obj)); } void writeFromScaleY(const FromScaleY& obj) { writeFromScaleY(const_cast(&obj)); } void writeFromShearY(const FromShearY& obj) { writeFromShearY(const_cast(&obj)); } void writeFromX(const FromX& obj) { writeFromX(const_cast(&obj)); } void writeFromY(const FromY& obj) { writeFromY(const_cast(&obj)); } void writeToRotate(const ToRotate& obj) { writeToRotate(const_cast(&obj)); } void writeToScaleX(const ToScaleX& obj) { writeToScaleX(const_cast(&obj)); } void writeToScaleY(const ToScaleY& obj) { writeToScaleY(const_cast(&obj)); } void writeToShearY(const ToShearY& obj) { writeToShearY(const_cast(&obj)); } void writeToX(const ToX& obj) { writeToX(const_cast(&obj)); } void writeToY(const ToY& obj) { writeToY(const_cast(&obj)); } void writeTransformConstraintPose(const TransformConstraintPose& obj) { writeTransformConstraintPose(const_cast(&obj)); } }; } // namespace spine #endif