spine-runtimes/spine-cpp/tests/SkeletonSerializer.h
2025-07-13 04:23:57 +02:00

4256 lines
126 KiB
C++

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