Ejemplo n.º 1
0
 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]);
     }
 }
Ejemplo n.º 2
0
        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);
            }
        }