示例#1
0
        private void ReadCurveData(ImportedKeyframedAnimation iAnim, AnimationClipBindingConstant m_ClipBindingConstant, int index, float time, float[] data, int offset, ref int curveIndex)
        {
            var binding = m_ClipBindingConstant.FindBinding(index);

            if (binding.path == 0)
            {
                curveIndex++;
                return;
            }

            var path  = FixBonePath(GetPathFromHash(binding.path));
            var track = iAnim.FindTrack(path);

            switch (binding.attribute)
            {
            case 1:
                track.Translations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                      (
                                                                          -data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset]
                                                                      )));
                break;

            case 2:
                var value = Fbx.QuaternionToEuler(new Quaternion
                                                  (
                                                      data[curveIndex++ + offset],
                                                      -data[curveIndex++ + offset],
                                                      -data[curveIndex++ + offset],
                                                      data[curveIndex++ + offset]
                                                  ));
                track.Rotations.Add(new ImportedKeyframe <Vector3>(time, value));
                break;

            case 3:
                track.Scalings.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                  (
                                                                      data[curveIndex++ + offset],
                                                                      data[curveIndex++ + offset],
                                                                      data[curveIndex++ + offset]
                                                                  )));
                break;

            case 4:
                track.Rotations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                   (
                                                                       data[curveIndex++ + offset],
                                                                       -data[curveIndex++ + offset],
                                                                       -data[curveIndex++ + offset]
                                                                   )));
                break;

            default:
                //track.Curve.Add(new ImportedKeyframe<float>(time, data[curveIndex++]));
                curveIndex++;
                break;
            }
        }
示例#2
0
        public AnimationClipBindingConstant ConvertValueArrayToGenericBinding()
        {
            var bindings        = new AnimationClipBindingConstant();
            var genericBindings = new List <GenericBinding>();
            var values          = m_Binding;

            for (int i = 0; i < values.m_ValueArray.Length;)
            {
                var curveID     = values.m_ValueArray[i].m_ID;
                var curveTypeID = values.m_ValueArray[i].m_TypeID;
                var binding     = new GenericBinding();
                genericBindings.Add(binding);
                if (curveTypeID == 4174552735) //CRC(PositionX))
                {
                    binding.path      = curveID;
                    binding.attribute = 1; //kBindTransformPosition
                    binding.typeID    = ClassIDType.Transform;
                    i += 3;
                }
                else if (curveTypeID == 2211994246) //CRC(QuaternionX))
                {
                    binding.path      = curveID;
                    binding.attribute = 2; //kBindTransformRotation
                    binding.typeID    = ClassIDType.Transform;
                    i += 4;
                }
                else if (curveTypeID == 1512518241) //CRC(ScaleX))
                {
                    binding.path      = curveID;
                    binding.attribute = 3; //kBindTransformScale
                    binding.typeID    = ClassIDType.Transform;
                    i += 3;
                }
                else
                {
                    binding.typeID    = ClassIDType.Animator;
                    binding.path      = 0;
                    binding.attribute = curveID;
                    i++;
                }
            }
            bindings.genericBindings = genericBindings.ToArray();
            return(bindings);
        }
示例#3
0
        //public List<AnimationEvent> m_Events { get; set; }


        public AnimationClip(AssetPreloadData preloadData)
        {
            var sourceFile = preloadData.sourceFile;
            var version    = sourceFile.version;
            var reader     = preloadData.InitReader();

            reader.Position = preloadData.Offset;

            m_Name = reader.ReadAlignedString();
            if (version[0] >= 5)//5.0 and up
            {
                m_Legacy = reader.ReadBoolean();
            }
            else if (version[0] >= 4)//4.0 and up
            {
                m_AnimationType = reader.ReadInt32();
                if (m_AnimationType == 1)
                {
                    m_Legacy = true;
                }
            }
            else
            {
                m_Legacy = true;
            }
            m_Compressed = reader.ReadBoolean();
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
            {
                m_UseHighQualityCurve = reader.ReadBoolean();
            }
            reader.AlignStream(4);
            int numRCurves = reader.ReadInt32();

            m_RotationCurves = new List <QuaternionCurve>(numRCurves);
            for (int i = 0; i < numRCurves; i++)
            {
                m_RotationCurves.Add(new QuaternionCurve(reader, version));
            }

            int numCRCurves = reader.ReadInt32();

            m_CompressedRotationCurves = new List <CompressedAnimationCurve>(numCRCurves);
            for (int i = 0; i < numCRCurves; i++)
            {
                m_CompressedRotationCurves.Add(new CompressedAnimationCurve(reader));
            }

            if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
            {
                int numEulerCurves = reader.ReadInt32();
                m_EulerCurves = new List <Vector3Curve>(numEulerCurves);
                for (int i = 0; i < numEulerCurves; i++)
                {
                    m_EulerCurves.Add(new Vector3Curve(reader, version));
                }
            }

            int numPCurves = reader.ReadInt32();

            m_PositionCurves = new List <Vector3Curve>(numPCurves);
            for (int i = 0; i < numPCurves; i++)
            {
                m_PositionCurves.Add(new Vector3Curve(reader, version));
            }

            int numSCurves = reader.ReadInt32();

            m_ScaleCurves = new List <Vector3Curve>(numSCurves);
            for (int i = 0; i < numSCurves; i++)
            {
                m_ScaleCurves.Add(new Vector3Curve(reader, version));
            }

            int numFCurves = reader.ReadInt32();

            m_FloatCurves = new List <FloatCurve>(numFCurves);
            for (int i = 0; i < numFCurves; i++)
            {
                m_FloatCurves.Add(new FloatCurve(preloadData));
            }

            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                int numPtrCurves = reader.ReadInt32();
                m_PPtrCurves = new List <PPtrCurve>(numPtrCurves);
                for (int i = 0; i < numPtrCurves; i++)
                {
                    m_PPtrCurves.Add(new PPtrCurve(preloadData));
                }
            }

            m_SampleRate = reader.ReadSingle();
            m_WrapMode   = reader.ReadInt32();
            if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up
            {
                m_Bounds = new AABB(reader);
            }
            if (version[0] >= 4)//4.0 and up
            {
                m_MuscleClipSize = reader.ReadUInt32();
                m_MuscleClip     = new ClipMuscleConstant(reader, version);
            }
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                m_ClipBindingConstant = new AnimationClipBindingConstant(preloadData);
            }

            /*int numEvents = reader.ReadInt32();
             * m_Events = new List<AnimationEvent>(numEvents);
             * for (int i = 0; i < numEvents; i++)
             * {
             *  m_Events.Add(new AnimationEvent(stream, file.Version[0] - '0'));
             * }*/
        }
示例#4
0
        private void ReadCurveData(ImportedKeyframedAnimation iAnim, AnimationClipBindingConstant m_ClipBindingConstant, int index, float time, float[] data, int offset, ref int curveIndex)
        {
            var binding = m_ClipBindingConstant.FindBinding(index);

            if (binding.typeID == ClassIDType.SkinnedMeshRenderer) //BlendShape
            {
                var channelName = GetChannelNameFromHash(binding.attribute);
                if (string.IsNullOrEmpty(channelName))
                {
                    curveIndex++;
                    return;
                }
                int dotPos = channelName.IndexOf('.');
                if (dotPos >= 0)
                {
                    channelName = channelName.Substring(dotPos + 1);
                }

                var bPath = FixBonePath(GetPathFromHash(binding.path));
                if (string.IsNullOrEmpty(bPath))
                {
                    bPath = GetPathByChannelName(channelName);
                }
                var bTrack = iAnim.FindTrack(bPath);
                bTrack.BlendShape             = new ImportedBlendShape();
                bTrack.BlendShape.ChannelName = channelName;
                bTrack.BlendShape.Keyframes.Add(new ImportedKeyframe <float>(time, data[curveIndex++ + offset]));
            }
            else if (binding.typeID == ClassIDType.Transform)
            {
                var path  = FixBonePath(GetPathFromHash(binding.path));
                var track = iAnim.FindTrack(path);

                switch (binding.attribute)
                {
                case 1:
                    track.Translations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                          (
                                                                              -data[curveIndex++ + offset],
                                                                              data[curveIndex++ + offset],
                                                                              data[curveIndex++ + offset]
                                                                          )));
                    break;

                case 2:
                    var value = Fbx.QuaternionToEuler(new Quaternion
                                                      (
                                                          data[curveIndex++ + offset],
                                                          -data[curveIndex++ + offset],
                                                          -data[curveIndex++ + offset],
                                                          data[curveIndex++ + offset]
                                                      ));
                    track.Rotations.Add(new ImportedKeyframe <Vector3>(time, value));
                    break;

                case 3:
                    track.Scalings.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                      (
                                                                          data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset]
                                                                      )));
                    break;

                case 4:
                    track.Rotations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                       (
                                                                           data[curveIndex++ + offset],
                                                                           -data[curveIndex++ + offset],
                                                                           -data[curveIndex++ + offset]
                                                                       )));
                    break;

                default:
                    curveIndex++;
                    break;
                }
            }
            else
            {
                curveIndex++;
            }
        }
示例#5
0
        //public List<AnimationEvent> m_Events { get; set; }


        public AnimationClip(ObjectReader reader) : base(reader)
        {
            if (version[0] >= 5)//5.0 and up
            {
                m_Legacy = reader.ReadBoolean();
            }
            else if (version[0] >= 4)//4.0 and up
            {
                m_AnimationType = (AnimationType)reader.ReadInt32();
                if (m_AnimationType == AnimationType.kLegacy)
                {
                    m_Legacy = true;
                }
            }
            else
            {
                m_Legacy = true;
            }
            m_Compressed = reader.ReadBoolean();
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
            {
                m_UseHighQualityCurve = reader.ReadBoolean();
            }
            reader.AlignStream(4);
            int numRCurves = reader.ReadInt32();

            m_RotationCurves = new List <QuaternionCurve>(numRCurves);
            for (int i = 0; i < numRCurves; i++)
            {
                m_RotationCurves.Add(new QuaternionCurve(reader));
            }

            int numCRCurves = reader.ReadInt32();

            m_CompressedRotationCurves = new List <CompressedAnimationCurve>(numCRCurves);
            for (int i = 0; i < numCRCurves; i++)
            {
                m_CompressedRotationCurves.Add(new CompressedAnimationCurve(reader));
            }

            if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
            {
                int numEulerCurves = reader.ReadInt32();
                m_EulerCurves = new List <Vector3Curve>(numEulerCurves);
                for (int i = 0; i < numEulerCurves; i++)
                {
                    m_EulerCurves.Add(new Vector3Curve(reader));
                }
            }

            int numPCurves = reader.ReadInt32();

            m_PositionCurves = new List <Vector3Curve>(numPCurves);
            for (int i = 0; i < numPCurves; i++)
            {
                m_PositionCurves.Add(new Vector3Curve(reader));
            }

            int numSCurves = reader.ReadInt32();

            m_ScaleCurves = new List <Vector3Curve>(numSCurves);
            for (int i = 0; i < numSCurves; i++)
            {
                m_ScaleCurves.Add(new Vector3Curve(reader));
            }

            int numFCurves = reader.ReadInt32();

            m_FloatCurves = new List <FloatCurve>(numFCurves);
            for (int i = 0; i < numFCurves; i++)
            {
                m_FloatCurves.Add(new FloatCurve(reader));
            }

            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                int numPtrCurves = reader.ReadInt32();
                m_PPtrCurves = new List <PPtrCurve>(numPtrCurves);
                for (int i = 0; i < numPtrCurves; i++)
                {
                    m_PPtrCurves.Add(new PPtrCurve(reader));
                }
            }

            m_SampleRate = reader.ReadSingle();
            m_WrapMode   = reader.ReadInt32();
            if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up
            {
                m_Bounds = new AABB(reader);
            }
            if (version[0] >= 4)//4.0 and up
            {
                m_MuscleClipSize = reader.ReadUInt32();
                m_MuscleClip     = new ClipMuscleConstant(reader);
            }
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                m_ClipBindingConstant = new AnimationClipBindingConstant(reader);
            }

            /*int numEvents = reader.ReadInt32();
             * m_Events = new List<AnimationEvent>(numEvents);
             * for (int i = 0; i < numEvents; i++)
             * {
             *  m_Events.Add(new AnimationEvent(stream, file.Version[0] - '0'));
             * }*/
        }
示例#6
0
        //public AnimationEvent[] m_Events;


        public AnimationClip(ObjectReader reader) : base(reader)
        {
            if (version[0] >= 5)//5.0 and up
            {
                m_Legacy = reader.ReadBoolean();
            }
            else if (version[0] >= 4)//4.0 and up
            {
                m_AnimationType = (AnimationType)reader.ReadInt32();
                if (m_AnimationType == AnimationType.kLegacy)
                {
                    m_Legacy = true;
                }
            }
            else
            {
                m_Legacy = true;
            }
            m_Compressed = reader.ReadBoolean();
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
            {
                m_UseHighQualityCurve = reader.ReadBoolean();
            }
            reader.AlignStream();
            int numRCurves = reader.ReadInt32();

            m_RotationCurves = new QuaternionCurve[numRCurves];
            for (int i = 0; i < numRCurves; i++)
            {
                m_RotationCurves[i] = new QuaternionCurve(reader);
            }

            int numCRCurves = reader.ReadInt32();

            m_CompressedRotationCurves = new CompressedAnimationCurve[numCRCurves];
            for (int i = 0; i < numCRCurves; i++)
            {
                m_CompressedRotationCurves[i] = new CompressedAnimationCurve(reader);
            }

            if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up
            {
                int numEulerCurves = reader.ReadInt32();
                m_EulerCurves = new Vector3Curve[numEulerCurves];
                for (int i = 0; i < numEulerCurves; i++)
                {
                    m_EulerCurves[i] = new Vector3Curve(reader);
                }
            }

            int numPCurves = reader.ReadInt32();

            m_PositionCurves = new Vector3Curve[numPCurves];
            for (int i = 0; i < numPCurves; i++)
            {
                m_PositionCurves[i] = new Vector3Curve(reader);
            }

            int numSCurves = reader.ReadInt32();

            m_ScaleCurves = new Vector3Curve[numSCurves];
            for (int i = 0; i < numSCurves; i++)
            {
                m_ScaleCurves[i] = new Vector3Curve(reader);
            }

            int numFCurves = reader.ReadInt32();

            m_FloatCurves = new FloatCurve[numFCurves];
            for (int i = 0; i < numFCurves; i++)
            {
                m_FloatCurves[i] = new FloatCurve(reader);
            }

            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                int numPtrCurves = reader.ReadInt32();
                m_PPtrCurves = new PPtrCurve[numPtrCurves];
                for (int i = 0; i < numPtrCurves; i++)
                {
                    m_PPtrCurves[i] = new PPtrCurve(reader);
                }
            }

            m_SampleRate = reader.ReadSingle();
            m_WrapMode   = reader.ReadInt32();
            if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up
            {
                m_Bounds = new AABB(reader);
            }
            if (version[0] >= 4)//4.0 and up
            {
                m_MuscleClipSize = reader.ReadUInt32();
                m_MuscleClip     = new ClipMuscleConstant(reader);
            }
            if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
            {
                m_ClipBindingConstant = new AnimationClipBindingConstant(reader);
            }
            //m_HasGenericRootTransform 2018.3
            //m_HasMotionFloatCurves 2018.3

            /*int numEvents = reader.ReadInt32();
             * m_Events = new AnimationEvent[numEvents];
             * for (int i = 0; i < numEvents; i++)
             * {
             *  m_Events[i] = new AnimationEvent(reader);
             * }*/
        }
示例#7
0
        private void ReadCurveData(ImportedKeyframedAnimation iAnim, AnimationClipBindingConstant m_ClipBindingConstant, int index, float time, float[] data, int offset, ref int curveIndex)
        {
            var binding = m_ClipBindingConstant.FindBinding(index);

            if (binding.path == 0)
            {
                curveIndex++;
                return;
            }
            var boneName = GetNameFromHashes(binding.path, binding.attribute);
            var track    = iAnim.FindTrack(boneName);

            if (track == null)
            {
                track = new ImportedAnimationKeyframedTrack {
                    Name = boneName
                };
                iAnim.TrackList.Add(track);
            }

            switch (binding.attribute)
            {
            case 1:
                track.Translations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                      (
                                                                          -data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset],
                                                                          data[curveIndex++ + offset]
                                                                      )));
                break;

            case 2:
                var value = Fbx.QuaternionToEuler(new Quaternion
                                                  (
                                                      data[curveIndex++ + offset],
                                                      -data[curveIndex++ + offset],
                                                      -data[curveIndex++ + offset],
                                                      data[curveIndex++ + offset]
                                                  ));
                track.Rotations.Add(new ImportedKeyframe <Vector3>(time, value));
                break;

            case 3:
                track.Scalings.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                  (
                                                                      data[curveIndex++ + offset],
                                                                      data[curveIndex++ + offset],
                                                                      data[curveIndex++ + offset]
                                                                  )));
                break;

            case 4:
                track.Rotations.Add(new ImportedKeyframe <Vector3>(time, new Vector3
                                                                   (
                                                                       data[curveIndex++ + offset],
                                                                       -data[curveIndex++ + offset],
                                                                       -data[curveIndex++ + offset]
                                                                   )));
                break;

            default:
                track.Curve.Add(new ImportedKeyframe <float>(time, data[curveIndex++]));
                break;
            }
        }