Пример #1
0
    public bool LoadMapTextures()
    {
        foreach (Lump l in WadLoader.lumps)
        {
            if (l.lumpName == "TEXTURE1")
            {
                int p   = 0;
                int num = (int)(l.data[p++] | (int)l.data[p++] << 8 | (int)l.data[p++] << 16 | (int)l.data[p++] << 24);

                int[] offsets = new int[num];
                for (int i = 0; i < num; i++)
                {
                    offsets[i] = (int)(l.data[p++] | (int)l.data[p++] << 8 | (int)l.data[p++] << 16 | (int)l.data[p++] << 24);
                }

                MapTextures.Clear();
                for (int i = 0; i < num; i++)
                {
                    p = offsets[i];
                    MapTexture t = new MapTexture();

                    t.textureName = Encoding.ASCII.GetString(new byte[]
                    {
                        l.data[p++],
                        l.data[p++],
                        l.data[p++],
                        l.data[p++],
                        l.data[p++],
                        l.data[p++],
                        l.data[p++],
                        l.data[p++]
                    }).TrimEnd('\0').ToUpper();

                    t.masked          = (int)(l.data[p++] | (int)l.data[p++] << 8 | (int)l.data[p++] << 16 | (int)l.data[p++] << 24);
                    t.width           = (int)(l.data[p++] | (int)l.data[p++] << 8);
                    t.height          = (int)(l.data[p++] | (int)l.data[p++] << 8);
                    t.columnDirectory = (int)(l.data[p++] | (int)l.data[p++] << 8 | (int)l.data[p++] << 16 | (int)l.data[p++] << 24);
                    int patchCount = (int)(l.data[p++] | (int)l.data[p++] << 8);
                    t.patches = new MapPatch[patchCount];

                    for (int j = 0; j < patchCount; j++)
                    {
                        MapPatch patch = new MapPatch();

                        patch.originx  = (short)(l.data[p++] | (short)l.data[p++] << 8);
                        patch.originy  = (short)(l.data[p++] | (short)l.data[p++] << 8);
                        patch.number   = (int)(l.data[p++] | (int)l.data[p++] << 8);
                        patch.stepdir  = (int)(l.data[p++] | (int)l.data[p++] << 8);
                        patch.colormap = (int)(l.data[p++] | (int)l.data[p++] << 8);

                        t.patches[j] = patch;
                    }

                    MapTextures.Add(t);
                }

                return(true);
            }
        }

        return(false);
    }
Пример #2
0
    void ReadWADTextures()
    {
        List <DrctEntry> texLumps = new List <DrctEntry>();


        foreach (DrctEntry entry in newWad.directory)//Find texture's lumps
        {
            if (entry.name.StartsWith("TEXTURE"))
            {
                texLumps.Add(entry);
            }
        }

        foreach (DrctEntry texEntry in texLumps)
        {
            TEXTUREx newTexture = new TEXTUREx();
            int      texOfs     = 0;

            byte[] tbytes = new byte[texEntry.size];


            wadOpener.Position = texEntry.filepos;
            wadOpener.Read(tbytes, 0, tbytes.Length);



            //Header////
            newTexture.numTextures = BitConverter.ToInt32(tbytes, 0);

            for (int i = 4; i <= (4 * newTexture.numTextures); i += 4)
            {
                newTexture.offset.Add(BitConverter.ToInt32(tbytes, i));
            }

            texOfs = (newTexture.numTextures * 4) + 4; //start of maptexture_t?????


            int lastPatchCount = 0;

            //for every texture
            foreach (int ofs in newTexture.offset)
            {
                MapTexture mtex = new MapTexture();

                //read the info
                mtex.name   = new String(System.Text.Encoding.ASCII.GetChars(tbytes, ofs, 8));
                mtex.masked = BitConverter.ToBoolean(tbytes, ofs + 8);
                mtex.width  = BitConverter.ToInt16(tbytes, ofs + 12);
                mtex.height = BitConverter.ToInt16(tbytes, ofs + 14);
                //mtex.columndirectory = BitConverter.ToInt32(tbytes, ofs + 16);
                mtex.patchCount = BitConverter.ToInt16(tbytes, ofs + 20);
                lastPatchCount  = mtex.patchCount;

                mtex.name = mtex.name.Replace("\0", "");

                UsedImages.Add(mtex.name);

                for (int a = ofs + 22; a < ofs + 22 + (10 * mtex.patchCount); a += 10)
                {
                    MapPatch mPatch = new MapPatch();

                    mPatch.originx = (int)BitConverter.ToInt16(tbytes, a);
                    mPatch.originy = (int)BitConverter.ToInt16(tbytes, a + 2);
                    mPatch.patch   = (int)BitConverter.ToInt16(tbytes, a + 4);
                    mtex.mPatch.Add(mPatch);
                }

                newTexture.mtex.Add(mtex);                                   //store the info in newTexture.mtex

                Color32[,] texPixels = new Color32[mtex.width, mtex.height]; //store the pixels for the texture (L->R, U->D)
                bool trans = false;

                foreach (MapPatch mpatch in mtex.mPatch) //for each patch in the texture
                {
                    int width  = newWad.patches[mpatch.patch].GetLength(0);
                    int height = newWad.patches[mpatch.patch].GetLength(1);

                    for (int x = 0; x < width; x++)      //for each width pixel
                    {
                        for (int y = 0; y < height; y++) //for each height pixel
                        {
                            Color pixel = newWad.patches[mpatch.patch][x, (height - 1) - y];
                            int   xofs  = x + mpatch.originx;
                            int   yofs  = y + mpatch.originy;

                            if (pixel == Color.clear)
                            {
                                trans = true;
                            }

                            if (pixel.a > 0 && xofs >= 0 && yofs >= 0 && xofs < mtex.width && yofs < mtex.height)
                            {
                                texPixels[xofs, yofs] = pixel;
                            }
                        }
                    }
                }

                Color[]  texPix = new Color[mtex.width * mtex.height];
                Material newMat;

                if (!trans)
                {
                    newMat = new Material(DoomShader);
                }
                else
                {
                    newMat = new Material(DoomShaderTransparent);
                }

                for (int i = 0; i < mtex.height; i++)
                {
                    for (int j = 0; j < mtex.width; j++)
                    {
                        // Debug.Log(i * mtex.height + j);
                        texPix[i * mtex.width + j] = texPixels[j, i]; //collapse the 2Darry "texPixels" to a 1D array "texPix"
                    }
                }
                Texture2D newTex = new Texture2D(mtex.width, mtex.height, TextureFormat.RGBA32, false);
                newTex.filterMode = FilterMode.Point;
                newTex.SetPixels(texPix);
                newTex.Apply();
                newTex.name        = mtex.name;
                newMat.mainTexture = newTex;
                newWad.textures.Add(newTex.name, newMat);
            }
        }
    }
Пример #3
0
        private void viewMapFile(string mapName)
        {
            MapFileParser p = new MapFileParser();

            try
            {
                if (p.loadMapFile(mapName))
                {
                    MessageBox.Show("Failed to load .map file '" + mapName + "'");
                    return;
                }
            }
            catch (System.IO.DirectoryNotFoundException ex)
            {
                MessageBox.Show("Failed to load .map file '" + mapName + "' - directory not found exception.");
                return;
            }
            map = p.getMapFile();
            map.setTreeView(treeView1);

            /*
             * MapFileWriter w = new MapFileWriter();
             * w.writeMapFile(map, mapName + "_textExport.map");
             * */
            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            for (int i = 0; i < map.getNumEntities(); i++)
            {
                MapEntity entity     = map.getEntity(i);
                TreeNode  nodeEntity = new TreeNode("Entity " + i + " (" + entity.getClassName() + ")");
                nodeEntity.Tag = entity;
                entity.setTreeViewNode(nodeEntity);
                TreeNode      nodeKeyValues = new TreeNode("Variables");
                KeyValuesList epairs        = entity.getKeyValues();
                nodeKeyValues.Tag = epairs;
                for (int j = 0; j < epairs.size(); j++)
                {
                    TreeNode nodeKey   = new TreeNode(epairs.getPairKey(j));
                    TreeNode nodeValue = new TreeNode(epairs.getPairValue(j));
                    // save the node so epairs can automatically update GUI
                    epairs.setPairTreeNode(j, nodeKey);
                    nodeKey.Tag   = epairs;
                    nodeValue.Tag = epairs;
                    nodeKey.Nodes.Add(nodeValue);
                    nodeKeyValues.Nodes.Add(nodeKey);
                }
                nodeEntity.Nodes.Add(nodeKeyValues);
                if (entity.getNumBrushes() != 0 || entity.getNumPatches() != 0)
                {
                    TreeNode nodeGeometry = new TreeNode("Geometry");
                    if (entity.getNumBrushes() != 0)
                    {
                        TreeNode nodeBrushes = new TreeNode("Brushes");
                        for (int j = 0; j < entity.getNumBrushes(); j++)
                        {
                            MapBrushBase brBase = entity.getBrush(j);
                            if (brBase.isOldBrush())
                            {
                                MapBrushOld br        = (MapBrushOld)brBase;
                                TreeNode    nodeBrush = new TreeNode("Brush (old format) " + j);
                                nodeBrush.Tag = br;
                                for (int k = 0; k < br.getNumSides(); k++)
                                {
                                    MapBrushSideOld side     = br.getSide(k);
                                    TreeNode        nodeSide = new TreeNode("Side " + k);
                                    // plane points
                                    TreeNode nodePlanePoints = new TreeNode("Plane points");
                                    nodePlanePoints.Nodes.Add(side.getPlanePointA().ToStringBraced()
                                                              + " " + side.getPlanePointB().ToStringBraced()
                                                              + " " + side.getPlanePointB().ToStringBraced());
                                    nodeSide.Nodes.Add(nodePlanePoints);
                                    // material
                                    TreeNode nodeMaterial = new TreeNode("Material");
                                    nodeMaterial.Nodes.Add(side.getMatName());
                                    nodeSide.Nodes.Add(nodeMaterial);
                                    // tex scale
                                    TreeNode nodeTexScale = new TreeNode("TexScale");
                                    nodeTexScale.Nodes.Add(side.getTexScale().ToString());
                                    nodeSide.Nodes.Add(nodeTexScale);
                                    // tex shift
                                    TreeNode nodeTexShift = new TreeNode("TexShift");
                                    nodeTexShift.Nodes.Add(side.getTexShift().ToString());
                                    nodeSide.Nodes.Add(nodeTexShift);
                                    // tex rotation
                                    TreeNode nodeTexRotation = new TreeNode("TexRotation");
                                    nodeTexRotation.Nodes.Add(side.getTexRotation().ToString());
                                    nodeSide.Nodes.Add(nodeTexRotation);
                                    // contents (eg. detail)
                                    TreeNode nodeContentFlags = new TreeNode("ContentFlags");
                                    nodeContentFlags.Nodes.Add(side.getContentFlags().ToString());
                                    nodeSide.Nodes.Add(nodeContentFlags);
                                    nodeBrush.Nodes.Add(nodeSide);
                                }
                                nodeBrushes.Nodes.Add(nodeBrush);
                            }
                            else
                            {
                                MapBrushDef3 br        = (MapBrushDef3)brBase;
                                TreeNode     nodeBrush = new TreeNode("Brush (Def3) " + j);
                                nodeBrush.Tag = br;
                                for (int k = 0; k < br.getNumSides(); k++)
                                {
                                    MapBrushSide4 side     = br.getSide(k);
                                    TreeNode      nodeSide = new TreeNode("Side " + k);
                                    // plane points
                                    TreeNode nodePlanePoints = new TreeNode("Plane");
                                    nodePlanePoints.Nodes.Add(side.getPlane().ToString());
                                    nodeSide.Nodes.Add(nodePlanePoints);
                                    // material
                                    TreeNode nodeMaterial = new TreeNode("Material");
                                    nodeMaterial.Nodes.Add(side.getMatName());
                                    nodeSide.Nodes.Add(nodeMaterial);
                                    // tex matrix
                                    TreeNode nodeTexAxis0 = new TreeNode("TexAxis0");
                                    nodeTexAxis0.Nodes.Add(side.getTextureAxis0().ToString());
                                    nodeSide.Nodes.Add(nodeTexAxis0);
                                    TreeNode nodeTexAxis1 = new TreeNode("TexAxis1");
                                    nodeTexAxis1.Nodes.Add(side.getTextureAxis1().ToString());
                                    nodeSide.Nodes.Add(nodeTexAxis1);
                                    nodeBrush.Nodes.Add(nodeSide);
                                }
                                nodeBrushes.Nodes.Add(nodeBrush);
                            }
                        }
                        nodeGeometry.Nodes.Add(nodeBrushes);
                    }
                    if (entity.getNumPatches() != 0)
                    {
                        TreeNode nodePatches = new TreeNode("Patches");
                        for (int j = 0; j < entity.getNumPatches(); j++)
                        {
                            MapPatch patch     = entity.getPatch(j);
                            TreeNode nodePatch = new TreeNode("Patch " + j);
                            // material
                            TreeNode nodeMaterial = new TreeNode("Material");
                            nodeMaterial.Nodes.Add(patch.getMatName());
                            nodePatch.Nodes.Add(nodeMaterial);
                            // sizes
                            TreeNode nodeSizes = new TreeNode("Size");
                            nodeSizes.Nodes.Add(patch.getSizeW().ToString() + " " + patch.getSizeH().ToString());
                            nodePatch.Nodes.Add(nodeSizes);
                            // verts
                            TreeNode nodeVerts = new TreeNode("Verts");
                            for (int k = 0; k < patch.getSizeH(); k++)
                            {
                                TreeNode nodeRowK = new TreeNode("Row " + k);
                                for (int l = 0; l < patch.getSizeW(); l++)
                                {
                                    TreeNode nodeVertex = new TreeNode("Vertex " + l + " (abs " + k + "/" + l + ")");
                                    nodeVertex.Nodes.Add(patch.getVertex(l, k).ToString());
                                    nodeRowK.Nodes.Add(nodeVertex);
                                }
                                nodeVerts.Nodes.Add(nodeRowK);
                            }
                            nodePatch.Nodes.Add(nodeVerts);

                            nodePatches.Nodes.Add(nodePatch);
                        }
                        nodeGeometry.Nodes.Add(nodePatches);
                    }
                    nodeEntity.Nodes.Add(nodeGeometry);
                }
                treeView1.Nodes.Add(nodeEntity);
                treeView1.EndUpdate();
            }
        }