Exemple #1
0
        public static void Read(ResFileSwitchLoader loader, Shape shape)
        {
            if (loader.ResFile.VersionMajor2 == 9)
            {
                shape.Flags = loader.ReadEnum <ShapeFlags>(true);
            }
            else
            {
                loader.LoadHeaderBlock();
            }

            shape.Name         = loader.LoadString();
            shape.VertexBuffer = loader.Load <VertexBuffer>();
            long MeshArrayOffset         = loader.ReadOffset();
            long SkinBoneIndexListOffset = loader.ReadOffset();

            shape.KeyShapes = loader.LoadDictValues <KeyShape>();
            long BoundingBoxArrayOffset = loader.ReadOffset();
            long RadiusOffset           = 0;

            if (loader.ResFile.VersionMajor2 > 2 || loader.ResFile.VersionMajor > 0)
            {
                RadiusOffset = loader.ReadOffset();
                long UserPointer = loader.ReadInt64();
            }
            else
            {
                long UserPointer = loader.ReadInt64();
                shape.RadiusArray.Add(loader.ReadSingle());
            }
            if (loader.ResFile.VersionMajor2 != 9)
            {
                shape.Flags = loader.ReadEnum <ShapeFlags>(true);
            }
            ushort idx = loader.ReadUInt16();

            shape.MaterialIndex     = loader.ReadUInt16();
            shape.BoneIndex         = loader.ReadUInt16();
            shape.VertexBufferIndex = loader.ReadUInt16();
            ushort numSkinBoneIndex = loader.ReadUInt16();

            shape.VertexSkinCount = loader.ReadByte();
            byte numMesh       = loader.ReadByte();
            byte numKeys       = loader.ReadByte();
            byte numTargetAttr = loader.ReadByte();

            if (loader.ResFile.VersionMajor2 <= 2 && loader.ResFile.VersionMajor == 0)
            {
                loader.Seek(2); //padding
            }
            else if (loader.ResFile.VersionMajor2 == 9)
            {
                loader.Seek(2); //padding
            }
            else
            {
                loader.Seek(6); //padding
            }
            shape.Meshes          = numMesh == 0 ? new List <Mesh>() : loader.LoadList <Mesh>(numMesh, (uint)MeshArrayOffset).ToList();
            shape.SkinBoneIndices = numSkinBoneIndex == 0 ? new List <ushort>() : loader.LoadCustom(() => loader.ReadUInt16s(numSkinBoneIndex), (uint)SkinBoneIndexListOffset)?.ToList();

            if (RadiusOffset != 0)
            {
                shape.RadiusArray = numMesh == 0 ? new List <float>() : loader.LoadCustom(() => loader.ReadSingles(numMesh), (uint)RadiusOffset).ToList();
            }

            int boundingboxCount = shape.Meshes.Sum(x => x.SubMeshes.Count + 1);

            shape.SubMeshBoundings = boundingboxCount == 0 ? new List <Bounding>() : loader.LoadCustom(() =>
                                                                                                       loader.ReadBoundings(boundingboxCount), (uint)BoundingBoxArrayOffset)?.ToList();

            shape.SubMeshBoundingNodes = new List <BoundingNode>();
        }