Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
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));
        }
Exemplo n.º 3
0
        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;
                    }
                }
            }
        }
Exemplo n.º 6
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];
            }
        }
Exemplo n.º 7
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];
            }
        }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        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);
                }
            }
        }