public static void Load(string fileName) { var thisFile = new List <CollisionFileInfo>(); using (var stream = ArchiveManager.ReadFile(fileName)) { var versBuffer = new byte[4]; var reader = new BinaryReader(stream); while (stream.Position < stream.Length && stream.Read(versBuffer, 0, 4) == 4) { if (versBuffer.All(x => x == 0)) { break; } Version version; try { var versString = Encoding.ASCII.GetString(versBuffer); version = (Version)Enum.Parse(typeof(Version), versString); } catch { Debug.LogWarningFormat("Error while reading {0} at 0x{1:x} ({2}%)", fileName, stream.Position - 4, (stream.Position - 4) * 100 / stream.Length); break; } var modelInfo = new CollisionFileInfo(reader, fileName, version); thisFile.Add(modelInfo); _sModelNameDict.Add(modelInfo.Name, modelInfo); } } }
public static CollisionFile Load(Stream stream) { var reader = new BinaryReader(stream); var version = (Version)Enum.Parse(typeof(Version), reader.ReadString(4)); var info = new CollisionFileInfo(reader, null, version); return(new CollisionFile(info, stream)); }
public static void Load(string fileName) { var thisFile = new List <CollisionFileInfo>(); using (var stream = ArchiveManager.ReadFile(fileName)) { var versBuffer = new byte[4]; var reader = new BinaryReader(stream); while (stream.Position < stream.Length && stream.Read(versBuffer, 0, 4) == 4) { if (versBuffer.All(x => x == 0)) { break; } Version version; try { var versString = Encoding.ASCII.GetString(versBuffer); version = (Version)Enum.Parse(typeof(Version), versString); } catch (Exception e) { Debug.LogWarningFormat("Error while reading {0} at 0x{1:x} ({2}%)", fileName, stream.Position - 4, (stream.Position - 4) * 100 / stream.Length); Debug.LogWarning(e.Message); // The length of 'male01', 'fatmale02' and 'b_wom1' in peds.col seems to be off by 1 in my version. So 'fix' for this case: if ((versBuffer [0] == 'O') && (versBuffer [1] == 'L') && (versBuffer [2] == 'L') && ((versBuffer [3] == 0xD0) || (versBuffer [3] == 0xA4) || (versBuffer [3] == 0x8C))) { Debug.Log("Known problem (size off by one). Attempting to fix by adjusting read pointer..."); stream.Position -= 5; continue; } else { Debug.LogError("Unknown problem. Please report an issue for this!"); } break; } var modelInfo = new CollisionFileInfo(reader, fileName, version); thisFile.Add(modelInfo); try { _sModelNameDict.Add(modelInfo.Name, modelInfo); } catch (System.ArgumentException e) { // The collision file for 'ct_man2' is appearing two times consecutively in my game files. Ignore second one. if (modelInfo.Name != "ct_man2") { Debug.LogError(e.Message); } else { Debug.Log("Known problem (duplicate ct_man2 collision). Skipping..."); } } } } }
private static void LoadAsync(string collFileName, CollisionFileInfo collFileInfo, System.Action <CollisionFile> onFinish) { ArchiveManager.ReadFileAsync(collFileName, (stream) => { CollisionFile cf = null; try { using (stream) { cf = new CollisionFile(collFileInfo, stream); } } finally { onFinish(cf); } }); }
// load collision file infos public static void Load(string fileName) { var thisFile = new List <CollisionFileInfo>(); using (var stream = ArchiveManager.ReadFile(fileName)) { var versBuffer = new byte[4]; var reader = new BinaryReader(stream); while (stream.Position < stream.Length && stream.Read(versBuffer, 0, 4) == 4) { if (versBuffer.All(x => x == 0)) { break; } Version version; var versString = Encoding.ASCII.GetString(versBuffer); if (!Enum.TryParse(versString, out version)) { if (versString.Substring(0, 3) == "OLL") { // Known problem (size off by one). Attempting to fix by adjusting read pointer... stream.Position -= 1; version = Version.COLL; } else { Debug.LogWarningFormat("Error while reading {0} at 0x{1:x} ({2}%)", fileName, stream.Position - 4, (stream.Position - 4) * 100 / stream.Length); } } var modelInfo = new CollisionFileInfo(reader, fileName, version); thisFile.Add(modelInfo); if (!_sModelNameDict.ContainsKey(modelInfo.Name)) { _sModelNameDict.Add(modelInfo.Name, modelInfo); } else { _sModelNameDict[modelInfo.Name] = modelInfo; } } } }
private CollisionFile(CollisionFileInfo info, Stream stream) { Name = info.Name; ModelId = info.ModelId; var version = info.Version; var reader = new BinaryReader(stream); stream.Seek(info.Offset + 28, SeekOrigin.Begin); Bounds = new Bounds(reader, version); int spheres, boxes, verts, faces, faceGroups; long spheresOffset, boxesOffset, vertsOffset, facesOffset, faceGroupsOffset; switch (version) { case Version.COLL: { spheres = reader.ReadInt32(); spheresOffset = stream.Position; stream.Seek(spheres * Sphere.Size, SeekOrigin.Current); reader.ReadInt32(); boxes = reader.ReadInt32(); boxesOffset = stream.Position; stream.Seek(boxes * Box.Size, SeekOrigin.Current); verts = reader.ReadInt32(); vertsOffset = stream.Position; stream.Seek(verts * Vertex.SizeV1, SeekOrigin.Current); faces = reader.ReadInt32(); facesOffset = stream.Position; faceGroups = 0; faceGroupsOffset = 0; break; } default: { spheres = reader.ReadUInt16(); boxes = reader.ReadUInt16(); faces = reader.ReadUInt16(); reader.ReadInt16(); Flags = (Flags)reader.ReadInt32(); spheresOffset = reader.ReadUInt32() + info.Offset; boxesOffset = reader.ReadUInt32() + info.Offset; reader.ReadUInt32(); vertsOffset = reader.ReadUInt32() + info.Offset; facesOffset = reader.ReadUInt32() + info.Offset; if (faces > 0 && (Flags & Flags.HasFaceGroups) == Flags.HasFaceGroups) { stream.Seek(facesOffset - 4, SeekOrigin.Begin); faceGroups = reader.ReadInt32(); faceGroupsOffset = facesOffset - 4 - FaceGroup.Size * faceGroups; } else { faceGroups = 0; faceGroupsOffset = 0; } verts = -1; break; } } Spheres = new Sphere[spheres]; Boxes = new Box[boxes]; Faces = new Face[faces]; FaceGroups = new FaceGroup[faceGroups]; if (spheres > 0) { stream.Seek(spheresOffset, SeekOrigin.Begin); for (var i = 0; i < spheres; ++i) { Spheres[i] = new Sphere(reader, version); } } if (boxes > 0) { stream.Seek(boxesOffset, SeekOrigin.Begin); for (var i = 0; i < boxes; ++i) { Boxes[i] = new Box(reader, version); } } if (faces > 0) { stream.Seek(facesOffset, SeekOrigin.Begin); for (var i = 0; i < faces; ++i) { Faces[i] = new Face(reader, version); } if (verts == -1) { verts = Faces.Max(x => x.GetIndices().Max()) + 1; } Vertices = new Vertex[verts]; stream.Seek(vertsOffset, SeekOrigin.Begin); for (var i = 0; i < verts; ++i) { Vertices[i] = new Vertex(reader, version); } if (faceGroups > 0) { stream.Seek(faceGroupsOffset, SeekOrigin.Begin); for (var i = 0; i < faceGroups; ++i) { FaceGroups[i] = new FaceGroup(reader); } } } else { Vertices = new Vertex[0]; } }
private CollisionFile(CollisionFileInfo info, Stream stream) { Name = info.Name; ModelId = info.ModelId; var version = info.Version; var reader = new BinaryReader(stream); stream.Seek(info.Offset + 28, SeekOrigin.Begin); Bounds = new Bounds(reader, version); int spheres, boxes, verts, faces, faceGroups; long spheresOffset, boxesOffset, vertsOffset, facesOffset, faceGroupsOffset; switch (version) { case Version.COLL: { spheres = reader.ReadInt32(); spheresOffset = stream.Position; stream.Seek(spheres * Sphere.Size, SeekOrigin.Current); reader.ReadInt32(); boxes = reader.ReadInt32(); boxesOffset = stream.Position; stream.Seek(boxes * Box.Size, SeekOrigin.Current); verts = reader.ReadInt32(); vertsOffset = stream.Position; stream.Seek(verts * Vertex.SizeV1, SeekOrigin.Current); faces = reader.ReadInt32(); facesOffset = stream.Position; faceGroups = 0; faceGroupsOffset = 0; break; } default: { spheres = reader.ReadUInt16(); boxes = reader.ReadUInt16(); faces = reader.ReadUInt16(); reader.ReadInt16(); Flags = (Flags) reader.ReadInt32(); spheresOffset = reader.ReadUInt32() + info.Offset; boxesOffset = reader.ReadUInt32() + info.Offset; reader.ReadUInt32(); vertsOffset = reader.ReadUInt32() + info.Offset; facesOffset = reader.ReadUInt32() + info.Offset; if (faces > 0 && (Flags & Flags.HasFaceGroups) == Flags.HasFaceGroups) { stream.Seek(facesOffset - 4, SeekOrigin.Begin); faceGroups = reader.ReadInt32(); faceGroupsOffset = facesOffset - 4 - FaceGroup.Size * faceGroups; } else { faceGroups = 0; faceGroupsOffset = 0; } verts = -1; break; } } Spheres = new Sphere[spheres]; Boxes = new Box[boxes]; Faces = new Face[faces]; FaceGroups = new FaceGroup[faceGroups]; if (spheres > 0) { stream.Seek(spheresOffset, SeekOrigin.Begin); for (var i = 0; i < spheres; ++i) { Spheres[i] = new Sphere(reader, version); } } if (boxes > 0) { stream.Seek(boxesOffset, SeekOrigin.Begin); for (var i = 0; i < boxes; ++i) { Boxes[i] = new Box(reader, version); } } if (faces > 0) { stream.Seek(facesOffset, SeekOrigin.Begin); for (var i = 0; i < faces; ++i) { Faces[i] = new Face(reader, version); } if (verts == -1) { verts = Faces.Max(x => x.GetIndices().Max()) + 1; } Vertices = new Vertex[verts]; stream.Seek(vertsOffset, SeekOrigin.Begin); for (var i = 0; i < verts; ++i) { Vertices[i] = new Vertex(reader, version); } if (faceGroups > 0) { stream.Seek(faceGroupsOffset, SeekOrigin.Begin); for (var i = 0; i < faceGroups; ++i) { FaceGroups[i] = new FaceGroup(reader); } } } else { Vertices = new Vertex[0]; } }
public static CollisionFile Load(Stream stream) { var reader = new BinaryReader(stream); var version = (Version) Enum.Parse(typeof(Version), reader.ReadString(4)); var info = new CollisionFileInfo(reader, null, version); return new CollisionFile(info, stream); }
public static void Load(string fileName) { var thisFile = new List<CollisionFileInfo>(); using (var stream = ArchiveManager.ReadFile(fileName)) { var versBuffer = new byte[4]; var reader = new BinaryReader(stream); while (stream.Position < stream.Length && stream.Read(versBuffer, 0, 4) == 4) { if (versBuffer.All(x => x == 0)) break; Version version; try { var versString = Encoding.ASCII.GetString(versBuffer); version = (Version) Enum.Parse(typeof (Version), versString); } catch { Debug.LogWarningFormat("Error while reading {0} at 0x{1:x} ({2}%)", fileName, stream.Position - 4, (stream.Position - 4) * 100 / stream.Length); break; } var modelInfo = new CollisionFileInfo(reader, fileName, version); thisFile.Add(modelInfo); _sModelNameDict.Add(modelInfo.Name, modelInfo); } } }