⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ogl_x11.c

📁 The source code of Doom legacy for windows
💻 C
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: ogl_x11.c,v 1.11 2001/03/09 21:53:56 metzgermeister Exp $//// Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.////// $Log: ogl_x11.c,v $// Revision 1.11  2001/03/09 21:53:56  metzgermeister// *** empty log message ***//// Revision 1.10  2001/02/19 17:43:38  hurdler// Fix the problem of fullbright with Matrox's drivers under Linux//// Revision 1.9  2001/02/14 20:59:27  hurdler// fix texture bug under Linux//// Revision 1.8  2001/02/13 20:37:27  metzgermeister// *** empty log message ***//// Revision 1.7  2000/08/11 16:32:29  metzgermeister// *** empty log message ***//// Revision 1.6  2000/05/13 19:54:54  metzgermeister// no tex flush on setmode//// Revision 1.5  2000/04/12 19:32:29  metzgermeister// added GetRenderer function//// Revision 1.4  2000/04/07 23:10:15  metzgermeister// fullscreen support under X in Linux//// Revision 1.3  2000/03/07 03:31:14  hurdler// fix linux compilation//// Revision 1.2  2000/02/27 00:42:11  hurdler// fix CR+LF problem//// Revision 1.1.1.1  2000/02/22 20:32:33  hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION://      X11 specific part of the OpenGL API for Doom Legacy////-----------------------------------------------------------------------------#ifdef VID_X11#include <stdarg.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <GL/glx.h>#include "r_opengl.h"// **************************************************************************//                                                                    GLOBALS// **************************************************************************#ifdef DEBUG_TO_FILEHANDLE logstream = -1;#endifstatic GLXContext ctx   = NULL;static Display *dpy     = NULL;static Window win       = 0; // metzgermeister: No pointer!static XVisualInfo *vis = NULL;static char rendererString[256] = "Not Probed Yet";#define MAX_VIDEO_MODES   32static  vmode_t     video_modes[MAX_VIDEO_MODES];int     oglflags = 0; // FIXME: do we have to handle this under Linux as well?                      // Hurdler: now yes (due to that fullbright bug with g200/g400 card)// **************************************************************************//                                                                  FUNCTIONS// **************************************************************************EXPORT void _init() {#ifdef DEBUG_TO_FILE   logstream = open("ogllog.txt",O_WRONLY|O_CREAT);#endif}EXPORT void _fini() {#ifdef DEBUG_TO_FILE   if(logstream!=-1) close(logstream);#endif}//// FAB --- SORRY, THIS SHOULD BE UPDATED LIKE ABOVE, PLUS THE LINUX ADDS//EXPORT Window HWRAPI( HookXwin ) (Display *dsp,int width,int height, boolean vidmode_active){    char *renderer;    int scrnum;    int attrib[] = { GLX_RGBA,        GLX_RED_SIZE, 1,        GLX_GREEN_SIZE, 1,        GLX_BLUE_SIZE, 1,        GLX_DOUBLEBUFFER,        GLX_DEPTH_SIZE, 16, /* bug? 19990908 by Kin */        None };    unsigned long mask;    Window root;    XSetWindowAttributes attr;    DBG_Printf ("HookXwin()\n");    if (ctx != NULL) {        // si ce n'est pas la premiere fois qu'on	// this flush destroys textures with the UTAH DRI driver !?        //Flush(); // Flush here, otherwise textures will be trashed after resolution change        //glXMakeCurrent(NULL, NULL); // initialise l'environnement OpenGL, il        glXDestroyContext(dpy,ctx);// faut d'abord supprimer l'ancien        ctx = NULL;         // not very clean; use a function UnhookXwin instead?        XDestroyWindow(dsp, win);        win = 0;    }    dpy = dsp;    scrnum = DefaultScreen( dsp );    root = RootWindow( dsp, scrnum );    vis = glXChooseVisual(dsp,scrnum,attrib);    if (!vis) {        return 0;    }    /* window attributes */    if (vidmode_active) {        mask = CWColormap | CWSaveUnder | CWBackingStore |             CWEventMask | CWOverrideRedirect;                attr.override_redirect = True;        attr.backing_store = NotUseful;        attr.save_under = False;    }    else {        mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;                attr.background_pixel = 0;        attr.border_pixel = 0;    }    // is this acceptable by GLX? 19991226 by Kin    attr.colormap = XCreateColormap( dsp, root, vis->visual, AllocNone);    attr.event_mask = KeyPressMask | KeyReleaseMask#ifndef POLL_POINTER        | PointerMotionMask | ButtonPressMask | ButtonReleaseMask#endif        | ExposureMask | StructureNotifyMask;    win = XCreateWindow(dsp,                         root,                         0, 0,                         width, height,                        0,                         vis->depth,                         InputOutput,                        vis->visual,                         mask,                         &attr);    XMapWindow(dsp, win);    //SetupPixelFormat();    if ((ctx=glXCreateContext(dpy,vis,NULL,True))==NULL) {        DBG_Printf("glXCreateContext() FAILED\n");        return 0;    }    if (!glXMakeCurrent(dpy, win, ctx)) {        DBG_Printf("glXMakeCurrent() FAILED\n");        return 0;    }    renderer = strdup(glGetString(GL_RENDERER));    DBG_Printf("Vendor     : %s\n", glGetString(GL_VENDOR));    DBG_Printf("Renderer   : %s\n", renderer);    DBG_Printf("Version    : %s\n", glGetString(GL_VERSION));    DBG_Printf("Extensions : %s\n", glGetString(GL_EXTENSIONS));    // disable advanced features not working on somes hardware    if( strstr(renderer, "G200" ) )   oglflags |= GLF_NOTEXENV;    if( strstr(renderer, "G400" ) )   oglflags |= GLF_NOTEXENV;    free(renderer);    DBG_Printf("oglflags   : 0x%X\n", oglflags );    screen_depth = vis->depth;    if( screen_depth > 16)        textureformatGL = GL_RGBA;    else        textureformatGL = GL_RGB5_A1;    SetModelView( width, height );    SetStates();    // we need to clear the depth buffer. Very important!!!    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);    //Flush(); // peut 妕re qu'il faut mettre 噣 dans resize ou create    //lvid->buffer = NULL;   // unless we use the software view    //lvid->direct = NULL;   // direct access to video memory, old DOS crap    //lvid->numpages = 2;    // this is normally not used    return win; // on renvoie une valeur pour dire que cela s'est bien pass}// -----------------+// Shutdown         : Shutdown OpenGL, restore the display mode// -----------------+EXPORT void HWRAPI( Shutdown ) ( void ){    DBG_Printf ("HWRAPI Shutdown()\n");    if(ctx != NULL) {       Flush();       //glXMakeCurrent(NULL,0,0);       glXDestroyContext(dpy,ctx);    }    DBG_Printf ("HWRAPI Shutdown(DONE)\n");}// -----------------+// FinishUpdate     : Swap front and back buffers// -----------------+EXPORT void HWRAPI( FinishUpdate ) (int waitvbl){    // DBG_Printf ("FinishUpdate()\n");    // TODO: implement waitvbl    glXSwapBuffers(dpy,win);}// -----------------+// SetPalette       : Set the color lookup table for paletted textures//                  : in OpenGL, we store values for conversion of paletted graphics when//                  : they are downloaded to the 3D card.// -----------------+EXPORT void HWRAPI( SetPalette ) ( RGBA_t *pal, RGBA_t *gamma ){    int i;    //DBG_Printf ("SetPalette()\n");    for (i=0; i<256; i++) {        myPaletteData[i].s.red   = MIN((pal[i].s.red*gamma->s.red)/127,     255);        myPaletteData[i].s.green = MIN((pal[i].s.green*gamma->s.green)/127, 255);        myPaletteData[i].s.blue  = MIN((pal[i].s.blue*gamma->s.blue)/127,   255);        myPaletteData[i].s.alpha = pal[i].s.alpha;    }    // on a chang

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -