LinuxGL (GLX) QuakeWorld Client compile mini-HOWTO

Robert B Easter

Перевод: Александр Ермолаев, ASPLinux

Аннотация

Этот miniHOWTO описывает способ, как собрать клиент OpenGL/GLX Linux QuakeWorld, работающий на системе, которая поддерживает аппаратное ускорение.


Введение

Этот miniHOWTO описывает, как собрать клиент OpenGL/GLX Linux QuakeWorld, работающий на системе, которая поддерживает аппаратное ускорение.

Эта способ был разработан, пока осуществлялись попытки получить glqwcl.glx, работающего на системе с Linux Slackware 7.0 (2.2.16), XFree86 4.0.1 с видеокартой GeForce 256 DDR и библиотекой 0.9-4 MesaGL от NVIDIA (libGL.so.1.0.4).


Новые версии этого документа

Последнюю версию этого документа можно найти на странице:

http://www.comptechnews.com/~reaster/linux-glxqw.txt

Если вы хотите компилировать QuakeWorld, как описано в процедуре (ниже), тогда вам пидется скачать исходные текстыпо адресу:

http://www.comptechnews.com/~reaster/index.html#games


Copyright Information

This document is copyrighted (c) 2000 Robert B. Easter and is distributed under the terms of the Linux Documentation Project (LDP) license, stated below.

Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions.

All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below.

In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs.

If you have any questions, please contact


Авторские права

Авторские права на русский перевод этого текста принадлежат ╘ 2000 ASPLinux Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но так или иначе автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: , или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу


Ответственность

Я не несу никакой ответственности за содержание этого документа. Используйте идей, примеры и другое содержимое документа на свой страх и риск.

Все авторские права принадлежат их владельцам, если нет специального уточнения.

Упоминание специфических продуктов или торговых марок, которое имеет место в этом документе, не должно расцениваться как их подтверждение их качества.


Процедура

Бинарный файл 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. НАСЛАЖДАЙТЕСЬ!