瀏覽代碼

Wip unit tests

Stephen Gowen 7 年之前
父節點
當前提交
1e6d8b793a

+ 775 - 0
spine-cpp/spine-cpp-unit-tests/spine_unit_test/spine_unit_test.xcodeproj/project.pbxproj

@@ -0,0 +1,775 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 48;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		BB6017131FD9289A009BD546 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017121FD9289A009BD546 /* main.cpp */; };
+		BB6017A21FD928AC009BD546 /* Attachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017671FD928AC009BD546 /* Attachment.cpp */; };
+		BB6017A31FD928AC009BD546 /* Skeleton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017681FD928AC009BD546 /* Skeleton.cpp */; };
+		BB6017A41FD928AC009BD546 /* TranslateTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017691FD928AC009BD546 /* TranslateTimeline.cpp */; };
+		BB6017A51FD928AC009BD546 /* Extension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176A1FD928AC009BD546 /* Extension.cpp */; };
+		BB6017A61FD928AC009BD546 /* Updatable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176B1FD928AC009BD546 /* Updatable.cpp */; };
+		BB6017A71FD928AC009BD546 /* Bone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176C1FD928AC009BD546 /* Bone.cpp */; };
+		BB6017A81FD928AC009BD546 /* AtlasAttachmentLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176D1FD928AC009BD546 /* AtlasAttachmentLoader.cpp */; };
+		BB6017A91FD928AC009BD546 /* EventTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176E1FD928AC009BD546 /* EventTimeline.cpp */; };
+		BB6017AA1FD928AC009BD546 /* PathConstraint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60176F1FD928AC009BD546 /* PathConstraint.cpp */; };
+		BB6017AB1FD928AC009BD546 /* VertexAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017701FD928AC009BD546 /* VertexAttachment.cpp */; };
+		BB6017AC1FD928AC009BD546 /* TextureLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017711FD928AC009BD546 /* TextureLoader.cpp */; };
+		BB6017AD1FD928AC009BD546 /* SkeletonData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017721FD928AC009BD546 /* SkeletonData.cpp */; };
+		BB6017AE1FD928AC009BD546 /* TransformConstraintTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017731FD928AC009BD546 /* TransformConstraintTimeline.cpp */; };
+		BB6017AF1FD928AC009BD546 /* IkConstraint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017741FD928AC009BD546 /* IkConstraint.cpp */; };
+		BB6017B01FD928AC009BD546 /* CurveTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017751FD928AC009BD546 /* CurveTimeline.cpp */; };
+		BB6017B11FD928AC009BD546 /* AnimationStateData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017761FD928AC009BD546 /* AnimationStateData.cpp */; };
+		BB6017B21FD928AC009BD546 /* Constraint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017771FD928AC009BD546 /* Constraint.cpp */; };
+		BB6017B31FD928AC009BD546 /* BoundingBoxAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017781FD928AC009BD546 /* BoundingBoxAttachment.cpp */; };
+		BB6017B41FD928AC009BD546 /* PathAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017791FD928AC009BD546 /* PathAttachment.cpp */; };
+		BB6017B51FD928AC009BD546 /* MeshAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177A1FD928AC009BD546 /* MeshAttachment.cpp */; };
+		BB6017B61FD928AC009BD546 /* TransformConstraint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177B1FD928AC009BD546 /* TransformConstraint.cpp */; };
+		BB6017B71FD928AC009BD546 /* Skin.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177C1FD928AC009BD546 /* Skin.cpp */; };
+		BB6017B81FD928AC009BD546 /* RTTI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177D1FD928AC009BD546 /* RTTI.cpp */; };
+		BB6017B91FD928AC009BD546 /* MathUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177E1FD928AC009BD546 /* MathUtil.cpp */; };
+		BB6017BA1FD928AC009BD546 /* IkConstraintData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60177F1FD928AC009BD546 /* IkConstraintData.cpp */; };
+		BB6017BB1FD928AC009BD546 /* Atlas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017801FD928AC009BD546 /* Atlas.cpp */; };
+		BB6017BC1FD928AC009BD546 /* ClippingAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017811FD928AC009BD546 /* ClippingAttachment.cpp */; };
+		BB6017BD1FD928AC009BD546 /* PathConstraintData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017821FD928AC009BD546 /* PathConstraintData.cpp */; };
+		BB6017BE1FD928AC009BD546 /* Timeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017831FD928AC009BD546 /* Timeline.cpp */; };
+		BB6017BF1FD928AC009BD546 /* SkeletonBinary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017841FD928AC009BD546 /* SkeletonBinary.cpp */; };
+		BB6017C01FD928AC009BD546 /* ScaleTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017851FD928AC009BD546 /* ScaleTimeline.cpp */; };
+		BB6017C11FD928AC009BD546 /* LinkedMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017861FD928AC009BD546 /* LinkedMesh.cpp */; };
+		BB6017C21FD928AC009BD546 /* PointAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017871FD928AC009BD546 /* PointAttachment.cpp */; };
+		BB6017C31FD928AC009BD546 /* RegionAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017881FD928AC009BD546 /* RegionAttachment.cpp */; };
+		BB6017C41FD928AC009BD546 /* DeformTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017891FD928AC009BD546 /* DeformTimeline.cpp */; };
+		BB6017C51FD928AC009BD546 /* Animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178A1FD928AC009BD546 /* Animation.cpp */; };
+		BB6017C61FD928AC009BD546 /* AttachmentLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178B1FD928AC009BD546 /* AttachmentLoader.cpp */; };
+		BB6017C71FD928AC009BD546 /* DrawOrderTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178C1FD928AC009BD546 /* DrawOrderTimeline.cpp */; };
+		BB6017C81FD928AC009BD546 /* AttachmentTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178D1FD928AC009BD546 /* AttachmentTimeline.cpp */; };
+		BB6017C91FD928AC009BD546 /* EventData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178E1FD928AC009BD546 /* EventData.cpp */; };
+		BB6017CA1FD928AC009BD546 /* PathConstraintSpacingTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60178F1FD928AC009BD546 /* PathConstraintSpacingTimeline.cpp */; };
+		BB6017CB1FD928AC009BD546 /* PathConstraintPositionTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017901FD928AC009BD546 /* PathConstraintPositionTimeline.cpp */; };
+		BB6017CC1FD928AC009BD546 /* TransformConstraintData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017911FD928AC009BD546 /* TransformConstraintData.cpp */; };
+		BB6017CD1FD928AC009BD546 /* SkeletonClipping.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017921FD928AC009BD546 /* SkeletonClipping.cpp */; };
+		BB6017CE1FD928AC009BD546 /* TwoColorTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017931FD928AC009BD546 /* TwoColorTimeline.cpp */; };
+		BB6017CF1FD928AC009BD546 /* Slot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017941FD928AC009BD546 /* Slot.cpp */; };
+		BB6017D01FD928AC009BD546 /* AnimationState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017951FD928AC009BD546 /* AnimationState.cpp */; };
+		BB6017D11FD928AC009BD546 /* SkeletonJson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017961FD928AC009BD546 /* SkeletonJson.cpp */; };
+		BB6017D21FD928AC009BD546 /* BoneData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017971FD928AC009BD546 /* BoneData.cpp */; };
+		BB6017D31FD928AC009BD546 /* IkConstraintTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017981FD928AC009BD546 /* IkConstraintTimeline.cpp */; };
+		BB6017D41FD928AC009BD546 /* Event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017991FD928AC009BD546 /* Event.cpp */; };
+		BB6017D51FD928AC009BD546 /* RotateTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179A1FD928AC009BD546 /* RotateTimeline.cpp */; };
+		BB6017D61FD928AC009BD546 /* PathConstraintMixTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179B1FD928AC009BD546 /* PathConstraintMixTimeline.cpp */; };
+		BB6017D71FD928AC009BD546 /* Triangulator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179C1FD928AC009BD546 /* Triangulator.cpp */; };
+		BB6017D81FD928AC009BD546 /* Json.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179D1FD928AC009BD546 /* Json.cpp */; };
+		BB6017D91FD928AC009BD546 /* SkeletonBounds.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179E1FD928AC009BD546 /* SkeletonBounds.cpp */; };
+		BB6017DA1FD928AC009BD546 /* SlotData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB60179F1FD928AC009BD546 /* SlotData.cpp */; };
+		BB6017DB1FD928AC009BD546 /* ShearTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017A01FD928AC009BD546 /* ShearTimeline.cpp */; };
+		BB6017DC1FD928AC009BD546 /* ColorTimeline.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017A11FD928AC009BD546 /* ColorTimeline.cpp */; };
+		BB6017E21FD928F7009BD546 /* KMemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017E01FD928F6009BD546 /* KMemory.cpp */; };
+		BB6017E31FD928F7009BD546 /* KString.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017E11FD928F6009BD546 /* KString.cpp */; };
+		BB6017E71FD929D0009BD546 /* MiniCppUnit.cxx in Sources */ = {isa = PBXBuildFile; fileRef = BB6017E61FD929D0009BD546 /* MiniCppUnit.cxx */; };
+		BB6017EE1FD929F4009BD546 /* teamcity_cppunit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017EA1FD929F4009BD546 /* teamcity_cppunit.cpp */; };
+		BB6017EF1FD929F4009BD546 /* teamcity_messages.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017ED1FD929F4009BD546 /* teamcity_messages.cpp */; };
+		BB6018081FD92AF4009BD546 /* SpineEventMonitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BB6017FD1FD92AF3009BD546 /* SpineEventMonitor.cpp */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		BB60170D1FD9289A009BD546 /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = /usr/share/man/man1/;
+			dstSubfolderSpec = 0;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 1;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		BB60170F1FD9289A009BD546 /* spine_unit_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = spine_unit_test; sourceTree = BUILT_PRODUCTS_DIR; };
+		BB6017121FD9289A009BD546 /* main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
+		BB60171C1FD928AC009BD546 /* DeformTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeformTimeline.h; sourceTree = "<group>"; };
+		BB60171D1FD928AC009BD546 /* Animation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Animation.h; sourceTree = "<group>"; };
+		BB60171E1FD928AC009BD546 /* EventData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventData.h; sourceTree = "<group>"; };
+		BB60171F1FD928AC009BD546 /* SlotData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlotData.h; sourceTree = "<group>"; };
+		BB6017201FD928AC009BD546 /* PathConstraintMixTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathConstraintMixTimeline.h; sourceTree = "<group>"; };
+		BB6017211FD928AC009BD546 /* SkeletonClipping.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonClipping.h; sourceTree = "<group>"; };
+		BB6017221FD928AC009BD546 /* Pool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pool.h; sourceTree = "<group>"; };
+		BB6017231FD928AC009BD546 /* TimelineType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimelineType.h; sourceTree = "<group>"; };
+		BB6017241FD928AC009BD546 /* TextureLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextureLoader.h; sourceTree = "<group>"; };
+		BB6017251FD928AC009BD546 /* PositionMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PositionMode.h; sourceTree = "<group>"; };
+		BB6017261FD928AC009BD546 /* RTTI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTTI.h; sourceTree = "<group>"; };
+		BB6017271FD928AC009BD546 /* PathAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathAttachment.h; sourceTree = "<group>"; };
+		BB6017281FD928AC009BD546 /* MixDirection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MixDirection.h; sourceTree = "<group>"; };
+		BB6017291FD928AC009BD546 /* CurveTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CurveTimeline.h; sourceTree = "<group>"; };
+		BB60172A1FD928AC009BD546 /* PointAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PointAttachment.h; sourceTree = "<group>"; };
+		BB60172B1FD928AC009BD546 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = "<group>"; };
+		BB60172C1FD928AC009BD546 /* Bone.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bone.h; sourceTree = "<group>"; };
+		BB60172D1FD928AC009BD546 /* Atlas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Atlas.h; sourceTree = "<group>"; };
+		BB60172E1FD928AC009BD546 /* DrawOrderTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DrawOrderTimeline.h; sourceTree = "<group>"; };
+		BB60172F1FD928AC009BD546 /* TransformConstraintTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformConstraintTimeline.h; sourceTree = "<group>"; };
+		BB6017301FD928AC009BD546 /* IkConstraintTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IkConstraintTimeline.h; sourceTree = "<group>"; };
+		BB6017311FD928AC009BD546 /* VertexAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VertexAttachment.h; sourceTree = "<group>"; };
+		BB6017321FD928AC009BD546 /* AttachmentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttachmentType.h; sourceTree = "<group>"; };
+		BB6017331FD928AC009BD546 /* RotateMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RotateMode.h; sourceTree = "<group>"; };
+		BB6017341FD928AC009BD546 /* ClippingAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClippingAttachment.h; sourceTree = "<group>"; };
+		BB6017351FD928AC009BD546 /* PathConstraintPositionTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathConstraintPositionTimeline.h; sourceTree = "<group>"; };
+		BB6017361FD928AC009BD546 /* RotateTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RotateTimeline.h; sourceTree = "<group>"; };
+		BB6017371FD928AC009BD546 /* Triangulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Triangulator.h; sourceTree = "<group>"; };
+		BB6017381FD928AC009BD546 /* RegionAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegionAttachment.h; sourceTree = "<group>"; };
+		BB6017391FD928AC009BD546 /* Attachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Attachment.h; sourceTree = "<group>"; };
+		BB60173A1FD928AC009BD546 /* HashMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HashMap.h; sourceTree = "<group>"; };
+		BB60173B1FD928AC009BD546 /* TransformConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformConstraint.h; sourceTree = "<group>"; };
+		BB60173C1FD928AC009BD546 /* TransformMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformMode.h; sourceTree = "<group>"; };
+		BB60173D1FD928AC009BD546 /* SkeletonJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonJson.h; sourceTree = "<group>"; };
+		BB60173E1FD928AC009BD546 /* IkConstraintData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IkConstraintData.h; sourceTree = "<group>"; };
+		BB60173F1FD928AC009BD546 /* MixPose.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MixPose.h; sourceTree = "<group>"; };
+		BB6017401FD928AC009BD546 /* AnimationStateData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationStateData.h; sourceTree = "<group>"; };
+		BB6017411FD928AC009BD546 /* TwoColorTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwoColorTimeline.h; sourceTree = "<group>"; };
+		BB6017421FD928AC009BD546 /* Skeleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Skeleton.h; sourceTree = "<group>"; };
+		BB6017431FD928AC009BD546 /* ColorTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ColorTimeline.h; sourceTree = "<group>"; };
+		BB6017441FD928AC009BD546 /* SpacingMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpacingMode.h; sourceTree = "<group>"; };
+		BB6017451FD928AC009BD546 /* Vertices.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vertices.h; sourceTree = "<group>"; };
+		BB6017461FD928AC009BD546 /* Constraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constraint.h; sourceTree = "<group>"; };
+		BB6017471FD928AC009BD546 /* LinkedMesh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LinkedMesh.h; sourceTree = "<group>"; };
+		BB6017481FD928AC009BD546 /* ShearTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShearTimeline.h; sourceTree = "<group>"; };
+		BB6017491FD928AC009BD546 /* Json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Json.h; sourceTree = "<group>"; };
+		BB60174A1FD928AC009BD546 /* AttachmentLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttachmentLoader.h; sourceTree = "<group>"; };
+		BB60174B1FD928AC009BD546 /* Skin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Skin.h; sourceTree = "<group>"; };
+		BB60174C1FD928AC009BD546 /* AttachmentTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AttachmentTimeline.h; sourceTree = "<group>"; };
+		BB60174D1FD928AC009BD546 /* SkeletonBinary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonBinary.h; sourceTree = "<group>"; };
+		BB60174E1FD928AC009BD546 /* SkeletonData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonData.h; sourceTree = "<group>"; };
+		BB60174F1FD928AC009BD546 /* ContainerUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContainerUtil.h; sourceTree = "<group>"; };
+		BB6017501FD928AC009BD546 /* PathConstraintData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathConstraintData.h; sourceTree = "<group>"; };
+		BB6017511FD928AC009BD546 /* Updatable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Updatable.h; sourceTree = "<group>"; };
+		BB6017521FD928AC009BD546 /* TransformConstraintData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformConstraintData.h; sourceTree = "<group>"; };
+		BB6017531FD928AC009BD546 /* Extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Extension.h; sourceTree = "<group>"; };
+		BB6017541FD928AC009BD546 /* BlendMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlendMode.h; sourceTree = "<group>"; };
+		BB6017551FD928AC009BD546 /* PathConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathConstraint.h; sourceTree = "<group>"; };
+		BB6017561FD928AC009BD546 /* PathConstraintSpacingTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PathConstraintSpacingTimeline.h; sourceTree = "<group>"; };
+		BB6017571FD928AC009BD546 /* ScaleTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScaleTimeline.h; sourceTree = "<group>"; };
+		BB6017581FD928AC009BD546 /* IkConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IkConstraint.h; sourceTree = "<group>"; };
+		BB6017591FD928AC009BD546 /* BoundingBoxAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BoundingBoxAttachment.h; sourceTree = "<group>"; };
+		BB60175A1FD928AC009BD546 /* MathUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathUtil.h; sourceTree = "<group>"; };
+		BB60175B1FD928AC009BD546 /* Vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vector.h; sourceTree = "<group>"; };
+		BB60175C1FD928AC009BD546 /* SkeletonBounds.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SkeletonBounds.h; sourceTree = "<group>"; };
+		BB60175D1FD928AC009BD546 /* Timeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timeline.h; sourceTree = "<group>"; };
+		BB60175E1FD928AC009BD546 /* Slot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Slot.h; sourceTree = "<group>"; };
+		BB60175F1FD928AC009BD546 /* BoneData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BoneData.h; sourceTree = "<group>"; };
+		BB6017601FD928AC009BD546 /* TranslateTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TranslateTimeline.h; sourceTree = "<group>"; };
+		BB6017611FD928AC009BD546 /* AnimationState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnimationState.h; sourceTree = "<group>"; };
+		BB6017621FD928AC009BD546 /* MeshAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MeshAttachment.h; sourceTree = "<group>"; };
+		BB6017631FD928AC009BD546 /* AtlasAttachmentLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AtlasAttachmentLoader.h; sourceTree = "<group>"; };
+		BB6017641FD928AC009BD546 /* EventTimeline.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventTimeline.h; sourceTree = "<group>"; };
+		BB6017671FD928AC009BD546 /* Attachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Attachment.cpp; sourceTree = "<group>"; };
+		BB6017681FD928AC009BD546 /* Skeleton.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Skeleton.cpp; sourceTree = "<group>"; };
+		BB6017691FD928AC009BD546 /* TranslateTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TranslateTimeline.cpp; sourceTree = "<group>"; };
+		BB60176A1FD928AC009BD546 /* Extension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Extension.cpp; sourceTree = "<group>"; };
+		BB60176B1FD928AC009BD546 /* Updatable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Updatable.cpp; sourceTree = "<group>"; };
+		BB60176C1FD928AC009BD546 /* Bone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Bone.cpp; sourceTree = "<group>"; };
+		BB60176D1FD928AC009BD546 /* AtlasAttachmentLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AtlasAttachmentLoader.cpp; sourceTree = "<group>"; };
+		BB60176E1FD928AC009BD546 /* EventTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventTimeline.cpp; sourceTree = "<group>"; };
+		BB60176F1FD928AC009BD546 /* PathConstraint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathConstraint.cpp; sourceTree = "<group>"; };
+		BB6017701FD928AC009BD546 /* VertexAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VertexAttachment.cpp; sourceTree = "<group>"; };
+		BB6017711FD928AC009BD546 /* TextureLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextureLoader.cpp; sourceTree = "<group>"; };
+		BB6017721FD928AC009BD546 /* SkeletonData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkeletonData.cpp; sourceTree = "<group>"; };
+		BB6017731FD928AC009BD546 /* TransformConstraintTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransformConstraintTimeline.cpp; sourceTree = "<group>"; };
+		BB6017741FD928AC009BD546 /* IkConstraint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IkConstraint.cpp; sourceTree = "<group>"; };
+		BB6017751FD928AC009BD546 /* CurveTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CurveTimeline.cpp; sourceTree = "<group>"; };
+		BB6017761FD928AC009BD546 /* AnimationStateData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AnimationStateData.cpp; sourceTree = "<group>"; };
+		BB6017771FD928AC009BD546 /* Constraint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Constraint.cpp; sourceTree = "<group>"; };
+		BB6017781FD928AC009BD546 /* BoundingBoxAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BoundingBoxAttachment.cpp; sourceTree = "<group>"; };
+		BB6017791FD928AC009BD546 /* PathAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathAttachment.cpp; sourceTree = "<group>"; };
+		BB60177A1FD928AC009BD546 /* MeshAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MeshAttachment.cpp; sourceTree = "<group>"; };
+		BB60177B1FD928AC009BD546 /* TransformConstraint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransformConstraint.cpp; sourceTree = "<group>"; };
+		BB60177C1FD928AC009BD546 /* Skin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Skin.cpp; sourceTree = "<group>"; };
+		BB60177D1FD928AC009BD546 /* RTTI.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RTTI.cpp; sourceTree = "<group>"; };
+		BB60177E1FD928AC009BD546 /* MathUtil.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MathUtil.cpp; sourceTree = "<group>"; };
+		BB60177F1FD928AC009BD546 /* IkConstraintData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IkConstraintData.cpp; sourceTree = "<group>"; };
+		BB6017801FD928AC009BD546 /* Atlas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Atlas.cpp; sourceTree = "<group>"; };
+		BB6017811FD928AC009BD546 /* ClippingAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ClippingAttachment.cpp; sourceTree = "<group>"; };
+		BB6017821FD928AC009BD546 /* PathConstraintData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathConstraintData.cpp; sourceTree = "<group>"; };
+		BB6017831FD928AC009BD546 /* Timeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Timeline.cpp; sourceTree = "<group>"; };
+		BB6017841FD928AC009BD546 /* SkeletonBinary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkeletonBinary.cpp; sourceTree = "<group>"; };
+		BB6017851FD928AC009BD546 /* ScaleTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScaleTimeline.cpp; sourceTree = "<group>"; };
+		BB6017861FD928AC009BD546 /* LinkedMesh.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LinkedMesh.cpp; sourceTree = "<group>"; };
+		BB6017871FD928AC009BD546 /* PointAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PointAttachment.cpp; sourceTree = "<group>"; };
+		BB6017881FD928AC009BD546 /* RegionAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegionAttachment.cpp; sourceTree = "<group>"; };
+		BB6017891FD928AC009BD546 /* DeformTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeformTimeline.cpp; sourceTree = "<group>"; };
+		BB60178A1FD928AC009BD546 /* Animation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Animation.cpp; sourceTree = "<group>"; };
+		BB60178B1FD928AC009BD546 /* AttachmentLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AttachmentLoader.cpp; sourceTree = "<group>"; };
+		BB60178C1FD928AC009BD546 /* DrawOrderTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DrawOrderTimeline.cpp; sourceTree = "<group>"; };
+		BB60178D1FD928AC009BD546 /* AttachmentTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AttachmentTimeline.cpp; sourceTree = "<group>"; };
+		BB60178E1FD928AC009BD546 /* EventData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventData.cpp; sourceTree = "<group>"; };
+		BB60178F1FD928AC009BD546 /* PathConstraintSpacingTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathConstraintSpacingTimeline.cpp; sourceTree = "<group>"; };
+		BB6017901FD928AC009BD546 /* PathConstraintPositionTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathConstraintPositionTimeline.cpp; sourceTree = "<group>"; };
+		BB6017911FD928AC009BD546 /* TransformConstraintData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransformConstraintData.cpp; sourceTree = "<group>"; };
+		BB6017921FD928AC009BD546 /* SkeletonClipping.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkeletonClipping.cpp; sourceTree = "<group>"; };
+		BB6017931FD928AC009BD546 /* TwoColorTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TwoColorTimeline.cpp; sourceTree = "<group>"; };
+		BB6017941FD928AC009BD546 /* Slot.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Slot.cpp; sourceTree = "<group>"; };
+		BB6017951FD928AC009BD546 /* AnimationState.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AnimationState.cpp; sourceTree = "<group>"; };
+		BB6017961FD928AC009BD546 /* SkeletonJson.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkeletonJson.cpp; sourceTree = "<group>"; };
+		BB6017971FD928AC009BD546 /* BoneData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BoneData.cpp; sourceTree = "<group>"; };
+		BB6017981FD928AC009BD546 /* IkConstraintTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IkConstraintTimeline.cpp; sourceTree = "<group>"; };
+		BB6017991FD928AC009BD546 /* Event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Event.cpp; sourceTree = "<group>"; };
+		BB60179A1FD928AC009BD546 /* RotateTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RotateTimeline.cpp; sourceTree = "<group>"; };
+		BB60179B1FD928AC009BD546 /* PathConstraintMixTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PathConstraintMixTimeline.cpp; sourceTree = "<group>"; };
+		BB60179C1FD928AC009BD546 /* Triangulator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Triangulator.cpp; sourceTree = "<group>"; };
+		BB60179D1FD928AC009BD546 /* Json.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Json.cpp; sourceTree = "<group>"; };
+		BB60179E1FD928AC009BD546 /* SkeletonBounds.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SkeletonBounds.cpp; sourceTree = "<group>"; };
+		BB60179F1FD928AC009BD546 /* SlotData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SlotData.cpp; sourceTree = "<group>"; };
+		BB6017A01FD928AC009BD546 /* ShearTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShearTimeline.cpp; sourceTree = "<group>"; };
+		BB6017A11FD928AC009BD546 /* ColorTimeline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ColorTimeline.cpp; sourceTree = "<group>"; };
+		BB6017DE1FD928F6009BD546 /* KMemory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMemory.h; sourceTree = "<group>"; };
+		BB6017DF1FD928F6009BD546 /* KString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KString.h; sourceTree = "<group>"; };
+		BB6017E01FD928F6009BD546 /* KMemory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KMemory.cpp; sourceTree = "<group>"; };
+		BB6017E11FD928F6009BD546 /* KString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KString.cpp; sourceTree = "<group>"; };
+		BB6017E51FD929D0009BD546 /* MiniCppUnit.hxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = MiniCppUnit.hxx; sourceTree = "<group>"; };
+		BB6017E61FD929D0009BD546 /* MiniCppUnit.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MiniCppUnit.cxx; sourceTree = "<group>"; };
+		BB6017E91FD929F4009BD546 /* teamcity_cppunit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = teamcity_cppunit.h; sourceTree = "<group>"; };
+		BB6017EA1FD929F4009BD546 /* teamcity_cppunit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = teamcity_cppunit.cpp; sourceTree = "<group>"; };
+		BB6017EB1FD929F4009BD546 /* teamcity_messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = teamcity_messages.h; sourceTree = "<group>"; };
+		BB6017EC1FD929F4009BD546 /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = "<group>"; };
+		BB6017ED1FD929F4009BD546 /* teamcity_messages.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = teamcity_messages.cpp; sourceTree = "<group>"; };
+		BB6017F01FD92A5B009BD546 /* SimpleTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleTest.h; sourceTree = "<group>"; };
+		BB6017FC1FD92AF3009BD546 /* SpineEventMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpineEventMonitor.h; sourceTree = "<group>"; };
+		BB6017FD1FD92AF3009BD546 /* SpineEventMonitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpineEventMonitor.cpp; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		BB60170C1FD9289A009BD546 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		BB6017061FD9289A009BD546 = {
+			isa = PBXGroup;
+			children = (
+				BB6017F11FD92AF3009BD546 /* tests */,
+				BB6017E81FD929F4009BD546 /* teamcity */,
+				BB6017E41FD929D0009BD546 /* minicppunit */,
+				BB6017DD1FD928F6009BD546 /* memory */,
+				BB6017191FD928AC009BD546 /* spine-cpp */,
+				BB6017111FD9289A009BD546 /* spine_unit_test */,
+				BB6017101FD9289A009BD546 /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		BB6017101FD9289A009BD546 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				BB60170F1FD9289A009BD546 /* spine_unit_test */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		BB6017111FD9289A009BD546 /* spine_unit_test */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017121FD9289A009BD546 /* main.cpp */,
+				BB6017F01FD92A5B009BD546 /* SimpleTest.h */,
+			);
+			path = spine_unit_test;
+			sourceTree = "<group>";
+		};
+		BB6017191FD928AC009BD546 /* spine-cpp */ = {
+			isa = PBXGroup;
+			children = (
+				BB60171A1FD928AC009BD546 /* include */,
+				BB6017651FD928AC009BD546 /* src */,
+			);
+			name = "spine-cpp";
+			path = "../../spine-cpp";
+			sourceTree = "<group>";
+		};
+		BB60171A1FD928AC009BD546 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				BB60171B1FD928AC009BD546 /* spine */,
+			);
+			path = include;
+			sourceTree = "<group>";
+		};
+		BB60171B1FD928AC009BD546 /* spine */ = {
+			isa = PBXGroup;
+			children = (
+				BB60171D1FD928AC009BD546 /* Animation.h */,
+				BB6017611FD928AC009BD546 /* AnimationState.h */,
+				BB6017401FD928AC009BD546 /* AnimationStateData.h */,
+				BB60172D1FD928AC009BD546 /* Atlas.h */,
+				BB6017631FD928AC009BD546 /* AtlasAttachmentLoader.h */,
+				BB6017391FD928AC009BD546 /* Attachment.h */,
+				BB60174A1FD928AC009BD546 /* AttachmentLoader.h */,
+				BB60174C1FD928AC009BD546 /* AttachmentTimeline.h */,
+				BB6017321FD928AC009BD546 /* AttachmentType.h */,
+				BB6017541FD928AC009BD546 /* BlendMode.h */,
+				BB60172C1FD928AC009BD546 /* Bone.h */,
+				BB60175F1FD928AC009BD546 /* BoneData.h */,
+				BB6017591FD928AC009BD546 /* BoundingBoxAttachment.h */,
+				BB6017341FD928AC009BD546 /* ClippingAttachment.h */,
+				BB6017431FD928AC009BD546 /* ColorTimeline.h */,
+				BB6017461FD928AC009BD546 /* Constraint.h */,
+				BB60174F1FD928AC009BD546 /* ContainerUtil.h */,
+				BB6017291FD928AC009BD546 /* CurveTimeline.h */,
+				BB60171C1FD928AC009BD546 /* DeformTimeline.h */,
+				BB60172E1FD928AC009BD546 /* DrawOrderTimeline.h */,
+				BB60172B1FD928AC009BD546 /* Event.h */,
+				BB60171E1FD928AC009BD546 /* EventData.h */,
+				BB6017641FD928AC009BD546 /* EventTimeline.h */,
+				BB6017531FD928AC009BD546 /* Extension.h */,
+				BB60173A1FD928AC009BD546 /* HashMap.h */,
+				BB6017581FD928AC009BD546 /* IkConstraint.h */,
+				BB60173E1FD928AC009BD546 /* IkConstraintData.h */,
+				BB6017301FD928AC009BD546 /* IkConstraintTimeline.h */,
+				BB6017491FD928AC009BD546 /* Json.h */,
+				BB6017471FD928AC009BD546 /* LinkedMesh.h */,
+				BB60175A1FD928AC009BD546 /* MathUtil.h */,
+				BB6017621FD928AC009BD546 /* MeshAttachment.h */,
+				BB6017281FD928AC009BD546 /* MixDirection.h */,
+				BB60173F1FD928AC009BD546 /* MixPose.h */,
+				BB6017271FD928AC009BD546 /* PathAttachment.h */,
+				BB6017551FD928AC009BD546 /* PathConstraint.h */,
+				BB6017501FD928AC009BD546 /* PathConstraintData.h */,
+				BB6017201FD928AC009BD546 /* PathConstraintMixTimeline.h */,
+				BB6017351FD928AC009BD546 /* PathConstraintPositionTimeline.h */,
+				BB6017561FD928AC009BD546 /* PathConstraintSpacingTimeline.h */,
+				BB60172A1FD928AC009BD546 /* PointAttachment.h */,
+				BB6017221FD928AC009BD546 /* Pool.h */,
+				BB6017251FD928AC009BD546 /* PositionMode.h */,
+				BB6017381FD928AC009BD546 /* RegionAttachment.h */,
+				BB6017331FD928AC009BD546 /* RotateMode.h */,
+				BB6017361FD928AC009BD546 /* RotateTimeline.h */,
+				BB6017261FD928AC009BD546 /* RTTI.h */,
+				BB6017571FD928AC009BD546 /* ScaleTimeline.h */,
+				BB6017481FD928AC009BD546 /* ShearTimeline.h */,
+				BB6017421FD928AC009BD546 /* Skeleton.h */,
+				BB60174D1FD928AC009BD546 /* SkeletonBinary.h */,
+				BB60175C1FD928AC009BD546 /* SkeletonBounds.h */,
+				BB6017211FD928AC009BD546 /* SkeletonClipping.h */,
+				BB60174E1FD928AC009BD546 /* SkeletonData.h */,
+				BB60173D1FD928AC009BD546 /* SkeletonJson.h */,
+				BB60174B1FD928AC009BD546 /* Skin.h */,
+				BB60175E1FD928AC009BD546 /* Slot.h */,
+				BB60171F1FD928AC009BD546 /* SlotData.h */,
+				BB6017441FD928AC009BD546 /* SpacingMode.h */,
+				BB6017241FD928AC009BD546 /* TextureLoader.h */,
+				BB60175D1FD928AC009BD546 /* Timeline.h */,
+				BB6017231FD928AC009BD546 /* TimelineType.h */,
+				BB60173B1FD928AC009BD546 /* TransformConstraint.h */,
+				BB6017521FD928AC009BD546 /* TransformConstraintData.h */,
+				BB60172F1FD928AC009BD546 /* TransformConstraintTimeline.h */,
+				BB60173C1FD928AC009BD546 /* TransformMode.h */,
+				BB6017601FD928AC009BD546 /* TranslateTimeline.h */,
+				BB6017371FD928AC009BD546 /* Triangulator.h */,
+				BB6017411FD928AC009BD546 /* TwoColorTimeline.h */,
+				BB6017511FD928AC009BD546 /* Updatable.h */,
+				BB60175B1FD928AC009BD546 /* Vector.h */,
+				BB6017311FD928AC009BD546 /* VertexAttachment.h */,
+				BB6017451FD928AC009BD546 /* Vertices.h */,
+			);
+			path = spine;
+			sourceTree = "<group>";
+		};
+		BB6017651FD928AC009BD546 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017661FD928AC009BD546 /* spine */,
+			);
+			path = src;
+			sourceTree = "<group>";
+		};
+		BB6017661FD928AC009BD546 /* spine */ = {
+			isa = PBXGroup;
+			children = (
+				BB60178A1FD928AC009BD546 /* Animation.cpp */,
+				BB6017951FD928AC009BD546 /* AnimationState.cpp */,
+				BB6017761FD928AC009BD546 /* AnimationStateData.cpp */,
+				BB6017801FD928AC009BD546 /* Atlas.cpp */,
+				BB60176D1FD928AC009BD546 /* AtlasAttachmentLoader.cpp */,
+				BB6017671FD928AC009BD546 /* Attachment.cpp */,
+				BB60178B1FD928AC009BD546 /* AttachmentLoader.cpp */,
+				BB60178D1FD928AC009BD546 /* AttachmentTimeline.cpp */,
+				BB60176C1FD928AC009BD546 /* Bone.cpp */,
+				BB6017971FD928AC009BD546 /* BoneData.cpp */,
+				BB6017781FD928AC009BD546 /* BoundingBoxAttachment.cpp */,
+				BB6017811FD928AC009BD546 /* ClippingAttachment.cpp */,
+				BB6017A11FD928AC009BD546 /* ColorTimeline.cpp */,
+				BB6017771FD928AC009BD546 /* Constraint.cpp */,
+				BB6017751FD928AC009BD546 /* CurveTimeline.cpp */,
+				BB6017891FD928AC009BD546 /* DeformTimeline.cpp */,
+				BB60178C1FD928AC009BD546 /* DrawOrderTimeline.cpp */,
+				BB6017991FD928AC009BD546 /* Event.cpp */,
+				BB60178E1FD928AC009BD546 /* EventData.cpp */,
+				BB60176E1FD928AC009BD546 /* EventTimeline.cpp */,
+				BB60176A1FD928AC009BD546 /* Extension.cpp */,
+				BB6017741FD928AC009BD546 /* IkConstraint.cpp */,
+				BB60177F1FD928AC009BD546 /* IkConstraintData.cpp */,
+				BB6017981FD928AC009BD546 /* IkConstraintTimeline.cpp */,
+				BB60179D1FD928AC009BD546 /* Json.cpp */,
+				BB6017861FD928AC009BD546 /* LinkedMesh.cpp */,
+				BB60177E1FD928AC009BD546 /* MathUtil.cpp */,
+				BB60177A1FD928AC009BD546 /* MeshAttachment.cpp */,
+				BB6017791FD928AC009BD546 /* PathAttachment.cpp */,
+				BB60176F1FD928AC009BD546 /* PathConstraint.cpp */,
+				BB6017821FD928AC009BD546 /* PathConstraintData.cpp */,
+				BB60179B1FD928AC009BD546 /* PathConstraintMixTimeline.cpp */,
+				BB6017901FD928AC009BD546 /* PathConstraintPositionTimeline.cpp */,
+				BB60178F1FD928AC009BD546 /* PathConstraintSpacingTimeline.cpp */,
+				BB6017871FD928AC009BD546 /* PointAttachment.cpp */,
+				BB6017881FD928AC009BD546 /* RegionAttachment.cpp */,
+				BB60179A1FD928AC009BD546 /* RotateTimeline.cpp */,
+				BB60177D1FD928AC009BD546 /* RTTI.cpp */,
+				BB6017851FD928AC009BD546 /* ScaleTimeline.cpp */,
+				BB6017A01FD928AC009BD546 /* ShearTimeline.cpp */,
+				BB6017681FD928AC009BD546 /* Skeleton.cpp */,
+				BB6017841FD928AC009BD546 /* SkeletonBinary.cpp */,
+				BB60179E1FD928AC009BD546 /* SkeletonBounds.cpp */,
+				BB6017921FD928AC009BD546 /* SkeletonClipping.cpp */,
+				BB6017721FD928AC009BD546 /* SkeletonData.cpp */,
+				BB6017961FD928AC009BD546 /* SkeletonJson.cpp */,
+				BB60177C1FD928AC009BD546 /* Skin.cpp */,
+				BB6017941FD928AC009BD546 /* Slot.cpp */,
+				BB60179F1FD928AC009BD546 /* SlotData.cpp */,
+				BB6017711FD928AC009BD546 /* TextureLoader.cpp */,
+				BB6017831FD928AC009BD546 /* Timeline.cpp */,
+				BB60177B1FD928AC009BD546 /* TransformConstraint.cpp */,
+				BB6017911FD928AC009BD546 /* TransformConstraintData.cpp */,
+				BB6017731FD928AC009BD546 /* TransformConstraintTimeline.cpp */,
+				BB6017691FD928AC009BD546 /* TranslateTimeline.cpp */,
+				BB60179C1FD928AC009BD546 /* Triangulator.cpp */,
+				BB6017931FD928AC009BD546 /* TwoColorTimeline.cpp */,
+				BB60176B1FD928AC009BD546 /* Updatable.cpp */,
+				BB6017701FD928AC009BD546 /* VertexAttachment.cpp */,
+			);
+			path = spine;
+			sourceTree = "<group>";
+		};
+		BB6017DD1FD928F6009BD546 /* memory */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017DE1FD928F6009BD546 /* KMemory.h */,
+				BB6017DF1FD928F6009BD546 /* KString.h */,
+				BB6017E01FD928F6009BD546 /* KMemory.cpp */,
+				BB6017E11FD928F6009BD546 /* KString.cpp */,
+			);
+			name = memory;
+			path = ../memory;
+			sourceTree = "<group>";
+		};
+		BB6017E41FD929D0009BD546 /* minicppunit */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017E51FD929D0009BD546 /* MiniCppUnit.hxx */,
+				BB6017E61FD929D0009BD546 /* MiniCppUnit.cxx */,
+			);
+			name = minicppunit;
+			path = ../minicppunit;
+			sourceTree = "<group>";
+		};
+		BB6017E81FD929F4009BD546 /* teamcity */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017E91FD929F4009BD546 /* teamcity_cppunit.h */,
+				BB6017EA1FD929F4009BD546 /* teamcity_cppunit.cpp */,
+				BB6017EB1FD929F4009BD546 /* teamcity_messages.h */,
+				BB6017EC1FD929F4009BD546 /* README.txt */,
+				BB6017ED1FD929F4009BD546 /* teamcity_messages.cpp */,
+			);
+			name = teamcity;
+			path = ../teamcity;
+			sourceTree = "<group>";
+		};
+		BB6017F11FD92AF3009BD546 /* tests */ = {
+			isa = PBXGroup;
+			children = (
+				BB6017FC1FD92AF3009BD546 /* SpineEventMonitor.h */,
+				BB6017FD1FD92AF3009BD546 /* SpineEventMonitor.cpp */,
+			);
+			name = tests;
+			path = ../tests;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		BB60170E1FD9289A009BD546 /* spine_unit_test */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = BB6017161FD9289A009BD546 /* Build configuration list for PBXNativeTarget "spine_unit_test" */;
+			buildPhases = (
+				BB60170B1FD9289A009BD546 /* Sources */,
+				BB60170C1FD9289A009BD546 /* Frameworks */,
+				BB60170D1FD9289A009BD546 /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = spine_unit_test;
+			productName = spine_unit_test;
+			productReference = BB60170F1FD9289A009BD546 /* spine_unit_test */;
+			productType = "com.apple.product-type.tool";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		BB6017071FD9289A009BD546 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0920;
+				ORGANIZATIONNAME = "Noctis Games";
+				TargetAttributes = {
+					BB60170E1FD9289A009BD546 = {
+						CreatedOnToolsVersion = 9.2;
+						ProvisioningStyle = Automatic;
+					};
+				};
+			};
+			buildConfigurationList = BB60170A1FD9289A009BD546 /* Build configuration list for PBXProject "spine_unit_test" */;
+			compatibilityVersion = "Xcode 8.0";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+			);
+			mainGroup = BB6017061FD9289A009BD546;
+			productRefGroup = BB6017101FD9289A009BD546 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				BB60170E1FD9289A009BD546 /* spine_unit_test */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		BB60170B1FD9289A009BD546 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				BB6017CB1FD928AC009BD546 /* PathConstraintPositionTimeline.cpp in Sources */,
+				BB6017CD1FD928AC009BD546 /* SkeletonClipping.cpp in Sources */,
+				BB6017B51FD928AC009BD546 /* MeshAttachment.cpp in Sources */,
+				BB6017C01FD928AC009BD546 /* ScaleTimeline.cpp in Sources */,
+				BB6017D01FD928AC009BD546 /* AnimationState.cpp in Sources */,
+				BB6017A31FD928AC009BD546 /* Skeleton.cpp in Sources */,
+				BB6017BA1FD928AC009BD546 /* IkConstraintData.cpp in Sources */,
+				BB6017EE1FD929F4009BD546 /* teamcity_cppunit.cpp in Sources */,
+				BB6017CA1FD928AC009BD546 /* PathConstraintSpacingTimeline.cpp in Sources */,
+				BB6017C91FD928AC009BD546 /* EventData.cpp in Sources */,
+				BB6017B41FD928AC009BD546 /* PathAttachment.cpp in Sources */,
+				BB6017A91FD928AC009BD546 /* EventTimeline.cpp in Sources */,
+				BB6017A21FD928AC009BD546 /* Attachment.cpp in Sources */,
+				BB6017C81FD928AC009BD546 /* AttachmentTimeline.cpp in Sources */,
+				BB6017E21FD928F7009BD546 /* KMemory.cpp in Sources */,
+				BB6017E71FD929D0009BD546 /* MiniCppUnit.cxx in Sources */,
+				BB6017DA1FD928AC009BD546 /* SlotData.cpp in Sources */,
+				BB6017BE1FD928AC009BD546 /* Timeline.cpp in Sources */,
+				BB6017BF1FD928AC009BD546 /* SkeletonBinary.cpp in Sources */,
+				BB6017131FD9289A009BD546 /* main.cpp in Sources */,
+				BB6017B21FD928AC009BD546 /* Constraint.cpp in Sources */,
+				BB6017A41FD928AC009BD546 /* TranslateTimeline.cpp in Sources */,
+				BB6017A71FD928AC009BD546 /* Bone.cpp in Sources */,
+				BB6017DC1FD928AC009BD546 /* ColorTimeline.cpp in Sources */,
+				BB6017AE1FD928AC009BD546 /* TransformConstraintTimeline.cpp in Sources */,
+				BB6017BB1FD928AC009BD546 /* Atlas.cpp in Sources */,
+				BB6017C21FD928AC009BD546 /* PointAttachment.cpp in Sources */,
+				BB6017C11FD928AC009BD546 /* LinkedMesh.cpp in Sources */,
+				BB6017A61FD928AC009BD546 /* Updatable.cpp in Sources */,
+				BB6017DB1FD928AC009BD546 /* ShearTimeline.cpp in Sources */,
+				BB6017C31FD928AC009BD546 /* RegionAttachment.cpp in Sources */,
+				BB6017D71FD928AC009BD546 /* Triangulator.cpp in Sources */,
+				BB6017EF1FD929F4009BD546 /* teamcity_messages.cpp in Sources */,
+				BB6017D61FD928AC009BD546 /* PathConstraintMixTimeline.cpp in Sources */,
+				BB6017CC1FD928AC009BD546 /* TransformConstraintData.cpp in Sources */,
+				BB6017C71FD928AC009BD546 /* DrawOrderTimeline.cpp in Sources */,
+				BB6017B61FD928AC009BD546 /* TransformConstraint.cpp in Sources */,
+				BB6017BC1FD928AC009BD546 /* ClippingAttachment.cpp in Sources */,
+				BB6017B81FD928AC009BD546 /* RTTI.cpp in Sources */,
+				BB6017A51FD928AC009BD546 /* Extension.cpp in Sources */,
+				BB6017C41FD928AC009BD546 /* DeformTimeline.cpp in Sources */,
+				BB6017A81FD928AC009BD546 /* AtlasAttachmentLoader.cpp in Sources */,
+				BB6017AA1FD928AC009BD546 /* PathConstraint.cpp in Sources */,
+				BB6017B71FD928AC009BD546 /* Skin.cpp in Sources */,
+				BB6017D21FD928AC009BD546 /* BoneData.cpp in Sources */,
+				BB6017C61FD928AC009BD546 /* AttachmentLoader.cpp in Sources */,
+				BB6017CF1FD928AC009BD546 /* Slot.cpp in Sources */,
+				BB6017B91FD928AC009BD546 /* MathUtil.cpp in Sources */,
+				BB6017B11FD928AC009BD546 /* AnimationStateData.cpp in Sources */,
+				BB6018081FD92AF4009BD546 /* SpineEventMonitor.cpp in Sources */,
+				BB6017E31FD928F7009BD546 /* KString.cpp in Sources */,
+				BB6017D41FD928AC009BD546 /* Event.cpp in Sources */,
+				BB6017D81FD928AC009BD546 /* Json.cpp in Sources */,
+				BB6017CE1FD928AC009BD546 /* TwoColorTimeline.cpp in Sources */,
+				BB6017AD1FD928AC009BD546 /* SkeletonData.cpp in Sources */,
+				BB6017D11FD928AC009BD546 /* SkeletonJson.cpp in Sources */,
+				BB6017D31FD928AC009BD546 /* IkConstraintTimeline.cpp in Sources */,
+				BB6017AF1FD928AC009BD546 /* IkConstraint.cpp in Sources */,
+				BB6017AC1FD928AC009BD546 /* TextureLoader.cpp in Sources */,
+				BB6017C51FD928AC009BD546 /* Animation.cpp in Sources */,
+				BB6017B01FD928AC009BD546 /* CurveTimeline.cpp in Sources */,
+				BB6017BD1FD928AC009BD546 /* PathConstraintData.cpp in Sources */,
+				BB6017D91FD928AC009BD546 /* SkeletonBounds.cpp in Sources */,
+				BB6017B31FD928AC009BD546 /* BoundingBoxAttachment.cpp in Sources */,
+				BB6017D51FD928AC009BD546 /* RotateTimeline.cpp in Sources */,
+				BB6017AB1FD928AC009BD546 /* VertexAttachment.cpp in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		BB6017141FD9289A009BD546 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.13;
+				MTL_ENABLE_DEBUG_INFO = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		BB6017151FD9289A009BD546 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				CODE_SIGN_IDENTITY = "-";
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 10.13;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		BB6017171FD9289A009BD546 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../spine-cpp/include\"";
+				OTHER_LDFLAGS = "-DKANJI_MEMTRACE";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Debug;
+		};
+		BB6017181FD9289A009BD546 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				HEADER_SEARCH_PATHS = "\"$(SRCROOT)/../../spine-cpp/include\"";
+				OTHER_LDFLAGS = "-DKANJI_MEMTRACE";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		BB60170A1FD9289A009BD546 /* Build configuration list for PBXProject "spine_unit_test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BB6017141FD9289A009BD546 /* Debug */,
+				BB6017151FD9289A009BD546 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		BB6017161FD9289A009BD546 /* Build configuration list for PBXNativeTarget "spine_unit_test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				BB6017171FD9289A009BD546 /* Debug */,
+				BB6017181FD9289A009BD546 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = BB6017071FD9289A009BD546 /* Project object */;
+}

+ 7 - 0
spine-cpp/spine-cpp-unit-tests/spine_unit_test/spine_unit_test.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:spine_unit_test.xcodeproj">
+   </FileRef>
+</Workspace>

+ 197 - 0
spine-cpp/spine-cpp-unit-tests/spine_unit_test/spine_unit_test/SimpleTest.h

@@ -0,0 +1,197 @@
+//
+//  SimpleTest.h
+//  TestHarness
+//
+//  Created by Stephen Gowen on 11/9/17.
+//  Copyright © 2017 Noctis Games. All rights reserved.
+//
+
+#ifndef SimpleTest_h
+#define SimpleTest_h
+
+#include "SpineEventMonitor.h"
+
+#include <spine/SkeletonJson.h>
+#include <spine/SkeletonData.h>
+#include <spine/Atlas.h>
+#include <spine/AnimationStateData.h>
+#include <spine/Skeleton.h>
+#include <spine/AnimationState.h>
+#include <spine/Animation.h>
+
+#include <vector>
+#include <spine/Extension.h>
+#include <spine/TextureLoader.h>
+#include <spine/Vector.h>
+
+#include <spine/CurveTimeline.h>
+#include <spine/VertexAttachment.h>
+#include <spine/Json.h>
+
+#include <spine/AttachmentLoader.h>
+#include <spine/AtlasAttachmentLoader.h>
+#include <spine/LinkedMesh.h>
+
+#include <new>
+
+#include "KMemory.h" // last include
+
+#define SPINEBOY_JSON "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/spineboy/export/spineboy-ess.json"
+#define SPINEBOY_ATLAS "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/spineboy/export/spineboy.atlas"
+
+#define RAPTOR_JSON "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/raptor/export/raptor-pro.json"
+#define RAPTOR_ATLAS "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/raptor/export/raptor.atlas"
+
+#define GOBLINS_JSON "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/goblins/export/goblins-pro.json"
+#define GOBLINS_ATLAS "/Users/sgowen/Dropbox/Documents/freelance/NoctisGames/github/dante/src/3rdparty/spine-runtimes/examples/goblins/export/goblins.atlas"
+
+#define MAX_RUN_TIME 6000 // equal to about 100 seconds of execution
+
+namespace Spine
+{
+    class SimpleTest
+    {
+    public:
+        static SkeletonData* readSkeletonJsonData(const char* filename, Atlas* atlas)
+        {
+            Vector<Atlas*> atlasArray;
+            atlasArray.push_back(atlas);
+            
+            SkeletonJson* skeletonJson = NEW(SkeletonJson);
+            new (skeletonJson) SkeletonJson(atlasArray);
+            assert(skeletonJson != 0);
+            
+            SkeletonData* skeletonData = skeletonJson->readSkeletonDataFile(filename);
+            assert(skeletonData != 0);
+            
+            DESTROY(SkeletonJson, skeletonJson);
+            
+            return skeletonData;
+        }
+        
+        typedef std::vector<std::string> AnimList;
+        
+        static size_t enumerateAnimations(AnimList& outList, SkeletonData* skeletonData)
+        {
+            if (skeletonData)
+            {
+                for (int n = 0; n < skeletonData->getAnimations().size(); n++)
+                {
+                    outList.push_back(skeletonData->getAnimations()[n]->getName());
+                }
+            }
+            
+            return outList.size();
+        }
+        
+        class MyTextureLoader : public TextureLoader
+        {
+            virtual void load(AtlasPage& page, std::string path)
+            {
+                page.rendererObject = NULL;
+                page.width = 2048;
+                page.height = 2048;
+            }
+            
+            virtual void unload(void* texture)
+            {
+                // TODO
+            }
+        };
+        
+        static void testRunner(const char* jsonName, const char* atlasName)
+        {
+            ///////////////////////////////////////////////////////////////////////////
+            // Global Animation Information
+            MyTextureLoader myTextureLoader;
+            Atlas* atlas = NEW(Atlas);
+            new (atlas) Atlas(atlasName, myTextureLoader);
+            assert(atlas != 0);
+            
+            SkeletonData* skeletonData = readSkeletonJsonData(jsonName, atlas);
+            assert(skeletonData != 0);
+            
+            AnimationStateData* stateData = NEW(AnimationStateData);
+            new (stateData) AnimationStateData(*skeletonData);
+            assert(stateData != 0);
+            stateData->setDefaultMix(0.2f); // force mixing
+            
+            ///////////////////////////////////////////////////////////////////////////
+            // Animation Instance
+            Skeleton* skeleton = NEW(Skeleton);
+            new (skeleton) Skeleton(*skeletonData);
+            assert(skeleton != 0);
+            
+            AnimationState* state = NEW(AnimationState);
+            new (state) AnimationState(*stateData);
+            assert(state != 0);
+            
+            ///////////////////////////////////////////////////////////////////////////
+            // Run animation
+            skeleton->setToSetupPose();
+            SpineEventMonitor eventMonitor(state);
+            
+            AnimList anims; // Let's chain all the animations together as a test
+            size_t count = enumerateAnimations(anims, skeletonData);
+            if (count > 0)
+            {
+                state->setAnimation(0, anims[0].c_str(), false);
+            }
+            
+            for (size_t i = 1; i < count; ++i)
+            {
+                state->addAnimation(0, anims[i].c_str(), false, 0.0f);
+            }
+            
+            // Run Loop
+            for (int i = 0; i < MAX_RUN_TIME && eventMonitor.isAnimationPlaying(); ++i)
+            {
+                const float timeSlice = 1.0f / 60.0f;
+                skeleton->update(timeSlice);
+                state->update(timeSlice);
+                state->apply(*skeleton);
+            }
+            
+            ///////////////////////////////////////////////////////////////////////////
+            // Dispose Instance
+            DESTROY(Skeleton, skeleton);
+            DESTROY(AnimationState, state);
+            
+            ///////////////////////////////////////////////////////////////////////////
+            // Dispose Global
+            DESTROY(AnimationStateData, stateData);
+            DESTROY(SkeletonData, skeletonData);
+            DESTROY(Atlas, atlas);
+        }
+        
+        static void spineboyTestCase()
+        {
+            testRunner(SPINEBOY_JSON, SPINEBOY_ATLAS);
+        }
+        
+        static void raptorTestCase()
+        {
+            testRunner(RAPTOR_JSON, RAPTOR_ATLAS);
+        }
+        
+        static void goblinsTestCase()
+        {
+            testRunner(GOBLINS_JSON, GOBLINS_ATLAS);
+        }
+        
+        static void test()
+        {
+            spineboyTestCase();
+            raptorTestCase();
+            goblinsTestCase();
+        }
+        
+    private:
+        // ctor, copy ctor, and assignment should be private in a Singleton
+        SimpleTest();
+        SimpleTest(const SimpleTest&);
+        SimpleTest& operator=(const SimpleTest&);
+    };
+}
+
+#endif /* SimpleTest_h */

+ 111 - 0
spine-cpp/spine-cpp-unit-tests/spine_unit_test/spine_unit_test/main.cpp

@@ -0,0 +1,111 @@
+//
+//  main.cpp
+//  spine_unit_test
+//
+//  Created by Stephen Gowen on 12/7/17.
+//  Copyright © 2017 Noctis Games. All rights reserved.
+//
+
+#ifdef WIN32
+#include <direct.h>
+#else
+#include <unistd.h>
+#endif // WIN32
+
+#include <ctime>
+#include "KString.h"
+#include <stdio.h>
+
+#include "spine/Extension.h"
+
+#include "SimpleTest.h"
+
+#include "KMemory.h" // last include
+
+using namespace Spine;
+
+class KanjiSpineExtension : public DefaultSpineExtension
+{
+public:
+    static KanjiSpineExtension* getInstance();
+    
+    virtual ~KanjiSpineExtension();
+    
+    virtual void* spineAlloc(size_t size, const char* file, int line);
+    
+    virtual void* spineCalloc(size_t num, size_t size, const char* file, int line);
+    
+    virtual void* spineRealloc(void* ptr, size_t size, const char* file, int line);
+    
+    virtual void spineFree(void* mem);
+    
+protected:
+    KanjiSpineExtension();
+};
+
+KanjiSpineExtension* KanjiSpineExtension::getInstance()
+{
+    static KanjiSpineExtension ret;
+    return &ret;
+}
+
+KanjiSpineExtension::~KanjiSpineExtension()
+{
+    // Empty
+}
+
+void* KanjiSpineExtension::spineAlloc(size_t size, const char* file, int line)
+{
+    return _kanjimalloc(size);
+}
+
+void* KanjiSpineExtension::spineCalloc(size_t num, size_t size, const char* file, int line)
+{
+    void* ptr = spineAlloc(num * size, file, line);
+    if (ptr)
+    {
+        memset(ptr, 0, num * size);
+    }
+    
+    return ptr;
+}
+
+void* KanjiSpineExtension::spineRealloc(void* ptr, size_t size, const char* file, int line)
+{
+    return _kanjirealloc(ptr, size);
+}
+
+void KanjiSpineExtension::spineFree(void* mem)
+{
+    _kanjifree(mem);
+}
+
+KanjiSpineExtension::KanjiSpineExtension() : DefaultSpineExtension()
+{
+    // Empty
+}
+
+int main(int argc, char* argv[])
+{
+    SpineExtension::setInstance(KanjiSpineExtension::getInstance());
+    
+    // Start Timing
+    time_t start_time, end_time;
+    time(&start_time);
+    
+    /* Set working directory to current location for opening test data */
+#ifdef WIN32
+    _chdir( GetFileDir(argv[0], false).c_str() );
+#else
+    chdir(GetFileDir(argv[0], false).c_str());
+#endif
+    
+    SimpleTest::test();
+    
+    // End Timing
+    time(&end_time);
+    double secs = difftime(end_time,start_time);
+    printf("\n\n%i minutes and %i seconds of your life taken from you by these tests.\n", ((int)secs) / 60, ((int)secs) % 60);
+    
+    return 0;
+}

+ 4 - 4
spine-cpp/spine-cpp-unit-tests/tests/C_InterfaceTestFixture.cpp

@@ -35,9 +35,7 @@
 #define GOBLINS_JSON "testdata/goblins/goblins-pro.json"
 #define GOBLINS_ATLAS "testdata/goblins/goblins.atlas"
 
-#define MAX_RUN_TIME 6000 // equal to about 100 seconds of execution
-
-using namespace Spine;
+#define MAX_RUN_TIME 6000 // equal to about 100 seconds of execution
 
 void C_InterfaceTestFixture::setUp()
 {
@@ -47,8 +45,10 @@ void C_InterfaceTestFixture::tearDown()
 {
 }
 
-static SkeletonData* readSkeletonJsonData(const char* filename, Atlas* atlas)
+static Spine::SkeletonData* readSkeletonJsonData(const char* filename, Atlas* atlas)
 {
+    using namespace Spine;
+    
     Vector<Atlas*> atlasArray;
     atlasArray.push_back(atlas);
     

+ 77 - 72
spine-cpp/spine-cpp-unit-tests/tests/SpineEventMonitor.cpp

@@ -2,8 +2,13 @@
 
 #include "KString.h"
 
+#include <spine/Animation.h>
+#include <spine/Event.h>
+
 #include "KMemory.h" // Last include
 
+using namespace Spine;
+
 SpineEventMonitor::SpineEventMonitor(AnimationState* _pAnimationState /*= nullptr*/)
 {
 	bLogging = false;
@@ -17,53 +22,53 @@ SpineEventMonitor::~SpineEventMonitor()
 
 void SpineEventMonitor::RegisterListener(AnimationState * _pAnimationState)
 {
-//    if (_pAnimationState)
-//    {
-//        _pAnimationState->rendererObject = this;
-//        _pAnimationState->listener = (spAnimationStateListener)&SpineEventMonitor::spineAnimStateHandler;
-//    }
-//    pAnimState = _pAnimationState;
+    if (_pAnimationState)
+    {
+        _pAnimationState->setRendererObject(this);
+        _pAnimationState->setOnAnimationEventFunc(&SpineEventMonitor::spineAnimStateHandler);
+    }
+    pAnimState = _pAnimationState;
 }
 
 bool SpineEventMonitor::isAnimationPlaying()
 {
-//    if (pAnimState)
-//    {
-//        return spAnimationState_getCurrent(pAnimState, 0) != 0;
-//    }
+    if (pAnimState)
+    {
+        return pAnimState->getCurrent(0) != NULL;
+    }
 	return false;
 }
 
-void SpineEventMonitor::spineAnimStateHandler(AnimationState * state, int type, spTrackEntry * entry, spEvent * event)
+void SpineEventMonitor::spineAnimStateHandler(AnimationState* state, EventType type, TrackEntry* entry, Event* event)
 {
-//    if (state && state->rendererObject)
-//    {
-//        SpineEventMonitor* pEventMonitor = (SpineEventMonitor*)state->rendererObject;
-//        pEventMonitor->OnSpineAnimationStateEvent(state, type, entry, event);
-//    }
+    if (state && state->getRendererObject())
+    {
+        SpineEventMonitor* pEventMonitor = (SpineEventMonitor*)state->getRendererObject();
+        pEventMonitor->OnSpineAnimationStateEvent(state, type, entry, event);
+    }
 }
 
-void SpineEventMonitor::OnSpineAnimationStateEvent(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
+void SpineEventMonitor::OnSpineAnimationStateEvent(AnimationState* state, EventType type, TrackEntry* entry, Event* event)
 {
-//    const char* eventName = 0;
-//    if (state == pAnimState)
-//    {
-//        // only monitor ours
-//        switch(type)
-//        {
-//        case SP_ANIMATION_START: eventName = "SP_ANIMATION_START"; break;
-//        case SP_ANIMATION_INTERRUPT: eventName = "SP_ANIMATION_INTERRUPT"; break;
-//        case SP_ANIMATION_END: eventName = "SP_ANIMATION_END"; break;
-//        case SP_ANIMATION_COMPLETE: eventName = "SP_ANIMATION_COMPLETE"; break;
-//        case SP_ANIMATION_DISPOSE: eventName = "SP_ANIMATION_DISPOSE"; break;
-//        case SP_ANIMATION_EVENT: eventName = "SP_ANIMATION_EVENT"; break;
-//        default:
-//            break;
-//        }
-//
-//        if (bLogging && eventName && trackEntry && trackEntry->animation && trackEntry->animation->name)
-//            KOutputDebug(DEBUGLVL, "[%s : '%s']\n", eventName,  trackEntry->animation->name);//*/
-//    }
+    const char* eventName = 0;
+    if (state == pAnimState)
+    {
+        // only monitor ours
+        switch(type)
+        {
+        case EventType_Start: eventName = "EventType_Start"; break;
+        case EventType_Interrupt: eventName = "EventType_Interrupt"; break;
+        case EventType_End: eventName = "EventType_End"; break;
+        case EventType_Complete: eventName = "EventType_Complete"; break;
+        case EventType_Dispose: eventName = "EventType_Dispose"; break;
+        case EventType_Event: eventName = "EventType_Event"; break;
+        default:
+            break;
+        }
+
+        if (bLogging && eventName && entry && entry->getAnimation())
+            KOutputDebug(DEBUGLVL, "[%s : '%s']\n", eventName, entry->getAnimation()->getName().c_str());//*/
+    }
 }
 
 InterruptMonitor::InterruptMonitor(AnimationState * _pAnimationState):
@@ -98,7 +103,7 @@ InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType, const st
 }
 
 // stops the first encounter of spEventType on the specified TrackEntry
-InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType, spTrackEntry * theTrackEntry)
+InterruptMonitor& InterruptMonitor::AddInterruptEvent(int theEventType, TrackEntry * theTrackEntry)
 {
 	InterruptEvent ev;
 	ev.mEventType = theEventType;
@@ -117,7 +122,7 @@ InterruptMonitor& InterruptMonitor::AddInterruptEventTrigger(const std::string &
 	return *this;
 }
 
-void InterruptMonitor::OnSpineAnimationStateEvent(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
+void InterruptMonitor::OnSpineAnimationStateEvent(AnimationState * state, EventType type, TrackEntry * trackEntry, Event * event)
 {
 	SpineEventMonitor::OnSpineAnimationStateEvent(state, type, trackEntry, event);
 
@@ -136,41 +141,41 @@ void InterruptMonitor::OnSpineAnimationStateEvent(AnimationState * state, int ty
 	}
 }
 
-inline bool InterruptMonitor::InterruptEvent::matches(AnimationState * state, int type, spTrackEntry * trackEntry, spEvent * event)
+inline bool InterruptMonitor::InterruptEvent::matches(AnimationState * state, EventType type, TrackEntry * trackEntry, Event * event)
 {
 	// Must match spEventType {SP_ANIMATION_START, SP_ANIMATION_INTERRUPT, SP_ANIMATION_END, SP_ANIMATION_COMPLETE, SP_ANIMATION_DISPOSE, SP_ANIMATION_EVENT }
-//    if (mEventType == type)
-//    {
-//        // Looking for specific TrackEntry by pointer
-//        if (mTrackEntry != 0)
-//        {
-//            return mTrackEntry == trackEntry;
-//        }
-//
-//        // looking for Animation Track by name
-//        if (!mAnimName.empty())
-//        {
-//            if (trackEntry && trackEntry->animation && trackEntry->animation->name)
-//            {
-//                if (CompareNoCase(trackEntry->animation->name, mAnimName) == 0)
-//                {
-//                    return true;
-//                }
-//            }
-//            return false;
-//        }
-//
-//        // looking for Event String Text
-//        if (!mEventName.empty())
-//        {
-//            if (event && event->stringValue)
-//            {
-//                return (CompareNoCase(event->stringValue, mEventName) == 0);
-//            }
-//            return false;
-//        }
-//
-//        return true; // waiting for ANY spEventType that matches
-//    }
+    if (mEventType == type)
+    {
+        // Looking for specific TrackEntry by pointer
+        if (mTrackEntry != 0)
+        {
+            return mTrackEntry == trackEntry;
+        }
+
+        // looking for Animation Track by name
+        if (!mAnimName.empty())
+        {
+            if (trackEntry && trackEntry->getAnimation())
+            {
+                if (CompareNoCase(trackEntry->getAnimation()->getName(), mAnimName) == 0)
+                {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        // looking for Event String Text
+        if (!mEventName.empty())
+        {
+            if (event)
+            {
+                return (CompareNoCase(event->getStringValue(), mEventName) == 0);
+            }
+            return false;
+        }
+
+        return true; // waiting for ANY spEventType that matches
+    }
 	return false;
 }

+ 9 - 14
spine-cpp/spine-cpp-unit-tests/tests/SpineEventMonitor.h

@@ -7,12 +7,7 @@
 #pragma once 
 
 #include <vector>
-#include <string>
-
-// forward declarations
-typedef struct spAnimationState spAnimationState;
-typedef struct spTrackEntry spTrackEntry;
-typedef struct spEvent spEvent;
+#include <string>
 
 #include <spine/AnimationState.h>
 
@@ -22,7 +17,7 @@ using namespace Spine;
 //	class: 	SpineEventMonitor
 //	
 //	purpose:	Monitor spAnimationState Events and report when there
-//				are no more spTrackEntry(s) waiting to play on track 0;
+//				are no more TrackEntry(s) waiting to play on track 0;
 //
 //				Also allows for debug printing of Events to console.
 /////////////////////////////////////////////////////////////////////
@@ -40,8 +35,8 @@ public:
 	virtual bool isAnimationPlaying();
 
 protected:
-	static void	spineAnimStateHandler(AnimationState* state, int type, spTrackEntry* entry, spEvent* event);
-	virtual void OnSpineAnimationStateEvent(AnimationState* state, int type, spTrackEntry* trackEntry, spEvent* event);
+	static void	spineAnimStateHandler(AnimationState* state, EventType type, TrackEntry* entry, Event* event);
+	virtual void OnSpineAnimationStateEvent(AnimationState* state, EventType type, TrackEntry* entry, Event* event);
 
 protected:
 	AnimationState	*pAnimState;
@@ -65,11 +60,11 @@ private:
 			mTrackEntry = 0;
 		}
 
-		bool matches(AnimationState* state, int type, spTrackEntry* trackEntry, spEvent* event);
+		bool matches(AnimationState* state, EventType type, TrackEntry* trackEntry, Event* event);
 
 		std::string mAnimName;
 		int mEventType;
-		spTrackEntry* mTrackEntry;
+		TrackEntry* mTrackEntry;
 		std::string mEventName;
 	};
 	typedef std::vector<InterruptEvent> InterruptEventStack;
@@ -84,11 +79,11 @@ public:
 public:
 	InterruptMonitor& AddInterruptEvent(int theEventType);
 	InterruptMonitor& AddInterruptEvent(int theEventType, const std::string& theAnimationName);
-	InterruptMonitor& AddInterruptEvent(int theEventType, spTrackEntry* theTrackEntry);
+	InterruptMonitor& AddInterruptEvent(int theEventType, TrackEntry* theTrackEntry);
 	InterruptMonitor& AddInterruptEventTrigger(const std::string& theEventTriggerName);
 
 protected:
-	virtual void OnSpineAnimationStateEvent(AnimationState* state, int type, spTrackEntry* trackEntry, spEvent* event) override;
+	virtual void OnSpineAnimationStateEvent(AnimationState* state, EventType type, TrackEntry* trackEntry, Event* event) override;
 	virtual void OnMatchingComplete() {}
 
 protected:
@@ -119,7 +114,7 @@ eventMonitor.SetDebugLogging(true);
 
 // Interrupt the animation on this specific sequence of spEventType(s)
 eventMonitor
-	.AddInterruptEvent(SP_ANIMATION_INTERRUPT, "jump")	// First, wait for INTERRUPT signal on the 'jump' animation spTrackEntry
+	.AddInterruptEvent(SP_ANIMATION_INTERRUPT, "jump")	// First, wait for INTERRUPT signal on the 'jump' animation TrackEntry
 	.AddInterruptEvent(SP_ANIMATION_START);				// Then, stop on any following START signal
 
 

+ 5 - 1
spine-cpp/spine-cpp/include/spine/AnimationState.h

@@ -56,7 +56,7 @@ namespace Spine
     class Skeleton;
     class RotateTimeline;
     
-    typedef void (*OnAnimationEventFunc) (AnimationState& state, EventType type, TrackEntry* entry, Event* event);
+    typedef void (*OnAnimationEventFunc) (AnimationState* state, EventType type, TrackEntry* entry, Event* event);
     
     /// State for the playback of an animation
     class TrackEntry
@@ -375,6 +375,8 @@ namespace Spine
         float getTimeScale();
         void setTimeScale(float inValue);
         void setOnAnimationEventFunc(OnAnimationEventFunc inValue);
+        void setRendererObject(void* inValue);
+        void* getRendererObject();
         
     private:
         static const int Subsequent, First, Dip, DipMix;
@@ -389,6 +391,8 @@ namespace Spine
         Vector<int> _propertyIDs;
         Vector<TrackEntry*> _mixingTo;
         bool _animationsChanged;
+        
+        void* _rendererObject;
 
         OnAnimationEventFunc _onAnimationEventFunc;
         

+ 19 - 9
spine-cpp/spine-cpp/src/spine/AnimationState.cpp

@@ -48,7 +48,7 @@
 
 namespace Spine
 {
-    void dummyOnAnimationEventFunc(AnimationState& state, EventType type, TrackEntry* entry, Event* event = NULL)
+    void dummyOnAnimationEventFunc(AnimationState* state, EventType type, TrackEntry* entry, Event* event = NULL)
     {
         // Empty
     }
@@ -320,22 +320,22 @@ namespace Spine
                 case EventType_Start:
                 case EventType_Interrupt:
                 case EventType_Complete:
-                    trackEntry->_onAnimationEventFunc(state, queueEntry->_type, trackEntry, NULL);
-                    state._onAnimationEventFunc(state, queueEntry->_type, trackEntry, NULL);
+                    trackEntry->_onAnimationEventFunc(&state, queueEntry->_type, trackEntry, NULL);
+                    state._onAnimationEventFunc(&state, queueEntry->_type, trackEntry, NULL);
                     break;
                 case EventType_End:
-                    trackEntry->_onAnimationEventFunc(state, queueEntry->_type, trackEntry, NULL);
-                    state._onAnimationEventFunc(state, queueEntry->_type, trackEntry, NULL);
+                    trackEntry->_onAnimationEventFunc(&state, queueEntry->_type, trackEntry, NULL);
+                    state._onAnimationEventFunc(&state, queueEntry->_type, trackEntry, NULL);
                     /* Yes, we want to fall through here */
                 case EventType_Dispose:
-                    trackEntry->_onAnimationEventFunc(state, EventType_Dispose, trackEntry, NULL);
-                    state._onAnimationEventFunc(state, EventType_Dispose, trackEntry, NULL);
+                    trackEntry->_onAnimationEventFunc(&state, EventType_Dispose, trackEntry, NULL);
+                    state._onAnimationEventFunc(&state, EventType_Dispose, trackEntry, NULL);
                     trackEntry->reset();
                     _trackEntryPool.free(trackEntry);
                     break;
                 case EventType_Event:
-                    trackEntry->_onAnimationEventFunc(state, queueEntry->_type, trackEntry, queueEntry->_event);
-                    state._onAnimationEventFunc(state, queueEntry->_type, trackEntry, queueEntry->_event);
+                    trackEntry->_onAnimationEventFunc(&state, queueEntry->_type, trackEntry, queueEntry->_event);
+                    state._onAnimationEventFunc(&state, queueEntry->_type, trackEntry, queueEntry->_event);
                     break;
             }
         }
@@ -732,6 +732,16 @@ namespace Spine
         _onAnimationEventFunc = inValue;
     }
     
+    void AnimationState::setRendererObject(void* inValue)
+    {
+        _rendererObject = inValue;
+    }
+    
+    void* AnimationState::getRendererObject()
+    {
+        return _rendererObject;
+    }
+    
     Animation* AnimationState::getEmptyAnimation()
     {
         static Vector<Timeline*> timelines;

+ 2 - 1
spine-cpp/spine-cpp/src/spine/Atlas.cpp

@@ -145,7 +145,8 @@ namespace Spine
 
                 FREE(name);
 
-                assert(readTuple(&begin, end, tuple) == 2);
+                int tupleVal = readTuple(&begin, end, tuple);
+                assert(tupleVal == 2);
 
                 /* size is only optional for an atlas packed with an old TexturePacker. */
                 page->width = toInt(tuple);