Процедура

Бинарный файл glqwcl.glx доступен по адресу: www.quakeworld.net в пакете qwcl-2.30-glibc-i386-unknown-linux2.0.tar.gz. Он не откомпилирован должным образом и при запуске ищет библиотеку libglide2x.so.

Клиенты QuakeWorld доступны в нескольких разновидностях:

OpenGL:

glqwcl (только для 3dfx?)

glqwcl.glx (MesaGL/XFree4)

Только с использованием программного ускорения:

qwcl (svgalib)

qwcl.xl1 (x11/svgalib)

Повторю, что этот miniHOWTO описывает процесс получения файла glqwcl.glx, для работы с XFree86 4.x DRI.

  1. Загрузите исходные тексты Quake, q1source.zip, с FTP ftp://ftp.idsoftware.com/idstuff/source/q1source.zip. Этот архив содержит все версии Quake1/QuakeWorld.

    После компиляции, вы должны получить версию:
    
        LinuxGL (0.98) QuakeWorld 2.40 (Aug 19, 2000)
            

    Вам также необходимо загрузить исходные тексты библиотеки Mesa 3D с узла http://mesa3d.sourceforge.net/. Подойдет файл MesaLib-3.3.tar.gz.
    
        cd /usr/src
            tar -xvzf MesaLib-3.3.tar.gz
    
            Этим самым вы распакуете исходные тексты в каталог /usr/src/Mesa-3.3
            

    Сборка библиотеки mesa:
    
        cd /usr/src/Mesa-3.3
            ./configure --prefix=/usr
            make
            

    В зависимости от вашей установки, Mesa может быть не установлена. Если вы собираетесь установить Mesa, знайте, что Mesa будет установлена поверх файлов libGL.*, которые уже есть в каталоге /usr/lib. Те файлы libGL.* вероятно, были версиями, поддерживающие аппаратное ускорение. Установка Mesa перепишет подключаемые файлы glx в каталоге /usr/X11R6/include/GL. Однако, до того, как вы установите Mesa, сделайте резервную копию файлов /usr/lib/libGL.* и /usr/X11R6/include/GL/glx*.h.

    Чтобы установить библиотеку:
    
        make install
            

    После того, как вы установите полный пакет Mesa, вам может понадобиться переустановить файлы libGL для аппаратного ускорения или восстановить их из резервной копии (как было предложено выше). Вам также может понадобится восстановить подключаемые файлы glx. Либо восстановите подключаемые файлы glx, либо восстановите их из резервной копии (как было предложено выше), либо, если у вас есть исходные тексты X, скопируйте эти файлы из каталога исходных текстов: cp xc/include/GL/*.h /usr/X11R6/include/GL.

    Устанавливая библиотеки Mesa, вы получите файлы libGLU* и подключаемые файлы установленные на вашей системе. XFree86 4.0.1 appeared to be lacking libGLU* and its include files. GLU - это стандартная часть нормальной установки OpenGL, которая отсутствует в XFree86 4 и может не работать со специализированными драйверами OpenGL.

    XFree86 4.0.1 включает только ядро Mesa 3.3, которое во время разработки было/есть MesaGL. Direct Rendering Infrastructure (DRI) XFree86 основано на коде Mesa.

    Если вам посчастливилось иметь видеокарту Nvidia, то и вы можете заинтерисоваться установкой драйверов Nvidia и выбором библиотек OpenGL (GLU, glut, Qt, страницы руководства OpenGL), поэтому посмотрите NVIDIA-OpenGL-Configuration miniHOWTO здесь:

    http://www.comptechnews.com/~reaster/nvgl.txt

    Проверьте также на сайте LDP.

  2. Сделайте каталог для хранения исходных текстов quake:
    
        mkdir q1src
            cd q1src
            unzip ../q1source.zip
            cd QW
            cp Makefile.Linux Makefile
            

  3. Отредактируйте Makefile:

    Строка 30:

    MAINDIR=/home/<you>/q1src (куда вы распакуете исходные тексты)

    Строка 37:

    MESA_DIR=/usr/src/Mesa-3.3 или то, куда вы положите исходный код Mesa

    Строки 43 и 46:

    Вам может понадобится удалить все оптимизирующие флаги компилятора, чтобы получить стабильный бинарный код. Вы можете поэкспериментировать с ними. Например, творились странные вещи, когда открывались PAK-файлы с включенной оптимизацией: программа говорила, что имеются миллионы файлов в id1/pak0.pak!

    Я удалил все флаги RELEASE_CFLAGS:
    
                -O6
                    -ffast-math
                    -funroll-loops
                    -fomit-frame-pointer
                    -fexpensive-optimizations
                    -malign-loops=2
                    -malign-jumps=2
                    -malign-functions=2
                    

    Однако, далее эксперименты показали, что по крайней мере при двух включенных флагах, все было в порядке:
    
                -ffast-math
                    -fexpensive-optimizations
                    

    Действительно неприятный флаг кажется - -O6. Я пробовал установить -O1, но результат был тот же. Флаги -malign* также не были нужны.

    Строка 50:

    Добавьте: -DGL_EXT_SHARED

    Это #define найдено внутри файла gl_vidlinuxglx.c, где оно условно компилирует некоторый 3DFx/glide-специфичный код #ifndef! Без этого, компилятор будет выдавать ошибку: неразрешенные внешние функции, связанная с glide/3dfx.

    Удалите: -I/usr/include/glide

    Измените: -L/usr/local/src/Mesa-3.0/lib на то, куда вы положили исходный код Mesa: -L/usr/src/Mesa-3.3/lib

    Удалите любые ссылки на glide и исправьте путь к исходным кодам Mesa, везде, где они еще упомянуты.

    Строка 73:

    Уберите файлы, которые вы не хотите собирать. Некоторые из них не будут собраны? Оставте только glqwcl.glx.

    Убедитесь, что у вас есть символьная ссылка /usr/X11 на /usr/X11R6. При установке X, вы можете забыть сделать это, некоторые программы и исходные тексты ищут X именно там:
    
        cd /usr
            ln -s X11R6 X11
            

    Сохраните Makefile.

  4. Исправление проблемы скрывания мыши.

    Код quake, как он есть, не скрывает мышь, когда вы ее используете. Указатель остается видимым в центре экрана, что очень раздражает. Я нашел следующее простое исправление: http://lists.openprojects.net/pipermail/glx-dev/1999-October/000994.html
    
        cd q1src/QW/client
            отредактируйте файл: gl_vidlinuxglx.c
            

    В начале функции, называемой install_grabs(void) (Строка 234), добавьте следующий код:
    
        static void install_grabs(void)
            {
                    /* переменные для создания пустого курсора */
                    Pixmap blank;
                    XColor dummy;
                    char data[1] = {0};
                    Cursor cursor;
    
                    /* делаем пустой курсор */
                    blank = XCreateBitmapFromData (dpy, win, data, 1, 1);
                    if(blank == None) fprintf(stderr, "error: out of memory.\n");
                    cursor = XCreatePixmapCursor(dpy, blank, blank, &dummy, &dummy, 0, 0);
                    XFreePixmap (dpy, blank);
                    Con_Printf("Cursor blanked.\n");
            

    8-й параметр в функции XGrabPointer должен быть изменен с "None" на "cursor", чтобы использовать пустой курсор:
    
        XGrabPointer(dpy, win,
                             True,
                             0,
                             GrabModeAsync, GrabModeAsync,
                             win,
                             cursor,
                             CurrentTime);
            
    (см: man XGrabPointer)

    Это исправление может работать и для других клиентов, если вы сделаете подобные исправления в соответствующем файле *vid*.c. Оно вызывает утечку памяти, поскольку здесь каждый раз происходит выделение памяти для другого объекта (Cursor) и не вызывается функция XFreeCursor(), но это, вероятно не проблема, т.к. я не думаю, что курсор размером 1x1 использует много памяти. Если вы хотите, вы можете использовать следующий патч q1src/QW/client/gl_vidlinuxglx.c (patch gl_vidlinuxglx.c patchfile). Только "вырежьте" содержимое кода между началом/концом приведенного ниже patchfile и "вставьте" его в файл patchfile (можете использовать другое имя). Сохраните patchfile в каталоге q1src/QW/client, где есть gl_vidlinuxglx.c. Затем запустите команду:
    
        patch gl_vidlinuxglx.c patchfile
            

    Этот патч сделает gl_vidlinuxglx.c таким, чтобы не было никаких утечек памяти. Вы можете загрузить этот патч: http://www.comptechnews.com/~reaster/gl_vidlinuxglx.c.patch.
    
*************************** начало patchfile ************************************
    *** q1src-p/QW/client/gl_vidlinuxglx.c  Tue Dec 21 18:45:54 1999
    --- gl_vidlinuxglx.c    Sat Aug 19 20:47:42 2000
    ***************
    *** 1,22 ****
    ! /*
    ! Copyright (C) 1996-1997 Id Software, Inc.
    !
    ! 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.
    !
    ! You should have received a copy of the GNU General Public License
    ! along with this program; if not, write to the Free Software
    ! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    !
    ! */
      #include <termios.h>
      #include <sys/ioctl.h>
      #include <sys/stat.h>
    --- 1,22 ----
    ! /*
    ! Copyright (C) 1996-1997 Id Software, Inc.
    !
    ! 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.
    !
    ! You should have received a copy of the GNU General Public License
    ! along with this program; if not, write to the Free Software
    ! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    !
    ! */
      #include <termios.h>
      #include <sys/ioctl.h>
      #include <sys/stat.h>
    ***************
    *** 66,71 ****
    --- 66,74 ----
    
      static int scr_width, scr_height;
    
    + /* blank cursor - gets initialized in VID_Init, freed in VID_Shutdown */
    + Cursor cursor;
    +
      /*-----------------------------------------------------------------------*/
    
      //int         texture_mode = GL_NEAREST;
    ***************
    *** 236,243 ****
                                     0,
                                     GrabModeAsync, GrabModeAsync,
                                     win,
    !                                None,
                                     CurrentTime);
    
      #ifdef USE_DGA
            XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectMouse);
    --- 239,247 ----
                                     0,
                                     GrabModeAsync, GrabModeAsync,
                                     win,
    !                                cursor,
                                     CurrentTime);
    +       Con_Printf("Cursor blanked.\n");
    
      #ifdef USE_DGA
            XF86DGADirectVideo(dpy, DefaultScreen(dpy), XF86DGADirectMouse);
    ***************
    *** 350,355 ****
    --- 354,360 ----
            if (!ctx)
                    return;
    
    +       XFreeCursor(dpy, cursor);
            glXDestroyContext(dpy, ctx);
      }
    
    ***************
    *** 602,608 ****
            unsigned long mask;
            Window root;
            XVisualInfo *visinfo;
    !
            S_Init();
    
            Cvar_RegisterVariable (&vid_mode);
    --- 607,617 ----
            unsigned long mask;
            Window root;
            XVisualInfo *visinfo;
    !       /* vars to make blank cursor */
    !       Pixmap blank;
    !       XColor dummy;
    !       char data[1] = {0};
    !
            S_Init();
    
            Cvar_RegisterVariable (&vid_mode);
    ***************
    *** 701,706 ****
    --- 710,720 ----
            Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height);
    
            vid.recalc_refdef = 1;                          // force a surface cache flush
    +
    +       blank = XCreateBitmapFromData(dpy, win, data, 1, 1);
    +       if(blank == None) fprintf(stderr, "error: out of memory.\n");
    +       cursor = XCreatePixmapCursor(dpy, blank, blank, &dummy, &dummy, 0, 0);
    +       XFreePixmap(dpy, blank);
      }
    
      void Sys_SendKeyEvents(void)
    
    *************************** конец patchfile ************************************
            

    Возможно удобно связать некоторые клавиши на консоли quake, чтобы переключать режим захвата мыши:
    
        bind q "_windowed_mouse 0"
            bind w "_windowed_mouse 1"
            

  5. Сборка (наконец-то!)

    Запустите "make build_release", без параметров, оттуда, где расположен Makefile:
    
        cd q1src/QW
            make build_release
            

    Если все прошло хорошо, вы получите бинарный файл, glqwcl.glx, в каталоге releasei386-glibc. Скопируйте файл glqwcl.glx в другой каталог (например "qw"), и из каталога установки quake скопируйте каталог id1 и все остальные каталоги игры (ctf, Fortress и т.п.) в новый каталог quakeworld.

  6. Запуск игры.

    Вы можете попробовать запустить игру через XQF: glqwcl.glx -width 1280 -height 1024 (или любое другое разрешение, поддерживаемое вашей системой)

    XQF - хорошая программа для поиска серверов QuakeWorld, и вы найдете ее по адресу: http://www.linuxgames.com/xqf

    Чтобы играть в полноэкранном режиме, требуется запустить игру в таком же разрешении, какое установлено для вашего рабочего стола. Если у вас запущен рабочий стол, вы не можете скрыть все. Надежный способ получить полноэкранный режим - запустить XFree86 без рабочего стола или без window manager:

    XFree86 &

    Эта команда запускает X XFree86 без рабочего стола или без window manager. /etc/X11/xinit/xinitrc, обычным образом запускает ваш рабочий стол.

    CTRL-ALT-'-' и CTRL-ALT-'+'

    Переключают разрешение экрана. Отредактируйте ваш /etc/X11/XF86Config, если вы не хотите иметь другие доступные разрешения.

    CTRL-ALT-F1

    Переключают в текстовую консоль.

    xterm -display localhost:0.0 &

    Все X приложения понимают команду -display, чтобы сообщить X, какой X отображать на экране. Каждая X программа - клиент X сервера. 0.0 представляет экран по клавише F7, 1.0 по F8, и т.д. localhost - ваш компьютер. Это дает возможность выполнять программу на одном компьютере, а отображать данные на другом. localhost может быть IP адрес или имя того компьютера, с запущенным X, который принимает подключения, от компьютера, где вы выполняете клиентскую программу.

    ALT-F7

    Переключаемся обратно в X 0.0. Используя xterm, запустите XQF или другую программу, которую вы используете для запуска Quake.

    glqwcl.glx -width w -height h

    Для запуска quake сообщите вашей программе параметры w и h (ширину и высоту) для установки разрешения экрана. Хорошее разрешение - 1024 на 768.

    Световые эффекты.

    В консоли вы можете попробовать включить или выключить функцию flashblend и посмотреть, какие световые эффекты вам предпочтительнее:
    
                gl_flashblend 0
                    gl_flashblend 1
            

    Когда включено (1), вы заметите цветные световые эффекты вокруг флагов и специальных элементов. В этом режиме, вы можете не увидеть вспышки от оружия или свет на стене от ракет. Точные эффекты могут зависеть от вашей установки OpenGL.

    Когда выключено (0), не будет никакого ЦВЕТНОГО света, но все световые эффекты работают. Вокруг флаго и специальных элементов, виден свет вокруг поверхностей, а также вспышки от оружия во время стрельбы и огонь от ракеты в полете.

  7. НАСЛАЖДАЙТЕСЬ!