Initial commit.
This commit is contained in:
988
code/unix/Makefile
Normal file
988
code/unix/Makefile
Normal 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
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
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
244
code/unix/linux_snd.c
Normal 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
402
code/unix/matha.s
Normal 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
41
code/unix/q3test.spec.sh
Normal 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
459
code/unix/qasm.h
Normal 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
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
197
code/unix/snd_mixa.s
Normal 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
94
code/unix/sys_dosa.s
Normal 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
702
code/unix/ui_video.c
Normal 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
17
code/unix/unix_glw.h
Normal 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
809
code/unix/unix_main.c
Normal 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
443
code/unix/unix_net.c
Normal 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
369
code/unix/unix_shared.c
Normal 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 )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user