Initial commit.

This commit is contained in:
Jim Gray
2013-04-04 14:32:05 -07:00
parent ba5c81da32
commit d71d53e8ec
2180 changed files with 1393544 additions and 1 deletions

988
code/unix/Makefile Normal file
View File

@@ -0,0 +1,988 @@
#
# Quake3 Unix Makefile
#
# Currently build for the following:
# Linux i386 (full client)
# Linux Alpha (dedicated server only)
# SGI IRIX (full client)
#
# Nov '98 by Zoid <zoid@idsoftware.com>
#
# GNU Make required
#
PLATFORM=$(shell uname|tr '[:upper:]' '[:lower:]')
PLATFORM_RELEASE=$(shell uname -r)
###
### These paths are where you probably want to change things
###
# Where we are building to, libMesaVoodooGL.so.3.1 should be here, etc.
# the demo pk3 file should be here in demoq3/pak0.pk3 or baseq3/pak0.pk3
BUILD_DIR=/home/zoid/Quake3
# Where we are building from (where the source code should be!)
MOUNT_DIR=/devel/Quake3/q3code
#############################################################################
##
## You shouldn't have to touch anything below here
##
#############################################################################
DEMO_PAK=$(BUILD_DIR)/demoq3/pak0.pk3
BUILD_DEBUG_DIR=debug$(ARCH)$(GLIBC)
BUILD_RELEASE_DIR=release$(ARCH)$(GLIBC)
CLIENT_DIR=$(MOUNT_DIR)/client
SERVER_DIR=$(MOUNT_DIR)/server
REF_DIR=$(MOUNT_DIR)/renderer
COMMON_DIR=$(MOUNT_DIR)/qcommon
UNIX_DIR=$(MOUNT_DIR)/unix
GAME_DIR=$(MOUNT_DIR)/game
CGAME_DIR=$(MOUNT_DIR)/cgame
NULL_DIR=$(MOUNT_DIR)/null
#used for linux i386 builds
MESA_DIR=/usr/local/src/Mesa-3.0
VERSION=1.05
VERSION_FN=$(VERSION)$(GLIBC)
RPM_RELEASE=9
#############################################################################
# SETUP AND BUILD
#############################################################################
ifeq ($(PLATFORM),irix)
ARCH=mips #default to MIPS
VENDOR=sgi
GLIBC= #libc is irrelevant
CC=cc
BASE_CFLAGS=-Dstricmp=strcasecmp -Xcpluscomm -woff 1185 -mips3 \
-nostdinc -I. -I$(ROOT)/usr/include
RELEASE_CFLAGS=$(BASE_CFLAGS) -O3
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
SHLIBEXT=so
SHLIBCFLAGS=
SHLIBLDFLAGS=-shared
LDFLAGS=-ldl -lm
GLLDFLAGS=-L/usr/X11/lib -lGL -lX11 -lXext -lm
TARGETS=$(BUILDDIR)/sgiquake3 \
$(BUILDDIR)/qagame$(ARCH).$(SHLIBEXT) \
$(BUILDDIR)/cgame$(ARCH).$(SHLIBEXT)
else
ifeq ($(PLATFORM),linux)
ifneq (,$(findstring libc6,$(shell if [ -e /lib/libc.so.6* ];then echo libc6;fi)))
GLIBC=-glibc
else
GLIBC=
endif #libc6 test
ifneq (,$(findstring alpha,$(shell uname -m)))
ARCH=axp
RPMARCH=alpha
VENDOR=dec
else #default to i386
ARCH=i386
RPMARCH=i386
VENDOR=unknown
endif #alpha test
BASE_CFLAGS=-Dstricmp=strcasecmp -I$(MESA_DIR)/include -I/usr/include/glide \
-DREF_HARD_LINKED -pipe
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
ifeq ($(ARCH),axp)
RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O6 -ffast-math -funroll-loops -fomit-frame-pointer -fexpensive-optimizations
else
RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O3 -m486 -fomit-frame-pointer -pipe -ffast-math -fexpensive-optimizations -malign-loops=2 -malign-jumps=2 -malign-functions=2
endif
CC=gcc
SHLIBEXT=so
SHLIBCFLAGS=-fPIC
SHLIBLDFLAGS=-shared
LDFLAGS=-ldl -lm
GLLDFLAGS=-L/usr/X11R6/lib -L$(MESA_DIR)/lib -lX11 -lXext -lXxf86dga -lXxf86vm
GL_SVGA_LDFLAGS=-L/usr/X11R6/lib -L$(MESA_DIR)/lib -lX11 -lXext -lvga
ifeq ($(ARCH),axp)
TARGETS=$(BUILDDIR)/linuxq3ded $(BUILDDIR)/qagame$(ARCH).$(SHLIBEXT)
else
# $(BUILDDIR)/linuxquake3.vga
TARGETS=\
$(BUILDDIR)/linuxquake3 \
$(BUILDDIR)/qagame$(ARCH).$(SHLIBEXT) \
$(BUILDDIR)/cgame$(ARCH).$(SHLIBEXT)
#$(BUILDDIR)/quake3
endif
else #generic
CC=cc
BASE_CFLAGS=-Dstricmp=strcasecmp
DEBUG_CFLAGS=$(BASE_CFLAGS) -g
RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O
SHLIBEXT=so
SHLIBCFLAGS=-fPIC
SHLIBLDFLAGS=-shared
LDFLAGS=-ldl -lm
TARGETS=$(BUILDDIR)/q3ded $(BUILDDIR)/qagame$(ARCH).$(SHLIBEXT)
endif #Linux
endif #IRIX
DO_CC=$(CC) $(CFLAGS) -o $@ -c $<
DO_DEBUG_CC=$(CC) $(DEBUG_CFLAGS) -o $@ -c $<
DO_SHLIB_CC=$(CC) $(CFLAGS) $(SHLIBCFLAGS) -o $@ -c $<
DO_SHLIB_DEBUG_CC=$(CC) $(DEBUG_CFLAGS) $(SHLIBCFLAGS) -o $@ -c $<
DO_AS=$(CC) $(CFLAGS) -DELF -x assembler-with-cpp -o $@ -c $<
#### DEFAULT TARGET
# default: build_release
build_debug:
$(MAKE) targets BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
build_release:
$(MAKE) targets BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(RELEASE_CFLAGS)"
#Build both debug and release builds
all: build_debug build_release
targets: makedirs $(TARGETS)
makedirs:
@if [ ! -d $(BUILDDIR) ];then mkdir $(BUILDDIR);fi
@if [ ! -d $(BUILDDIR)/client ];then mkdir $(BUILDDIR)/client;fi
@if [ ! -d $(BUILDDIR)/ded ];then mkdir $(BUILDDIR)/ded;fi
@if [ ! -d $(BUILDDIR)/ref ];then mkdir $(BUILDDIR)/ref;fi
@if [ ! -d $(BUILDDIR)/game ];then mkdir $(BUILDDIR)/game;fi
@if [ ! -d $(BUILDDIR)/cgame ];then mkdir $(BUILDDIR)/cgame;fi
#############################################################################
# CLIENT/SERVER
#############################################################################
QUAKE3_OBJS = \
$(BUILDDIR)/client/cl_cgame.o \
$(BUILDDIR)/client/cl_cin.o \
$(BUILDDIR)/client/cl_console.o \
$(BUILDDIR)/client/cl_input.o \
$(BUILDDIR)/client/cl_keys.o \
$(BUILDDIR)/client/cl_main.o \
$(BUILDDIR)/client/cl_parse.o \
$(BUILDDIR)/client/cl_scrn.o \
$(BUILDDIR)/client/snd_dma.o \
$(BUILDDIR)/client/snd_mem.o \
$(BUILDDIR)/client/snd_mix.o \
$(BUILDDIR)/client/sv_bot.o \
$(BUILDDIR)/client/sv_client.o \
$(BUILDDIR)/client/sv_ccmds.o \
$(BUILDDIR)/client/sv_game.o \
$(BUILDDIR)/client/sv_init.o \
$(BUILDDIR)/client/sv_main.o \
$(BUILDDIR)/client/sv_snapshot.o \
$(BUILDDIR)/client/sv_world.o \
$(BUILDDIR)/client/ui_arena.o \
$(BUILDDIR)/client/ui_connect.o \
$(BUILDDIR)/client/ui_controls.o \
$(BUILDDIR)/client/ui_demo.o \
$(BUILDDIR)/client/ui_maps.o \
$(BUILDDIR)/client/ui_menu.o \
$(BUILDDIR)/client/ui_network.o \
$(BUILDDIR)/client/ui_preferences.o \
$(BUILDDIR)/client/ui_qmenu.o \
$(BUILDDIR)/client/ui_servers.o \
$(BUILDDIR)/client/ui_startserver.o \
$(BUILDDIR)/client/ui_video.o \
\
$(BUILDDIR)/client/cm_load.o \
$(BUILDDIR)/client/cm_patch.o \
$(BUILDDIR)/client/cm_polylib.o \
$(BUILDDIR)/client/cm_tag.o \
$(BUILDDIR)/client/cm_test.o \
$(BUILDDIR)/client/cm_trace.o \
$(BUILDDIR)/client/cmd.o \
$(BUILDDIR)/client/common.o \
$(BUILDDIR)/client/cvar.o \
$(BUILDDIR)/client/files.o \
$(BUILDDIR)/client/gameinfo.o \
$(BUILDDIR)/client/md4.o \
$(BUILDDIR)/client/msg.o \
$(BUILDDIR)/client/net_chan.o \
$(BUILDDIR)/client/vm.o \
\
$(BUILDDIR)/client/q_shared.o \
$(BUILDDIR)/client/q_math.o \
\
$(BUILDDIR)/client/tr_backend.o \
$(BUILDDIR)/client/tr_bsp.o \
$(BUILDDIR)/client/tr_calc.o \
$(BUILDDIR)/client/tr_calc_3dnow.o \
$(BUILDDIR)/client/tr_calc_c.o \
$(BUILDDIR)/client/tr_calc_kni.o \
$(BUILDDIR)/client/tr_cmds.o \
$(BUILDDIR)/client/tr_curve.o \
$(BUILDDIR)/client/tr_draw.o \
$(BUILDDIR)/client/tr_flares.o \
$(BUILDDIR)/client/tr_image.o \
$(BUILDDIR)/client/tr_init.o \
$(BUILDDIR)/client/tr_light.o \
$(BUILDDIR)/client/tr_main.o \
$(BUILDDIR)/client/tr_mesh.o \
$(BUILDDIR)/client/tr_misc.o \
$(BUILDDIR)/client/tr_model.o \
$(BUILDDIR)/client/tr_noise.o \
$(BUILDDIR)/client/tr_scene.o \
$(BUILDDIR)/client/tr_shade.o \
$(BUILDDIR)/client/tr_shader.o \
$(BUILDDIR)/client/tr_shade_calc.o \
$(BUILDDIR)/client/tr_shadows.o \
$(BUILDDIR)/client/tr_smp.o \
$(BUILDDIR)/client/tr_sky.o \
$(BUILDDIR)/client/tr_surf.o \
$(BUILDDIR)/client/tr_world.o \
\
$(BUILDDIR)/client/unix_main.o \
$(BUILDDIR)/client/unix_net.o \
$(BUILDDIR)/client/unix_shared.o
#platform specific objects
ifeq ($(PLATFORM),irix)
QUAKE3_PLATOBJ=\
$(BUILDDIR)/client/irix_qgl.o \
$(BUILDDIR)/client/irix_glimp.o \
$(BUILDDIR)/client/irix_snd.o
else
ifeq ($(PLATFORM),linux)
ifeq ($(ARCH),axp)
QUAKE3_PLATOBJ=
else
QUAKE3_PLATOBJ=\
$(BUILDDIR)/client/linux_qgl.o \
$(BUILDDIR)/client/linux_glimp.o \
$(BUILDDIR)/client/linux_snd.o \
$(BUILDDIR)/client/snd_mixa.o \
$(BUILDDIR)/client/matha.o \
$(BUILDDIR)/client/sys_dosa.o
QUAKE3_VGA=\
$(BUILDDIR)/client/linux_qgl.o \
$(BUILDDIR)/client/linux_glimp_vga.o \
$(BUILDDIR)/client/linux_input_vga.o \
$(BUILDDIR)/client/linux_snd.o \
$(BUILDDIR)/client/snd_mixa.o \
$(BUILDDIR)/client/matha.o \
$(BUILDDIR)/client/sys_dosa.o
endif
endif #Linux
endif #IRIX
$(BUILDDIR)/linuxquake3 : $(QUAKE3_OBJS) $(QUAKE3_PLATOBJ)
$(CC) $(CFLAGS) -o $@ $(QUAKE3_OBJS) $(QUAKE3_PLATOBJ) $(GLLDFLAGS) $(LDFLAGS)
ifeq ($(PLATFORM),linux)
ifeq ($(ARCH),i386)
$(BUILDDIR)/linuxquake3.vga : $(QUAKE3_OBJS) $(QUAKE3_VGA)
$(CC) $(CFLAGS) -o $@ $(QUAKE3_OBJS) $(QUAKE3_VGA) $(GL_SVGA_LDFLAGS) $(LDFLAGS)
endif
endif
$(BUILDDIR)/client/cl_cgame.o : $(CLIENT_DIR)/cl_cgame.c
$(DO_CC)
$(BUILDDIR)/client/cl_cin.o : $(CLIENT_DIR)/cl_cin.c
$(DO_CC)
$(BUILDDIR)/client/cl_console.o : $(CLIENT_DIR)/cl_console.c
$(DO_CC)
$(BUILDDIR)/client/cl_input.o : $(CLIENT_DIR)/cl_input.c
$(DO_CC)
$(BUILDDIR)/client/cl_keys.o : $(CLIENT_DIR)/cl_keys.c
$(DO_CC)
$(BUILDDIR)/client/cl_main.o : $(CLIENT_DIR)/cl_main.c
$(DO_CC)
$(BUILDDIR)/client/cl_parse.o : $(CLIENT_DIR)/cl_parse.c
$(DO_CC)
$(BUILDDIR)/client/cl_scrn.o : $(CLIENT_DIR)/cl_scrn.c
$(DO_CC)
$(BUILDDIR)/client/snd_dma.o : $(CLIENT_DIR)/snd_dma.c
$(DO_CC)
$(BUILDDIR)/client/snd_mem.o : $(CLIENT_DIR)/snd_mem.c
$(DO_CC)
$(BUILDDIR)/client/snd_mix.o : $(CLIENT_DIR)/snd_mix.c
$(DO_CC)
$(BUILDDIR)/client/sv_bot.o : $(SERVER_DIR)/sv_bot.c
$(DO_CC)
$(BUILDDIR)/client/sv_client.o : $(SERVER_DIR)/sv_client.c
$(DO_CC)
$(BUILDDIR)/client/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c
$(DO_CC)
$(BUILDDIR)/client/sv_game.o : $(SERVER_DIR)/sv_game.c
$(DO_CC)
$(BUILDDIR)/client/sv_init.o : $(SERVER_DIR)/sv_init.c
$(DO_CC)
$(BUILDDIR)/client/sv_main.o : $(SERVER_DIR)/sv_main.c
$(DO_CC)
$(BUILDDIR)/client/sv_snapshot.o : $(SERVER_DIR)/sv_snapshot.c
$(DO_CC)
$(BUILDDIR)/client/sv_world.o : $(SERVER_DIR)/sv_world.c
$(DO_CC)
$(BUILDDIR)/client/ui_arena.o : $(CLIENT_DIR)/ui_arena.c
$(DO_CC)
$(BUILDDIR)/client/ui_connect.o : $(CLIENT_DIR)/ui_connect.c
$(DO_CC)
$(BUILDDIR)/client/ui_controls.o : $(CLIENT_DIR)/ui_controls.c
$(DO_CC)
$(BUILDDIR)/client/ui_demo.o : $(CLIENT_DIR)/ui_demo.c
$(DO_CC)
$(BUILDDIR)/client/ui_maps.o : $(CLIENT_DIR)/ui_maps.c
$(DO_CC)
$(BUILDDIR)/client/ui_menu.o : $(CLIENT_DIR)/ui_menu.c
$(DO_CC)
$(BUILDDIR)/client/ui_network.o : $(CLIENT_DIR)/ui_network.c
$(DO_CC)
$(BUILDDIR)/client/ui_preferences.o : $(CLIENT_DIR)/ui_preferences.c
$(DO_CC)
$(BUILDDIR)/client/ui_qmenu.o : $(CLIENT_DIR)/ui_qmenu.c
$(DO_CC)
$(BUILDDIR)/client/ui_servers.o : $(CLIENT_DIR)/ui_servers.c
$(DO_CC)
$(BUILDDIR)/client/ui_startserver.o : $(CLIENT_DIR)/ui_startserver.c
$(DO_CC)
$(BUILDDIR)/client/ui_video.o : $(UNIX_DIR)/ui_video.c
$(DO_CC)
$(BUILDDIR)/client/cm_trace.o : $(COMMON_DIR)/cm_trace.c
$(DO_CC)
$(BUILDDIR)/client/cm_load.o : $(COMMON_DIR)/cm_load.c
$(DO_CC)
$(BUILDDIR)/client/cm_test.o : $(COMMON_DIR)/cm_test.c
$(DO_CC)
$(BUILDDIR)/client/cm_patch.o : $(COMMON_DIR)/cm_patch.c
$(DO_CC)
$(BUILDDIR)/client/cm_polylib.o : $(COMMON_DIR)/cm_polylib.c
$(DO_CC)
$(BUILDDIR)/client/cm_tag.o : $(COMMON_DIR)/cm_tag.c
$(DO_CC)
$(BUILDDIR)/client/cmd.o : $(COMMON_DIR)/cmd.c
$(DO_CC)
$(BUILDDIR)/client/common.o : $(COMMON_DIR)/common.c
$(DO_CC)
$(BUILDDIR)/client/cvar.o : $(COMMON_DIR)/cvar.c
$(DO_CC)
$(BUILDDIR)/client/files.o : $(COMMON_DIR)/files.c
$(DO_CC)
$(BUILDDIR)/client/gameinfo.o : $(COMMON_DIR)/gameinfo.c
$(DO_CC)
$(BUILDDIR)/client/md4.o : $(COMMON_DIR)/md4.c
$(DO_CC)
$(BUILDDIR)/client/msg.o : $(COMMON_DIR)/msg.c
$(DO_CC)
$(BUILDDIR)/client/net_chan.o : $(COMMON_DIR)/net_chan.c
$(DO_CC)
$(BUILDDIR)/client/vm.o : $(COMMON_DIR)/vm.c
$(DO_CC)
$(BUILDDIR)/client/q_shared.o : $(GAME_DIR)/q_shared.c
$(DO_DEBUG_CC)
$(BUILDDIR)/client/q_math.o : $(GAME_DIR)/q_math.c
$(DO_CC)
$(BUILDDIR)/client/tr_bsp.o : $(REF_DIR)/tr_bsp.c
$(DO_CC)
$(BUILDDIR)/client/tr_backend.o : $(REF_DIR)/tr_backend.c
$(DO_CC)
$(BUILDDIR)/client/tr_calc.o : $(REF_DIR)/tr_calc.c
$(DO_CC)
$(BUILDDIR)/client/tr_calc_3dnow.o : $(REF_DIR)/tr_calc_3dnow.c
$(DO_CC)
$(BUILDDIR)/client/tr_calc_c.o : $(REF_DIR)/tr_calc_c.c
$(DO_CC)
$(BUILDDIR)/client/tr_calc_kni.o : $(REF_DIR)/tr_calc_kni.c
$(DO_CC)
$(BUILDDIR)/client/tr_cmds.o : $(REF_DIR)/tr_cmds.c
$(DO_CC)
$(BUILDDIR)/client/tr_curve.o : $(REF_DIR)/tr_curve.c
$(DO_CC)
$(BUILDDIR)/client/tr_draw.o : $(REF_DIR)/tr_draw.c
$(DO_CC)
$(BUILDDIR)/client/tr_flares.o : $(REF_DIR)/tr_flares.c
$(DO_CC)
$(BUILDDIR)/client/tr_image.o : $(REF_DIR)/tr_image.c
$(DO_CC)
$(BUILDDIR)/client/tr_init.o : $(REF_DIR)/tr_init.c
$(DO_CC)
$(BUILDDIR)/client/tr_light.o : $(REF_DIR)/tr_light.c
$(DO_CC)
$(BUILDDIR)/client/tr_main.o : $(REF_DIR)/tr_main.c
$(DO_CC)
$(BUILDDIR)/client/tr_mesh.o : $(REF_DIR)/tr_mesh.c
$(DO_CC)
$(BUILDDIR)/client/tr_misc.o : $(REF_DIR)/tr_misc.c
$(DO_CC)
$(BUILDDIR)/client/tr_model.o : $(REF_DIR)/tr_model.c
$(DO_CC)
$(BUILDDIR)/client/tr_noise.o : $(REF_DIR)/tr_noise.c
$(DO_CC)
$(BUILDDIR)/client/tr_scene.o : $(REF_DIR)/tr_scene.c
$(DO_CC)
$(BUILDDIR)/client/tr_shade.o : $(REF_DIR)/tr_shade.c
$(DO_CC)
$(BUILDDIR)/client/tr_shader.o : $(REF_DIR)/tr_shader.c
$(DO_CC)
$(BUILDDIR)/client/tr_shade_calc.o : $(REF_DIR)/tr_shade_calc.c
$(DO_CC)
$(BUILDDIR)/client/tr_shadows.o : $(REF_DIR)/tr_shadows.c
$(DO_CC)
$(BUILDDIR)/client/tr_sky.o : $(REF_DIR)/tr_sky.c
$(DO_CC)
$(BUILDDIR)/client/tr_smp.o : $(REF_DIR)/tr_smp.c
$(DO_CC)
$(BUILDDIR)/client/tr_stripify.o : $(REF_DIR)/tr_stripify.c
$(DO_CC)
$(BUILDDIR)/client/tr_subdivide.o : $(REF_DIR)/tr_subdivide.c
$(DO_CC)
$(BUILDDIR)/client/tr_surf.o : $(REF_DIR)/tr_surf.c
$(DO_CC)
$(BUILDDIR)/client/tr_world.o : $(REF_DIR)/tr_world.c
$(DO_CC)
$(BUILDDIR)/client/unix_qgl.o : $(UNIX_DIR)/unix_qgl.c
$(DO_CC)
$(BUILDDIR)/client/unix_dedicated.o : $(UNIX_DIR)/unix_dedicated.c
$(DO_CC)
$(BUILDDIR)/client/unix_earlycon.o : $(UNIX_DIR)/unix_earlycon.c
$(DO_CC)
$(BUILDDIR)/client/unix_main.o : $(UNIX_DIR)/unix_main.c
$(DO_CC)
$(BUILDDIR)/client/unix_net.o : $(UNIX_DIR)/unix_net.c
$(DO_CC)
$(BUILDDIR)/client/unix_shared.o : $(UNIX_DIR)/unix_shared.c
$(DO_CC)
$(BUILDDIR)/client/irix_glimp.o : $(UNIX_DIR)/irix_glimp.c
$(DO_CC)
$(BUILDDIR)/client/irix_snd.o : $(UNIX_DIR)/irix_snd.c
$(DO_CC)
$(BUILDDIR)/client/irix_input.o : $(UNIX_DIR)/irix_input.c
$(DO_CC)
$(BUILDDIR)/client/linux_glimp.o : $(UNIX_DIR)/linux_glimp.c
$(DO_CC)
$(BUILDDIR)/client/linux_qgl.o : $(UNIX_DIR)/linux_qgl.c
$(DO_CC)
$(BUILDDIR)/client/linux_input.o : $(UNIX_DIR)/linux_input.c
$(DO_CC)
$(BUILDDIR)/client/linux_glimp_vga.o : $(UNIX_DIR)/linux_glimp_vga.c
$(DO_CC)
$(BUILDDIR)/client/linux_snd.o : $(UNIX_DIR)/linux_snd.c
$(DO_CC)
$(BUILDDIR)/client/snd_mixa.o : $(UNIX_DIR)/snd_mixa.s
$(DO_AS)
$(BUILDDIR)/client/matha.o : $(UNIX_DIR)/matha.s
$(DO_AS)
$(BUILDDIR)/client/sys_dosa.o : $(UNIX_DIR)/sys_dosa.s
$(DO_AS)
$(BUILDDIR)/client/linux_input_vga.o : $(UNIX_DIR)/linux_input_vga.c
$(DO_CC)
#############################################################################
# DEDICATED SERVER
#############################################################################
Q3DED_OBJS = \
$(BUILDDIR)/ded/sv_bot.o \
$(BUILDDIR)/ded/sv_client.o \
$(BUILDDIR)/ded/sv_ccmds.o \
$(BUILDDIR)/ded/sv_game.o \
$(BUILDDIR)/ded/sv_init.o \
$(BUILDDIR)/ded/sv_main.o \
$(BUILDDIR)/ded/sv_snapshot.o \
$(BUILDDIR)/ded/sv_world.o \
\
$(BUILDDIR)/ded/cm_trace.o \
$(BUILDDIR)/ded/cm_load.o \
$(BUILDDIR)/ded/cm_test.o \
$(BUILDDIR)/ded/cm_patch.o \
$(BUILDDIR)/ded/cm_tag.o \
$(BUILDDIR)/ded/cmd.o \
$(BUILDDIR)/ded/common.o \
$(BUILDDIR)/ded/cvar.o \
$(BUILDDIR)/ded/files.o \
$(BUILDDIR)/ded/gameinfo.o \
$(BUILDDIR)/ded/md4.o \
$(BUILDDIR)/ded/msg.o \
$(BUILDDIR)/ded/net_chan.o \
\
$(BUILDDIR)/ded/unix_dedicated.o \
$(BUILDDIR)/ded/unix_main.o \
$(BUILDDIR)/ded/unix_net.o \
$(BUILDDIR)/ded/unix_shared.o \
\
$(BUILDDIR)/ded/cl_null.o
$(BUILDDIR)/linuxq3ded : $(Q3DED_OBJS)
$(CC) $(CFLAGS) -o $@ $(Q3DED_OBJS) $(LDFLAGS)
$(BUILDDIR)/ded/sv_bot.o : $(SERVER_DIR)/sv_bot.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_client.o : $(SERVER_DIR)/sv_client.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_ccmds.o : $(SERVER_DIR)/sv_ccmds.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_game.o : $(SERVER_DIR)/sv_game.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_init.o : $(SERVER_DIR)/sv_init.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_main.o : $(SERVER_DIR)/sv_main.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_snapshot.o : $(SERVER_DIR)/sv_snapshot.c
$(DO_DED_CC)
$(BUILDDIR)/ded/sv_world.o : $(SERVER_DIR)/sv_world.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cm_trace.o : $(COMMON_DIR)/cm_trace.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cm_load.o : $(COMMON_DIR)/cm_load.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cm_test.o : $(COMMON_DIR)/cm_test.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cm_patch.o : $(COMMON_DIR)/cm_patch.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cm_tag.o : $(COMMON_DIR)/cm_tag.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cmd.o : $(COMMON_DIR)/cmd.c
$(DO_DED_CC)
$(BUILDDIR)/ded/common.o : $(COMMON_DIR)/common.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cvar.o : $(COMMON_DIR)/cvar.c
$(DO_DED_CC)
$(BUILDDIR)/ded/files.o : $(COMMON_DIR)/files.c
$(DO_DED_CC)
$(BUILDDIR)/ded/gameinfo.o : $(COMMON_DIR)/gameinfo.c
$(DO_DED_CC)
$(BUILDDIR)/ded/md4.o : $(COMMON_DIR)/md4.c
$(DO_DED_CC)
$(BUILDDIR)/ded/msg.o : $(COMMON_DIR)/msg.c
$(DO_DED_CC)
$(BUILDDIR)/ded/net_chan.o : $(COMMON_DIR)/net_chan.c
$(DO_DED_CC)
$(BUILDDIR)/ded/unix_dedicated.o : $(UNIX_DIR)/unix_dedicated.c
$(DO_DED_CC)
$(BUILDDIR)/ded/unix_main.o : $(UNIX_DIR)/unix_main.c
$(DO_DED_CC)
$(BUILDDIR)/ded/unix_net.o : $(UNIX_DIR)/unix_net.c
$(DO_DED_CC)
$(BUILDDIR)/ded/unix_shared.o : $(UNIX_DIR)/unix_shared.c
$(DO_DED_CC)
$(BUILDDIR)/ded/cl_null.o : $(NULL_DIR)/cl_null.c
$(DO_DED_CC)
#############################################################################
# GAME
#############################################################################
GAME_OBJS = \
$(BUILDDIR)/game/b_ai.o \
$(BUILDDIR)/game/b_files.o \
$(BUILDDIR)/game/b_items.o \
$(BUILDDIR)/game/b_main.o \
$(BUILDDIR)/game/b_nav.o \
$(BUILDDIR)/game/b_navgen.o \
$(BUILDDIR)/game/bg_misc.o \
$(BUILDDIR)/game/bg_pmove.o \
$(BUILDDIR)/game/g_active.o \
$(BUILDDIR)/game/g_aim.o \
$(BUILDDIR)/game/g_client.o \
$(BUILDDIR)/game/g_cmds.o \
$(BUILDDIR)/game/g_combat.o \
$(BUILDDIR)/game/g_items.o \
$(BUILDDIR)/game/g_main.o \
$(BUILDDIR)/game/g_mem.o \
$(BUILDDIR)/game/g_misc.o \
$(BUILDDIR)/game/g_missile.o \
$(BUILDDIR)/game/g_mover.o \
$(BUILDDIR)/game/g_spawn.o \
$(BUILDDIR)/game/g_svcmds.o \
$(BUILDDIR)/game/g_target.o \
$(BUILDDIR)/game/g_team.o \
$(BUILDDIR)/game/g_trigger.o \
$(BUILDDIR)/game/g_utils.o \
$(BUILDDIR)/game/g_weapon.o \
$(BUILDDIR)/game/q_shared.o \
$(BUILDDIR)/game/q_math.o
$(BUILDDIR)/qagame$(ARCH).$(SHLIBEXT) : $(GAME_OBJS)
$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(GAME_OBJS)
$(BUILDDIR)/game/b_ai.o : $(GAME_DIR)/b_ai.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/b_files.o : $(GAME_DIR)/b_files.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/b_items.o : $(GAME_DIR)/b_items.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/b_main.o : $(GAME_DIR)/b_main.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/b_nav.o : $(GAME_DIR)/b_nav.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/b_navgen.o : $(GAME_DIR)/b_navgen.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/bg_misc.o : $(GAME_DIR)/bg_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/bg_pmove.o : $(GAME_DIR)/bg_pmove.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_active.o : $(GAME_DIR)/g_active.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_aim.o : $(GAME_DIR)/g_aim.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_client.o : $(GAME_DIR)/g_client.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_cmds.o : $(GAME_DIR)/g_cmds.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_combat.o : $(GAME_DIR)/g_combat.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_items.o : $(GAME_DIR)/g_items.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_main.o : $(GAME_DIR)/g_main.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_mem.o : $(GAME_DIR)/g_mem.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_misc.o : $(GAME_DIR)/g_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_missile.o : $(GAME_DIR)/g_missile.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_mover.o : $(GAME_DIR)/g_mover.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_spawn.o : $(GAME_DIR)/g_spawn.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_svcmds.o : $(GAME_DIR)/g_svcmds.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_target.o : $(GAME_DIR)/g_target.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_team.o : $(GAME_DIR)/g_team.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_trigger.o : $(GAME_DIR)/g_trigger.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_utils.o : $(GAME_DIR)/g_utils.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/g_weapon.o : $(GAME_DIR)/g_weapon.c
$(DO_SHLIB_CC)
$(BUILDDIR)/game/q_shared.o : $(GAME_DIR)/q_shared.c
$(DO_SHLIB_DEBUG_CC)
$(BUILDDIR)/game/q_math.o : $(GAME_DIR)/q_math.c
$(DO_SHLIB_CC)
#############################################################################
# CGAME
#############################################################################
CGAME_OBJS = \
$(BUILDDIR)/cgame/bg_misc.o \
$(BUILDDIR)/cgame/bg_pmove.o \
$(BUILDDIR)/cgame/cg_draw.o \
$(BUILDDIR)/cgame/cg_effects.o \
$(BUILDDIR)/cgame/cg_ents.o \
$(BUILDDIR)/cgame/cg_event.o \
$(BUILDDIR)/cgame/cg_info.o \
$(BUILDDIR)/cgame/cg_localents.o \
$(BUILDDIR)/cgame/cg_main.o \
$(BUILDDIR)/cgame/cg_marks.o \
$(BUILDDIR)/cgame/cg_menu.o \
$(BUILDDIR)/cgame/cg_players.o \
$(BUILDDIR)/cgame/cg_predict.o \
$(BUILDDIR)/cgame/cg_scoreboard.o \
$(BUILDDIR)/cgame/cg_snapshot.o \
$(BUILDDIR)/cgame/cg_view.o \
$(BUILDDIR)/cgame/cg_weapons.o \
$(BUILDDIR)/cgame/q_shared.o \
$(BUILDDIR)/cgame/q_math.o
$(BUILDDIR)/cgame$(ARCH).$(SHLIBEXT) : $(CGAME_OBJS)
$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(CGAME_OBJS)
$(BUILDDIR)/cgame/bg_misc.o : $(GAME_DIR)/bg_misc.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/bg_pmove.o : $(GAME_DIR)/bg_pmove.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_draw.o : $(CGAME_DIR)/cg_draw.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_effects.o : $(CGAME_DIR)/cg_effects.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_ents.o : $(CGAME_DIR)/cg_ents.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_event.o : $(CGAME_DIR)/cg_event.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_info.o : $(CGAME_DIR)/cg_info.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_localents.o : $(CGAME_DIR)/cg_localents.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_main.o : $(CGAME_DIR)/cg_main.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_marks.o : $(CGAME_DIR)/cg_marks.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_menu.o : $(CGAME_DIR)/cg_menu.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_players.o : $(CGAME_DIR)/cg_players.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_predict.o : $(CGAME_DIR)/cg_predict.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_scoreboard.o : $(CGAME_DIR)/cg_scoreboard.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_snapshot.o : $(CGAME_DIR)/cg_snapshot.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_view.o : $(CGAME_DIR)/cg_view.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/cg_weapons.o : $(CGAME_DIR)/cg_weapons.c
$(DO_SHLIB_CC)
$(BUILDDIR)/cgame/q_shared.o : $(GAME_DIR)/q_shared.c
$(DO_SHLIB_DEBUG_CC)
$(BUILDDIR)/cgame/q_math.o : $(GAME_DIR)/q_math.c
$(DO_SHLIB_CC)
#############################################################################
# RPM
#############################################################################
###### DISABLED
TMPDIR=/var/tmp
TARDIR=$(TMPDIR)/q3test
TARFILE = q3test-$(VERSION_FN)-$(RPM_RELEASE).$(ARCH).tar
tar:
if [ ! -d archives ];then mkdir archives;chmod 755 archives;fi
$(MAKE) copyfiles COPYDIR=$(TARDIR)
cd $(TARDIR)/..; tar cvf $(TARFILE) q3test && gzip -9 $(TARFILE)
mv $(TARDIR)/../$(TARFILE).gz archives/.
chmod 644 archives/$(TARFILE).gz
rm -rf $(TARDIR)
# Make RPMs. You need to be root to make this work
RPMROOT=/usr/src/redhat
RPM = rpm
RPMFLAGS = -bb
INSTALLDIR = /usr/local/games/q3test
RPMDIR = $(TMPDIR)/q3test-$(VERSION_FN)
DESTDIR= $(RPMDIR)/$(INSTALLDIR)
rpm: q3test.spec
touch $(RPMROOT)/SOURCES/q3test-$(VERSION_FN).tar.gz
if [ ! -d archives ];then mkdir archives;fi
$(MAKE) copyfiles COPYDIR=$(DESTDIR)
cp $(UNIX_DIR)/quake3.gif $(RPMROOT)/SOURCES/.
cp q3test.spec $(RPMROOT)/SPECS/.
cd $(RPMROOT)/SPECS; $(RPM) $(RPMFLAGS) q3test.spec
rm -rf $(RPMDIR)
mv $(RPMROOT)/RPMS/$(RPMARCH)/q3test-$(VERSION_FN)-$(RPM_RELEASE).$(RPMARCH).rpm archives/q3test-$(VERSION_FN)-$(RPM_RELEASE).$(RPMARCH).rpm
chmod 644 archives/q3test-$(VERSION_FN)-$(RPM_RELEASE).$(RPMARCH).rpm
copyfiles:
-mkdirhier $(COPYDIR)
cp $(BUILD_RELEASE_DIR)/linuxquake3 $(COPYDIR)
strip $(COPYDIR)/linuxquake3
chmod 755 $(COPYDIR)/linuxquake3
cp $(BUILD_RELEASE_DIR)/qagame$(ARCH).$(SHLIBEXT) $(COPYDIR)
chmod 755 $(COPYDIR)/qagame$(ARCH).$(SHLIBEXT)
cp $(BUILD_RELEASE_DIR)/cgame$(ARCH).$(SHLIBEXT) $(COPYDIR)
chmod 755 $(COPYDIR)/cgame$(ARCH).$(SHLIBEXT)
cp $(BUILD_DIR)/libMesaVoodooGL.so.3.1 $(COPYDIR)/.
chmod 755 $(COPYDIR)/libMesaVoodooGL.so.3.1
-mkdir $(COPYDIR)/demoq3
chmod 1777 $(COPYDIR)/demoq3
cp $(DEMO_PAK) $(COPYDIR)/demoq3/pak0.pk3
cp $(UNIX_DIR)/README.EULA $(COPYDIR)
chmod 644 $(COPYDIR)/README.EULA
cp $(UNIX_DIR)/README.Q3Test $(COPYDIR)
chmod 644 $(COPYDIR)/README.Q3Test
q3test.spec : $(UNIX_DIR)/q3test.spec.sh Makefile
sh $< $(VERSION_FN) $(RPM_RELEASE) $(ARCH) $(INSTALLDIR) > $@
#############################################################################
# MISC
#############################################################################
clean: clean-debug clean-release
clean-debug:
$(MAKE) clean2 BUILDDIR=$(BUILD_DEBUG_DIR) CFLAGS="$(DEBUG_CFLAGS)"
clean-release:
$(MAKE) clean2 BUILDDIR=$(BUILD_RELEASE_DIR) CFLAGS="$(DEBUG_CFLAGS)"

1387
code/unix/linux_glimp.c Normal file

File diff suppressed because it is too large Load Diff

4111
code/unix/linux_qgl.c Normal file

File diff suppressed because it is too large Load Diff

244
code/unix/linux_snd.c Normal file
View File

@@ -0,0 +1,244 @@
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <linux/soundcard.h>
#include <stdio.h>
#include "../client/snd_local.h"
int audio_fd;
int snd_inited=0;
cvar_t *sndbits;
cvar_t *sndspeed;
cvar_t *sndchannels;
cvar_t *snddevice;
/* Some devices may work only with 48000 */
static int tryrates[] = { 22050, 11025, 44100, 48000, 8000 };
qboolean SNDDMA_Init(void)
{
int rc;
int fmt;
int tmp;
int i;
char *s;
struct audio_buf_info info;
int caps;
extern uid_t saved_euid;
if (snd_inited)
return;
if (!snddevice) {
sndbits = Cvar_Get("sndbits", "16", CVAR_ARCHIVE);
sndspeed = Cvar_Get("sndspeed", "0", CVAR_ARCHIVE);
sndchannels = Cvar_Get("sndchannels", "2", CVAR_ARCHIVE);
snddevice = Cvar_Get("snddevice", "/dev/dsp", CVAR_ARCHIVE);
}
// open /dev/dsp, confirm capability to mmap, and get size of dma buffer
if (!audio_fd) {
seteuid(saved_euid);
audio_fd = open(snddevice->string, O_RDWR);
seteuid(getuid());
if (audio_fd < 0) {
perror(snddevice->string);
Com_Printf("Could not open %s\n", snddevice->string);
return 0;
}
}
#if 0
/* Not applicable here */
rc = ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not reset %s\n", snddevice->string);
close(audio_fd);
return 0;
}
#endif
if (ioctl(audio_fd, SNDCTL_DSP_GETCAPS, &caps) == -1) {
perror(snddevice->string);
Com_Printf("Sound driver too old\n");
close(audio_fd);
return 0;
}
if (!(caps & DSP_CAP_TRIGGER) || !(caps & DSP_CAP_MMAP)) {
Com_Printf("Sorry but your soundcard can't do this\n");
close(audio_fd);
return 0;
}
/* SNDCTL_DSP_GETOSPACE moved to be called later */
// set sample bits & speed
dma.samplebits = (int)sndbits->value;
if (dma.samplebits != 16 && dma.samplebits != 8) {
ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &fmt);
if (fmt & AFMT_S16_LE)
dma.samplebits = 16;
else if (fmt & AFMT_U8)
dma.samplebits = 8;
}
dma.speed = (int)sndspeed->value;
if (!dma.speed) {
for (i=0 ; i<sizeof(tryrates)/4 ; i++)
if (!ioctl(audio_fd, SNDCTL_DSP_SPEED, &tryrates[i]))
break;
dma.speed = tryrates[i];
}
dma.channels = (int)sndchannels->value;
if (dma.channels < 1 || dma.channels > 2)
dma.channels = 2;
/* mmap() call moved forward */
tmp = 0;
if (dma.channels == 2)
tmp = 1;
rc = ioctl(audio_fd, SNDCTL_DSP_STEREO, &tmp);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not set %s to stereo=%d", snddevice->string, dma.channels);
close(audio_fd);
return 0;
}
if (tmp)
dma.channels = 2;
else
dma.channels = 1;
rc = ioctl(audio_fd, SNDCTL_DSP_SPEED, &dma.speed);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not set %s speed to %d", snddevice->string, dma.speed);
close(audio_fd);
return 0;
}
if (dma.samplebits == 16) {
rc = AFMT_S16_LE;
rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not support 16-bit data. Try 8-bit.\n");
close(audio_fd);
return 0;
}
} else if (dma.samplebits == 8) {
rc = AFMT_U8;
rc = ioctl(audio_fd, SNDCTL_DSP_SETFMT, &rc);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not support 8-bit data.\n");
close(audio_fd);
return 0;
}
} else {
perror(snddevice->string);
Com_Printf("%d-bit sound not supported.", dma.samplebits);
close(audio_fd);
return 0;
}
if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info)==-1) {
perror("GETOSPACE");
Com_Printf("Um, can't do GETOSPACE?\n");
close(audio_fd);
return 0;
}
dma.samples = info.fragstotal * info.fragsize / (dma.samplebits/8);
dma.submission_chunk = 1;
// memory map the dma buffer
if (!dma.buffer)
dma.buffer = (unsigned char *) mmap(NULL, info.fragstotal
* info.fragsize, PROT_WRITE, MAP_FILE|MAP_SHARED, audio_fd, 0);
if (!dma.buffer) {
perror(snddevice->string);
Com_Printf("Could not mmap %s\n", snddevice->string);
close(audio_fd);
return 0;
}
// toggle the trigger & start her up
tmp = 0;
rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not toggle.\n");
close(audio_fd);
return 0;
}
tmp = PCM_ENABLE_OUTPUT;
rc = ioctl(audio_fd, SNDCTL_DSP_SETTRIGGER, &tmp);
if (rc < 0) {
perror(snddevice->string);
Com_Printf("Could not toggle.\n");
close(audio_fd);
return 0;
}
snd_inited = 1;
return 1;
}
int SNDDMA_GetDMAPos(void)
{
struct count_info count;
if (!snd_inited) return 0;
if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &count) == -1) {
perror(snddevice->string);
Com_Printf("Uh, sound dead.\n");
close(audio_fd);
snd_inited = 0;
return 0;
}
return count.ptr / (dma.samplebits / 8);
}
void SNDDMA_Shutdown(void)
{
}
/*
==============
SNDDMA_Submit
Send sound to device if buffer isn't really the dma buffer
===============
*/
void SNDDMA_Submit(void)
{
}
void SNDDMA_BeginPainting (void)
{
}

402
code/unix/matha.s Normal file
View File

@@ -0,0 +1,402 @@
//
// math.s
// x86 assembly-language math routines.
#define GLQUAKE 1 // don't include unneeded defs
#include "qasm.h"
#if id386
.data
.align 4
Ljmptab: .long Lcase0, Lcase1, Lcase2, Lcase3
.long Lcase4, Lcase5, Lcase6, Lcase7
.text
// TODO: rounding needed?
// stack parameter offset
#define val 4
.globl C(Invert24To16)
C(Invert24To16):
movl val(%esp),%ecx
movl $0x100,%edx // 0x10000000000 as dividend
cmpl %edx,%ecx
jle LOutOfRange
subl %eax,%eax
divl %ecx
ret
LOutOfRange:
movl $0xFFFFFFFF,%eax
ret
#if 0
#define in 4
#define out 8
.align 2
.globl C(TransformVector)
C(TransformVector):
movl in(%esp),%eax
movl out(%esp),%edx
flds (%eax) // in[0]
fmuls C(vright) // in[0]*vright[0]
flds (%eax) // in[0] | in[0]*vright[0]
fmuls C(vup) // in[0]*vup[0] | in[0]*vright[0]
flds (%eax) // in[0] | in[0]*vup[0] | in[0]*vright[0]
fmuls C(vpn) // in[0]*vpn[0] | in[0]*vup[0] | in[0]*vright[0]
flds 4(%eax) // in[1] | ...
fmuls C(vright)+4 // in[1]*vright[1] | ...
flds 4(%eax) // in[1] | in[1]*vright[1] | ...
fmuls C(vup)+4 // in[1]*vup[1] | in[1]*vright[1] | ...
flds 4(%eax) // in[1] | in[1]*vup[1] | in[1]*vright[1] | ...
fmuls C(vpn)+4 // in[1]*vpn[1] | in[1]*vup[1] | in[1]*vright[1] | ...
fxch %st(2) // in[1]*vright[1] | in[1]*vup[1] | in[1]*vpn[1] | ...
faddp %st(0),%st(5) // in[1]*vup[1] | in[1]*vpn[1] | ...
faddp %st(0),%st(3) // in[1]*vpn[1] | ...
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
flds 8(%eax) // in[2] | ...
fmuls C(vright)+8 // in[2]*vright[2] | ...
flds 8(%eax) // in[2] | in[2]*vright[2] | ...
fmuls C(vup)+8 // in[2]*vup[2] | in[2]*vright[2] | ...
flds 8(%eax) // in[2] | in[2]*vup[2] | in[2]*vright[2] | ...
fmuls C(vpn)+8 // in[2]*vpn[2] | in[2]*vup[2] | in[2]*vright[2] | ...
fxch %st(2) // in[2]*vright[2] | in[2]*vup[2] | in[2]*vpn[2] | ...
faddp %st(0),%st(5) // in[2]*vup[2] | in[2]*vpn[2] | ...
faddp %st(0),%st(3) // in[2]*vpn[2] | ...
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
fstps 8(%edx) // out[2]
fstps 4(%edx) // out[1]
fstps (%edx) // out[0]
ret
#endif
#define EMINS 4+4
#define EMAXS 4+8
#define P 4+12
.align 2
.globl C(BoxOnPlaneSide)
C(BoxOnPlaneSide):
pushl %ebx
movl P(%esp),%edx
movl EMINS(%esp),%ecx
xorl %eax,%eax
movl EMAXS(%esp),%ebx
movb pl_signbits(%edx),%al
cmpb $8,%al
jge Lerror
flds pl_normal(%edx) // p->normal[0]
fld %st(0) // p->normal[0] | p->normal[0]
jmp Ljmptab(,%eax,4)
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
Lcase0:
fmuls (%ebx) // p->normal[0]*emaxs[0] | p->normal[0]
flds pl_normal+4(%edx) // p->normal[1] | p->normal[0]*emaxs[0] |
// p->normal[0]
fxch %st(2) // p->normal[0] | p->normal[0]*emaxs[0] |
// p->normal[1]
fmuls (%ecx) // p->normal[0]*emins[0] |
// p->normal[0]*emaxs[0] | p->normal[1]
fxch %st(2) // p->normal[1] | p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fld %st(0) // p->normal[1] | p->normal[1] |
// p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fmuls 4(%ebx) // p->normal[1]*emaxs[1] | p->normal[1] |
// p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
flds pl_normal+8(%edx) // p->normal[2] | p->normal[1]*emaxs[1] |
// p->normal[1] | p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fxch %st(2) // p->normal[1] | p->normal[1]*emaxs[1] |
// p->normal[2] | p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fmuls 4(%ecx) // p->normal[1]*emins[1] |
// p->normal[1]*emaxs[1] |
// p->normal[2] | p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fxch %st(2) // p->normal[2] | p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1] |
// p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fld %st(0) // p->normal[2] | p->normal[2] |
// p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1] |
// p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fmuls 8(%ebx) // p->normal[2]*emaxs[2] |
// p->normal[2] |
// p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1] |
// p->normal[0]*emaxs[0] |
// p->normal[0]*emins[0]
fxch %st(5) // p->normal[0]*emins[0] |
// p->normal[2] |
// p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1] |
// p->normal[0]*emaxs[0] |
// p->normal[2]*emaxs[2]
faddp %st(0),%st(3) //p->normal[2] |
// p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// p->normal[0]*emaxs[0] |
// p->normal[2]*emaxs[2]
fmuls 8(%ecx) //p->normal[2]*emins[2] |
// p->normal[1]*emaxs[1] |
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// p->normal[0]*emaxs[0] |
// p->normal[2]*emaxs[2]
fxch %st(1) //p->normal[1]*emaxs[1] |
// p->normal[2]*emins[2] |
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// p->normal[0]*emaxs[0] |
// p->normal[2]*emaxs[2]
faddp %st(0),%st(3) //p->normal[2]*emins[2] |
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
// p->normal[2]*emaxs[2]
fxch %st(3) //p->normal[2]*emaxs[2] +
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
// p->normal[2]*emins[2]
faddp %st(0),%st(2) //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
// dist1 | p->normal[2]*emins[2]
jmp LSetSides
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
Lcase1:
fmuls (%ecx) // emins[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ebx) // emaxs[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ebx) // emaxs[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ecx) // emins[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ebx) // emaxs[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ecx) // emins[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
Lcase2:
fmuls (%ebx) // emaxs[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ecx) // emins[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ecx) // emins[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ebx) // emaxs[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ebx) // emaxs[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ecx) // emins[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
Lcase3:
fmuls (%ecx) // emins[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ebx) // emaxs[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ecx) // emins[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ebx) // emaxs[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ebx) // emaxs[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ecx) // emins[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
Lcase4:
fmuls (%ebx) // emaxs[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ecx) // emins[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ebx) // emaxs[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ecx) // emins[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ecx) // emins[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ebx) // emaxs[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
Lcase5:
fmuls (%ecx) // emins[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ebx) // emaxs[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ebx) // emaxs[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ecx) // emins[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ecx) // emins[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ebx) // emaxs[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
Lcase6:
fmuls (%ebx) // emaxs[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ecx) // emins[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ecx) // emins[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ebx) // emaxs[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ecx) // emins[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ebx) // emaxs[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
jmp LSetSides
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
Lcase7:
fmuls (%ecx) // emins[0]
flds pl_normal+4(%edx)
fxch %st(2)
fmuls (%ebx) // emaxs[0]
fxch %st(2)
fld %st(0)
fmuls 4(%ecx) // emins[1]
flds pl_normal+8(%edx)
fxch %st(2)
fmuls 4(%ebx) // emaxs[1]
fxch %st(2)
fld %st(0)
fmuls 8(%ecx) // emins[2]
fxch %st(5)
faddp %st(0),%st(3)
fmuls 8(%ebx) // emaxs[2]
fxch %st(1)
faddp %st(0),%st(3)
fxch %st(3)
faddp %st(0),%st(2)
LSetSides:
// sides = 0;
// if (dist1 >= p->dist)
// sides = 1;
// if (dist2 < p->dist)
// sides |= 2;
faddp %st(0),%st(2) // dist1 | dist2
fcomps pl_dist(%edx)
xorl %ecx,%ecx
fnstsw %ax
fcomps pl_dist(%edx)
andb $1,%ah
xorb $1,%ah
addb %ah,%cl
fnstsw %ax
andb $1,%ah
addb %ah,%ah
addb %ah,%cl
// return sides;
popl %ebx
movl %ecx,%eax // return status
ret
Lerror:
movl 1, %eax
ret
#endif // id386

41
code/unix/q3test.spec.sh Normal file
View File

@@ -0,0 +1,41 @@
#!/bin/sh
# Generate Quake3 test
# $1 is version
# $2 is release
# $3 is arch
# $4 is install dir (assumed to be in /var/tmp)
cat <<EOF
%define name q3test
%define version ${1}
%define release ${2}
%define arch ${3}
%define builddir \$RPM_BUILD_DIR/%{name}-%{version}
Name: %{name}
Version: %{version}
Release: %{release}
Vendor: id Software
Packager: Dave "Zoid" Kirsch <zoid@idsoftware.com>
URL: http://www.idsoftware.com/
Source: q3test-%{version}.tar.gz
Group: Games
Copyright: Restricted
Icon: quake3.gif
BuildRoot: /var/tmp/%{name}-%{version}
Summary: Q3Test for Linux
%description
%install
%files
%attr(644,root,root) $4/README.EULA
%attr(644,root,root) $4/README.Q3Test
%attr(755,root,root) $4/linuxquake3
%attr(755,root,root) $4/cgamei386.so
%attr(755,root,root) $4/qagamei386.so
%attr(755,root,root) $4/libMesaVoodooGL.so.3.1
%attr(644,root,root) $4/demoq3/pak0.pk3
EOF

459
code/unix/qasm.h Normal file
View File

@@ -0,0 +1,459 @@
#ifndef __ASM_I386__
#define __ASM_I386__
#ifdef ELF
#define C(label) label
#else
#define C(label) _##label
#endif
//#define GLQUAKE 1
#if defined(_WIN32) && !defined(WINDED)
#if defined(_M_IX86)
#define __i386__ 1
#endif
#endif
#ifdef __i386__
#define id386 1
#else
#define id386 0
#endif
// !!! must be kept the same as in d_iface.h !!!
#define TRANSPARENT_COLOR 255
#ifndef GLQUAKE
.extern C(d_zistepu)
.extern C(d_pzbuffer)
.extern C(d_zistepv)
.extern C(d_zrowbytes)
.extern C(d_ziorigin)
.extern C(r_turb_s)
.extern C(r_turb_t)
.extern C(r_turb_pdest)
.extern C(r_turb_spancount)
.extern C(r_turb_turb)
.extern C(r_turb_pbase)
.extern C(r_turb_sstep)
.extern C(r_turb_tstep)
.extern C(r_bmodelactive)
.extern C(d_sdivzstepu)
.extern C(d_tdivzstepu)
.extern C(d_sdivzstepv)
.extern C(d_tdivzstepv)
.extern C(d_sdivzorigin)
.extern C(d_tdivzorigin)
.extern C(sadjust)
.extern C(tadjust)
.extern C(bbextents)
.extern C(bbextentt)
.extern C(cacheblock)
.extern C(d_viewbuffer)
.extern C(cachewidth)
.extern C(d_pzbuffer)
.extern C(d_zrowbytes)
.extern C(d_zwidth)
.extern C(d_scantable)
.extern C(r_lightptr)
.extern C(r_numvblocks)
.extern C(prowdestbase)
.extern C(pbasesource)
.extern C(r_lightwidth)
.extern C(lightright)
.extern C(lightrightstep)
.extern C(lightdeltastep)
.extern C(lightdelta)
.extern C(lightright)
.extern C(lightdelta)
.extern C(sourcetstep)
.extern C(surfrowbytes)
.extern C(lightrightstep)
.extern C(lightdeltastep)
.extern C(r_sourcemax)
.extern C(r_stepback)
.extern C(colormap)
.extern C(blocksize)
.extern C(sourcesstep)
.extern C(lightleft)
.extern C(blockdivshift)
.extern C(blockdivmask)
.extern C(lightleftstep)
.extern C(r_origin)
.extern C(r_ppn)
.extern C(r_pup)
.extern C(r_pright)
.extern C(ycenter)
.extern C(xcenter)
.extern C(d_vrectbottom_particle)
.extern C(d_vrectright_particle)
.extern C(d_vrecty)
.extern C(d_vrectx)
.extern C(d_pix_shift)
.extern C(d_pix_min)
.extern C(d_pix_max)
.extern C(d_y_aspect_shift)
.extern C(screenwidth)
.extern C(r_leftclipped)
.extern C(r_leftenter)
.extern C(r_rightclipped)
.extern C(r_rightenter)
.extern C(modelorg)
.extern C(xscale)
.extern C(r_refdef)
.extern C(yscale)
.extern C(r_leftexit)
.extern C(r_rightexit)
.extern C(r_lastvertvalid)
.extern C(cacheoffset)
.extern C(newedges)
.extern C(removeedges)
.extern C(r_pedge)
.extern C(r_framecount)
.extern C(r_u1)
.extern C(r_emitted)
.extern C(edge_p)
.extern C(surface_p)
.extern C(surfaces)
.extern C(r_lzi1)
.extern C(r_v1)
.extern C(r_ceilv1)
.extern C(r_nearzi)
.extern C(r_nearzionly)
.extern C(edge_aftertail)
.extern C(edge_tail)
.extern C(current_iv)
.extern C(edge_head_u_shift20)
.extern C(span_p)
.extern C(edge_head)
.extern C(fv)
.extern C(edge_tail_u_shift20)
.extern C(r_apverts)
.extern C(r_anumverts)
.extern C(aliastransform)
.extern C(r_avertexnormals)
.extern C(r_plightvec)
.extern C(r_ambientlight)
.extern C(r_shadelight)
.extern C(aliasxcenter)
.extern C(aliasycenter)
.extern C(a_sstepxfrac)
.extern C(r_affinetridesc)
.extern C(acolormap)
.extern C(d_pcolormap)
.extern C(r_affinetridesc)
.extern C(d_sfrac)
.extern C(d_ptex)
.extern C(d_pedgespanpackage)
.extern C(d_tfrac)
.extern C(d_light)
.extern C(d_zi)
.extern C(d_pdest)
.extern C(d_pz)
.extern C(d_aspancount)
.extern C(erroradjustup)
.extern C(errorterm)
.extern C(d_xdenom)
.extern C(r_p0)
.extern C(r_p1)
.extern C(r_p2)
.extern C(a_tstepxfrac)
.extern C(r_sstepx)
.extern C(r_tstepx)
.extern C(a_ststepxwhole)
.extern C(zspantable)
.extern C(skintable)
.extern C(r_zistepx)
.extern C(erroradjustdown)
.extern C(d_countextrastep)
.extern C(ubasestep)
.extern C(a_ststepxwhole)
.extern C(a_tstepxfrac)
.extern C(r_lstepx)
.extern C(a_spans)
.extern C(erroradjustdown)
.extern C(d_pdestextrastep)
.extern C(d_pzextrastep)
.extern C(d_sfracextrastep)
.extern C(d_ptexextrastep)
.extern C(d_countextrastep)
.extern C(d_tfracextrastep)
.extern C(d_lightextrastep)
.extern C(d_ziextrastep)
.extern C(d_pdestbasestep)
.extern C(d_pzbasestep)
.extern C(d_sfracbasestep)
.extern C(d_ptexbasestep)
.extern C(ubasestep)
.extern C(d_tfracbasestep)
.extern C(d_lightbasestep)
.extern C(d_zibasestep)
.extern C(zspantable)
.extern C(r_lstepy)
.extern C(r_sstepy)
.extern C(r_tstepy)
.extern C(r_zistepy)
.extern C(D_PolysetSetEdgeTable)
.extern C(D_RasterizeAliasPolySmooth)
.extern float_point5
.extern Float2ToThe31nd
.extern izistep
.extern izi
.extern FloatMinus2ToThe31nd
.extern float_1
.extern float_particle_z_clip
.extern float_minus_1
.extern float_0
.extern fp_16
.extern fp_64k
.extern fp_1m
.extern fp_1m_minus_1
.extern fp_8
.extern entryvec_table
.extern advancetable
.extern sstep
.extern tstep
.extern pspantemp
.extern counttemp
.extern jumptemp
.extern reciprocal_table
.extern DP_Count
.extern DP_u
.extern DP_v
.extern DP_32768
.extern DP_Color
.extern DP_Pix
.extern DP_EntryTable
.extern pbase
.extern s
.extern t
.extern sfracf
.extern tfracf
.extern snext
.extern tnext
.extern spancountminus1
.extern zi16stepu
.extern sdivz16stepu
.extern tdivz16stepu
.extern zi8stepu
.extern sdivz8stepu
.extern tdivz8stepu
.extern reciprocal_table_16
.extern entryvec_table_16
.extern ceil_cw
.extern single_cw
.extern fp_64kx64k
.extern pz
.extern spr8entryvec_table
#endif
.extern C(snd_scaletable)
.extern C(paintbuffer)
.extern C(snd_linear_count)
.extern C(snd_p)
.extern C(snd_vol)
.extern C(snd_out)
.extern C(vright)
.extern C(vup)
.extern C(vpn)
.extern C(BOPS_Error)
//
// !!! note that this file must match the corresponding C structures at all
// times !!!
//
// plane_t structure
// !!! if this is changed, it must be changed in model.h too !!!
// !!! if the size of this is changed, the array lookup in SV_HullPointContents
// must be changed too !!!
#define pl_normal 0
#define pl_dist 12
#define pl_type 16
#define pl_signbits 17
#define pl_pad 18
#define pl_size 20
// hull_t structure
// !!! if this is changed, it must be changed in model.h too !!!
#define hu_clipnodes 0
#define hu_planes 4
#define hu_firstclipnode 8
#define hu_lastclipnode 12
#define hu_clip_mins 16
#define hu_clip_maxs 28
#define hu_size 40
// dnode_t structure
// !!! if this is changed, it must be changed in bspfile.h too !!!
#define nd_planenum 0
#define nd_children 4
#define nd_mins 8
#define nd_maxs 20
#define nd_firstface 32
#define nd_numfaces 36
#define nd_size 40
// sfxcache_t structure
// !!! if this is changed, it much be changed in sound.h too !!!
#define sfxc_length 0
#define sfxc_loopstart 4
#define sfxc_speed 8
#define sfxc_width 12
#define sfxc_stereo 16
#define sfxc_data 20
// channel_t structure
// !!! if this is changed, it much be changed in sound.h too !!!
#define ch_sfx 0
#define ch_leftvol 4
#define ch_rightvol 8
#define ch_end 12
#define ch_pos 16
#define ch_looping 20
#define ch_entnum 24
#define ch_entchannel 28
#define ch_origin 32
#define ch_dist_mult 44
#define ch_master_vol 48
#define ch_size 52
// portable_samplepair_t structure
// !!! if this is changed, it much be changed in sound.h too !!!
#define psp_left 0
#define psp_right 4
#define psp_size 8
//
// !!! note that this file must match the corresponding C structures at all
// times !!!
//
// !!! if this is changed, it must be changed in r_local.h too !!!
#define NEAR_CLIP 0.01
// !!! if this is changed, it must be changed in r_local.h too !!!
#define CYCLE 128
// espan_t structure
// !!! if this is changed, it must be changed in r_shared.h too !!!
#define espan_t_u 0
#define espan_t_v 4
#define espan_t_count 8
#define espan_t_pnext 12
#define espan_t_size 16
// sspan_t structure
// !!! if this is changed, it must be changed in d_local.h too !!!
#define sspan_t_u 0
#define sspan_t_v 4
#define sspan_t_count 8
#define sspan_t_size 12
// spanpackage_t structure
// !!! if this is changed, it must be changed in d_polyset.c too !!!
#define spanpackage_t_pdest 0
#define spanpackage_t_pz 4
#define spanpackage_t_count 8
#define spanpackage_t_ptex 12
#define spanpackage_t_sfrac 16
#define spanpackage_t_tfrac 20
#define spanpackage_t_light 24
#define spanpackage_t_zi 28
#define spanpackage_t_size 32
// edge_t structure
// !!! if this is changed, it must be changed in r_shared.h too !!!
#define et_u 0
#define et_u_step 4
#define et_prev 8
#define et_next 12
#define et_surfs 16
#define et_nextremove 20
#define et_nearzi 24
#define et_owner 28
#define et_size 32
// surf_t structure
// !!! if this is changed, it must be changed in r_shared.h too !!!
#define SURF_T_SHIFT 6
#define st_next 0
#define st_prev 4
#define st_spans 8
#define st_key 12
#define st_last_u 16
#define st_spanstate 20
#define st_flags 24
#define st_data 28
#define st_entity 32
#define st_nearzi 36
#define st_insubmodel 40
#define st_d_ziorigin 44
#define st_d_zistepu 48
#define st_d_zistepv 52
#define st_pad 56
#define st_size 64
// clipplane_t structure
// !!! if this is changed, it must be changed in r_local.h too !!!
#define cp_normal 0
#define cp_dist 12
#define cp_next 16
#define cp_leftedge 20
#define cp_rightedge 21
#define cp_reserved 22
#define cp_size 24
// medge_t structure
// !!! if this is changed, it must be changed in model.h too !!!
#define me_v 0
#define me_cachededgeoffset 4
#define me_size 8
// mvertex_t structure
// !!! if this is changed, it must be changed in model.h too !!!
#define mv_position 0
#define mv_size 12
// refdef_t structure
// !!! if this is changed, it must be changed in render.h too !!!
#define rd_vrect 0
#define rd_aliasvrect 20
#define rd_vrectright 40
#define rd_vrectbottom 44
#define rd_aliasvrectright 48
#define rd_aliasvrectbottom 52
#define rd_vrectrightedge 56
#define rd_fvrectx 60
#define rd_fvrecty 64
#define rd_fvrectx_adj 68
#define rd_fvrecty_adj 72
#define rd_vrect_x_adj_shift20 76
#define rd_vrectright_adj_shift20 80
#define rd_fvrectright_adj 84
#define rd_fvrectbottom_adj 88
#define rd_fvrectright 92
#define rd_fvrectbottom 96
#define rd_horizontalFieldOfView 100
#define rd_xOrigin 104
#define rd_yOrigin 108
#define rd_vieworg 112
#define rd_viewangles 124
#define rd_ambientlight 136
#define rd_size 140
// mtriangle_t structure
// !!! if this is changed, it must be changed in model.h too !!!
#define mtri_facesfront 0
#define mtri_vertindex 4
#define mtri_size 16 // !!! if this changes, array indexing in !!!
// !!! d_polysa.s must be changed to match !!!
#define mtri_shift 4
#endif

BIN
code/unix/quake3.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

197
code/unix/snd_mixa.s Normal file
View File

@@ -0,0 +1,197 @@
//
// snd_mixa.s
// x86 assembly-language sound code
//
#include "qasm.h"
#if id386
.text
#if 0
//----------------------------------------------------------------------
// 8-bit sound-mixing code
//----------------------------------------------------------------------
#define ch 4+16
#define sc 8+16
#define count 12+16
.globl C(S_PaintChannelFrom8)
C(S_PaintChannelFrom8):
pushl %esi // preserve register variables
pushl %edi
pushl %ebx
pushl %ebp
// int data;
// short *lscale, *rscale;
// unsigned char *sfx;
// int i;
movl ch(%esp),%ebx
movl sc(%esp),%esi
// if (ch->leftvol > 255)
// ch->leftvol = 255;
// if (ch->rightvol > 255)
// ch->rightvol = 255;
movl ch_leftvol(%ebx),%eax
movl ch_rightvol(%ebx),%edx
cmpl $255,%eax
jna LLeftSet
movl $255,%eax
LLeftSet:
cmpl $255,%edx
jna LRightSet
movl $255,%edx
LRightSet:
// lscale = snd_scaletable[ch->leftvol >> 3];
// rscale = snd_scaletable[ch->rightvol >> 3];
// sfx = (signed char *)sc->data + ch->pos;
// ch->pos += count;
andl $0xF8,%eax
addl $20,%esi
movl (%esi),%esi
andl $0xF8,%edx
movl ch_pos(%ebx),%edi
movl count(%esp),%ecx
addl %edi,%esi
shll $7,%eax
addl %ecx,%edi
shll $7,%edx
movl %edi,ch_pos(%ebx)
addl $(C(snd_scaletable)),%eax
addl $(C(snd_scaletable)),%edx
subl %ebx,%ebx
movb -1(%esi,%ecx,1),%bl
testl $1,%ecx
jz LMix8Loop
movl (%eax,%ebx,4),%edi
movl (%edx,%ebx,4),%ebp
addl C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size),%edi
addl C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size),%ebp
movl %edi,C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size)
movl %ebp,C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size)
movb -2(%esi,%ecx,1),%bl
decl %ecx
jz LDone
// for (i=0 ; i<count ; i++)
// {
LMix8Loop:
// data = sfx[i];
// paintbuffer[i].left += lscale[data];
// paintbuffer[i].right += rscale[data];
movl (%eax,%ebx,4),%edi
movl (%edx,%ebx,4),%ebp
addl C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size),%edi
addl C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size),%ebp
movb -2(%esi,%ecx,1),%bl
movl %edi,C(paintbuffer)+psp_left-psp_size(,%ecx,psp_size)
movl %ebp,C(paintbuffer)+psp_right-psp_size(,%ecx,psp_size)
movl (%eax,%ebx,4),%edi
movl (%edx,%ebx,4),%ebp
movb -3(%esi,%ecx,1),%bl
addl C(paintbuffer)+psp_left-psp_size*2(,%ecx,psp_size),%edi
addl C(paintbuffer)+psp_right-psp_size*2(,%ecx,psp_size),%ebp
movl %edi,C(paintbuffer)+psp_left-psp_size*2(,%ecx,psp_size)
movl %ebp,C(paintbuffer)+psp_right-psp_size*2(,%ecx,psp_size)
// }
subl $2,%ecx
jnz LMix8Loop
LDone:
popl %ebp
popl %ebx
popl %edi
popl %esi
ret
#endif
//----------------------------------------------------------------------
// Transfer of stereo buffer to 16-bit DMA buffer code
//----------------------------------------------------------------------
.globl C(S_WriteLinearBlastStereo16)
C(S_WriteLinearBlastStereo16):
pushl %edi
pushl %ebx
// int i;
// int val;
movl C(snd_linear_count),%ecx
movl C(snd_p),%ebx
movl C(snd_out),%edi
// for (i=0 ; i<snd_linear_count ; i+=2)
// {
LWLBLoopTop:
// val = (snd_p[i]*snd_vol)>>8;
// if (val > 0x7fff)
// snd_out[i] = 0x7fff;
// else if (val < (short)0x8000)
// snd_out[i] = (short)0x8000;
// else
// snd_out[i] = val;
movl -8(%ebx,%ecx,4),%eax
sarl $8,%eax
cmpl $0x7FFF,%eax
jg LClampHigh
cmpl $0xFFFF8000,%eax
jnl LClampDone
movl $0xFFFF8000,%eax
jmp LClampDone
LClampHigh:
movl $0x7FFF,%eax
LClampDone:
// val = (snd_p[i+1]*snd_vol)>>8;
// if (val > 0x7fff)
// snd_out[i+1] = 0x7fff;
// else if (val < (short)0x8000)
// snd_out[i+1] = (short)0x8000;
// else
// snd_out[i+1] = val;
movl -4(%ebx,%ecx,4),%edx
sarl $8,%edx
cmpl $0x7FFF,%edx
jg LClampHigh2
cmpl $0xFFFF8000,%edx
jnl LClampDone2
movl $0xFFFF8000,%edx
jmp LClampDone2
LClampHigh2:
movl $0x7FFF,%edx
LClampDone2:
shll $16,%edx
andl $0xFFFF,%eax
orl %eax,%edx
movl %edx,-4(%edi,%ecx,2)
// }
subl $2,%ecx
jnz LWLBLoopTop
// snd_p += snd_linear_count;
popl %ebx
popl %edi
ret
#endif // id386

94
code/unix/sys_dosa.s Normal file
View File

@@ -0,0 +1,94 @@
//
// sys_dosa.s
// x86 assembly-language DOS-dependent routines.
#include "qasm.h"
.data
.align 4
fpenv:
.long 0, 0, 0, 0, 0, 0, 0, 0
.text
.globl C(MaskExceptions)
C(MaskExceptions):
fnstenv fpenv
orl $0x3F,fpenv
fldenv fpenv
ret
#if 0
.globl C(unmaskexceptions)
C(unmaskexceptions):
fnstenv fpenv
andl $0xFFFFFFE0,fpenv
fldenv fpenv
ret
#endif
.data
.align 4
.globl ceil_cw, single_cw, full_cw, cw, pushed_cw
ceil_cw: .long 0
single_cw: .long 0
full_cw: .long 0
cw: .long 0
pushed_cw: .long 0
.text
.globl C(Sys_LowFPPrecision)
C(Sys_LowFPPrecision):
fldcw single_cw
ret
.globl C(Sys_HighFPPrecision)
C(Sys_HighFPPrecision):
fldcw full_cw
ret
.globl C(Sys_PushFPCW_SetHigh)
C(Sys_PushFPCW_SetHigh):
fnstcw pushed_cw
fldcw full_cw
ret
.globl C(Sys_PopFPCW)
C(Sys_PopFPCW):
fldcw pushed_cw
ret
.globl C(Sys_SetFPCW)
C(Sys_SetFPCW):
fnstcw cw
movl cw,%eax
#if id386
andb $0xF0,%ah
orb $0x03,%ah // round mode, 64-bit precision
#endif
movl %eax,full_cw
#if id386
andb $0xF0,%ah
orb $0x0C,%ah // chop mode, single precision
#endif
movl %eax,single_cw
#if id386
andb $0xF0,%ah
orb $0x08,%ah // ceil mode, single precision
#endif
movl %eax,ceil_cw
ret

702
code/unix/ui_video.c Normal file
View File

@@ -0,0 +1,702 @@
#include "../client/client.h"
#include "../client/ui_local.h"
extern void UI_ForceMenuOff( void );
static const char *s_driver_names[] =
{
"[default OpenGL]",
"[Voodoo OpenGL]",
"[Custom ]",
0
};
static const char *s_drivers[] =
{
OPENGL_DRIVER_NAME,
_3DFX_DRIVER_NAME,
"",
0
};
/*
====================================================================
MENU INTERACTION
====================================================================
*/
static menuframework_s s_menu;
static menulist_s s_graphics_options_list;
static menulist_s s_mode_list;
static menulist_s s_driver_list;
static menuslider_s s_tq_slider;
static menulist_s s_fs_box;
static menulist_s s_lighting_box;
static menulist_s s_allow_extensions_box;
static menulist_s s_texturebits_box;
static menulist_s s_colordepth_list;
static menulist_s s_geometry_box;
static menulist_s s_filter_box;
static menuaction_s s_driverinfo_action;
static menuaction_s s_apply_action;
static menuaction_s s_defaults_action;
typedef struct
{
int mode;
qboolean fullscreen;
int tq;
int lighting;
int colordepth;
int texturebits;
int geometry;
int filter;
int driver;
qboolean extensions;
} InitialVideoOptions_s;
static InitialVideoOptions_s s_ivo;
static InitialVideoOptions_s s_ivo_templates[] =
{
{
4, qtrue, 2, 0, 2, 2, 1, 1, 0, qtrue // JDC: this was tq 3
},
{
3, qtrue, 2, 0, 0, 0, 1, 0, 0, qtrue
},
{
2, qtrue, 1, 0, 1, 0, 0, 0, 0, qtrue
},
{
1, qtrue, 1, 1, 1, 0, 0, 0, 0, qtrue
},
{
3, qtrue, 1, 0, 0, 0, 1, 0, 0, qtrue
}
};
#define NUM_IVO_TEMPLATES ( sizeof( s_ivo_templates ) / sizeof( s_ivo_templates[0] ) )
static void DrvInfo_MenuDraw( void );
static const char * DrvInfo_MenuKey( int key );
static void GetInitialVideoVars( void )
{
s_ivo.colordepth = s_colordepth_list.curvalue;
s_ivo.driver = s_driver_list.curvalue;
s_ivo.mode = s_mode_list.curvalue;
s_ivo.fullscreen = s_fs_box.curvalue;
s_ivo.extensions = s_allow_extensions_box.curvalue;
s_ivo.tq = s_tq_slider.curvalue;
s_ivo.lighting = s_lighting_box.curvalue;
s_ivo.geometry = s_geometry_box.curvalue;
s_ivo.filter = s_filter_box.curvalue;
s_ivo.texturebits = s_texturebits_box.curvalue;
}
static void CheckConfigVsTemplates( void )
{
int i;
for ( i = 0; i < NUM_IVO_TEMPLATES; i++ )
{
if ( s_driver_list.curvalue != 1 )
if ( s_ivo_templates[i].colordepth != s_colordepth_list.curvalue )
continue;
#if 0
if ( s_ivo_templates[i].driver != s_driver_list.curvalue )
continue;
#endif
if ( s_ivo_templates[i].mode != s_mode_list.curvalue )
continue;
if ( s_driver_list.curvalue != 1 )
if ( s_ivo_templates[i].fullscreen != s_fs_box.curvalue )
continue;
if ( s_ivo_templates[i].tq != s_tq_slider.curvalue )
continue;
if ( s_ivo_templates[i].lighting != s_lighting_box.curvalue )
continue;
if ( s_ivo_templates[i].geometry != s_geometry_box.curvalue )
continue;
if ( s_ivo_templates[i].filter != s_filter_box.curvalue )
continue;
// if ( s_ivo_templates[i].texturebits != s_texturebits_box.curvalue )
// continue;
s_graphics_options_list.curvalue = i;
return;
}
s_graphics_options_list.curvalue = 4;
}
static void UpdateMenuItemValues( void )
{
if ( s_driver_list.curvalue == 1 )
{
s_fs_box.curvalue = 1;
s_fs_box.generic.flags = QMF_GRAYED;
s_colordepth_list.curvalue = 1;
}
else
{
s_fs_box.generic.flags = 0;
}
if ( s_fs_box.curvalue == 0 || s_driver_list.curvalue == 1 )
{
s_colordepth_list.curvalue = 0;
s_colordepth_list.generic.flags = QMF_GRAYED;
}
else
{
s_colordepth_list.generic.flags = 0;
}
if ( s_allow_extensions_box.curvalue == 0 )
{
if ( s_texturebits_box.curvalue == 0 )
{
s_texturebits_box.curvalue = 1;
}
}
s_apply_action.generic.flags = QMF_GRAYED;
if ( s_ivo.mode != s_mode_list.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.fullscreen != s_fs_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.extensions != s_allow_extensions_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.tq != s_tq_slider.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.lighting != s_lighting_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.colordepth != s_colordepth_list.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.driver != s_driver_list.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.texturebits != s_texturebits_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.geometry != s_geometry_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
if ( s_ivo.filter != s_filter_box.curvalue )
{
s_apply_action.generic.flags = QMF_BLINK;
}
CheckConfigVsTemplates();
}
static void SetMenuItemValues( void )
{
s_mode_list.curvalue = Cvar_VariableValue( "r_mode" );
s_fs_box.curvalue = Cvar_VariableValue("r_fullscreen");
s_allow_extensions_box.curvalue = Cvar_VariableValue("r_allowExtensions");
s_tq_slider.curvalue = 3-Cvar_VariableValue( "r_picmip");
if ( s_tq_slider.curvalue < 0 )
{
s_tq_slider.curvalue = 0;
}
else if ( s_tq_slider.curvalue > 3 )
{
s_tq_slider.curvalue = 3;
}
s_lighting_box.curvalue = Cvar_VariableValue( "r_vertexLight" ) != 0;
switch ( ( int ) Cvar_VariableValue( "r_texturebits" ) )
{
case 0:
default:
s_texturebits_box.curvalue = 0;
break;
case 16:
s_texturebits_box.curvalue = 1;
break;
case 32:
s_texturebits_box.curvalue = 2;
break;
}
if ( !Q_stricmp( Cvar_VariableString( "r_textureMode" ), "GL_LINEAR_MIPMAP_NEAREST" ) )
{
s_filter_box.curvalue = 0;
}
else
{
s_filter_box.curvalue = 1;
}
if ( Cvar_VariableValue( "r_subdivisions" ) == 999 ||
Cvar_VariableValue( "r_lodBias" ) > 0 )
{
s_geometry_box.curvalue = 0;
}
else
{
s_geometry_box.curvalue = 1;
}
switch ( ( int ) Cvar_VariableValue( "r_colorbits" ) )
{
default:
case 0:
s_colordepth_list.curvalue = 0;
break;
case 16:
s_colordepth_list.curvalue = 1;
break;
case 32:
s_colordepth_list.curvalue = 2;
break;
}
if ( s_fs_box.curvalue == 0 )
{
s_colordepth_list.curvalue = 0;
}
if ( s_driver_list.curvalue == 1 )
{
s_colordepth_list.curvalue = 1;
}
}
static void FullscreenCallback( void *s )
{
}
static void ModeCallback( void *s )
{
// clamp 3dfx video modes
if ( s_driver_list.curvalue == 1 )
{
if ( s_mode_list.curvalue < 2 )
{
s_mode_list.curvalue = 2;
}
else if ( s_mode_list.curvalue > 6 )
{
s_mode_list.curvalue = 6;
}
}
}
static void GraphicsOptionsCallback( void *s )
{
InitialVideoOptions_s *ivo = &s_ivo_templates[s_graphics_options_list.curvalue];
s_mode_list.curvalue = ivo->mode;
s_tq_slider.curvalue = ivo->tq;
s_lighting_box.curvalue = ivo->lighting;
s_colordepth_list.curvalue = ivo->colordepth;
s_texturebits_box.curvalue = ivo->texturebits;
s_geometry_box.curvalue = ivo->geometry;
s_filter_box.curvalue = ivo->filter;
s_fs_box.curvalue = ivo->fullscreen;
}
static void TextureDetailCallback( void *s )
{
}
static void TextureQualityCallback( void *s )
{
}
static void ExtensionsCallback( void *s )
{
}
static void ColorDepthCallback( void *s )
{
}
static void DriverInfoCallback( void *s )
{
UI_PushMenu( DrvInfo_MenuDraw, DrvInfo_MenuKey );
}
static void LightingCallback( void * s )
{
}
static void ApplyChanges( void *unused )
{
switch ( s_texturebits_box.curvalue )
{
case 0:
Cvar_SetValue( "r_texturebits", 0 );
Cvar_SetValue( "r_ext_compress_textures", 1 );
break;
case 1:
Cvar_SetValue( "r_texturebits", 16 );
Cvar_SetValue( "r_ext_compress_textures", 0 );
break;
case 2:
Cvar_SetValue( "r_texturebits", 32 );
Cvar_SetValue( "r_ext_compress_textures", 0 );
break;
}
Cvar_SetValue( "r_picmip", 3 - s_tq_slider.curvalue );
Cvar_SetValue( "r_allowExtensions", s_allow_extensions_box.curvalue );
Cvar_SetValue( "r_mode", s_mode_list.curvalue );
Cvar_SetValue( "r_fullscreen", s_fs_box.curvalue );
if (*s_drivers[s_driver_list.curvalue] )
Cvar_Set( "r_glDriver", ( char * ) s_drivers[s_driver_list.curvalue] );
switch ( s_colordepth_list.curvalue )
{
case 0:
Cvar_SetValue( "r_colorbits", 0 );
Cvar_SetValue( "r_depthbits", 0 );
Cvar_SetValue( "r_stencilbits", 0 );
break;
case 1:
Cvar_SetValue( "r_colorbits", 16 );
Cvar_SetValue( "r_depthbits", 16 );
Cvar_SetValue( "r_stencilbits", 0 );
break;
case 2:
Cvar_SetValue( "r_colorbits", 32 );
Cvar_SetValue( "r_depthbits", 24 );
break;
}
Cvar_SetValue( "r_vertexLight", s_lighting_box.curvalue );
if ( s_geometry_box.curvalue )
{
Cvar_SetValue( "r_lodBias", 0 );
Cvar_SetValue( "r_subdivisions", 4 );
}
else
{
Cvar_SetValue( "r_lodBias", 1 );
Cvar_SetValue( "r_subdivisions", 999 );
}
if ( s_filter_box.curvalue )
{
Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR" );
}
else
{
Cvar_Set( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST" );
}
UI_ForceMenuOff();
CL_Vid_Restart_f();
VID_MenuInit();
// s_fs_box.curvalue = Cvar_VariableValue( "r_fullscreen" );
}
/*
** VID_MenuInit
*/
void VID_MenuInit( void )
{
static const char *tq_names[] =
{
"compressed",
"16-bit",
"32-bit",
0
};
static const char *s_graphics_options_names[] =
{
"high quality",
"normal",
"fast",
"fastest",
"custom",
0
};
static const char *lighting_names[] =
{
"lightmap",
"vertex",
0
};
static const char *colordepth_names[] =
{
"default",
"16-bit",
"32-bit",
0
};
static const char *resolutions[] =
{
"[320 240 ]",
"[400 300 ]",
"[512 384 ]",
"[640 480 ]",
"[800 600 ]",
"[960 720 ]",
"[1024 768 ]",
"[1152 864 ]",
"[1280 960 ]",
"[1600 1200]",
"[2048 1536]",
"[856 480 W]",
0
};
static const char *filter_names[] =
{
"bilinear",
"trilinear",
0
};
static const char *quality_names[] =
{
"low",
"high",
0
};
static const char *enabled_names[] =
{
"disabled",
"enabled",
0
};
int y = 0;
int i;
char *p;
s_menu.x = SCREEN_WIDTH * 0.50;
s_menu.nitems = 0;
s_menu.wrapAround = qtrue;
s_graphics_options_list.generic.type = MTYPE_SPINCONTROL;
s_graphics_options_list.generic.name = "graphics mode";
s_graphics_options_list.generic.x = 0;
s_graphics_options_list.generic.y = y;
s_graphics_options_list.generic.callback = GraphicsOptionsCallback;
s_graphics_options_list.itemnames = s_graphics_options_names;
s_driver_list.generic.type = MTYPE_SPINCONTROL;
s_driver_list.generic.name = "driver";
s_driver_list.generic.x = 0;
s_driver_list.generic.y = y += 18;
p = Cvar_VariableString( "r_glDriver" );
for (i = 0; s_drivers[i]; i++) {
if (strcmp(s_drivers[i], p) == 0)
break;
}
if (!s_drivers[i])
i--; // go back one, to default 'custom'
s_driver_list.curvalue = i;
s_driver_list.itemnames = s_driver_names;
// references/modifies "r_allowExtensions"
s_allow_extensions_box.generic.type = MTYPE_SPINCONTROL;
s_allow_extensions_box.generic.x = 0;
s_allow_extensions_box.generic.y = y += 18;
s_allow_extensions_box.generic.name = "OpenGL extensions";
s_allow_extensions_box.generic.callback = ExtensionsCallback;
s_allow_extensions_box.itemnames = enabled_names;
// references/modifies "r_mode"
s_mode_list.generic.type = MTYPE_SPINCONTROL;
s_mode_list.generic.name = "video mode";
s_mode_list.generic.x = 0;
s_mode_list.generic.y = y += 36;
s_mode_list.itemnames = resolutions;
s_mode_list.generic.callback = ModeCallback;
// references "r_colorbits"
s_colordepth_list.generic.type = MTYPE_SPINCONTROL;
s_colordepth_list.generic.name = "color depth";
s_colordepth_list.generic.x = 0;
s_colordepth_list.generic.y = y += 18;
s_colordepth_list.itemnames = colordepth_names;
s_colordepth_list.generic.callback = ColorDepthCallback;
// references/modifies "r_fullscreen"
s_fs_box.generic.type = MTYPE_RADIOBUTTON;
s_fs_box.generic.x = 0;
s_fs_box.generic.y = y += 18;
s_fs_box.generic.name = "fullscreen";
s_fs_box.generic.callback = FullscreenCallback;
// references/modifies "r_vertexLight"
s_lighting_box.generic.type = MTYPE_SPINCONTROL;
s_lighting_box.generic.x = 0;
s_lighting_box.generic.y = y += 18;
s_lighting_box.generic.name = "lighting";
s_lighting_box.itemnames = lighting_names;
s_lighting_box.generic.callback = LightingCallback;
// references/modifies "r_lodBias" & "subdivisions"
s_geometry_box.generic.type = MTYPE_SPINCONTROL;
s_geometry_box.generic.x = 0;
s_geometry_box.generic.y = y += 18;
s_geometry_box.generic.name = "geometric detail";
s_geometry_box.itemnames = quality_names;
// references/modifies "r_picmip"
s_tq_slider.generic.type = MTYPE_SLIDER;
s_tq_slider.generic.x = 0;
s_tq_slider.generic.y = y += 18;
s_tq_slider.generic.name = "texture detail";
s_tq_slider.generic.callback = TextureDetailCallback;
s_tq_slider.minvalue = 0;
s_tq_slider.maxvalue = 3;
// references/modifies "r_textureBits"
s_texturebits_box.generic.type = MTYPE_SPINCONTROL;
s_texturebits_box.generic.x = 0;
s_texturebits_box.generic.y = y += 18;
s_texturebits_box.generic.name = "texture quality";
s_texturebits_box.generic.callback = TextureQualityCallback;
s_texturebits_box.itemnames = tq_names;
// references/modifies "r_textureMode"
s_filter_box.generic.type = MTYPE_SPINCONTROL;
s_filter_box.generic.x = 0;
s_filter_box.generic.y = y += 18;
s_filter_box.generic.name = "texture filter";
s_filter_box.itemnames = filter_names;
s_driverinfo_action.generic.type = MTYPE_ACTION;
s_driverinfo_action.generic.name = "driver information";
s_driverinfo_action.generic.x = 0;
s_driverinfo_action.generic.y = y += 36;
s_driverinfo_action.generic.callback = DriverInfoCallback;
s_apply_action.generic.type = MTYPE_ACTION;
s_apply_action.generic.name = "apply";
s_apply_action.generic.x = 0;
s_apply_action.generic.y = y += 36;
s_apply_action.generic.callback = ApplyChanges;
s_apply_action.generic.flags = QMF_GRAYED;
SetMenuItemValues();
GetInitialVideoVars();
Menu_AddItem( &s_menu, ( void * ) &s_graphics_options_list );
Menu_AddItem( &s_menu, ( void * ) &s_driver_list );
Menu_AddItem( &s_menu, ( void * ) &s_allow_extensions_box );
Menu_AddItem( &s_menu, ( void * ) &s_mode_list );
Menu_AddItem( &s_menu, ( void * ) &s_colordepth_list );
Menu_AddItem( &s_menu, ( void * ) &s_fs_box );
Menu_AddItem( &s_menu, ( void * ) &s_lighting_box );
Menu_AddItem( &s_menu, ( void * ) &s_geometry_box );
Menu_AddItem( &s_menu, ( void * ) &s_tq_slider );
Menu_AddItem( &s_menu, ( void * ) &s_texturebits_box );
Menu_AddItem( &s_menu, ( void * ) &s_filter_box );
Menu_AddItem( &s_menu, ( void * ) &s_driverinfo_action );
Menu_AddItem( &s_menu, ( void * ) &s_apply_action );
Menu_Center( &s_menu );
s_menu.y -= 6;
}
/*
================
VID_MenuDraw
================
*/
void VID_MenuDraw (void)
{
UpdateMenuItemValues();
Menu_AdjustCursor( &s_menu, 1 );
Menu_Draw( &s_menu );
}
/*
================
VID_MenuKey
================
*/
const char *VID_MenuKey( int key )
{
menuframework_s *m = &s_menu;
static const char *sound = "sound/misc/menu1.wav";
if ( key == K_ENTER )
{
if ( !Menu_SelectItem( m ) )
ApplyChanges( NULL );
return NULL;
}
return Default_MenuKey( m, key );
}
static void DrvInfo_MenuDraw( void )
{
float labelColor[] = { 0, 1.0, 0, 1.0 };
float textColor[] = { 1, 1, 1, 1 };
int i = 14;
char extensionsString[1024], *eptr = extensionsString;
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 3, "VENDOR:", labelColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 4, Cvar_VariableString( "gl_vendor" ), textColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 5.5, "VERSION:", labelColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 6.5, Cvar_VariableString( "gl_version" ), textColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 8, "RENDERER:", labelColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 9, Cvar_VariableString( "gl_renderer" ), textColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 10.5, "PIXELFORMAT:", labelColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 11.5, Cvar_VariableString( "gl_pixelformat" ), textColor );
SCR_DrawBigStringColor( BIGCHAR_WIDTH * 4, BIGCHAR_HEIGHT * 13, "EXTENSIONS:", labelColor );
strcpy( extensionsString, Cvar_VariableString( "gl_extensions" ) );
while ( i < 25 && *eptr )
{
while ( *eptr )
{
char buf[2] = " ";
int j = BIGCHAR_WIDTH * 6;
while ( *eptr && *eptr != ' ' )
{
buf[0] = *eptr;
SCR_DrawBigStringColor( j, i * BIGCHAR_HEIGHT, buf, textColor );
j += BIGCHAR_WIDTH;
eptr++;
}
i++;
while ( *eptr && *eptr == ' ' )
eptr++;
}
}
}
static const char * DrvInfo_MenuKey( int key )
{
if ( key == K_ESCAPE )
UI_PopMenu();
return NULL;
}

17
code/unix/unix_glw.h Normal file
View File

@@ -0,0 +1,17 @@
#ifndef __linux__
#error You shouldnt be including this file on non-Linux platforms
#endif
#ifndef __GLW_LINUX_H__
#define __GLW_LINUX_H__
typedef struct
{
void *OpenGLLib; // instance of OpenGL library
FILE *log_fp;
} glwstate_t;
extern glwstate_t glw_state;
#endif

809
code/unix/unix_main.c Normal file
View File

@@ -0,0 +1,809 @@
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <string.h>
#include <ctype.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <errno.h>
#include <mntent.h>
#include <dlfcn.h>
#include "../game/q_shared.h"
#include "../qcommon/qcommon.h"
#include "../renderer/tr_public.h"
cvar_t *nostdout;
// Structure containing functions exported from refresh DLL
refexport_t re;
unsigned sys_frame_time;
uid_t saved_euid;
qboolean stdin_active = qtrue;
// =======================================================================
// General routines
// =======================================================================
void Sys_BeginProfiling( void ) {
}
/*
=================
Sys_In_Restart_f
Restart the input subsystem
=================
*/
void Sys_In_Restart_f( void )
{
IN_Shutdown();
IN_Init();
}
void Sys_ConsoleOutput (char *string)
{
if (nostdout && nostdout->value)
return;
fputs(string, stdout);
}
void Sys_Printf (char *fmt, ...)
{
va_list argptr;
char text[1024];
unsigned char *p;
va_start (argptr,fmt);
vsprintf (text,fmt,argptr);
va_end (argptr);
if (strlen(text) > sizeof(text))
Sys_Error("memory overwrite in Sys_Printf");
if (nostdout && nostdout->value)
return;
for (p = (unsigned char *)text; *p; p++) {
*p &= 0x7f;
if ((*p > 128 || *p < 32) && *p != 10 && *p != 13 && *p != 9)
printf("[%02x]", *p);
else
putc(*p, stdout);
}
}
void Sys_Quit (void)
{
CL_Shutdown ();
fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
_exit(0);
}
void Sys_Init(void)
{
Cmd_AddCommand ("in_restart", Sys_In_Restart_f);
#if id386
Sys_SetFPCW();
#endif
#if defined __linux__
#if defined __i386__
Cvar_Set( "arch", "linux i386" );
#elif defined __alpha__
Cvar_Set( "arch", "linux alpha" );
#elif defined __sparc__
Cvar_Set( "arch", "linux sparc" );
#else
Cvar_Set( "arch", "linux unknown" );
#endif
#elif defined __sun__
#if defined __i386__
Cvar_Set( "arch", "solaris x86" );
#elif defined __sparc__
Cvar_Set( "arch", "solaris sparc" );
#else
Cvar_Set( "arch", "solaris unknown" );
#endif
#elif defined __sgi__
#if defined __mips__
Cvar_Set( "arch", "sgi mips" );
#else
Cvar_Set( "arch", "sgi unknown" );
#endif
#else
Cvar_Set( "arch", "unknown" );
#endif
IN_Init();
}
void Sys_Error( const char *error, ...)
{
va_list argptr;
char string[1024];
// change stdin to non blocking
fcntl (0, F_SETFL, fcntl (0, F_GETFL, 0) & ~FNDELAY);
CL_Shutdown ();
va_start (argptr,error);
vsprintf (string,error,argptr);
va_end (argptr);
fprintf(stderr, "Error: %s\n", string);
_exit (1);
}
void Sys_Warn (char *warning, ...)
{
va_list argptr;
char string[1024];
va_start (argptr,warning);
vsprintf (string,warning,argptr);
va_end (argptr);
fprintf(stderr, "Warning: %s", string);
}
/*
============
Sys_FileTime
returns -1 if not present
============
*/
int Sys_FileTime (char *path)
{
struct stat buf;
if (stat (path,&buf) == -1)
return -1;
return buf.st_mtime;
}
void floating_point_exception_handler(int whatever)
{
// Sys_Warn("floating point exception\n");
signal(SIGFPE, floating_point_exception_handler);
}
char *Sys_ConsoleInput(void)
{
static char text[256];
int len;
fd_set fdset;
struct timeval timeout;
if (!com_dedicated || !com_dedicated->value)
return NULL;
if (!stdin_active)
return NULL;
FD_ZERO(&fdset);
FD_SET(0, &fdset); // stdin
timeout.tv_sec = 0;
timeout.tv_usec = 0;
if (select (1, &fdset, NULL, NULL, &timeout) == -1 || !FD_ISSET(0, &fdset))
return NULL;
len = read (0, text, sizeof(text));
if (len == 0) { // eof!
stdin_active = qfalse;
return NULL;
}
if (len < 1)
return NULL;
text[len-1] = 0; // rip off the /n and terminate
return text;
}
/*****************************************************************************/
static void *game_library;
#ifdef __i386__
const char *gamename = "qagamei386.so";
#elif defined __alpha__
const char *gamename = "qagameaxp.so";
#elif defined __mips__
const char *gamename = "qagamemips.so";
#else
#error Unknown arch
#endif
/*
=================
Sys_UnloadGame
=================
*/
void Sys_UnloadGame (void)
{
Com_Printf("------ Unloading %s ------\n", gamename);
if (game_library)
dlclose (game_library);
game_library = NULL;
}
/*
=================
Sys_GetGameAPI
Loads the game dll
=================
*/
void *Sys_GetGameAPI (void *parms)
{
void *(*GetGameAPI) (void *);
char name[MAX_OSPATH];
char curpath[MAX_OSPATH];
char *path;
if (game_library)
Com_Error (ERR_FATAL, "Sys_GetGameAPI without Sys_UnloadingGame");
// check the current debug directory first for development purposes
getcwd(curpath, sizeof(curpath));
Com_Printf("------- Loading %s -------\n", gamename);
Com_sprintf (name, sizeof(name), "%s/%s", curpath, gamename);
game_library = dlopen (name, RTLD_LAZY );
if (game_library)
Com_DPrintf ("LoadLibrary (%s)\n",name);
else {
Com_Printf( "LoadLibrary(\"%s\") failed\n", name);
Com_Printf( "...reason: '%s'\n", dlerror() );
Com_Error( ERR_FATAL, "Couldn't load game" );
}
GetGameAPI = (void *)dlsym (game_library, "GetGameAPI");
if (!GetGameAPI)
{
Sys_UnloadGame ();
return NULL;
}
return GetGameAPI (parms);
}
/*****************************************************************************/
static void *cgame_library;
/*
=================
Sys_UnloadGame
=================
*/
void Sys_UnloadCGame (void)
{
if (cgame_library)
dlclose (cgame_library);
cgame_library = NULL;
}
/*
=================
Sys_GetGameAPI
Loads the game dll
=================
*/
void *Sys_GetCGameAPI (void)
{
void *(*api) (void);
char name[MAX_OSPATH];
char curpath[MAX_OSPATH];
#ifdef __i386__
const char *cgamename = "cgamei386.so";
#elif defined __alpha__
const char *cgamename = "cgameaxp.so";
#elif defined __mips__
const char *cgamename = "cgamemips.so";
#else
#error Unknown arch
#endif
Sys_UnloadCGame();
getcwd(curpath, sizeof(curpath));
Com_Printf("------- Loading %s -------\n", cgamename);
sprintf (name, "%s/%s", curpath, cgamename);
cgame_library = dlopen (name, RTLD_LAZY );
if (!cgame_library)
{
Com_Printf ("LoadLibrary (%s)\n",name);
Com_Error( ERR_FATAL, "Couldn't load cgame: %s", dlerror() );
}
api = (void *)dlsym (cgame_library, "GetCGameAPI");
if (!api)
{
Com_Error( ERR_FATAL, "dlsym() failed on GetCGameAPI" );
}
return api();
}
/*****************************************************************************/
static void *ui_library;
/*
=================
Sys_UnloadUI
=================
*/
void Sys_UnloadUI(void)
{
if (ui_library)
dlclose (ui_library);
ui_library = NULL;
}
/*
=================
Sys_GetUIAPI
Loads the ui dll
=================
*/
void *Sys_GetUIAPI (void)
{
void *api;
char name[MAX_OSPATH];
char curpath[MAX_OSPATH];
#ifdef __i386__
const char *uiname = "uii386.so";
#elif defined __alpha__
const char *uiname = "uiaxp.so";
#elif defined __mips__
const char *uiname = "uimips.so";
#else
#error Unknown arch
#endif
Sys_UnloadUI();
getcwd(curpath, sizeof(curpath));
Com_Printf("------- Loading %s -------\n", uiname);
sprintf (name, "%s/%s", curpath, uiname);
ui_library = dlopen (name, RTLD_LAZY );
if (!ui_library)
{
Com_Printf ("LoadLibrary (%s)\n",name);
Com_Error( ERR_FATAL, "Couldn't load ui: %s", dlerror() );
}
api = (void *)dlsym (ui_library, "GetUIAPI");
if (!api)
{
Com_Error( ERR_FATAL, "dlsym() failed on GetUIAPI" );
}
return api;
}
/*****************************************************************************/
void *Sys_GetRefAPI (void *parms)
{
return (void *)GetRefAPI(REF_API_VERSION, parms);
}
/*
========================================================================
BACKGROUND FILE STREAMING
========================================================================
*/
typedef struct {
#if 0
HANDLE threadHandle;
int threadId;
CRITICAL_SECTION crit;
#endif
FILE *file;
byte *buffer;
qboolean eof;
int bufferSize;
int streamPosition; // next byte to be returned by Sys_StreamRead
int threadPosition; // next byte to be read from file
} streamState_t;
streamState_t stream;
/*
===============
Sys_StreamThread
A thread will be sitting in this loop forever
================
*/
void Sys_StreamThread( void )
{
int buffer;
int count;
int readCount;
int bufferPoint;
int r;
//Loop here
// EnterCriticalSection (&stream.crit);
// if there is any space left in the buffer, fill it up
if ( !stream.eof ) {
count = stream.bufferSize - (stream.threadPosition - stream.streamPosition);
if ( count ) {
bufferPoint = stream.threadPosition % stream.bufferSize;
buffer = stream.bufferSize - bufferPoint;
readCount = buffer < count ? buffer : count;
r = fread( stream.buffer + bufferPoint, 1, readCount, stream.file );
stream.threadPosition += r;
if ( r != readCount )
stream.eof = qtrue;
}
}
// LeaveCriticalSection (&stream.crit);
}
/*
===============
Sys_InitStreamThread
================
*/
void Sys_InitStreamThread( void )
{
}
/*
===============
Sys_ShutdownStreamThread
================
*/
void Sys_ShutdownStreamThread( void )
{
}
/*
===============
Sys_BeginStreamedFile
================
*/
void Sys_BeginStreamedFile( fileHandle_t f, int readAhead )
{
if ( stream.file ) {
Com_Error( ERR_FATAL, "Sys_BeginStreamedFile: unclosed stream");
}
stream.file = f;
stream.buffer = Z_Malloc( readAhead );
stream.bufferSize = readAhead;
stream.streamPosition = 0;
stream.threadPosition = 0;
stream.eof = qfalse;
// let the thread start running
// LeaveCriticalSection( &stream.crit );
}
/*
===============
Sys_EndStreamedFile
================
*/
void Sys_EndStreamedFile( FILE *f )
{
if ( f != stream.file ) {
Com_Error( ERR_FATAL, "Sys_EndStreamedFile: wrong file");
}
// don't leave critical section until another stream is started
// EnterCriticalSection( &stream.crit );
stream.file = NULL;
Z_Free( stream.buffer );
}
/*
===============
Sys_StreamedRead
================
*/
int Sys_StreamedRead( void *buffer, int size, int count, FILE *f )
{
int available;
int remaining;
int sleepCount;
int copy;
int bufferCount;
int bufferPoint;
byte *dest;
dest = (byte *)buffer;
remaining = size * count;
if ( remaining <= 0 ) {
Com_Error( ERR_FATAL, "Streamed read with non-positive size" );
}
sleepCount = 0;
while ( remaining > 0 ) {
available = stream.threadPosition - stream.streamPosition;
if ( !available ) {
if (stream.eof)
break;
Sys_StreamThread();
continue;
}
bufferPoint = stream.streamPosition % stream.bufferSize;
bufferCount = stream.bufferSize - bufferPoint;
copy = available < bufferCount ? available : bufferCount;
if ( copy > remaining ) {
copy = remaining;
}
memcpy( dest, stream.buffer + bufferPoint, copy );
stream.streamPosition += copy;
dest += copy;
remaining -= copy;
}
return (count * size - remaining) / size;
}
/*
===============
Sys_StreamSeek
================
*/
void Sys_StreamSeek( FILE *f, int offset, int origin ) {
// halt the thread
// EnterCriticalSection( &stream.crit );
// clear to that point
fseek( f, offset, origin );
stream.streamPosition = 0;
stream.threadPosition = 0;
stream.eof = qfalse;
// let the thread start running at the new position
// LeaveCriticalSection( &stream.crit );
}
/*
========================================================================
EVENT LOOP
========================================================================
*/
#define MAX_QUED_EVENTS 64
#define MASK_QUED_EVENTS ( MAX_QUED_EVENTS - 1 )
sysEvent_t eventQue[MAX_QUED_EVENTS];
int eventHead, eventTail;
byte sys_packetReceived[MAX_MSGLEN];
/*
================
Sys_QueEvent
A time of 0 will get the current time
Ptr should either be null, or point to a block of data that can
be freed by the game later.
================
*/
void Sys_QueEvent( int time, sysEventType_t type, int value, int value2, int ptrLength, void *ptr ) {
sysEvent_t *ev;
ev = &eventQue[ eventHead & MASK_QUED_EVENTS ];
eventHead++;
if ( time == 0 ) {
time = Sys_Milliseconds();
}
ev->evTime = time;
ev->evType = type;
ev->evValue = value;
ev->evValue2 = value2;
ev->evPtrLength = ptrLength;
ev->evPtr = ptr;
}
/*
================
Sys_GetEvent
================
*/
sysEvent_t Sys_GetEvent( void ) {
sysEvent_t ev;
char *s;
msg_t netmsg;
netadr_t adr;
// return if we have data
if ( eventHead > eventTail ) {
eventTail++;
return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ];
}
// pump the message loop
// in vga this calls KBD_Update, under X, it calls GetEvent
Sys_SendKeyEvents ();
// check for console commands
s = Sys_ConsoleInput();
if ( s ) {
char *b;
int len;
len = strlen( s ) + 1;
b = malloc( len );
strcpy( b, s );
Sys_QueEvent( 0, SE_CONSOLE, 0, 0, len, b );
}
// check for other input devices
IN_Frame();
// check for network packets
MSG_Init( &netmsg, sys_packetReceived, sizeof( sys_packetReceived ) );
if ( Sys_GetPacket ( &adr, &netmsg ) ) {
netadr_t *buf;
int len;
// copy out to a seperate buffer for qeueing
len = sizeof( netadr_t ) + netmsg.cursize;
buf = malloc( len );
*buf = adr;
memcpy( buf+1, netmsg.data, netmsg.cursize );
Sys_QueEvent( 0, SE_PACKET, 0, 0, len, buf );
}
// return if we have data
if ( eventHead > eventTail ) {
eventTail++;
return eventQue[ ( eventTail - 1 ) & MASK_QUED_EVENTS ];
}
// create an empty event to return
memset( &ev, 0, sizeof( ev ) );
ev.evTime = Sys_Milliseconds();
return ev;
}
/*****************************************************************************/
void Sys_AppActivate (void)
{
}
char *Sys_GetClipboardData(void)
{
return NULL;
}
void Sys_Print( const char *msg )
{
fputs(msg, stderr);
}
int main (int argc, char **argv)
{
int oldtime, newtime;
int len, i;
char *cmdline;
void SetProgramPath(char *path);
// go back to real user for config loads
saved_euid = geteuid();
seteuid(getuid());
SetProgramPath(argv[0]);
// merge the command line, this is kinda silly
for (len = 1, i = 1; i < argc; i++)
len += strlen(argv[i]) + 1;
cmdline = malloc(len);
*cmdline = 0;
for (i = 1; i < argc; i++) {
if (i > 1)
strcat(cmdline, " ");
strcat(cmdline, argv[i]);
}
Com_Init(cmdline);
NET_Init();
fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY);
nostdout = Cvar_Get("nostdout", "0", 0);
if (!nostdout->value) {
fcntl(0, F_SETFL, fcntl (0, F_GETFL, 0) | FNDELAY);
// printf ("Linux Quake -- Version %0.3f\n", LINUX_VERSION);
}
while (1)
{
// set low precision every frame, because some system calls
// reset it arbitrarily
Sys_LowFPPrecision ();
Com_Frame ();
}
}
#if 0
/*
================
Sys_MakeCodeWriteable
================
*/
void Sys_MakeCodeWriteable (unsigned long startaddr, unsigned long length)
{
int r;
unsigned long addr;
int psize = getpagesize();
addr = (startaddr & ~(psize-1)) - psize;
// fprintf(stderr, "writable code %lx(%lx)-%lx, length=%lx\n", startaddr,
// addr, startaddr+length, length);
r = mprotect((char*)addr, length + startaddr - addr + psize, 7);
if (r < 0)
Sys_Error("Protection change failed\n");
}
#endif

443
code/unix/unix_net.c Normal file
View File

@@ -0,0 +1,443 @@
// unix_net.c
#include "../game/q_shared.h"
#include "../qcommon/qcommon.h"
#include <unistd.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
#include <errno.h>
#ifdef NeXT
#include <libc.h>
#endif
static cvar_t *noudp;
netadr_t net_local_adr;
int ip_socket;
int ipx_socket;
#define MAX_IPS 16
static int numIP;
static byte localIP[MAX_IPS][4];
int NET_Socket (char *net_interface, int port);
char *NET_ErrorString (void);
//=============================================================================
void NetadrToSockadr (netadr_t *a, struct sockaddr_in *s)
{
memset (s, 0, sizeof(*s));
if (a->type == NA_BROADCAST)
{
s->sin_family = AF_INET;
s->sin_port = a->port;
*(int *)&s->sin_addr = -1;
}
else if (a->type == NA_IP)
{
s->sin_family = AF_INET;
*(int *)&s->sin_addr = *(int *)&a->ip;
s->sin_port = a->port;
}
}
void SockadrToNetadr (struct sockaddr_in *s, netadr_t *a)
{
*(int *)&a->ip = *(int *)&s->sin_addr;
a->port = s->sin_port;
a->type = NA_IP;
}
char *NET_BaseAdrToString (netadr_t a)
{
static char s[64];
Com_sprintf (s, sizeof(s), "%i.%i.%i.%i", a.ip[0], a.ip[1], a.ip[2], a.ip[3]);
return s;
}
/*
=============
Sys_StringToAdr
idnewt
192.246.40.70
=============
*/
qboolean Sys_StringToSockaddr (const char *s, struct sockaddr *sadr)
{
struct hostent *h;
char *colon;
memset (sadr, 0, sizeof(*sadr));
((struct sockaddr_in *)sadr)->sin_family = AF_INET;
((struct sockaddr_in *)sadr)->sin_port = 0;
if ( s[0] >= '0' && s[0] <= '9')
{
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = inet_addr(s);
}
else
{
if (! (h = gethostbyname(s)) )
return qfalse;
*(int *)&((struct sockaddr_in *)sadr)->sin_addr = *(int *)h->h_addr_list[0];
}
return qtrue;
}
/*
=============
Sys_StringToAdr
localhost
idnewt
idnewt:28000
192.246.40.70
192.246.40.70:28000
=============
*/
qboolean Sys_StringToAdr (const char *s, netadr_t *a)
{
struct sockaddr_in sadr;
if (!Sys_StringToSockaddr (s, (struct sockaddr *)&sadr))
return qfalse;
SockadrToNetadr (&sadr, a);
return qtrue;
}
//=============================================================================
qboolean Sys_GetPacket (netadr_t *net_from, msg_t *net_message)
{
int ret;
struct sockaddr_in from;
int fromlen;
int net_socket;
int protocol;
int err;
for (protocol = 0 ; protocol < 2 ; protocol++)
{
if (protocol == 0)
net_socket = ip_socket;
else
net_socket = ipx_socket;
if (!net_socket)
continue;
fromlen = sizeof(from);
ret = recvfrom (net_socket, net_message->data, net_message->maxsize
, 0, (struct sockaddr *)&from, &fromlen);
SockadrToNetadr (&from, net_from);
if (ret == -1)
{
err = errno;
if (err == EWOULDBLOCK || err == ECONNREFUSED)
continue;
Com_Printf ("NET_GetPacket: %s from %s\n", NET_ErrorString(),
NET_AdrToString(*net_from));
continue;
}
if (ret == net_message->maxsize)
{
Com_Printf ("Oversize packet from %s\n", NET_AdrToString (*net_from));
continue;
}
net_message->cursize = ret;
return qtrue;
}
return qfalse;
}
//=============================================================================
void Sys_SendPacket( int length, const void *data, netadr_t to )
{
int ret;
struct sockaddr_in addr;
int net_socket;
if (to.type == NA_BROADCAST)
{
net_socket = ip_socket;
}
else if (to.type == NA_IP)
{
net_socket = ip_socket;
}
else if (to.type == NA_IPX)
{
net_socket = ipx_socket;
}
else if (to.type == NA_BROADCAST_IPX)
{
net_socket = ipx_socket;
}
else {
Com_Error (ERR_FATAL, "NET_SendPacket: bad address type");
return;
}
if (!net_socket)
return;
NetadrToSockadr (&to, &addr);
ret = sendto (net_socket, data, length, 0, (struct sockaddr *)&addr, sizeof(addr) );
if (ret == -1)
{
Com_Printf ("NET_SendPacket ERROR: %s to %s\n", NET_ErrorString(),
NET_AdrToString (to));
}
}
//=============================================================================
/*
==================
Sys_IsLANAddress
LAN clients will have their rate var ignored
==================
*/
qboolean Sys_IsLANAddress (netadr_t adr) {
int i;
if ( adr.type == NA_LOOPBACK ) {
return qtrue;
}
// FIXME: ipx?
if ( adr.type == NA_IP ) {
for ( i = 0 ; i < numIP ; i++ ) {
// assuming a class C network, which may not be smart...
if ( adr.ip[0] == localIP[i][0]
&& adr.ip[1] == localIP[i][1]
&& adr.ip[2] == localIP[i][2] ) {
return qtrue;
}
}
}
return qfalse;
}
/*
=====================
NET_GetLocalAddress
=====================
*/
void NET_GetLocalAddress( void ) {
char hostname[256];
struct hostent *hostInfo;
int error;
char *p;
int ip;
int n;
if ( gethostname( hostname, 256 ) == -1 ) {
return;
}
hostInfo = gethostbyname( hostname );
if ( !hostInfo ) {
return;
}
Com_Printf( "Hostname: %s\n", hostInfo->h_name );
n = 0;
while( ( p = hostInfo->h_aliases[n++] ) != NULL ) {
Com_Printf( "Alias: %s\n", p );
}
if ( hostInfo->h_addrtype != AF_INET ) {
return;
}
numIP = 0;
while( ( p = hostInfo->h_addr_list[numIP++] ) != NULL && numIP < MAX_IPS ) {
ip = ntohl( *(int *)p );
localIP[ numIP ][0] = p[0];
localIP[ numIP ][1] = p[1];
localIP[ numIP ][2] = p[2];
localIP[ numIP ][3] = p[3];
Com_Printf( "IP: %i.%i.%i.%i\n", ( ip >> 24 ) & 0xff, ( ip >> 16 ) & 0xff, ( ip >> 8 ) & 0xff, ip & 0xff );
}
}
/*
====================
NET_OpenIP
====================
*/
void NET_OpenIP (void)
{
cvar_t *ip;
int port;
int i;
ip = Cvar_Get ("net_ip", "localhost", 0);
port = Cvar_Get("net_port", va("%i", PORT_SERVER), 0)->value;
for ( i = 0 ; i < 10 ; i++ ) {
ip_socket = NET_IPSocket (ip->string, port + i);
if ( ip_socket ) {
Cvar_SetValue( "net_port", port + i );
NET_GetLocalAddress();
return;
}
}
Com_Error (ERR_FATAL, "Couldn't allocate IP port");
}
/*
====================
NET_Init
====================
*/
void NET_Init (void)
{
noudp = Cvar_Get ("net_noudp", "0", 0);
// open sockets
if (! noudp->value) {
NET_OpenIP ();
}
}
/*
====================
NET_Socket
====================
*/
int NET_IPSocket (char *net_interface, int port)
{
int newsocket;
struct sockaddr_in address;
qboolean _qtrue = qtrue;
int i = 1;
if ( net_interface ) {
Com_Printf("Opening IP socket: %s:%i\n", net_interface, port );
} else {
Com_Printf("Opening IP socket: localhost:%i\n", port );
}
if ((newsocket = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
Com_Printf ("ERROR: UDP_OpenSocket: socket: %s", NET_ErrorString());
return 0;
}
// make it non-blocking
if (ioctl (newsocket, FIONBIO, &_qtrue) == -1)
{
Com_Printf ("ERROR: UDP_OpenSocket: ioctl FIONBIO:%s\n", NET_ErrorString());
return 0;
}
// make it broadcast capable
if (setsockopt(newsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i)) == -1)
{
Com_Printf ("ERROR: UDP_OpenSocket: setsockopt SO_BROADCAST:%s\n", NET_ErrorString());
return 0;
}
if (!net_interface || !net_interface[0] || !stricmp(net_interface, "localhost"))
address.sin_addr.s_addr = INADDR_ANY;
else
Sys_StringToSockaddr (net_interface, (struct sockaddr *)&address);
if (port == PORT_ANY)
address.sin_port = 0;
else
address.sin_port = htons((short)port);
address.sin_family = AF_INET;
if( bind (newsocket, (void *)&address, sizeof(address)) == -1)
{
Com_Printf ("ERROR: UDP_OpenSocket: bind: %s\n", NET_ErrorString());
close (newsocket);
return 0;
}
return newsocket;
}
/*
====================
NET_Shutdown
====================
*/
void NET_Shutdown (void)
{
if (ip_socket) {
close(ip_socket);
ip_socket = 0;
}
}
/*
====================
NET_ErrorString
====================
*/
char *NET_ErrorString (void)
{
int code;
code = errno;
return strerror (code);
}
// sleeps msec or until net socket is ready
void NET_Sleep(int msec)
{
struct timeval timeout;
fd_set fdset;
extern qboolean stdin_active;
if (!ip_socket || !com_dedicated->integer)
return; // we're not a server, just run full speed
FD_ZERO(&fdset);
if (stdin_active)
FD_SET(0, &fdset); // stdin is processed too
FD_SET(ip_socket, &fdset); // network socket
timeout.tv_sec = msec/1000;
timeout.tv_usec = (msec%1000)*1000;
select(ip_socket+1, &fdset, NULL, NULL, &timeout);
}

369
code/unix/unix_shared.c Normal file
View File

@@ -0,0 +1,369 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdio.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/time.h>
#include "../game/q_shared.h"
#include "../qcommon/qcommon.h"
//===============================================================================
// Used to determine CD Path
static char programpath[MAX_OSPATH];
/*
================
Sys_Milliseconds
================
*/
int curtime;
int sys_timeBase;
int Sys_Milliseconds (void)
{
struct timeval tp;
struct timezone tzp;
gettimeofday(&tp, &tzp);
if (!sys_timeBase)
{
sys_timeBase = tp.tv_sec;
return tp.tv_usec/1000;
}
curtime = (tp.tv_sec - sys_timeBase)*1000 + tp.tv_usec/1000;
return curtime;
}
void Sys_Mkdir( const char *path )
{
mkdir (path, 0777);
}
char *strlwr (char *s)
{
while (*s) {
*s = tolower(*s);
s++;
}
}
//============================================
/* Like glob_match, but match PATTERN against any final segment of TEXT. */
static int glob_match_after_star(char *pattern, char *text)
{
register char *p = pattern, *t = text;
register char c, c1;
while ((c = *p++) == '?' || c == '*')
if (c == '?' && *t++ == '\0')
return 0;
if (c == '\0')
return 1;
if (c == '\\')
c1 = *p;
else
c1 = c;
while (1) {
if ((c == '[' || *t == c1) && glob_match(p - 1, t))
return 1;
if (*t++ == '\0')
return 0;
}
}
/* Return nonzero if PATTERN has any special globbing chars in it. */
static int glob_pattern_p(char *pattern)
{
register char *p = pattern;
register char c;
int open = 0;
while ((c = *p++) != '\0')
switch (c) {
case '?':
case '*':
return 1;
case '[': /* Only accept an open brace if there is a close */
open++; /* brace to match it. Bracket expressions must be */
continue; /* complete, according to Posix.2 */
case ']':
if (open)
return 1;
continue;
case '\\':
if (*p++ == '\0')
return 0;
}
return 0;
}
/* Match the pattern PATTERN against the string TEXT;
return 1 if it matches, 0 otherwise.
A match means the entire string TEXT is used up in matching.
In the pattern string, `*' matches any sequence of characters,
`?' matches any character, [SET] matches any character in the specified set,
[!SET] matches any character not in the specified set.
A set is composed of characters or ranges; a range looks like
character hyphen character (as in 0-9 or A-Z).
[0-9a-zA-Z_] is the set of characters allowed in C identifiers.
Any other character in the pattern must be matched exactly.
To suppress the special syntactic significance of any of `[]*?!-\',
and match the character exactly, precede it with a `\'.
*/
int glob_match(char *pattern, char *text)
{
register char *p = pattern, *t = text;
register char c;
while ((c = *p++) != '\0')
switch (c) {
case '?':
if (*t == '\0')
return 0;
else
++t;
break;
case '\\':
if (*p++ != *t++)
return 0;
break;
case '*':
return glob_match_after_star(p, t);
case '[':
{
register char c1 = *t++;
int invert;
if (!c1)
return (0);
invert = ((*p == '!') || (*p == '^'));
if (invert)
p++;
c = *p++;
while (1) {
register char cstart = c, cend = c;
if (c == '\\') {
cstart = *p++;
cend = cstart;
}
if (c == '\0')
return 0;
c = *p++;
if (c == '-' && *p != ']') {
cend = *p++;
if (cend == '\\')
cend = *p++;
if (cend == '\0')
return 0;
c = *p++;
}
if (c1 >= cstart && c1 <= cend)
goto match;
if (c == ']')
break;
}
if (!invert)
return 0;
break;
match:
/* Skip the rest of the [...] construct that already matched. */
while (c != ']') {
if (c == '\0')
return 0;
c = *p++;
if (c == '\0')
return 0;
else if (c == '\\')
++p;
}
if (invert)
return 0;
break;
}
default:
if (c != *t++)
return 0;
}
return *t == '\0';
}
//============================================
#define MAX_FOUND_FILES 0x1000
char **Sys_ListFiles( const char *directory, const char *extension, int *numfiles, qboolean wantsubs )
{
struct dirent *d;
char *p;
DIR *fdir;
qboolean dironly = wantsubs;
char search[MAX_OSPATH];
int nfiles;
char **listCopy;
char *list[MAX_FOUND_FILES];
int flag;
int i;
struct stat st;
int extLen;
if ( !extension)
extension = "";
if ( extension[0] == '/' && extension[1] == 0 ) {
extension = "";
dironly = qtrue;
}
extLen = strlen( extension );
// search
nfiles = 0;
if ((fdir = opendir(directory)) == NULL) {
*numfiles = 0;
return NULL;
}
while ((d = readdir(fdir)) != NULL) {
Com_sprintf(search, sizeof(search), "%s/%s", directory, d->d_name);
if (stat(search, &st) == -1)
continue;
if ((dironly && !(st.st_mode & S_IFDIR)) ||
(!dironly && (st.st_mode & S_IFDIR)))
continue;
if (*extension) {
if ( strlen( d->d_name ) < strlen( extension ) ||
Q_stricmp(
d->d_name + strlen( d->d_name ) - strlen( extension ),
extension ) ) {
continue; // didn't match
}
}
if ( nfiles == MAX_FOUND_FILES - 1 )
break;
list[ nfiles ] = CopyString( d->d_name );
nfiles++;
}
list[ nfiles ] = 0;
closedir(fdir);
// return a copy of the list
*numfiles = nfiles;
if ( !nfiles ) {
return NULL;
}
listCopy = Z_Malloc( ( nfiles + 1 ) * sizeof( *listCopy ) );
for ( i = 0 ; i < nfiles ; i++ ) {
listCopy[i] = list[i];
}
listCopy[i] = NULL;
return listCopy;
}
void Sys_FreeFileList( char **list ) {
int i;
if ( !list ) {
return;
}
for ( i = 0 ; list[i] ; i++ ) {
Z_Free( list[i] );
}
Z_Free( list );
}
char *Sys_Cwd( void )
{
static char cwd[MAX_OSPATH];
getcwd( cwd, sizeof( cwd ) - 1 );
cwd[MAX_OSPATH-1] = 0;
return cwd;
}
void SetProgramPath(char *path)
{
char *p;
Q_strncpyz(programpath, path, sizeof(programpath));
if ((p = strrchr(programpath, '/')) != NULL)
*p = 0; // remove program name, leave only path
}
char *Sys_DefaultCDPath(void)
{
if (*programpath)
return programpath;
else
return Sys_Cwd();
}
char *Sys_DefaultBasePath(void)
{
char *p;
static char basepath[MAX_OSPATH];
int e;
if ((p = getenv("HOME")) != NULL) {
Q_strncpyz(basepath, p, sizeof(basepath));
Q_strcat(basepath, sizeof(basepath), "/.q3a");
if (mkdir(basepath, 0777)) {
if (errno != EEXIST)
Sys_Error("Unable to create directory \"%s\", error is %s(%d)\n", basepath, strerror(errno), errno);
}
return basepath;
}
return ""; // assume current dir
}
//============================================
int Sys_GetProcessorId( void )
{
return CPUID_GENERIC;
}
void Sys_ShowConsole( int visLevel, qboolean quitOnClose )
{
}