Exemple #1
0
        // Draw_CachePic
        public static glpic_t CachePic(string path)
        {
            for (int i = 0; i < _MenuNumCachePics; i++)
            {
                cachepic_t p = _MenuCachePics[i];
                if (p.name == path)// !strcmp(path, pic->name))
                {
                    return(p.pic);
                }
            }

            if (_MenuNumCachePics == MAX_CACHED_PICS)
            {
                Sys.Error("menu_numcachepics == MAX_CACHED_PICS");
            }

            cachepic_t pic = _MenuCachePics[_MenuNumCachePics];

            _MenuNumCachePics++;
            pic.name = path;

            //
            // load the pic from disk
            //
            byte[] data = Common.LoadFile(path);
            if (data == null)
            {
                Sys.Error("Draw_CachePic: failed to load {0}", path);
            }
            dqpicheader_t header = Sys.BytesToStructure <dqpicheader_t>(data, 0);

            Wad.SwapPic(header);

            int headerSize = Marshal.SizeOf(typeof(dqpicheader_t));

            // HACK HACK HACK --- we need to keep the bytes for
            // the translatable player picture just for the menu
            // configuration dialog
            if (path == "gfx/menuplyr.lmp")
            {
                Buffer.BlockCopy(data, headerSize, _MenuPlayerPixels, 0, header.width * header.height);
                //memcpy (menuplyr_pixels, dat->data, dat->width*dat->height);
            }

            glpic_t gl = new glpic_t();

            gl.width  = header.width;
            gl.height = header.height;

            //gl = (glpic_t *)pic->pic.data;
            gl.texnum = LoadTexture(gl, new ByteArraySegment(data, headerSize));
            gl.sl     = 0;
            gl.sh     = 1;
            gl.tl     = 0;
            gl.th     = 1;
            pic.pic   = gl;

            return(gl);
        }
Exemple #2
0
        // W_LoadWadFile (char *filename)
        public static void LoadWadFile(string filename)
        {
            _Data = Common.LoadFile(filename);
            if (_Data == null)
            {
                Sys.Error("Wad.LoadWadFile: couldn't load {0}", filename);
            }

            if (_Handle.IsAllocated)
            {
                _Handle.Free();
            }
            _Handle  = GCHandle.Alloc(_Data, GCHandleType.Pinned);
            _DataPtr = _Handle.AddrOfPinnedObject();

            wadinfo_t header = Sys.BytesToStructure <wadinfo_t>(_Data, 0);

            if (header.identification[0] != 'W' || header.identification[1] != 'A' ||
                header.identification[2] != 'D' || header.identification[3] != '2')
            {
                Sys.Error("Wad file {0} doesn't have WAD2 id\n", filename);
            }

            int numlumps     = Common.LittleLong(header.numlumps);
            int infotableofs = Common.LittleLong(header.infotableofs);
            int lumpInfoSize = Marshal.SizeOf(typeof(lumpinfo_t));

            _Lumps = new Dictionary <string, lumpinfo_t>(numlumps);

            for (int i = 0; i < numlumps; i++)
            {
                IntPtr     ptr  = new IntPtr(_DataPtr.ToInt64() + infotableofs + i * lumpInfoSize);
                lumpinfo_t lump = (lumpinfo_t)Marshal.PtrToStructure(ptr, typeof(lumpinfo_t));
                lump.filepos = Common.LittleLong(lump.filepos);
                lump.size    = Common.LittleLong(lump.size);
                if (lump.type == TYP_QPIC)
                {
                    ptr = new IntPtr(_DataPtr.ToInt64() + lump.filepos);
                    dqpicheader_t pic = (dqpicheader_t)Marshal.PtrToStructure(ptr, typeof(dqpicheader_t));
                    SwapPic(pic);
                    Marshal.StructureToPtr(pic, ptr, true);
                }
                _Lumps.Add(Encoding.ASCII.GetString(lump.name).TrimEnd('\0').ToLower(), lump);
            }
        }
Exemple #3
0
        //qpic_t *Draw_PicFromWad (char *name);
        public static glpic_t PicFromWad(string name)
        {
            int           offset = Wad.GetLumpNameOffset(name);
            IntPtr        ptr    = new IntPtr(Wad.DataPointer.ToInt64() + offset);
            dqpicheader_t header = (dqpicheader_t)Marshal.PtrToStructure(ptr, typeof(dqpicheader_t));
            glpic_t       gl     = new glpic_t(); // (glpic_t)Marshal.PtrToStructure(ptr, typeof(glpic_t));

            gl.width  = header.width;
            gl.height = header.height;
            offset   += Marshal.SizeOf(typeof(dqpicheader_t));

            // load little ones into the scrap
            if (gl.width < 64 && gl.height < 64)
            {
                int x, y;
                int texnum = AllocScrapBlock(gl.width, gl.height, out x, out y);
                _ScrapDirty = true;
                int k = 0;
                for (int i = 0; i < gl.height; i++)
                {
                    for (int j = 0; j < gl.width; j++, k++)
                    {
                        _ScrapTexels[texnum][(y + i) * BLOCK_WIDTH + x + j] = Wad.Data[offset + k];// p->data[k];
                    }
                }
                texnum   += _ScrapTexNum;
                gl.texnum = texnum;
                gl.sl     = (float)((x + 0.01) / (float)BLOCK_WIDTH);
                gl.sh     = (float)((x + gl.width - 0.01) / (float)BLOCK_WIDTH);
                gl.tl     = (float)((y + 0.01) / (float)BLOCK_WIDTH);
                gl.th     = (float)((y + gl.height - 0.01) / (float)BLOCK_WIDTH);

                _PicCount++;
                _PicTexels += gl.width * gl.height;
            }
            else
            {
                gl.texnum = LoadTexture(gl, new ByteArraySegment(Wad.Data, offset));
            }
            return(gl);
        }
Exemple #4
0
 // SwapPic (qpic_t *pic)
 public static void SwapPic(dqpicheader_t pic)
 {
     pic.width  = Common.LittleLong(pic.width);
     pic.height = Common.LittleLong(pic.height);
 }
Exemple #5
0
        // Draw_Init
        public static void Init()
        {
            for (int i = 0; i < _MenuCachePics.Length; i++)
            {
                _MenuCachePics[i] = new cachepic_t();
            }

            if (_glNoBind == null)
            {
                _glNoBind  = new Cvar("gl_nobind", "0");
                _glMaxSize = new Cvar("gl_max_size", "1024");
                _glPicMip  = new Cvar("gl_picmip", "0");
            }

            // 3dfx can only handle 256 wide textures
            string renderer = GL.GetString(StringName.Renderer);

            if (renderer.Contains("3dfx") || renderer.Contains("Glide"))
            {
                Cvar.Set("gl_max_size", "256");
            }

            Cmd.Add("gl_texturemode", TextureMode_f);

            // load the console background and the charset
            // by hand, because we need to write the version
            // string into the background before turning
            // it into a texture
            int offset = Wad.GetLumpNameOffset("conchars");

            byte[] draw_chars = Wad.Data; // draw_chars
            for (int i = 0; i < 256 * 64; i++)
            {
                if (draw_chars[offset + i] == 0)
                {
                    draw_chars[offset + i] = 255;               // proper transparent color
                }
            }

            // now turn them into textures
            _CharTexture = LoadTexture("charset", 128, 128, new ByteArraySegment(draw_chars, offset), false, true);

            byte[] buf = Common.LoadFile("gfx/conback.lmp");
            if (buf == null)
            {
                Sys.Error("Couldn't load gfx/conback.lmp");
            }

            dqpicheader_t cbHeader = Sys.BytesToStructure <dqpicheader_t>(buf, 0);

            Wad.SwapPic(cbHeader);

            // hack the version number directly into the pic
            string ver     = String.Format("(c# {0,7:F2}) {1,7:F2}", (float)QDef.CSQUAKE_VERSION, (float)QDef.VERSION);
            int    offset2 = Marshal.SizeOf(typeof(dqpicheader_t)) + 320 * 186 + 320 - 11 - 8 * ver.Length;
            int    y       = ver.Length;

            for (int x = 0; x < y; x++)
            {
                CharToConback(ver[x], new ByteArraySegment(buf, offset2 + (x << 3)), new ByteArraySegment(draw_chars, offset));
            }

            _ConBack        = new glpic_t();
            _ConBack.width  = cbHeader.width;
            _ConBack.height = cbHeader.height;
            int ncdataIndex = Marshal.SizeOf(typeof(dqpicheader_t)); // cb->data;

            SetTextureFilters(TextureMinFilter.Nearest, TextureMagFilter.Nearest);

            _ConBack.texnum = LoadTexture("conback", _ConBack.width, _ConBack.height, new ByteArraySegment(buf, ncdataIndex), false, false);
            _ConBack.width  = Scr.vid.width;
            _ConBack.height = Scr.vid.height;

            // save a texture slot for translated picture
            _TranslateTexture = _TextureExtensionNumber++;

            // save slots for scraps
            _ScrapTexNum             = _TextureExtensionNumber;
            _TextureExtensionNumber += MAX_SCRAPS;

            //
            // get the other pics we need
            //
            _Disc     = PicFromWad("disc");
            _BackTile = PicFromWad("backtile");
        }