The OpenArena SVN source tree is a bit of a mess. I found that it contains files from different SVN versions so a diff is ugly. I cleaned it up. I build a local OpenArena engine against the latest ioquake3 source code so I get bug fixes and new features. This includes the patches from Debian. [code] diff --git a/Makefile b/Makefile index b3d08c7..75999c8 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ # GNU Make required # -COMPILE_PLATFORM=$(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]') +# Support kFreeBSD +COMPILE_PLATFORM=$(shell uname|sed -e s/_.*//|tr '[:upper:]' '[:lower:]'|sed -e 's/\//_/g') COMPILE_ARCH=$(shell uname -m | sed -e s/i.86/i386/) @@ -23,9 +24,6 @@ ifeq ($(COMPILE_PLATFORM),mingw32) endif endif -ifndef BUILD_STANDALONE - BUILD_STANDALONE = -endif ifndef BUILD_CLIENT BUILD_CLIENT = endif @@ -59,6 +57,26 @@ endif ############################################################################# -include Makefile.local +############################################################################# +# Standalone options +############################################################################# + +# Standalone must define all of these. +ifndef BUILD_STANDALONE + BUILD_STANDALONE = + USE_BLOOM =0 + GAME_DEDICATED_NAME=ioq3ded + GAME_CLIENT_NAME=ioquake3 + GAME_DIRECTORY_NAME=baseq3 +endif + +ifdef USE_BLOOM + CFLAGS += -DENABLE_BLOOM +else + USE_BLOOM = + CFLAGS += -UENABLE_BLOOM +endif + ifndef PLATFORM PLATFORM=$(COMPILE_PLATFORM) endif @@ -143,6 +161,10 @@ ifndef USE_INTERNAL_SPEEX USE_INTERNAL_SPEEX=1 endif +ifndef USE_INTERNAL_JPEG +USE_INTERNAL_JPEG=1 +endif + ifndef USE_LOCAL_HEADERS USE_LOCAL_HEADERS=1 endif @@ -219,10 +241,10 @@ LIB=lib INSTALL=install MKDIR=mkdir -ifeq ($(PLATFORM),linux) - +# Support kFreeBSD +ifneq (,findstring($(PLATFORM),linux gnu_kfreebsd)) ifeq ($(ARCH),alpha) - ARCH=axp + ARCH=alpha else ifeq ($(ARCH),x86_64) LIB=lib64 @@ -285,6 +307,9 @@ ifeq ($(PLATFORM),linux) OPTIMIZE += -mtune=ultrasparc3 -mv8plus HAVE_VM_COMPILED=true endif + ifeq ($(ARCH),alpha) + OPTIMIZE = -O3 -funroll-loops -fomit-frame-pointer + endif endif endif @@ -522,7 +547,7 @@ else # ifeq mingw32 ifeq ($(PLATFORM),freebsd) ifneq (,$(findstring alpha,$(shell uname -m))) - ARCH=axp + ARCH=alpha else #default to i386 ARCH=i386 endif #alpha test @@ -542,7 +567,7 @@ ifeq ($(PLATFORM),freebsd) BASE_CFLAGS += -DUSE_CODEC_VORBIS endif - ifeq ($(ARCH),axp) + ifeq ($(ARCH),alpha) BASE_CFLAGS += -DNO_VM_COMPILED RELEASE_CFLAGS=$(BASE_CFLAGS) -DNDEBUG -O3 -ffast-math -funroll-loops \ -fomit-frame-pointer -fexpensive-optimizations @@ -786,21 +811,21 @@ endif #SunOS TARGETS = ifneq ($(BUILD_SERVER),0) - TARGETS += $(B)/ioq3ded.$(ARCH)$(BINEXT) + TARGETS += $(B)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT) endif ifneq ($(BUILD_CLIENT),0) - TARGETS += $(B)/ioquake3.$(ARCH)$(BINEXT) + TARGETS += $(B)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT) ifneq ($(BUILD_CLIENT_SMP),0) - TARGETS += $(B)/ioquake3-smp.$(ARCH)$(BINEXT) + TARGETS += $(B)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT) endif endif ifneq ($(BUILD_GAME_SO),0) TARGETS += \ - $(B)/baseq3/cgame$(ARCH).$(SHLIBEXT) \ - $(B)/baseq3/qagame$(ARCH).$(SHLIBEXT) \ - $(B)/baseq3/ui$(ARCH).$(SHLIBEXT) + $(B)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT) \ + $(B)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT) \ + $(B)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT) ifneq ($(BUILD_MISSIONPACK),0) TARGETS += \ $(B)/missionpack/cgame$(ARCH).$(SHLIBEXT) \ @@ -812,9 +837,9 @@ endif ifneq ($(BUILD_GAME_QVM),0) ifneq ($(CROSS_COMPILING),1) TARGETS += \ - $(B)/baseq3/vm/cgame.qvm \ - $(B)/baseq3/vm/qagame.qvm \ - $(B)/baseq3/vm/ui.qvm + $(B)/$(GAME_DIRECTORY_NAME)/vm/cgame.qvm \ + $(B)/$(GAME_DIRECTORY_NAME)/vm/qagame.qvm \ + $(B)/$(GAME_DIRECTORY_NAME)/vm/ui.qvm ifneq ($(BUILD_MISSIONPACK),0) TARGETS += \ $(B)/missionpack/vm/qagame.qvm \ @@ -831,12 +856,20 @@ endif ifeq ($(USE_VOIP),1) BASE_CFLAGS += -DUSE_VOIP ifeq ($(USE_INTERNAL_SPEEX),1) - BASE_CFLAGS += -DFLOATING_POINT -DUSE_ALLOCA -I$(SPEEXDIR)/include + BASE_CFLAGS += -DFLOATING_POINT -DUSE_ALLOCA -DUSE_INTERNAL_SPEEX -I$(SPEEXDIR)/include else - CLIENT_LIBS += -lspeex + BASE_CFLAGS += -UUSE_INTERNAL_SPEEX + CLIENT_LIBS += -lspeex -lspeexdsp endif endif +ifeq ($(USE_INTERNAL_JPEG),1) + BASE_CFLAGS += -DUSE_INTERNAL_JPEG +else + BASE_CFLAGS += -UUSE_INTERNAL_JPEG + CLIENT_LIBS += -ljpeg +endif + ifdef DEFAULT_BASEDIR BASE_CFLAGS += -DDEFAULT_BASEDIR=\\\"$(DEFAULT_BASEDIR)\\\" endif @@ -967,7 +1000,7 @@ release: # an informational message, then start building targets: makedirs @echo "" - @echo "Building ioquake3 in $(B):" + @echo "Building $(GAME_CLIENT_NAME) in $(B):" @echo " PLATFORM: $(PLATFORM)" @echo " ARCH: $(ARCH)" @echo " VERSION: $(VERSION)" @@ -1009,12 +1042,12 @@ makedirs: @if [ ! -d $(B)/client ];then $(MKDIR) $(B)/client;fi @if [ ! -d $(B)/clientsmp ];then $(MKDIR) $(B)/clientsmp;fi @if [ ! -d $(B)/ded ];then $(MKDIR) $(B)/ded;fi - @if [ ! -d $(B)/baseq3 ];then $(MKDIR) $(B)/baseq3;fi - @if [ ! -d $(B)/baseq3/cgame ];then $(MKDIR) $(B)/baseq3/cgame;fi - @if [ ! -d $(B)/baseq3/game ];then $(MKDIR) $(B)/baseq3/game;fi - @if [ ! -d $(B)/baseq3/ui ];then $(MKDIR) $(B)/baseq3/ui;fi - @if [ ! -d $(B)/baseq3/qcommon ];then $(MKDIR) $(B)/baseq3/qcommon;fi - @if [ ! -d $(B)/baseq3/vm ];then $(MKDIR) $(B)/baseq3/vm;fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME) ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME);fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/cgame ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/cgame;fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/game ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/game;fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/ui ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/ui;fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/qcommon ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/qcommon;fi + @if [ ! -d $(B)/$(GAME_DIRECTORY_NAME)/vm ];then $(MKDIR) $(B)/$(GAME_DIRECTORY_NAME)/vm;fi @if [ ! -d $(B)/missionpack ];then $(MKDIR) $(B)/missionpack;fi @if [ ! -d $(B)/missionpack/cgame ];then $(MKDIR) $(B)/missionpack/cgame;fi @if [ ! -d $(B)/missionpack/game ];then $(MKDIR) $(B)/missionpack/game;fi @@ -1295,8 +1328,10 @@ Q3OBJ = \ $(B)/client/l_memory.o \ $(B)/client/l_precomp.o \ $(B)/client/l_script.o \ - $(B)/client/l_struct.o \ - \ + $(B)/client/l_struct.o + +ifeq ($(USE_INTERNAL_JPEG),1) +Q3OBJ += \ $(B)/client/jcapimin.o \ $(B)/client/jcapistd.o \ $(B)/client/jccoefct.o \ @@ -1331,8 +1366,10 @@ Q3OBJ = \ $(B)/client/jidctflt.o \ $(B)/client/jmemmgr.o \ $(B)/client/jmemnobs.o \ - $(B)/client/jutils.o \ - \ + $(B)/client/jutils.o +endif + +Q3OBJ += \ $(B)/client/tr_animation.o \ $(B)/client/tr_backend.o \ $(B)/client/tr_bsp.o \ @@ -1370,6 +1407,10 @@ Q3OBJ = \ $(B)/client/con_log.o \ $(B)/client/sys_main.o +ifeq ($(USE_BLOOM),1) + Q3OBJ += $(B)/client/tr_bloom.o +endif + ifeq ($(ARCH),i386) Q3OBJ += \ $(B)/client/snd_mixa.o \ @@ -1473,13 +1514,13 @@ Q3POBJ += \ Q3POBJ_SMP += \ $(B)/clientsmp/sdl_glimp.o -$(B)/ioquake3.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ) $(LIBSDLMAIN) +$(B)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ) $(LIBSDLMAIN) $(echo_cmd) "LD $@" $(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) \ -o $@ $(Q3OBJ) $(Q3POBJ) \ $(LIBSDLMAIN) $(CLIENT_LIBS) $(LIBS) -$(B)/ioquake3-smp.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ_SMP) $(LIBSDLMAIN) +$(B)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT): $(Q3OBJ) $(Q3POBJ_SMP) $(LIBSDLMAIN) $(echo_cmd) "LD $@" $(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(THREAD_LDFLAGS) \ -o $@ $(Q3OBJ) $(Q3POBJ_SMP) \ @@ -1613,7 +1654,7 @@ else $(B)/ded/con_tty.o endif -$(B)/ioq3ded.$(ARCH)$(BINEXT): $(Q3DOBJ) +$(B)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT): $(Q3DOBJ) $(echo_cmd) "LD $@" $(Q)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(Q3DOBJ) $(LIBS) @@ -1624,40 +1665,40 @@ $(B)/ioq3ded.$(ARCH)$(BINEXT): $(Q3DOBJ) ############################################################################# Q3CGOBJ_ = \ - $(B)/baseq3/cgame/cg_main.o \ - $(B)/baseq3/cgame/bg_misc.o \ - $(B)/baseq3/cgame/bg_pmove.o \ - $(B)/baseq3/cgame/bg_slidemove.o \ - $(B)/baseq3/cgame/bg_lib.o \ - $(B)/baseq3/cgame/cg_consolecmds.o \ - $(B)/baseq3/cgame/cg_draw.o \ - $(B)/baseq3/cgame/cg_drawtools.o \ - $(B)/baseq3/cgame/cg_effects.o \ - $(B)/baseq3/cgame/cg_ents.o \ - $(B)/baseq3/cgame/cg_event.o \ - $(B)/baseq3/cgame/cg_info.o \ - $(B)/baseq3/cgame/cg_localents.o \ - $(B)/baseq3/cgame/cg_marks.o \ - $(B)/baseq3/cgame/cg_players.o \ - $(B)/baseq3/cgame/cg_playerstate.o \ - $(B)/baseq3/cgame/cg_predict.o \ - $(B)/baseq3/cgame/cg_scoreboard.o \ - $(B)/baseq3/cgame/cg_servercmds.o \ - $(B)/baseq3/cgame/cg_snapshot.o \ - $(B)/baseq3/cgame/cg_view.o \ - $(B)/baseq3/cgame/cg_weapons.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_main.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_misc.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_pmove.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_slidemove.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_lib.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_consolecmds.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_draw.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_drawtools.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_effects.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_ents.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_event.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_info.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_localents.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_marks.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_players.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_playerstate.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_predict.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_scoreboard.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_servercmds.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_snapshot.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_view.o \ + $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_weapons.o \ \ - $(B)/baseq3/qcommon/q_math.o \ - $(B)/baseq3/qcommon/q_shared.o + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \ + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o -Q3CGOBJ = $(Q3CGOBJ_) $(B)/baseq3/cgame/cg_syscalls.o +Q3CGOBJ = $(Q3CGOBJ_) $(B)/$(GAME_DIRECTORY_NAME)/cgame/cg_syscalls.o Q3CGVMOBJ = $(Q3CGOBJ_:%.o=%.asm) -$(B)/baseq3/cgame$(ARCH).$(SHLIBEXT): $(Q3CGOBJ) +$(B)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT): $(Q3CGOBJ) $(echo_cmd) "LD $@" $(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3CGOBJ) -$(B)/baseq3/vm/cgame.qvm: $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM) +$(B)/$(GAME_DIRECTORY_NAME)/vm/cgame.qvm: $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM) $(echo_cmd) "Q3ASM $@" $(Q)$(Q3ASM) -o $@ $(Q3CGVMOBJ) $(CGDIR)/cg_syscalls.asm @@ -1712,49 +1753,49 @@ $(B)/missionpack/vm/cgame.qvm: $(MPCGVMOBJ) $(CGDIR)/cg_syscalls.asm $(Q3ASM) ############################################################################# Q3GOBJ_ = \ - $(B)/baseq3/game/g_main.o \ - $(B)/baseq3/game/ai_chat.o \ - $(B)/baseq3/game/ai_cmd.o \ - $(B)/baseq3/game/ai_dmnet.o \ - $(B)/baseq3/game/ai_dmq3.o \ - $(B)/baseq3/game/ai_main.o \ - $(B)/baseq3/game/ai_team.o \ - $(B)/baseq3/game/ai_vcmd.o \ - $(B)/baseq3/game/bg_misc.o \ - $(B)/baseq3/game/bg_pmove.o \ - $(B)/baseq3/game/bg_slidemove.o \ - $(B)/baseq3/game/bg_lib.o \ - $(B)/baseq3/game/g_active.o \ - $(B)/baseq3/game/g_arenas.o \ - $(B)/baseq3/game/g_bot.o \ - $(B)/baseq3/game/g_client.o \ - $(B)/baseq3/game/g_cmds.o \ - $(B)/baseq3/game/g_combat.o \ - $(B)/baseq3/game/g_items.o \ - $(B)/baseq3/game/g_mem.o \ - $(B)/baseq3/game/g_misc.o \ - $(B)/baseq3/game/g_missile.o \ - $(B)/baseq3/game/g_mover.o \ - $(B)/baseq3/game/g_session.o \ - $(B)/baseq3/game/g_spawn.o \ - $(B)/baseq3/game/g_svcmds.o \ - $(B)/baseq3/game/g_target.o \ - $(B)/baseq3/game/g_team.o \ - $(B)/baseq3/game/g_trigger.o \ - $(B)/baseq3/game/g_utils.o \ - $(B)/baseq3/game/g_weapon.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_main.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_chat.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_cmd.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_dmnet.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_dmq3.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_main.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_team.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/ai_vcmd.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/bg_misc.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/bg_pmove.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/bg_slidemove.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/bg_lib.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_active.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_arenas.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_bot.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_client.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_cmds.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_combat.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_items.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_mem.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_misc.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_missile.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_mover.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_session.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_spawn.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_svcmds.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_target.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_team.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_trigger.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_utils.o \ + $(B)/$(GAME_DIRECTORY_NAME)/game/g_weapon.o \ \ - $(B)/baseq3/qcommon/q_math.o \ - $(B)/baseq3/qcommon/q_shared.o + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \ + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o -Q3GOBJ = $(Q3GOBJ_) $(B)/baseq3/game/g_syscalls.o +Q3GOBJ = $(Q3GOBJ_) $(B)/$(GAME_DIRECTORY_NAME)/game/g_syscalls.o Q3GVMOBJ = $(Q3GOBJ_:%.o=%.asm) -$(B)/baseq3/qagame$(ARCH).$(SHLIBEXT): $(Q3GOBJ) +$(B)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT): $(Q3GOBJ) $(echo_cmd) "LD $@" $(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3GOBJ) -$(B)/baseq3/vm/qagame.qvm: $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM) +$(B)/$(GAME_DIRECTORY_NAME)/vm/qagame.qvm: $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM) $(echo_cmd) "Q3ASM $@" $(Q)$(Q3ASM) -o $@ $(Q3GVMOBJ) $(GDIR)/g_syscalls.asm @@ -1816,59 +1857,59 @@ $(B)/missionpack/vm/qagame.qvm: $(MPGVMOBJ) $(GDIR)/g_syscalls.asm $(Q3ASM) ############################################################################# Q3UIOBJ_ = \ - $(B)/baseq3/ui/ui_main.o \ - $(B)/baseq3/ui/bg_misc.o \ - $(B)/baseq3/ui/bg_lib.o \ - $(B)/baseq3/ui/ui_addbots.o \ - $(B)/baseq3/ui/ui_atoms.o \ - $(B)/baseq3/ui/ui_cdkey.o \ - $(B)/baseq3/ui/ui_cinematics.o \ - $(B)/baseq3/ui/ui_confirm.o \ - $(B)/baseq3/ui/ui_connect.o \ - $(B)/baseq3/ui/ui_controls2.o \ - $(B)/baseq3/ui/ui_credits.o \ - $(B)/baseq3/ui/ui_demo2.o \ - $(B)/baseq3/ui/ui_display.o \ - $(B)/baseq3/ui/ui_gameinfo.o \ - $(B)/baseq3/ui/ui_ingame.o \ - $(B)/baseq3/ui/ui_loadconfig.o \ - $(B)/baseq3/ui/ui_menu.o \ - $(B)/baseq3/ui/ui_mfield.o \ - $(B)/baseq3/ui/ui_mods.o \ - $(B)/baseq3/ui/ui_network.o \ - $(B)/baseq3/ui/ui_options.o \ - $(B)/baseq3/ui/ui_playermodel.o \ - $(B)/baseq3/ui/ui_players.o \ - $(B)/baseq3/ui/ui_playersettings.o \ - $(B)/baseq3/ui/ui_preferences.o \ - $(B)/baseq3/ui/ui_qmenu.o \ - $(B)/baseq3/ui/ui_removebots.o \ - $(B)/baseq3/ui/ui_saveconfig.o \ - $(B)/baseq3/ui/ui_serverinfo.o \ - $(B)/baseq3/ui/ui_servers2.o \ - $(B)/baseq3/ui/ui_setup.o \ - $(B)/baseq3/ui/ui_sound.o \ - $(B)/baseq3/ui/ui_sparena.o \ - $(B)/baseq3/ui/ui_specifyserver.o \ - $(B)/baseq3/ui/ui_splevel.o \ - $(B)/baseq3/ui/ui_sppostgame.o \ - $(B)/baseq3/ui/ui_spskill.o \ - $(B)/baseq3/ui/ui_startserver.o \ - $(B)/baseq3/ui/ui_team.o \ - $(B)/baseq3/ui/ui_teamorders.o \ - $(B)/baseq3/ui/ui_video.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_main.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/bg_misc.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/bg_lib.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_addbots.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_atoms.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_cdkey.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_cinematics.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_confirm.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_connect.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_controls2.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_credits.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_demo2.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_display.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_gameinfo.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_ingame.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_loadconfig.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_menu.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_mfield.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_mods.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_network.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_options.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_playermodel.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_players.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_playersettings.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_preferences.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_qmenu.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_removebots.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_saveconfig.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_serverinfo.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_servers2.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_setup.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sound.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sparena.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_specifyserver.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_splevel.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_sppostgame.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_spskill.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_startserver.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_team.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_teamorders.o \ + $(B)/$(GAME_DIRECTORY_NAME)/ui/ui_video.o \ \ - $(B)/baseq3/qcommon/q_math.o \ - $(B)/baseq3/qcommon/q_shared.o + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_math.o \ + $(B)/$(GAME_DIRECTORY_NAME)/qcommon/q_shared.o Q3UIOBJ = $(Q3UIOBJ_) $(B)/missionpack/ui/ui_syscalls.o Q3UIVMOBJ = $(Q3UIOBJ_:%.o=%.asm) -$(B)/baseq3/ui$(ARCH).$(SHLIBEXT): $(Q3UIOBJ) +$(B)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT): $(Q3UIOBJ) $(echo_cmd) "LD $@" $(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3UIOBJ) -$(B)/baseq3/vm/ui.qvm: $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm $(Q3ASM) +$(B)/$(GAME_DIRECTORY_NAME)/vm/ui.qvm: $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm $(Q3ASM) $(echo_cmd) "Q3ASM $@" $(Q)$(Q3ASM) -o $@ $(Q3UIVMOBJ) $(UIDIR)/ui_syscalls.asm @@ -1976,16 +2017,16 @@ endif ## GAME MODULE RULES ############################################################################# -$(B)/baseq3/cgame/bg_%.o: $(GDIR)/bg_%.c +$(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_%.o: $(GDIR)/bg_%.c $(DO_CGAME_CC) -$(B)/baseq3/cgame/%.o: $(CGDIR)/%.c +$(B)/$(GAME_DIRECTORY_NAME)/cgame/%.o: $(CGDIR)/%.c $(DO_CGAME_CC) -$(B)/baseq3/cgame/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/cgame/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC) $(DO_CGAME_Q3LCC) -$(B)/baseq3/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC) $(DO_CGAME_Q3LCC) $(B)/missionpack/cgame/bg_%.o: $(GDIR)/bg_%.c @@ -2001,10 +2042,10 @@ $(B)/missionpack/cgame/%.asm: $(CGDIR)/%.c $(Q3LCC) $(DO_CGAME_Q3LCC_MISSIONPACK) -$(B)/baseq3/game/%.o: $(GDIR)/%.c +$(B)/$(GAME_DIRECTORY_NAME)/game/%.o: $(GDIR)/%.c $(DO_GAME_CC) -$(B)/baseq3/game/%.asm: $(GDIR)/%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/game/%.asm: $(GDIR)/%.c $(Q3LCC) $(DO_GAME_Q3LCC) $(B)/missionpack/game/%.o: $(GDIR)/%.c @@ -2014,16 +2055,16 @@ $(B)/missionpack/game/%.asm: $(GDIR)/%.c $(Q3LCC) $(DO_GAME_Q3LCC_MISSIONPACK) -$(B)/baseq3/ui/bg_%.o: $(GDIR)/bg_%.c +$(B)/$(GAME_DIRECTORY_NAME)/ui/bg_%.o: $(GDIR)/bg_%.c $(DO_UI_CC) -$(B)/baseq3/ui/%.o: $(Q3UIDIR)/%.c +$(B)/$(GAME_DIRECTORY_NAME)/ui/%.o: $(Q3UIDIR)/%.c $(DO_UI_CC) -$(B)/baseq3/ui/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/ui/bg_%.asm: $(GDIR)/bg_%.c $(Q3LCC) $(DO_UI_Q3LCC) -$(B)/baseq3/ui/%.asm: $(Q3UIDIR)/%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/ui/%.asm: $(Q3UIDIR)/%.c $(Q3LCC) $(DO_UI_Q3LCC) $(B)/missionpack/ui/bg_%.o: $(GDIR)/bg_%.c @@ -2039,10 +2080,10 @@ $(B)/missionpack/ui/%.asm: $(UIDIR)/%.c $(Q3LCC) $(DO_UI_Q3LCC_MISSIONPACK) -$(B)/baseq3/qcommon/%.o: $(CMDIR)/%.c +$(B)/$(GAME_DIRECTORY_NAME)/qcommon/%.o: $(CMDIR)/%.c $(DO_SHLIB_CC) -$(B)/baseq3/qcommon/%.asm: $(CMDIR)/%.c $(Q3LCC) +$(B)/$(GAME_DIRECTORY_NAME)/qcommon/%.asm: $(CMDIR)/%.c $(Q3LCC) $(DO_Q3LCC) $(B)/missionpack/qcommon/%.o: $(CMDIR)/%.c @@ -2063,32 +2104,32 @@ TOOLSOBJ = $(LBURGOBJ) $(Q3CPPOBJ) $(Q3RCCOBJ) $(Q3LCCOBJ) $(Q3ASMOBJ) copyfiles: release - @if [ ! -d $(COPYDIR)/baseq3 ]; then echo "You need to set COPYDIR to where your Quake3 data is!"; fi - -$(MKDIR) -p -m 0755 $(COPYDIR)/baseq3 + @if [ ! -d $(COPYDIR)/$(GAME_DIRECTORY_NAME) ]; then echo "You need to set COPYDIR to where your Quake3 data is!"; fi + -$(MKDIR) -p -m 0755 $(COPYDIR)/$(GAME_DIRECTORY_NAME) -$(MKDIR) -p -m 0755 $(COPYDIR)/missionpack ifneq ($(BUILD_CLIENT),0) - $(INSTALL) -s -m 0755 $(BR)/ioquake3.$(ARCH)$(BINEXT) $(COPYDIR)/ioquake3.$(ARCH)$(BINEXT) + $(INSTALL) -s -m 0755 $(BR)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_CLIENT_NAME).$(ARCH)$(BINEXT) endif # Don't copy the SMP until it's working together with SDL. #ifneq ($(BUILD_CLIENT_SMP),0) -# $(INSTALL) -s -m 0755 $(BR)/ioquake3-smp.$(ARCH)$(BINEXT) $(COPYDIR)/ioquake3-smp.$(ARCH)$(BINEXT) +# $(INSTALL) -s -m 0755 $(BR)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_CLIENT_NAME)-smp.$(ARCH)$(BINEXT) #endif ifneq ($(BUILD_SERVER),0) - @if [ -f $(BR)/ioq3ded.$(ARCH)$(BINEXT) ]; then \ - $(INSTALL) -s -m 0755 $(BR)/ioq3ded.$(ARCH)$(BINEXT) $(COPYDIR)/ioq3ded.$(ARCH)$(BINEXT); \ + @if [ -f $(BR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT) ]; then \ + $(INSTALL) -s -m 0755 $(BR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT) $(COPYDIR)/$(GAME_DEDICATED_NAME).$(ARCH)$(BINEXT); \ fi endif ifneq ($(BUILD_GAME_SO),0) - $(INSTALL) -s -m 0755 $(BR)/baseq3/cgame$(ARCH).$(SHLIBEXT) \ - $(COPYDIR)/baseq3/. - $(INSTALL) -s -m 0755 $(BR)/baseq3/qagame$(ARCH).$(SHLIBEXT) \ - $(COPYDIR)/baseq3/. - $(INSTALL) -s -m 0755 $(BR)/baseq3/ui$(ARCH).$(SHLIBEXT) \ - $(COPYDIR)/baseq3/. + $(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/cgame$(ARCH).$(SHLIBEXT) \ + $(COPYDIR)/$(GAME_DIRECTORY_NAME)/. + $(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/qagame$(ARCH).$(SHLIBEXT) \ + $(COPYDIR)/$(GAME_DIRECTORY_NAME)/. + $(INSTALL) -s -m 0755 $(BR)/$(GAME_DIRECTORY_NAME)/ui$(ARCH).$(SHLIBEXT) \ + $(COPYDIR)/$(GAME_DIRECTORY_NAME)/. ifneq ($(BUILD_MISSIONPACK),0) -$(MKDIR) -p -m 0755 $(COPYDIR)/missionpack $(INSTALL) -s -m 0755 $(BR)/missionpack/cgame$(ARCH).$(SHLIBEXT) \ @@ -2144,10 +2185,10 @@ else endif dist: - rm -rf ioquake3-$(VERSION) - svn export . ioquake3-$(VERSION) - tar --owner=root --group=root --force-local -cjf ioquake3-$(VERSION).tar.bz2 ioquake3-$(VERSION) - rm -rf ioquake3-$(VERSION) + rm -rf $(GAME_CLIENT_NAME)-$(VERSION) + svn export . $(GAME_CLIENT_NAME)-$(VERSION) + tar --owner=root --group=root --force-local -cjf $(GAME_CLIENT_NAME)-$(VERSION).tar.bz2 $(GAME_CLIENT_NAME)-$(VERSION) + rm -rf $(GAME_CLIENT_NAME)-$(VERSION) ############################################################################# # DEPENDENCIES diff --git a/code/client/cl_cgame.c b/code/client/cl_cgame.c index ef15798..900c33f 100644 --- a/code/client/cl_cgame.c +++ b/code/client/cl_cgame.c @@ -27,6 +27,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "libmumblelink.h" +#ifndef USE_INTERNAL_SPEEX +# include +# include +#endif + extern botlib_export_t *botlib_export; extern qboolean loadCamera(const char *name); diff --git a/code/client/cl_main.c b/code/client/cl_main.c index 01c044a..a4a2916 100644 --- a/code/client/cl_main.c +++ b/code/client/cl_main.c @@ -28,6 +28,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "libmumblelink.h" #endif +#ifndef USE_INTERNAL_SPEEX +# include +# include +#endif + #ifdef USE_MUMBLE cvar_t *cl_useMumble; cvar_t *cl_mumbleScale; @@ -3290,7 +3295,13 @@ static void CL_SetServerInfo(serverInfo_t *server, const char *info, int ping) { server->netType = atoi(Info_ValueForKey(info, "nettype")); server->minPing = atoi(Info_ValueForKey(info, "minping")); server->maxPing = atoi(Info_ValueForKey(info, "maxping")); +#ifdef OPEN_ARENA + server->g_humanplayers = atoi(Info_ValueForKey(info, "g_humanplayers")); + server->g_needpass = atoi(Info_ValueForKey(info, "g_needpass")); +#endif +#ifndef STANDALONE server->punkbuster = atoi(Info_ValueForKey(info, "punkbuster")); +#endif } server->ping = ping; } @@ -3408,7 +3419,9 @@ void CL_ServerInfoPacket( netadr_t from, msg_t *msg ) { cls.localServers[i].game[0] = '\0'; cls.localServers[i].gameType = 0; cls.localServers[i].netType = from.type; +#ifndef STANDALONE cls.localServers[i].punkbuster = 0; +#endif Q_strncpyz( info, MSG_ReadString( msg ), MAX_INFO_STRING ); if (strlen(info)) { diff --git a/code/client/cl_ui.c b/code/client/cl_ui.c index 56a226b..5fb1ee2 100644 --- a/code/client/cl_ui.c +++ b/code/client/cl_ui.c @@ -297,7 +297,13 @@ static void LAN_GetServerInfo( int source, int n, char *buf, int buflen ) { Info_SetValueForKey( info, "gametype", va("%i",server->gameType)); Info_SetValueForKey( info, "nettype", va("%i",server->netType)); Info_SetValueForKey( info, "addr", NET_AdrToString(server->adr)); +#ifndef STANDALONE Info_SetValueForKey( info, "punkbuster", va("%i", server->punkbuster)); +#endif +#ifdef OPEN_ARENA + Info_SetValueForKey( info, "g_needpass", va("%i",server->g_needpass)); + Info_SetValueForKey( info, "g_humanplayers", va("%i",server->g_humanplayers)); +#endif Q_strncpyz(buf, info, buflen); } else { if (buf) { @@ -971,6 +1112,12 @@ intptr_t CL_UISystemCalls( intptr_t *args ) { case UI_SET_CDKEY: CLUI_SetCDKey( VMA(1) ); return 0; +#elif defined(OPEN_ARENA) + case UI_GET_CDKEY: + return 0; + + case UI_SET_CDKEY: + return 0; #endif case UI_SET_PBCLSTATUS: @@ -1056,6 +1203,9 @@ intptr_t CL_UISystemCalls( intptr_t *args ) { #ifndef STANDALONE case UI_VERIFY_CDKEY: return CL_CDKeyValidate(VMA(1), VMA(2)); +#elif defined(OPEN_ARENA) + case UI_VERIFY_CDKEY: + return 1; #endif diff --git a/code/client/client.h b/code/client/client.h index 5ee30c2..7e93272 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -35,8 +35,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #endif /* USE_CURL */ #ifdef USE_VOIP -#include "speex/speex.h" -#include "speex/speex_preprocess.h" +# ifdef USE_INTERNAL_SPEEX +# include "speex/speex.h" +# include "speex/speex_preprocess.h" +# else +# include +# include +# endif #endif // file full of random crap that gets used to create cl_guid @@ -295,7 +300,13 @@ typedef struct { int maxPing; int ping; qboolean visible; +#ifdef OPEN_ARENA + int g_humanplayers; + int g_needpass; +#endif +#ifndef STANDALONE int punkbuster; +#endif } serverInfo_t; typedef struct { diff --git a/code/client/snd_codec.c b/code/client/snd_codec.c index 0483e8d..8745344 100644 --- a/code/client/snd_codec.c +++ b/code/client/snd_codec.c @@ -131,6 +131,69 @@ void S_CodecRegister(snd_codec_t *codec) codecs = codec; } +#ifdef OPEN_ARENA +// STOLEN FROM IOSTVOY by thilo!!!! HA HA HA but it works :( +qboolean S_TheCheckExtension(char *filename) +{ + fileHandle_t hnd; + char fn[MAX_QPATH]; + int stringlen = strlen(filename); + char *extptr; + + strncpy(fn, filename, stringlen+1); + extptr = strrchr(fn, '.'); + + if(!extptr) + { + extptr = &fn[stringlen]; + + extptr[0] = '.'; + extptr[1] = 'w'; + extptr[2] = 'a'; + extptr[3] = 'v'; + extptr[4] = '\0'; + + stringlen += 4; + } + + FS_FOpenFileRead(fn, &hnd, qtrue); + + if(!hnd) + { + if(!strcmp(++extptr, "wav")) + { + extptr[0] = 'o'; + extptr[1] = 'g'; + extptr[2] = 'g'; + + FS_FOpenFileRead(fn, &hnd, qtrue); + + if(!hnd) + return qfalse; + } + else + return qfalse; + } + + FS_FCloseFile(hnd); + strcpy(filename, fn); + + return qtrue; +} + +qboolean S_TheGetFileName(char *filename) +{ + char fn[MAX_QPATH]; + + strncpy(fn, filename, sizeof(fn) - 10); + + if(S_TheCheckExtension(filename)) + return qtrue; + + return qfalse; +} +#endif + /* ================= S_CodecLoad @@ -141,15 +204,25 @@ void *S_CodecLoad(const char *filename, snd_info_t *info) snd_codec_t *codec; char fn[MAX_QPATH]; +#ifdef OPEN_ARENA + // GO LOAD IT + strncpy(fn, filename, sizeof(fn)); + if(!S_TheGetFileName(fn)) + return NULL; + codec = S_FindCodecForFile(fn); +#else codec = S_FindCodecForFile(filename); +#endif if(!codec) { Com_Printf("Unknown extension for %s\n", filename); return NULL; } +#ifndef OPEN_ARENA strncpy(fn, filename, sizeof(fn)); COM_DefaultExtension(fn, sizeof(fn), codec->ext); +#endif return codec->load(fn, info); } diff --git a/code/client/snd_dma.c b/code/client/snd_dma.c index acda0f5..5cae6c5 100644 --- a/code/client/snd_dma.c +++ b/code/client/snd_dma.c @@ -399,7 +399,11 @@ void S_Base_BeginRegistration( void ) { Com_Memset( s_knownSfx, 0, sizeof( s_knownSfx ) ); Com_Memset(sfxHash, 0, sizeof(sfx_t *)*LOOP_HASH); +#ifdef OPEN_ARENA + S_Base_RegisterSound("sound/misc/silence.wav", qfalse); // changed to a sound in baseoa +#else S_Base_RegisterSound("sound/feedback/hit.wav", qfalse); // changed to a sound in baseq3 +#endif } } diff --git a/code/client/snd_openal.c b/code/client/snd_openal.c index b8ae488..c9c5ed9 100644 --- a/code/client/snd_openal.c +++ b/code/client/snd_openal.c @@ -384,7 +384,11 @@ qboolean S_AL_BufferInit( void ) numSfx = 0; // Load the default sound, and lock it +#ifdef OPEN_ARENA + default_sfx = S_AL_BufferFind("sound/misc/silence.wav"); +#else default_sfx = S_AL_BufferFind("sound/feedback/hit.wav"); +#endif S_AL_BufferUse(default_sfx); knownSfx[default_sfx].isLocked = qtrue; diff --git a/code/qcommon/common.c b/code/qcommon/common.c index 7cdfa85..60c191f 100644 --- a/code/qcommon/common.c +++ b/code/qcommon/common.c @@ -32,13 +32,21 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #endif int demo_protocols[] = +#ifdef OPEN_ARENA +{ 66, 67, 68, 69, 70, 71, 0 }; +#else { 66, 67, 68, 0 }; +#endif #define MAX_NUM_ARGVS 50 #define MIN_DEDICATED_COMHUNKMEGS 1 #define MIN_COMHUNKMEGS 56 -#define DEF_COMHUNKMEGS 64 +#ifdef OPEN_ARENA +# define DEF_COMHUNKMEGS 128 +#else +# define DEF_COMHUNKMEGS 64 +#endif #define DEF_COMZONEMEGS 24 #define XSTRING(x) STRING(x) #define STRING(x) #x diff --git a/code/qcommon/q_platform.h b/code/qcommon/q_platform.h index ed5d907..8f3781d 100644 --- a/code/qcommon/q_platform.h +++ b/code/qcommon/q_platform.h @@ -127,7 +127,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA //================================================================= LINUX === -#ifdef __linux__ +#if defined(__linux__) || defined(__FreeBSD_kernel__) #include diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h index 54b8bfb..76bc626 100644 --- a/code/qcommon/q_shared.h +++ b/code/qcommon/q_shared.h @@ -26,7 +26,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA // q_shared.h -- included first by ALL program modules. // A user mod should never modify this file -#ifdef STANDALONE +#ifdef OPEN_ARENA + #define PRODUCT_NAME "ioq3+oa" + #define BASEGAME "baseoa" + #define CLIENT_WINDOW_TITLE "OpenArena" + #define CLIENT_WINDOW_MIN_TITLE "OA" + #define GAMENAME_FOR_MASTER "OpenArena" // must NOT contain whitespaces +#elif defined(STANDALONE) #define PRODUCT_NAME "iofoo3" #define BASEGAME "foobar" #define CLIENT_WINDOW_TITLE "changeme" diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h index 34cb2e9..e75fb48 100644 --- a/code/qcommon/qcommon.h +++ b/code/qcommon/qcommon.h @@ -232,17 +232,33 @@ PROTOCOL ============================================================== */ -#define PROTOCOL_VERSION 68 +#ifdef OPEN_ARENA +//Open Arena up to 0.7.6 used 68 +//Open Arena 0.7.7 uses 69 +//Open Arena 0.8.0 uses protocol 70 +//Open Arena 0.8.1+ uses protocol 71 (Shouldn't have been bumped but was it anyway) +# define PROTOCOL_VERSION 71 +#else +# define PROTOCOL_VERSION 68 +#endif // 1.31 - 67 // maintain a list of compatible protocols for demo playing // NOTE: that stuff only works with two digits protocols extern int demo_protocols[]; -#define UPDATE_SERVER_NAME "update.quake3arena.com" +#ifndef STANDALONE +# define UPDATE_SERVER_NAME "update.quake3arena.com" +#else +# define UPDATE_SERVER_NAME "" +#endif // override on command line, config files etc. -#ifndef MASTER_SERVER_NAME -#define MASTER_SERVER_NAME "master.quake3arena.com" +#ifdef OPEN_ARENA +# define MASTER_SERVER_NAME "dpmaster.deathmask.net" +#else +# ifndef MASTER_SERVER_NAME +# define MASTER_SERVER_NAME "master.quake3arena.com" +# endif #endif #ifndef STANDALONE diff --git a/code/renderer/tr_backend.c b/code/renderer/tr_backend.c index 30c9368..80153f7 100644 --- a/code/renderer/tr_backend.c +++ b/code/renderer/tr_backend.c @@ -944,6 +944,10 @@ const void *RB_DrawSurfs( const void *data ) { backEnd.refdef = cmd->refdef; backEnd.viewParms = cmd->viewParms; +#ifdef ENABLE_BLOOM + //TODO Maybe check for rdf_noworld stuff but q3mme has full 3d ui + backEnd.doneSurfaces = qtrue; +#endif RB_RenderDrawSurfList( cmd->drawSurfs, cmd->numDrawSurfs ); return (const void *)(cmd + 1); @@ -1119,6 +1123,10 @@ const void *RB_SwapBuffers( const void *data ) { backEnd.projection2D = qfalse; +#ifdef ENABLE_BLOOM + backEnd.doneBloom = qfalse; + backEnd.doneSurfaces = qfalse; +#endif return (const void *)(cmd + 1); } @@ -1147,6 +1155,10 @@ void RB_ExecuteRenderCommands( const void *data ) { data = RB_SetColor( data ); break; case RC_STRETCH_PIC: +#ifdef ENABLE_BLOOM + //Check if it's time for BLOOM! + R_BloomScreen(); +#endif data = RB_StretchPic( data ); break; case RC_DRAW_SURFS: @@ -1156,6 +1168,10 @@ void RB_ExecuteRenderCommands( const void *data ) { data = RB_DrawBuffer( data ); break; case RC_SWAP_BUFFERS: +#ifdef ENABLE_BLOOM + //Check if it's time for BLOOM! + R_BloomScreen(); +#endif data = RB_SwapBuffers( data ); break; case RC_SCREENSHOT: diff --git a/code/renderer/tr_image_jpg.c b/code/renderer/tr_image_jpg.c index 2e1a52a..548d5de 100644 --- a/code/renderer/tr_image_jpg.c +++ b/code/renderer/tr_image_jpg.c @@ -31,7 +31,122 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #define JPEG_INTERNALS -#include "../jpeg-6b/jpeglib.h" + +#ifdef USE_INTERNAL_JPEG +# include "../jpeg-6b/jpeglib.h" +#else +# include +# include + +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + unsigned char *inbuf; /* source stream */ + size_t inbufbytes; + JOCTET * buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + +void init_source (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + src->start_of_file = TRUE; +} + +boolean fill_input_buffer (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + size_t nbytes = MIN(src->inbufbytes, INPUT_BUF_SIZE); + + if(!nbytes) + { + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET) 0xFF; + src->buffer[1] = (JOCTET) JPEG_EOI; + nbytes = 2; + } + else + { + memcpy( src->buffer, src->inbuf, nbytes); + + src->inbuf += nbytes; + src->inbufbytes -= nbytes; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + + return TRUE; +} + +void skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) src->pub.bytes_in_buffer) { + num_bytes -= (long) src->pub.bytes_in_buffer; + (void) fill_input_buffer(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + +void term_source (j_decompress_ptr cinfo) {} + +void jpeg_mem_src (j_decompress_ptr cinfo, unsigned char *inbuf, size_t size) +{ + my_src_ptr src; + + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(my_source_mgr)); + src = (my_src_ptr) cinfo->src; + src->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + INPUT_BUF_SIZE * sizeof(JOCTET)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + src->inbuf = inbuf; + src->inbufbytes = size; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} +#endif void R_LoadJPG( const char *filename, unsigned char **pic, int *width, int *height ) { /* This struct contains the JPEG decompression parameters and pointers to diff --git a/code/renderer/tr_init.c b/code/renderer/tr_init.c index 0681919..8a1ded1 100644 --- a/code/renderer/tr_init.c +++ b/code/renderer/tr_init.c @@ -1083,6 +1083,10 @@ void R_Init( void ) { R_Register(); +#ifdef ENABLE_BLOOM + R_BloomInit(); +#endif + max_polys = r_maxpolys->integer; if (max_polys < MAX_POLYS) max_polys = MAX_POLYS; diff --git a/code/renderer/tr_local.h b/code/renderer/tr_local.h index 897d54b..559e7c2 100644 --- a/code/renderer/tr_local.h +++ b/code/renderer/tr_local.h @@ -871,6 +871,10 @@ typedef struct { qboolean projection2D; // if qtrue, drawstretchpic doesn't need to change modes byte color2D[4]; qboolean vertexes2D; // shader needs to be finished +#ifdef ENABLE_BLOOM + qboolean doneBloom; // done bloom this frame + qboolean doneSurfaces; // done any 3d surfaces already +#endif trRefEntity_t entity2D; // currentEntity will point at this when doing 2D rendering } backEndState_t; @@ -1328,6 +1332,9 @@ typedef struct shaderCommands_s extern shaderCommands_t tess; +#ifdef ENABLE_BLOOM +void RB_SetGL2D (void); +#endif void RB_BeginSurface(shader_t *shader, int fogNum ); void RB_EndSurface(void); void RB_CheckOverflow( int verts, int indexes ); @@ -1708,5 +1715,9 @@ void R_InitFreeType( void ); void R_DoneFreeType( void ); void RE_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font); +#ifdef ENABLE_BLOOM +void R_BloomInit( void ); +void R_BloomScreen( void ); +#endif #endif //TR_LOCAL_H diff --git a/code/server/sv_ccmds.c b/code/server/sv_ccmds.c index 01bc60d..8d23603 100644 --- a/code/server/sv_ccmds.c +++ b/code/server/sv_ccmds.c @@ -433,6 +433,14 @@ static void SV_Ban_f( void ) { return; } +#ifdef STANDALONE + if(strlen(AUTHORIZE_SERVER_NAME) < 1) + { + Com_Printf("Ban function disabled due to lack of authorizing server.\n"); + return; + } +#endif + // look up the authorize server's IP if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) { Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME ); @@ -487,6 +495,14 @@ static void SV_BanNum_f( void ) { return; } +#ifdef STANDALONE + if(strlen(AUTHORIZE_SERVER_NAME) < 1) + { + Com_Printf("Ban function disabled due to lack of authorizing server.\n"); + return; + } +#endif + // look up the authorize server's IP if ( !svs.authorizeAddress.ip[0] && svs.authorizeAddress.type != NA_BAD ) { Com_Printf( "Resolving %s\n", AUTHORIZE_SERVER_NAME ); diff --git a/code/server/sv_main.c b/code/server/sv_main.c index 33554cd..02bceda 100644 --- a/code/server/sv_main.c +++ b/code/server/sv_main.c @@ -413,6 +413,12 @@ void SVC_Info( netadr_t from ) { va("%i", sv_maxclients->integer - sv_privateClients->integer ) ); Info_SetValueForKey( infostring, "gametype", va("%i", sv_gametype->integer ) ); Info_SetValueForKey( infostring, "pure", va("%i", sv_pure->integer ) ); +#ifdef OPEN_ARENA + //Sago's things: + Info_SetValueForKey( infostring, "g_needpass", va("%i", (int)Cvar_VariableValue("g_needpass") ) ); + Info_SetValueForKey( infostring, "g_humanplayers", va("%i", (int)Cvar_VariableValue("g_humanplayers") ) ); +#endif + #ifdef USE_VOIP if (sv_voip->integer) { diff --git a/code/sys/sys_unix.c b/code/sys/sys_unix.c index c05fda5..fed95e9 100644 --- a/code/sys/sys_unix.c +++ b/code/sys/sys_unix.c @@ -54,9 +54,17 @@ char *Sys_DefaultHomePath(void) { Q_strncpyz( homePath, p, sizeof( homePath ) ); #ifdef MACOS_X +# ifdef OPEN_ARENA + Q_strcat( homePath, sizeof( homePath ), "/Library/Application Support/OpenArena" ); +# else Q_strcat( homePath, sizeof( homePath ), "/Library/Application Support/Quake3" ); +# endif #else +# ifdef OPEN_ARENA + Q_strcat( homePath, sizeof( homePath ), "/.openarena" ); +# else Q_strcat( homePath, sizeof( homePath ), "/.q3a" ); +# endif #endif if( mkdir( homePath, 0777 ) ) { diff --git a/code/sys/sys_win32.c b/code/sys/sys_win32.c index eeee856..12dc853 100644 --- a/code/sys/sys_win32.c +++ b/code/sys/sys_win32.c @@ -75,7 +75,11 @@ char *Sys_DefaultHomePath( void ) return NULL; } Q_strncpyz( homePath, szPath, sizeof( homePath ) ); +#ifdef OPEN_ARENA + Q_strcat( homePath, sizeof( homePath ), "\\OpenArena" ); +#else Q_strcat( homePath, sizeof( homePath ), "\\Quake3" ); +#endif FreeLibrary(shfolder); if( !CreateDirectory( homePath, NULL ) ) { diff --git a/misc/quake3.icns b/misc/quake3.icns index 30e3b67..a0862fc 100644 Binary files a/misc/quake3.icns and b/misc/quake3.icns differ diff --git a/misc/quake3.ico b/misc/quake3.ico index 6106c27..ad4d2f1 100644 Binary files a/misc/quake3.ico and b/misc/quake3.ico differ diff --git a/misc/quake3.png b/misc/quake3.png index 94010a7..574e5c6 100644 Binary files a/misc/quake3.png and b/misc/quake3.png differ diff --git a/misc/quake3.svg b/misc/quake3.svg index 24c4b9f..425d2b7 100644 --- a/misc/quake3.svg +++ b/misc/quake3.svg @@ -1,67 +1,15 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + [/code] The required bloom file. It's code/renderer/tr_bloom.c. This is directly from openarena [code] /* Copyright (C) 1997-2001 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // tr_bloom.c: 2D lighting post process effect #ifdef ENABLE_BLOOM #include "tr_local.h" static cvar_t *r_bloom; static cvar_t *r_bloom_sample_size; static cvar_t *r_bloom_fast_sample; static cvar_t *r_bloom_alpha; static cvar_t *r_bloom_darken; static cvar_t *r_bloom_intensity; static cvar_t *r_bloom_diamond_size; /* ============================================================================== LIGHT BLOOMS ============================================================================== */ static float Diamond8x[8][8] = { { 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f, }, { 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, }, { 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, }, { 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, }, { 0.1f, 0.3f, 0.6f, 0.9f, 0.9f, 0.6f, 0.3f, 0.1f, }, { 0.0f, 0.2f, 0.4f, 0.6f, 0.6f, 0.4f, 0.2f, 0.0f, }, { 0.0f, 0.0f, 0.2f, 0.3f, 0.3f, 0.2f, 0.0f, 0.0f, }, { 0.0f, 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, 0.0f } }; static float Diamond6x[6][6] = { { 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f, }, { 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, }, { 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, }, { 0.1f, 0.5f, 0.9f, 0.9f, 0.5f, 0.1f, }, { 0.0f, 0.3f, 0.5f, 0.5f, 0.3f, 0.0f, }, { 0.0f, 0.0f, 0.1f, 0.1f, 0.0f, 0.0f } }; static float Diamond4x[4][4] = { { 0.3f, 0.4f, 0.4f, 0.3f, }, { 0.4f, 0.9f, 0.9f, 0.4f, }, { 0.4f, 0.9f, 0.9f, 0.4f, }, { 0.3f, 0.4f, 0.4f, 0.3f } }; static struct { struct { image_t *texture; int width, height; float readW, readH; } effect; struct { image_t *texture; int width, height; float readW, readH; } screen; struct { int width, height; } work; qboolean started; } bloom; static void ID_INLINE R_Bloom_Quad( int width, int height, float texX, float texY, float texWidth, float texHeight ) { int x = 0; int y = 0; x = 0; y += glConfig.vidHeight - height; width += x; height += y; texWidth += texX; texHeight += texY; qglBegin( GL_QUADS ); qglTexCoord2f( texX, texHeight ); qglVertex2f( x, y ); qglTexCoord2f( texX, texY ); qglVertex2f( x, height ); qglTexCoord2f( texWidth, texY ); qglVertex2f( width, height ); qglTexCoord2f( texWidth, texHeight ); qglVertex2f( width, y ); qglEnd (); } /* ================= R_Bloom_InitTextures ================= */ static void R_Bloom_InitTextures( void ) { byte *data; // find closer power of 2 to screen size for (bloom.screen.width = 1;bloom.screen.width< glConfig.vidWidth;bloom.screen.width *= 2); for (bloom.screen.height = 1;bloom.screen.height < glConfig.vidHeight;bloom.screen.height *= 2); bloom.screen.readW = glConfig.vidWidth / (float)bloom.screen.width; bloom.screen.readH = glConfig.vidHeight / (float)bloom.screen.height; // find closer power of 2 to effect size bloom.work.width = r_bloom_sample_size->integer; bloom.work.height = bloom.work.width * ( glConfig.vidWidth / glConfig.vidHeight ); for (bloom.effect.width = 1;bloom.effect.width < bloom.work.width;bloom.effect.width *= 2); for (bloom.effect.height = 1;bloom.effect.height < bloom.work.height;bloom.effect.height *= 2); bloom.effect.readW = bloom.work.width / (float)bloom.effect.width; bloom.effect.readH = bloom.work.height / (float)bloom.effect.height; // disable blooms if we can't handle a texture of that size if( bloom.screen.width > glConfig.maxTextureSize || bloom.screen.height > glConfig.maxTextureSize || bloom.effect.width > glConfig.maxTextureSize || bloom.effect.height > glConfig.maxTextureSize || bloom.work.width > glConfig.vidWidth || bloom.work.height > glConfig.vidHeight ) { ri.Cvar_Set( "r_bloom", "0" ); Com_Printf( S_COLOR_YELLOW"WARNING: 'R_InitBloomTextures' too high resolution for light bloom, effect disabled\n" ); return; } data = ri.Hunk_AllocateTempMemory( bloom.screen.width * bloom.screen.height * 4 ); Com_Memset( data, 0, bloom.screen.width * bloom.screen.height * 4 ); bloom.screen.texture = R_CreateImage( "***bloom screen texture***", data, bloom.screen.width, bloom.screen.height, qfalse, qfalse, qfalse ); ri.Hunk_FreeTempMemory( data ); data = ri.Hunk_AllocateTempMemory( bloom.effect.width * bloom.effect.height * 4 ); Com_Memset( data, 0, bloom.effect.width * bloom.effect.height * 4 ); bloom.effect.texture = R_CreateImage( "***bloom effect texture***", data, bloom.effect.width, bloom.effect.height, qfalse, qfalse, qfalse ); ri.Hunk_FreeTempMemory( data ); bloom.started = qtrue; } /* ================= R_InitBloomTextures ================= */ void R_InitBloomTextures( void ) { if( !r_bloom->integer ) return; memset( &bloom, 0, sizeof( bloom )); R_Bloom_InitTextures (); } /* ================= R_Bloom_DrawEffect ================= */ static void R_Bloom_DrawEffect( void ) { GL_Bind( bloom.effect.texture ); GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE ); qglColor4f( r_bloom_alpha->value, r_bloom_alpha->value, r_bloom_alpha->value, 1.0f ); R_Bloom_Quad( glConfig.vidWidth, glConfig.vidHeight, 0, 0, bloom.effect.readW, bloom.effect.readW ); } /* ================= R_Bloom_GeneratexDiamonds ================= */ static void R_Bloom_WarsowEffect( void ) { int i, j, k; float intensity, scale, *diamond; qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); //Take the backup texture and downscale it GL_Bind( bloom.screen.texture ); GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO ); R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH ); //Copy downscaled framebuffer into a texture GL_Bind( bloom.effect.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); // darkening passes with repeated filter if( r_bloom_darken->integer ) { int i; GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO ); for( i = 0; i < r_bloom_darken->integer; i++ ) { R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.effect.readW, bloom.effect.readH ); } qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); } /* Copy the result to the effect texture */ GL_Bind( bloom.effect.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); // bluring passes, warsow uses a repeated semi blend on a selectable diamond grid qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE_MINUS_SRC_COLOR ); if( r_bloom_diamond_size->integer > 7 || r_bloom_diamond_size->integer <= 3 ) { if( r_bloom_diamond_size->integer != 8 ) ri.Cvar_Set( "r_bloom_diamond_size", "8" ); } else if( r_bloom_diamond_size->integer > 5 ) { if( r_bloom_diamond_size->integer != 6 ) ri.Cvar_Set( "r_bloom_diamond_size", "6" ); } else if( r_bloom_diamond_size->integer > 3 ) { if( r_bloom_diamond_size->integer != 4 ) ri.Cvar_Set( "r_bloom_diamond_size", "4" ); } switch( r_bloom_diamond_size->integer ) { case 4: k = 2; diamond = &Diamond4x[0][0]; scale = r_bloom_intensity->value * 0.8f; break; case 6: k = 3; diamond = &Diamond6x[0][0]; scale = r_bloom_intensity->value * 0.5f; break; default: // case 8: k = 4; diamond = &Diamond8x[0][0]; scale = r_bloom_intensity->value * 0.3f; break; } for( i = 0; i < r_bloom_diamond_size->integer; i++ ) { for( j = 0; j < r_bloom_diamond_size->integer; j++, diamond++ ) { float x, y; intensity = *diamond * scale; if( intensity < 0.01f ) continue; qglColor4f( intensity, intensity, intensity, 1.0 ); x = (i - k) * ( 2 / 640.0f ) * bloom.effect.readW; y = (j - k) * ( 2 / 480.0f ) * bloom.effect.readH; R_Bloom_Quad( bloom.work.width, bloom.work.height, x, y, bloom.effect.readW, bloom.effect.readH ); } } qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); } /* ================= R_Bloom_BackupScreen Backup the full original screen to a texture for downscaling and later restoration ================= */ static void R_Bloom_BackupScreen( void ) { GL_Bind( bloom.screen.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, glConfig.vidWidth, glConfig.vidHeight ); } /* ================= R_Bloom_RestoreScreen Restore the temporary framebuffer section we used with the backup texture ================= */ static void R_Bloom_RestoreScreen( void ) { GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO ); GL_Bind( bloom.screen.texture ); qglColor4f( 1, 1, 1, 1 ); R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.work.width / (float)bloom.screen.width, bloom.work.height / (float)bloom.screen.height ); } /* ================= R_Bloom_DownsampleView Scale the copied screen back to the sample size used for subsequent passes ================= */ # if 0 static void R_Bloom_DownsampleView( void ) { // TODO, Provide option to control the color strength here / // qglColor4f( r_bloom_darken->value, r_bloom_darken->value, r_bloom_darken->value, 1.0f ); qglColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); GL_Bind( bloom.screen.texture ); GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO ); //Downscale it R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.screen.readW, bloom.screen.readH ); # if 1 GL_Bind( bloom.effect.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); // darkening passes if( r_bloom_darken->integer ) { int i; GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_DST_COLOR | GLS_DSTBLEND_ZERO ); for( i = 0; i < r_bloom_darken->integer; i++ ) { R_Bloom_Quad( bloom.work.width, bloom.work.height, 0, 0, bloom.effect.readW, bloom.effect.readH ); } qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); } # endif // Copy the result to the effect texture / GL_Bind( bloom.effect.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); } static void R_Bloom_CreateEffect( void ) { int dir, x; int range; //First step will zero dst, rest will one add GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ZERO ); // GL_Bind( bloom.screen.texture ); GL_Bind( bloom.effect.texture ); range = 4; for (dir = 0;dir < 2;dir++) { // blend on at multiple vertical offsets to achieve a vertical blur // TODO: do offset blends using GLSL for (x = -range;x <= range;x++) { float xoffset, yoffset, r; if (!dir){ xoffset = 0; yoffset = x*1.5; } else { xoffset = x*1.5; yoffset = 0; } xoffset /= bloom.work.width; yoffset /= bloom.work.height; // this r value looks like a 'dot' particle, fading sharply to // black at the edges // (probably not realistic but looks good enough) //r = ((range*range+1)/((float)(x*x+1)))/(range*2+1); //r = (dir ? 1.0f : brighten)/(range*2+1); r = 2.0f /(range*2+1)*(1 - x*x/(float)(range*range)); // r *= r_bloom_darken->value; qglColor4f(r, r, r, 1); R_Bloom_Quad( bloom.work.width, bloom.work.height, xoffset, yoffset, bloom.effect.readW, bloom.effect.readH ); // bloom.screen.readW, bloom.screen.readH ); GL_State( GLS_DEPTHTEST_DISABLE | GLS_SRCBLEND_ONE | GLS_DSTBLEND_ONE ); } } GL_Bind( bloom.effect.texture ); qglCopyTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 0, 0, bloom.work.width, bloom.work.height ); } # endif /* ================= R_BloomScreen ================= */ void R_BloomScreen( void ) { if( !r_bloom->integer ) return; if ( backEnd.doneBloom ) return; if ( !backEnd.doneSurfaces ) return; backEnd.doneBloom = qtrue; if( !bloom.started ) { R_Bloom_InitTextures(); if( !bloom.started ) return; } if ( !backEnd.projection2D ) RB_SetGL2D(); # if 0 // set up full screen workspace GL_TexEnv( GL_MODULATE ); qglScissor( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); qglViewport( 0, 0, glConfig.vidWidth, glConfig.vidHeight ); qglMatrixMode( GL_PROJECTION ); qglLoadIdentity (); qglOrtho( 0, glConfig.vidWidth, glConfig.vidHeight, 0, 0, 1 ); qglMatrixMode( GL_MODELVIEW ); qglLoadIdentity (); GL_Cull( CT_TWO_SIDED ); # endif qglColor4f( 1, 1, 1, 1 ); //Backup the old screen in a texture R_Bloom_BackupScreen(); // create the bloom texture using one of a few methods R_Bloom_WarsowEffect (); // R_Bloom_CreateEffect(); // restore the screen-backup to the screen R_Bloom_RestoreScreen(); // Do the final pass using the bloom texture for the final effect R_Bloom_DrawEffect (); } void R_BloomInit( void ) { memset( &bloom, 0, sizeof( bloom )); r_bloom = ri.Cvar_Get( "r_bloom", "0", CVAR_ARCHIVE ); r_bloom_alpha = ri.Cvar_Get( "r_bloom_alpha", "0.3", CVAR_ARCHIVE ); r_bloom_diamond_size = ri.Cvar_Get( "r_bloom_diamond_size", "8", CVAR_ARCHIVE ); r_bloom_intensity = ri.Cvar_Get( "r_bloom_intensity", "1.3", CVAR_ARCHIVE ); r_bloom_darken = ri.Cvar_Get( "r_bloom_darken", "4", CVAR_ARCHIVE ); r_bloom_sample_size = ri.Cvar_Get( "r_bloom_sample_size", "128", CVAR_ARCHIVE|CVAR_LATCH ); r_bloom_fast_sample = ri.Cvar_Get( "r_bloom_fast_sample", "0", CVAR_ARCHIVE|CVAR_LATCH ); } #endif [/code] My Makefile.local [code] #This file defines the standard variables used by Open Arena. COPYDIR="/usr/local/games/openarena" #We want openAL USE_OPENAL=1 #Next we want to bind openAL on runtime. SDL sound will be used if openAL is not installed USE_OPENAL_DLOPEN=1 ## Unlike upstream, we shouldn't set these (Debian version) # From Debian's build USE_CURL_DLOPEN=0 USE_OPENAL=1 USE_OPENAL_DLOPEN=0 USE_VOIP=1 BUILD_CLIENT_SMP=1 #USE_LOCAL_HEADERS=0 DEFAULT_BASEDIR=/usr/share/games/openarena # We want to build against the system's speex rather than this package's USE_INTERNAL_SPEEX=0 # NOTE: I have to use the internal JPEG library for some strange reason. # Debian's build disables it, but I get lots of graphics problems without it. # This is using the latest ioq3 source. USE_INTERNAL_JPEG=1 #We want vorbis support! USE_CODEC_VORBIS=1 #Open Arena is a standalone game BUILD_STANDALONE=1 #We don't want to build the game logic... only the engine BUILD_GAME_SO = 0 BUILD_GAME_QVM = 0 # Required options for standalone CFLAGS=-DOPEN_ARENA USE_BLOOM=0 GAME_DEDICATED_NAME=oa_ded GAME_CLIENT_NAME=openarena GAME_DIRECTORY_NAME=baseoa [/code]