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; } }
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); }
//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')); * }*/ }
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++; } }
//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')); * }*/ }
//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); * }*/ }
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; } }