diff --git a/spine-cpp/tests/SkeletonSerializer.h b/spine-cpp/tests/SkeletonSerializer.h index 9ccf71a35..5dfc539bb 100644 --- a/spine-cpp/tests/SkeletonSerializer.h +++ b/spine-cpp/tests/SkeletonSerializer.h @@ -10,7 +10,8 @@ namespace spine { class SkeletonSerializer { private: - HashMap _visitedObjects; + HashMap _visitedObjects; + int _nextId; JsonWriter _json; public: @@ -21,6 +22,7 @@ namespace spine { String serializeSkeletonData(SkeletonData *data) { _visitedObjects.clear(); + _nextId = 1; _json = JsonWriter(); writeSkeletonData(data); return _json.getString(); @@ -28,6 +30,7 @@ namespace spine { String serializeSkeleton(Skeleton *skeleton) { _visitedObjects.clear(); + _nextId = 1; _json = JsonWriter(); writeSkeleton(skeleton); return _json.getString(); @@ -35,6 +38,7 @@ namespace spine { String serializeAnimationState(AnimationState *state) { _visitedObjects.clear(); + _nextId = 1; _json = JsonWriter(); writeAnimationState(state); return _json.getString(); @@ -43,12 +47,21 @@ namespace spine { private: void writeAnimation(Animation *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Animation"); @@ -73,12 +86,15 @@ namespace spine { void writeAlphaTimeline(AlphaTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("AlphaTimeline"); @@ -113,12 +129,15 @@ namespace spine { void writeAttachmentTimeline(AttachmentTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("AttachmentTimeline"); @@ -160,12 +179,15 @@ namespace spine { void writeDeformTimeline(DeformTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("DeformTimeline"); @@ -215,12 +237,15 @@ namespace spine { void writeDrawOrderTimeline(DrawOrderTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("DrawOrderTimeline"); @@ -264,12 +289,15 @@ namespace spine { void writeEventTimeline(EventTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("EventTimeline"); @@ -308,12 +336,15 @@ namespace spine { void writeIkConstraintTimeline(IkConstraintTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("IkConstraintTimeline"); @@ -348,12 +379,15 @@ namespace spine { void writeInheritTimeline(InheritTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("InheritTimeline"); @@ -388,12 +422,15 @@ namespace spine { void writePathConstraintMixTimeline(PathConstraintMixTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraintMixTimeline"); @@ -428,12 +465,15 @@ namespace spine { void writePathConstraintPositionTimeline(PathConstraintPositionTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraintPositionTimeline"); @@ -468,12 +508,15 @@ namespace spine { void writePathConstraintSpacingTimeline(PathConstraintSpacingTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraintSpacingTimeline"); @@ -508,12 +551,15 @@ namespace spine { void writePhysicsConstraintDampingTimeline(PhysicsConstraintDampingTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintDampingTimeline"); @@ -548,12 +594,15 @@ namespace spine { void writePhysicsConstraintGravityTimeline(PhysicsConstraintGravityTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintGravityTimeline"); @@ -588,12 +637,15 @@ namespace spine { void writePhysicsConstraintInertiaTimeline(PhysicsConstraintInertiaTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintInertiaTimeline"); @@ -628,12 +680,15 @@ namespace spine { void writePhysicsConstraintMassTimeline(PhysicsConstraintMassTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintMassTimeline"); @@ -668,12 +723,15 @@ namespace spine { void writePhysicsConstraintMixTimeline(PhysicsConstraintMixTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintMixTimeline"); @@ -708,12 +766,15 @@ namespace spine { void writePhysicsConstraintResetTimeline(PhysicsConstraintResetTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintResetTimeline"); @@ -748,12 +809,15 @@ namespace spine { void writePhysicsConstraintStrengthTimeline(PhysicsConstraintStrengthTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintStrengthTimeline"); @@ -788,12 +852,15 @@ namespace spine { void writePhysicsConstraintWindTimeline(PhysicsConstraintWindTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintWindTimeline"); @@ -828,12 +895,15 @@ namespace spine { void writeRGB2Timeline(RGB2Timeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RGB2Timeline"); @@ -868,12 +938,15 @@ namespace spine { void writeRGBA2Timeline(RGBA2Timeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RGBA2Timeline"); @@ -908,12 +981,15 @@ namespace spine { void writeRGBATimeline(RGBATimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RGBATimeline"); @@ -948,12 +1024,15 @@ namespace spine { void writeRGBTimeline(RGBTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RGBTimeline"); @@ -988,12 +1067,15 @@ namespace spine { void writeRotateTimeline(RotateTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RotateTimeline"); @@ -1028,12 +1110,15 @@ namespace spine { void writeScaleTimeline(ScaleTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ScaleTimeline"); @@ -1068,12 +1153,15 @@ namespace spine { void writeScaleXTimeline(ScaleXTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ScaleXTimeline"); @@ -1108,12 +1196,15 @@ namespace spine { void writeScaleYTimeline(ScaleYTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ScaleYTimeline"); @@ -1148,12 +1239,15 @@ namespace spine { void writeSequenceTimeline(SequenceTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SequenceTimeline"); @@ -1191,12 +1285,15 @@ namespace spine { void writeShearTimeline(ShearTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ShearTimeline"); @@ -1231,12 +1328,15 @@ namespace spine { void writeShearXTimeline(ShearXTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ShearXTimeline"); @@ -1271,12 +1371,15 @@ namespace spine { void writeShearYTimeline(ShearYTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ShearYTimeline"); @@ -1311,12 +1414,15 @@ namespace spine { void writeSliderMixTimeline(SliderMixTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SliderMixTimeline"); @@ -1351,12 +1457,15 @@ namespace spine { void writeSliderTimeline(SliderTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SliderTimeline"); @@ -1470,12 +1579,15 @@ namespace spine { void writeTransformConstraintTimeline(TransformConstraintTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TransformConstraintTimeline"); @@ -1510,12 +1622,15 @@ namespace spine { void writeTranslateTimeline(TranslateTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TranslateTimeline"); @@ -1550,12 +1665,15 @@ namespace spine { void writeTranslateXTimeline(TranslateXTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TranslateXTimeline"); @@ -1590,12 +1708,15 @@ namespace spine { void writeTranslateYTimeline(TranslateYTimeline *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TranslateYTimeline"); @@ -1630,12 +1751,15 @@ namespace spine { void writeAnimationState(AnimationState *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("AnimationState"); @@ -1657,12 +1781,15 @@ namespace spine { void writeTrackEntry(TrackEntry *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TrackEntry"); @@ -1781,12 +1908,15 @@ namespace spine { void writeAnimationStateData(AnimationStateData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("AnimationStateData"); @@ -1820,12 +1950,15 @@ namespace spine { void writeBone(Bone *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Bone"); @@ -1857,12 +1990,21 @@ namespace spine { void writeBoneData(BoneData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("BoneData"); @@ -1902,12 +2044,15 @@ namespace spine { void writeBoneLocal(BoneLocal *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("BoneLocal"); @@ -1955,12 +2100,15 @@ namespace spine { void writeBonePose(BonePose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("BonePose"); @@ -2038,12 +2186,21 @@ namespace spine { void writeBoundingBoxAttachment(BoundingBoxAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("BoundingBoxAttachment"); @@ -2085,12 +2242,21 @@ namespace spine { void writeClippingAttachment(ClippingAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ClippingAttachment"); @@ -2173,12 +2339,15 @@ namespace spine { void writeEvent(Event *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Event"); @@ -2208,12 +2377,21 @@ namespace spine { void writeEventData(EventData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("EventData"); @@ -2243,12 +2421,15 @@ namespace spine { void writeIkConstraint(IkConstraint *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("IkConstraint"); @@ -2276,12 +2457,21 @@ namespace spine { void writeIkConstraintData(IkConstraintData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("IkConstraintData"); @@ -2312,12 +2502,15 @@ namespace spine { void writeIkConstraintPose(IkConstraintPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("IkConstraintPose"); @@ -2341,12 +2534,21 @@ namespace spine { void writeMeshAttachment(MeshAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("MeshAttachment"); @@ -2449,12 +2651,21 @@ namespace spine { void writePathAttachment(PathAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathAttachment"); @@ -2509,12 +2720,15 @@ namespace spine { void writePathConstraint(PathConstraint *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraint"); @@ -2542,12 +2756,21 @@ namespace spine { void writePathConstraintData(PathConstraintData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraintData"); @@ -2620,12 +2843,15 @@ namespace spine { void writePathConstraintPose(PathConstraintPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PathConstraintPose"); @@ -2649,12 +2875,15 @@ namespace spine { void writePhysicsConstraint(PhysicsConstraint *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraint"); @@ -2675,12 +2904,21 @@ namespace spine { void writePhysicsConstraintData(PhysicsConstraintData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintData"); @@ -2743,12 +2981,15 @@ namespace spine { void writePhysicsConstraintPose(PhysicsConstraintPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PhysicsConstraintPose"); @@ -2778,12 +3019,21 @@ namespace spine { void writePointAttachment(PointAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("PointAttachment"); @@ -2807,12 +3057,21 @@ namespace spine { void writeRegionAttachment(RegionAttachment *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("RegionAttachment"); @@ -2879,12 +3138,15 @@ namespace spine { void writeSequence(Sequence *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Sequence"); @@ -2912,12 +3174,15 @@ namespace spine { void writeSkeleton(Skeleton *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Skeleton"); @@ -3011,12 +3276,21 @@ namespace spine { void writeSkeletonData(SkeletonData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SkeletonData"); @@ -3107,12 +3381,22 @@ namespace spine { void writeSkin(Skin *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); + _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Skin"); @@ -3152,6 +3436,15 @@ namespace spine { void writeSkinEntry(Skin::AttachmentMap::Entry *obj) { _json.writeObjectStart(); + String name = obj->_name; + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SkinEntry"); _json.writeName("slotIndex"); @@ -3165,12 +3458,15 @@ namespace spine { void writeSlider(Slider *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Slider"); @@ -3191,12 +3487,21 @@ namespace spine { void writeSliderData(SliderData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SliderData"); @@ -3246,12 +3551,15 @@ namespace spine { void writeSliderPose(SliderPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SliderPose"); @@ -3266,12 +3574,15 @@ namespace spine { void writeSlot(Slot *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("Slot"); @@ -3292,12 +3603,21 @@ namespace spine { void writeSlotData(SlotData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SlotData"); @@ -3343,12 +3663,15 @@ namespace spine { void writeSlotPose(SlotPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("SlotPose"); @@ -3380,12 +3703,15 @@ namespace spine { void writeTransformConstraint(TransformConstraint *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TransformConstraint"); @@ -3413,12 +3739,21 @@ namespace spine { void writeTransformConstraintData(TransformConstraintData *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String name = obj->getName(); + String refString; + if (!name.isEmpty()) { + refString.append(""); + } else { + refString.append(""); + } + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TransformConstraintData"); @@ -3502,12 +3837,15 @@ namespace spine { void writeFromRotate(FromRotate *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromRotate"); @@ -3526,12 +3864,15 @@ namespace spine { void writeFromScaleX(FromScaleX *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromScaleX"); @@ -3550,12 +3891,15 @@ namespace spine { void writeFromScaleY(FromScaleY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromScaleY"); @@ -3574,12 +3918,15 @@ namespace spine { void writeFromShearY(FromShearY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromShearY"); @@ -3598,12 +3945,15 @@ namespace spine { void writeFromX(FromX *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromX"); @@ -3622,12 +3972,15 @@ namespace spine { void writeFromY(FromY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("FromY"); @@ -3665,12 +4018,15 @@ namespace spine { void writeToRotate(ToRotate *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToRotate"); @@ -3688,12 +4044,15 @@ namespace spine { void writeToScaleX(ToScaleX *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToScaleX"); @@ -3711,12 +4070,15 @@ namespace spine { void writeToScaleY(ToScaleY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToScaleY"); @@ -3734,12 +4096,15 @@ namespace spine { void writeToShearY(ToShearY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToShearY"); @@ -3757,12 +4122,15 @@ namespace spine { void writeToX(ToX *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToX"); @@ -3780,12 +4148,15 @@ namespace spine { void writeToY(ToY *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("ToY"); @@ -3803,12 +4174,15 @@ namespace spine { void writeTransformConstraintPose(TransformConstraintPose *obj) { if (_visitedObjects.containsKey(obj)) { - _json.writeValue(""); + _json.writeValue(_visitedObjects[obj]); return; } - _visitedObjects.put(obj, true); + String refString = String(""); + _visitedObjects.put(obj, refString); _json.writeObjectStart(); + _json.writeName("refString"); + _json.writeValue(refString); _json.writeName("type"); _json.writeValue("TransformConstraintPose"); diff --git a/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/utils/SkeletonSerializer.java b/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/utils/SkeletonSerializer.java index 90b9bc51e..a45a7d4c3 100644 --- a/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/utils/SkeletonSerializer.java +++ b/spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/utils/SkeletonSerializer.java @@ -16,15 +16,17 @@ import com.badlogic.gdx.utils.IntArray; import com.badlogic.gdx.utils.FloatArray; import java.util.Locale; -import java.util.Set; -import java.util.HashSet; +import java.util.Map; +import java.util.HashMap; public class SkeletonSerializer { - private final Set visitedObjects = new HashSet<>(); + private final Map visitedObjects = new HashMap<>(); + private int nextId = 1; private JsonWriter json; public String serializeSkeletonData (SkeletonData data) { visitedObjects.clear(); + nextId = 1; json = new JsonWriter(); writeSkeletonData(data); json.close(); @@ -33,6 +35,7 @@ public class SkeletonSerializer { public String serializeSkeleton (Skeleton skeleton) { visitedObjects.clear(); + nextId = 1; json = new JsonWriter(); writeSkeleton(skeleton); json.close(); @@ -41,6 +44,7 @@ public class SkeletonSerializer { public String serializeAnimationState (AnimationState state) { visitedObjects.clear(); + nextId = 1; json = new JsonWriter(); writeAnimationState(state); json.close(); @@ -48,13 +52,16 @@ public class SkeletonSerializer { } private void writeAnimation (Animation obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Animation"); @@ -78,13 +85,16 @@ public class SkeletonSerializer { } private void writeAlphaTimeline (Animation.AlphaTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("AlphaTimeline"); @@ -118,13 +128,16 @@ public class SkeletonSerializer { } private void writeAttachmentTimeline (Animation.AttachmentTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("AttachmentTimeline"); @@ -165,13 +178,16 @@ public class SkeletonSerializer { } private void writeDeformTimeline (Animation.DeformTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("DeformTimeline"); @@ -219,13 +235,16 @@ public class SkeletonSerializer { } private void writeDrawOrderTimeline (Animation.DrawOrderTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("DrawOrderTimeline"); @@ -267,13 +286,16 @@ public class SkeletonSerializer { } private void writeEventTimeline (Animation.EventTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("EventTimeline"); @@ -311,13 +333,16 @@ public class SkeletonSerializer { } private void writeIkConstraintTimeline (Animation.IkConstraintTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("IkConstraintTimeline"); @@ -351,13 +376,16 @@ public class SkeletonSerializer { } private void writeInheritTimeline (Animation.InheritTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("InheritTimeline"); @@ -391,13 +419,16 @@ public class SkeletonSerializer { } private void writePathConstraintMixTimeline (Animation.PathConstraintMixTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraintMixTimeline"); @@ -431,13 +462,16 @@ public class SkeletonSerializer { } private void writePathConstraintPositionTimeline (Animation.PathConstraintPositionTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraintPositionTimeline"); @@ -471,13 +505,16 @@ public class SkeletonSerializer { } private void writePathConstraintSpacingTimeline (Animation.PathConstraintSpacingTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraintSpacingTimeline"); @@ -511,13 +548,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintDampingTimeline (Animation.PhysicsConstraintDampingTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintDampingTimeline"); @@ -551,13 +591,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintGravityTimeline (Animation.PhysicsConstraintGravityTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintGravityTimeline"); @@ -591,13 +634,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintInertiaTimeline (Animation.PhysicsConstraintInertiaTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintInertiaTimeline"); @@ -631,13 +677,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintMassTimeline (Animation.PhysicsConstraintMassTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintMassTimeline"); @@ -671,13 +720,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintMixTimeline (Animation.PhysicsConstraintMixTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintMixTimeline"); @@ -711,13 +763,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintResetTimeline (Animation.PhysicsConstraintResetTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintResetTimeline"); @@ -751,13 +806,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintStrengthTimeline (Animation.PhysicsConstraintStrengthTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintStrengthTimeline"); @@ -791,13 +849,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintWindTimeline (Animation.PhysicsConstraintWindTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintWindTimeline"); @@ -831,13 +892,16 @@ public class SkeletonSerializer { } private void writeRGB2Timeline (Animation.RGB2Timeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RGB2Timeline"); @@ -871,13 +935,16 @@ public class SkeletonSerializer { } private void writeRGBA2Timeline (Animation.RGBA2Timeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RGBA2Timeline"); @@ -911,13 +978,16 @@ public class SkeletonSerializer { } private void writeRGBATimeline (Animation.RGBATimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RGBATimeline"); @@ -951,13 +1021,16 @@ public class SkeletonSerializer { } private void writeRGBTimeline (Animation.RGBTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RGBTimeline"); @@ -991,13 +1064,16 @@ public class SkeletonSerializer { } private void writeRotateTimeline (Animation.RotateTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RotateTimeline"); @@ -1031,13 +1107,16 @@ public class SkeletonSerializer { } private void writeScaleTimeline (Animation.ScaleTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ScaleTimeline"); @@ -1071,13 +1150,16 @@ public class SkeletonSerializer { } private void writeScaleXTimeline (Animation.ScaleXTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ScaleXTimeline"); @@ -1111,13 +1193,16 @@ public class SkeletonSerializer { } private void writeScaleYTimeline (Animation.ScaleYTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ScaleYTimeline"); @@ -1151,13 +1236,16 @@ public class SkeletonSerializer { } private void writeSequenceTimeline (Animation.SequenceTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SequenceTimeline"); @@ -1194,13 +1282,16 @@ public class SkeletonSerializer { } private void writeShearTimeline (Animation.ShearTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ShearTimeline"); @@ -1234,13 +1325,16 @@ public class SkeletonSerializer { } private void writeShearXTimeline (Animation.ShearXTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ShearXTimeline"); @@ -1274,13 +1368,16 @@ public class SkeletonSerializer { } private void writeShearYTimeline (Animation.ShearYTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ShearYTimeline"); @@ -1314,13 +1411,16 @@ public class SkeletonSerializer { } private void writeSliderMixTimeline (Animation.SliderMixTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SliderMixTimeline"); @@ -1354,13 +1454,16 @@ public class SkeletonSerializer { } private void writeSliderTimeline (Animation.SliderTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SliderTimeline"); @@ -1472,13 +1575,16 @@ public class SkeletonSerializer { } private void writeTransformConstraintTimeline (Animation.TransformConstraintTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TransformConstraintTimeline"); @@ -1512,13 +1618,16 @@ public class SkeletonSerializer { } private void writeTranslateTimeline (Animation.TranslateTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TranslateTimeline"); @@ -1552,13 +1661,16 @@ public class SkeletonSerializer { } private void writeTranslateXTimeline (Animation.TranslateXTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TranslateXTimeline"); @@ -1592,13 +1704,16 @@ public class SkeletonSerializer { } private void writeTranslateYTimeline (Animation.TranslateYTimeline obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TranslateYTimeline"); @@ -1632,13 +1747,16 @@ public class SkeletonSerializer { } private void writeAnimationState (AnimationState obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("AnimationState"); @@ -1659,13 +1777,16 @@ public class SkeletonSerializer { } private void writeTrackEntry (AnimationState.TrackEntry obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TrackEntry"); @@ -1770,13 +1891,16 @@ public class SkeletonSerializer { } private void writeAnimationStateData (AnimationStateData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("AnimationStateData"); @@ -1808,13 +1932,16 @@ public class SkeletonSerializer { } private void writeBone (Bone obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Bone"); @@ -1845,13 +1972,16 @@ public class SkeletonSerializer { } private void writeBoneData (BoneData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("BoneData"); @@ -1890,13 +2020,16 @@ public class SkeletonSerializer { } private void writeBoneLocal (BoneLocal obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("BoneLocal"); @@ -1928,13 +2061,16 @@ public class SkeletonSerializer { } private void writeBonePose (BonePose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("BonePose"); @@ -1996,13 +2132,17 @@ public class SkeletonSerializer { } private void writeBoundingBoxAttachment (BoundingBoxAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("BoundingBoxAttachment"); @@ -2047,13 +2187,17 @@ public class SkeletonSerializer { } private void writeClippingAttachment (ClippingAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ClippingAttachment"); @@ -2137,13 +2281,16 @@ public class SkeletonSerializer { } private void writeEvent (Event obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Event"); @@ -2172,13 +2319,16 @@ public class SkeletonSerializer { } private void writeEventData (EventData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("EventData"); @@ -2207,13 +2357,16 @@ public class SkeletonSerializer { } private void writeIkConstraint (IkConstraint obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("IkConstraint"); @@ -2240,13 +2393,17 @@ public class SkeletonSerializer { } private void writeIkConstraintData (IkConstraintData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("IkConstraintData"); @@ -2276,13 +2433,16 @@ public class SkeletonSerializer { } private void writeIkConstraintPose (IkConstraintPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("IkConstraintPose"); @@ -2305,13 +2465,16 @@ public class SkeletonSerializer { } private void writeMeshAttachment (MeshAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("MeshAttachment"); @@ -2421,13 +2584,16 @@ public class SkeletonSerializer { } private void writePathAttachment (PathAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathAttachment"); @@ -2485,13 +2651,16 @@ public class SkeletonSerializer { } private void writePathConstraint (PathConstraint obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraint"); @@ -2518,13 +2687,17 @@ public class SkeletonSerializer { } private void writePathConstraintData (PathConstraintData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraintData"); @@ -2563,13 +2736,16 @@ public class SkeletonSerializer { } private void writePathConstraintPose (PathConstraintPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PathConstraintPose"); @@ -2592,13 +2768,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraint (PhysicsConstraint obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraint"); @@ -2618,13 +2797,17 @@ public class SkeletonSerializer { } private void writePhysicsConstraintData (PhysicsConstraintData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintData"); @@ -2686,13 +2869,16 @@ public class SkeletonSerializer { } private void writePhysicsConstraintPose (PhysicsConstraintPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PhysicsConstraintPose"); @@ -2721,13 +2907,17 @@ public class SkeletonSerializer { } private void writePointAttachment (PointAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("PointAttachment"); @@ -2750,13 +2940,17 @@ public class SkeletonSerializer { } private void writeRegionAttachment (RegionAttachment obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("RegionAttachment"); @@ -2822,13 +3016,16 @@ public class SkeletonSerializer { } private void writeSequence (Sequence obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Sequence"); @@ -2855,13 +3052,16 @@ public class SkeletonSerializer { } private void writeSkeleton (Skeleton obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Skeleton"); @@ -2954,13 +3154,16 @@ public class SkeletonSerializer { } private void writeSkeletonData (SkeletonData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SkeletonData"); @@ -3050,13 +3253,16 @@ public class SkeletonSerializer { } private void writeSkin (Skin obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Skin"); @@ -3093,13 +3299,16 @@ public class SkeletonSerializer { } private void writeSkinEntry (Skin.SkinEntry obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SkinEntry"); @@ -3116,13 +3325,16 @@ public class SkeletonSerializer { } private void writeSlider (Slider obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Slider"); @@ -3142,13 +3354,16 @@ public class SkeletonSerializer { } private void writeSliderData (SliderData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SliderData"); @@ -3197,13 +3412,16 @@ public class SkeletonSerializer { } private void writeSliderPose (SliderPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SliderPose"); @@ -3217,13 +3435,16 @@ public class SkeletonSerializer { } private void writeSlot (Slot obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("Slot"); @@ -3243,13 +3464,16 @@ public class SkeletonSerializer { } private void writeSlotData (SlotData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SlotData"); @@ -3281,13 +3505,16 @@ public class SkeletonSerializer { } private void writeSlotPose (SlotPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("SlotPose"); @@ -3318,13 +3545,16 @@ public class SkeletonSerializer { } private void writeTransformConstraint (TransformConstraint obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TransformConstraint"); @@ -3351,13 +3581,17 @@ public class SkeletonSerializer { } private void writeTransformConstraintData (TransformConstraintData obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = obj.getName() != null ? "" + : ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TransformConstraintData"); @@ -3439,13 +3673,16 @@ public class SkeletonSerializer { } private void writeFromRotate (TransformConstraintData.FromRotate obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromRotate"); @@ -3463,13 +3700,16 @@ public class SkeletonSerializer { } private void writeFromScaleX (TransformConstraintData.FromScaleX obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromScaleX"); @@ -3487,13 +3727,16 @@ public class SkeletonSerializer { } private void writeFromScaleY (TransformConstraintData.FromScaleY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromScaleY"); @@ -3511,13 +3754,16 @@ public class SkeletonSerializer { } private void writeFromShearY (TransformConstraintData.FromShearY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromShearY"); @@ -3535,13 +3781,16 @@ public class SkeletonSerializer { } private void writeFromX (TransformConstraintData.FromX obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromX"); @@ -3559,13 +3808,16 @@ public class SkeletonSerializer { } private void writeFromY (TransformConstraintData.FromY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("FromY"); @@ -3601,13 +3853,16 @@ public class SkeletonSerializer { } private void writeToRotate (TransformConstraintData.ToRotate obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToRotate"); @@ -3624,13 +3879,16 @@ public class SkeletonSerializer { } private void writeToScaleX (TransformConstraintData.ToScaleX obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToScaleX"); @@ -3647,13 +3905,16 @@ public class SkeletonSerializer { } private void writeToScaleY (TransformConstraintData.ToScaleY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToScaleY"); @@ -3670,13 +3931,16 @@ public class SkeletonSerializer { } private void writeToShearY (TransformConstraintData.ToShearY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToShearY"); @@ -3693,13 +3957,16 @@ public class SkeletonSerializer { } private void writeToX (TransformConstraintData.ToX obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToX"); @@ -3716,13 +3983,16 @@ public class SkeletonSerializer { } private void writeToY (TransformConstraintData.ToY obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("ToY"); @@ -3739,13 +4009,16 @@ public class SkeletonSerializer { } private void writeTransformConstraintPose (TransformConstraintPose obj) { - if (visitedObjects.contains(obj)) { - json.writeValue(""); + if (visitedObjects.containsKey(obj)) { + json.writeValue(visitedObjects.get(obj)); return; } - visitedObjects.add(obj); + String refString = ""; + visitedObjects.put(obj, refString); json.writeObjectStart(); + json.writeName("refString"); + json.writeValue(refString); json.writeName("type"); json.writeValue("TransformConstraintPose"); diff --git a/tests/src/generate-cpp-serializer.ts b/tests/src/generate-cpp-serializer.ts index fc0789417..7fee064e8 100644 --- a/tests/src/generate-cpp-serializer.ts +++ b/tests/src/generate-cpp-serializer.ts @@ -78,7 +78,7 @@ function generatePropertyCode (property: Property, indent: string, enumMappings: } break; - case "enum": + case "enum": { const enumName = property.enumName; const enumMap = enumMappings[enumName]; @@ -99,8 +99,8 @@ function generatePropertyCode (property: Property, indent: string, enumMappings: lines.push(`${indent}_json.writeValue(String::valueOf((int)${accessor}));`); } break; - - case "array": + } + case "array": { // In C++, arrays are never null - empty arrays (size() == 0) are equivalent to Java null lines.push(`${indent}_json.writeArrayStart();`); lines.push(`${indent}for (size_t i = 0; i < ${accessor}.size(); i++) {`); @@ -113,7 +113,7 @@ function generatePropertyCode (property: Property, indent: string, enumMappings: lines.push(`${indent}}`); lines.push(`${indent}_json.writeArrayEnd();`); break; - + } case "nestedArray": // Nested arrays are always considered non-null in both Java and C++ lines.push(`${indent}_json.writeArrayStart();`); @@ -148,7 +148,8 @@ function generateCppFromIR (ir: SerializerIR): string { cppOutput.push(''); cppOutput.push('class SkeletonSerializer {'); cppOutput.push('private:'); - cppOutput.push(' HashMap _visitedObjects;'); + cppOutput.push(' HashMap _visitedObjects;'); + cppOutput.push(' int _nextId;'); cppOutput.push(' JsonWriter _json;'); cppOutput.push(''); cppOutput.push('public:'); @@ -161,6 +162,7 @@ function generateCppFromIR (ir: SerializerIR): string { const cppParamType = transformType(method.paramType); cppOutput.push(` String ${method.name}(${cppParamType}* ${method.paramName}) {`); cppOutput.push(' _visitedObjects.clear();'); + cppOutput.push(' _nextId = 1;'); cppOutput.push(' _json = JsonWriter();'); cppOutput.push(` ${method.writeMethodCall}(${method.paramName});`); cppOutput.push(' return _json.getString();'); @@ -172,19 +174,46 @@ function generateCppFromIR (ir: SerializerIR): string { // Generate write methods for (const method of ir.writeMethods) { - const shortName = method.paramType.split('.').pop()!; + const shortName = method.paramType.split('.').pop(); const cppType = transformType(method.paramType); // Custom writeSkin and writeSkinEntry implementations if (method.name === 'writeSkin') { cppOutput.push(' void writeSkin(Skin* obj) {'); cppOutput.push(' if (_visitedObjects.containsKey(obj)) {'); - cppOutput.push(' _json.writeValue("");'); + cppOutput.push(' _json.writeValue(_visitedObjects[obj]);'); cppOutput.push(' return;'); cppOutput.push(' }'); - cppOutput.push(' _visitedObjects.put(obj, true);'); + + // Generate reference string for this object (only when first encountered) + // Only use name if there's a proper getName() method returning String + const nameGetter = method.properties.find(p => + (p.kind === 'object' || p.kind === "primitive") && + p.getter === 'getName()' && + p.valueType === 'String' + ); + + if (nameGetter) { + // Use getName() if available and returns String + cppOutput.push(' String name = obj->getName();'); + cppOutput.push(' String refString;'); + cppOutput.push(' if (!name.isEmpty()) {'); + cppOutput.push(` refString.append("<${shortName}-").append(name).append(">");`); + cppOutput.push(' } else {'); + cppOutput.push(` refString.append("<${shortName}-").append(_nextId++).append(">");`); + cppOutput.push(' }'); + } else { + // No suitable name getter - use numbered ID + cppOutput.push(` String refString = String("<${shortName}-").append(_nextId++).append(">");`); + } + cppOutput.push(' _visitedObjects.put(obj, refString);'); + cppOutput.push(''); cppOutput.push(''); cppOutput.push(' _json.writeObjectStart();'); + + cppOutput.push(' _json.writeName("refString");'); + cppOutput.push(' _json.writeValue(refString);'); + cppOutput.push(' _json.writeName("type");'); cppOutput.push(' _json.writeValue("Skin");'); cppOutput.push(''); @@ -230,6 +259,18 @@ function generateCppFromIR (ir: SerializerIR): string { // Custom writeSkinEntry implementation cppOutput.push(' void writeSkinEntry(Skin::AttachmentMap::Entry* obj) {'); cppOutput.push(' _json.writeObjectStart();'); + + // Generate refString using the name field if available + cppOutput.push(' String name = obj->_name;'); + cppOutput.push(' String refString;'); + cppOutput.push(' if (!name.isEmpty()) {'); + cppOutput.push(` refString.append("<${shortName}-").append(name).append(">");`); + cppOutput.push(' } else {'); + cppOutput.push(` refString.append("<${shortName}-").append(_nextId++).append(">");`); + cppOutput.push(' }'); + cppOutput.push(' _json.writeName("refString");'); + cppOutput.push(' _json.writeValue(refString);'); + cppOutput.push(' _json.writeName("type");'); cppOutput.push(' _json.writeValue("SkinEntry");'); cppOutput.push(' _json.writeName("slotIndex");'); @@ -251,7 +292,7 @@ function generateCppFromIR (ir: SerializerIR): string { if (method.subtypeChecks && method.subtypeChecks.length > 0) { let first = true; for (const subtype of method.subtypeChecks) { - const subtypeShortName = subtype.typeName.split('.').pop()!; + const subtypeShortName = subtype.typeName.split('.').pop(); if (first) { cppOutput.push(` if (obj->getRTTI().instanceOf(${subtypeShortName}::rtti)) {`); @@ -271,14 +312,40 @@ function generateCppFromIR (ir: SerializerIR): string { // Handle concrete types // Add cycle detection cppOutput.push(' if (_visitedObjects.containsKey(obj)) {'); - cppOutput.push(' _json.writeValue("");'); + cppOutput.push(' _json.writeValue(_visitedObjects[obj]);'); cppOutput.push(' return;'); cppOutput.push(' }'); - cppOutput.push(' _visitedObjects.put(obj, true);'); + + // Generate reference string for this object (only when first encountered) + // Only use name if there's a proper getName() method returning String + const nameGetter = method.properties.find(p => + (p.kind === 'object' || p.kind === "primitive") && + p.getter === 'getName()' && + p.valueType === 'String' + ); + + if (nameGetter) { + // Use getName() if available and returns String + cppOutput.push(' String name = obj->getName();'); + cppOutput.push(' String refString;'); + cppOutput.push(' if (!name.isEmpty()) {'); + cppOutput.push(` refString.append("<${shortName}-").append(name).append(">");`); + cppOutput.push(' } else {'); + cppOutput.push(` refString.append("<${shortName}-").append(_nextId++).append(">");`); + cppOutput.push(' }'); + } else { + // No suitable name getter - use numbered ID + cppOutput.push(` String refString = String("<${shortName}-").append(_nextId++).append(">");`); + } + cppOutput.push(' _visitedObjects.put(obj, refString);'); cppOutput.push(''); cppOutput.push(' _json.writeObjectStart();'); + // Write reference string as first field for navigation + cppOutput.push(' _json.writeName("refString");'); + cppOutput.push(' _json.writeValue(refString);'); + // Write type field cppOutput.push(' _json.writeName("type");'); cppOutput.push(` _json.writeValue("${shortName}");`); diff --git a/tests/src/generate-java-serializer.ts b/tests/src/generate-java-serializer.ts index cb0a5fe28..125136904 100644 --- a/tests/src/generate-java-serializer.ts +++ b/tests/src/generate-java-serializer.ts @@ -40,7 +40,7 @@ function generatePropertyCode (property: Property, indent: string, method?: Writ } break; - case "array": + case "array": { // Special handling for Skin attachments - sort by slot index const isSkinAttachments = method?.paramType === 'Skin' && property.name === 'attachments' && property.elementType === 'SkinEntry'; const sortedAccessor = isSkinAttachments ? 'sortedAttachments' : accessor; @@ -76,8 +76,8 @@ function generatePropertyCode (property: Property, indent: string, method?: Writ lines.push(`${indent}json.writeArrayEnd();`); } break; - - case "nestedArray": + } + case "nestedArray": { if (property.isNullable) { lines.push(`${indent}if (${accessor} == null) {`); lines.push(`${indent} json.writeNull();`); @@ -108,6 +108,7 @@ function generatePropertyCode (property: Property, indent: string, method?: Writ lines.push(`${indent}json.writeArrayEnd();`); } break; + } } return lines; @@ -134,11 +135,12 @@ function generateJavaFromIR (ir: SerializerIR): string { javaOutput.push('import com.badlogic.gdx.utils.FloatArray;'); javaOutput.push(''); javaOutput.push('import java.util.Locale;'); - javaOutput.push('import java.util.Set;'); - javaOutput.push('import java.util.HashSet;'); + javaOutput.push('import java.util.Map;'); + javaOutput.push('import java.util.HashMap;'); javaOutput.push(''); javaOutput.push('public class SkeletonSerializer {'); - javaOutput.push(' private final Set visitedObjects = new HashSet<>();'); + javaOutput.push(' private final Map visitedObjects = new HashMap<>();'); + javaOutput.push(' private int nextId = 1;'); javaOutput.push(' private JsonWriter json;'); javaOutput.push(''); @@ -146,6 +148,7 @@ function generateJavaFromIR (ir: SerializerIR): string { for (const method of ir.publicMethods) { javaOutput.push(` public String ${method.name}(${method.paramType} ${method.paramName}) {`); javaOutput.push(' visitedObjects.clear();'); + javaOutput.push(' nextId = 1;'); javaOutput.push(' json = new JsonWriter();'); javaOutput.push(` ${method.writeMethodCall}(${method.paramName});`); javaOutput.push(' json.close();'); @@ -156,7 +159,7 @@ function generateJavaFromIR (ir: SerializerIR): string { // Generate write methods for (const method of ir.writeMethods) { - const shortName = method.paramType.split('.').pop()!; + const shortName = method.paramType.split('.').pop(); const className = method.paramType.includes('.') ? method.paramType : shortName; javaOutput.push(` private void ${method.name}(${className} obj) {`); @@ -166,7 +169,7 @@ function generateJavaFromIR (ir: SerializerIR): string { if (method.subtypeChecks && method.subtypeChecks.length > 0) { let first = true; for (const subtype of method.subtypeChecks) { - const subtypeShortName = subtype.typeName.split('.').pop()!; + const subtypeShortName = subtype.typeName.split('.').pop(); const subtypeClassName = subtype.typeName.includes('.') ? subtype.typeName : subtypeShortName; if (first) { @@ -186,15 +189,35 @@ function generateJavaFromIR (ir: SerializerIR): string { } else { // Handle concrete types // Add cycle detection - javaOutput.push(' if (visitedObjects.contains(obj)) {'); - javaOutput.push(' json.writeValue("");'); + javaOutput.push(' if (visitedObjects.containsKey(obj)) {'); + javaOutput.push(' json.writeValue(visitedObjects.get(obj));'); javaOutput.push(' return;'); javaOutput.push(' }'); - javaOutput.push(' visitedObjects.add(obj);'); + + // Generate reference string for this object (only when first encountered) + // Only use name if there's a proper getName() method returning String + const nameGetter = method.properties.find(p => + (p.kind === 'object' || p.kind === "primitive") && + p.getter === 'getName()' && + p.valueType === 'String' + ); + + if (nameGetter) { + // Use getName() if available and returns String + javaOutput.push(` String refString = obj.getName() != null ? "<${shortName}-" + obj.getName() + ">" : "<${shortName}-" + (nextId++) + ">";`); + } else { + // No suitable name getter - use numbered ID + javaOutput.push(` String refString = "<${shortName}-" + (nextId++) + ">";`); + } + javaOutput.push(' visitedObjects.put(obj, refString);'); javaOutput.push(''); javaOutput.push(' json.writeObjectStart();'); + // Write reference string as first field for navigation + javaOutput.push(' json.writeName("refString");'); + javaOutput.push(' json.writeValue(refString);'); + // Write type field javaOutput.push(' json.writeName("type");'); javaOutput.push(` json.writeValue("${shortName}");`); diff --git a/tests/src/headless-test-runner.ts b/tests/src/headless-test-runner.ts index e4527c502..1bc763ea5 100755 --- a/tests/src/headless-test-runner.ts +++ b/tests/src/headless-test-runner.ts @@ -332,7 +332,7 @@ function executeCpp (args: TestArgs): string { // Build using build.sh log_action('Building C++ tests'); try { - execSync('./build.sh clean release', { + execSync('./build.sh clean debug', { cwd: cppDir, stdio: ['inherit', 'pipe', 'inherit'] }); @@ -593,7 +593,8 @@ function main (): void { log_title('Spine Runtime Test'); // Clean output directory first - cleanOutputDirectory(); + // TODO annoying during development of generators as it also smokes generator outputs + // cleanOutputDirectory(); if (args.files) { // Auto-discovery mode: run tests for both JSON and binary files diff --git a/todos/work/2025-01-11-03-02-54-test-suite/task.md b/todos/done/2025-01-11-03-02-54-test-suite.md similarity index 100% rename from todos/work/2025-01-11-03-02-54-test-suite/task.md rename to todos/done/2025-01-11-03-02-54-test-suite.md diff --git a/todos/done/2025-01-21-18-49-54-logging-indentation.md b/todos/done/2025-01-21-18-49-54-logging-indentation.md new file mode 100644 index 000000000..3d969f64c --- /dev/null +++ b/todos/done/2025-01-21-18-49-54-logging-indentation.md @@ -0,0 +1,22 @@ +# Improve bash script logging indentation for nested calls +**Status:** Done +**Agent PID:** 30228 + +## Original Todo +- clean up logging in spine-c/codegen, use chalk to do colored warnings/errors and make logging look very nice and informative (no emojis) + +## Description +Implement automatic indentation for bash script logging when scripts call other scripts. Currently, when a script calls another script, both use the same logging functions from `formatters/logging/logging.sh`, making it difficult to distinguish the call hierarchy. The solution will detect script nesting level by analyzing the process tree and automatically indent log output from child scripts. + +## Implementation Plan +- [x] Create process tree analysis utility to detect script nesting level +- [x] Add nesting level detection that runs once when logging.sh is sourced +- [x] Store indentation level in a local variable (SPINE_LOG_INDENT_SPACES) - **not exported** +- [x] Modify log_action(), log_warn(), and log_detail() to use the pre-calculated local indentation +- [x] Test with nested script calls (format.sh calling format-cpp.sh, etc.) +- [x] Ensure backward compatibility and graceful fallback if detection fails +- [x] Update documentation to explain the new indentation behavior +- [x] Add script filename to log_title output for better clarity + +## Notes +26 bash scripts in the codebase use logging.sh functionality, including build, test, format, setup, and publish scripts. All would benefit from proper indentation when calling each other. \ No newline at end of file diff --git a/todos/done/2025-01-21-19-06-33-circular-reference-display-analysis.md b/todos/done/2025-01-21-19-06-33-circular-reference-display-analysis.md new file mode 100644 index 000000000..1206bc7b0 --- /dev/null +++ b/todos/done/2025-01-21-19-06-33-circular-reference-display-analysis.md @@ -0,0 +1,74 @@ +# Circular Reference Display Analysis + +## Current Implementation + +The circular reference detection is implemented in: + +### 1. **Java SkeletonSerializer** +**File:** `spine-libgdx/spine-libgdx-tests/src/com/esotericsoftware/spine/utils/SkeletonSerializer.java` +- Uses pattern: `if (visitedObjects.contains(obj)) { json.writeValue(""); return; }` +- Found on 100+ lines throughout write methods + +### 2. **C++ SkeletonSerializer** +**File:** `spine-cpp/tests/SkeletonSerializer.h` +- Uses pattern: `if (_visitedObjects.containsKey(obj)) { _json.writeValue(""); return; }` +- Similar implementation to Java version + +### 3. **Generator Scripts** +- `tests/src/generate-java-serializer.ts` (lines 189-192) +- `tests/src/generate-cpp-serializer.ts` (lines 182-183, 274-275) +- Both inject the circular reference detection pattern + +### 4. **Test Runner** +- `tests/src/headless-test-runner.ts` (line 409) +- Handles "" values during JSON comparison + +## Object Identification Patterns + +### Name-based Identification +Most Spine objects use `name` as primary identifier: +```java +// Event.java - toString returns the event's name +public String toString() { return data.name; } + +// Attachment.java - toString returns attachment name +public String toString() { return name; } + +// Skeleton.java - toString returns skeleton data name or falls back +public String toString() { + return data.name != null ? data.name : super.toString(); +} +``` + +### ID-based Identification +TypeScript VertexAttachment uses auto-incrementing IDs: +```typescript +export abstract class VertexAttachment extends Attachment { + private static nextID = 0; + /** The unique ID for this attachment. */ + id = VertexAttachment.nextID++; +} +``` + +### Type-based Identification +Serializers include explicit type information: +```java +json.writeName("type"); +json.writeValue("Animation"); +``` + +## Current Limitations + +1. **No type information** - Can't quickly understand what type of object caused the circular reference +2. **No unique identification** - Can't distinguish between multiple circular references of the same type +3. **No navigation aid** - Can't easily locate the original object definition in large object graphs + +## Enhancement Opportunities + +The existing infrastructure supports enhancement: +- Consistent naming patterns across objects +- Unique ID patterns could be expanded +- Type information already captured in serializers +- Object reference tracking infrastructure is mature + +Enhanced format could be: `` or `` instead of just ``. \ No newline at end of file diff --git a/todos/done/2025-01-21-19-06-33-circular-reference-display.md b/todos/done/2025-01-21-19-06-33-circular-reference-display.md new file mode 100644 index 000000000..4c33c5afd --- /dev/null +++ b/todos/done/2025-01-21-19-06-33-circular-reference-display.md @@ -0,0 +1,35 @@ +# Circular Reference Display Enhancement +**Status:** Done +**Agent PID:** 67832 + +## Original Todo + should include the type and a unique id for the object, so i can quckly understand what's been omitted navigate to it + +## Description +Replace "" with deterministic object identifiers in Spine serializers. The implementation uses a hybrid approach: objects with name properties use "" format (e.g. ""), while objects without names use numbered IDs "", "", etc. This ensures identical output across Java/C++ by using deterministic reference strings that are generated only when objects are first encountered. + +## Implementation Plan +- [x] Update Java generator script - Modified `tests/src/generate-java-serializer.ts` to use Map visitedObjects with `nextId` counter, generating name-based or numbered reference strings +- [x] Update C++ generator script - Modified `tests/src/generate-cpp-serializer.ts` to use HashMap with `_nextId` counter, matching Java logic with proper Spine String API usage +- [x] Regenerate serializers - Generated updated Java and C++ SkeletonSerializer classes with new circular reference handling +- [x] Fix deterministic IDs - Implemented hybrid system: `` for named objects, `` for unnamed objects, ensuring identical output across languages +- [x] Update test runner - Test runner handles new circular reference format correctly +- [x] Automated test: Serialization tests pass with no regressions +- [x] User test: Circular references now show meaningful format like `` or `` instead of `` +- [x] Add reference string field: Include refString as first field in each object's JSON to enable quick navigation from circular references to full objects + +## Notes +### Implementation Details: +- **Circular Reference Logic**: Changed from simple boolean tracking to String-based reference storage +- **Reference String Generation**: Only occurs when object is first encountered (after cycle detection check) +- **Name Detection**: Uses `p.getter === 'getName()' && p.valueType === 'String'` to identify objects with meaningful names +- **Deterministic Numbering**: Both Java and C++ use identical counter logic, ensuring same numbered IDs for unnamed objects +- **Types with Names**: BoneData, EventData, IkConstraintData, PathConstraintData, PhysicsConstraintData, Animation, and attachment types +- **Output Format**: + - Named: ``, ``, `` + - Unnamed: ``, ``, `` +- **Navigation Enhancement**: Each serialized object includes `"refString"` as its first field, making it easy to jump from circular reference to full object definition + +### Commands: +- `tests/generate-serializers.sh` -> generates the serializers +- `tests/test.sh cpp -s spineboy -f` -> compiles and runs the tests, and outputs whether the generated json files are identical \ No newline at end of file diff --git a/todos/todos.md b/todos/todos.md index d86d77e6e..938b572e4 100644 --- a/todos/todos.md +++ b/todos/todos.md @@ -1,4 +1,3 @@ -- clean up logging in spine-c/codegen, use chalk to do colored warnings/errors and make logging look very nice and informative (no emojis) - spine-c/codegen type extractor should also report typedefs like typedef long long PropertyId; so primitive type to some name, and we need to handle that in the codegen - Generate language bindings in spine-c/codegen - Use CClassOrStruct, CEnum that get generated from spine-cpp-types.json and generate