public FSoftVertex(FAssetArchive Ar, bool isRigid = false) { SerializeForEditor(Ar); UV = new FMeshUVFloat[MAX_SKELETAL_UV_SETS_UE4]; for (var i = 0; i < UV.Length; i++) { UV[i] = Ar.Read <FMeshUVFloat>(); } Color = Ar.Read <FColor>(); if (!isRigid) { Infs = new FSkinWeightInfo(Ar, Ar.Ver >= EUnrealEngineObjectUE4Version.SUPPORT_8_BONE_INFLUENCES_SKELETAL_MESHES); } else { Infs = new FSkinWeightInfo(); Infs.BoneIndex[0] = Ar.Read <byte>(); Infs.BoneWeight[0] = 255; } }
public FSkinWeightVertexBuffer(FArchive Ar, bool numSkelCondition) { var bNewWeightFormat = FAnimObjectVersion.Get(Ar) >= FAnimObjectVersion.Type.UnlimitedBoneInfluences; #region FSkinWeightDataVertexBuffer var dataStripFlags = Ar.Read <FStripDataFlags>(); #region FSkinWeightDataVertexBuffer::SerializeMetaData bool bVariableBonesPerVertex; bool bExtraBoneInfluences; uint maxBoneInfluences; bool bUse16BitBoneIndex; uint numVertices; uint numBones; if (Ar.Game < EGame.GAME_UE4_24) { bExtraBoneInfluences = Ar.ReadBoolean(); numVertices = Ar.Read <uint>(); maxBoneInfluences = bExtraBoneInfluences ? 8u : 4u; } else if (!bNewWeightFormat) { bExtraBoneInfluences = Ar.ReadBoolean(); if (FSkeletalMeshCustomVersion.Get(Ar) >= FSkeletalMeshCustomVersion.Type.SplitModelAndRenderData) { Ar.Position += 4; // var stride = Ar.Read<uint>(); } numVertices = Ar.Read <uint>(); maxBoneInfluences = bExtraBoneInfluences ? 8u : 4u; numBones = maxBoneInfluences * numVertices; bVariableBonesPerVertex = false; } else { bVariableBonesPerVertex = Ar.ReadBoolean(); maxBoneInfluences = Ar.Read <uint>(); numBones = Ar.Read <uint>(); numVertices = Ar.Read <uint>(); bExtraBoneInfluences = maxBoneInfluences > _NUM_INFLUENCES_UE4; // bUse16BitBoneIndex doesn't exist before version IncreaseBoneIndexLimitPerChunk if (FAnimObjectVersion.Get(Ar) >= FAnimObjectVersion.Type.IncreaseBoneIndexLimitPerChunk) { bUse16BitBoneIndex = Ar.ReadBoolean(); } } #endregion byte[] newData = Array.Empty <byte>(); if (!dataStripFlags.IsDataStrippedForServer()) { if (!bNewWeightFormat) { Weights = Ar.ReadBulkArray(() => new FSkinWeightInfo(Ar, bExtraBoneInfluences)); } else { newData = Ar.ReadBulkArray <byte>(); } } else { bExtraBoneInfluences = numSkelCondition; } #endregion if (bNewWeightFormat) { #region FSkinWeightLookupVertexBuffer var lookupStripFlags = Ar.Read <FStripDataFlags>(); #region FSkinWeightLookupVertexBuffer::SerializeMetaData //if (bNewWeightFormat) //{ var numLookupVertices = Ar.Read <int>(); //} #endregion if (!lookupStripFlags.IsDataStrippedForServer()) { Ar.ReadBulkArray <uint>(); // LookupData } #endregion // Convert influence data if (newData.Length > 0) { using var tempAr = new FByteArchive("WeightsReader", newData, Ar.Versions); Weights = new FSkinWeightInfo[numVertices]; for (var i = 0; i < Weights.Length; i++) { Weights[i] = new FSkinWeightInfo(tempAr, bExtraBoneInfluences); } } } }