예제 #1
0
    private void LoadEntities(BinaryReader bspFile)
    {
        entities = new List <BSPEntity>();

        BSPDirectoryEntry entitiesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.ENTITIES);

        bspFile.BaseStream.Seek(entitiesEntry.fileOffset, SeekOrigin.Begin);

        string entityText = new string(  bspFile.ReadChars(entitiesEntry.size));

        StringReader reader = new StringReader(entityText);
        {
            string line = string.Empty;
            do
            {
                line = reader.ReadLine();
                if (line != null)
                {
                    if (line == "{")
                    {
                        entities.Add(new BSPEntity(reader));
                    }
                }
            } while (line != null);
        }
    }
예제 #2
0
    private void LoadFaces(BinaryReader bspFile)
    {
        // Faces
        faces = new List <BSPFace>();

        BSPDirectoryEntry facesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.FACES);
        int faceCount = facesEntry.size / 20;

        bspFile.BaseStream.Seek(facesEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < faceCount; i++)
        {
            faces.Add(new BSPFace(bspFile));
        }

        // Face list
        faceList = new List <int>();

        BSPDirectoryEntry faceListEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.FACE_LIST);
        int faceListCount = faceListEntry.size / 4;

        bspFile.BaseStream.Seek(faceListEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < faceListCount; i++)
        {
            faceList.Add(bspFile.ReadInt32());
        }
    }
예제 #3
0
    private void LoadEdges(BinaryReader bspFile)
    {
        // Edges
        edges = new List <BSPEdge>();

        BSPDirectoryEntry edgesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.EDGES);
        int edgeCount = edgesEntry.size / 4;

        bspFile.BaseStream.Seek(edgesEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < edgeCount; i++)
        {
            edges.Add(new BSPEdge(bspFile.ReadUInt16(), bspFile.ReadUInt16()));
        }

        // Edge list
        edgeList = new List <int>();

        BSPDirectoryEntry edgeListEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.EDGE_LIST);
        long edgeListCount = edgeListEntry.size / 4;

        bspFile.BaseStream.Seek(edgeListEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < edgeListCount; i++)
        {
            edgeList.Add(bspFile.ReadInt32());
        }
    }
예제 #4
0
    private void LoadPlanes(BinaryReader bspFile)
    {
        planes = new List <BSPPlane>();

        BSPDirectoryEntry planesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.PLANES);
        long planeCount = planesEntry.size / 20;

        bspFile.BaseStream.Seek(planesEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < planeCount; i++)
        {
            planes.Add(new BSPPlane(bspFile));
        }
    }
예제 #5
0
    private void LoadLeaves(BinaryReader bspFile)
    {
        leaves = new List <BSPLeaf>();

        BSPDirectoryEntry leafEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.LEAVES);
        long leafCount = leafEntry.size / 28;

        bspFile.BaseStream.Seek(leafEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < leafCount; i++)
        {
            leaves.Add(new BSPLeaf(bspFile));
        }
    }
예제 #6
0
    private void LoadNodes(BinaryReader bspFile)
    {
        nodes = new List <BSPNode>();

        BSPDirectoryEntry nodesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.NODES);
        int nodeCount = nodesEntry.size / 36;

        bspFile.BaseStream.Seek(nodesEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < nodeCount; i++)
        {
            nodes.Add(new BSPNode(bspFile));
        }
    }
예제 #7
0
    public BSPHeader(BinaryReader bspFile)
    {
        DirectoryEntries = new List <BSPDirectoryEntry>();

        bspFile.BaseStream.Seek(0, SeekOrigin.Begin);

        bspFile.ReadInt32(); // skip version

        for (int i = 0; i < (int)DIRECTORY_ENTRY.COUNT; i++)
        {
            BSPDirectoryEntry entry = new BSPDirectoryEntry(bspFile);
            DirectoryEntries.Add(entry);
        }
    }
예제 #8
0
    private void LoadTextureInfo(BinaryReader bspFile)
    {
        textureSurfaces = new List <BSPTextureSurface>();

        BSPDirectoryEntry texInfoEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.FACE_TEXTURE_INFO);

        bspFile.BaseStream.Seek(texInfoEntry.fileOffset, SeekOrigin.Begin);

        int texInfoCount = texInfoEntry.size / 40;

        for (int i = 0; i < texInfoCount; i++)
        {
            textureSurfaces.Add(new BSPTextureSurface(bspFile));
        }
    }
예제 #9
0
    private void LoadModels(BinaryReader bspFile)
    {
        models = new List <BSPModel>();

        BSPDirectoryEntry modelEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.MODELS);
        long modelCount = modelEntry.size / 64;

        bspFile.BaseStream.Seek(modelEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < modelCount; i++)
        {
            BSPModel model = new BSPModel(bspFile);
            models.Add(model);
        }
    }
예제 #10
0
    private void LoadVertices(BinaryReader bspFile)
    {
        vertices = new List <Vector3>();

        BSPDirectoryEntry verticesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.MAP_VERTICES);
        int vertCount = verticesEntry.size / 12;

        bspFile.BaseStream.Seek(verticesEntry.fileOffset, SeekOrigin.Begin);

        for (int i = 0; i < vertCount; i++)
        {
            // Read vertex and flip Y/Z to match Quake 1
            float x = bspFile.ReadSingle();
            float y = bspFile.ReadSingle();
            float z = bspFile.ReadSingle();

            vertices.Add(new Vector3(x, z, y));
        }
    }
예제 #11
0
    private void LoadTextures(BinaryReader bspFile)
    {
        textures = new List <BSPTexture>();

        BSPDirectoryEntry texturesEntry = header.GetDirectoryEntry(DIRECTORY_ENTRY.WALL_TEXTURES);

        bspFile.BaseStream.Seek(texturesEntry.fileOffset, SeekOrigin.Begin);

        int textureCount = bspFile.ReadInt32();

        int[] offsets = new int[textureCount];

        for (int i = 0; i < textureCount; i++)
        {
            offsets[i] = bspFile.ReadInt32();
        }

        for (int i = 0; i < textureCount; i++)
        {
            bspFile.BaseStream.Seek(texturesEntry.fileOffset + offsets[i], SeekOrigin.Begin);
            textures.Add(new BSPTexture(bspFile, palette));
        }
    }