public static void Serialize(this SerializingContainer2 sc, ref SoftSkinVertex ssv) { if (sc.IsLoading) { ssv = new SoftSkinVertex(); } sc.Serialize(ref ssv.Position); sc.Serialize(ref ssv.TangentX); sc.Serialize(ref ssv.TangentY); sc.Serialize(ref ssv.TangentZ); sc.Serialize(ref ssv.UV); if (sc.Game == MEGame.UDK) { sc.Serialize(ref ssv.UV2); sc.Serialize(ref ssv.UV3); sc.Serialize(ref ssv.UV4); sc.Serialize(ref ssv.BoneColor); } else if (sc.IsLoading) { ssv.BoneColor = new Color(255, 255, 255, 255); } for (int i = 0; i < 4; i++) { sc.Serialize(ref ssv.InfluenceBones[i]); } for (int i = 0; i < 4; i++) { sc.Serialize(ref ssv.InfluenceWeights[i]); } }
public static void Serialize(this SerializingContainer2 sc, ref StaticLODModel slm) { if (sc.IsLoading) { slm = new StaticLODModel(); } sc.Serialize(ref slm.Sections, Serialize); if (sc.Game == MEGame.UDK) { sc.Serialize(ref slm.NeedsCPUAccess); sc.Serialize(ref slm.DataTypeSize); } int ushortSize = 2; sc.Serialize(ref ushortSize); sc.Serialize(ref slm.IndexBuffer, Serialize); if (sc.Game != MEGame.UDK) { sc.Serialize(ref slm.ShadowIndices, Serialize); } sc.Serialize(ref slm.ActiveBoneIndices, Serialize); if (sc.Game != MEGame.UDK) { sc.Serialize(ref slm.ShadowTriangleDoubleSided, Serialize); } sc.Serialize(ref slm.Chunks, Serialize); sc.Serialize(ref slm.Size); sc.Serialize(ref slm.NumVertices); if (sc.Game != MEGame.UDK) { sc.Serialize(ref slm.Edges, Serialize); } sc.Serialize(ref slm.RequiredBones, Serialize); if (sc.Game == MEGame.UDK) { int[] UDKRawPointIndices = sc.IsSaving ? Array.ConvertAll(slm.RawPointIndices, u => (int)u) : Array.Empty <int>(); sc.SerializeBulkData(ref UDKRawPointIndices, Serialize); slm.RawPointIndices = Array.ConvertAll(UDKRawPointIndices, i => (ushort)i); } else { sc.SerializeBulkData(ref slm.RawPointIndices, Serialize); } if (sc.Game == MEGame.UDK) { sc.Serialize(ref slm.NumTexCoords); } if (sc.Game == MEGame.ME1) { if (sc.IsSaving && slm.ME1VertexBufferGPUSkin == null) { GPUSkinVertex[] vertexData = slm.VertexBufferGPUSkin.VertexData; slm.ME1VertexBufferGPUSkin = new SoftSkinVertex[vertexData.Length]; for (int i = 0; i < vertexData.Length; i++) { GPUSkinVertex vert = vertexData[i]; slm.ME1VertexBufferGPUSkin[i] = new SoftSkinVertex { Position = vert.Position, TangentX = vert.TangentX, TangentY = new PackedNormal(0, 1, 0, 0), //¯\_(ツ)_/¯ TangentZ = vert.TangentZ, UV = new Vector2D(vert.UV.X, vert.UV.Y), InfluenceBones = vert.InfluenceBones.TypedClone(), InfluenceWeights = vert.InfluenceWeights.TypedClone() }; } } int softSkinVertexSize = 40; sc.Serialize(ref softSkinVertexSize); sc.Serialize(ref slm.ME1VertexBufferGPUSkin, Serialize); } else { if (sc.IsSaving && slm.VertexBufferGPUSkin == null) { slm.VertexBufferGPUSkin = new SkeletalMeshVertexBuffer { MeshExtension = new Vector3(1, 1, 1), NumTexCoords = 1, VertexData = new GPUSkinVertex[slm.ME1VertexBufferGPUSkin.Length] }; for (int i = 0; i < slm.ME1VertexBufferGPUSkin.Length; i++) { SoftSkinVertex vert = slm.ME1VertexBufferGPUSkin[i]; slm.VertexBufferGPUSkin.VertexData[i] = new GPUSkinVertex { Position = vert.Position, TangentX = vert.TangentX, TangentZ = vert.TangentZ, UV = new Vector2DHalf(vert.UV.X, vert.UV.Y), InfluenceBones = vert.InfluenceBones.TypedClone(), InfluenceWeights = vert.InfluenceWeights.TypedClone() }; } } sc.Serialize(ref slm.VertexBufferGPUSkin); } if (sc.Game >= MEGame.ME3) { int vertexInfluencesCount = 0; sc.Serialize(ref vertexInfluencesCount); if (vertexInfluencesCount != 0) { throw new Exception($"VertexInfluences exist on this SkeletalMesh! Mesh in: {sc.Pcc.FilePath}"); } } if (sc.Game == MEGame.UDK) { sc.Serialize(ref slm.NeedsCPUAccess); sc.Serialize(ref slm.DataTypeSize); int elementSize = 2; sc.Serialize(ref elementSize); ushort[] secondIndexBuffer = new ushort[0]; sc.Serialize(ref secondIndexBuffer, Serialize); } }