コード例 #1
0
ファイル: SkeletonBinary.cs プロジェクト: zhanpang/test_tank
        public SkeletonData ReadSkeletonData(Stream input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            float scale = Scale;

            var skeletonData = new SkeletonData();

            skeletonData.hash = ReadString(input);
            if (skeletonData.hash.Length == 0)
            {
                skeletonData.hash = null;
            }
            skeletonData.version = ReadString(input);
            if (skeletonData.version.Length == 0)
            {
                skeletonData.version = null;
            }
            skeletonData.width  = ReadFloat(input);
            skeletonData.height = ReadFloat(input);

            bool nonessential = ReadBoolean(input);

            if (nonessential)
            {
                skeletonData.imagesPath = ReadString(input);
                if (skeletonData.imagesPath.Length == 0)
                {
                    skeletonData.imagesPath = null;
                }
            }

            // Bones.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   name     = ReadString(input);
                BoneData parent   = i == 0 ? null : skeletonData.bones.Items[ReadVarint(input, true)];
                BoneData boneData = new BoneData(name, parent);
                boneData.rotation        = ReadFloat(input);
                boneData.x               = ReadFloat(input) * scale;
                boneData.y               = ReadFloat(input) * scale;
                boneData.scaleX          = ReadFloat(input);
                boneData.scaleY          = ReadFloat(input);
                boneData.shearX          = ReadFloat(input);
                boneData.shearY          = ReadFloat(input);
                boneData.length          = ReadFloat(input) * scale;
                boneData.inheritRotation = ReadBoolean(input);
                boneData.inheritScale    = ReadBoolean(input);
                if (nonessential)
                {
                    ReadInt(input);                               // Skip bone color.
                }
                skeletonData.bones.Add(boneData);
            }

            // IK constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                IkConstraintData ikConstraintData = new IkConstraintData(ReadString(input));
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    ikConstraintData.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                ikConstraintData.target        = skeletonData.bones.Items[ReadVarint(input, true)];
                ikConstraintData.mix           = ReadFloat(input);
                ikConstraintData.bendDirection = ReadSByte(input);
                skeletonData.ikConstraints.Add(ikConstraintData);
            }

            // Transform constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                TransformConstraintData transformConstraintData = new TransformConstraintData(ReadString(input));
                transformConstraintData.bone           = skeletonData.bones.Items[ReadVarint(input, true)];
                transformConstraintData.target         = skeletonData.bones.Items[ReadVarint(input, true)];
                transformConstraintData.offsetRotation = ReadFloat(input);
                transformConstraintData.offsetX        = ReadFloat(input) * scale;
                transformConstraintData.offsetY        = ReadFloat(input) * scale;
                transformConstraintData.offsetScaleX   = ReadFloat(input);
                transformConstraintData.offsetScaleY   = ReadFloat(input);
                transformConstraintData.offsetShearY   = ReadFloat(input);
                transformConstraintData.rotateMix      = ReadFloat(input);
                transformConstraintData.translateMix   = ReadFloat(input);
                transformConstraintData.scaleMix       = ReadFloat(input);
                transformConstraintData.shearMix       = ReadFloat(input);
                skeletonData.transformConstraints.Add(transformConstraintData);
            }

            // Slots.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   slotName = ReadString(input);
                BoneData boneData = skeletonData.bones.Items[ReadVarint(input, true)];
                SlotData slotData = new SlotData(slotName, boneData);
                int      color    = ReadInt(input);
                slotData.r = ((color & 0xff000000) >> 24) / 255f;
                slotData.g = ((color & 0x00ff0000) >> 16) / 255f;
                slotData.b = ((color & 0x0000ff00) >> 8) / 255f;
                slotData.a = ((color & 0x000000ff)) / 255f;
                slotData.attachmentName = ReadString(input);
                slotData.blendMode      = (BlendMode)ReadVarint(input, true);
                skeletonData.slots.Add(slotData);
            }

            // Default skin.
            Skin defaultSkin = ReadSkin(input, "default", nonessential);

            if (defaultSkin != null)
            {
                skeletonData.defaultSkin = defaultSkin;
                skeletonData.skins.Add(defaultSkin);
            }

            // Skins.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                skeletonData.skins.Add(ReadSkin(input, ReadString(input), nonessential));
            }

            // Linked meshes.
            for (int i = 0, n = linkedMeshes.Count; i < n; i++)
            {
                SkeletonJson.LinkedMesh linkedMesh = linkedMeshes[i];
                Skin skin = linkedMesh.skin == null ? skeletonData.DefaultSkin : skeletonData.FindSkin(linkedMesh.skin);
                if (skin == null)
                {
                    throw new Exception("Skin not found: " + linkedMesh.skin);
                }
                Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
                if (parent == null)
                {
                    throw new Exception("Parent mesh not found: " + linkedMesh.parent);
                }
                if (linkedMesh.mesh is MeshAttachment)
                {
                    MeshAttachment mesh = (MeshAttachment)linkedMesh.mesh;
                    mesh.ParentMesh = (MeshAttachment)parent;
                    mesh.UpdateUVs();
                }
                else
                {
                    WeightedMeshAttachment mesh = (WeightedMeshAttachment)linkedMesh.mesh;
                    mesh.ParentMesh = (WeightedMeshAttachment)parent;
                    mesh.UpdateUVs();
                }
            }
            linkedMeshes.Clear();

            // Events.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                EventData eventData = new EventData(ReadString(input));
                eventData.Int    = ReadVarint(input, false);
                eventData.Float  = ReadFloat(input);
                eventData.String = ReadString(input);
                skeletonData.events.Add(eventData);
            }

            // Animations.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                ReadAnimation(ReadString(input), input, skeletonData);
            }

            skeletonData.bones.TrimExcess();
            skeletonData.slots.TrimExcess();
            skeletonData.skins.TrimExcess();
            skeletonData.events.TrimExcess();
            skeletonData.animations.TrimExcess();
            skeletonData.ikConstraints.TrimExcess();
            return(skeletonData);
        }
コード例 #2
0
        public SkeletonData ReadSkeletonData(Stream input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            float scale = Scale;

            var skeletonData = new SkeletonData();

            skeletonData.hash = ReadString(input);
            if (skeletonData.hash.Length == 0)
            {
                skeletonData.hash = null;
            }
            skeletonData.version = ReadString(input);
            if (skeletonData.version.Length == 0)
            {
                skeletonData.version = null;
            }
            skeletonData.width  = ReadFloat(input);
            skeletonData.height = ReadFloat(input);

            bool nonessential = ReadBoolean(input);

            if (nonessential)
            {
                skeletonData.fps        = ReadFloat(input);
                skeletonData.imagesPath = ReadString(input);
                if (skeletonData.imagesPath.Length == 0)
                {
                    skeletonData.imagesPath = null;
                }
            }

            // Bones.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   name   = ReadString(input);
                BoneData parent = i == 0 ? null : skeletonData.bones.Items[ReadVarint(input, true)];
                BoneData data   = new BoneData(i, name, parent);
                data.rotation      = ReadFloat(input);
                data.x             = ReadFloat(input) * scale;
                data.y             = ReadFloat(input) * scale;
                data.scaleX        = ReadFloat(input);
                data.scaleY        = ReadFloat(input);
                data.shearX        = ReadFloat(input);
                data.shearY        = ReadFloat(input);
                data.length        = ReadFloat(input) * scale;
                data.transformMode = TransformModeValues[ReadVarint(input, true)];
                if (nonessential)
                {
                    ReadInt(input);                               // Skip bone color.
                }
                skeletonData.bones.Add(data);
            }

            // Slots.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   slotName = ReadString(input);
                BoneData boneData = skeletonData.bones.Items[ReadVarint(input, true)];
                SlotData slotData = new SlotData(i, slotName, boneData);
                int      color    = ReadInt(input);
                slotData.r = ((color & 0xff000000) >> 24) / 255f;
                slotData.g = ((color & 0x00ff0000) >> 16) / 255f;
                slotData.b = ((color & 0x0000ff00) >> 8) / 255f;
                slotData.a = ((color & 0x000000ff)) / 255f;

                int darkColor = ReadInt(input);                 // 0x00rrggbb
                if (darkColor != -1)
                {
                    slotData.hasSecondColor = true;
                    slotData.r2             = ((darkColor & 0x00ff0000) >> 16) / 255f;
                    slotData.g2             = ((darkColor & 0x0000ff00) >> 8) / 255f;
                    slotData.b2             = ((darkColor & 0x000000ff)) / 255f;
                }

                slotData.attachmentName = ReadString(input);
                slotData.blendMode      = (BlendMode)ReadVarint(input, true);
                skeletonData.slots.Add(slotData);
            }

            // IK constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                IkConstraintData data = new IkConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target        = skeletonData.bones.Items[ReadVarint(input, true)];
                data.mix           = ReadFloat(input);
                data.bendDirection = ReadSByte(input);
                skeletonData.ikConstraints.Add(data);
            }

            // Transform constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                TransformConstraintData data = new TransformConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target         = skeletonData.bones.Items[ReadVarint(input, true)];
                data.local          = ReadBoolean(input);
                data.relative       = ReadBoolean(input);
                data.offsetRotation = ReadFloat(input);
                data.offsetX        = ReadFloat(input) * scale;
                data.offsetY        = ReadFloat(input) * scale;
                data.offsetScaleX   = ReadFloat(input);
                data.offsetScaleY   = ReadFloat(input);
                data.offsetShearY   = ReadFloat(input);
                data.rotateMix      = ReadFloat(input);
                data.translateMix   = ReadFloat(input);
                data.scaleMix       = ReadFloat(input);
                data.shearMix       = ReadFloat(input);
                skeletonData.transformConstraints.Add(data);
            }

            // Path constraints
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                PathConstraintData data = new PathConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target         = skeletonData.slots.Items[ReadVarint(input, true)];
                data.positionMode   = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(ReadVarint(input, true));
                data.spacingMode    = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(ReadVarint(input, true));
                data.rotateMode     = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(ReadVarint(input, true));
                data.offsetRotation = ReadFloat(input);
                data.position       = ReadFloat(input);
                if (data.positionMode == PositionMode.Fixed)
                {
                    data.position *= scale;
                }
                data.spacing = ReadFloat(input);
                if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
                {
                    data.spacing *= scale;
                }
                data.rotateMix    = ReadFloat(input);
                data.translateMix = ReadFloat(input);
                skeletonData.pathConstraints.Add(data);
            }

            // Default skin.
            Skin defaultSkin = ReadSkin(input, skeletonData, "default", nonessential);

            if (defaultSkin != null)
            {
                skeletonData.defaultSkin = defaultSkin;
                skeletonData.skins.Add(defaultSkin);
            }

            // Skins.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                skeletonData.skins.Add(ReadSkin(input, skeletonData, ReadString(input), nonessential));
            }

            // Linked meshes.
            for (int i = 0, n = linkedMeshes.Count; i < n; i++)
            {
                SkeletonJson.LinkedMesh linkedMesh = linkedMeshes[i];
                Skin skin = linkedMesh.skin == null ? skeletonData.DefaultSkin : skeletonData.FindSkin(linkedMesh.skin);
                if (skin == null)
                {
                    throw new Exception("Skin not found: " + linkedMesh.skin);
                }
                Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
                if (parent == null)
                {
                    throw new Exception("Parent mesh not found: " + linkedMesh.parent);
                }
                linkedMesh.mesh.ParentMesh = (MeshAttachment)parent;
                linkedMesh.mesh.UpdateUVs();
            }
            linkedMeshes.Clear();

            // Events.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                EventData data = new EventData(ReadString(input));
                data.Int    = ReadVarint(input, false);
                data.Float  = ReadFloat(input);
                data.String = ReadString(input);
                skeletonData.events.Add(data);
            }

            // Animations.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                ReadAnimation(ReadString(input), input, skeletonData);
            }

            skeletonData.bones.TrimExcess();
            skeletonData.slots.TrimExcess();
            skeletonData.skins.TrimExcess();
            skeletonData.events.TrimExcess();
            skeletonData.animations.TrimExcess();
            skeletonData.ikConstraints.TrimExcess();
            skeletonData.pathConstraints.TrimExcess();
            return(skeletonData);
        }
コード例 #3
0
        public SkeletonData ReadSkeletonData(Stream input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            float        scale        = Scale;
            SkeletonData skeletonData = new SkeletonData();

            skeletonData.hash = ReadString(input);
            if (skeletonData.hash.Length == 0)
            {
                skeletonData.hash = null;
            }
            skeletonData.version = ReadString(input);
            if (skeletonData.version.Length == 0)
            {
                skeletonData.version = null;
            }
            skeletonData.width  = ReadFloat(input);
            skeletonData.height = ReadFloat(input);
            bool flag = ReadBoolean(input);

            if (flag)
            {
                skeletonData.fps        = ReadFloat(input);
                skeletonData.imagesPath = ReadString(input);
                if (skeletonData.imagesPath.Length == 0)
                {
                    skeletonData.imagesPath = null;
                }
            }
            int i = 0;

            for (int num = ReadVarint(input, optimizePositive: true); i < num; i++)
            {
                string   name     = ReadString(input);
                BoneData parent   = (i != 0) ? skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)] : null;
                BoneData boneData = new BoneData(i, name, parent);
                boneData.rotation      = ReadFloat(input);
                boneData.x             = ReadFloat(input) * scale;
                boneData.y             = ReadFloat(input) * scale;
                boneData.scaleX        = ReadFloat(input);
                boneData.scaleY        = ReadFloat(input);
                boneData.shearX        = ReadFloat(input);
                boneData.shearY        = ReadFloat(input);
                boneData.length        = ReadFloat(input) * scale;
                boneData.transformMode = TransformModeValues[ReadVarint(input, optimizePositive: true)];
                if (flag)
                {
                    ReadInt(input);
                }
                skeletonData.bones.Add(boneData);
            }
            int j = 0;

            for (int num2 = ReadVarint(input, optimizePositive: true); j < num2; j++)
            {
                string   name2     = ReadString(input);
                BoneData boneData2 = skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)];
                SlotData slotData  = new SlotData(j, name2, boneData2);
                int      num3      = ReadInt(input);
                slotData.r = (float)((num3 & 4278190080u) >> 24) / 255f;
                slotData.g = (float)((num3 & 0xFF0000) >> 16) / 255f;
                slotData.b = (float)((num3 & 0xFF00) >> 8) / 255f;
                slotData.a = (float)(num3 & 0xFF) / 255f;
                int num4 = ReadInt(input);
                if (num4 != -1)
                {
                    slotData.hasSecondColor = true;
                    slotData.r2             = (float)((num4 & 0xFF0000) >> 16) / 255f;
                    slotData.g2             = (float)((num4 & 0xFF00) >> 8) / 255f;
                    slotData.b2             = (float)(num4 & 0xFF) / 255f;
                }
                slotData.attachmentName = ReadString(input);
                slotData.blendMode      = (BlendMode)ReadVarint(input, optimizePositive: true);
                skeletonData.slots.Add(slotData);
            }
            int k = 0;

            for (int num5 = ReadVarint(input, optimizePositive: true); k < num5; k++)
            {
                IkConstraintData ikConstraintData = new IkConstraintData(ReadString(input));
                ikConstraintData.order = ReadVarint(input, optimizePositive: true);
                int l = 0;
                for (int num6 = ReadVarint(input, optimizePositive: true); l < num6; l++)
                {
                    ikConstraintData.bones.Add(skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)]);
                }
                ikConstraintData.target        = skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)];
                ikConstraintData.mix           = ReadFloat(input);
                ikConstraintData.bendDirection = ReadSByte(input);
                skeletonData.ikConstraints.Add(ikConstraintData);
            }
            int m = 0;

            for (int num7 = ReadVarint(input, optimizePositive: true); m < num7; m++)
            {
                TransformConstraintData transformConstraintData = new TransformConstraintData(ReadString(input));
                transformConstraintData.order = ReadVarint(input, optimizePositive: true);
                int n = 0;
                for (int num8 = ReadVarint(input, optimizePositive: true); n < num8; n++)
                {
                    transformConstraintData.bones.Add(skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)]);
                }
                transformConstraintData.target         = skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)];
                transformConstraintData.local          = ReadBoolean(input);
                transformConstraintData.relative       = ReadBoolean(input);
                transformConstraintData.offsetRotation = ReadFloat(input);
                transformConstraintData.offsetX        = ReadFloat(input) * scale;
                transformConstraintData.offsetY        = ReadFloat(input) * scale;
                transformConstraintData.offsetScaleX   = ReadFloat(input);
                transformConstraintData.offsetScaleY   = ReadFloat(input);
                transformConstraintData.offsetShearY   = ReadFloat(input);
                transformConstraintData.rotateMix      = ReadFloat(input);
                transformConstraintData.translateMix   = ReadFloat(input);
                transformConstraintData.scaleMix       = ReadFloat(input);
                transformConstraintData.shearMix       = ReadFloat(input);
                skeletonData.transformConstraints.Add(transformConstraintData);
            }
            int num9 = 0;

            for (int num10 = ReadVarint(input, optimizePositive: true); num9 < num10; num9++)
            {
                PathConstraintData pathConstraintData = new PathConstraintData(ReadString(input));
                pathConstraintData.order = ReadVarint(input, optimizePositive: true);
                int num11 = 0;
                for (int num12 = ReadVarint(input, optimizePositive: true); num11 < num12; num11++)
                {
                    pathConstraintData.bones.Add(skeletonData.bones.Items[ReadVarint(input, optimizePositive: true)]);
                }
                pathConstraintData.target         = skeletonData.slots.Items[ReadVarint(input, optimizePositive: true)];
                pathConstraintData.positionMode   = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(ReadVarint(input, optimizePositive: true));
                pathConstraintData.spacingMode    = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(ReadVarint(input, optimizePositive: true));
                pathConstraintData.rotateMode     = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(ReadVarint(input, optimizePositive: true));
                pathConstraintData.offsetRotation = ReadFloat(input);
                pathConstraintData.position       = ReadFloat(input);
                if (pathConstraintData.positionMode == PositionMode.Fixed)
                {
                    pathConstraintData.position *= scale;
                }
                pathConstraintData.spacing = ReadFloat(input);
                if (pathConstraintData.spacingMode == SpacingMode.Length || pathConstraintData.spacingMode == SpacingMode.Fixed)
                {
                    pathConstraintData.spacing *= scale;
                }
                pathConstraintData.rotateMix    = ReadFloat(input);
                pathConstraintData.translateMix = ReadFloat(input);
                skeletonData.pathConstraints.Add(pathConstraintData);
            }
            Skin skin = ReadSkin(input, skeletonData, "default", flag);

            if (skin != null)
            {
                skeletonData.defaultSkin = skin;
                skeletonData.skins.Add(skin);
            }
            int num13 = 0;

            for (int num14 = ReadVarint(input, optimizePositive: true); num13 < num14; num13++)
            {
                skeletonData.skins.Add(ReadSkin(input, skeletonData, ReadString(input), flag));
            }
            int num15 = 0;

            for (int count = linkedMeshes.Count; num15 < count; num15++)
            {
                SkeletonJson.LinkedMesh linkedMesh = linkedMeshes[num15];
                Skin skin2 = (linkedMesh.skin != null) ? skeletonData.FindSkin(linkedMesh.skin) : skeletonData.DefaultSkin;
                if (skin2 == null)
                {
                    throw new Exception("Skin not found: " + linkedMesh.skin);
                }
                Attachment attachment = skin2.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
                if (attachment == null)
                {
                    throw new Exception("Parent mesh not found: " + linkedMesh.parent);
                }
                linkedMesh.mesh.ParentMesh = (MeshAttachment)attachment;
                linkedMesh.mesh.UpdateUVs();
            }
            linkedMeshes.Clear();
            int num16 = 0;

            for (int num17 = ReadVarint(input, optimizePositive: true); num16 < num17; num16++)
            {
                EventData eventData = new EventData(ReadString(input));
                eventData.Int    = ReadVarint(input, optimizePositive: false);
                eventData.Float  = ReadFloat(input);
                eventData.String = ReadString(input);
                skeletonData.events.Add(eventData);
            }
            int num18 = 0;

            for (int num19 = ReadVarint(input, optimizePositive: true); num18 < num19; num18++)
            {
                ReadAnimation(ReadString(input), input, skeletonData);
            }
            skeletonData.bones.TrimExcess();
            skeletonData.slots.TrimExcess();
            skeletonData.skins.TrimExcess();
            skeletonData.events.TrimExcess();
            skeletonData.animations.TrimExcess();
            skeletonData.ikConstraints.TrimExcess();
            skeletonData.pathConstraints.TrimExcess();
            return(skeletonData);
        }
コード例 #4
0
ファイル: SkeletonBinary.cs プロジェクト: mrdivdiz/bpvita
        public SkeletonData ReadSkeletonData(Stream input)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            float        scale        = this.Scale;
            SkeletonData skeletonData = new SkeletonData();

            skeletonData.hash = this.ReadString(input);
            if (skeletonData.hash.Length == 0)
            {
                skeletonData.hash = null;
            }
            skeletonData.version = this.ReadString(input);
            if (skeletonData.version.Length == 0)
            {
                skeletonData.version = null;
            }
            skeletonData.width  = this.ReadFloat(input);
            skeletonData.height = this.ReadFloat(input);
            bool flag = SkeletonBinary.ReadBoolean(input);

            if (flag)
            {
                skeletonData.imagesPath = this.ReadString(input);
                if (skeletonData.imagesPath.Length == 0)
                {
                    skeletonData.imagesPath = null;
                }
            }
            int i   = 0;
            int num = SkeletonBinary.ReadVarint(input, true);

            while (i < num)
            {
                string   name     = this.ReadString(input);
                BoneData parent   = (i != 0) ? skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)] : null;
                BoneData boneData = new BoneData(i, name, parent);
                boneData.rotation        = this.ReadFloat(input);
                boneData.x               = this.ReadFloat(input) * scale;
                boneData.y               = this.ReadFloat(input) * scale;
                boneData.scaleX          = this.ReadFloat(input);
                boneData.scaleY          = this.ReadFloat(input);
                boneData.shearX          = this.ReadFloat(input);
                boneData.shearY          = this.ReadFloat(input);
                boneData.length          = this.ReadFloat(input) * scale;
                boneData.inheritRotation = SkeletonBinary.ReadBoolean(input);
                boneData.inheritScale    = SkeletonBinary.ReadBoolean(input);
                if (flag)
                {
                    SkeletonBinary.ReadInt(input);
                }
                skeletonData.bones.Add(boneData);
                i++;
            }
            int j    = 0;
            int num2 = SkeletonBinary.ReadVarint(input, true);

            while (j < num2)
            {
                string   name2     = this.ReadString(input);
                BoneData boneData2 = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
                SlotData slotData  = new SlotData(j, name2, boneData2);
                int      num3      = SkeletonBinary.ReadInt(input);
                slotData.r = (float)((num3 & 4278190080u) >> 24) / 255f;
                slotData.g = (float)((num3 & 16711680) >> 16) / 255f;
                slotData.b = (float)((num3 & 65280) >> 8) / 255f;
                slotData.a = (float)(num3 & 255) / 255f;
                slotData.attachmentName = this.ReadString(input);
                slotData.blendMode      = (BlendMode)SkeletonBinary.ReadVarint(input, true);
                skeletonData.slots.Add(slotData);
                j++;
            }
            int k    = 0;
            int num4 = SkeletonBinary.ReadVarint(input, true);

            while (k < num4)
            {
                IkConstraintData ikConstraintData = new IkConstraintData(this.ReadString(input));
                int l    = 0;
                int num5 = SkeletonBinary.ReadVarint(input, true);
                while (l < num5)
                {
                    ikConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
                    l++;
                }
                ikConstraintData.target        = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
                ikConstraintData.mix           = this.ReadFloat(input);
                ikConstraintData.bendDirection = (int)SkeletonBinary.ReadSByte(input);
                skeletonData.ikConstraints.Add(ikConstraintData);
                k++;
            }
            int m    = 0;
            int num6 = SkeletonBinary.ReadVarint(input, true);

            while (m < num6)
            {
                TransformConstraintData transformConstraintData = new TransformConstraintData(this.ReadString(input));
                int n    = 0;
                int num7 = SkeletonBinary.ReadVarint(input, true);
                while (n < num7)
                {
                    transformConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
                    n++;
                }
                transformConstraintData.target         = skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)];
                transformConstraintData.offsetRotation = this.ReadFloat(input);
                transformConstraintData.offsetX        = this.ReadFloat(input) * scale;
                transformConstraintData.offsetY        = this.ReadFloat(input) * scale;
                transformConstraintData.offsetScaleX   = this.ReadFloat(input);
                transformConstraintData.offsetScaleY   = this.ReadFloat(input);
                transformConstraintData.offsetShearY   = this.ReadFloat(input);
                transformConstraintData.rotateMix      = this.ReadFloat(input);
                transformConstraintData.translateMix   = this.ReadFloat(input);
                transformConstraintData.scaleMix       = this.ReadFloat(input);
                transformConstraintData.shearMix       = this.ReadFloat(input);
                skeletonData.transformConstraints.Add(transformConstraintData);
                m++;
            }
            int num8 = 0;
            int num9 = SkeletonBinary.ReadVarint(input, true);

            while (num8 < num9)
            {
                PathConstraintData pathConstraintData = new PathConstraintData(this.ReadString(input));
                int num10 = 0;
                int num11 = SkeletonBinary.ReadVarint(input, true);
                while (num10 < num11)
                {
                    pathConstraintData.bones.Add(skeletonData.bones.Items[SkeletonBinary.ReadVarint(input, true)]);
                    num10++;
                }
                pathConstraintData.target         = skeletonData.slots.Items[SkeletonBinary.ReadVarint(input, true)];
                pathConstraintData.positionMode   = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
                pathConstraintData.spacingMode    = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
                pathConstraintData.rotateMode     = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(SkeletonBinary.ReadVarint(input, true));
                pathConstraintData.offsetRotation = this.ReadFloat(input);
                pathConstraintData.position       = this.ReadFloat(input);
                if (pathConstraintData.positionMode == PositionMode.Fixed)
                {
                    pathConstraintData.position *= scale;
                }
                pathConstraintData.spacing = this.ReadFloat(input);
                if (pathConstraintData.spacingMode == SpacingMode.Length || pathConstraintData.spacingMode == SpacingMode.Fixed)
                {
                    pathConstraintData.spacing *= scale;
                }
                pathConstraintData.rotateMix    = this.ReadFloat(input);
                pathConstraintData.translateMix = this.ReadFloat(input);
                skeletonData.pathConstraints.Add(pathConstraintData);
                num8++;
            }
            Skin skin = this.ReadSkin(input, "default", flag);

            if (skin != null)
            {
                skeletonData.defaultSkin = skin;
                skeletonData.skins.Add(skin);
            }
            int num12 = 0;
            int num13 = SkeletonBinary.ReadVarint(input, true);

            while (num12 < num13)
            {
                skeletonData.skins.Add(this.ReadSkin(input, this.ReadString(input), flag));
                num12++;
            }
            int num14 = 0;
            int count = this.linkedMeshes.Count;

            while (num14 < count)
            {
                SkeletonJson.LinkedMesh linkedMesh = this.linkedMeshes[num14];
                Skin skin2 = (linkedMesh.skin != null) ? skeletonData.FindSkin(linkedMesh.skin) : skeletonData.DefaultSkin;
                if (skin2 == null)
                {
                    throw new Exception("Skin not found: " + linkedMesh.skin);
                }
                Attachment attachment = skin2.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
                if (attachment == null)
                {
                    throw new Exception("Parent mesh not found: " + linkedMesh.parent);
                }
                linkedMesh.mesh.ParentMesh = (MeshAttachment)attachment;
                linkedMesh.mesh.UpdateUVs();
                num14++;
            }
            this.linkedMeshes.Clear();
            int num15 = 0;
            int num16 = SkeletonBinary.ReadVarint(input, true);

            while (num15 < num16)
            {
                EventData eventData = new EventData(this.ReadString(input));
                eventData.Int    = SkeletonBinary.ReadVarint(input, false);
                eventData.Float  = this.ReadFloat(input);
                eventData.String = this.ReadString(input);
                skeletonData.events.Add(eventData);
                num15++;
            }
            int num17 = 0;
            int num18 = SkeletonBinary.ReadVarint(input, true);

            while (num17 < num18)
            {
                this.ReadAnimation(this.ReadString(input), input, skeletonData);
                num17++;
            }
            skeletonData.bones.TrimExcess();
            skeletonData.slots.TrimExcess();
            skeletonData.skins.TrimExcess();
            skeletonData.events.TrimExcess();
            skeletonData.animations.TrimExcess();
            skeletonData.ikConstraints.TrimExcess();
            skeletonData.pathConstraints.TrimExcess();
            return(skeletonData);
        }
コード例 #5
0
        public SkeletonData ReadSkeletonData(Stream input, String skelPath, String animPath, int limitCount = 0, bool backUp = true)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            float scale = Scale;

            var skeletonData = new SkeletonData();

            skeletonData.hash = ReadString(input);
            if (skeletonData.hash.Length == 0)
            {
                skeletonData.hash = null;
            }
            skeletonData.version = ReadString(input);
            if (skeletonData.version.Length == 0)
            {
                skeletonData.version = null;
            }
            skeletonData.width  = ReadFloat(input);
            skeletonData.height = ReadFloat(input);

            bool nonessential = ReadBoolean(input);

            if (nonessential)
            {
                skeletonData.fps        = ReadFloat(input);
                skeletonData.imagesPath = ReadString(input);
                if (skeletonData.imagesPath.Length == 0)
                {
                    skeletonData.imagesPath = null;
                }
            }

            // Bones.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   name   = ReadString(input);
                BoneData parent = i == 0 ? null : skeletonData.bones.Items[ReadVarint(input, true)];
                BoneData data   = new BoneData(i, name, parent);
                data.rotation      = ReadFloat(input);
                data.x             = ReadFloat(input) * scale;
                data.y             = ReadFloat(input) * scale;
                data.scaleX        = ReadFloat(input);
                data.scaleY        = ReadFloat(input);
                data.shearX        = ReadFloat(input);
                data.shearY        = ReadFloat(input);
                data.length        = ReadFloat(input) * scale;
                data.transformMode = TransformModeValues[ReadVarint(input, true)];
                if (nonessential)
                {
                    ReadInt(input);               // Skip bone color.
                }
                skeletonData.bones.Add(data);
            }

            // Slots.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                String   slotName = ReadString(input);
                BoneData boneData = skeletonData.bones.Items[ReadVarint(input, true)];
                SlotData slotData = new SlotData(i, slotName, boneData);
                int      color    = ReadInt(input);
                slotData.r = ((color & 0xff000000) >> 24) / 255f;
                slotData.g = ((color & 0x00ff0000) >> 16) / 255f;
                slotData.b = ((color & 0x0000ff00) >> 8) / 255f;
                slotData.a = ((color & 0x000000ff)) / 255f;
                slotData.attachmentName = ReadString(input);
                slotData.blendMode      = (BlendMode)ReadVarint(input, true);
                skeletonData.slots.Add(slotData);
            }

            // IK constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                IkConstraintData data = new IkConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target        = skeletonData.bones.Items[ReadVarint(input, true)];
                data.mix           = ReadFloat(input);
                data.bendDirection = ReadSByte(input);
                skeletonData.ikConstraints.Add(data);
            }

            // Transform constraints.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                TransformConstraintData data = new TransformConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target         = skeletonData.bones.Items[ReadVarint(input, true)];
                data.offsetRotation = ReadFloat(input);
                data.offsetX        = ReadFloat(input) * scale;
                data.offsetY        = ReadFloat(input) * scale;
                data.offsetScaleX   = ReadFloat(input);
                data.offsetScaleY   = ReadFloat(input);
                data.offsetShearY   = ReadFloat(input);
                data.rotateMix      = ReadFloat(input);
                data.translateMix   = ReadFloat(input);
                data.scaleMix       = ReadFloat(input);
                data.shearMix       = ReadFloat(input);
                skeletonData.transformConstraints.Add(data);
            }

            // Path constraints
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                PathConstraintData data = new PathConstraintData(ReadString(input));
                data.order = ReadVarint(input, true);
                for (int ii = 0, nn = ReadVarint(input, true); ii < nn; ii++)
                {
                    data.bones.Add(skeletonData.bones.Items[ReadVarint(input, true)]);
                }
                data.target         = skeletonData.slots.Items[ReadVarint(input, true)];
                data.positionMode   = (PositionMode)Enum.GetValues(typeof(PositionMode)).GetValue(ReadVarint(input, true));
                data.spacingMode    = (SpacingMode)Enum.GetValues(typeof(SpacingMode)).GetValue(ReadVarint(input, true));
                data.rotateMode     = (RotateMode)Enum.GetValues(typeof(RotateMode)).GetValue(ReadVarint(input, true));
                data.offsetRotation = ReadFloat(input);
                data.position       = ReadFloat(input);
                if (data.positionMode == PositionMode.Fixed)
                {
                    data.position *= scale;
                }
                data.spacing = ReadFloat(input);
                if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
                {
                    data.spacing *= scale;
                }
                data.rotateMix    = ReadFloat(input);
                data.translateMix = ReadFloat(input);
                skeletonData.pathConstraints.Add(data);
            }

            // Default skin.
            Skin defaultSkin = ReadSkin(input, "default", nonessential);

            if (defaultSkin != null)
            {
                skeletonData.defaultSkin = defaultSkin;
                skeletonData.skins.Add(defaultSkin);
            }

            // Skins.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                skeletonData.skins.Add(ReadSkin(input, ReadString(input), nonessential));
            }

            // Linked meshes.
            for (int i = 0, n = linkedMeshes.Count; i < n; i++)
            {
                SkeletonJson.LinkedMesh linkedMesh = linkedMeshes[i];
                Skin skin = linkedMesh.skin == null ? skeletonData.DefaultSkin : skeletonData.FindSkin(linkedMesh.skin);
                if (skin == null)
                {
                    throw new Exception("Skin not found: " + linkedMesh.skin);
                }
                Attachment parent = skin.GetAttachment(linkedMesh.slotIndex, linkedMesh.parent);
                if (parent == null)
                {
                    throw new Exception("Parent mesh not found: " + linkedMesh.parent);
                }
                linkedMesh.mesh.ParentMesh = (MeshAttachment)parent;
                linkedMesh.mesh.UpdateUVs();
            }
            linkedMeshes.Clear();

            // Events.
            for (int i = 0, n = ReadVarint(input, true); i < n; i++)
            {
                EventData data = new EventData(ReadString(input));
                data.Int    = ReadVarint(input, false);
                data.Float  = ReadFloat(input);
                data.String = ReadString(input);
                skeletonData.events.Add(data);
            }

            long _pos = input.Position;
            // Animations.
            int _animationCount = ReadVarint(input, true);

            // 传入的animPath是个bundle path,首先我们要获得真的地址
            var resolver     = ""; //new Ngame.ABSystem.AssetBundlePathResolver(); update wumiao
            var realAnimPath = ""; //resolver.ABResPlayGroundAssetPath + "/" + animPath; update wumiao

            //如果存在先删除,清空数据
            if (Directory.Exists(realAnimPath))
            {
                Directory.Delete(realAnimPath, true);
            }

            if (!Directory.Exists(realAnimPath))
            {
                Directory.CreateDirectory(realAnimPath);
            }

            int    _length     = skelPath.LastIndexOf(".");
            string _backupPath = skelPath.Insert(_length, "_backup");

            //超过限制数量就拆动画, 否则重定向输入源到backup
            // HACK 怨念临时修改,只要动画数量不为0就拆,这里传入的limitcount一定是0
            if (_animationCount > limitCount)
            {
                //备份
                if (backUp)
                {
                    if (File.Exists(_backupPath))
                    {
                        // redo
                        UnityEditor.AssetDatabase.DeleteAsset(_backupPath);
                    }
                    UnityEditor.AssetDatabase.CopyAsset(skelPath, _backupPath);
                }
            }
            else
            {
                if (backUp && File.Exists(_backupPath))
                {
                    //如果存在备份文件,则把input源重定向到备份文件
                    input = new MemoryStream(UnityEditor.AssetDatabase.LoadAssetAtPath <TextAsset>(_backupPath).bytes);
                }
                else
                {
                    Debug.LogErrorFormat("{0}动画已拆分并且不存在备份");
                    goto EndOfSplit;
                }
            }

            string fullPath = Path.GetFullPath(skelPath);

            using (FileStream fs = new FileStream(fullPath, FileMode.Truncate))
            {
                byte[] bytes = new byte[_pos];
                input.Seek(0, SeekOrigin.Begin);
                input.Read(bytes, 0, (int)_pos);
                fs.Write(bytes, 0, bytes.Length);

                _animationCount = ReadVarint(input, true);

                //将动画长度写为0
                fs.WriteByte(Byte.MinValue);
                //约定动画的长度不超过255
                fs.WriteByte((byte)_animationCount);

                for (int i = 0, n = _animationCount; i < n; i++)
                {
                    long   _prePos  = input.Position;
                    string _aniName = ReadString(input);

                    //强制规范命名。播放动画时同样需要
                    string _aniFileName = _aniName;
                    foreach (char invalidChar in Path.GetInvalidFileNameChars())
                    {
                        _aniFileName = _aniFileName.Replace(invalidChar.ToString(), "_");
                    }

                    long _afterPos = input.Position;
                    long _count    = _afterPos - _prePos;
                    bytes = new byte[_count];
                    input.Seek(_prePos, SeekOrigin.Begin);
                    input.Read(bytes, 0, (int)_count);
                    fs.Write(bytes, 0, bytes.Length);

                    string _name = Path.GetFileName(fullPath);

                    string _aniPath = realAnimPath + "/" + _aniFileName + ".bytes";
                    using (FileStream anifs = new FileStream(_aniPath, FileMode.Create))
                    {
                        _prePos = input.Position;
                        ReadAnimation(_aniName, input, skeletonData);
                        _afterPos = input.Position;
                        _count    = _afterPos - _prePos;
                        bytes     = new byte[_count];
                        input.Seek(_prePos, SeekOrigin.Begin);
                        input.Read(bytes, 0, (int)_count);
                        anifs.Write(bytes, 0, bytes.Length);

                        anifs.Close();
                    }
                }

                //Assets/NScene/Resources/
                //int _index = animPath.IndexOf("Resources/");
                //animPath = animPath.Remove(0, _index + 10);

                // 怨念修改
                // 现在传入的已经是bundle path了,直接写入文件即可
                WriteString(fs, animPath);
                fs.Close();
            }

EndOfSplit:
            skeletonData.bones.TrimExcess();
            skeletonData.slots.TrimExcess();
            skeletonData.skins.TrimExcess();
            skeletonData.events.TrimExcess();
            skeletonData.animations.TrimExcess();
            skeletonData.ikConstraints.TrimExcess();
            skeletonData.pathConstraints.TrimExcess();
            return(skeletonData);
        }