rendered paste bodyThe 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 <speex/speex.h>
+# include <speex/speex_preprocess.h>
+#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 <speex/speex.h>
+# include <speex/speex_preprocess.h>
+#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 <speex/speex.h>
+# include <speex/speex_preprocess.h>
+# 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 <endian.h>
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 <jpeglib.h>
+# include <jerror.h>
+
+#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 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- version="1.0"
- width="64"
- height="64"
- id="svg1306">
- <defs
- id="defs1308">
- <linearGradient
- id="linearGradient2180">
- <stop
- style="stop-color:#ff0000;stop-opacity:1"
- offset="0"
- id="stop2182" />
- <stop
- style="stop-color:#590000;stop-opacity:1"
- offset="1"
- id="stop2184" />
- </linearGradient>
- <linearGradient
- x1="14.860399"
- y1="19.054131"
- x2="15.042735"
- y2="59"
- id="linearGradient2190"
- xlink:href="#linearGradient2180"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- x1="14.860399"
- y1="19.054131"
- x2="15.042735"
- y2="59"
- id="linearGradient2194"
- xlink:href="#linearGradient2180"
- gradientUnits="userSpaceOnUse" />
- <linearGradient
- x1="32"
- y1="64.091171"
- x2="32"
- y2="0"
- id="linearGradient3077"
- xlink:href="#linearGradient2180"
- gradientUnits="userSpaceOnUse" />
- </defs>
- <g
- id="layer1">
- <g
- id="g1327">
- <path
- d="M 34.538626,32.090265 L 32.538627,64 L 30.538626,32 L 32.538627,0 L 34.538626,32.090265 z "
- style="opacity:1;fill:url(#linearGradient3077);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5261631;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path1329" />
- <path
- d="M 28.059562,59 L 25.612281,34.036677 C 25.612281,34.036677 2.1281775,31.218199 2.0010765,25.064561 C 1.9155925,21.016997 6.9421265,19.095215 9.6946005,19.095215 C 12.000721,19.095215 4.2082195,19.143464 4.1713675,24.287073 C 4.1405475,28.679913 29.3599,30.346963 29.3599,30.346963 L 28.059562,59 z "
- style="fill:url(#linearGradient2190);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path1307" />
- <path
- d="M 36.940438,59 L 39.387719,34.036677 C 39.387719,34.036677 62.871823,31.218199 62.998924,25.064561 C 63.084408,21.016997 58.057873,19.095215 55.305399,19.095215 C 52.999279,19.095215 60.79178,19.143464 60.828632,24.287073 C 60.859452,28.679913 35.6401,30.346963 35.6401,30.346963 L 36.940438,59 z "
- style="fill:url(#linearGradient2194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- id="path2192" />
- </g>
- </g>
-</svg>
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="317.984px" height="239.988px" viewBox="0 0 317.984 239.988" enable-background="new 0 0 317.984 239.988"
+ xml:space="preserve">
+<polygon stroke="#000000" points="160.232,156.905 149.096,134.604 160.232,108.905 171.368,134.604 "/>
+<path stroke="#000000" d="M196.093,223.061h36.675c-6.949-3.088-11.195-9.266-11.195-9.266l-61.094-200.64L99.386,214.012
+ c0,0-4.247,6.177-11.196,9.266h36.675c0,0-8.133-4.373-11.466-8.373l47.08-166.108l47.081,165.892
+ C204.226,218.688,196.093,223.061,196.093,223.061z"/>
+<path stroke="#000000" d="M159.803,41.445c-79.848,0-144.578,25.235-144.578,56.364c0,27.275,49.692,50.023,115.705,55.239
+ l6.145-21.681C69.945,128.203,14.779,111.32,20.631,90.325c6.435-23.087,62.31-46.087,139.172-46.087
+ c76.863,0,134.93,24.667,139.173,46.087c4.205,21.229-48.878,37.722-115.079,40.987l6.137,21.623
+ c65.333-5.419,114.347-28.039,114.347-55.126C304.381,66.681,239.651,41.445,159.803,41.445z"/>
+</svg>
[/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]