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>(); }