public static SkeletonFormat Read(List <ChunkTable.ChunkDataEntry> chunkList) { var genericSkeleton = new SkeletonFormat(); Header header = null; List <BoneInfo> boneInfos = new List <BoneInfo>(); List <BoneTransform> boneTransforms = new List <BoneTransform>(); List <uint> boneIndices = new List <uint>(); List <BoneHash> boneHashes = new List <BoneHash>(); List <short> parentIndices = new List <short>(); for (int i = 0; i < chunkList.Count; i++) { var chunk = chunkList[i]; switch (chunk.ChunkType) { case ChunkDataType.SkeletonHeader: header = chunk.ReadStruct <Header>(); break; case ChunkDataType.SkeletonBoneInfo: boneInfos = chunk.ReadStructs <BoneInfo>(header.BoneCount); break; case ChunkDataType.SkeletonBoneTransform: boneTransforms = chunk.ReadStructs <BoneTransform>(header.BoneCount); break; case ChunkDataType.SkeletonBoneIndexList: boneIndices = chunk.ReadPrimitive <uint>(header.BoneIndexListCount); break; case ChunkDataType.SkeletonBoneHashList: boneHashes = chunk.ReadStructs <BoneHash>(header.BoneCount); break; case ChunkDataType.SkeletonBoneParenting: parentIndices = chunk.ReadPrimitive <short>(header.BoneCount); break; } } for (int i = 0; i < boneInfos.Count; i++) { var info = boneInfos[i]; var transform = boneTransforms[i]; string name = Hashing.HashNames.ContainsKey(info.Hash) ? Hashing.HashNames[info.Hash] : info.Hash.ToString(); genericSkeleton.Bones.Add(new STBone(genericSkeleton) { Name = name, ParentIndex = parentIndices[i], Position = new OpenTK.Vector3( transform.TranslationX, transform.TranslationY, transform.TranslationZ) * ModelWrapper.PreviewScale, Rotation = new OpenTK.Quaternion( transform.QuaternionX, transform.QuaternionY, transform.QuaternionZ, transform.QuaternionW) * (parentIndices[i] == -1 ? Quaternion.FromEulerAngles(-1.5708F, 0, -1.5708F) : Quaternion.Identity), }); } for (int i = 0; i < boneHashes.Count; i++) { genericSkeleton.BoneHashToID.Add(boneHashes[i].Hash, (int)boneHashes[i].Index); } genericSkeleton.Reset(); return(genericSkeleton); }
public static SkeletonFormat Read(List <ChunkTable.ChunkDataEntry> chunkList) { var genericSkeleton = new SkeletonFormat(); Header header = null; List <BoneInfo> boneInfos = new List <BoneInfo>(); List <BoneTransform> boneTransforms = new List <BoneTransform>(); List <uint> boneIndices = new List <uint>(); List <BoneHash> boneHashes = new List <BoneHash>(); for (int i = 0; i < chunkList.Count; i++) { if (chunkList[i].ChunkType == ChunkDataType.SkeletonHeader) { header = chunkList[i].ReadStruct <Header>(); } } for (int i = 0; i < chunkList.Count; i++) { var chunk = chunkList[i]; Console.WriteLine($"SKELETON {chunk.ChunkType}"); switch (chunk.ChunkType) { case ChunkDataType.SkeletonBoneInfo: boneInfos = chunk.ReadStructs <BoneInfo>(header.BoneCount); break; case ChunkDataType.SkeletonBoneTransform: boneTransforms = chunk.ReadStructs <BoneTransform>(header.BoneCount); break; case ChunkDataType.SkeletonBoneIndexList: // boneIndices = chunk.ReadPrimitive<uint>(header.BoneIndexListCount); break; case ChunkDataType.SkeletonBoneHashList: boneHashes = chunk.ReadStructs <BoneHash>(header.BoneCount); break; } } for (int i = 0; i < boneInfos.Count; i++) { var info = boneInfos[i]; var transform = boneTransforms[i]; string name = Hashing.HashNames.ContainsKey(info.Hash) ? Hashing.HashNames[info.Hash] : info.Hash.ToString(); if (transform == null) { transform = new BoneTransform(); } genericSkeleton.Bones.Add(new STBone(genericSkeleton) { Name = name, ParentIndex = info.ParentIndex, Position = (new OpenTK.Vector3( transform.TranslationX, transform.TranslationY, transform.TranslationZ) * (info.ParentIndex != -1 ? (32 * ModelWrapper.PreviewScale) : 1)), Rotation = new OpenTK.Quaternion( transform.QuaternionX, transform.QuaternionY, transform.QuaternionZ, transform.QuaternionW) * (info.ParentIndex == -1 ? Quaternion.FromEulerAngles(-1.5708F, 0, 0) : Quaternion.Identity), }); Console.WriteLine($"BONE {transform.ScaleX} {transform.ScaleY} {transform.ScaleZ}"); } for (int i = 0; i < boneHashes.Count; i++) { genericSkeleton.BoneHashToID.Add(boneHashes[i].Hash, (int)boneHashes[i].Index); Console.WriteLine($"BONEINDEXLIST {boneHashes[i].Hash} {boneHashes[i].Index}"); } genericSkeleton.Reset(); return(genericSkeleton); }