fix some of the things that baker didn't like. sorry it took so long.
try to appease msvc6, just because. update the downloads menu. now even betterer!... fix proquake server angle snapping precision issue. also accept _glow textures as an alternative to the more standard _luma. compat for dp_water shader terms. tcgen stuff is still fscked up. menu tooltip code can now properly deal with variable width etc stuff. add missing te_flamejet builtin. r_dynamic -1 can now cope with q3bsp for a small speedup. added -watch commandline arg, to make it easier to figure out where cvar changes are coming from. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5015 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
8d2af6ff7b
commit
c08a0aa139
104 changed files with 3629 additions and 2828 deletions
140
engine/Makefile
140
engine/Makefile
|
@ -403,7 +403,7 @@ endif
|
|||
|
||||
SDL_INCLUDES=
|
||||
#-I$(LIBS_DIR)/sdl/include -I/usr/include/SDL -I$(LIBS_DIR)/sdl/include/SDL
|
||||
BOTLIB_CFLAGS=-I$(BOTLIB_DIR) -DBOTLIB
|
||||
BOTLIB_CFLAGS=-I$(BOTLIB_DIR) -DBOTLIB -DBOTLIB_STATIC
|
||||
BASE_CFLAGS=$(WARNINGFLAGS) $(GNUC_FUNCS) -I$(CLIENT_DIR) -I$(SERVER_DIR) -I$(COMMON_DIR) -I$(GL_DIR) -I$(D3D_DIR) -I$(PROGS_DIR) -I. -I$(LIBS_DIR) -I$(LIBS_DIR)/dxsdk9/include -I$(LIBS_DIR)/dxsdk7/include $(SDL_INCLUDES) -I./libs/freetype2/include -I./libs/freetype2/include/freetype -I./libs/speex $(BOTLIB_CFLAGS) $(SVNREVISION)
|
||||
CLIENT_ONLY_CFLAGS=-DCLIENTONLY
|
||||
SERVER_ONLY_CFLAGS=-DSERVERONLY
|
||||
|
@ -497,7 +497,6 @@ CLIENT_OBJS = \
|
|||
image.o \
|
||||
keys.o \
|
||||
menu.o \
|
||||
m_download.o \
|
||||
m_master.o \
|
||||
m_multi.o \
|
||||
m_items.o \
|
||||
|
@ -666,6 +665,7 @@ COMMON_OBJS = \
|
|||
fs_pak.o \
|
||||
fs_zip.o \
|
||||
fs_xz.o \
|
||||
m_download.o \
|
||||
mathlib.o \
|
||||
huff.o \
|
||||
md4.o \
|
||||
|
@ -738,9 +738,9 @@ endif
|
|||
SDLCONFIG?=sdl-config
|
||||
FTE_FULLTARGET?=sdl$(FTE_TARGET)$(BITS)
|
||||
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
|
||||
GL_EXE_NAME=../fteqw_gl$(FTE_FULLTARGET)
|
||||
GLCL_EXE_NAME=../fteqwcl_gl$(FTE_FULLTARGET)
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
|
||||
GL_EXE_NAME=../fteqw-gl$(FTE_FULLTARGET)
|
||||
GLCL_EXE_NAME=../fteqwcl-gl$(FTE_FULLTARGET)
|
||||
|
||||
#SDLCONFIG:=libs/sdl2_mingw/$(CC_MACHINE)/bin/sdl2-config --prefix=libs/sdl2_mingw/$(CC_MACHINE)
|
||||
ifdef windir
|
||||
|
@ -757,16 +757,16 @@ GLB_DIR=gl_$(FTE_FULLTARGET)
|
|||
GLCL_DIR=glcl_$(FTE_FULLTARGET)
|
||||
SV_DIR?=sv_$(FTE_FULLTARGET)
|
||||
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS)
|
||||
SV_EXE_NAME=../fteqw_sv$(FTE_FULLTARGET)
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS) $(BOTLIB_OBJS)
|
||||
SV_EXE_NAME=../fteqw-sv$(FTE_FULLTARGET)
|
||||
SV_CFLAGS=-DFTE_SDL `$(SDLCONFIG) --cflags` $(SERVER_ONLY_CFLAGS)
|
||||
|
||||
MINGL_DIR=mingl_$(FTE_FULLTARGET)
|
||||
MINGL_EXE_NAME=../fteqw_mingl$(FTE_FULLTARGET)
|
||||
MINGL_EXE_NAME=../fteqw-mingl$(FTE_FULLTARGET)
|
||||
|
||||
MB_DIR=m_$(FTE_FULLTARGET)
|
||||
M_EXE_NAME=../fteqw_$(FTE_FULLTARGET)
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
|
||||
M_EXE_NAME=../fteqw-$(FTE_FULLTARGET)
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o
|
||||
M_CFLAGS=-DFTE_SDL $(GLCFLAGS) `$(SDLCONFIG) --cflags`
|
||||
|
||||
QCC_DIR=qcc$(BITS)
|
||||
|
@ -827,7 +827,7 @@ ifeq ($(FTE_TARGET),nacl)
|
|||
GL_CFLAGS+=-I$(realpath $(NACL_SDK_ROOT)/include)
|
||||
BASELDFLAGS+=-L$(realpath $(NACL_SDK_ROOT)/lib/$(NACLLIBS))
|
||||
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SPEEX_OBJS) sys_ppapi.o cd_null.o gl_vidppapi.o fs_ppapi.o snd_ppapi.o
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) sys_ppapi.o cd_null.o gl_vidppapi.o fs_ppapi.o snd_ppapi.o
|
||||
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
M_LDFLAGS=$(GLLDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
|
@ -836,12 +836,12 @@ ifeq ($(FTE_TARGET),nacl)
|
|||
MINGL_DIR=mingl_nacl_$(NARCH)
|
||||
ifeq ($(NARCH),pnacl)
|
||||
GL_EXE_NAME=../fteqw.pexe
|
||||
GLCL_EXE_NAME=../fteqwcl.pexe
|
||||
MINGL_EXE_NAME=../fteqw_mingl.pexe
|
||||
GLCL_EXE_NAME=../fteqw-cl.pexe
|
||||
MINGL_EXE_NAME=../fteqw-mingl.pexe
|
||||
else
|
||||
GL_EXE_NAME=../fteqw_$(NARCH).nexe
|
||||
GLCL_EXE_NAME=../fteqwcl_$(NARCH).nexe
|
||||
MINGL_EXE_NAME=../fteqw_mingl_$(NARCH).nexe
|
||||
GL_EXE_NAME=../fteqw-$(NARCH).nexe
|
||||
GLCL_EXE_NAME=../fteqw-cl-$(NARCH).nexe
|
||||
MINGL_EXE_NAME=../fteqw-mingl-$(NARCH).nexe
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -862,8 +862,8 @@ ifeq (win_SDL,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
|
||||
#the defaults for sdl come first
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(LTO_END) resources.o $(LTO_START)
|
||||
GL_EXE_NAME=../fteqw_sdl_gl$(BITS)$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../fteqwcl_sdl$(BITS)$(EXEPOSTFIX)
|
||||
GL_EXE_NAME=../fteqw-sdl-gl$(BITS)$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../fteqw-sdl-glcl$(BITS)$(EXEPOSTFIX)
|
||||
ifdef windir
|
||||
GL_LDFLAGS=$(GLLDFLAGS) -lmingw32 -lws2_32 `$(SDLCONFIG) --static-libs`
|
||||
M_LDFLAGS=$(MLDFLAGS) -lmingw32 -lws2_32 `$(SDLCONFIG) --static-libs`
|
||||
|
@ -883,14 +883,14 @@ ifeq (win_SDL,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
GLCL_DIR=glcl_mgw_sdl$(BITS)
|
||||
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(WINDOWSSERVERONLY_OBJS) $(BOTLIB_OBJS) $(LTO_END) resources.o $(LTO_START)
|
||||
SV_EXE_NAME=../fteqw_sdl_sv$(BITS)$(EXEPOSTFIX)
|
||||
SV_EXE_NAME=../fteqw-sdl-sv$(BITS)$(EXEPOSTFIX)
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS) -DFTE_SDL
|
||||
|
||||
MINGL_DIR=mingl_sdlwin$(BITS)
|
||||
MINGL_EXE_NAME=../fteqw_sdl_mingl$(BITS)$(EXEPOSTFIX)
|
||||
MINGL_EXE_NAME=../fteqw-sdl-mingl$(BITS)$(EXEPOSTFIX)
|
||||
|
||||
MB_DIR=m_mgw_sdl$(BITS)
|
||||
M_EXE_NAME=../fteqw_sdl$(BITS)$(EXEPOSTFIX)
|
||||
M_EXE_NAME=../fteqw-sdl$(BITS)$(EXEPOSTFIX)
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(D3DQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidsdl.o snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(LTO_END) resources.o $(LTO_START)
|
||||
M_CFLAGS=$(D3DCFLAGS) -DFTE_SDL -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) $(GLCFLAGS) -DLIBVORBISFILE_STATIC -D_MERGED_SDL $(DX7SDK) $(SPEEXCFLAGS)
|
||||
|
||||
|
@ -901,9 +901,9 @@ ifeq (win_SDL,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
M_LDFLAGS=$(GLLDFLAGS) $(IMAGELDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
|
||||
|
||||
D3DCL_OBJS=$(D3DQUAKE_OBJS) $(SPEEX_OBJS) snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(D3DGL_OBJS) $(LTO_END) resources.o $(LTO_START)
|
||||
D3D_EXE_NAME=../fted3d_sdl_qw$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_EXE_NAME=../fted3d_sdl_clqw$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_OBJS=$(D3DQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(D3DGL_OBJS) $(LTO_END) resources.o $(LTO_START)
|
||||
D3D_EXE_NAME=../fteqw-sdl-d3d$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_EXE_NAME=../fteqw-sdl-d3dcl$(BITS)$(EXEPOSTFIX)
|
||||
D3D_LDFLAGS=$(IMAGELDFLAGS) $(OGGVORBISLDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32
|
||||
D3D_CFLAGS=$(D3DCFLAGS) -DFTE_SDL -DNO_XFLIP -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) -DLIBVORBISFILE_STATIC $(DX7SDK) $(SPEEXCFLAGS)
|
||||
ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win32.*sdl"),)
|
||||
|
@ -913,9 +913,9 @@ ifeq (win_SDL,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
D3DCL_DIR=sdl_d3dcl_mgw$(BITS)
|
||||
|
||||
|
||||
VKCL_OBJS=$(D3DQUAKE_OBJS) $(SPEEX_OBJS) snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(D3DGL_OBJS) $(LTO_END) resources.o $(LTO_START)
|
||||
VK_EXE_NAME=../ftevk_sdl_qw$(BITS)$(EXEPOSTFIX)
|
||||
VKCL_EXE_NAME=../ftevk_sdl_clqw$(BITS)$(EXEPOSTFIX)
|
||||
VKCL_OBJS=$(D3DQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) snd_sdl.o cd_sdl.o sys_sdl.o in_sdl.o snd_directx.o $(D3DGL_OBJS) $(LTO_END) resources.o $(LTO_START)
|
||||
VK_EXE_NAME=../fteqw-sdl-vk$(BITS)$(EXEPOSTFIX)
|
||||
VKCL_EXE_NAME=../fteqw-sdl-vkcl$(BITS)$(EXEPOSTFIX)
|
||||
VK_LDFLAGS=$(IMAGELDFLAGS) $(OGGVORBISLDFLAGS) -lws2_32 -lmingw32 $(SDL_LDFLAGS) -mwindows -ldxguid -lwinmm -lole32
|
||||
VK_CFLAGS=$(VKCFLAGS) -DFTE_SDL -DNO_XFLIP -I$(LIBS_DIR) -I$(MINGW_LIBS_DIR)/ -I$(MINGW_LIBS_DIR) -DLIBVORBISFILE_STATIC $(DX7SDK) $(SPEEXCFLAGS)
|
||||
ifeq ($(shell echo $(FTE_TARGET)|grep -E -i -v "win32.*sdl"),)
|
||||
|
@ -994,13 +994,13 @@ ifeq ($(FTE_TARGET),vc)
|
|||
BASE_CFLAGS:=$(WARNINGFLAGS) $(GNUC_FUNCS) -I$(shell cygpath -m $(CLIENT_DIR)) -I$(shell cygpath -m $(SERVER_DIR)) -I$(shell cygpath -m $(COMMON_DIR)) -I$(shell cygpath -m $(GL_DIR)) -I$(shell cygpath -m $(D3D_DIR)) -I$(shell cygpath -m $(PROGS_DIR)) -I. -I$(LIBS_DIR) -I$(LIBS_DIR)/dxsdk9/include -I$(LIBS_DIR)/dxsdk7/include $(SDL_INCLUDES) -I./libs/freetype2/include -I./libs/freetype2/include/freetype -I./libs/speex $(BOTLIB_CFLAGS) $(SVNREVISION)
|
||||
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS) $(W32_CFLAGS) -DMULTITHREAD -DMSVCLIBPATH=libs/
|
||||
SV_EXE_NAME=../fteqwsv$(BITS)$(EXEPOSTFIX)
|
||||
SV_EXE_NAME=../fteqw-sv$(BITS)$(EXEPOSTFIX)
|
||||
SV_DIR=sv_vc$(BITS)
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(WINDOWSSERVERONLY_OBJS) fs_win32.o resources.o
|
||||
SV_LDFLAGS=/subsystem:console
|
||||
|
||||
GL_EXE_NAME=../fteglqw$(BITS)$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../minfteqw.gl$(BITS)
|
||||
GL_EXE_NAME=../fteqw-gl$(BITS)$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../fteqw-mingl$(BITS)
|
||||
GLB_DIR=gl_vc$(BITS)
|
||||
GLCL_DIR=glcl_vc$(BITS)
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(JPEGLIB) libs/libpng$(BITS).lib uuid.lib gdi32.lib ole32.lib /subsystem:windows
|
||||
|
@ -1009,11 +1009,11 @@ ifeq ($(FTE_TARGET),vc)
|
|||
GL_OBJS=
|
||||
|
||||
MINGL_DIR=mingl_vc$(BITS)
|
||||
MINGL_EXE_NAME=../fteminglqw$(BITS)$(EXEPOSTFIX)
|
||||
MINGL_EXE_NAME=../fteqw-mingl$(BITS)$(EXEPOSTFIX)
|
||||
|
||||
D3DCL_OBJS=$(D3DQUAKE_OBJS) $(D3DGL_OBJS) $(SPEEX_OBJS) $(WINDOWS_OBJS)
|
||||
D3D_EXE_NAME=../fted3dqw$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_EXE_NAME=../fted3dclqw$(BITS)$(EXEPOSTFIX)
|
||||
D3D_EXE_NAME=../fteqw-d3d$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_EXE_NAME=../fteqw-d3dcl$(BITS)$(EXEPOSTFIX)
|
||||
D3D_LDFLAGS=$(JPEGLIB) libs/libpng$(BITS).lib uuid.lib gdi32.lib ole32.lib /subsystem:windows
|
||||
D3D_CFLAGS=$(D3DCFLAGS) $(W32_CFLAGS) $(DX7SDK) -DMULTITHREAD $(SPEEXCFLAGS) -DMSVCLIBPATH=libs/
|
||||
D3DB_DIR=d3d_vc$(BITS)
|
||||
|
@ -1081,7 +1081,7 @@ ifeq (win,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
MB_DIR=m_mgw$(BITS)
|
||||
MCL_DIR=mcl_mgw$(BITS)
|
||||
|
||||
D3DCL_OBJS=$(D3DQUAKE_OBJS) $(D3DGL_OBJS) $(SPEEX_OBJS) $(WINDOWS_OBJS)
|
||||
D3DCL_OBJS=$(D3DQUAKE_OBJS) $(D3DGL_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) $(WINDOWS_OBJS)
|
||||
D3D_EXE_NAME=../fted3dqw$(BITS)$(EXEPOSTFIX)
|
||||
D3DCL_EXE_NAME=../fted3dclqw$(BITS)$(EXEPOSTFIX)
|
||||
D3D_LDFLAGS=$(IMAGELDFLAGS) $(OGGVORBISLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 -Wl,--subsystem,windows
|
||||
|
@ -1089,7 +1089,7 @@ ifeq (win,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
D3DB_DIR=d3d_mgw$(BITS)
|
||||
D3DCL_DIR=d3dcl_mgw$(BITS)
|
||||
|
||||
VKCL_OBJS=$(GLQUAKE_OBJS) $(D3DGL_OBJS) $(SPEEX_OBJS) $(WINDOWS_OBJS) vk_win32.o
|
||||
VKCL_OBJS=$(GLQUAKE_OBJS) $(D3DGL_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) $(WINDOWS_OBJS) vk_win32.o
|
||||
VK_EXE_NAME=../ftevkqw$(BITS)$(EXEPOSTFIX)
|
||||
VKCL_EXE_NAME=../ftevkclqw$(BITS)$(EXEPOSTFIX)
|
||||
VK_LDFLAGS=$(IMAGELDFLAGS) $(OGGVORBISLDFLAGS) -ldxguid -lws2_32 -lwinmm -lgdi32 -lole32 -Wl,--subsystem,windows
|
||||
|
@ -1101,12 +1101,12 @@ ifeq (win,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
|
|||
MINGL_DIR=mingl_mgw$(BITS)
|
||||
|
||||
ifeq ($(NOCOMPAT),1)
|
||||
SV_EXE_NAME=../engine_sv$(BITS)$(EXEPOSTFIX)
|
||||
GL_EXE_NAME=../engine_gl$(BITS)$(EXEPOSTFIX)
|
||||
VK_EXE_NAME=../engine_vk$(BITS)$(EXEPOSTFIX)
|
||||
SV_EXE_NAME=../engine-sv$(BITS)$(EXEPOSTFIX)
|
||||
GL_EXE_NAME=../engine-gl$(BITS)$(EXEPOSTFIX)
|
||||
VK_EXE_NAME=../engine-vk$(BITS)$(EXEPOSTFIX)
|
||||
M_EXE_NAME=../engine$(BITS)$(EXEPOSTFIX)
|
||||
D3D_EXE_NAME=../engine_d3d$(BITS)$(EXEPOSTFIX)
|
||||
MINGL_EXE_NAME=../engine_cl_gl$(BITS)$(EXEPOSTFIX)
|
||||
D3D_EXE_NAME=../engine-d3d$(BITS)$(EXEPOSTFIX)
|
||||
MINGL_EXE_NAME=../engine-mingl$(BITS)$(EXEPOSTFIX)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -1119,8 +1119,8 @@ ifeq ($(FTE_TARGET),bsd)
|
|||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS)
|
||||
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) gl_vidlinuxglx.o snd_linux.o cd_null.o sys_linux.o sys_linux_threads.o
|
||||
GL_EXE_NAME=../fteqw.gl
|
||||
GLCL_EXE_NAME=../fteqwcl.gl
|
||||
GL_EXE_NAME=../fteqw-gl
|
||||
GLCL_EXE_NAME=../fteqw-glcl
|
||||
GL_LDFLAGS= -L/usr/local/lib $(GLLDFLAGS) $(XLDFLAGS) -lpthread
|
||||
GL_CFLAGS=$(GLCFLAGS) -I/usr/local/include -I/usr/X11R6/include
|
||||
GLB_DIR=gl_bsd
|
||||
|
@ -1128,18 +1128,18 @@ ifeq ($(FTE_TARGET),bsd)
|
|||
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) gl_vidlinuxglx.o snd_linux.o cd_null.o sys_linux.o sys_linux_threads.o
|
||||
M_EXE_NAME=../fteqw
|
||||
MCL_EXE_NAME=../fteqwcl
|
||||
MCL_EXE_NAME=../fteqw-cl
|
||||
M_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) -lpthread
|
||||
M_CFLAGS=$(VKCFLAGS) $(GLCFLAGS) -I/usr/X11R6/include
|
||||
MB_DIR=m_bsd
|
||||
MCL_DIR=mcl_bsd
|
||||
|
||||
MINGL_EXE_NAME=../fteqw.mingl
|
||||
MINGL_EXE_NAME=../fteqw-mingl
|
||||
MINGL_DIR=mingl_bsd
|
||||
endif
|
||||
ifneq (,$(findstring linux,$(FTE_TARGET)))
|
||||
SV_DIR=sv_linux$(BITS)
|
||||
SV_EXE_NAME=../fteqw.sv$(BITS)
|
||||
SV_EXE_NAME=../fteqw-sv$(BITS)
|
||||
SV_LDFLAGS=
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS) -DMULTITHREAD
|
||||
|
||||
|
@ -1152,16 +1152,16 @@ ifneq (,$(findstring linux,$(FTE_TARGET)))
|
|||
NPFTEB_DIR=npfte_linux$(BITS)
|
||||
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) vid_headless.o gl_vidlinuxglx.o gl_videgl.o snd_alsa.o snd_linux.o snd_sdl.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
GL_EXE_NAME=../fteqw.gl$(BITS)
|
||||
GLCL_EXE_NAME=../fteqwcl.gl$(BITS)
|
||||
GL_EXE_NAME=../fteqw-gl$(BITS)
|
||||
GLCL_EXE_NAME=../fteqw-glcl$(BITS)
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
GL_CFLAGS=$(GLCFLAGS) -I/usr/X11R6/include $(SPEEXCFLAGS) -DMULTITHREAD -DLIBVORBISFILE_STATIC -DDYNAMIC_LIBPNG -DDYNAMIC_LIBJPEG -DDYNAMIC_SDL
|
||||
GLB_DIR=gl_linux$(BITS)
|
||||
GLCL_DIR=glcl_linux$(BITS)
|
||||
|
||||
VKCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o gl_videgl.o snd_alsa.o snd_linux.o snd_sdl.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
VK_EXE_NAME=../fteqw_vk$(BITS)
|
||||
VKCL_EXE_NAME=../fteqwcl_vk$(BITS)
|
||||
VK_EXE_NAME=../fteqw-vk$(BITS)
|
||||
VKCL_EXE_NAME=../fteqw-vkcl$(BITS)
|
||||
VK_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS)
|
||||
VK_CFLAGS=$(VKCFLAGS) -I/usr/X11R6/include $(SPEEXCFLAGS) -DMULTITHREAD -DLIBVORBISFILE_STATIC -DDYNAMIC_LIBPNG -DDYNAMIC_LIBJPEG -DDYNAMIC_SDL
|
||||
VKB_DIR=vk_linux$(BITS)
|
||||
|
@ -1169,7 +1169,7 @@ ifneq (,$(findstring linux,$(FTE_TARGET)))
|
|||
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o gl_videgl.o snd_linux.o snd_sdl.o snd_alsa.o cd_linux.o sys_linux.o sys_linux_threads.o
|
||||
M_EXE_NAME=../fteqw$(BITS)
|
||||
MCL_EXE_NAME=../fteqwcl$(BITS)
|
||||
MCL_EXE_NAME=../fteqw-cl$(BITS)
|
||||
M_LDFLAGS=$(GL_LDFLAGS)
|
||||
M_CFLAGS=$(VKCFLAGS) $(GL_CFLAGS)
|
||||
MB_DIR=m_linux$(BITS)
|
||||
|
@ -1185,7 +1185,7 @@ ifneq (,$(findstring linux,$(FTE_TARGET)))
|
|||
endif
|
||||
|
||||
|
||||
MINGL_EXE_NAME=../fteqw.mingl$(BITS)
|
||||
MINGL_EXE_NAME=../fteqw-mingl$(BITS)
|
||||
MINGL_DIR=mingl_linux$(BITS)
|
||||
|
||||
endif
|
||||
|
@ -1221,17 +1221,17 @@ ifneq ($(shell echo $(FTE_TARGET)|grep macosx),)
|
|||
endif
|
||||
|
||||
GL_LDFLAGS=-framework AGL -framework OpenGL -framework Cocoa -framework AudioUnit -lz -lpng -ljpeg
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) gl_vidcocoa.mo gl_vidmacos.o sys_linux.o cd_null.o snd_macos.o sys_linux_threads.o
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) gl_vidcocoa.mo gl_vidmacos.o sys_linux.o cd_null.o snd_macos.o sys_linux_threads.o
|
||||
|
||||
GL_EXE_NAME=../macosx_fteqw.gl$(EXTENSION)$(BITS)
|
||||
GLCL_EXE_NAME=../macosx_fteqwcl.gl$(EXTENSION)$(BITS)
|
||||
M_EXE_NAME=../macosx_fteqw$(EXTENSION)$(BITS)
|
||||
MCL_EXE_NAME=../macosx_fteqwcl$(EXTENSION)$(BITS)
|
||||
MINGL_EXE_NAME=../macosx_fteqw.mingl$(EXTENSION)$(BITS)
|
||||
GL_EXE_NAME=../fteqw-macosx-gl$(EXTENSION)$(BITS)
|
||||
GLCL_EXE_NAME=../fteqwcl-macosx-gl$(EXTENSION)$(BITS)
|
||||
M_EXE_NAME=../fteqw-macosx$(EXTENSION)$(BITS)
|
||||
MCL_EXE_NAME=../fteqw-macosx-cl$(EXTENSION)$(BITS)
|
||||
MINGL_EXE_NAME=../fteqw-macosx-mingl$(EXTENSION)$(BITS)
|
||||
MINGL_DIR=mingl_macosx$(EXTENSION)$(BITS)
|
||||
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS)
|
||||
SV_EXE_NAME=../macosx_fteqw.sv$(EXTENSION)$(BITS)
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(BOTLIB_OBJS) $(SERVERONLY_OBJS)
|
||||
SV_EXE_NAME=../fteqw-macosx-sv$(EXTENSION)$(BITS)
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS)
|
||||
SV_LDFLAGS=-lz
|
||||
|
||||
|
@ -1249,26 +1249,26 @@ ifeq ($(FTE_TARGET),morphos)
|
|||
OGGVORBISLDFLAGS=
|
||||
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) gl_vidmorphos.o in_morphos.o snd_morphos.o cd_null.o sys_morphos.o
|
||||
GL_EXE_NAME=../morphos_fteqw.gl
|
||||
GLCL_EXE_NAME=../morphos_fteqwcl.gl
|
||||
GL_EXE_NAME=../fteqw-morphos-gl
|
||||
GLCL_EXE_NAME=../fteqw-morphos-glcl
|
||||
GL_LDFLAGS=$(GLLDFLAGS) -ldl $(IMAGELDFLAGS) -lz
|
||||
GL_CFLAGS=$(GLCFLAGS) -noixemul -I./libs/speex -I./
|
||||
GLB_DIR=gl_morphos
|
||||
GLCL_DIR=glcl_morphos
|
||||
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) gl_vidmorphos.o vid_morphos.o in_morphos.o snd_morphos.o cd_null.o sys_morphos.o
|
||||
M_EXE_NAME=../morphos_fteqw
|
||||
MCL_EXE_NAME=../morphos_fteqwcl
|
||||
M_EXE_NAME=../fteqw-morphos
|
||||
MCL_EXE_NAME=../fteqw-morphos-cl
|
||||
M_LDFLAGS=$(GLLDFLAGS)
|
||||
M_CFLAGS=$(GLCFLAGS)
|
||||
MB_DIR=m_morphos
|
||||
MCL_DIR=mcl_morphos
|
||||
|
||||
MINGL_EXE_NAME=../morphos_fteqw.mingl
|
||||
MINGL_EXE_NAME=../fteqw-morphos-mingl
|
||||
MINGL_DIR=mingl_morphos
|
||||
|
||||
SV_OBJS=$(COMMON_OBJS) $(SERVER_OBJS) $(PROGS_OBJS) $(SERVERONLY_OBJS) $(BOTLIB_OBJS)
|
||||
SV_EXE_NAME=../morphos_fteqw.sv$(BITS)
|
||||
SV_EXE_NAME=../fteqw-morphos-sv$(BITS)
|
||||
SV_CFLAGS=$(SERVER_ONLY_CFLAGS)
|
||||
endif
|
||||
|
||||
|
@ -1280,16 +1280,16 @@ ifeq ($(FTE_TARGET),cyg)
|
|||
|
||||
EXEPOSTFIX=.exe
|
||||
GLCL_OBJS=$(GL_OBJS) $(D3DGL_OBJS) $(GLQUAKE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o snd_linux.o cd_null.o sys_linux.o sys_linux_threads.o
|
||||
GL_EXE_NAME=../fteqwglcyg$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../fteqwclglcyg$(EXEPOSTFIX)
|
||||
GL_EXE_NAME=../fteqw-cyg-gl$(EXEPOSTFIX)
|
||||
GLCL_EXE_NAME=../fteqw-cyg-glcl$(EXEPOSTFIX)
|
||||
GL_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS) -lz -lltdl
|
||||
GL_CFLAGS=$(GLCFLAGS) -I/usr/X11R6/include $(SPEEXCFLAGS) -DLIBVORBISFILE_STATIC -DUSE_LIBTOOL
|
||||
GLB_DIR=gl_cygwin
|
||||
GLCL_DIR=glcl_cygwin
|
||||
|
||||
MCL_OBJS=$(D3DGL_OBJS) $(GLQUAKE_OBJS) $(SOFTWARE_OBJS) $(BOTLIB_OBJS) $(SPEEX_OBJS) gl_vidlinuxglx.o snd_linux.o cd_null.o sys_linux.o sys_linux_threads.o
|
||||
M_EXE_NAME=../fteqwcyg$(EXEPOSTFIX)
|
||||
MCL_EXE_NAME=../fteqwclcyg$(EXEPOSTFIX)
|
||||
M_EXE_NAME=../fteqw-cyg$(EXEPOSTFIX)
|
||||
MCL_EXE_NAME=../fteqw-cyg-cl$(EXEPOSTFIX)
|
||||
M_LDFLAGS=$(GLLDFLAGS) $(XLDFLAGS) $(OGGVORBISLDFLAGS) -lz -lltdl
|
||||
M_CFLAGS=$(GLCFLAGS) $(SPEEXCFLAGS) -DLIBVORBISFILE_STATIC -DUSE_LIBTOOL
|
||||
MB_DIR=m_cygwin
|
||||
|
@ -1297,7 +1297,7 @@ ifeq ($(FTE_TARGET),cyg)
|
|||
|
||||
LIBS_DIR = $(BASE_DIR)/libs
|
||||
|
||||
MINGL_EXE_NAME=../fteqwminglcyg$(EXEPOSTFIX)
|
||||
MINGL_EXE_NAME=../fteqw-cyg-mingl$(EXEPOSTFIX)
|
||||
MINGL_DIR=mingl_cygwin
|
||||
endif
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ cvar_t cl_pure = CVARD("cl_pure", "0", "0=standard quake rules.\n1=clients shou
|
|||
cvar_t cl_sbar = CVARFC("cl_sbar", "0", CVAR_ARCHIVE, CL_Sbar_Callback);
|
||||
cvar_t cl_hudswap = CVARF("cl_hudswap", "0", CVAR_ARCHIVE);
|
||||
cvar_t cl_maxfps = CVARF("cl_maxfps", "500", CVAR_ARCHIVE);
|
||||
cvar_t cl_idlefps = CVARFD("cl_idlefps", "0", CVAR_ARCHIVE, "This is the maximum framerate to attain while idle/paused.");
|
||||
cvar_t cl_idlefps = CVARFD("cl_idlefps", "0", CVAR_ARCHIVE, "This is the maximum framerate to attain while idle/paused/unfocused.");
|
||||
cvar_t cl_yieldcpu = CVARFD("cl_yieldcpu", "0", CVAR_ARCHIVE, "Attempt to yield between frames. This can resolve issues with certain drivers and background software, but can mean less consistant frame times. Will reduce power consumption/heat generation so should be set on laptops or similar (over-hot/battery powered) devices.");
|
||||
cvar_t cl_nopext = CVARF("cl_nopext", "0", CVAR_ARCHIVE);
|
||||
cvar_t cl_pext_mask = CVAR("cl_pext_mask", "0xffffffff");
|
||||
|
@ -2070,6 +2070,13 @@ void CL_CheckServerInfo(void)
|
|||
cl.maxpitch = *s ? Q_atof(s) : 80.0f;
|
||||
s = (cls.z_ext & Z_EXT_PITCHLIMITS) ? Info_ValueForKey (cl.serverinfo, "minpitch") : "";
|
||||
cl.minpitch = *s ? Q_atof(s) : -70.0f;
|
||||
|
||||
if (cls.protocol == CP_NETQUAKE)
|
||||
{ //proquake likes spamming us with fixangles
|
||||
float div = cls.proquake_angles_hack?65536:256;
|
||||
cl.maxpitch -= 1.0/2048;
|
||||
cl.minpitch -= 0.5/div;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -4257,7 +4264,7 @@ void Host_WriteConfiguration (void)
|
|||
{
|
||||
if (strchr(cfg_save_name.string, '.'))
|
||||
{
|
||||
Con_TPrintf ("Couldn't write config.cfg.\n");
|
||||
Con_TPrintf (CON_ERROR "Couldn't write config.cfg.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4266,7 +4273,7 @@ void Host_WriteConfiguration (void)
|
|||
f = FS_OpenVFS(savename, "wb", FS_GAMEONLY);
|
||||
if (!f)
|
||||
{
|
||||
Con_TPrintf ("Couldn't write config.cfg.\n");
|
||||
Con_TPrintf (CON_ERROR "Couldn't write config.cfg.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5507,6 +5514,9 @@ void CL_ExecInitialConfigs(char *resetcommand)
|
|||
Cbuf_AddText("cl_warncmd 0\n", RESTRICT_LOCAL);
|
||||
Cbuf_AddText("cvar_purgedefaults\n", RESTRICT_LOCAL); //reset cvar defaults to their engine-specified values. the tail end of 'exec default.cfg' will update non-cheat defaults to mod-specified values.
|
||||
Cbuf_AddText("cvarreset *\n", RESTRICT_LOCAL); //reset all cvars to their current (engine) defaults
|
||||
#ifndef CLIENTONLY
|
||||
Cbuf_AddText(va("sv_gamedir \"%s\"\n", FS_GetGamedir(true)), RESTRICT_LOCAL);
|
||||
#endif
|
||||
Cbuf_AddText(resetcommand, RESTRICT_LOCAL);
|
||||
Cbuf_AddText("\n", RESTRICT_LOCAL);
|
||||
COM_ParsePlusSets(true);
|
||||
|
@ -5630,6 +5640,8 @@ void Host_FinishLoading(void)
|
|||
#endif
|
||||
|
||||
r_blockvidrestart = 2;
|
||||
|
||||
Menu_Download_Update();
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
|
@ -5734,6 +5746,7 @@ void Host_Init (quakeparms_t *parms)
|
|||
|
||||
R_SetRenderer(NULL);//set the renderer stuff to unset...
|
||||
|
||||
Cvar_ParseWatches();
|
||||
host_initialized = true;
|
||||
forcesaveprompt = false;
|
||||
|
||||
|
@ -5816,6 +5829,7 @@ void Host_Shutdown(void)
|
|||
Validation_FlushFileList();
|
||||
|
||||
Cmd_Shutdown();
|
||||
PM_Shutdown();
|
||||
Key_Unbindall_f();
|
||||
|
||||
#ifdef PLUGINS
|
||||
|
|
|
@ -1752,10 +1752,6 @@ int CL_DownloadRate(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
|
||||
//called when the server acks the download. opens the local file and stuff. returns false on failure
|
||||
qboolean DL_Begun(qdownload_t *dl)
|
||||
{
|
||||
|
|
|
@ -460,7 +460,7 @@ static qintptr_t VARGS Plug_LocalSound(void *offset, quintptr_t mask, const qint
|
|||
|
||||
static qintptr_t VARGS Plug_CL_GetStats(void *offset, quintptr_t mask, const qintptr_t *arg)
|
||||
{
|
||||
int i;
|
||||
int i = 0;
|
||||
int pnum = VM_LONG(arg[0]);
|
||||
unsigned int *stats = VM_POINTER(arg[1]);
|
||||
int pluginstats = VM_LONG(arg[2]);
|
||||
|
@ -475,10 +475,24 @@ static qintptr_t VARGS Plug_CL_GetStats(void *offset, quintptr_t mask, const qin
|
|||
max = pluginstats;
|
||||
if (max > MAX_CL_STATS)
|
||||
max = MAX_CL_STATS;
|
||||
for (i = 0; i < max; i++)
|
||||
{ //fill stats with the right player's stats
|
||||
stats[i] = cl.playerview[pnum].stats[i];
|
||||
if (pnum < 0)
|
||||
{
|
||||
pnum = -pnum-1;
|
||||
if (pnum < MAX_CLIENTS)
|
||||
{
|
||||
for (i = 0; i < max; i++)
|
||||
stats[i] = cl.players[pnum].stats[i];
|
||||
}
|
||||
}
|
||||
else if (pnum < cl.splitclients)
|
||||
{
|
||||
for (i = 0; i < max; i++)
|
||||
{ //fill stats with the right player's stats
|
||||
stats[i] = cl.playerview[pnum].stats[i];
|
||||
}
|
||||
}
|
||||
|
||||
max = i;
|
||||
for (; i < pluginstats; i++) //plugin has too many stats (wow)
|
||||
stats[i] = 0; //fill the rest.
|
||||
return max;
|
||||
|
@ -837,8 +851,6 @@ static qintptr_t VARGS Plug_GetWeaponStats(void *offset, quintptr_t mask, const
|
|||
struct wstats_s *result = VM_POINTER(arg[1]);
|
||||
size_t maxresults = VM_LONG(arg[2]);
|
||||
|
||||
int i;
|
||||
|
||||
if (VM_OOB(arg[0], maxresults*sizeof(*result)))
|
||||
return 0;
|
||||
|
||||
|
@ -855,8 +867,8 @@ static qintptr_t VARGS Plug_GetWeaponStats(void *offset, quintptr_t mask, const
|
|||
if (self < 0)
|
||||
return 0;
|
||||
|
||||
if (maxresults > countof(cl.players[i].weaponstats))
|
||||
maxresults = countof(cl.players[i].weaponstats);
|
||||
if (maxresults > countof(cl.players[self].weaponstats))
|
||||
maxresults = countof(cl.players[self].weaponstats);
|
||||
memcpy(result, cl.players[self].weaponstats, sizeof(*result) * maxresults);
|
||||
return VM_LONG(maxresults);
|
||||
}
|
||||
|
|
|
@ -548,16 +548,16 @@ void VARGS Stats_Message(char *msg, ...)
|
|||
p->time_start = cl.time;
|
||||
}
|
||||
|
||||
#define MAX_CPRINT_LINES 128
|
||||
#define MAX_CPRINT_LINES 256
|
||||
void SCR_DrawCenterString (vrect_t *rect, cprint_t *p, struct font_s *font)
|
||||
{
|
||||
int l;
|
||||
int y, x;
|
||||
int l;
|
||||
int y, x;
|
||||
int left;
|
||||
int right;
|
||||
int top;
|
||||
int bottom;
|
||||
int remaining;
|
||||
int remaining;
|
||||
shader_t *pic;
|
||||
|
||||
conchar_t *line_start[MAX_CPRINT_LINES];
|
||||
|
@ -1609,6 +1609,11 @@ void SCR_DrawPause (void)
|
|||
if (!cl.paused)
|
||||
return;
|
||||
|
||||
#ifndef CLIENTONLY
|
||||
if (sv.active && sv.paused == PAUSE_AUTO)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (Key_Dest_Has(kdm_emenu) || Key_Dest_Has(kdm_gmenu))
|
||||
return;
|
||||
|
||||
|
@ -2337,7 +2342,7 @@ static void SCR_ScreenShot_f (void)
|
|||
}
|
||||
BZ_Free(rgbbuffer);
|
||||
}
|
||||
Con_Printf ("Couldn't write %s\n", sysname);
|
||||
Con_Printf (CON_ERROR "Couldn't write %s\n", sysname);
|
||||
}
|
||||
|
||||
void *SCR_ScreenShot_Capture(int fbwidth, int fbheight, enum uploadfmt *fmt)
|
||||
|
@ -2667,8 +2672,9 @@ static void SCR_DrawCharToSnap (int num, qbyte *dest, int width)
|
|||
|
||||
if (!draw_chars)
|
||||
{
|
||||
draw_chars = W_SafeGetLumpName("conchars");
|
||||
if (!draw_chars)
|
||||
size_t lumpsize;
|
||||
draw_chars = W_SafeGetLumpName("conchars", &lumpsize);
|
||||
if (!draw_chars || lumpsize != 128*128)
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -2681,7 +2687,7 @@ static void SCR_DrawCharToSnap (int num, qbyte *dest, int width)
|
|||
while (drawline--)
|
||||
{
|
||||
for (x=0 ; x<8 ; x++)
|
||||
if (source[x]!=255)
|
||||
if (source[x] && source[x]!=255)
|
||||
dest[x] = source[x];
|
||||
source += 128;
|
||||
dest -= width;
|
||||
|
|
|
@ -12,22 +12,22 @@ struct hlcvar_s *QDECL GHL_CVarGetPointer(char *varname);
|
|||
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
#if _MSC_VER >= 1300
|
||||
#define __func__ __FUNCTION__
|
||||
#else
|
||||
#define __func__ "unknown"
|
||||
#endif
|
||||
# if _MSC_VER >= 1300
|
||||
# define __func__ __FUNCTION__
|
||||
# else
|
||||
# define __func__ "unknown"
|
||||
# endif
|
||||
#else
|
||||
//I hope you're c99 and have a __func__
|
||||
//I hope you're c99 and have a __func__
|
||||
#endif
|
||||
|
||||
extern cvar_t temp1;
|
||||
//extern cvar_t temp1;
|
||||
#define ignore(s) Con_Printf("Fixme: " s "\n")
|
||||
#define notimpl(l) Con_Printf("halflife cl builtin not implemented on line %i\n", l)
|
||||
#define notimpf(f) Con_Printf("halflife cl builtin %s not implemented\n", f)
|
||||
#define notimp() Con_Printf("halflife cl builtin %s not implemented\n", __func__)
|
||||
#define bi_begin() if (temp1.ival)Con_Printf("enter %s\n", __func__)
|
||||
#define bi_end() if (temp1.ival)Con_Printf("leave %s\n", __func__)
|
||||
#define bi_begin() //if (temp1.ival)Con_Printf("enter %s\n", __func__)
|
||||
#define bi_end() //if (temp1.ival)Con_Printf("leave %s\n", __func__)
|
||||
#define bi_trace() bi_begin(); bi_end()
|
||||
|
||||
#if HLCLIENT >= 1
|
||||
|
@ -1443,12 +1443,9 @@ int CLHL_ParseGamePacket(void)
|
|||
int flags;
|
||||
int lifetime;
|
||||
explosion_t *ef;
|
||||
extern cvar_t temp1;
|
||||
|
||||
subcode = MSG_ReadByte();
|
||||
|
||||
if (temp1.value)
|
||||
Con_Printf("Temp ent %i\n", subcode);
|
||||
switch(subcode)
|
||||
{
|
||||
case 3:
|
||||
|
|
|
@ -4,6 +4,11 @@
|
|||
#ifdef Q2CLIENT
|
||||
#include "shader.h"
|
||||
|
||||
//q2pro's framerate scaling runs the entire server at a higher rate (including gamecode).
|
||||
//this allows lower latency on player movements without breaking things too much
|
||||
//animations are still assumed to run at 10fps, so those need some fixup too
|
||||
//events are keyed to not renew twice within the same 10fps window, unless the entity was actually updated.
|
||||
|
||||
extern cvar_t r_drawviewmodel;
|
||||
|
||||
extern cvar_t cl_nopred;
|
||||
|
|
|
@ -1257,7 +1257,7 @@ int Con_DrawInput (console_t *con, qboolean focused, int left, int right, int y,
|
|||
textstart[p+cmdstart] = (unsigned int)fname[p] | (COLOR_GREEN<<CON_FGSHIFT);
|
||||
if (p < key_linepos-cmdstart)
|
||||
p = key_linepos-cmdstart;
|
||||
p = min(p+cmdstart, sizeof(maskedtext)/sizeof(maskedtext[0]) - 2);
|
||||
p = min(p+cmdstart, sizeof(maskedtext)/sizeof(maskedtext[0]) - 3);
|
||||
textstart[p] = 0;
|
||||
textstart[p+1] = 0;
|
||||
}
|
||||
|
@ -2401,13 +2401,16 @@ void Con_DrawConsole (int lines, qboolean noback)
|
|||
srect.y = (1-srect.y) - srect.height;
|
||||
if (srect.width && srect.height)
|
||||
{
|
||||
R2D_ImageColours(0, 0.1, 0.2, 1.0);
|
||||
if ((w->buttonsdown & CB_SIZELEFT) || (con_curwindow==w && w->mousecursor[0] >= -8 && w->mousecursor[0] < 0 && w->mousecursor[1] >= 8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x, w->wnd_y+8, 8, w->wnd_h-8);
|
||||
if ((w->buttonsdown & CB_SIZERIGHT) || (con_curwindow==w && w->mousecursor[0] >= w->wnd_w-16 && w->mousecursor[0] < w->wnd_w-8 && w->mousecursor[1] >= 8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x+w->wnd_w-8, w->wnd_y+8, 8, w->wnd_h-8);
|
||||
if ((w->buttonsdown & CB_SIZEBOTTOM) || (con_curwindow==w && w->mousecursor[0] >= -8 && w->mousecursor[0] < w->wnd_w-8 && w->mousecursor[1] >= w->wnd_h-8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x, w->wnd_y+w->wnd_h-8, w->wnd_w, 8);
|
||||
if (!fadetime)
|
||||
{
|
||||
R2D_ImageColours(0, 0.1, 0.2, 1.0);
|
||||
if ((w->buttonsdown & CB_SIZELEFT) || (con_curwindow==w && w->mousecursor[0] >= -8 && w->mousecursor[0] < 0 && w->mousecursor[1] >= 8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x, w->wnd_y+8, 8, w->wnd_h-8);
|
||||
if ((w->buttonsdown & CB_SIZERIGHT) || (con_curwindow==w && w->mousecursor[0] >= w->wnd_w-16 && w->mousecursor[0] < w->wnd_w-8 && w->mousecursor[1] >= 8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x+w->wnd_w-8, w->wnd_y+8, 8, w->wnd_h-8);
|
||||
if ((w->buttonsdown & CB_SIZEBOTTOM) || (con_curwindow==w && w->mousecursor[0] >= -8 && w->mousecursor[0] < w->wnd_w-8 && w->mousecursor[1] >= w->wnd_h-8 && w->mousecursor[1] < w->wnd_h))
|
||||
R2D_FillBlock(w->wnd_x, w->wnd_y+w->wnd_h-8, w->wnd_w, 8);
|
||||
}
|
||||
if (R2D_Flush)
|
||||
R2D_Flush();
|
||||
BE_Scissor(&srect);
|
||||
|
|
|
@ -2421,8 +2421,9 @@ static void Image_LoadTextureMips(void *ctx, void *data, size_t a, size_t b)
|
|||
//ezhud breaks without this. I assume other things will too. this is why you shouldn't depend upon querying an image's size.
|
||||
if (!strncmp(tex->ident, "gfx/", 4))
|
||||
{
|
||||
qpic_t *pic = W_SafeGetLumpName(tex->ident+4);
|
||||
if (pic)
|
||||
size_t lumpsize;
|
||||
qpic_t *pic = W_SafeGetLumpName(tex->ident+4, &lumpsize);
|
||||
if (pic && lumpsize == 8 + pic->width*pic->height)
|
||||
{
|
||||
tex->width = pic->width;
|
||||
tex->height = pic->height;
|
||||
|
@ -4350,204 +4351,220 @@ static void Image_LoadHiResTextureWorker(void *ctx, void *data, size_t a, size_t
|
|||
char *buf;
|
||||
size_t fsize;
|
||||
int firstex = (tex->flags & IF_EXACTEXTENSION)?tex_extensions_count-1:0;
|
||||
char *altname;
|
||||
char *nextalt;
|
||||
|
||||
// Sys_Sleep(0.3);
|
||||
|
||||
//see if we recognise the extension, and only strip it if we do.
|
||||
COM_FileExtension(tex->ident, nicename, sizeof(nicename));
|
||||
e = 0;
|
||||
if (strcmp(nicename, "lmp") && strcmp(nicename, "wal"))
|
||||
for (; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (!strcmp(nicename, (*tex_extensions[e].name=='.')?tex_extensions[e].name+1:tex_extensions[e].name))
|
||||
break;
|
||||
}
|
||||
|
||||
//strip it and try replacements if we do, otherwise assume that we're meant to be loading progs/foo.mdl_0.tga or whatever
|
||||
if (e == tex_extensions_count || (tex->flags & IF_EXACTEXTENSION))
|
||||
Q_strncpyz(nicename, tex->ident, sizeof(nicename));
|
||||
else
|
||||
COM_StripExtension(tex->ident, nicename, sizeof(nicename));
|
||||
|
||||
if ((tex->flags & IF_TEXTYPE) == IF_CUBEMAP)
|
||||
{ //cubemaps require special handling because they are (normally) 6 files instead of 1.
|
||||
//the exception is single-file dds cubemaps, but we don't support those.
|
||||
if (!Image_LoadCubemapTexture(tex, nicename))
|
||||
{
|
||||
if (tex->flags & IF_NOWORKER)
|
||||
Image_LoadTexture_Failed(tex, NULL, 0, 0);
|
||||
else
|
||||
COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tex->fallbackdata || (gl_load24bit.ival && !(tex->flags & IF_NOREPLACE)))
|
||||
for(altname = tex->ident;altname;altname = nextalt)
|
||||
{
|
||||
Q_snprintfz(fname, sizeof(fname), "dds/%s.dds", nicename);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
nextalt = strchr(altname, ':');
|
||||
if (nextalt)
|
||||
{
|
||||
Q_snprintfz(iname, sizeof(iname), "dds/%s", nicename); /*should be safe if its null*/
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, iname, fname, buf, fsize))
|
||||
return;
|
||||
nextalt++;
|
||||
if (nextalt-altname >= sizeof(fname))
|
||||
continue; //too long...
|
||||
memcpy(fname, altname, nextalt-altname-1);
|
||||
fname[nextalt-altname-1] = 0;
|
||||
altname = fname;
|
||||
}
|
||||
|
||||
//see if we recognise the extension, and only strip it if we do.
|
||||
COM_FileExtension(altname, nicename, sizeof(nicename));
|
||||
e = 0;
|
||||
if (strcmp(nicename, "lmp") && strcmp(nicename, "wal"))
|
||||
for (; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (!strcmp(nicename, (*tex_extensions[e].name=='.')?tex_extensions[e].name+1:tex_extensions[e].name))
|
||||
break;
|
||||
}
|
||||
|
||||
if (strchr(nicename, '/') || strchr(nicename, '\\')) //never look in a root dir for the pic
|
||||
i = 0;
|
||||
//strip it and try replacements if we do, otherwise assume that we're meant to be loading progs/foo.mdl_0.tga or whatever
|
||||
if (e == tex_extensions_count || (tex->flags & IF_EXACTEXTENSION))
|
||||
Q_strncpyz(nicename, altname, sizeof(nicename));
|
||||
else
|
||||
i = 1;
|
||||
COM_StripExtension(altname, nicename, sizeof(nicename));
|
||||
|
||||
for (; i < sizeof(tex_path)/sizeof(tex_path[0]); i++)
|
||||
if ((tex->flags & IF_TEXTYPE) == IF_CUBEMAP)
|
||||
{ //cubemaps require special handling because they are (normally) 6 files instead of 1.
|
||||
//the exception is single-file dds cubemaps, but we don't support those.
|
||||
if (!Image_LoadCubemapTexture(tex, nicename))
|
||||
{
|
||||
if (tex->flags & IF_NOWORKER)
|
||||
Image_LoadTexture_Failed(tex, NULL, 0, 0);
|
||||
else
|
||||
COM_AddWork(WG_MAIN, Image_LoadTexture_Failed, tex, NULL, 0, 0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tex->fallbackdata || (gl_load24bit.ival && !(tex->flags & IF_NOREPLACE)))
|
||||
{
|
||||
if (!tex_path[i].enabled)
|
||||
continue;
|
||||
if (tex_path[i].args >= 3)
|
||||
{ //this is a path that needs subpaths
|
||||
char subpath[MAX_QPATH];
|
||||
char basename[MAX_QPATH];
|
||||
char *s, *n;
|
||||
if (!tex->subpath || !*nicename)
|
||||
Q_snprintfz(fname, sizeof(fname), "dds/%s.dds", nicename);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
Q_snprintfz(iname, sizeof(iname), "dds/%s", nicename); /*should be safe if its null*/
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, iname, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (strchr(nicename, '/') || strchr(nicename, '\\')) //never look in a root dir for the pic
|
||||
i = 0;
|
||||
else
|
||||
i = 1;
|
||||
|
||||
for (; i < sizeof(tex_path)/sizeof(tex_path[0]); i++)
|
||||
{
|
||||
if (!tex_path[i].enabled)
|
||||
continue;
|
||||
if (tex_path[i].args >= 3)
|
||||
{ //this is a path that needs subpaths
|
||||
char subpath[MAX_QPATH];
|
||||
char basename[MAX_QPATH];
|
||||
char *s, *n;
|
||||
if (!tex->subpath || !*nicename)
|
||||
continue;
|
||||
|
||||
s = COM_SkipPath(nicename);
|
||||
n = basename;
|
||||
while (*s && *s != '.' && n < basename+sizeof(basename)-5)
|
||||
*n++ = *s++;
|
||||
s = strchr(s, '_');
|
||||
if (s)
|
||||
{
|
||||
while (*s && n < basename+sizeof(basename)-5)
|
||||
s = COM_SkipPath(nicename);
|
||||
n = basename;
|
||||
while (*s && *s != '.' && n < basename+sizeof(basename)-5)
|
||||
*n++ = *s++;
|
||||
}
|
||||
*n = 0;
|
||||
|
||||
for(s = tex->subpath; s; s = n)
|
||||
{
|
||||
//subpath a:b:c tries multiple possible sub paths, for compatibility
|
||||
n = strchr(s, ':');
|
||||
if (n)
|
||||
s = strchr(s, '_');
|
||||
if (s)
|
||||
{
|
||||
if (n-s >= sizeof(subpath))
|
||||
*subpath = 0;
|
||||
else
|
||||
{
|
||||
memcpy(subpath, s, n-s);
|
||||
subpath[n-s] = 0;
|
||||
}
|
||||
n++;
|
||||
while (*s && n < basename+sizeof(basename)-5)
|
||||
*n++ = *s++;
|
||||
}
|
||||
else
|
||||
Q_strncpyz(subpath, s, sizeof(subpath));
|
||||
*n = 0;
|
||||
|
||||
for(s = tex->subpath; s; s = n)
|
||||
{
|
||||
//subpath a:b:c tries multiple possible sub paths, for compatibility
|
||||
n = strchr(s, ':');
|
||||
if (n)
|
||||
{
|
||||
if (n-s >= sizeof(subpath))
|
||||
*subpath = 0;
|
||||
else
|
||||
{
|
||||
memcpy(subpath, s, n-s);
|
||||
subpath[n-s] = 0;
|
||||
}
|
||||
n++;
|
||||
}
|
||||
else
|
||||
Q_strncpyz(subpath, s, sizeof(subpath));
|
||||
for (e = firstex; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (tex->flags & IF_NOPCX)
|
||||
if (!strcmp(tex_extensions[e].name, ".pcx"))
|
||||
continue;
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, subpath, basename, tex_extensions[e].name);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
Q_snprintfz(iname, sizeof(iname), "%s/%s", subpath, nicename); /*should be safe if its null*/
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, iname, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (e = firstex; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (tex->flags & IF_NOPCX)
|
||||
if (!strcmp(tex_extensions[e].name, ".pcx"))
|
||||
continue;
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, subpath, basename, tex_extensions[e].name);
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, nicename, tex_extensions[e].name);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
Q_snprintfz(iname, sizeof(iname), "%s/%s", subpath, nicename); /*should be safe if its null*/
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, iname, fname, buf, fsize))
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, nicename, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (e = firstex; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (tex->flags & IF_NOPCX)
|
||||
if (!strcmp(tex_extensions[e].name, ".pcx"))
|
||||
continue;
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, nicename, tex_extensions[e].name);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, nicename, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//support expansion of _bump textures to _norm textures.
|
||||
if (tex->flags & IF_TRYBUMP)
|
||||
{
|
||||
if (tex_path[i].args >= 3)
|
||||
//support expansion of _bump textures to _norm textures.
|
||||
if (tex->flags & IF_TRYBUMP)
|
||||
{
|
||||
/*no legacy compat needed, hopefully*/
|
||||
}
|
||||
else
|
||||
{
|
||||
char bumpname[MAX_QPATH], *n, *b;
|
||||
b = bumpname;
|
||||
n = nicename;
|
||||
while(*n)
|
||||
if (tex_path[i].args >= 3)
|
||||
{
|
||||
if (*n == '_' && !strcmp(n, "_norm"))
|
||||
{
|
||||
strcpy(b, "_bump");
|
||||
b += 5;
|
||||
n += 5;
|
||||
break;
|
||||
}
|
||||
*b++ = *n++;
|
||||
/*no legacy compat needed, hopefully*/
|
||||
}
|
||||
if (*n) //no _norm, give up with that
|
||||
continue;
|
||||
*b = 0;
|
||||
for (e = firstex; e < tex_extensions_count; e++)
|
||||
else
|
||||
{
|
||||
if (!strcmp(tex_extensions[e].name, ".tga"))
|
||||
char bumpname[MAX_QPATH], *n, *b;
|
||||
b = bumpname;
|
||||
n = nicename;
|
||||
while(*n)
|
||||
{
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, bumpname, tex_extensions[e].name);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
if (*n == '_' && !strcmp(n, "_norm"))
|
||||
{
|
||||
int w, h;
|
||||
qboolean a;
|
||||
qbyte *d;
|
||||
if ((d = ReadTargaFile(buf, fsize, &w, &h, &a, 2))) //Only load a greyscale image.
|
||||
strcpy(b, "_bump");
|
||||
b += 5;
|
||||
n += 5;
|
||||
break;
|
||||
}
|
||||
*b++ = *n++;
|
||||
}
|
||||
if (*n) //no _norm, give up with that
|
||||
continue;
|
||||
*b = 0;
|
||||
for (e = firstex; e < tex_extensions_count; e++)
|
||||
{
|
||||
if (!strcmp(tex_extensions[e].name, ".tga"))
|
||||
{
|
||||
Q_snprintfz(fname, sizeof(fname), tex_path[i].path, bumpname, tex_extensions[e].name);
|
||||
if ((buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
BZ_Free(buf);
|
||||
if (Image_LoadRawTexture(tex, tex->flags, d, NULL, w, h, TF_HEIGHT8))
|
||||
int w, h;
|
||||
qboolean a;
|
||||
qbyte *d;
|
||||
if ((d = ReadTargaFile(buf, fsize, &w, &h, &a, 2))) //Only load a greyscale image.
|
||||
{
|
||||
BZ_Free(tex->fallbackdata);
|
||||
tex->fallbackdata = NULL;
|
||||
return;
|
||||
BZ_Free(buf);
|
||||
if (Image_LoadRawTexture(tex, tex->flags, d, NULL, w, h, TF_HEIGHT8))
|
||||
{
|
||||
BZ_Free(tex->fallbackdata);
|
||||
tex->fallbackdata = NULL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
BZ_Free(buf);
|
||||
}
|
||||
else
|
||||
BZ_Free(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*still failed? attempt to load quake lmp files, which have no real format id (hence why they're not above)*/
|
||||
Q_strncpyz(fname, nicename, sizeof(fname));
|
||||
COM_DefaultExtension(fname, ".lmp", sizeof(fname));
|
||||
if (!(tex->flags & IF_NOPCX) && (buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, nicename, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
int imgwidth;
|
||||
int imgheight;
|
||||
qboolean alphaed;
|
||||
//now look in wad files. (halflife compatability)
|
||||
buf = W_GetTexture(nicename, &imgwidth, &imgheight, &alphaed);
|
||||
if (buf)
|
||||
/*still failed? attempt to load quake lmp files, which have no real format id (hence why they're not above)*/
|
||||
Q_strncpyz(fname, nicename, sizeof(fname));
|
||||
COM_DefaultExtension(fname, ".lmp", sizeof(fname));
|
||||
if (!(tex->flags & IF_NOPCX) && (buf = COM_LoadFile (fname, 5, &fsize)))
|
||||
{
|
||||
if (Image_LoadRawTexture(tex, tex->flags, buf, NULL, imgwidth, imgheight, TF_RGBA32))
|
||||
{
|
||||
BZ_Free(tex->fallbackdata);
|
||||
tex->fallbackdata = NULL;
|
||||
if (Image_LoadTextureFromMemory(tex, tex->flags, nicename, fname, buf, fsize))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
int imgwidth;
|
||||
int imgheight;
|
||||
qboolean alphaed;
|
||||
//now look in wad files. (halflife compatability)
|
||||
buf = W_GetTexture(nicename, &imgwidth, &imgheight, &alphaed);
|
||||
if (buf)
|
||||
{
|
||||
if (Image_LoadRawTexture(tex, tex->flags, buf, NULL, imgwidth, imgheight, TF_RGBA32))
|
||||
{
|
||||
BZ_Free(tex->fallbackdata);
|
||||
tex->fallbackdata = NULL;
|
||||
return;
|
||||
}
|
||||
BZ_Free(buf);
|
||||
}
|
||||
BZ_Free(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -991,7 +991,7 @@ void INS_ReInit (void)
|
|||
{
|
||||
#if SDL_MAJOR_VERSION >= 2
|
||||
unsigned int i;
|
||||
memset(sdljoy, sizeof(sdljoy), 0);
|
||||
memset(sdljoy, 0, sizeof(sdljoy));
|
||||
for (i = 0; i < MAX_JOYSTICKS; i++)
|
||||
sdljoy[i].qdevid = DEVID_UNSET;
|
||||
SDL_InitSubSystem(SDL_INIT_JOYSTICK|SDL_INIT_GAMECONTROLLER);
|
||||
|
|
|
@ -1415,6 +1415,20 @@ void INS_Accumulate (void)
|
|||
{
|
||||
if (mouseactive && !dinput)
|
||||
{
|
||||
//if you have two programs side by side that both think that they own the mouse cursor then there are certain race conditions when switching between them
|
||||
//when alt+tabbing, windows won't wait for a response, so we may have already lost focus by the time we get here, and none of our internal state will know about it.
|
||||
//fte won't grab the mouse until its actually inside the window, but other programs don't have similar delays.
|
||||
//so when switching to other quake ports, expect fte to detect the oter engine's setcursorpos as a really big mouse move.
|
||||
|
||||
RECT cliprect;
|
||||
if (GetClipCursor (&cliprect) && !(
|
||||
cliprect.left >= window_rect.left &&
|
||||
cliprect.right <= window_rect.right &&
|
||||
cliprect.top >= window_rect.top &&
|
||||
cliprect.bottom <= window_rect.bottom
|
||||
))
|
||||
; //cliprect now covers some area outside of where we asked for.
|
||||
else
|
||||
#ifdef USINGRAWINPUT
|
||||
//raw input disables the system mouse, to avoid dupes
|
||||
if (!rawmicecount)
|
||||
|
|
|
@ -440,16 +440,18 @@ int Con_Navigate(console_t *con, char *line)
|
|||
int Con_ExecuteLine(console_t *con, char *line)
|
||||
{
|
||||
qboolean waschat = false;
|
||||
char deutf8[8192];
|
||||
char *deutf8 = NULL;
|
||||
if (com_parseutf8.ival <= 0)
|
||||
{
|
||||
unsigned int unicode;
|
||||
int err;
|
||||
int len = 0;
|
||||
int maxlen = strlen(line)*6+1;
|
||||
deutf8 = malloc(maxlen);
|
||||
while(*line)
|
||||
{
|
||||
unicode = utf8_decode(&err, line, &line);
|
||||
len += unicode_encode(deutf8+len, unicode, sizeof(deutf8)-1 - len, true);
|
||||
len += unicode_encode(deutf8+len, unicode, maxlen-1 - len, true);
|
||||
}
|
||||
deutf8[len] = 0;
|
||||
line = deutf8;
|
||||
|
@ -507,6 +509,7 @@ int Con_ExecuteLine(console_t *con, char *line)
|
|||
{
|
||||
Con_Printf ("]%s\n",line);
|
||||
Cmd_ExecuteString(exec, RESTRICT_SERVER);
|
||||
free(deutf8);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -528,6 +531,7 @@ int Con_ExecuteLine(console_t *con, char *line)
|
|||
// SCR_UpdateScreen (); // force an update, because the command
|
||||
// // may take some time
|
||||
|
||||
free(deutf8);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1524,6 +1528,11 @@ qboolean Key_Console (console_t *con, unsigned int unicode, int key)
|
|||
{ // backslash text are commands, else chat
|
||||
int oldl = edit_line;
|
||||
|
||||
#ifndef FTE_TARGET_WEB
|
||||
if (keydown[K_LALT] || keydown[K_RALT])
|
||||
Cbuf_AddText("\nvid_toggle\n", RESTRICT_LOCAL);
|
||||
#endif
|
||||
|
||||
if (con_commandmatch)
|
||||
{ //if that isn't actually a command, and we can actually complete it to something, then lets try to complete it.
|
||||
char *txt = key_lines[edit_line]+1;
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -267,14 +267,10 @@ int maxdots;
|
|||
int mindot;
|
||||
int dotofs;
|
||||
|
||||
static void MenuTooltipSplit(menu_t *menu, const char *text)
|
||||
static void MenuTooltipChange(menu_t *menu, const char *text)
|
||||
{
|
||||
char buf[1024];
|
||||
char *c, *space;
|
||||
int lines, lnsize, txsize;
|
||||
int lnmax;
|
||||
unsigned int MAX_CHARS=1024;
|
||||
menutooltip_t *mtt;
|
||||
|
||||
if (menu->tooltip)
|
||||
{
|
||||
Z_Free(menu->tooltip);
|
||||
|
@ -284,85 +280,9 @@ static void MenuTooltipSplit(menu_t *menu, const char *text)
|
|||
if (!text || !text[0] || vid.width < 320 || vid.height < 200)
|
||||
return;
|
||||
|
||||
// calc a line maximum, use a third of the screen or 30 characters, whichever is bigger
|
||||
lnmax = (vid.width / 24) - 2;
|
||||
if (lnmax < 30)
|
||||
lnmax = 30;
|
||||
// word wrap
|
||||
lines = 1;
|
||||
lnsize = txsize = 0;
|
||||
space = NULL;
|
||||
for (c = buf; *text && txsize < sizeof(buf) - 1; text++)
|
||||
{
|
||||
if (lnsize >= lnmax)
|
||||
{
|
||||
if (space)
|
||||
{
|
||||
lnsize = (c - space) - 1;
|
||||
*space = '\n';
|
||||
space = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
lnsize = 0;
|
||||
*c = '\n';
|
||||
c++;
|
||||
txsize++;
|
||||
if (txsize >= sizeof(buf) - 1)
|
||||
break;
|
||||
}
|
||||
lines++;
|
||||
}
|
||||
|
||||
*c = *text;
|
||||
switch (*c)
|
||||
{
|
||||
case '\n':
|
||||
lines++;
|
||||
lnsize = 0;
|
||||
space = NULL;
|
||||
break;
|
||||
case ' ':
|
||||
space = c;
|
||||
break;
|
||||
}
|
||||
c++;
|
||||
txsize++;
|
||||
lnsize++;
|
||||
}
|
||||
// remove stray newlines at end and terminate string
|
||||
while (txsize > 0 && buf[txsize - 1] == '\n')
|
||||
{
|
||||
lines--;
|
||||
txsize--;
|
||||
}
|
||||
buf[txsize] = '\0';
|
||||
|
||||
// allocate new tooltip structure, copy text to structure
|
||||
mtt = (menutooltip_t *)Z_Malloc(sizeof(menutooltip_t) + sizeof(char *)*lines + txsize + 1);
|
||||
mtt->lines = (char **)(mtt + 1);
|
||||
mtt->rows = lines;
|
||||
Q_memcpy(mtt->lines + lines, buf, txsize + 1);
|
||||
mtt->lines[0] = (char *)(mtt->lines + lines);
|
||||
|
||||
// rescan text, get max column length, convert \n to \0
|
||||
lines = lnmax = txsize = 0;
|
||||
for (c = mtt->lines[0]; *c; c++)
|
||||
{
|
||||
if (*c == '\n')
|
||||
{
|
||||
if (lnmax < txsize)
|
||||
lnmax = txsize;
|
||||
txsize = 0;
|
||||
*c = '\0';
|
||||
mtt->lines[++lines] = c + 1;
|
||||
}
|
||||
else
|
||||
txsize++;
|
||||
}
|
||||
if (lnmax < txsize)
|
||||
lnmax = txsize;
|
||||
mtt->columns = lnmax;
|
||||
mtt = (menutooltip_t *)Z_Malloc(sizeof(menutooltip_t) + sizeof(conchar_t)*MAX_CHARS);
|
||||
mtt->end = COM_ParseFunString(CON_WHITEMASK, text, mtt->text, sizeof(conchar_t)*MAX_CHARS, false);
|
||||
|
||||
menu->tooltip = mtt;
|
||||
}
|
||||
|
@ -456,7 +376,7 @@ static void M_CheckMouseMove(void)
|
|||
|
||||
menu->selecteditem = option;
|
||||
menu->tooltiptime = realtime + 1;
|
||||
MenuTooltipSplit(menu, menu->selecteditem->common.tooltip);
|
||||
MenuTooltipChange(menu, menu->selecteditem->common.tooltip);
|
||||
}
|
||||
if (menu->cursoritem)
|
||||
menu->cursoritem->common.posy = menu->selecteditem->common.posy;
|
||||
|
@ -711,11 +631,28 @@ static void MenuDraw(menu_t *menu)
|
|||
if (omousex > menu->xpos+option->common.posx && omousex < menu->xpos+option->common.posx+option->common.width)
|
||||
if (omousey > menu->ypos+option->common.posy && omousey < menu->ypos+option->common.posy+option->common.height)
|
||||
{
|
||||
int x = omousex;
|
||||
int x = omousex+8;
|
||||
int y = omousey;
|
||||
int w = (menu->tooltip->columns + 3) * 8;
|
||||
int h = (menu->tooltip->rows + 2) * 8;
|
||||
int w;
|
||||
int h;
|
||||
int l, lines;
|
||||
conchar_t *line_start[16];
|
||||
conchar_t *line_end[countof(line_start)];
|
||||
|
||||
//figure out the line breaks
|
||||
Font_BeginString(font_default, 0, 0, &l, &l);
|
||||
lines = Font_LineBreaks(menu->tooltip->text, menu->tooltip->end, min(vid.pixelwidth/2, 30*8*vid.pixelwidth/vid.width), countof(line_start), line_start, line_end);
|
||||
Font_EndString(font_default);
|
||||
|
||||
//figure out how wide that makes the tip
|
||||
w = 16;
|
||||
h = (lines+2)*8;
|
||||
for (l = 0; l < lines; l++)
|
||||
{
|
||||
int lw = 16+Font_LineWidth(line_start[l], line_end[l])*vid.width/vid.pixelwidth;
|
||||
if (w < lw)
|
||||
w = lw;
|
||||
}
|
||||
|
||||
// keep the tooltip within view
|
||||
if (x + w >= vid.width)
|
||||
|
@ -723,16 +660,19 @@ static void MenuDraw(menu_t *menu)
|
|||
if (y + h >= vid.height)
|
||||
y -= h;
|
||||
|
||||
// draw tooltip
|
||||
Draw_TextBox(x, y, menu->tooltip->columns, menu->tooltip->rows);
|
||||
lines = menu->tooltip->rows;
|
||||
// draw the background
|
||||
Draw_TextBox(x, y, (w-16)/8, lines);
|
||||
x += 8;
|
||||
y += 8;
|
||||
|
||||
//draw the text
|
||||
Font_BeginString(font_default, x, y, &x, &y);
|
||||
for (l = 0; l < lines; l++)
|
||||
{
|
||||
Draw_FunString(x, y, menu->tooltip->lines[l]);
|
||||
y += 8;
|
||||
Font_LineDraw(x, y, line_start[l], line_end[l]);
|
||||
y += Font_CharHeight();
|
||||
}
|
||||
Font_EndString(font_default);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2883,7 +2883,7 @@ static void M_ModelViewerDraw(int x, int y, struct menucustom_s *c, struct menu_
|
|||
// ent.fatness = sin(realtime)*5;
|
||||
ent.playerindex = -1;
|
||||
ent.skinnum = mods->skingroup;
|
||||
ent.shaderTime = realtime;
|
||||
ent.shaderTime = 0;//realtime;
|
||||
ent.framestate.g[FS_REG].lerpweight[0] = 1;
|
||||
ent.framestate.g[FS_REG].frame[0] = mods->framegroup;
|
||||
ent.framestate.g[FS_REG].frametime[0] = realtime - mods->framechangetime;
|
||||
|
@ -3112,7 +3112,10 @@ static void Mods_Draw(int x, int y, struct menucustom_s *c, struct menu_s *m)
|
|||
mods->y = y;
|
||||
|
||||
if (!mods->nummanifests)
|
||||
Draw_FunString(x, y, "No games or mods known");
|
||||
{
|
||||
Draw_FunString(x, y+0, "No games or mods known");
|
||||
Draw_FunString(x, y+8, "Consider using -basedir $PATHTOGAME on the commandline");
|
||||
}
|
||||
|
||||
for (i = 0; y+8 <= ym && i < mods->nummanifests; y+=8, i++)
|
||||
{
|
||||
|
|
|
@ -254,9 +254,8 @@ typedef union menuoption_s {
|
|||
} menuoption_t;
|
||||
|
||||
typedef struct menutooltip_s {
|
||||
char **lines;
|
||||
int rows;
|
||||
int columns;
|
||||
conchar_t *end;
|
||||
conchar_t text[1];
|
||||
} menutooltip_t;
|
||||
|
||||
typedef struct menuresel_s //THIS STRUCT MUST BE STATICALLY ALLOCATED.
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifdef VKQUAKE
|
||||
#if defined(__LP64__) || defined(_WIN64)
|
||||
#define VulkanWasDesignedByARetard void*
|
||||
#elif defined(_MSC_VER) && _MSC_VER < 1300
|
||||
#define VulkanWasDesignedByARetard __int64
|
||||
#else
|
||||
#define VulkanWasDesignedByARetard long long
|
||||
#endif
|
||||
|
@ -375,15 +377,15 @@ typedef struct texnums_s {
|
|||
//not all modes accept meshes - STENCIL(intentional) and DEPTHONLY(not implemented)
|
||||
typedef enum backendmode_e
|
||||
{
|
||||
BEM_STANDARD, //regular mode to draw surfaces akin to q3 (aka: legacy mode). lightmaps+delux+ambient
|
||||
BEM_DEPTHONLY, //just a quick depth pass. textures used only for alpha test (shadowmaps).
|
||||
BEM_WIREFRAME, //for debugging or something
|
||||
BEM_STENCIL, //used for drawing shadow volumes to the stencil buffer.
|
||||
BEM_DEPTHDARK, //a quick depth pass. textures used only for alpha test. additive textures still shown as normal.
|
||||
BEM_CREPUSCULAR, //sky is special, everything else completely black
|
||||
BEM_DEPTHNORM, //all opaque stuff drawn using 'depthnorm' shader
|
||||
BEM_FOG, //drawing a fog volume
|
||||
BEM_LIGHT, //we have a valid light
|
||||
BEM_STANDARD, //regular mode to draw surfaces akin to q3 (aka: legacy mode). lightmaps+delux+ambient
|
||||
BEM_DEPTHONLY, //just a quick depth pass. textures used only for alpha test (shadowmaps).
|
||||
BEM_WIREFRAME, //for debugging or something
|
||||
BEM_STENCIL, //used for drawing shadow volumes to the stencil buffer.
|
||||
BEM_DEPTHDARK, //a quick depth pass. textures used only for alpha test. additive textures still shown as normal.
|
||||
BEM_CREPUSCULAR, //sky is special, everything else completely black
|
||||
BEM_DEPTHNORM, //all opaque stuff drawn using 'depthnorm' shader
|
||||
BEM_FOG, //drawing a fog volume
|
||||
BEM_LIGHT, //we have a valid light
|
||||
} backendmode_t;
|
||||
|
||||
typedef struct rendererinfo_s {
|
||||
|
@ -395,24 +397,24 @@ typedef struct rendererinfo_s {
|
|||
void (*Draw_Init) (void);
|
||||
void (*Draw_Shutdown) (void);
|
||||
|
||||
void (*IMG_UpdateFiltering) (image_t *imagelist, int filtermip[3], int filterpic[3], int mipcap[2], float anis);
|
||||
void (*IMG_UpdateFiltering) (image_t *imagelist, int filtermip[3], int filterpic[3], int mipcap[2], float anis);
|
||||
qboolean (*IMG_LoadTextureMips) (texid_t tex, struct pendingtextureinfo *mips);
|
||||
void (*IMG_DestroyTexture) (texid_t tex);
|
||||
void (*IMG_DestroyTexture) (texid_t tex);
|
||||
|
||||
void (*R_Init) (void); //FIXME - merge implementations
|
||||
void (*R_DeInit) (void); //FIXME - merge implementations
|
||||
void (*R_RenderView) (void); // must set r_refdef first
|
||||
void (*R_Init) (void); //FIXME - merge implementations
|
||||
void (*R_DeInit) (void); //FIXME - merge implementations
|
||||
void (*R_RenderView) (void); // must set r_refdef first
|
||||
|
||||
qboolean (*VID_Init) (rendererstate_t *info, unsigned char *palette);
|
||||
void (*VID_DeInit) (void);
|
||||
void (*VID_SwapBuffers) (void); //force a buffer swap, regardless of what's displayed.
|
||||
void (*VID_SwapBuffers) (void); //force a buffer swap, regardless of what's displayed.
|
||||
qboolean (*VID_ApplyGammaRamps) (unsigned int size, unsigned short *ramps);
|
||||
|
||||
void *(*VID_CreateCursor) (const char *filename, float hotx, float hoty, float scale); //may be null, stub returns null
|
||||
void *(*VID_CreateCursor) (const char *filename, float hotx, float hoty, float scale); //may be null, stub returns null
|
||||
qboolean (*VID_SetCursor) (void *cursor); //may be null
|
||||
void (*VID_DestroyCursor) (void *cursor); //may be null
|
||||
void (*VID_DestroyCursor) (void *cursor); //may be null
|
||||
|
||||
void (*VID_SetWindowCaption) (const char *msg);
|
||||
void (*VID_SetWindowCaption) (const char *msg);
|
||||
char *(*VID_GetRGBInfo) (int *truevidwidth, int *truevidheight, enum uploadfmt *fmt);
|
||||
|
||||
qboolean (*SCR_UpdateScreen) (void);
|
||||
|
@ -431,22 +433,23 @@ typedef struct rendererinfo_s {
|
|||
//called at init, force the display to the right defaults etc
|
||||
void (*BE_Init)(void);
|
||||
//Generates an optimised VBO, one for each texture on the map
|
||||
void (*BE_GenBrushModelVBO)(struct model_s *mod);
|
||||
void (*BE_GenBrushModelVBO)(struct model_s *mod);
|
||||
//Destroys the given vbo
|
||||
void (*BE_ClearVBO)(struct vbo_s *vbo);
|
||||
void (*BE_ClearVBO)(struct vbo_s *vbo);
|
||||
//Uploads all modified lightmaps
|
||||
void (*BE_UploadAllLightmaps)(void);
|
||||
void (*BE_SelectEntity)(struct entity_s *ent);
|
||||
void (*BE_UploadAllLightmaps)(void);
|
||||
void (*BE_SelectEntity)(struct entity_s *ent);
|
||||
qboolean (*BE_SelectDLight)(struct dlight_s *dl, vec3_t colour, vec3_t axis[3], unsigned int lmode);
|
||||
void (*BE_Scissor)(srect_t *rect);
|
||||
void (*BE_Scissor)(srect_t *rect);
|
||||
/*check to see if an ent should be drawn for the selected light*/
|
||||
qboolean (*BE_LightCullModel)(vec3_t org, struct model_s *model);
|
||||
void (*BE_VBO_Begin)(vbobctx_t *ctx, size_t maxsize);
|
||||
void (*BE_VBO_Data)(vbobctx_t *ctx, void *data, size_t size, vboarray_t *varray);
|
||||
void (*BE_VBO_Finish)(vbobctx_t *ctx, void *edata, size_t esize, vboarray_t *earray, void **vbomem, void **ebomem);
|
||||
void (*BE_VBO_Destroy)(vboarray_t *vearray, void *mem);
|
||||
void (*BE_RenderToTextureUpdate2d)(qboolean destchanged);
|
||||
char *alignment;
|
||||
void (*BE_VBO_Begin)(vbobctx_t *ctx, size_t maxsize);
|
||||
void (*BE_VBO_Data)(vbobctx_t *ctx, void *data, size_t size, vboarray_t *varray);
|
||||
void (*BE_VBO_Finish)(vbobctx_t *ctx, void *edata, size_t esize, vboarray_t *earray, void **vbomem, void **ebomem);
|
||||
void (*BE_VBO_Destroy)(vboarray_t *vearray, void *mem);
|
||||
void (*BE_RenderToTextureUpdate2d)(qboolean destchanged);
|
||||
|
||||
char *alignment; //just to make sure that added functions cause compile warnings.
|
||||
} rendererinfo_t;
|
||||
|
||||
#define rf currentrendererstate.renderer
|
||||
|
|
|
@ -2324,7 +2324,7 @@ void MasterInfo_WriteServers(void)
|
|||
mf = FS_OpenVFS("masters.txt", "wt", FS_ROOT);
|
||||
if (!mf)
|
||||
{
|
||||
Con_Printf("Couldn't write masters.txt");
|
||||
Con_Printf(CON_ERROR "Couldn't write masters.txt");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -4055,6 +4055,29 @@ static void QCBUILTIN PF_cl_te_explosion2 (pubprogfuncs_t *prinst, struct global
|
|||
}
|
||||
S_StartSound (0, 0, cl_sfx_r_exp3, pos, NULL, 1, 1, 0, 0, 0);
|
||||
}
|
||||
|
||||
static void QCBUILTIN PF_cl_te_flamejet (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
vec3_t pos, vel;
|
||||
int count;
|
||||
|
||||
// origin
|
||||
pos[0] = MSG_ReadCoord ();
|
||||
pos[1] = MSG_ReadCoord ();
|
||||
pos[2] = MSG_ReadCoord ();
|
||||
|
||||
// velocity
|
||||
vel[0] = MSG_ReadCoord ();
|
||||
vel[1] = MSG_ReadCoord ();
|
||||
vel[2] = MSG_ReadCoord ();
|
||||
|
||||
// count
|
||||
count = MSG_ReadByte ();
|
||||
|
||||
if (P_RunParticleEffectType(pos, vel, count, P_FindParticleType("TE_FLAMEJET")))
|
||||
P_RunParticleEffect (pos, vel, 232, count);
|
||||
}
|
||||
|
||||
static void QCBUILTIN PF_cl_te_lightning1 (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
csqcedict_t *ent = (csqcedict_t*)G_EDICT(prinst, OFS_PARM0);
|
||||
|
@ -5490,6 +5513,8 @@ static struct {
|
|||
{"fputs", PF_fputs, 113}, // #113 void(float fnum, string str) fputs (FRIK_FILE)
|
||||
{"fread", PF_fread, 0},
|
||||
{"fwrite", PF_fwrite, 0},
|
||||
{"fseek", PF_fseek, 0},
|
||||
{"fsize", PF_fsize, 0},
|
||||
{"strlen", PF_strlen, 114}, // #114 float(string str) strlen (FRIK_FILE)
|
||||
|
||||
{"strcat", PF_strcat, 115}, // #115 string(string str1, string str2, ...) strcat (FRIK_FILE)
|
||||
|
@ -5839,7 +5864,7 @@ static struct {
|
|||
// {"WriteUnterminatedString",PF_WriteString2, 456}, //writestring but without the null terminator. makes things a little nicer.
|
||||
|
||||
//DP_TE_FLAMEJET
|
||||
// {"te_flamejet", PF_te_flamejet, 457}, // #457 void(vector org, vector vel, float howmany) te_flamejet
|
||||
{"te_flamejet", PF_cl_te_flamejet, 457}, // #457 void(vector org, vector vel, float howmany) te_flamejet
|
||||
|
||||
//no 458 documented.
|
||||
|
||||
|
@ -7292,7 +7317,7 @@ qboolean CSQC_KeyPress(int key, int unicode, qboolean down, unsigned int devid)
|
|||
G_FLOAT(OFS_PARM3) = devid;
|
||||
|
||||
//small sanity check, so things don't break too much if things get big.
|
||||
if (devid < 0 || (unsigned)devid >= sizeof(csqckeysdown[0])*8)
|
||||
if ((unsigned)devid >= sizeof(csqckeysdown[0])*8)
|
||||
devid = sizeof(csqckeysdown[0])*8-1;
|
||||
if (key < 0 || key >= K_MAX)
|
||||
key = 0; //panic. everyone panic.
|
||||
|
|
|
@ -2058,6 +2058,8 @@ static struct {
|
|||
{"fputs", PF_fputs, 51},
|
||||
{"fread", PF_fread, 0},
|
||||
{"fwrite", PF_fwrite, 0},
|
||||
{"fseek", PF_fseek, 0},
|
||||
{"fsize", PF_fsize, 0},
|
||||
{"strlen", PF_strlen, 52},
|
||||
{"strcat", PF_strcat, 53},
|
||||
{"substring", PF_substring, 54},
|
||||
|
|
|
@ -110,7 +110,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define PNG_SUCKS_WITH_SETJMP //cos it does.
|
||||
#endif
|
||||
|
||||
#define QUAKE_GAME // as opposed to utilities
|
||||
//define PARANOID // speed sapping error checking
|
||||
|
||||
#include <float.h>
|
||||
|
|
|
@ -431,8 +431,9 @@ apic_t *R2D_LoadAtlasedPic(const char *name)
|
|||
|
||||
if (!gl_load24bit.ival)
|
||||
{
|
||||
qp = W_SafeGetLumpName(name);
|
||||
if (qp)
|
||||
size_t lumpsize;
|
||||
qp = W_SafeGetLumpName(name, &lumpsize);
|
||||
if (qp && lumpsize == 8+qp->width*qp->height)
|
||||
{
|
||||
apic->width = qp->width;
|
||||
apic->height = qp->height;
|
||||
|
|
|
@ -133,9 +133,9 @@ static void R_BuildDefaultTexnums_Doom3(shader_t *shader)
|
|||
if ((shader->flags & SHADER_HASFULLBRIGHT) && r_fb_bmodels.value && gl_load24bit.value)
|
||||
{
|
||||
if (!TEXVALID(tex->fullbright) && *mapname)
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma", mapname), NULL, imageflags);
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma:%s_glow", mapname, mapname), NULL, imageflags);
|
||||
if (!TEXVALID(tex->fullbright))
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma", imagename), subpath, imageflags);
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma:%s_glow", imagename, imagename), subpath, imageflags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2642,6 +2642,7 @@ struct webostate_s
|
|||
char dbgid[12];
|
||||
model_t *wmodel;
|
||||
mleaf_t *leaf[2];
|
||||
int cluster[2];
|
||||
qbyte pvs[MAX_MAP_LEAFS/8];
|
||||
vboarray_t ebo;
|
||||
void *ebomem;
|
||||
|
@ -2727,7 +2728,13 @@ void R_GeneratedWorldEBO(void *ctx, void *data, size_t a_, size_t b_)
|
|||
webostate->batches[i].idxbuffer = (index_t*)NULL + idxcount;
|
||||
idxcount += webostate->batches[i].numidx;
|
||||
}
|
||||
BE_VBO_Finish(NULL, indexes, sizeof(*indexes) * idxcount, &webostate->ebo, NULL, &webostate->ebomem);
|
||||
if (idxcount)
|
||||
BE_VBO_Finish(NULL, indexes, sizeof(*indexes) * idxcount, &webostate->ebo, NULL, &webostate->ebomem);
|
||||
else
|
||||
{
|
||||
memset(&webostate->ebo, 0, sizeof(webostate->ebo));
|
||||
webostate->ebomem = NULL;
|
||||
}
|
||||
free(indexes);
|
||||
}
|
||||
#endif
|
||||
|
@ -2741,11 +2748,22 @@ void R_GeneratedWorldEBO(void *ctx, void *data, size_t a_, size_t b_)
|
|||
if (!webostate->batches[i].numidx)
|
||||
continue;
|
||||
|
||||
if (batch->shader->flags & SHADER_NODRAW)
|
||||
continue;
|
||||
|
||||
m = &webostate->batches[i].m;
|
||||
webostate->batches[i].pm = m;
|
||||
b = &webostate->batches[i].b;
|
||||
memcpy(b, batch, sizeof(*b));
|
||||
memset(m, 0, sizeof(*m));
|
||||
|
||||
if (b->shader->flags & SHADER_NEEDSARRAYS)
|
||||
{
|
||||
if (b->shader->flags & SHADER_SKY)
|
||||
continue;
|
||||
b->shader = R_RegisterShader_Vertex("unsupported");
|
||||
}
|
||||
|
||||
m->numvertexes = webostate->batches[i].b.vbo->vertcount;
|
||||
b->mesh = &webostate->batches[i].pm;
|
||||
b->meshes = 1;
|
||||
|
@ -2763,15 +2781,15 @@ void R_GeneratedWorldEBO(void *ctx, void *data, size_t a_, size_t b_)
|
|||
}
|
||||
}
|
||||
}
|
||||
static void Surf_SimpleWorld(struct webostate_s *es, qbyte *pvs)
|
||||
static void Surf_SimpleWorld_Q1BSP(struct webostate_s *es, qbyte *pvs)
|
||||
{
|
||||
mleaf_t *leaf;
|
||||
msurface_t *surf, **mark, **end;
|
||||
mesh_t *mesh;
|
||||
int l;
|
||||
int fc = -r_framecount;
|
||||
model_t *wmodel = es->wmodel;
|
||||
for (leaf = wmodel->leafs+wmodel->numclusters, l = wmodel->numclusters; l-- > 0; leaf--)
|
||||
int l = wmodel->numclusters;
|
||||
int fc = -r_framecount;
|
||||
for (leaf = wmodel->leafs+l; l-- > 0; leaf--)
|
||||
{
|
||||
if ((pvs[l>>3] & (1u<<(l&7))) && leaf->nummarksurfaces)
|
||||
{
|
||||
|
@ -2792,7 +2810,6 @@ static void Surf_SimpleWorld(struct webostate_s *es, qbyte *pvs)
|
|||
if (eb->maxidx < eb->numidx + mesh->numindexes)
|
||||
{
|
||||
//FIXME: pre-allocate
|
||||
// continue;
|
||||
eb->maxidx = eb->numidx + surf->mesh->numindexes + 512;
|
||||
eb->idxbuffer = BZ_Realloc(eb->idxbuffer, eb->maxidx * sizeof(index_t));
|
||||
}
|
||||
|
@ -2804,6 +2821,51 @@ static void Surf_SimpleWorld(struct webostate_s *es, qbyte *pvs)
|
|||
}
|
||||
}
|
||||
}
|
||||
#if defined(Q2BSP) || defined(Q3BSP)
|
||||
static void Surf_SimpleWorld_Q3BSP(struct webostate_s *es, qbyte *pvs)
|
||||
{
|
||||
mleaf_t *leaf;
|
||||
msurface_t *surf, **mark, **end;
|
||||
mesh_t *mesh;
|
||||
model_t *wmodel = es->wmodel;
|
||||
int l = wmodel->numleafs; //is this doing submodels too?
|
||||
int c;
|
||||
int fc = -r_framecount;
|
||||
for (leaf = wmodel->leafs; l-- > 0; leaf++)
|
||||
{
|
||||
c = leaf->cluster;
|
||||
if (c < 0)
|
||||
continue; //o.O
|
||||
if ((pvs[c>>3] & (1u<<(c&7))) && leaf->nummarksurfaces)
|
||||
{
|
||||
mark = leaf->firstmarksurface;
|
||||
end = mark+leaf->nummarksurfaces;
|
||||
while(mark < end)
|
||||
{
|
||||
surf = *mark++;
|
||||
if (surf->visframe != fc)
|
||||
{
|
||||
int i;
|
||||
struct wesbatch_s *eb;
|
||||
surf->visframe = fc;
|
||||
|
||||
mesh = surf->mesh;
|
||||
eb = &es->batches[surf->sbatch->ebobatch];
|
||||
if (eb->maxidx < eb->numidx + mesh->numindexes)
|
||||
{
|
||||
//FIXME: pre-allocate
|
||||
eb->maxidx = eb->numidx + surf->mesh->numindexes + 512;
|
||||
eb->idxbuffer = BZ_Realloc(eb->idxbuffer, eb->maxidx * sizeof(index_t));
|
||||
}
|
||||
for (i = 0; i < mesh->numindexes; i++)
|
||||
eb->idxbuffer[eb->numidx+i] = mesh->indexes[i] + mesh->vbofirstvert;
|
||||
eb->numidx += mesh->numindexes;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b)
|
||||
{
|
||||
int i;
|
||||
|
@ -2812,23 +2874,6 @@ void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b)
|
|||
|
||||
es->numbatches = es->wmodel->numbatches;
|
||||
|
||||
//maybe we should just use fatpvs instead, and wait for completion when outside?
|
||||
if (es->leaf[1])
|
||||
{ //view is near to a water boundary. this implies the water crosses the near clip plane.
|
||||
qbyte tmppvs[MAX_MAP_LEAFS/8];
|
||||
int c;
|
||||
Q1BSP_LeafPVS (es->wmodel, es->leaf[0], es->pvs, sizeof(es->pvs));
|
||||
Q1BSP_LeafPVS (es->wmodel, es->leaf[1], tmppvs, sizeof(tmppvs));
|
||||
c = (es->wmodel->numclusters+31)/32;
|
||||
for (i=0 ; i<c ; i++)
|
||||
((int *)es->pvs)[i] |= ((int *)tmppvs)[i];
|
||||
pvs = es->pvs;
|
||||
}
|
||||
else
|
||||
{
|
||||
pvs = Q1BSP_LeafPVS (es->wmodel, es->leaf[0], es->pvs, sizeof(es->pvs));
|
||||
}
|
||||
|
||||
for (i = 0; i < es->numbatches; i++)
|
||||
{
|
||||
es->batches[i].numidx = 0;
|
||||
|
@ -2836,7 +2881,46 @@ void R_GenWorldEBO(void *ctx, void *data, size_t a, size_t b)
|
|||
es->batches[i].idxbuffer = NULL;
|
||||
}
|
||||
|
||||
Surf_SimpleWorld(es, pvs);
|
||||
#if defined(Q2BSP) || defined(Q3BSP)
|
||||
if (es->wmodel->fromgame == fg_quake2 || es->wmodel->fromgame == fg_quake3)
|
||||
{
|
||||
if (es->cluster[1] != -1 && es->cluster[0] != es->cluster[1])
|
||||
{ //view is near to a water boundary. this implies the water crosses the near clip plane.
|
||||
qbyte tmppvs[MAX_MAP_LEAFS/8], *pvs2;
|
||||
int c;
|
||||
pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], es->pvs, sizeof(es->pvs));
|
||||
pvs2 = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[1], tmppvs, sizeof(tmppvs));
|
||||
c = (es->wmodel->numclusters+31)/32;
|
||||
for (i=0 ; i<c ; i++)
|
||||
((int *)es->pvs)[i] = ((int *)pvs)[i] | ((int *)pvs2)[i];
|
||||
pvs = es->pvs;
|
||||
}
|
||||
else
|
||||
pvs = es->wmodel->funcs.ClusterPVS(es->wmodel, es->cluster[0], es->pvs, sizeof(es->pvs));
|
||||
|
||||
Surf_SimpleWorld_Q3BSP(es, pvs);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
//maybe we should just use fatpvs instead, and wait for completion when outside?
|
||||
if (es->leaf[1])
|
||||
{ //view is near to a water boundary. this implies the water crosses the near clip plane.
|
||||
qbyte tmppvs[MAX_MAP_LEAFS/8];
|
||||
int c;
|
||||
Q1BSP_LeafPVS (es->wmodel, es->leaf[0], es->pvs, sizeof(es->pvs));
|
||||
Q1BSP_LeafPVS (es->wmodel, es->leaf[1], tmppvs, sizeof(tmppvs));
|
||||
c = (es->wmodel->numclusters+31)/32;
|
||||
for (i=0 ; i<c ; i++)
|
||||
((int *)es->pvs)[i] |= ((int *)tmppvs)[i];
|
||||
pvs = es->pvs;
|
||||
}
|
||||
else
|
||||
{
|
||||
pvs = Q1BSP_LeafPVS (es->wmodel, es->leaf[0], es->pvs, sizeof(es->pvs));
|
||||
}
|
||||
Surf_SimpleWorld_Q1BSP(es, pvs);
|
||||
}
|
||||
|
||||
COM_AddWork(WG_MAIN, R_GeneratedWorldEBO, es, NULL, 0, 0);
|
||||
}
|
||||
|
@ -2876,52 +2960,89 @@ void Surf_DrawWorld (void)
|
|||
Surf_LightmapShift(cl.worldmodel);
|
||||
|
||||
#ifdef THREADEDWORLD
|
||||
if ((r_dynamic.ival < 0 || cl.worldmodel->numbatches) && !r_refdef.recurse && cl.worldmodel->type == mod_brush && cl.worldmodel->fromgame == fg_quake)
|
||||
if ((r_dynamic.ival < 0 || cl.worldmodel->numbatches) && !r_refdef.recurse && cl.worldmodel->type == mod_brush)
|
||||
{
|
||||
int i = MAX_LIGHTSTYLES;
|
||||
if (webostate && webostate->wmodel != cl.worldmodel)
|
||||
{
|
||||
R_DestroyWorldEBO(webostate);
|
||||
webostate = NULL;
|
||||
}
|
||||
|
||||
if (webostate && !webogenerating)
|
||||
for (i = 0; i < MAX_LIGHTSTYLES; i++)
|
||||
{
|
||||
if (webostate->lightstylevalues[i] != d_lightstylevalue[i])
|
||||
break;
|
||||
}
|
||||
if (webostate && webostate->leaf[0] == r_viewleaf && webostate->leaf[1] == r_viewleaf2 && i == MAX_LIGHTSTYLES)
|
||||
if (qrenderer != QR_OPENGL && qrenderer != QR_VULKAN)
|
||||
;
|
||||
else if (cl.worldmodel->fromgame == fg_quake)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!webogenerating)
|
||||
{
|
||||
int i;
|
||||
if (!cl.worldmodel->numbatches)
|
||||
{
|
||||
int sortid;
|
||||
batch_t *batch;
|
||||
cl.worldmodel->numbatches = 0;
|
||||
for (sortid = 0; sortid < SHADER_SORT_COUNT; sortid++)
|
||||
for (batch = cl.worldmodel->batches[sortid]; batch != NULL; batch = batch->next)
|
||||
{
|
||||
batch->ebobatch = cl.worldmodel->numbatches;
|
||||
cl.worldmodel->numbatches++;
|
||||
}
|
||||
}
|
||||
webogeneratingstate = true;
|
||||
webogenerating = BZ_Malloc(sizeof(*webogenerating) + sizeof(webogenerating->batches[0]) * (cl.worldmodel->numbatches-1));
|
||||
webogenerating->wmodel = cl.worldmodel;
|
||||
webogenerating->leaf[0] = r_viewleaf;
|
||||
webogenerating->leaf[1] = r_viewleaf2;
|
||||
int i = MAX_LIGHTSTYLES;
|
||||
if (webostate && !webogenerating)
|
||||
for (i = 0; i < MAX_LIGHTSTYLES; i++)
|
||||
webogenerating->lightstylevalues[i] = d_lightstylevalue[i];
|
||||
Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid));
|
||||
COM_AddWork(WG_LOADER, R_GenWorldEBO, webogenerating, NULL, 0, 0);
|
||||
{
|
||||
if (webostate->lightstylevalues[i] != d_lightstylevalue[i])
|
||||
break;
|
||||
}
|
||||
if (webostate && webostate->leaf[0] == r_viewleaf && webostate->leaf[1] == r_viewleaf2 && i == MAX_LIGHTSTYLES)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!webogenerating)
|
||||
{
|
||||
int i;
|
||||
if (!cl.worldmodel->numbatches)
|
||||
{
|
||||
int sortid;
|
||||
batch_t *batch;
|
||||
cl.worldmodel->numbatches = 0;
|
||||
for (sortid = 0; sortid < SHADER_SORT_COUNT; sortid++)
|
||||
for (batch = cl.worldmodel->batches[sortid]; batch != NULL; batch = batch->next)
|
||||
{
|
||||
batch->ebobatch = cl.worldmodel->numbatches;
|
||||
cl.worldmodel->numbatches++;
|
||||
}
|
||||
}
|
||||
webogeneratingstate = true;
|
||||
webogenerating = BZ_Malloc(sizeof(*webogenerating) + sizeof(webogenerating->batches[0]) * (cl.worldmodel->numbatches-1));
|
||||
webogenerating->wmodel = cl.worldmodel;
|
||||
webogenerating->leaf[0] = r_viewleaf;
|
||||
webogenerating->leaf[1] = r_viewleaf2;
|
||||
for (i = 0; i < MAX_LIGHTSTYLES; i++)
|
||||
webogenerating->lightstylevalues[i] = d_lightstylevalue[i];
|
||||
Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid));
|
||||
COM_AddWork(WG_LOADER, R_GenWorldEBO, webogenerating, NULL, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (cl.worldmodel->fromgame == fg_quake3)
|
||||
{
|
||||
if (webostate && webostate->cluster[0] == r_viewcluster && webostate->cluster[1] == r_viewcluster2)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!webogenerating)
|
||||
{
|
||||
if (!cl.worldmodel->numbatches)
|
||||
{
|
||||
int sortid;
|
||||
batch_t *batch;
|
||||
cl.worldmodel->numbatches = 0;
|
||||
for (sortid = 0; sortid < SHADER_SORT_COUNT; sortid++)
|
||||
for (batch = cl.worldmodel->batches[sortid]; batch != NULL; batch = batch->next)
|
||||
{
|
||||
batch->ebobatch = cl.worldmodel->numbatches;
|
||||
cl.worldmodel->numbatches++;
|
||||
}
|
||||
}
|
||||
webogeneratingstate = true;
|
||||
webogenerating = BZ_Malloc(sizeof(*webogenerating) + sizeof(webogenerating->batches[0]) * (cl.worldmodel->numbatches-1));
|
||||
webogenerating->wmodel = cl.worldmodel;
|
||||
webogenerating->cluster[0] = r_viewcluster;
|
||||
webogenerating->cluster[1] = r_viewcluster2;
|
||||
Q_strncpyz(webogenerating->dbgid, "webostate", sizeof(webogenerating->dbgid));
|
||||
COM_AddWork(WG_LOADER, R_GenWorldEBO, webogenerating, NULL, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (webostate)
|
||||
{
|
||||
entvis = surfvis = webostate->pvs;
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
#include <string.h>
|
||||
|
||||
|
||||
#define DEFAULT_WIDTH 640
|
||||
#define DEFAULT_HEIGHT 480
|
||||
#define DEFAULT_BPP 32
|
||||
|
||||
refdef_t r_refdef;
|
||||
vec3_t r_origin, vpn, vright, vup;
|
||||
entity_t r_worldentity;
|
||||
|
@ -21,6 +25,7 @@ int rspeeds[RSPEED_MAX];
|
|||
int rquant[RQUANT_MAX];
|
||||
|
||||
void R_InitParticleTexture (void);
|
||||
void R_RestartRenderer (rendererstate_t *newr);
|
||||
|
||||
qboolean vid_isfullscreen;
|
||||
|
||||
|
@ -406,7 +411,8 @@ cvar_t r_shadow_heightscale_bumpmap = CVARD ("r_shadow_heightscale_bumpmap",
|
|||
cvar_t r_glsl_offsetmapping = CVARFD ("r_glsl_offsetmapping", "0", CVAR_ARCHIVE|CVAR_SHADERSYSTEM, "Enables the use of paralax mapping, adding fake depth to textures.");
|
||||
cvar_t r_glsl_offsetmapping_scale = CVAR ("r_glsl_offsetmapping_scale", "0.04");
|
||||
cvar_t r_glsl_offsetmapping_reliefmapping = CVARFD("r_glsl_offsetmapping_reliefmapping", "0", CVAR_ARCHIVE|CVAR_SHADERSYSTEM, "Changes the paralax sampling mode to be a bit nicer, but noticably more expensive at high resolutions. r_glsl_offsetmapping must be set.");
|
||||
cvar_t r_glsl_turbscale = CVARFD ("r_glsl_turbscale", "1", CVAR_ARCHIVE, "Controls the strength of water ripples (used by the altwater glsl code).");
|
||||
cvar_t r_glsl_turbscale_reflect = CVARFD ("r_glsl_turbscale_reflect", "1", CVAR_ARCHIVE, "Controls the strength of the water reflection ripples (used by the altwater glsl code).");
|
||||
cvar_t r_glsl_turbscale_refract = CVARFD ("r_glsl_turbscale_refract", "1", CVAR_ARCHIVE, "Controls the strength of the underwater ripples (used by the altwater glsl code).");
|
||||
|
||||
cvar_t r_fastturbcolour = CVARFD ("r_fastturbcolour", "0.1 0.2 0.3", CVAR_ARCHIVE, "The colour to use for water surfaces draw with r_waterstyle 0.\n");
|
||||
cvar_t r_waterstyle = CVARFD ("r_waterstyle", "1", CVAR_ARCHIVE|CVAR_SHADERSYSTEM, "Changes how water, and teleporters are drawn. Possible values are:\n0: fastturb-style block colour.\n1: regular q1-style water.\n2: refraction(ripply and transparent)\n3: refraction with reflection at an angle\n4: ripplemapped without reflections (requires particle effects)\n5: ripples+reflections");
|
||||
|
@ -424,16 +430,16 @@ cvar_t vid_desktopgamma = CVARFD ("vid_desktopgamma", "0",
|
|||
|
||||
cvar_t r_fog_exp2 = CVARD ("r_fog_exp2", "1", "Expresses how fog fades with distance. 0 (matching DarkPlaces's default) is typically more realistic, while 1 (matching FitzQuake and others) is more common.");
|
||||
|
||||
#ifdef VKQUAKE
|
||||
cvar_t vk_stagingbuffers = CVARD ("vk_stagingbuffers", "", "Configures which dynamic buffers are copied into gpu memory for rendering, instead of reading from shared memory. Empty for default settings.\nAccepted chars are u, e, v, 0.");
|
||||
cvar_t vk_submissionthread = CVARD ("vk_submissionthread", "", "Execute submits+presents on a thread dedicated to executing them. This may be a significant speedup on certain drivers.");
|
||||
cvar_t vk_debug = CVARD ("vk_debug", "0", "Register a debug handler to display driver/layer messages. 2 enables the standard validation layers.");
|
||||
cvar_t vk_loadglsl = CVARD ("vk_loadglsl", "", "Enable direct loading of glsl, where supported by drivers. Do not use in combination with vk_debug 2 (vk_debug should be 1 if you want to see any errors). Don't forget to do a vid_restart after.");
|
||||
#endif
|
||||
|
||||
extern cvar_t gl_dither;
|
||||
cvar_t gl_screenangle = SCVAR("gl_screenangle", "0");
|
||||
#endif
|
||||
|
||||
#ifdef VKQUAKE
|
||||
cvar_t vk_stagingbuffers = CVARD ("vk_stagingbuffers", "", "Configures which dynamic buffers are copied into gpu memory for rendering, instead of reading from shared memory. Empty for default settings.\nAccepted chars are u, e, v, 0.");
|
||||
cvar_t vk_submissionthread = CVARD ("vk_submissionthread", "", "Execute submits+presents on a thread dedicated to executing them. This may be a significant speedup on certain drivers.");
|
||||
cvar_t vk_debug = CVARD ("vk_debug", "0", "Register a debug handler to display driver/layer messages. 2 enables the standard validation layers.");
|
||||
cvar_t vk_loadglsl = CVARD ("vk_loadglsl", "", "Enable direct loading of glsl, where supported by drivers. Do not use in combination with vk_debug 2 (vk_debug should be 1 if you want to see any glsl compile errors). Don't forget to do a vid_restart after.");
|
||||
cvar_t vk_dualqueue = CVARD ("vk_dualqueue", "", "Attempt to use a separate queue for presentation. Blank for default.");
|
||||
#endif
|
||||
|
||||
#if defined(D3DQUAKE)
|
||||
|
@ -595,6 +601,51 @@ void R_ListSkyBoxes_f(void)
|
|||
void R_SetRenderer_f (void);
|
||||
void R_ReloadRenderer_f (void);
|
||||
|
||||
void R_ToggleFullscreen_f(void)
|
||||
{
|
||||
double time;
|
||||
rendererstate_t newr;
|
||||
|
||||
if (currentrendererstate.renderer == NULL)
|
||||
{
|
||||
Con_Printf("vid_toggle: no renderer currently set\n");
|
||||
return;
|
||||
}
|
||||
//vid toggle makes no sense with these two...
|
||||
if (currentrendererstate.renderer->rtype == QR_HEADLESS || currentrendererstate.renderer->rtype == QR_NONE)
|
||||
return;
|
||||
|
||||
Cvar_ApplyLatches(CVAR_RENDERERLATCH);
|
||||
|
||||
newr = currentrendererstate;
|
||||
newr.fullscreen = newr.fullscreen?0:2;
|
||||
if (newr.fullscreen)
|
||||
{
|
||||
int dbpp, dheight, dwidth, drate;
|
||||
if (!Sys_GetDesktopParameters(&dwidth, &dheight, &dbpp, &drate))
|
||||
{
|
||||
dwidth = DEFAULT_WIDTH;
|
||||
dheight = DEFAULT_HEIGHT;
|
||||
dbpp = DEFAULT_BPP;
|
||||
drate = 0;
|
||||
}
|
||||
|
||||
newr.width = dwidth;
|
||||
newr.height = dheight;
|
||||
}
|
||||
else
|
||||
{
|
||||
newr.width = DEFAULT_WIDTH;
|
||||
newr.height = DEFAULT_HEIGHT;
|
||||
}
|
||||
|
||||
time = Sys_DoubleTime();
|
||||
R_RestartRenderer(&newr);
|
||||
Con_DPrintf("main thread video restart took %f secs\n", Sys_DoubleTime() - time);
|
||||
// COM_WorkerFullSync();
|
||||
// Con_Printf("full video restart took %f secs\n", Sys_DoubleTime() - time);
|
||||
}
|
||||
|
||||
void Renderer_Init(void)
|
||||
{
|
||||
#ifdef AVAIL_JPEGLIB
|
||||
|
@ -611,6 +662,7 @@ void Renderer_Init(void)
|
|||
Cmd_AddCommand("setrenderer", R_SetRenderer_f);
|
||||
Cmd_AddCommand("vid_restart", R_RestartRenderer_f);
|
||||
Cmd_AddCommand("vid_reload", R_ReloadRenderer_f);
|
||||
Cmd_AddCommand("vid_toggle", R_ToggleFullscreen_f);
|
||||
|
||||
#ifdef RTLIGHTS
|
||||
Cmd_AddCommand ("r_editlights_reload", R_ReloadRTLights_f);
|
||||
|
@ -758,7 +810,8 @@ void Renderer_Init(void)
|
|||
Cvar_Register (&r_glsl_offsetmapping, GRAPHICALNICETIES);
|
||||
Cvar_Register (&r_glsl_offsetmapping_scale, GRAPHICALNICETIES);
|
||||
Cvar_Register (&r_glsl_offsetmapping_reliefmapping, GRAPHICALNICETIES);
|
||||
Cvar_Register (&r_glsl_turbscale, GRAPHICALNICETIES);
|
||||
Cvar_Register (&r_glsl_turbscale_reflect, GRAPHICALNICETIES);
|
||||
Cvar_Register (&r_glsl_turbscale_refract, GRAPHICALNICETIES);
|
||||
|
||||
Cvar_Register(&scr_viewsize, SCREENOPTIONS);
|
||||
Cvar_Register(&scr_fov, SCREENOPTIONS);
|
||||
|
@ -860,6 +913,7 @@ void Renderer_Init(void)
|
|||
Cvar_Register (&vk_submissionthread, VKRENDEREROPTIONS);
|
||||
Cvar_Register (&vk_debug, VKRENDEREROPTIONS);
|
||||
Cvar_Register (&vk_loadglsl, VKRENDEREROPTIONS);
|
||||
Cvar_Register (&vk_dualqueue, VKRENDEREROPTIONS);
|
||||
#endif
|
||||
|
||||
// misc
|
||||
|
@ -1572,10 +1626,6 @@ void R_ReloadRenderer_f (void)
|
|||
R_ApplyRenderer_Load(NULL);
|
||||
}
|
||||
|
||||
#define DEFAULT_WIDTH 640
|
||||
#define DEFAULT_HEIGHT 480
|
||||
#define DEFAULT_BPP 32
|
||||
|
||||
//use Cvar_ApplyLatches(CVAR_RENDERERLATCH) beforehand.
|
||||
qboolean R_BuildRenderstate(rendererstate_t *newr, char *rendererstring)
|
||||
{
|
||||
|
|
|
@ -944,6 +944,7 @@ void Sbar_Flush (void)
|
|||
void Sbar_Start (void) //if one of these fails, skip the entire status bar.
|
||||
{
|
||||
int i;
|
||||
size_t lumpsize;
|
||||
if (sbar_loaded)
|
||||
return;
|
||||
|
||||
|
@ -967,7 +968,7 @@ void Sbar_Start (void) //if one of these fails, skip the entire status bar.
|
|||
|
||||
#ifdef HEXEN2
|
||||
sbar_hexen2 = false;
|
||||
if (W_SafeGetLumpName("tinyfont"))
|
||||
if (W_SafeGetLumpName("tinyfont", &lumpsize))
|
||||
sbar_hexen2 = true;
|
||||
// if (sb_nums[0][0] && sb_nums[0][0]->width < 13)
|
||||
// sbar_hexen2 = true;
|
||||
|
@ -1048,7 +1049,7 @@ void Sbar_Start (void) //if one of these fails, skip the entire status bar.
|
|||
sb_scorebar = Sbar_PicFromWad ("scorebar");
|
||||
|
||||
//try to detect rogue wads, and thus the stats we will be getting from the server.
|
||||
sbar_rogue = COM_CheckParm("-rogue") || !!W_SafeGetLumpName("r_lava");
|
||||
sbar_rogue = COM_CheckParm("-rogue") || !!W_SafeGetLumpName("r_lava", &lumpsize);
|
||||
if (sbar_rogue)
|
||||
{
|
||||
rsb_invbar[0] = Sbar_PicFromWad ("r_invbar1");
|
||||
|
@ -1070,7 +1071,7 @@ void Sbar_Start (void) //if one of these fails, skip the entire status bar.
|
|||
rsb_ammo[2] = Sbar_PicFromWad ("r_ammoplasma");
|
||||
}
|
||||
|
||||
sbar_hipnotic = COM_CheckParm("-hipnotic") || !!W_SafeGetLumpName("inv_mjolnir");
|
||||
sbar_hipnotic = COM_CheckParm("-hipnotic") || !!W_SafeGetLumpName("inv_mjolnir", &lumpsize);
|
||||
if (sbar_hipnotic)
|
||||
{
|
||||
hsb_weapons[0][0] = Sbar_PicFromWad ("inv_laser");
|
||||
|
@ -3193,6 +3194,7 @@ ping time frags name
|
|||
==================
|
||||
*/
|
||||
|
||||
#define NOFILL
|
||||
//for reference:
|
||||
//define COLUMN(title, width, code)
|
||||
|
||||
|
@ -3202,21 +3204,21 @@ ping time frags name
|
|||
if (p < 0 || p > 999) p = 999; \
|
||||
sprintf(num, "%4i", p); \
|
||||
Draw_FunStringWidth(x, y, num, 4*8, false, false); \
|
||||
},)
|
||||
},NOFILL)
|
||||
|
||||
#define COLUMN_PL COLUMN(pl, 2*8, \
|
||||
{ \
|
||||
int p = s->pl; \
|
||||
sprintf(num, "%2i", p); \
|
||||
Draw_FunStringWidth(x, y, num, 2*8, false, false); \
|
||||
},)
|
||||
},NOFILL)
|
||||
#define COLUMN_TIME COLUMN(time, 4*8, \
|
||||
{ \
|
||||
total = realtime - s->realentertime; \
|
||||
minutes = (int)total/60; \
|
||||
sprintf (num, "%4i", minutes); \
|
||||
Draw_FunStringWidth(x, y, num, 4*8, false, false); \
|
||||
},)
|
||||
},NOFILL)
|
||||
#define COLUMN_FRAGS COLUMN(frags, 5*8, \
|
||||
{ \
|
||||
int cx; int cy; \
|
||||
|
@ -3262,14 +3264,14 @@ ping time frags name
|
|||
{ \
|
||||
Draw_FunStringWidth(x, y, s->team, 4*8, false, false); \
|
||||
} \
|
||||
},)
|
||||
#define COLUMN_NAME COLUMN(name, namesize, {Draw_FunStringWidth(x, y, s->name, namesize, false, false);},)
|
||||
#define COLUMN_KILLS COLUMN(kils, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetKills(k)), 4*8, false, false);},)
|
||||
#define COLUMN_TKILLS COLUMN(tkil, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetTKills(k)), 4*8, false, false);},)
|
||||
#define COLUMN_DEATHS COLUMN(dths, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetDeaths(k)), 4*8, false, false);},)
|
||||
#define COLUMN_TOUCHES COLUMN(tchs, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetTouches(k)), 4*8, false, false);},)
|
||||
#define COLUMN_CAPS COLUMN(caps, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetCaptures(k)), 4*8, false, false);},)
|
||||
#define COLUMN_AFK COLUMN(, 0, {int cs = atoi(Info_ValueForKey(s->userinfo, "chat")); if (cs)Draw_FunStringWidth(x+4, y, (cs&2)?"afk":"msg", 4*8, false, false);},)
|
||||
},NOFILL)
|
||||
#define COLUMN_NAME COLUMN(name, namesize, {Draw_FunStringWidth(x, y, s->name, namesize, false, false);},NOFILL)
|
||||
#define COLUMN_KILLS COLUMN(kils, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetKills(k)), 4*8, false, false);},NOFILL)
|
||||
#define COLUMN_TKILLS COLUMN(tkil, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetTKills(k)), 4*8, false, false);},NOFILL)
|
||||
#define COLUMN_DEATHS COLUMN(dths, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetDeaths(k)), 4*8, false, false);},NOFILL)
|
||||
#define COLUMN_TOUCHES COLUMN(tchs, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetTouches(k)), 4*8, false, false);},NOFILL)
|
||||
#define COLUMN_CAPS COLUMN(caps, 4*8, {Draw_FunStringWidth(x, y, va("%4i", Stats_GetCaptures(k)), 4*8, false, false);},NOFILL)
|
||||
#define COLUMN_AFK COLUMN(afk, 0, {int cs = atoi(Info_ValueForKey(s->userinfo, "chat")); if (cs)Draw_FunStringWidth(x+4, y, (cs&2)?"afk":"msg", 4*8, false, false);},NOFILL)
|
||||
|
||||
|
||||
//columns are listed here in display order
|
||||
|
|
|
@ -931,8 +931,7 @@ static qboolean OpenAL_InitLibrary(void)
|
|||
|
||||
static qboolean OpenAL_Init(soundcardinfo_t *sc, const char *devname)
|
||||
{
|
||||
oalinfo_t *oali = Z_Malloc(sizeof(oalinfo_t));
|
||||
sc->handle = oali;
|
||||
oalinfo_t *oali;
|
||||
|
||||
if (!OpenAL_InitLibrary())
|
||||
{
|
||||
|
@ -943,46 +942,43 @@ static qboolean OpenAL_Init(soundcardinfo_t *sc, const char *devname)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (oali->OpenAL_Context)
|
||||
{
|
||||
Con_Printf(SDRVNAME": only able to load one device at a time\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!devname || !*devname)
|
||||
devname = palcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
|
||||
Q_snprintfz(sc->name, sizeof(sc->name), "%s", devname);
|
||||
Con_Printf("Initiating "SDRVNAME": %s.\n", devname);
|
||||
|
||||
oali = Z_Malloc(sizeof(oalinfo_t));
|
||||
sc->handle = oali;
|
||||
|
||||
oali->OpenAL_Device = palcOpenDevice(devname);
|
||||
if (oali->OpenAL_Device == NULL)
|
||||
{
|
||||
PrintALError("Could not init a sound device\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
oali->OpenAL_Context = palcCreateContext(oali->OpenAL_Device, NULL);
|
||||
if (!oali->OpenAL_Context)
|
||||
else
|
||||
{
|
||||
PrintALError("Could not init a sound context\n");
|
||||
return false;
|
||||
oali->OpenAL_Context = palcCreateContext(oali->OpenAL_Device, NULL);
|
||||
if (!oali->OpenAL_Context)
|
||||
PrintALError("Could not init a sound context\n");
|
||||
else
|
||||
{
|
||||
palcMakeContextCurrent(oali->OpenAL_Context);
|
||||
// palcProcessContext(oali->OpenAL_Context);
|
||||
|
||||
//S_Info();
|
||||
|
||||
//fixme...
|
||||
memset(oali->source, 0, sizeof(oali->source));
|
||||
PrintALError("alGensources for normal sources");
|
||||
|
||||
palListenerfv(AL_POSITION, oali->ListenPos);
|
||||
palListenerfv(AL_VELOCITY, oali->ListenVel);
|
||||
palListenerfv(AL_ORIENTATION, oali->ListenOri);
|
||||
|
||||
return true;
|
||||
}
|
||||
palcCloseDevice(oali->OpenAL_Device);
|
||||
}
|
||||
|
||||
palcMakeContextCurrent(oali->OpenAL_Context);
|
||||
// palcProcessContext(oali->OpenAL_Context);
|
||||
|
||||
//S_Info();
|
||||
|
||||
//fixme...
|
||||
memset(oali->source, 0, sizeof(oali->source));
|
||||
PrintALError("alGensources for normal sources");
|
||||
|
||||
|
||||
palListenerfv(AL_POSITION, oali->ListenPos);
|
||||
palListenerfv(AL_VELOCITY, oali->ListenVel);
|
||||
palListenerfv(AL_ORIENTATION, oali->ListenOri);
|
||||
|
||||
return true;
|
||||
Z_Free(oali);
|
||||
return false;
|
||||
}
|
||||
|
||||
//called when some al-specific cvar has changed that is linked to openal state.
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include <X11/Intrinsic.h>
|
||||
#endif
|
||||
|
||||
#include "libs/npapi/npupp.h"
|
||||
#include "../libs/npapi/npupp.h"
|
||||
#include "sys_plugfte.h"
|
||||
|
||||
/*work around absolute crapness in the npapi headers*/
|
||||
|
|
|
@ -18,6 +18,10 @@ void *globalmutex;
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef INVALID_FILE_ATTRIBUTES
|
||||
#define INVALID_FILE_ATTRIBUTES ~0
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
dllhandle_t *Sys_LoadLibrary(const char *name, dllfunction_t *funcs)
|
||||
{
|
||||
|
|
|
@ -717,7 +717,7 @@ void Sys_Sleep (double seconds)
|
|||
#ifdef HAVEAUTOUPDATE
|
||||
int Sys_GetAutoUpdateSetting(void)
|
||||
{
|
||||
return -1;
|
||||
return UPD_UNSUPPORTED;
|
||||
}
|
||||
void Sys_SetAutoUpdateSetting(int newval)
|
||||
{
|
||||
|
|
|
@ -295,8 +295,10 @@ int Sys_EnumerateFiles (const char *gpath, const char *match, int (QDECL *func)(
|
|||
#endif
|
||||
|
||||
#if defined(_DEBUG) || defined(DEBUG)
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1200
|
||||
#define CATCHCRASH
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(CLIENTONLY) && !defined(SERVERONLY)
|
||||
qboolean isDedicated = false;
|
||||
|
@ -1061,12 +1063,18 @@ qboolean Sys_Rename (char *oldfname, char *newfname)
|
|||
return !rename(oldfname, newfname);
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define ULL(x) x##ui64
|
||||
#else
|
||||
#define ULL(x) x##ull
|
||||
#endif
|
||||
|
||||
static time_t Sys_FileTimeToTime(FILETIME ft)
|
||||
{
|
||||
ULARGE_INTEGER ull;
|
||||
ull.LowPart = ft.dwLowDateTime;
|
||||
ull.HighPart = ft.dwHighDateTime;
|
||||
return ull.QuadPart / 10000000ULL - 11644473600ULL;
|
||||
ULARGE_INTEGER ull;
|
||||
ull.LowPart = ft.dwLowDateTime;
|
||||
ull.HighPart = ft.dwHighDateTime;
|
||||
return ull.QuadPart / ULL(10000000) - ULL(11644473600);
|
||||
}
|
||||
|
||||
static int Sys_EnumerateFiles_9x (const char *match, int matchstart, int neststart, int (QDECL *func)(const char *fname, qofs_t fsize, time_t mtime, void *parm, searchpathfuncs_t *spath), void *parm, searchpathfuncs_t *spath)
|
||||
|
@ -2123,10 +2131,6 @@ void Sys_SendKeyEvents (void)
|
|||
{
|
||||
MSG msg;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
|
||||
if (isPlugin)
|
||||
{
|
||||
DWORD avail;
|
||||
|
@ -2164,7 +2168,7 @@ void Sys_SendKeyEvents (void)
|
|||
sys_parenttop = strtoul(Cmd_Argv(2), NULL, 0);
|
||||
sys_parentwidth = strtoul(Cmd_Argv(3), NULL, 0);
|
||||
sys_parentheight = strtoul(Cmd_Argv(4), NULL, 0);
|
||||
sys_parentwindow = (HWND)(intptr_t)strtoull(Cmd_Argv(5), NULL, 16);
|
||||
sys_parentwindow = (HWND)(qintptr_t)strtoull(Cmd_Argv(5), NULL, 16);
|
||||
}
|
||||
#if !defined(CLIENTONLY) || defined(CSQC_DAT) || defined(MENU_DAT)
|
||||
else if (QCExternalDebuggerCommand(text))
|
||||
|
@ -2261,9 +2265,19 @@ HINSTANCE global_hInstance;
|
|||
int global_nCmdShow;
|
||||
HWND hwnd_dialog;
|
||||
|
||||
|
||||
static const IID qIID_IShellLinkW = {0x000214F9L, 0, 0, {0xc0,0,0,0,0,0,0,0x46}};
|
||||
static const IID qIID_IPersistFile = {0x0000010BL, 0, 0, {0xc0,0,0,0,0,0,0,0x46}};
|
||||
|
||||
#include <shlobj.h>
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1200
|
||||
#define pSHBrowseForFolderW SHBrowseForFolderW
|
||||
#define pSHGetPathFromIDListW SHGetPathFromIDListW
|
||||
#define pSHGetSpecialFolderPathW SHGetSpecialFolderPathW
|
||||
#define pShell_NotifyIconW Shell_NotifyIconW
|
||||
void Win7_Init(void)
|
||||
{
|
||||
}
|
||||
#else
|
||||
|
||||
typedef struct qSHARDAPPIDINFOLINK {
|
||||
IShellLinkW *psl;
|
||||
|
@ -2425,9 +2439,6 @@ typedef struct qICustomDestinationList
|
|||
static const IID qIID_ICustomDestinationList = {0x6332debf, 0x87b5, 0x4670, {0x90,0xc0,0x5e,0x57,0xb4,0x08,0xa4,0x9e}};
|
||||
static const CLSID qCLSID_DestinationList = {0x77f10cf0, 0x3db5, 0x4966, {0xb5,0x20,0xb7,0xc5,0x4f,0xd3,0x5e,0xd6}};
|
||||
|
||||
static const IID qIID_IShellLinkW = {0x000214F9L, 0, 0, {0xc0,0,0,0,0,0,0,0x46}};
|
||||
static const IID qIID_IPersistFile = {0x0000010BL, 0, 0, {0xc0,0,0,0,0,0,0,0x46}};
|
||||
|
||||
#define WIN7_APPNAME L"FTEQuake"
|
||||
|
||||
static IShellLinkW *CreateShellLink(char *command, char *target, char *title, char *desc)
|
||||
|
@ -2604,6 +2615,7 @@ void Win7_TaskListInit(void)
|
|||
cdl->lpVtbl->Release(cdl);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
BOOL CopyFileU(const char *src, const char *dst, BOOL bFailIfExists)
|
||||
{
|
||||
|
@ -2843,12 +2855,12 @@ void Update_Check(void)
|
|||
static qboolean doneupdatecheck; //once per run
|
||||
struct dl_download *dl;
|
||||
|
||||
if (sys_autoupdatesetting < 2) //not if disabled (do it once it does get enabled)
|
||||
if (sys_autoupdatesetting <= UPD_OFF) //not if disabled (do it once it does get enabled)
|
||||
return;
|
||||
|
||||
if (!doneupdatecheck)
|
||||
{
|
||||
char *updateroot = (sys_autoupdatesetting>=3)?UPDATE_URL_NIGHTLY:UPDATE_URL_TESTED;
|
||||
char *updateroot = (sys_autoupdatesetting>=UPD_TESTING)?UPDATE_URL_NIGHTLY:UPDATE_URL_TESTED;
|
||||
doneupdatecheck = true;
|
||||
dl = HTTP_CL_Get(va(UPDATE_URL_VERSION, updateroot), NULL, Update_Versioninfo_Available);
|
||||
dl->file = FS_OpenTemp();
|
||||
|
@ -2883,7 +2895,13 @@ BOOL MoveFileU(const char *src, const char *dst)
|
|||
{
|
||||
wchar_t wide1[2048];
|
||||
wchar_t wide2[2048];
|
||||
return MoveFileW(widen(wide1, sizeof(wide1), src), widen(wide2, sizeof(wide2), dst));
|
||||
return MoveFileExW(widen(wide1, sizeof(wide1), src), widen(wide2, sizeof(wide2), dst), MOVEFILE_COPY_ALLOWED);
|
||||
}
|
||||
|
||||
void Sys_SetUpdatedBinary(const char *binary)
|
||||
{
|
||||
//downloads menu has provided a new binary to use
|
||||
MyRegSetValue(HKEY_CURRENT_USER, "Software\\"FULLENGINENAME, "pending" UPD_BUILDTYPE EXETYPE, REG_SZ, binary, strlen(binary)+1);
|
||||
}
|
||||
|
||||
qboolean Sys_CheckUpdated(char *bindir, size_t bindirsize)
|
||||
|
@ -2896,11 +2914,11 @@ qboolean Sys_CheckUpdated(char *bindir, size_t bindirsize)
|
|||
char *e;
|
||||
strtoul(SVNREVISIONSTR, &e, 10);
|
||||
if (!*SVNREVISIONSTR || *e) //svn revision didn't parse as an exact number. this implies it has an 'M' in it to mark it as modified, or a - to mean unknown. either way, its bad and autoupdates when we don't know what we're updating from is a bad idea.
|
||||
sys_autoupdatesetting = -1;
|
||||
sys_autoupdatesetting = UPD_UNSUPPORTED;
|
||||
else if (COM_CheckParm("-noupdate") || COM_CheckParm("--noupdate") || COM_CheckParm("-noautoupdate") || COM_CheckParm("--noautoupdate"))
|
||||
sys_autoupdatesetting = 0;
|
||||
sys_autoupdatesetting = UPD_REVERT;
|
||||
else if (COM_CheckParm("-autoupdate") || COM_CheckParm("--autoupdate"))
|
||||
sys_autoupdatesetting = 3;
|
||||
sys_autoupdatesetting = UPD_TESTING;
|
||||
else
|
||||
{
|
||||
//favour 'tested'
|
||||
|
@ -2909,7 +2927,7 @@ qboolean Sys_CheckUpdated(char *bindir, size_t bindirsize)
|
|||
|
||||
if (!strcmp(SVNREVISIONSTR, "-"))
|
||||
return false; //no revision info in this build, meaning its custom built and thus cannot check against the available updated versions.
|
||||
else if (sys_autoupdatesetting == 0)
|
||||
else if (sys_autoupdatesetting == UPD_REVERT || sys_autoupdatesetting == UPD_UNSUPPORTED)
|
||||
return false;
|
||||
else if (isPlugin == 1)
|
||||
{
|
||||
|
@ -2989,6 +3007,9 @@ int Sys_GetAutoUpdateSetting(void)
|
|||
void Sys_SetAutoUpdateSetting(int newval)
|
||||
{
|
||||
}
|
||||
void Sys_SetUpdatedBinary(const char *binary)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
qboolean Sys_CheckUpdated(char *bindir, size_t bindirsize)
|
||||
{
|
||||
|
@ -3094,7 +3115,7 @@ void Sys_DoFileAssociations(int elevated)
|
|||
if (!ok && elevated < 2)
|
||||
{
|
||||
HINSTANCE ch = ShellExecute(mainwindow, "runas", com_argv[0], va("-register_types %i", elevated+1), NULL, SW_SHOWNORMAL);
|
||||
if ((intptr_t)ch <= 32)
|
||||
if ((qintptr_t)ch <= 32)
|
||||
Sys_DoFileAssociations(2);
|
||||
return;
|
||||
}
|
||||
|
@ -3277,7 +3298,16 @@ static BOOL microsoft_accessU(LPCSTR pszFolder, DWORD dwAccessDesired)
|
|||
return microsoft_accessW(widen(wpath, sizeof(wpath), pszFolder), dwAccessDesired);
|
||||
}
|
||||
|
||||
|
||||
#ifndef GWLP_WNDPROC
|
||||
#define GWLP_WNDPROC GWL_WNDPROC
|
||||
#define SetWindowLongPtr SetWindowLong
|
||||
#define LONG_PTR LONG
|
||||
#endif
|
||||
#ifndef BIF_NEWDIALOGSTYLE
|
||||
#define BIF_NEWDIALOGSTYLE 0x00000040 //v5
|
||||
#define BFFM_SETOKTEXT (WM_USER + 105) //v6
|
||||
#define BFFM_SETEXPANDED (WM_USER + 106) //v6
|
||||
#endif
|
||||
|
||||
static WNDPROC omgwtfwhyohwhy;
|
||||
static LRESULT CALLBACK stoopidstoopidstoopid(HWND w, UINT m, WPARAM wp, LPARAM lp)
|
||||
|
@ -3632,7 +3662,7 @@ qboolean Sys_RunInstaller(void)
|
|||
{
|
||||
GetModuleFileName(NULL, exepath, sizeof(exepath));
|
||||
ch = ShellExecute(mainwindow, "runas", com_argv[0], va("%s -doinstall", COM_Parse(GetCommandLine())), NULL, SW_SHOWNORMAL);
|
||||
if ((intptr_t)ch > 32)
|
||||
if ((qintptr_t)ch > 32)
|
||||
return true; //succeeded. should quit out.
|
||||
return Sys_DoInstall(); //if it failed, try doing it with the current privileges
|
||||
}
|
||||
|
@ -3898,11 +3928,7 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin
|
|||
|
||||
memset(&parms, 0, sizeof(parms));
|
||||
|
||||
// #ifndef MINGW
|
||||
// #if _MSC_VER > 1200
|
||||
Win7_Init();
|
||||
// #endif
|
||||
// #endif
|
||||
Win7_Init();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _M_IX86_FP >= 1
|
||||
|
@ -4356,7 +4382,7 @@ HCURSOR hArrowCursor, hCustomCursor;
|
|||
void *WIN_CreateCursor(const char *filename, float hotx, float hoty, float scale)
|
||||
{
|
||||
int width, height;
|
||||
BITMAPV5HEADER bi;
|
||||
BITMAPV4HEADER bi;
|
||||
DWORD x,y;
|
||||
HCURSOR hAlphaCursor = NULL;
|
||||
ICONINFO ii;
|
||||
|
@ -4393,20 +4419,20 @@ void *WIN_CreateCursor(const char *filename, float hotx, float hoty, float scale
|
|||
rgbadata_start = nd;
|
||||
}
|
||||
|
||||
memset(&bi,0, sizeof(BITMAPV5HEADER));
|
||||
bi.bV5Size = sizeof(BITMAPV5HEADER);
|
||||
bi.bV5Width = width;
|
||||
bi.bV5Height = height;
|
||||
bi.bV5Planes = 1;
|
||||
bi.bV5BitCount = 32;
|
||||
bi.bV5Compression = BI_BITFIELDS;
|
||||
memset(&bi,0, sizeof(bi));
|
||||
bi.bV4Size = sizeof(bi);
|
||||
bi.bV4Width = width;
|
||||
bi.bV4Height = height;
|
||||
bi.bV4Planes = 1;
|
||||
bi.bV4BitCount = 32;
|
||||
bi.bV4V4Compression = BI_BITFIELDS;
|
||||
// The following mask specification specifies a supported 32 BPP
|
||||
// alpha format for Windows XP.
|
||||
//FIXME: can we not just specify it as RGBA? meh.
|
||||
bi.bV5RedMask = 0x00FF0000;
|
||||
bi.bV5GreenMask = 0x0000FF00;
|
||||
bi.bV5BlueMask = 0x000000FF;
|
||||
bi.bV5AlphaMask = 0xFF000000;
|
||||
bi.bV4RedMask = 0x00FF0000;
|
||||
bi.bV4GreenMask = 0x0000FF00;
|
||||
bi.bV4BlueMask = 0x000000FF;
|
||||
bi.bV4AlphaMask = 0xFF000000;
|
||||
|
||||
// Create the DIB section with an alpha channel.
|
||||
maindc = GetDC(mainwindow);
|
||||
|
|
|
@ -124,7 +124,7 @@ void W_LoadWadFile (char *filename)
|
|||
W_GetLumpinfo
|
||||
=============
|
||||
*/
|
||||
lumpinfo_t *W_GetLumpinfo (char *name)
|
||||
/*lumpinfo_t *W_GetLumpinfo (char *name)
|
||||
{
|
||||
int i;
|
||||
lumpinfo_t *lump_p;
|
||||
|
@ -140,9 +140,9 @@ lumpinfo_t *W_GetLumpinfo (char *name)
|
|||
|
||||
Sys_Error ("W_GetLumpinfo: %s not found", name);
|
||||
return NULL;
|
||||
}
|
||||
}*/
|
||||
|
||||
void *W_SafeGetLumpName (const char *name)
|
||||
void *W_SafeGetLumpName (const char *name, size_t *size)
|
||||
{
|
||||
int i;
|
||||
lumpinfo_t *lump_p;
|
||||
|
@ -153,21 +153,24 @@ void *W_SafeGetLumpName (const char *name)
|
|||
for (lump_p=wad_lumps, i=0 ; i<wad_numlumps ; i++,lump_p++)
|
||||
{
|
||||
if (!strcmp(clean, lump_p->name))
|
||||
{
|
||||
*size = lump_p->disksize;
|
||||
return (void *)(wad_base+lump_p->filepos);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void *W_GetLumpName (char *name)
|
||||
/*void *W_GetLumpName (char *name)
|
||||
{
|
||||
lumpinfo_t *lump;
|
||||
|
||||
lump = W_GetLumpinfo (name);
|
||||
|
||||
return (void *)(wad_base + lump->filepos);
|
||||
}
|
||||
}*/
|
||||
|
||||
void *W_GetLumpNum (int num)
|
||||
/*void *W_GetLumpNum (int num)
|
||||
{
|
||||
lumpinfo_t *lump;
|
||||
|
||||
|
@ -177,7 +180,7 @@ void *W_GetLumpNum (int num)
|
|||
lump = wad_lumps + num;
|
||||
|
||||
return (void *)(wad_base + lump->filepos);
|
||||
}
|
||||
}*/
|
||||
|
||||
/*
|
||||
=============================================================================
|
||||
|
@ -470,22 +473,53 @@ qbyte *W_GetTexture(const char *name, int *width, int *height, qboolean *usesalp
|
|||
miptex_t *tex;
|
||||
qbyte *data;
|
||||
|
||||
if ((!strncmp(name, "gfx/", 4) || !strncmp(name, "wad/", 4)) && strcmp(name, "gfx/conchars"))
|
||||
if (!strncmp(name, "gfx/", 4) || !strncmp(name, "wad/", 4))
|
||||
{
|
||||
qpic_t *p;
|
||||
p = W_SafeGetLumpName(name+4);
|
||||
size_t lumpsize;
|
||||
p = W_SafeGetLumpName(name+4, &lumpsize);
|
||||
if (p)
|
||||
{
|
||||
*width = p->width;
|
||||
*height = p->height;
|
||||
*usesalpha = false;
|
||||
if (!strcmp(name+4, "conchars") && lumpsize==128*128)
|
||||
{ //conchars has no header.
|
||||
qbyte *lump = (qbyte*)p;
|
||||
extern cvar_t con_ocranaleds;
|
||||
|
||||
data = BZ_Malloc(p->width * p->height * 4);
|
||||
for (i = 0; i < p->width * p->height; i++)
|
||||
{
|
||||
((unsigned int*)data)[i] = d_8to24rgbtable[p->data[i]];
|
||||
if (con_ocranaleds.ival)
|
||||
{
|
||||
if (con_ocranaleds.ival != 2 || QCRC_Block(lump, 128*128) == 798)
|
||||
AddOcranaLEDsIndexed (lump, 128, 128);
|
||||
}
|
||||
|
||||
*width = 128;
|
||||
*height = 128;
|
||||
*usesalpha = false;
|
||||
|
||||
data = BZ_Malloc(128 * 128 * 4);
|
||||
for (i = 0; i < 128 * 128; i++)
|
||||
{
|
||||
qbyte b = lump[i];
|
||||
if (b == 0)
|
||||
((unsigned int*)data)[i] = 0;
|
||||
else
|
||||
((unsigned int*)data)[i] = d_8to24rgbtable[lump[i]] | 0xff000000;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
else if (lumpsize == 8+p->width*p->height)
|
||||
{
|
||||
*width = p->width;
|
||||
*height = p->height;
|
||||
*usesalpha = false;
|
||||
|
||||
data = BZ_Malloc(p->width * p->height * 4);
|
||||
for (i = 0; i < p->width * p->height; i++)
|
||||
{
|
||||
((unsigned int*)data)[i] = d_8to24rgbtable[p->data[i]];
|
||||
}
|
||||
return data;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -88,10 +88,10 @@ extern qbyte *wad_base;
|
|||
void W_Shutdown (void);
|
||||
void W_LoadWadFile (char *filename);
|
||||
void W_CleanupName (const char *in, char *out);
|
||||
lumpinfo_t *W_GetLumpinfo (char *name);
|
||||
void *W_GetLumpName (char *name);
|
||||
void *W_SafeGetLumpName (const char *name);
|
||||
void *W_GetLumpNum (int num);
|
||||
//lumpinfo_t *W_GetLumpinfo (char *name);
|
||||
//void *W_GetLumpName (char *name);
|
||||
void *W_SafeGetLumpName (const char *name, size_t *size);
|
||||
//void *W_GetLumpNum (int num);
|
||||
void Wads_Flush (void);
|
||||
extern void *wadmutex;
|
||||
|
||||
|
|
|
@ -2132,7 +2132,7 @@ static void TP_EnemyColor_f (void)
|
|||
void TP_NewMap (void)
|
||||
{
|
||||
static char last_map[MAX_QPATH];
|
||||
char locname[MAX_OSPATH];
|
||||
char locname[MAX_QPATH];
|
||||
|
||||
memset (&vars, 0, sizeof(vars));
|
||||
TP_FindModelNumbers ();
|
||||
|
@ -3509,7 +3509,7 @@ qbool TP_CheckSoundTrigger (char *str)
|
|||
{
|
||||
int i, j;
|
||||
int start, length;
|
||||
char soundname[MAX_OSPATH];
|
||||
char soundname[MAX_QPATH];
|
||||
|
||||
if (!*str)
|
||||
return false;
|
||||
|
|
|
@ -106,7 +106,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#if !defined(MINIMAL) && !defined(NPFTE) && !defined(NPQTV)
|
||||
#if defined(_WIN32) && !defined(FTE_SDL) && !defined(WINRT)
|
||||
#define HAVE_WINSSPI //built in component, checks against windows' root ca database and revocations etc.
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1200
|
||||
#define HAVE_WINSSPI //built in component, checks against windows' root ca database and revocations etc.
|
||||
#endif
|
||||
#elif defined(__linux__) || defined(__CYGWIN__)
|
||||
#define HAVE_GNUTLS //currently disabled as it does not validate the server's certificate, beware the mitm attack.
|
||||
#endif
|
||||
|
@ -130,8 +132,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define D3DQUAKE
|
||||
#endif
|
||||
|
||||
#if defined(_MSC_VER) //too lazy to fix up the makefile
|
||||
//#define BOTLIB_STATIC
|
||||
#if defined(_MSC_VER) && !defined(BOTLIB_STATIC) //too lazy to fix up the makefile
|
||||
#define BOTLIB_STATIC
|
||||
#endif
|
||||
|
||||
#ifdef NO_OPENAL
|
||||
|
@ -633,7 +635,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
//I'm making my own restrict, because msvc's headers can't cope if I #define restrict to __restrict, and quite possibly other platforms too
|
||||
#if __STDC_VERSION__ >= 199901L
|
||||
#define fte_restrict restrict
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
#define fte_restrict __restrict
|
||||
#else
|
||||
#define fte_restrict
|
||||
|
|
|
@ -316,64 +316,6 @@ typedef struct
|
|||
|
||||
//============================================================================
|
||||
|
||||
#ifndef QUAKE_GAME
|
||||
|
||||
// the utilities get to be lazy and just use large static arrays
|
||||
|
||||
extern int nummodels;
|
||||
extern dmodel_t dmodels[MAX_MAP_MODELS];
|
||||
|
||||
extern int visdatasize;
|
||||
extern qbyte dvisdata[MAX_MAP_VISIBILITY];
|
||||
|
||||
extern int lightdatasize;
|
||||
extern qbyte dlightdata[MAX_MAP_LIGHTING];
|
||||
|
||||
extern int texdatasize;
|
||||
extern qbyte dtexdata[MAX_MAP_MIPTEX]; // (dmiptexlump_t)
|
||||
|
||||
extern int entdatasize;
|
||||
extern char dentdata[MAX_MAP_ENTSTRING];
|
||||
|
||||
extern int numleafs;
|
||||
extern dleaf_t dleafs[MAX_MAP_LEAFS];
|
||||
|
||||
extern int numplanes;
|
||||
extern dplane_t dplanes[MAX_MAP_PLANES];
|
||||
|
||||
extern int numvertexes;
|
||||
extern dvertex_t dvertexes[MAX_MAP_VERTS];
|
||||
|
||||
extern int numnodes;
|
||||
extern dnode_t dnodes[MAX_MAP_NODES];
|
||||
|
||||
extern int numtexinfo;
|
||||
extern texinfo_t texinfo[MAX_MAP_TEXINFO];
|
||||
|
||||
extern int numfaces;
|
||||
extern dface_t dfaces[MAX_MAP_FACES];
|
||||
|
||||
extern int numclipnodes;
|
||||
extern dclipnode_t dclipnodes[MAX_MAP_CLIPNODES];
|
||||
|
||||
extern int numedges;
|
||||
extern dedge_t dedges[MAX_MAP_EDGES];
|
||||
|
||||
extern int nummarksurfaces;
|
||||
extern unsigned short dmarksurfaces[MAX_MAP_MARKSURFACES];
|
||||
|
||||
extern int numsurfedges;
|
||||
extern int dsurfedges[MAX_MAP_SURFEDGES];
|
||||
|
||||
|
||||
|
||||
void LoadBSPFile (char *filename);
|
||||
void WriteBSPFile (char *filename);
|
||||
void PrintBSPFileSizes (void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -417,8 +417,9 @@ void Cbuf_ExecuteLevel (int level)
|
|||
{
|
||||
int i;
|
||||
char *text;
|
||||
char line[1024];
|
||||
qboolean quotes, comment;
|
||||
char line[65536];
|
||||
qboolean comment;
|
||||
int quotes;
|
||||
|
||||
while (cmd_text[level].buf.cursize)
|
||||
{
|
||||
|
@ -437,13 +438,37 @@ void Cbuf_ExecuteLevel (int level)
|
|||
{
|
||||
if (text[i] == '\n')
|
||||
break;
|
||||
if (text[i] == '"')
|
||||
|
||||
if (quotes)
|
||||
{
|
||||
quotes++;
|
||||
if (text[i] == '"')
|
||||
{
|
||||
quotes=false;
|
||||
}
|
||||
if (text[i] == '\\' && quotes==2)
|
||||
{
|
||||
//skip over both chars if its something embedded.
|
||||
if (text[i+1] == '\"' || text[i+1] == '\\')
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if (text[i] == '"')
|
||||
{ //simple quoted string
|
||||
quotes = true;
|
||||
continue;
|
||||
}
|
||||
else if (text[i] == '\\' && text[i+1] == '\"')
|
||||
{ //escaped quoted string.
|
||||
quotes = 2;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (comment || (quotes&1))
|
||||
if (comment)
|
||||
continue;
|
||||
|
||||
if (text[i] == '/' && i+1 < cmd_text[level].buf.cursize && text[i+1] == '/')
|
||||
|
@ -541,7 +566,7 @@ void Cmd_StuffCmds (void)
|
|||
{
|
||||
if (!com_argv[i])
|
||||
continue; // NEXTSTEP nulls out -NXHost
|
||||
if (strchr(com_argv[i], ' ') || strchr(com_argv[i], '\t') || strchr(com_argv[i], '@'))
|
||||
if (strchr(com_argv[i], ' ') || strchr(com_argv[i], '\t') || strchr(com_argv[i], '@') || strchr(com_argv[i], '/') || strchr(com_argv[i], '\\'))
|
||||
{
|
||||
Q_strcat (text,"\"");
|
||||
Q_strcat (text,com_argv[i]);
|
||||
|
@ -593,10 +618,12 @@ void Cmd_Exec_f (void)
|
|||
{
|
||||
char *f, *s;
|
||||
char name[256];
|
||||
char buf[512];
|
||||
flocation_t loc;
|
||||
qboolean untrusted;
|
||||
vfsfile_t *file;
|
||||
size_t l;
|
||||
unsigned int level;
|
||||
|
||||
if (Cmd_Argc () != 2)
|
||||
{
|
||||
|
@ -636,7 +663,7 @@ void Cmd_Exec_f (void)
|
|||
Con_TPrintf ("couldn't exec %s. check permissions.\n", name);
|
||||
return;
|
||||
}
|
||||
if (cl_warncmd.ival || developer.ival)
|
||||
if (cl_warncmd.ival || developer.ival || cvar_watched)
|
||||
Con_TPrintf ("execing %s\n",name);
|
||||
|
||||
l = VFS_GETLEN(file);
|
||||
|
@ -644,7 +671,9 @@ void Cmd_Exec_f (void)
|
|||
f[l] = 0;
|
||||
VFS_READ(file, f, l);
|
||||
VFS_CLOSE(file);
|
||||
|
||||
untrusted = !!(loc.search->flags&SPF_UNTRUSTED);
|
||||
level = ((Cmd_FromGamecode() || untrusted) ? RESTRICT_INSECURE : Cmd_ExecLevel);
|
||||
|
||||
s = f;
|
||||
if (s[0] == '\xef' && s[1] == '\xbb' && s[2] == '\xbf')
|
||||
|
@ -660,7 +689,7 @@ void Cmd_Exec_f (void)
|
|||
int cfgdepth = COM_FDepthFile(name, true);
|
||||
int defdepth = COM_FDepthFile("default.cfg", true);
|
||||
if (defdepth < cfgdepth)
|
||||
Cbuf_InsertText("exec default.cfg\n", ((Cmd_FromGamecode() || untrusted) ? RESTRICT_INSECURE : Cmd_ExecLevel), false);
|
||||
Cbuf_InsertText("exec default.cfg\n", level, false);
|
||||
|
||||
//hack to work around the more insideous hacks of other engines.
|
||||
//namely: vid_restart at the end of config.cfg is evil, and NOT desired in FTE as it generally means any saved video settings are wrong.
|
||||
|
@ -676,10 +705,20 @@ void Cmd_Exec_f (void)
|
|||
}
|
||||
f[l] = 0;
|
||||
}
|
||||
|
||||
if (*loc.rawname)
|
||||
COM_QuotedString(loc.rawname, buf, sizeof(buf), false);
|
||||
else
|
||||
COM_QuotedString(va("%s/%s", loc.search->logicalpath, name), buf, sizeof(buf), false);
|
||||
|
||||
if (cvar_watched)
|
||||
Cbuf_InsertText (va("echo END %s", buf), level, true);
|
||||
// don't execute anything if it was from server (either the stuffcmd/localcmd, or the file)
|
||||
if (!strcmp(name, "default.cfg") && !(Cmd_FromGamecode() || untrusted))
|
||||
Cbuf_InsertText ("\ncvar_lockdefaults 1\n", ((Cmd_FromGamecode() || untrusted) ? RESTRICT_INSECURE : Cmd_ExecLevel), false);
|
||||
Cbuf_InsertText (s, ((Cmd_FromGamecode() || untrusted) ? RESTRICT_INSECURE : Cmd_ExecLevel), true);
|
||||
Cbuf_InsertText ("\ncvar_lockdefaults 1\n", level, false);
|
||||
Cbuf_InsertText (s, level, true);
|
||||
if (cvar_watched)
|
||||
Cbuf_InsertText (va("echo BEGIN %s", buf), level, true);
|
||||
BZ_Free(f);
|
||||
}
|
||||
|
||||
|
@ -786,7 +825,7 @@ Creates a new command that executes a command string (possibly ; seperated)
|
|||
void Cmd_Alias_f (void)
|
||||
{
|
||||
cmdalias_t *a, *b;
|
||||
char cmd[1024];
|
||||
char cmd[65536];
|
||||
int i, c;
|
||||
char *s;
|
||||
qboolean multiline;
|
||||
|
@ -914,39 +953,41 @@ void Cmd_Alias_f (void)
|
|||
if (multiline)
|
||||
{ //fun! MULTILINE ALIASES!!!!
|
||||
a->value = Cmd_ParseMultiline(false);
|
||||
return;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
// copy the rest of the command line
|
||||
cmd[0] = 0; // start out with a null string
|
||||
c = Cmd_Argc();
|
||||
for (i=2 ; i< c ; i++)
|
||||
{
|
||||
strcat (cmd, Cmd_Argv(i));
|
||||
if (i != c-1)
|
||||
strcat (cmd, " ");
|
||||
}
|
||||
|
||||
if (!*cmd) //someone wants to wipe it. let them
|
||||
{
|
||||
if (a == cmd_alias)
|
||||
cmd[0] = 0; // start out with a null string
|
||||
c = Cmd_Argc();
|
||||
for (i=2 ; i< c ; i++)
|
||||
{
|
||||
cmd_alias = a->next;
|
||||
Z_Free(a);
|
||||
return;
|
||||
strcat (cmd, Cmd_Argv(i));
|
||||
if (i != c-1)
|
||||
strcat (cmd, " ");
|
||||
}
|
||||
else
|
||||
|
||||
if (!*cmd) //someone wants to wipe it. let them
|
||||
{
|
||||
for (b = cmd_alias ; b ; b=b->next)
|
||||
if (a == cmd_alias)
|
||||
{
|
||||
if (b->next == a)
|
||||
cmd_alias = a->next;
|
||||
Z_Free(a);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (b = cmd_alias ; b ; b=b->next)
|
||||
{
|
||||
b->next = a->next;
|
||||
Z_Free(a);
|
||||
return;
|
||||
if (b->next == a)
|
||||
{
|
||||
b->next = a->next;
|
||||
Z_Free(a);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
a->value = Z_StrDup (cmd);
|
||||
}
|
||||
if (Cmd_FromGamecode())
|
||||
{
|
||||
|
@ -958,7 +999,6 @@ void Cmd_Alias_f (void)
|
|||
a->execlevel = 0; //run at users exec level
|
||||
a->restriction = 1; //this is possibly a security risk if the admin also changes execlevel
|
||||
}
|
||||
a->value = Z_StrDup (cmd);
|
||||
}
|
||||
|
||||
void Cmd_DeleteAlias(char *name)
|
||||
|
@ -1084,10 +1124,10 @@ void Cmd_AliasList_f (void)
|
|||
|
||||
void Alias_WriteAliases (vfsfile_t *f)
|
||||
{
|
||||
char *s;
|
||||
const char *s;
|
||||
cmdalias_t *cmd;
|
||||
int num=0;
|
||||
char buf[2048];
|
||||
char buf[65536];
|
||||
for (cmd=cmd_alias ; cmd ; cmd=cmd->next)
|
||||
{
|
||||
// if ((cmd->restriction?cmd->restriction:rcon_level.ival) > Cmd_ExecLevel)
|
||||
|
@ -1099,8 +1139,11 @@ void Alias_WriteAliases (vfsfile_t *f)
|
|||
s = va("\n//////////////////\n//Aliases\n");
|
||||
VFS_WRITE(f, s, strlen(s));
|
||||
}
|
||||
s = va("alias %s %s\n", cmd->name, COM_QuotedString(cmd->value, buf, sizeof(buf), false));
|
||||
s = va("alias %s ", cmd->name);
|
||||
VFS_WRITE(f, s, strlen(s));
|
||||
s = COM_QuotedString(cmd->value, buf, sizeof(buf), false);
|
||||
VFS_WRITE(f, s, strlen(s));
|
||||
VFS_WRITE(f, "\n", 1);
|
||||
if (cmd->restriction != 1) //1 is default
|
||||
{
|
||||
s = va("restrict %s %i\n", cmd->name, cmd->restriction);
|
||||
|
@ -2296,6 +2339,7 @@ void Cmd_ExecuteString (char *text, int level)
|
|||
|
||||
if (!level)
|
||||
{
|
||||
//teamplay macros run at level 0, and are restricted to much fewer commands
|
||||
char *tpcmds[] =
|
||||
{
|
||||
"if", "wait", /*would be nice to include alias in here*/
|
||||
|
@ -2310,6 +2354,13 @@ void Cmd_ExecuteString (char *text, int level)
|
|||
if (!strcmp(cmd_argv[0], tpcmds[level]))
|
||||
{
|
||||
int olev = Cmd_ExecLevel;
|
||||
if (cmd->restriction && cmd->restriction > 0)
|
||||
{ //warning, these commands would normally be considered to be run at restrict_local, but they're running at a much lower level
|
||||
//which means that if there's ANY restriction on them then they'll fail.
|
||||
//this means we have to ignore the default restriction levels and just do it anyway.
|
||||
Con_TPrintf("'%s' was restricted.\n", cmd_argv[0]);
|
||||
return;
|
||||
}
|
||||
Cmd_ExecLevel = 0;
|
||||
if (!cmd->function)
|
||||
Cmd_ForwardToServer ();
|
||||
|
@ -3231,11 +3282,82 @@ void Cvar_Inc_f (void)
|
|||
Cvar_SetValue (var, var->value + delta);
|
||||
}
|
||||
|
||||
void Cvar_ParseWatches(void)
|
||||
{
|
||||
const char *cvarname;
|
||||
int i;
|
||||
cvar_t *var;
|
||||
for (i=1 ; i<com_argc-1 ; i++)
|
||||
{
|
||||
if (!com_argv[i] || strcmp(com_argv[i], "-watch"))
|
||||
continue; // NEXTSTEP sometimes clears appkit vars.
|
||||
cvarname = com_argv[i+1];
|
||||
if (!cvarname)
|
||||
continue;
|
||||
|
||||
var = Cvar_FindVar (cvarname);
|
||||
if (!var)
|
||||
{
|
||||
Con_Printf ("cvar \"%s\" is not defined yet\n", cvarname);
|
||||
continue;
|
||||
}
|
||||
var->flags |= CVAR_WATCHED;
|
||||
cvar_watched = true;
|
||||
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
void Cvar_Watch_f(void)
|
||||
{
|
||||
char *cvarname = Cmd_Argv(1);
|
||||
cvar_t *var;
|
||||
cvar_group_t *grp;
|
||||
extern cvar_group_t *cvar_groups;
|
||||
|
||||
if (!strcmp(cvarname, ""))
|
||||
{
|
||||
for (grp=cvar_groups ; grp ; grp=grp->next)
|
||||
for (var=grp->cvars ; var ; var=var->next)
|
||||
{
|
||||
if (var->flags & CVAR_WATCHED)
|
||||
Con_Printf("Watching %s\n", var->name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (!strcmp(cvarname, "off"))
|
||||
{
|
||||
cvar_watched = false;
|
||||
Con_Printf("Disabling all cvar watches\n");
|
||||
for (grp=cvar_groups ; grp ; grp=grp->next)
|
||||
for (var=grp->cvars ; var ; var=var->next)
|
||||
var->flags &= ~CVAR_WATCHED;
|
||||
return;
|
||||
}
|
||||
else if (!strcmp(cvarname, "all"))
|
||||
{
|
||||
cvar_watched = 2;
|
||||
Con_Printf("Notifying for ALL cvar changes\n");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
var = Cvar_FindVar (cvarname);
|
||||
if (!var)
|
||||
{
|
||||
Con_Printf ("cvar \"%s\" is not defined yet\n", cvarname);
|
||||
return;
|
||||
}
|
||||
var->flags |= CVAR_WATCHED;
|
||||
cvar_watched |= true;
|
||||
}
|
||||
}
|
||||
|
||||
void Cmd_WriteConfig_f(void)
|
||||
{
|
||||
vfsfile_t *f;
|
||||
char *filename;
|
||||
char fname[MAX_OSPATH];
|
||||
char fname[MAX_QPATH];
|
||||
char sysname[MAX_OSPATH];
|
||||
qboolean all = true;
|
||||
extern cvar_t cfg_save_all;
|
||||
|
@ -3263,7 +3385,7 @@ void Cmd_WriteConfig_f(void)
|
|||
{
|
||||
if (strstr(filename, ".."))
|
||||
{
|
||||
Con_Printf ("Couldn't write config %s\n",filename);
|
||||
Con_Printf (CON_ERROR "Couldn't write config %s\n",filename);
|
||||
return;
|
||||
}
|
||||
snprintf(fname, sizeof(fname), "configs/%s", filename);
|
||||
|
@ -3277,7 +3399,7 @@ void Cmd_WriteConfig_f(void)
|
|||
}
|
||||
if (!f)
|
||||
{
|
||||
Con_Printf ("Couldn't write config %s\n", sysname);
|
||||
Con_Printf (CON_ERROR "Couldn't write config %s\n", sysname);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3334,7 +3456,7 @@ void Cmd_Condump_f(void)
|
|||
f = FS_OpenVFS (filename, "wb", FS_GAME);
|
||||
if (!f)
|
||||
{
|
||||
Con_Printf ("Couldn't write console dump %s\n",filename);
|
||||
Con_Printf (CON_ERROR "Couldn't write console dump %s\n",filename);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3516,6 +3638,7 @@ void Cmd_Init (void)
|
|||
Cmd_AddCommand ("macrolist", Cmd_MacroList_f);
|
||||
Cmd_AddCommand ("cvarlist", Cvar_List_f);
|
||||
Cmd_AddCommand ("cvarreset", Cvar_Reset_f);
|
||||
Cmd_AddCommandD ("cvarwatch", Cvar_Watch_f, "Prints a notification when the named cvar is changed. Also displays the start/end of configs. Alternatively, use '-watch foo' on the commandline.");
|
||||
Cmd_AddCommand ("cvar_lockdefaults", Cvar_LockDefaults_f);
|
||||
Cmd_AddCommand ("cvar_purgedefaults", Cvar_PurgeDefaults_f);
|
||||
Cmd_AddCommand ("fs_flush", COM_RefreshFSCache_f);
|
||||
|
|
|
@ -4346,11 +4346,12 @@ void COM_ParsePlusSets (qboolean docbuf)
|
|||
{
|
||||
if (!strcmp(com_argv[i], "+set") || !strcmp(com_argv[i], "+seta"))
|
||||
{
|
||||
char buf[8192];
|
||||
Cbuf_AddText(com_argv[i]+1, RESTRICT_LOCAL);
|
||||
Cbuf_AddText(" ", RESTRICT_LOCAL);
|
||||
Cbuf_AddText(com_argv[i+1], RESTRICT_LOCAL);
|
||||
Cbuf_AddText(COM_QuotedString(com_argv[i+1], buf, sizeof(buf), false), RESTRICT_LOCAL);
|
||||
Cbuf_AddText(" ", RESTRICT_LOCAL);
|
||||
Cbuf_AddText(com_argv[i+2], RESTRICT_LOCAL);
|
||||
Cbuf_AddText(COM_QuotedString(com_argv[i+2], buf, sizeof(buf), false), RESTRICT_LOCAL);
|
||||
Cbuf_AddText("\n", RESTRICT_LOCAL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define qint64_t __int64
|
||||
#define quint64_t unsigned __int64
|
||||
#elif defined(_WIN32)
|
||||
#ifndef _MSC_VER
|
||||
#if !defined(_MSC_VER) || _MSC_VER < 1300
|
||||
#define __w64
|
||||
#endif
|
||||
typedef __int32 __w64 qintptr_t; //add __w64 if you need msvc to shut up about unsafe type conversions
|
||||
|
@ -90,6 +90,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#if _MSC_VER >= 1310
|
||||
#define strtoull _strtoui64
|
||||
#else
|
||||
#define strtoull strtoul //hopefully this won't cause too many issues
|
||||
#define DWORD_PTR DWORD //32bit only
|
||||
#define ULONG_PTR ULONG
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
typedef unsigned char qbyte;
|
||||
|
||||
|
@ -420,14 +430,16 @@ extern char com_configdir[MAX_OSPATH]; //dir to put cfg_save configs in
|
|||
|
||||
//qofs_Make is used to 'construct' a variable of qofs_t type. this is so the code can merge two 32bit ints on old systems and use a long long type internally without generating warnings about bit shifts when qofs_t is only 32bit instead.
|
||||
#if 1//defined(__amd64__) || defined(_AMD64_) || __WORDSIZE == 64
|
||||
#define FS_64BIT
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1200
|
||||
#define FS_64BIT
|
||||
#endif
|
||||
#endif
|
||||
#ifdef FS_64BIT
|
||||
typedef quint64_t qofs_t; //type to use for a file offset
|
||||
#define qofs_Make(low,high) (low | (((qofs_t)(high))<<32))
|
||||
#define qofs_Low(o) ((o)&0xffffffffu)
|
||||
#define qofs_High(o) ((o)>>32)
|
||||
#define qofs_Error(o) ((o) == ~0ull)
|
||||
#define qofs_Error(o) ((o) == ~(quint64_t)0u)
|
||||
#else
|
||||
typedef quint32_t qofs_t; //type to use for a file offset
|
||||
#define qofs_Make(low,high) (low)
|
||||
|
@ -481,7 +493,7 @@ char *FS_GetPackageDownloadFilename(flocation_t *loc);
|
|||
qboolean FS_GetPackageDownloadable(const char *package);
|
||||
char *FS_GetPackHashes(char *buffer, int buffersize, qboolean referencedonly);
|
||||
char *FS_GetPackNames(char *buffer, int buffersize, int referencedonly, qboolean ext);
|
||||
qboolean FS_GenCachedPakName(char *pname, char *crc, char *local, int llen); //returns false if the name is invalid.
|
||||
qboolean FS_GenCachedPakName(const char *pname, const char *crc, char *local, int llen); //returns false if the name is invalid.
|
||||
void FS_ReferenceControl(unsigned int refflag, unsigned int resetflags);
|
||||
|
||||
#define COM_FDepthFile(filename,ignorepacks) FS_FLocateFile(filename,FSLF_DONTREFERENCE|FSLF_DEEPONFAILURE|(ignorepacks?0:FSLF_DEPTH_INEXPLICIT), NULL)
|
||||
|
@ -602,6 +614,7 @@ typedef struct
|
|||
char *installation; //optional hardcoded commercial name, used for scanning the registry to find existing installs.
|
||||
char *formalname; //the commercial name of the game. you'll get FULLENGINENAME otherwise.
|
||||
char *downloadsurl; //optional installable files (menu)
|
||||
char *installupd; //which download/updated package to install.
|
||||
char *protocolname; //the name used for purposes of dpmaster
|
||||
char *defaultexec; //execed after cvars are reset, to give game-specific defaults.
|
||||
char *eula; //when running as an installer, the user will be presented with this as a prompt
|
||||
|
@ -624,6 +637,7 @@ typedef struct
|
|||
} ftemanifest_t;
|
||||
void FS_Manifest_Free(ftemanifest_t *man);
|
||||
ftemanifest_t *FS_Manifest_Parse(const char *fname, const char *data);
|
||||
void PM_Shutdown(void);
|
||||
|
||||
void COM_InitFilesystem (void); //does not set up any gamedirs.
|
||||
qboolean FS_DownloadingPackage(void);
|
||||
|
|
|
@ -26,6 +26,7 @@ cvar_group_t *cvar_groups;
|
|||
|
||||
hashtable_t cvar_hash;
|
||||
bucket_t *cvar_buckets[1024];
|
||||
int cvar_watched;
|
||||
|
||||
//cvar_t *cvar_vars;
|
||||
static char *cvar_null_string = "";
|
||||
|
@ -709,6 +710,9 @@ cvar_t *Cvar_SetCore (cvar_t *var, const char *value, qboolean force)
|
|||
if (!var)
|
||||
return NULL;
|
||||
|
||||
if ((var->flags & CVAR_WATCHED) || cvar_watched == 2)
|
||||
Con_Printf("Cvar Set: %s to %s\n", var->name, value);
|
||||
|
||||
if ((var->flags & CVAR_NOSET) && !force)
|
||||
{
|
||||
Con_Printf ("variable %s is readonly\n", var->name);
|
||||
|
@ -1171,21 +1175,10 @@ qboolean Cvar_Register (cvar_t *variable, const char *groupname)
|
|||
cvar_t *Cvar_Get2(const char *name, const char *defaultvalue, int flags, const char *description, const char *group)
|
||||
{
|
||||
cvar_t *var;
|
||||
int old;
|
||||
var = Cvar_FindVar(name);
|
||||
|
||||
if (var)
|
||||
{
|
||||
//allow this to change all < cvar_latch values.
|
||||
//this allows q2 dlls to apply different flags to a cvar without destroying our important ones (like cheat).
|
||||
old = var->flags;
|
||||
var->flags = (var->flags & ~(CVAR_NOSET)) | (flags & (CVAR_NOSET|CVAR_SERVERINFO|CVAR_USERINFO|CVAR_ARCHIVE));
|
||||
if (old != var->flags)
|
||||
{
|
||||
Cvar_Set(var, var->string);
|
||||
}
|
||||
return var;
|
||||
}
|
||||
if (!description)
|
||||
description = "";
|
||||
|
||||
|
|
|
@ -143,6 +143,8 @@ typedef struct cvar_group_s
|
|||
#define CVAR_NORESET (1<<20) //cvar is not reset by various things.
|
||||
#define CVAR_TEAMPLAYTAINT (1<<21) //current value contains the evaluation of a teamplay macro.
|
||||
|
||||
#define CVAR_WATCHED (1<<22) //report any attempts to change this cvar.
|
||||
|
||||
#define CVAR_LASTFLAG CVAR_SHADERSYSTEM
|
||||
|
||||
#define CVAR_LATCHMASK (CVAR_LATCH|CVAR_RENDERERLATCH|CVAR_SERVEROVERRIDE|CVAR_CHEAT|CVAR_SEMICHEAT) //you're only allowed one of these.
|
||||
|
@ -174,6 +176,9 @@ qboolean Cvar_UnsavedArchive(void);
|
|||
void Cvar_Saved(void);
|
||||
void Cvar_ConfigChanged(void);
|
||||
|
||||
extern int cvar_watched; //so that cmd.c knows that it should add messages when configs are execed
|
||||
void Cvar_ParseWatches(void); //parse -watch args
|
||||
|
||||
int Cvar_ApplyLatches(int latchflag);
|
||||
//sets vars to their latched values
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ static void QDECL fs_game_callback(cvar_t *var, char *oldvalue)
|
|||
if (runaway)
|
||||
return; //ignore that
|
||||
runaway = true;
|
||||
Cmd_ExecuteString(va("gamedir %s\n", COM_QuotedString(var->string, buf, sizeof(buf), false)), Cmd_ExecLevel);
|
||||
Cmd_ExecuteString(va("gamedir %s\n", COM_QuotedString(var->string, buf, sizeof(buf), false)), RESTRICT_LOCAL);
|
||||
runaway = false;
|
||||
}
|
||||
|
||||
|
@ -206,6 +206,7 @@ void FS_Manifest_Free(ftemanifest_t *man)
|
|||
Z_Free(man->installation);
|
||||
Z_Free(man->formalname);
|
||||
Z_Free(man->downloadsurl);
|
||||
Z_Free(man->installupd);
|
||||
Z_Free(man->protocolname);
|
||||
Z_Free(man->eula);
|
||||
Z_Free(man->defaultexec);
|
||||
|
@ -238,6 +239,8 @@ static ftemanifest_t *FS_Manifest_Clone(ftemanifest_t *oldm)
|
|||
newm->formalname = Z_StrDup(oldm->formalname);
|
||||
if (oldm->downloadsurl)
|
||||
newm->downloadsurl = Z_StrDup(oldm->downloadsurl);
|
||||
if (oldm->installupd)
|
||||
newm->installupd = Z_StrDup(oldm->installupd);
|
||||
if (oldm->protocolname)
|
||||
newm->protocolname = Z_StrDup(oldm->protocolname);
|
||||
if (oldm->eula)
|
||||
|
@ -282,6 +285,8 @@ void FS_Manifest_Print(ftemanifest_t *man)
|
|||
Con_Printf("name %s\n", COM_QuotedString(man->formalname, buffer, sizeof(buffer), false));
|
||||
if (man->downloadsurl)
|
||||
Con_Printf("downloadsurl %s\n", COM_QuotedString(man->downloadsurl, buffer, sizeof(buffer), false));
|
||||
if (man->installupd)
|
||||
Con_Printf("install %s\n", COM_QuotedString(man->installupd, buffer, sizeof(buffer), false));
|
||||
if (man->protocolname)
|
||||
Con_Printf("protocolname %s\n", COM_QuotedString(man->protocolname, buffer, sizeof(buffer), false));
|
||||
if (man->defaultexec)
|
||||
|
@ -511,6 +516,11 @@ static qboolean FS_Manifest_ParseTokens(ftemanifest_t *man)
|
|||
Z_Free(man->downloadsurl);
|
||||
man->downloadsurl = Z_StrDup(Cmd_Argv(1));
|
||||
}
|
||||
else if (!Q_strcasecmp(cmd, "install"))
|
||||
{
|
||||
Z_Free(man->installupd);
|
||||
man->installupd = Z_StrDup(Cmd_Argv(1));
|
||||
}
|
||||
else if (!Q_strcasecmp(cmd, "protocolname"))
|
||||
{
|
||||
Z_Free(man->protocolname);
|
||||
|
@ -671,12 +681,13 @@ COM_Path_f
|
|||
*/
|
||||
static void COM_PathLine(searchpath_t *s)
|
||||
{
|
||||
Con_Printf(U8("%s")" %s%s%s%s%s%s\n", s->logicalpath,
|
||||
Con_Printf(U8("%s")" %s%s%s%s%s%s%s\n", s->logicalpath,
|
||||
(s->flags & SPF_REFERENCED)?"^[(ref)\\tip\\Referenced\\desc\\Package will auto-download to clients^]":"",
|
||||
(s->flags & SPF_TEMPORARY)?"^[(temp)\\tip\\Temporary\\desc\\Flushed on map change^]":"",
|
||||
(s->flags & SPF_COPYPROTECTED)?"^[(c)\\tip\\Copyrighted\\desc\\Copy-Protected and is not downloadable^]":"",
|
||||
(s->flags & SPF_EXPLICIT)?"^[(e)\\tip\\Explicit\\desc\\Loaded explicitly by the gamedir^]":"",
|
||||
(s->flags & SPF_UNTRUSTED)?"^[(u)\\tip\\Untrusted\\desc\\Configs and scripts will not be given access to passwords^]":"",
|
||||
(s->flags & SPF_WRITABLE)?"^[(w)\\tip\\Writable\\desc\\We can probably write here^]":"",
|
||||
(s->handle->GeneratePureCRC)?va("^[(h)\\tip\\Hash: %x^]", s->handle->GeneratePureCRC(s->handle, 0, 0)):"");
|
||||
}
|
||||
void COM_Path_f (void)
|
||||
|
@ -2260,110 +2271,134 @@ searchpathfuncs_t *FS_OpenPackByExtension(vfsfile_t *f, const char *pakname)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void FS_AddManifestPackages(searchpath_t **oldpaths, const char *purepath, const char *logicalpaths, searchpath_t *search, const char *extension, searchpathfuncs_t *(QDECL *OpenNew)(vfsfile_t *file, const char *desc, const char *prefix))
|
||||
//
|
||||
void FS_AddHashedPackage(searchpath_t **oldpaths, const char *parentpath, const char *logicalpaths, searchpath_t *search, unsigned int loadstuff, const char *pakpath, const char *qhash, const char *pakprefix)
|
||||
{
|
||||
searchpathfuncs_t *handle;
|
||||
searchpath_t *oldp;
|
||||
char pname[MAX_OSPATH];
|
||||
char lname[MAX_OSPATH];
|
||||
char lname2[MAX_OSPATH];
|
||||
unsigned int keptflags;
|
||||
flocation_t loc;
|
||||
int fmt;
|
||||
char ext[8];
|
||||
int ptlen = strlen(parentpath);
|
||||
|
||||
COM_FileExtension(pakpath, ext, sizeof(ext));
|
||||
|
||||
//figure out which file format its meant to be.
|
||||
for (fmt = 0; fmt < sizeof(searchpathformats)/sizeof(searchpathformats[0]); fmt++)
|
||||
{
|
||||
if (!searchpathformats[fmt].extension || !searchpathformats[fmt].OpenNew)// || !searchpathformats[i].loadscan)
|
||||
continue;
|
||||
if ((loadstuff & (1<<fmt)) && !Q_strcasecmp(ext, searchpathformats[fmt].extension))
|
||||
{
|
||||
|
||||
//figure out the logical path names
|
||||
if (!FS_GenCachedPakName(pakpath, qhash, pname, sizeof(pname)))
|
||||
return; //file name was invalid, panic.
|
||||
snprintf (lname, sizeof(lname), "%s%s", logicalpaths, pname+ptlen+1);
|
||||
snprintf (lname2, sizeof(lname), "%s%s", logicalpaths, pakpath+ptlen+1);
|
||||
|
||||
//see if we already added it
|
||||
for (oldp = com_searchpaths; oldp; oldp = oldp->next)
|
||||
{
|
||||
if (strcmp(oldp->prefix, pakprefix?pakprefix:"")) //probably will only happen from typos, but should be correct.
|
||||
continue;
|
||||
if (!Q_strcasecmp(oldp->purepath, pakpath))
|
||||
break;
|
||||
if (!Q_strcasecmp(oldp->logicalpath, lname))
|
||||
break;
|
||||
if (!Q_strcasecmp(oldp->logicalpath, lname2))
|
||||
break;
|
||||
}
|
||||
if (!oldp)
|
||||
{
|
||||
//see if we can get an old archive handle from before whatever fs_restart
|
||||
handle = FS_GetOldPath(oldpaths, lname2, &keptflags);
|
||||
if (handle)
|
||||
snprintf (lname, sizeof(lname), "%s", lname2);
|
||||
else
|
||||
{
|
||||
handle = FS_GetOldPath(oldpaths, lname, &keptflags);
|
||||
|
||||
//seems new, load it.
|
||||
if (!handle)
|
||||
{
|
||||
vfsfile_t *vfs = NULL;
|
||||
if (search)
|
||||
{
|
||||
if (search->handle->FindFile(search->handle, &loc, pakpath+ptlen+1, NULL))
|
||||
{
|
||||
vfs = search->handle->OpenVFS(search->handle, &loc, "r");
|
||||
snprintf (lname, sizeof(lname), "%s", lname2);
|
||||
}
|
||||
else if (search->handle->FindFile(search->handle, &loc, pname+ptlen+1, NULL))
|
||||
vfs = search->handle->OpenVFS(search->handle, &loc, "r");
|
||||
}
|
||||
else
|
||||
{
|
||||
vfs = FS_OpenVFS(pakpath, "rb", FS_ROOT);
|
||||
if (vfs)
|
||||
snprintf (lname, sizeof(lname), "%s", lname2);
|
||||
else
|
||||
vfs = FS_OpenVFS(pname, "rb", FS_ROOT);
|
||||
}
|
||||
|
||||
if (vfs)
|
||||
handle = searchpathformats[fmt].OpenNew (vfs, lname, pakprefix?pakprefix:"");
|
||||
if (!handle && vfs)
|
||||
VFS_CLOSE(vfs); //erk
|
||||
}
|
||||
}
|
||||
|
||||
//insert it into our path lists.
|
||||
if (handle && qhash)
|
||||
{
|
||||
int truecrc = handle->GeneratePureCRC(handle, 0, false);
|
||||
if (truecrc != (int)strtoul(qhash, NULL, 0))
|
||||
{
|
||||
Con_Printf(CON_ERROR "File \"%s\" has hash %#x (required: %s). Please delete it or move it away\n", lname, truecrc, qhash);
|
||||
handle->ClosePath(handle);
|
||||
handle = NULL;
|
||||
}
|
||||
}
|
||||
if (handle)
|
||||
FS_AddPathHandle(oldpaths, pakpath, lname, handle, pakprefix, SPF_COPYPROTECTED|SPF_UNTRUSTED|keptflags, (unsigned int)-1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void FS_AddManifestPackages(searchpath_t **oldpaths, const char *purepath, const char *logicalpaths, searchpath_t *search, unsigned int loadstuff)
|
||||
{
|
||||
int i;
|
||||
searchpathfuncs_t *handle;
|
||||
unsigned int keptflags;
|
||||
vfsfile_t *vfs;
|
||||
flocation_t loc;
|
||||
|
||||
|
||||
int ptlen, palen;
|
||||
ptlen = strlen(purepath);
|
||||
for (i = 0; i < sizeof(fs_manifest->package) / sizeof(fs_manifest->package[0]); i++)
|
||||
{
|
||||
char ext[8];
|
||||
if (fs_manifest->package[i].path && !strcmp(COM_FileExtension(fs_manifest->package[i].path, ext, sizeof(ext)), extension))
|
||||
char qhash[16];
|
||||
if (!fs_manifest->package[i].path)
|
||||
continue;
|
||||
|
||||
palen = strlen(fs_manifest->package[i].path);
|
||||
if (palen > ptlen && (fs_manifest->package[i].path[ptlen] == '/' || fs_manifest->package[i].path[ptlen] == '\\' )&& !strncmp(purepath, fs_manifest->package[i].path, ptlen))
|
||||
{
|
||||
palen = strlen(fs_manifest->package[i].path);
|
||||
if (palen > ptlen && (fs_manifest->package[i].path[ptlen] == '/' || fs_manifest->package[i].path[ptlen] == '\\' )&& !strncmp(purepath, fs_manifest->package[i].path, ptlen))
|
||||
{
|
||||
searchpath_t *oldp;
|
||||
char pname[MAX_OSPATH];
|
||||
char lname[MAX_OSPATH];
|
||||
char lname2[MAX_OSPATH];
|
||||
if (fs_manifest->package[i].crcknown)
|
||||
snprintf(lname, sizeof(lname), "%#x", fs_manifest->package[i].crc);
|
||||
else
|
||||
snprintf(lname, sizeof(lname), "");
|
||||
if (!FS_GenCachedPakName(fs_manifest->package[i].path, lname, pname, sizeof(pname)))
|
||||
continue;
|
||||
snprintf (lname, sizeof(lname), "%s%s", logicalpaths, pname+ptlen+1);
|
||||
snprintf (lname2, sizeof(lname), "%s%s", logicalpaths, fs_manifest->package[i].path+ptlen+1);
|
||||
|
||||
for (oldp = com_searchpaths; oldp; oldp = oldp->next)
|
||||
{
|
||||
if (strcmp(oldp->prefix, fs_manifest->package[i].prefix?fs_manifest->package[i].prefix:"")) //probably will only happen from typos, but should be correct.
|
||||
continue;
|
||||
if (!Q_strcasecmp(oldp->purepath, fs_manifest->package[i].path))
|
||||
break;
|
||||
if (!Q_strcasecmp(oldp->logicalpath, lname))
|
||||
break;
|
||||
if (!Q_strcasecmp(oldp->logicalpath, lname2))
|
||||
break;
|
||||
}
|
||||
if (!oldp)
|
||||
{
|
||||
handle = FS_GetOldPath(oldpaths, lname2, &keptflags);
|
||||
if (handle)
|
||||
snprintf (lname, sizeof(lname), "%s", lname2);
|
||||
else
|
||||
{
|
||||
handle = FS_GetOldPath(oldpaths, lname, &keptflags);
|
||||
|
||||
if (!handle)
|
||||
{
|
||||
vfs = NULL;
|
||||
if (search)
|
||||
{
|
||||
if (search->handle->FindFile(search->handle, &loc, pname+ptlen+1, NULL))
|
||||
vfs = search->handle->OpenVFS(search->handle, &loc, "r");
|
||||
}
|
||||
else
|
||||
{
|
||||
vfs = FS_OpenVFS(fs_manifest->package[i].path, "rb", FS_ROOT);
|
||||
if (vfs)
|
||||
snprintf (lname, sizeof(lname), "%s", lname2);
|
||||
else
|
||||
vfs = FS_OpenVFS(pname, "rb", FS_ROOT);
|
||||
}
|
||||
|
||||
if (vfs)
|
||||
handle = OpenNew (vfs, lname, fs_manifest->package[i].prefix?fs_manifest->package[i].prefix:"");
|
||||
}
|
||||
}
|
||||
if (handle && fs_manifest->package[i].crcknown)
|
||||
{
|
||||
int truecrc = handle->GeneratePureCRC(handle, 0, false);
|
||||
if (truecrc != fs_manifest->package[i].crc)
|
||||
{
|
||||
Con_Printf(CON_ERROR "File \"%s\" has hash %#x (required: %#x). Please delete it or move it away\n", lname, truecrc, fs_manifest->package[i].crc);
|
||||
handle->ClosePath(handle);
|
||||
handle = NULL;
|
||||
}
|
||||
}
|
||||
if (handle)
|
||||
FS_AddPathHandle(oldpaths, fs_manifest->package[i].path, lname, handle, fs_manifest->package[i].prefix, SPF_COPYPROTECTED|SPF_UNTRUSTED|keptflags, (unsigned int)-1);
|
||||
}
|
||||
}
|
||||
Q_snprintfz(qhash, sizeof(qhash), "%#x", fs_manifest->package[i].crc);
|
||||
FS_AddHashedPackage(oldpaths,purepath,logicalpaths,search,loadstuff, fs_manifest->package[i].path,fs_manifest->package[i].crcknown?qhash:NULL,fs_manifest->package[i].prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void FS_AddDownloadManifestPackages(searchpath_t **oldpaths, unsigned int loadstuff)//, const char *purepath, searchpath_t *search, const char *extension, searchpathfuncs_t *(QDECL *OpenNew)(vfsfile_t *file, const char *desc))
|
||||
{
|
||||
int i;
|
||||
char logicalroot[MAX_OSPATH];
|
||||
FS_NativePath("downloads/", FS_ROOT, logicalroot, sizeof(logicalroot));
|
||||
for (i = 0; i < sizeof(searchpathformats)/sizeof(searchpathformats[0]); i++)
|
||||
{
|
||||
if (!searchpathformats[i].extension || !searchpathformats[i].OpenNew)// || !searchpathformats[i].loadscan)
|
||||
continue;
|
||||
if (loadstuff & (1<<i))
|
||||
{
|
||||
FS_AddManifestPackages(oldpaths, "downloads", logicalroot, NULL, searchpathformats[i].extension, searchpathformats[i].OpenNew);
|
||||
}
|
||||
}
|
||||
|
||||
FS_AddManifestPackages(oldpaths, "downloads", logicalroot, NULL, loadstuff);
|
||||
}
|
||||
|
||||
static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const char *logicalpath, searchpath_t *search, unsigned int pflags, unsigned int loadstuff)
|
||||
|
@ -2424,6 +2459,8 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
|
|||
BZ_Free(buffer);
|
||||
}
|
||||
|
||||
PM_LoadPackages(oldpaths, purepath, logicalpaths, search, loadstuff, 0x80000000, -1);
|
||||
|
||||
for (j = 0; j < sizeof(searchpathformats)/sizeof(searchpathformats[0]); j++)
|
||||
{
|
||||
if (!searchpathformats[j].extension || !searchpathformats[j].OpenNew || !searchpathformats[j].loadscan)
|
||||
|
@ -2467,18 +2504,9 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
|
|||
}
|
||||
|
||||
//now load ones from the manifest
|
||||
for (j = 0; j < sizeof(searchpathformats)/sizeof(searchpathformats[0]); j++)
|
||||
{
|
||||
if (!searchpathformats[j].extension || !searchpathformats[j].OpenNew || !searchpathformats[j].loadscan)
|
||||
continue;
|
||||
if (loadstuff & (1<<j))
|
||||
{
|
||||
const char *extension = searchpathformats[j].extension;
|
||||
wp.OpenNew = searchpathformats[j].OpenNew;
|
||||
FS_AddManifestPackages(oldpaths, purepath, logicalpaths, search, loadstuff);
|
||||
|
||||
FS_AddManifestPackages(oldpaths, purepath, logicalpaths, search, extension, wp.OpenNew);
|
||||
}
|
||||
}
|
||||
PM_LoadPackages(oldpaths, purepath, logicalpaths, search, loadstuff, 0x0, 1000-1);
|
||||
|
||||
//now load the random ones
|
||||
for (j = 0; j < sizeof(searchpathformats)/sizeof(searchpathformats[0]); j++)
|
||||
|
@ -2494,6 +2522,8 @@ static void FS_AddDataFiles(searchpath_t **oldpaths, const char *purepath, const
|
|||
search->handle->EnumerateFiles(search->handle, pakfile, FS_AddWildDataFiles, &wp);
|
||||
}
|
||||
}
|
||||
|
||||
PM_LoadPackages(oldpaths, purepath, logicalpaths, search, loadstuff, 1000, 0x7fffffff);
|
||||
}
|
||||
|
||||
static searchpath_t *FS_AddPathHandle(searchpath_t **oldpaths, const char *purepath, const char *logicalpath, searchpathfuncs_t *handle, const char *prefix, unsigned int flags, unsigned int loadstuff)
|
||||
|
@ -2609,20 +2639,23 @@ void FS_AddGameDirectory (searchpath_t **oldpaths, const char *puredir, const ch
|
|||
for (search = com_searchpaths; search; search = search->next)
|
||||
{
|
||||
if (!Q_strcasecmp(search->logicalpath, dir))
|
||||
{
|
||||
search->flags |= flags & SPF_WRITABLE;
|
||||
return; //already loaded (base paths?)
|
||||
}
|
||||
}
|
||||
|
||||
if (!(flags & SPF_PRIVATE))
|
||||
{
|
||||
if ((p = strrchr(dir, '/')) != NULL)
|
||||
strcpy(pubgamedirfile, ++p);
|
||||
Q_strncpyz(pubgamedirfile, ++p, sizeof(pubgamedirfile));
|
||||
else
|
||||
strcpy(pubgamedirfile, dir);
|
||||
Q_strncpyz(pubgamedirfile, dir, sizeof(pubgamedirfile));
|
||||
}
|
||||
if ((p = strrchr(dir, '/')) != NULL)
|
||||
strcpy(gamedirfile, ++p);
|
||||
Q_strncpyz(gamedirfile, ++p, sizeof(gamedirfile));
|
||||
else
|
||||
strcpy(gamedirfile, dir);
|
||||
Q_strncpyz(gamedirfile, dir, sizeof(gamedirfile));
|
||||
|
||||
//
|
||||
// add the directory to the search path
|
||||
|
@ -2801,7 +2834,7 @@ void COM_Gamedir (const char *dir, const struct gamepacks *packagespaths)
|
|||
//don't allow leading dots, hidden files are evil.
|
||||
//don't allow complex paths. those are evil too.
|
||||
if (*dir == '.' || !strcmp(dir, ".") || strstr(dir, "..") || strstr(dir, "/")
|
||||
|| strstr(dir, "\\") || strstr(dir, ":") )
|
||||
|| strstr(dir, "\\") || strstr(dir, ":") || strstr(dir, "\"") )
|
||||
{
|
||||
Con_Printf ("Gamedir should be a single filename, not a path\n");
|
||||
return;
|
||||
|
@ -2963,9 +2996,9 @@ const gamemode_info_t gamemode_info[] = {
|
|||
{NULL}
|
||||
};
|
||||
|
||||
qboolean FS_GenCachedPakName(char *pname, char *crc, char *local, int llen)
|
||||
qboolean FS_GenCachedPakName(const char *pname, const char *crc, char *local, int llen)
|
||||
{
|
||||
char *fn;
|
||||
const char *fn;
|
||||
char hex[16];
|
||||
if (strstr(pname, "dlcache"))
|
||||
{
|
||||
|
@ -2996,7 +3029,7 @@ qboolean FS_GenCachedPakName(char *pname, char *crc, char *local, int llen)
|
|||
Q_strncpyz(local, pname, min((fn - pname) + 1, llen));
|
||||
Q_strncatz(local, "dlcache/", llen);
|
||||
Q_strncatz(local, fn, llen);
|
||||
if (*crc)
|
||||
if (crc && *crc)
|
||||
{
|
||||
Q_strncatz(local, ".", llen);
|
||||
snprintf(hex, sizeof(hex), "%x", (unsigned int)strtoul(crc, NULL, 0));
|
||||
|
@ -3544,7 +3577,7 @@ void FS_UnloadPackFiles(void)
|
|||
{
|
||||
if (Sys_LockMutex(fs_thread_mutex))
|
||||
{
|
||||
FS_ReloadPackFilesFlags(1);
|
||||
FS_ReloadPackFilesFlags(0);
|
||||
Sys_UnlockMutex(fs_thread_mutex);
|
||||
}
|
||||
}
|
||||
|
@ -3572,7 +3605,7 @@ void FS_ReloadPackFiles_f(void)
|
|||
{
|
||||
if (Sys_LockMutex(fs_thread_mutex))
|
||||
{
|
||||
if (atoi(Cmd_Argv(1)))
|
||||
if (*Cmd_Argv(1))
|
||||
FS_ReloadPackFilesFlags(atoi(Cmd_Argv(1)));
|
||||
else
|
||||
FS_ReloadPackFilesFlags(~0);
|
||||
|
@ -3637,7 +3670,7 @@ static INT CALLBACK StupidBrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LP
|
|||
case BFFM_VALIDATEFAILEDW:
|
||||
break; //FIXME: validate that the gamedir contains what its meant to
|
||||
case BFFM_SELCHANGED:
|
||||
if (pSHGetPathFromIDListW((LPITEMIDLIST) lp, szDir))
|
||||
if (SHGetPathFromIDListW((LPITEMIDLIST) lp, szDir))
|
||||
{
|
||||
wchar_t statustxt[MAX_OSPATH];
|
||||
while((foo = wcschr(szDir, '\\')))
|
||||
|
@ -3682,10 +3715,10 @@ qboolean Sys_DoDirectoryPrompt(char *basepath, size_t basepathsize, const char *
|
|||
bi.lParam = 0;//(LPARAM)poshname;
|
||||
bi.iImage = 0;
|
||||
|
||||
il = pSHBrowseForFolderW?pSHBrowseForFolderW(&bi):NULL;
|
||||
il = SHBrowseForFolderW(&bi);
|
||||
if (il)
|
||||
{
|
||||
pSHGetPathFromIDListW(il, resultpath);
|
||||
SHGetPathFromIDListW(il, resultpath);
|
||||
CoTaskMemFree(il);
|
||||
narrowen(basepath, basepathsize, resultpath);
|
||||
if (savedname)
|
||||
|
@ -4015,7 +4048,6 @@ static int FS_IdentifyDefaultGame(char *newbase, int sizeof_newbase, qboolean fi
|
|||
//allowed to modify newbasedir if fixedbasedir isn't set
|
||||
static ftemanifest_t *FS_GenerateLegacyManifest(char *newbasedir, int sizeof_newbasedir, qboolean fixedbasedir, int game)
|
||||
{
|
||||
int i;
|
||||
ftemanifest_t *man;
|
||||
|
||||
if (gamemode_info[game].manifestfile)
|
||||
|
@ -4031,49 +4063,57 @@ static ftemanifest_t *FS_GenerateLegacyManifest(char *newbasedir, int sizeof_new
|
|||
Cmd_TokenizeString(va("name \"%s\"", gamemode_info[game].poshname), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("-basegame");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("basegame \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("-basegame", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("-game");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("gamedir \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("-game", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("+gamedir");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("gamedir \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("+gamedir", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
}
|
||||
return man;
|
||||
}
|
||||
|
||||
static void FS_AppendManifestGameArguments(ftemanifest_t *man)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!man)
|
||||
return;
|
||||
|
||||
i = COM_CheckParm ("-basegame");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("basegame \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("-basegame", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("-game");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("gamedir \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("-game", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
|
||||
i = COM_CheckParm ("+gamedir");
|
||||
if (i)
|
||||
{
|
||||
do
|
||||
{
|
||||
Cmd_TokenizeString(va("gamedir \"%s\"", com_argv[i+1]), false, false);
|
||||
FS_Manifest_ParseTokens(man);
|
||||
|
||||
i = COM_CheckNextParm ("+gamedir", i);
|
||||
}
|
||||
while (i && i < com_argc-1);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WEBCLIENT
|
||||
static char *FS_RelativeURL(char *base, char *file, char *buffer, int bufferlen)
|
||||
{
|
||||
|
@ -4739,6 +4779,8 @@ ftemanifest_t *FS_ReadDefaultManifest(char *newbasedir, size_t newbasedirsize, q
|
|||
if (game != -1)
|
||||
man = FS_GenerateLegacyManifest(newbasedir, newbasedirsize, fixedbasedir, game);
|
||||
}
|
||||
|
||||
FS_AppendManifestGameArguments(man);
|
||||
return man;
|
||||
}
|
||||
|
||||
|
@ -5463,6 +5505,9 @@ void COM_InitFilesystem (void)
|
|||
|
||||
usehome = false;
|
||||
|
||||
//assume the home directory is the working directory.
|
||||
*com_homepath = '\0';
|
||||
|
||||
#if defined(_WIN32) && !defined(FTE_SDL) && !defined(WINRT)
|
||||
{ //win32 sucks.
|
||||
HRESULT (WINAPI *dSHGetFolderPathW) (HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, wchar_t *pszPath) = NULL;
|
||||
|
@ -5565,8 +5610,6 @@ void COM_InitFilesystem (void)
|
|||
Q_snprintfz(com_homepath, sizeof(com_homepath), "%s/.fte/", ev);
|
||||
usehome = true; // always use home on unix unless told not to
|
||||
}
|
||||
else
|
||||
*com_homepath = '\0';
|
||||
#endif
|
||||
|
||||
com_homepathusable = usehome;
|
||||
|
|
|
@ -66,6 +66,10 @@ int FS_RegisterFileSystemType(void *module, const char *extension, searchpathfun
|
|||
void FS_UnRegisterFileSystemType(int idx);
|
||||
void FS_UnRegisterFileSystemModule(void *module);
|
||||
|
||||
void FS_AddHashedPackage(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, const char *pakpath, const char *qhash, const char *pakprefix);
|
||||
void PM_LoadPackages(searchpath_t **oldpaths, const char *parent_pure, const char *parent_logical, searchpath_t *search, unsigned int loadstuff, int minpri, int maxpri);
|
||||
void Menu_Download_Update(void);
|
||||
|
||||
void FS_EnumerateKnownGames(qboolean (*callback)(void *usr, ftemanifest_t *man), void *usr);
|
||||
|
||||
#define SPF_REFERENCED 1 //something has been loaded from this path. should filter out client references...
|
||||
|
|
|
@ -544,7 +544,9 @@ static unsigned int QDECL VFSW32_FLocate(searchpathfuncs_t *handle, flocation_t
|
|||
if (f)
|
||||
{
|
||||
LARGE_INTEGER wsize;
|
||||
GetFileSizeEx(f, &wsize);
|
||||
wsize.LowPart = GetFileSize(f, &wsize.HighPart);
|
||||
if (wsize.LowPart == INVALID_FILE_SIZE && GetLastError()!=NO_ERROR)
|
||||
wsize.LowPart = wsize.HighPart = 0;
|
||||
CloseHandle(f);
|
||||
len = qofs_Make(wsize.LowPart, wsize.HighPart);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,15 @@
|
|||
#else
|
||||
|
||||
# include <stddef.h>
|
||||
|
||||
#if __STDC_VERSION__ >= 199901L || defined(__GNUC__)
|
||||
# include <stdint.h>
|
||||
#else
|
||||
#define uint8_t unsigned char
|
||||
#define uint16_t unsigned short
|
||||
#define uint32_t unsigned int
|
||||
#define uint64_t quint64_t
|
||||
#endif
|
||||
|
||||
|
||||
//BEGIN xz.h
|
||||
|
@ -38,7 +46,7 @@
|
|||
# include <linux/types.h>
|
||||
#else
|
||||
# include <stddef.h>
|
||||
# include <stdint.h>
|
||||
//# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -1380,6 +1380,7 @@ static qboolean FSZIP_ReadCentralEntry(zipfile_t *zip, qbyte *data, struct zipce
|
|||
extra += 4;
|
||||
}
|
||||
break;
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1200
|
||||
case 0x000a: //NTFS extra field
|
||||
//0+4: reserved
|
||||
//4+2: subtag(must be 1, for times)
|
||||
|
@ -1393,6 +1394,7 @@ static qboolean FSZIP_ReadCentralEntry(zipfile_t *zip, qbyte *data, struct zipce
|
|||
Con_Printf("zip: unsupported ntfs subchunk %x\n", extrachunk_tag);
|
||||
extra += extrachunk_len;
|
||||
break;
|
||||
#endif
|
||||
case 0x5455:
|
||||
if (extra[0] & 1)
|
||||
entry->mtime = LittleU4FromPtr(extra+1);
|
||||
|
|
|
@ -169,8 +169,8 @@ void Log_String (logtype_t lognum, char *s)
|
|||
|
||||
if (x > (int)log_rotate_size.value)
|
||||
{
|
||||
char newf[MAX_OSPATH];
|
||||
char oldf[MAX_OSPATH];
|
||||
char newf[MAX_QPATH];
|
||||
char oldf[MAX_QPATH];
|
||||
|
||||
i = log_rotate_files.value;
|
||||
|
||||
|
@ -289,7 +289,7 @@ void Log_Logfile_f (void)
|
|||
/*
|
||||
void SV_Fraglogfile_f (void)
|
||||
{
|
||||
char name[MAX_OSPATH];
|
||||
char name[MAX_QPATH];
|
||||
int i;
|
||||
|
||||
if (sv_fraglogfile)
|
||||
|
|
|
@ -2753,7 +2753,7 @@ ftenet_generic_connection_t *FTENET_Generic_EstablishConnection(int adrfamily, i
|
|||
setsockopt(newsocket, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&_true, sizeof(_true));
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#if defined(_WIN32) && defined(SO_EXCLUSIVEADDRUSE)
|
||||
//win32 is so fucked up
|
||||
setsockopt(newsocket, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char *)&_true, sizeof(_true));
|
||||
#endif
|
||||
|
@ -3423,14 +3423,14 @@ handshakeerror:
|
|||
if (payoffs + 8 > st->inlen)
|
||||
break;
|
||||
ullpaylen =
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+0]<<56ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+1]<<48ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+2]<<40ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+3]<<32ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+4]<<24ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+5]<<16ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+6]<< 8ull |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+7]<< 0ull;
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+0]<<56u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+1]<<48u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+2]<<40u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+3]<<32u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+4]<<24u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+5]<<16u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+6]<< 8u |
|
||||
(quint64_t)((unsigned char*)st->inbuffer)[payoffs+7]<< 0u;
|
||||
if (ullpaylen < 0x10000)
|
||||
{
|
||||
Con_Printf ("%s: payload size (%"PRIu64") encoded badly\n", NET_AdrToString (adr, sizeof(adr), &st->remoteaddr), ullpaylen);
|
||||
|
|
|
@ -1170,7 +1170,7 @@ qintptr_t VARGS Plug_FS_Seek(void *offset, quintptr_t mask, const qintptr_t *arg
|
|||
stream = &pluginstreamarray[handle];
|
||||
if (stream->type != STREAM_VFS)
|
||||
return -1;
|
||||
VFS_SEEK(stream->vfs, low | ((unsigned long long)high<<32));
|
||||
VFS_SEEK(stream->vfs, low | ((quint64_t)high<<32));
|
||||
return VFS_TELL(stream->vfs);
|
||||
}
|
||||
|
||||
|
|
|
@ -867,7 +867,7 @@ void PM_CategorizePosition (void)
|
|||
// VectorMA(point, 48, forward, point);
|
||||
// trace = PM_TraceLine(pmove.origin, point);
|
||||
// trace.fraction = 1;
|
||||
if (1)//trace.fraction == 1)
|
||||
// if (1)//trace.fraction == 1)
|
||||
{ //getting desparate
|
||||
VectorMA(pmove.origin, -48, up, point);
|
||||
VectorMA(point, 48, forward, point);
|
||||
|
|
|
@ -1751,9 +1751,9 @@ void pf_hash_purge(void) //restart command was used. revert to the state at the
|
|||
typedef struct {
|
||||
char name[256];
|
||||
char *data;
|
||||
int bufferlen;
|
||||
int len;
|
||||
int ofs;
|
||||
size_t bufferlen;
|
||||
size_t len;
|
||||
size_t ofs;
|
||||
int accessmode;
|
||||
pubprogfuncs_t *prinst;
|
||||
} pf_fopen_files_t;
|
||||
|
@ -2010,6 +2010,13 @@ void QCBUILTIN PF_fgets (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals
|
|||
max = o + sizeof(pr_string_temp)-1;
|
||||
s = pf_fopen_files[fnum].data+pf_fopen_files[fnum].ofs;
|
||||
eof = pf_fopen_files[fnum].data+pf_fopen_files[fnum].len;
|
||||
|
||||
if (s >= eof)
|
||||
{
|
||||
G_INT(OFS_RETURN) = 0; //EOF
|
||||
return;
|
||||
}
|
||||
|
||||
while(s < eof)
|
||||
{
|
||||
c = *s++;
|
||||
|
@ -2036,14 +2043,42 @@ void QCBUILTIN PF_fgets (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals
|
|||
|
||||
pf_fopen_files[fnum].ofs = s - pf_fopen_files[fnum].data;
|
||||
|
||||
if (!pr_string_temp[0] && s >= eof)
|
||||
G_INT(OFS_RETURN) = 0; //EOF
|
||||
else
|
||||
RETURN_TSTRING(pr_string_temp);
|
||||
RETURN_TSTRING(pr_string_temp);
|
||||
}
|
||||
}
|
||||
|
||||
static int PF_fwrite_internal (pubprogfuncs_t *prinst, int fnum, char *msg, int len)
|
||||
//ensures that the buffer is at least big enough.
|
||||
static qboolean PF_fresizebuffer_internal (pf_fopen_files_t *f, size_t newlen)
|
||||
{
|
||||
switch(f->accessmode)
|
||||
{
|
||||
default:
|
||||
return false;
|
||||
case FRIK_FILE_MMAP_RW:
|
||||
//mmap cannot change the buffer size/allocation.
|
||||
if (newlen > f->bufferlen)
|
||||
return false;
|
||||
break;
|
||||
case FRIK_FILE_APPEND:
|
||||
case FRIK_FILE_WRITE:
|
||||
if (f->bufferlen < newlen)
|
||||
{
|
||||
char *newbuf;
|
||||
size_t newbuflen = max(newlen, newlen*2+1024);
|
||||
newbuf = BZF_Malloc(newbuflen);
|
||||
if (!newbuf)
|
||||
return false;
|
||||
memcpy(newbuf, f->data, f->bufferlen);
|
||||
memset(newbuf+f->bufferlen, 0, newbuflen - f->bufferlen);
|
||||
BZ_Free(f->data);
|
||||
f->data = newbuf;
|
||||
f->bufferlen = newbuflen;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
static int PF_fwrite_internal (pubprogfuncs_t *prinst, int fnum, char *msg, size_t len)
|
||||
{
|
||||
if (fnum < 0 || fnum >= MAX_QC_FILES)
|
||||
{
|
||||
|
@ -2063,22 +2098,21 @@ static int PF_fwrite_internal (pubprogfuncs_t *prinst, int fnum, char *msg, int
|
|||
return 0; //this just isn't ours.
|
||||
}
|
||||
|
||||
if (pf_fopen_files[fnum].ofs + len < pf_fopen_files[fnum].ofs)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fwrite: size overflow\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch(pf_fopen_files[fnum].accessmode)
|
||||
{
|
||||
default:
|
||||
return 0;
|
||||
case FRIK_FILE_APPEND:
|
||||
case FRIK_FILE_WRITE:
|
||||
//UTF-8-FIXME: de-modify utf-8
|
||||
if (pf_fopen_files[fnum].bufferlen < pf_fopen_files[fnum].ofs + len)
|
||||
{
|
||||
char *newbuf;
|
||||
pf_fopen_files[fnum].bufferlen = pf_fopen_files[fnum].bufferlen*2 + len;
|
||||
newbuf = BZF_Malloc(pf_fopen_files[fnum].bufferlen);
|
||||
memcpy(newbuf, pf_fopen_files[fnum].data, pf_fopen_files[fnum].len);
|
||||
BZ_Free(pf_fopen_files[fnum].data);
|
||||
pf_fopen_files[fnum].data = newbuf;
|
||||
}
|
||||
case FRIK_FILE_MMAP_RW:
|
||||
PF_fresizebuffer_internal(&pf_fopen_files[fnum], pf_fopen_files[fnum].ofs+len);
|
||||
len = min(len, pf_fopen_files[fnum].bufferlen-pf_fopen_files[fnum].ofs);
|
||||
|
||||
memcpy(pf_fopen_files[fnum].data + pf_fopen_files[fnum].ofs, msg, len);
|
||||
if (pf_fopen_files[fnum].len < pf_fopen_files[fnum].ofs + len)
|
||||
|
@ -2088,7 +2122,7 @@ static int PF_fwrite_internal (pubprogfuncs_t *prinst, int fnum, char *msg, int
|
|||
}
|
||||
}
|
||||
|
||||
static int PF_fread_internal (pubprogfuncs_t *prinst, int fnum, char *msg, int len)
|
||||
static int PF_fread_internal (pubprogfuncs_t *prinst, int fnum, char *msg, size_t len)
|
||||
{
|
||||
if (fnum < 0 || fnum >= MAX_QC_FILES)
|
||||
{
|
||||
|
@ -2158,6 +2192,60 @@ void QCBUILTIN PF_fread (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals
|
|||
|
||||
G_INT(OFS_PARM1) = PF_fread_internal (prinst, fnum, prinst->stringtable + ptr, size);
|
||||
}
|
||||
void QCBUILTIN PF_fseek (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
int fnum = G_FLOAT(OFS_PARM0) - FIRST_QC_FILE_INDEX;
|
||||
G_INT(OFS_PARM1) = 0;
|
||||
if (fnum < 0 || fnum >= MAX_QC_FILES)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fread: File out of range\n");
|
||||
return; //out of range
|
||||
}
|
||||
if (!pf_fopen_files[fnum].data)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fread: File is not open\n");
|
||||
return; //not open
|
||||
}
|
||||
if (pf_fopen_files[fnum].prinst != prinst)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fread: File is from wrong instance\n");
|
||||
return; //this just isn't ours.
|
||||
}
|
||||
|
||||
G_INT(OFS_PARM1) = pf_fopen_files[fnum].ofs;
|
||||
if (prinst->callargc>1 && G_INT(OFS_PARM0) >= 0)
|
||||
{
|
||||
pf_fopen_files[fnum].ofs = G_INT(OFS_PARM0);
|
||||
}
|
||||
}
|
||||
void QCBUILTIN PF_fsize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
int fnum = G_FLOAT(OFS_PARM0) - FIRST_QC_FILE_INDEX;
|
||||
G_INT(OFS_PARM1) = 0;
|
||||
if (fnum < 0 || fnum >= MAX_QC_FILES)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fsize: File out of range\n");
|
||||
return; //out of range
|
||||
}
|
||||
if (!pf_fopen_files[fnum].data)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fsize: File is not open\n");
|
||||
return; //not open
|
||||
}
|
||||
if (pf_fopen_files[fnum].prinst != prinst)
|
||||
{
|
||||
PF_Warningf(prinst, "PF_fsize: File is from wrong instance\n");
|
||||
return; //this just isn't ours.
|
||||
}
|
||||
|
||||
G_INT(OFS_PARM1) = pf_fopen_files[fnum].len;
|
||||
if (prinst->callargc>1 && G_INT(OFS_PARM0) >= 0)
|
||||
{
|
||||
size_t newlen = G_INT(OFS_PARM0);
|
||||
PF_fresizebuffer_internal(&pf_fopen_files[fnum], newlen);
|
||||
pf_fopen_files[fnum].len = min(pf_fopen_files[fnum].bufferlen, newlen);
|
||||
}
|
||||
}
|
||||
|
||||
void PF_fcloseall (pubprogfuncs_t *prinst)
|
||||
{
|
||||
|
|
|
@ -144,6 +144,8 @@ void QCBUILTIN PF_fputs (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals
|
|||
void QCBUILTIN PF_fgets (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_fwrite (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_fread (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_fseek (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_fsize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_normalize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_vlen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
void QCBUILTIN PF_vhlen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
|
||||
|
@ -527,7 +529,7 @@ pbool QDECL ED_CanFree (edict_t *ed);
|
|||
#define MOVETYPE_6DOF 30 // flightsim mode
|
||||
#define MOVETYPE_WALLWALK 31 // walks up walls and along ceilings
|
||||
#define MOVETYPE_PHYSICS 32
|
||||
#define MOVETYPE_FLY_WORLDONLY 33
|
||||
#define MOVETYPE_FLY_WORLDONLY 33 //fly that collides only with world, keeping spectators within the world but free to pass through doors. avoids pvs issues with q3map2.
|
||||
|
||||
// edict->solid values
|
||||
#define SOLID_NOT 0 // no interaction with other objects
|
||||
|
|
|
@ -507,7 +507,7 @@ nextbrush:
|
|||
}
|
||||
static void Q1BSP_InsertBrush(mnode_t *node, mbrush_t *brush, vec3_t bmins, vec3_t bmaxs)
|
||||
{
|
||||
vec3_t near, far;
|
||||
vec3_t nearp, farp;
|
||||
float nd, fd;
|
||||
int i;
|
||||
while(1)
|
||||
|
@ -523,18 +523,18 @@ static void Q1BSP_InsertBrush(mnode_t *node, mbrush_t *brush, vec3_t bmins, vec3
|
|||
{
|
||||
if (node->plane->normal[i] > 0)
|
||||
{
|
||||
near[i] = bmins[i];
|
||||
far[i] = bmaxs[i];
|
||||
nearp[i] = bmins[i];
|
||||
farp[i] = bmaxs[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
near[i] = bmaxs[i];
|
||||
far[i] = bmins[i];
|
||||
nearp[i] = bmaxs[i];
|
||||
farp[i] = bmins[i];
|
||||
}
|
||||
}
|
||||
|
||||
nd = DotProduct(node->plane->normal, near) - node->plane->dist;
|
||||
fd = DotProduct(node->plane->normal, far) - node->plane->dist;
|
||||
nd = DotProduct(node->plane->normal, nearp) - node->plane->dist;
|
||||
fd = DotProduct(node->plane->normal, farp) - node->plane->dist;
|
||||
|
||||
/*if its fully on either side, continue walking*/
|
||||
if (nd < 0 && fd < 0)
|
||||
|
|
|
@ -10,14 +10,14 @@ typedef struct {
|
|||
char name[256];
|
||||
char *data;
|
||||
int bufferlen;
|
||||
int len;
|
||||
int ofs;
|
||||
qofs_t len;
|
||||
qofs_t ofs;
|
||||
int accessmode;
|
||||
int owner;
|
||||
} vm_fopen_files_t;
|
||||
vm_fopen_files_t vm_fopen_files[MAX_VM_FILES];
|
||||
//FIXME: why does this not use the VFS system?
|
||||
int VM_fopen (char *name, int *handle, int fmode, int owner)
|
||||
qofs_t VM_fopen (const char *name, int *handle, int fmode, int owner)
|
||||
{
|
||||
int i;
|
||||
size_t insize;
|
||||
|
@ -128,7 +128,7 @@ int VM_FRead (char *dest, int quantity, int fnum, int owner)
|
|||
|
||||
return quantity;
|
||||
}
|
||||
int VM_FWrite (char *dest, int quantity, int fnum, int owner)
|
||||
int VM_FWrite (const char *dest, int quantity, int fnum, int owner)
|
||||
{
|
||||
/*
|
||||
int fnum = G_FLOAT(OFS_PARM0);
|
||||
|
@ -160,15 +160,15 @@ int VM_FWrite (char *dest, int quantity, int fnum, int owner)
|
|||
*/
|
||||
return 0;
|
||||
}
|
||||
void VM_FSeek (int fnum, int offset, int seektype, int owner)
|
||||
qboolean VM_FSeek (int fnum, qofs_t offset, int seektype, int owner)
|
||||
{
|
||||
fnum--;
|
||||
if (fnum < 0 || fnum >= MAX_VM_FILES)
|
||||
return; //out of range
|
||||
return false; //out of range
|
||||
if (vm_fopen_files[fnum].owner != owner)
|
||||
return; //cgs?
|
||||
return false; //cgs?
|
||||
if (!vm_fopen_files[fnum].data)
|
||||
return; //not open
|
||||
return false; //not open
|
||||
|
||||
switch(seektype)
|
||||
{
|
||||
|
@ -182,13 +182,14 @@ void VM_FSeek (int fnum, int offset, int seektype, int owner)
|
|||
//offset = 0 + offset;
|
||||
break;
|
||||
}
|
||||
if (offset < 0)
|
||||
offset = 0;
|
||||
// if (offset < 0)
|
||||
// offset = 0;
|
||||
if (offset > vm_fopen_files[fnum].len)
|
||||
offset = vm_fopen_files[fnum].len;
|
||||
vm_fopen_files[fnum].ofs = offset;
|
||||
return true;
|
||||
}
|
||||
int VM_FTell (int fnum, int owner)
|
||||
qofs_t VM_FTell (int fnum, int owner)
|
||||
{
|
||||
fnum--;
|
||||
if (fnum < 0 || fnum >= MAX_VM_FILES)
|
||||
|
@ -318,7 +319,7 @@ static int QDECL VMEnumMods(const char *match, qofs_t size, time_t modtime, void
|
|||
return true;
|
||||
}
|
||||
|
||||
int VM_GetFileList(char *path, char *ext, char *output, int buffersize)
|
||||
int VM_GetFileList(const char *path, const char *ext, char *output, int buffersize)
|
||||
{
|
||||
vmsearch_t vms;
|
||||
vms.initialbuffer = vms.buffer = output;
|
||||
|
|
|
@ -168,15 +168,23 @@ qboolean NPQTV_Sys_Startup(int argc, char *argv[]);
|
|||
void NPQTV_Sys_MainLoop(void);
|
||||
#endif
|
||||
|
||||
#define UPD_UNSUPPORTED -1
|
||||
#define UPD_REVERT 0
|
||||
#define UPD_OFF 1
|
||||
#define UPD_STABLE 2
|
||||
#define UPD_TESTING 3
|
||||
|
||||
#if defined(WEBCLIENT) && defined(_WIN32)
|
||||
int StartLocalServer(int close);
|
||||
|
||||
#define HAVEAUTOUPDATE
|
||||
int Sys_GetAutoUpdateSetting(void);
|
||||
void Sys_SetAutoUpdateSetting(int newval);
|
||||
void Sys_SetUpdatedBinary(const char *fname);
|
||||
#else
|
||||
#define Sys_GetAutoUpdateSetting() -1
|
||||
#define Sys_GetAutoUpdateSetting() UPD_UNSUPPORTED
|
||||
#define Sys_SetAutoUpdateSetting(n)
|
||||
#define Sys_SetUpdatedBinary(n)
|
||||
#endif
|
||||
|
||||
void Sys_Init (void);
|
||||
|
|
|
@ -25,7 +25,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#include <conio.h>
|
||||
|
||||
#if (defined(_DEBUG) || defined(DEBUG)) && !defined(NPFTE)
|
||||
#if !defined(_MSC_VER) || _MSC_VER > 1200
|
||||
#define CATCHCRASH
|
||||
#endif
|
||||
#ifdef _MSC_VER
|
||||
#define MSVC_SEH
|
||||
DWORD CrashExceptionHandler (qboolean iswatchdog, DWORD exceptionCode, LPEXCEPTION_POINTERS exceptionInfo);
|
||||
|
|
|
@ -88,14 +88,14 @@ void Script_Get_File_And_Line(int handle, char *filename, int *line);
|
|||
#define VM_FS_WRITE 1
|
||||
#define VM_FS_APPEND 2
|
||||
#define VM_FS_APPEND2 3 //I don't know, don't ask me. look at q3 source
|
||||
int VM_fopen (char *name, int *handle, int fmode, int owner);
|
||||
qofs_t VM_fopen (const char *name, int *handle, int fmode, int owner);
|
||||
int VM_FRead (char *dest, int quantity, int fnum, int owner);
|
||||
int VM_FWrite (char *dest, int quantity, int fnum, int owner);
|
||||
void VM_FSeek (int fnum, int offset, int seektype, int owner);
|
||||
int VM_FTell (int fnum, int owner);
|
||||
int VM_FWrite (const char *dest, int quantity, int fnum, int owner);
|
||||
qboolean VM_FSeek (int fnum, qofs_t offset, int seektype, int owner);
|
||||
qofs_t VM_FTell (int fnum, int owner);
|
||||
void VM_fclose (int fnum, int owner);
|
||||
void VM_fcloseall (int owner);
|
||||
int VM_GetFileList(char *path, char *ext, char *output, int buffersize);
|
||||
int VM_GetFileList(const char *path, const char *ext, char *output, int buffersize);
|
||||
|
||||
#ifdef VM_CG
|
||||
void CG_Stop (void);
|
||||
|
|
|
@ -716,7 +716,6 @@ Global
|
|||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.GLRelease|Win32.Build.0 = Release|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.GLRelease|x64.ActiveCfg = Release|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.MDebug|Win32.ActiveCfg = Debug|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.MDebug|Win32.Build.0 = Debug|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.MDebug|x64.ActiveCfg = Debug|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.MinGLDebug|Win32.ActiveCfg = Debug|Win32
|
||||
{75D91BDE-CC30-4C53-BF33-5F69EF13A61B}.MinGLDebug|x64.ActiveCfg = Debug|Win32
|
||||
|
|
|
@ -1461,7 +1461,7 @@
|
|||
<Configuration
|
||||
Name="MDebug|Win32"
|
||||
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
|
||||
IntermediateDirectory="fteqw_$(ConfigurationName)"
|
||||
IntermediateDirectory="$(ConfigurationName)"
|
||||
ConfigurationType="1"
|
||||
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"
|
||||
UseOfMFC="0"
|
||||
|
@ -11121,7 +11121,6 @@
|
|||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release Dedicated Server|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
|
@ -11131,7 +11130,6 @@
|
|||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Release Dedicated Server|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
|
@ -11159,7 +11157,6 @@
|
|||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug Dedicated Server|Win32"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
|
@ -11169,7 +11166,6 @@
|
|||
</FileConfiguration>
|
||||
<FileConfiguration
|
||||
Name="Debug Dedicated Server|x64"
|
||||
ExcludedFromBuild="true"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
|
|
|
@ -69,7 +69,8 @@ LINK32=link.exe
|
|||
# PROP Ignore_Export_Lib 1
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NPQTV_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../client" /I "../common" /I "../server" /I "../gl" /I "../sw" /I "../qclib" /I "../libs" /I "../libs/dxsdk7/include" /I "../libs/freetype2/include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NPQTV" /D "GLQUAKE" /FR /Yu"quakedef.h" /FD /GZ /c
|
||||
# ADD CPP /nologo /MT /W3 /Gm /GX /ZI /Od /I "../client" /I "../common" /I "../server" /I "../gl" /I "../sw" /I "../qclib" /I "../libs" /I "../libs/dxsdk7/include" /I "../libs/freetype2/include" /I "../libs/speex" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NPQTV" /D "GLQUAKE" /FR /FD /GZ /c
|
||||
# SUBTRACT CPP /YX /Yc /Yu
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x809 /d "_DEBUG"
|
||||
|
@ -79,7 +80,7 @@ BSC32=bscmake.exe
|
|||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib wsock32.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcd" /out:"../../npqtv.dll" /pdbtype:sept /libpath:"../libs/dxsdk7/lib"
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib wsock32.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcd" /nodefaultlib:"msvcrt.lib" /out:"../../npqtv.dll" /pdbtype:sept /libpath:"../libs/dxsdk7/lib"
|
||||
|
||||
!ENDIF
|
||||
|
||||
|
@ -90,210 +91,9 @@ LINK32=link.exe
|
|||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Group "common"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\cmd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\com_mesh.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\common.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yc"quakedef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\crc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\cvar.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\fs.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\fs_pak.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\fs_stdio.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\fs_zip.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\gl_q2bsp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\huff.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\log.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\mathlib.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\md4.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# SUBTRACT CPP /YX /Yc /Yu
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\net_chan.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\net_wins.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\plugin.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\pmove.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\pmovetst.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\pr_bgcmd.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\q1bsp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\q2pmove.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\q3common.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\qvm.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\translate.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\zone.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "client"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cd_null.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_cam.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_cg.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_demo.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_ents.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_ignore.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_input.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_main.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_parse.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_pred.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_screen.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_tent.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\cl_ui.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\clhl_game.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\clq2_cin.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\clq2_ents.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\clq3_parse.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\console.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\fragstats.c
|
||||
SOURCE=..\http\httpclient.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
|
@ -301,87 +101,7 @@ SOURCE=..\client\image.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\in_win.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\keys.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_download.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_items.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_master.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_mp3.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_multi.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_options.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_script.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\m_single.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\menu.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\net_master.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\p_classic.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\p_null.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\p_script.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\pr_csqc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\pr_menu.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\r_bulleten.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\r_efrag.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\r_part.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\r_partset.c
|
||||
SOURCE=..\client\sys_axfte.cpp
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
|
@ -394,638 +114,33 @@ SOURCE=..\client\r_partset.c
|
|||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\renderer.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\renderque.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\roq_read.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\sbar.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\skin.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_directx.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_dma.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_mem.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_mix.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_mp3.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_ov.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\snd_win.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\sys_win.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\teamplay.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\textedit.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\valid.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\view.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\wad.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\zqtp.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "gl"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_alias.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_backend.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_bloom.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_draw.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_heightmap.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_hlmdl.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_model.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_ngraph.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_ppl.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_rlight.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_rmain.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_rmisc.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_rsurf.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_screen.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_shader.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_vidcommon.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_vidnt.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\gl_warp.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\glmod_doom.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\gl\ltface.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "asm"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\common\math.s
|
||||
SOURCE=..\client\sys_npfte.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\Release
|
||||
InputPath=..\common\math.s
|
||||
InputName=math
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\npqtv___Win32_Debug
|
||||
InputPath=..\common\math.s
|
||||
InputName=math
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
# SUBTRACT CPP /YX /Yc /Yu
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\sys_wina.s
|
||||
SOURCE=..\client\sys_plugfte.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\Release
|
||||
InputPath=..\client\sys_wina.s
|
||||
InputName=sys_wina
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\npqtv___Win32_Debug
|
||||
InputPath=..\client\sys_wina.s
|
||||
InputName=sys_wina
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
# SUBTRACT CPP /YX /Yc /Yu
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\worlda.s
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\Release
|
||||
InputPath=..\server\worlda.s
|
||||
InputName=worlda
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# Begin Custom Build
|
||||
OutDir=.\npqtv___Win32_Debug
|
||||
InputPath=..\server\worlda.s
|
||||
InputName=worlda
|
||||
|
||||
"$(OUTDIR)\$(InputName).obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
cl /EP /I ..\common $(InputPath) > $(OUTDIR)\$(InputName).spp
|
||||
..\gas2masm\debug\gas2masm < $(OUTDIR)\$(InputName).spp > $(OUTDIR)\$(InputName).asm
|
||||
ml /c /Cp /coff /Fo$(OUTDIR)\$(InputName).obj /Zm /Zi $(OUTDIR)\$(InputName).asm
|
||||
del $(OUTDIR)\$(InputName).spp
|
||||
|
||||
# End Custom Build
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "server"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\net_preparse.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\pr_cmds.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\pr_q1qvm.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\savegame.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_ccmds.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_chat.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_demo.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_ents.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_init.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_main.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_master.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_move.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_mvd.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_nchan.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_phys.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_rankin.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_send.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\sv_user.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svhl_game.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svhl_phys.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svhl_world.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svmodel.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svq2_ents.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svq2_game.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\svq3_game.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\server\world.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu"qwsvdef.h"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\npapi.def
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\client\sys_npqtv.c
|
||||
|
||||
!IF "$(CFG)" == "npqtv - Win32 Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "npqtv - Win32 Debug"
|
||||
|
||||
# ADD CPP /Yu
|
||||
|
||||
!ENDIF
|
||||
|
||||
SOURCE=..\common\sys_win_threads.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
@ -1040,5 +155,9 @@ SOURCE=..\client\sys_npqtv.c
|
|||
SOURCE=.\npplug.rc
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\npapi.def
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
||||
|
|
|
@ -613,12 +613,13 @@ static struct charcache_s *Font_TryLoadGlyph(font_t *f, CHARIDXTYPE charidx)
|
|||
int x, y;
|
||||
unsigned int stepx, stepy;
|
||||
unsigned int srcx, srcy;
|
||||
size_t lumpsize = 0;
|
||||
|
||||
if (charidx-0xe100 >= sizeof(imgs)/sizeof(imgs[0]))
|
||||
wadimg = NULL;
|
||||
else
|
||||
wadimg = W_SafeGetLumpName(imgs[charidx-0xe100]);
|
||||
if (wadimg)
|
||||
wadimg = W_SafeGetLumpName(imgs[charidx-0xe100], &lumpsize);
|
||||
if (wadimg && lumpsize == 8+wadimg->height*wadimg->width)
|
||||
{
|
||||
nh = wadimg->height;
|
||||
nw = wadimg->width;
|
||||
|
@ -964,7 +965,7 @@ static texid_t Font_LoadReplacementConchars(void)
|
|||
}
|
||||
static texid_t Font_LoadQuakeConchars(void)
|
||||
{
|
||||
unsigned int i;
|
||||
/*unsigned int i;
|
||||
qbyte *lump;
|
||||
lump = W_SafeGetLumpName ("conchars");
|
||||
if (lump)
|
||||
|
@ -981,7 +982,7 @@ static texid_t Font_LoadQuakeConchars(void)
|
|||
lump[i] = 255; // proper transparent color
|
||||
|
||||
return R_LoadTexture8("charset", 128, 128, (void*)lump, IF_LOADNOW|IF_UIPIC|IF_NOMIPMAP|IF_NOGAMMA, 1);
|
||||
}
|
||||
}*/
|
||||
return r_nulltex;
|
||||
}
|
||||
|
||||
|
@ -1330,8 +1331,9 @@ struct font_s *Font_LoadFont(float vheight, const char *fontfilename)
|
|||
{
|
||||
unsigned int *img;
|
||||
int x, y;
|
||||
unsigned char *w = W_SafeGetLumpName(fontfilename+4);
|
||||
if (!w)
|
||||
size_t lumpsize;
|
||||
unsigned char *w = W_SafeGetLumpName(fontfilename+4, &lumpsize);
|
||||
if (!w || lumpsize != 5)
|
||||
{
|
||||
Z_Free(f);
|
||||
return NULL;
|
||||
|
|
|
@ -878,6 +878,10 @@ qboolean R_ImportRTLights(char *entlump)
|
|||
return okay;
|
||||
}
|
||||
}
|
||||
else if (entnum == 0 && !strcmp("lightmapbright", key))
|
||||
{
|
||||
//tenebrae compat. this overrides r_shadow_realtime_world_lightmap
|
||||
}
|
||||
}
|
||||
if (!islight)
|
||||
continue;
|
||||
|
@ -983,7 +987,23 @@ qboolean R_LoadRTLights(void)
|
|||
|
||||
while(*file == ' ' || *file == '\t')
|
||||
file++;
|
||||
if (*file == '!')
|
||||
if (*file == '#')
|
||||
{
|
||||
file++;
|
||||
while(*file == ' ' || *file == '\t')
|
||||
file++;
|
||||
file = COM_Parse(file);
|
||||
if (!Q_strcasecmp(com_token, "lightmaps"))
|
||||
{
|
||||
file = COM_Parse(file);
|
||||
//foo = atoi(com_token);
|
||||
}
|
||||
else
|
||||
Con_DPrintf("Unknown directive: %s\n", com_token);
|
||||
file = end+1;
|
||||
continue;
|
||||
}
|
||||
else if (*file == '!')
|
||||
{
|
||||
flags = LFLAG_NOSHADOWS;
|
||||
file++;
|
||||
|
@ -1110,6 +1130,9 @@ void R_SaveRTLights_f(void)
|
|||
Con_Printf("couldn't open %s\n", fname);
|
||||
return;
|
||||
}
|
||||
|
||||
// VFS_PUTS(f, va("#lightmap %f\n", foo));
|
||||
|
||||
for (light = cl_dlights+rtlights_first, i=rtlights_first; i<rtlights_max; i++, light++)
|
||||
{
|
||||
if (light->die)
|
||||
|
|
|
@ -221,6 +221,16 @@ enum shaderparsemode_e
|
|||
static struct
|
||||
{
|
||||
enum shaderparsemode_e mode;
|
||||
|
||||
qboolean forceprogramify;
|
||||
//for dpwater compat, used to generate a program
|
||||
float reflectmin;
|
||||
float reflectmax;
|
||||
float reflectfactor;
|
||||
float refractfactor;
|
||||
vec3_t refractcolour;
|
||||
vec3_t reflectcolour;
|
||||
float wateralpha;
|
||||
} parsestate;
|
||||
|
||||
typedef struct shaderkey_s
|
||||
|
@ -1095,7 +1105,7 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip
|
|||
|
||||
#ifdef VKQUAKE
|
||||
if (qrenderer == QR_VULKAN && (qrtype == QR_VULKAN || qrtype == QR_OPENGL))
|
||||
{
|
||||
{ //vulkan can potentially load glsl, f it has the extensions enabled.
|
||||
if (qrtype == QR_VULKAN && VK_LoadBlob(prog, script, name))
|
||||
return true;
|
||||
}
|
||||
|
@ -1395,6 +1405,8 @@ static qboolean Shader_LoadPermutations(char *name, program_t *prog, char *scrip
|
|||
end = strchr(start, '#');
|
||||
if (!end)
|
||||
end = start + strlen(start);
|
||||
if (end-start == 7 && !Q_strncasecmp(start, "usemods", 7))
|
||||
prog->nofixedcompat = false;
|
||||
if (nummodifiers < MAXMODIFIERS)
|
||||
{
|
||||
permutationdefines[nummodifiers] = d = BZ_Malloc(10 + end - start);
|
||||
|
@ -1658,7 +1670,7 @@ static void Shader_LoadGeneric(sgeneric_t *g, int qrtype)
|
|||
FS_LoadFile(basicname, &file);
|
||||
*blobname = 0;
|
||||
}
|
||||
else
|
||||
else if (ruleset_allow_shaders.ival)
|
||||
{ //renderer-specific files
|
||||
if (sh_config.progpath)
|
||||
{
|
||||
|
@ -1672,6 +1684,11 @@ static void Shader_LoadGeneric(sgeneric_t *g, int qrtype)
|
|||
else
|
||||
*blobname = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
file = NULL;
|
||||
*blobname = 0;
|
||||
}
|
||||
|
||||
if (sh_config.pDeleteProg)
|
||||
{
|
||||
|
@ -1690,7 +1707,7 @@ static void Shader_LoadGeneric(sgeneric_t *g, int qrtype)
|
|||
int ver;
|
||||
for (i = 0; *sbuiltins[i].name; i++)
|
||||
{
|
||||
if (sbuiltins[i].qrtype == qrenderer && !strcmp(sbuiltins[i].name, basicname))
|
||||
if (sbuiltins[i].qrtype == qrtype && !strcmp(sbuiltins[i].name, basicname))
|
||||
{
|
||||
ver = sbuiltins[i].apiver;
|
||||
|
||||
|
@ -1698,7 +1715,7 @@ static void Shader_LoadGeneric(sgeneric_t *g, int qrtype)
|
|||
if (!(qrenderer==QR_OPENGL&&ver==110&&sh_config.maxver==100))
|
||||
continue;
|
||||
|
||||
g->failed = !Shader_LoadPermutations(g->name, &g->prog, sbuiltins[i].body, sbuiltins[i].qrtype, ver, blobname);
|
||||
g->failed = !Shader_LoadPermutations(g->name, &g->prog, sbuiltins[i].body, qrtype, ver, blobname);
|
||||
|
||||
if (g->failed)
|
||||
continue;
|
||||
|
@ -2211,6 +2228,32 @@ static void Shader_DP_Camera(shader_t *shader, shaderpass_t *pass, char **ptr)
|
|||
{
|
||||
shader->sort = SHADER_SORT_PORTAL;
|
||||
}
|
||||
static void Shader_DP_Water(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||
{
|
||||
parsestate.forceprogramify = true;
|
||||
|
||||
parsestate.reflectmin = Shader_ParseFloat(shader, ptr, 0);
|
||||
parsestate.reflectmax = Shader_ParseFloat(shader, ptr, 0);
|
||||
parsestate.refractfactor = Shader_ParseFloat(shader, ptr, 0);
|
||||
parsestate.reflectfactor = Shader_ParseFloat(shader, ptr, 0);
|
||||
Shader_ParseVector(shader, ptr, parsestate.refractcolour);
|
||||
Shader_ParseVector(shader, ptr, parsestate.reflectcolour);
|
||||
parsestate.wateralpha = Shader_ParseFloat(shader, ptr, 0);
|
||||
}
|
||||
static void Shader_DP_Reflect(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||
{
|
||||
parsestate.forceprogramify = true;
|
||||
|
||||
parsestate.reflectfactor = Shader_ParseFloat(shader, ptr, 0);
|
||||
Shader_ParseVector(shader, ptr, parsestate.reflectcolour);
|
||||
}
|
||||
static void Shader_DP_Refract(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||
{
|
||||
parsestate.forceprogramify = true;
|
||||
|
||||
parsestate.refractfactor = Shader_ParseFloat(shader, ptr, 0);
|
||||
Shader_ParseVector(shader, ptr, parsestate.refractcolour);
|
||||
}
|
||||
|
||||
static void Shader_BEMode(shader_t *shader, shaderpass_t *pass, char **ptr)
|
||||
{
|
||||
|
@ -2334,8 +2377,11 @@ static shaderkey_t shaderkeys[] =
|
|||
{"reflectmask", Shader_ReflectMask, "fte"},
|
||||
|
||||
//dp compat
|
||||
{"camera", Shader_DP_Camera, "dp"},
|
||||
{"reflectcube", Shader_ReflectCube, "dp"},
|
||||
{"camera", Shader_DP_Camera, "dp"},
|
||||
{"water", Shader_DP_Water, "dp"},
|
||||
{"reflect", Shader_DP_Reflect, "dp"},
|
||||
{"refract", Shader_DP_Refract, "dp"},
|
||||
|
||||
/*doom3 compat*/
|
||||
{"diffusemap", Shader_DiffuseMap, "doom3"}, //macro for "{\nstage diffusemap\nmap <map>\n}"
|
||||
|
@ -3923,6 +3969,7 @@ const char *Shader_AlphaMaskProgArgs(shader_t *s)
|
|||
|
||||
void Shader_Programify (shader_t *s)
|
||||
{
|
||||
qboolean reflectrefract = false;
|
||||
char *prog = NULL;
|
||||
const char *mask;
|
||||
/* enum
|
||||
|
@ -3955,7 +4002,29 @@ void Shader_Programify (shader_t *s)
|
|||
return;*/
|
||||
}
|
||||
|
||||
if (modellighting)
|
||||
if (parsestate.refractfactor || parsestate.reflectfactor)
|
||||
{
|
||||
prog = va("altwater#REFLECT#USEMODS#FRESNEL_EXP=2.0"
|
||||
//variable parts
|
||||
"#STRENGTH_REFR=%g#STRENGTH_REFL=%g"
|
||||
"#TINT_REFR=%g,%g,%g"
|
||||
"#TINT_REFL=%g,%g,%g"
|
||||
"#FRESNEL_MIN=%g#FRESNEL_RANGE=%g"
|
||||
"#ALPHA=%g",
|
||||
//those args
|
||||
parsestate.refractfactor*0.01, parsestate.reflectfactor*0.01,
|
||||
parsestate.refractcolour[0],parsestate.refractcolour[1],parsestate.refractcolour[2],
|
||||
parsestate.reflectcolour[0],parsestate.reflectcolour[1],parsestate.reflectcolour[2],
|
||||
parsestate.reflectmin, parsestate.reflectmax-parsestate.reflectmin,
|
||||
parsestate.wateralpha
|
||||
);
|
||||
//clear out blending and force regular depth.
|
||||
s->passes[0].shaderbits &= ~(SBITS_BLEND_BITS|SBITS_MISC_NODEPTHTEST|SBITS_MISC_DEPTHEQUALONLY|SBITS_MISC_DEPTHCLOSERONLY);
|
||||
s->passes[0].shaderbits |= SBITS_MISC_DEPTHWRITE;
|
||||
|
||||
reflectrefract = true;
|
||||
}
|
||||
else if (modellighting)
|
||||
{
|
||||
pass = modellighting;
|
||||
prog = "defaultskin";
|
||||
|
@ -3983,8 +4052,25 @@ void Shader_Programify (shader_t *s)
|
|||
if (s->prog)
|
||||
{
|
||||
s->numpasses = 0;
|
||||
s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE;
|
||||
s->flags |= SHADER_HASDIFFUSE;
|
||||
if (reflectrefract)
|
||||
{
|
||||
if (s->passes[0].numtcmods > 0 && s->passes[0].tcmods[0].type == SHADER_TCMOD_SCALE)
|
||||
{ //crappy workaround for DP bug.
|
||||
s->passes[0].tcmods[0].args[0] *= 4;
|
||||
s->passes[0].tcmods[0].args[1] *= 4;
|
||||
}
|
||||
s->passes[s->numpasses++].texgen = T_GEN_REFRACTION;
|
||||
s->passes[s->numpasses++].texgen = T_GEN_REFLECTION;
|
||||
// s->passes[s->numpasses++].texgen = T_GEN_RIPPLEMAP;
|
||||
// s->passes[s->numpasses++].texgen = T_GEN_REFRACTIONDEPTH;
|
||||
s->flags |= SHADER_HASREFRACT;
|
||||
s->flags |= SHADER_HASREFLECT;
|
||||
}
|
||||
else
|
||||
{
|
||||
s->passes[s->numpasses++].texgen = T_GEN_DIFFUSE;
|
||||
s->flags |= SHADER_HASDIFFUSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4354,7 +4440,7 @@ done:;
|
|||
"}\n");
|
||||
}
|
||||
|
||||
if (!s->prog && sh_config.progs_supported && r_forceprogramify.ival)
|
||||
if (!s->prog && sh_config.progs_supported && (r_forceprogramify.ival || parsestate.forceprogramify))
|
||||
{
|
||||
Shader_Programify(s);
|
||||
if (r_forceprogramify.ival >= 2)
|
||||
|
@ -4693,9 +4779,9 @@ void QDECL R_BuildDefaultTexnums(texnums_t *src, shader_t *shader)
|
|||
if ((shader->flags & SHADER_HASFULLBRIGHT) && r_fb_bmodels.value && gl_load24bit.value)
|
||||
{
|
||||
if (!TEXVALID(tex->fullbright) && *mapname)
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma", mapname), NULL, imageflags);
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma:%s_glow", mapname, mapname), NULL, imageflags);
|
||||
if (!TEXVALID(tex->fullbright))
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma", imagename), subpath, imageflags);
|
||||
tex->fullbright = R_LoadHiResTexture(va("%s_luma:%s_glow", imagename, imagename), subpath, imageflags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4874,7 +4960,7 @@ void QDECL R_BuildLegacyTexnums(shader_t *shader, const char *fallbackname, cons
|
|||
if (mipdata[0][s] >= 256-vid.fullbright)
|
||||
break;
|
||||
}
|
||||
tex->fullbright = Image_GetTexture(va("%s_luma", imagename), subpath, imageflags, (s>=0)?mipdata[0]:NULL, palette, width, height, TF_TRANS8_FULLBRIGHT);
|
||||
tex->fullbright = Image_GetTexture(va("%s_luma:%s_glow", imagename,imagename), subpath, imageflags, (s>=0)?mipdata[0]:NULL, palette, width, height, TF_TRANS8_FULLBRIGHT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1667,11 +1667,8 @@ static qboolean Sh_ScissorForSphere(vec3_t center, float radius, vrect_t *rect)
|
|||
/*return false to say that its fully offscreen*/
|
||||
|
||||
float v[4], tempv[4];
|
||||
extern cvar_t temp1;
|
||||
int i;
|
||||
vrect_t r;
|
||||
|
||||
radius *= temp1.value;
|
||||
|
||||
rect->x = 0;
|
||||
rect->y = 0;
|
||||
|
|
|
@ -1933,11 +1933,11 @@ qboolean X11VID_Init (rendererstate_t *info, unsigned char *palette, int psl)
|
|||
#ifdef VKQUAKE
|
||||
case PSL_VULKAN:
|
||||
#ifdef VK_USE_PLATFORM_XLIB_KHR
|
||||
if (VK_Init(info, VK_KHR_XLIB_SURFACE_EXTENSION_NAME, XVK_SetupSurface_XLib))
|
||||
if (VK_Init(info, VK_KHR_XLIB_SURFACE_EXTENSION_NAME, XVK_SetupSurface_XLib, NULL))
|
||||
break;
|
||||
#endif
|
||||
#ifdef VK_USE_PLATFORM_XCB_KHR
|
||||
if (x11xcb_initlib() && VK_Init(info, VK_KHR_XCB_SURFACE_EXTENSION_NAME, XVK_SetupSurface_XCB))
|
||||
if (x11xcb_initlib() && VK_Init(info, VK_KHR_XCB_SURFACE_EXTENSION_NAME, XVK_SetupSurface_XCB, NULL))
|
||||
break;
|
||||
#endif
|
||||
Con_Printf("Failed to create a vulkan context.\n");
|
||||
|
|
|
@ -983,12 +983,15 @@ static qboolean VID_SetFullDIBMode (rendererstate_t *info)
|
|||
gdevmode.dmFields |= DM_BITSPERPEL;
|
||||
if (info->rate)
|
||||
gdevmode.dmFields |= DM_DISPLAYFREQUENCY;
|
||||
gdevmode.dmBitsPerPel = info->bpp;
|
||||
if (info->bpp && (gdevmode.dmBitsPerPel < 15))
|
||||
{
|
||||
if (info->bpp && (info->bpp < 15))
|
||||
{ //low values get you a warning. otherwise only 16 and 32bit are allowed.
|
||||
Con_Printf("Forcing at least 15bpp\n");
|
||||
gdevmode.dmBitsPerPel = 16;
|
||||
}
|
||||
else if (info->bpp == 16)
|
||||
gdevmode.dmBitsPerPel = 16;
|
||||
else
|
||||
gdevmode.dmBitsPerPel = 32;
|
||||
gdevmode.dmDisplayFrequency = info->rate;
|
||||
gdevmode.dmPelsWidth = info->width;
|
||||
gdevmode.dmPelsHeight = info->height;
|
||||
|
@ -1318,14 +1321,23 @@ int GLVID_SetMode (rendererstate_t *info, unsigned char *palette)
|
|||
// fix the leftover Alt from any Alt-Tab or the like that switched us away
|
||||
ClearAllStates ();
|
||||
|
||||
gammaworks = FALSE;
|
||||
if (vid_desktopgamma.value)
|
||||
{
|
||||
HDC hDC = GetDC(GetDesktopWindow());
|
||||
gammaworks = qGetDeviceGammaRamp(hDC, originalgammaramps);
|
||||
if (qGetDeviceGammaRamp(hDC, originalgammaramps))
|
||||
gammaworks = qSetDeviceGammaRamp(hDC, originalgammaramps);
|
||||
ReleaseDC(GetDesktopWindow(), hDC);
|
||||
}
|
||||
else
|
||||
gammaworks = qGetDeviceGammaRamp(maindc, originalgammaramps);
|
||||
{
|
||||
if (qGetDeviceGammaRamp(maindc, originalgammaramps))
|
||||
gammaworks = qSetDeviceGammaRamp(maindc, originalgammaramps);
|
||||
}
|
||||
if (!gammaworks)
|
||||
Con_Printf("Hardware gamma is not supported\n");
|
||||
else
|
||||
Con_DPrintf("Hardware gamma appears to work\n");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1710,10 +1722,6 @@ void GLVID_Recenter_f(void)
|
|||
//int nx = 0;
|
||||
//int ny = 0;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
|
||||
if (Cmd_Argc() > 1)
|
||||
sys_parentleft = atoi(Cmd_Argv(1));
|
||||
if (Cmd_Argc() > 2)
|
||||
|
|
|
@ -352,28 +352,74 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
|||
#endif
|
||||
#ifdef GLQUAKE
|
||||
{QR_OPENGL, 110, "altwater",
|
||||
"!!cvarf r_glsl_turbscale\n"
|
||||
//modifier: REFLECT (s_t2 is a reflection instead of diffusemap)
|
||||
//modifier: STRENGTH (0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: FRESNEL (5=water)
|
||||
//modifier: TXSCALE (0.2 - wave strength)
|
||||
//modifier: RIPPLEMAP (s_t3 contains a ripplemap
|
||||
//modifier: TINT (some colour value)
|
||||
"!!cvardf r_glsl_turbscale_reflect=1 //simpler scaler\n"
|
||||
"!!cvardf r_glsl_turbscale_refract=1 //simpler scaler\n"
|
||||
"!!samps 4 diffuse\n"
|
||||
|
||||
"#include \"sys/defs.h\"\n"
|
||||
|
||||
//modifier: REFLECT (s_t2 is a reflection instead of diffusemap)
|
||||
//modifier: STRENGTH_REFL (distortion strength - 0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: STRENGTH_REFL (distortion strength - 0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: FRESNEL_EXP (5=water)
|
||||
//modifier: TXSCALE (wave size - 0.2)
|
||||
//modifier: RIPPLEMAP (s_t3 contains a ripplemap
|
||||
//modifier: TINT_REFR (some colour value)
|
||||
//modifier: TINT_REFL (some colour value)
|
||||
//modifier: ALPHA (mix in the normal water texture over the top)
|
||||
//modifier: USEMODS (use single-texture scrolling via tcmods - note, also forces the engine to actually use tcmod etc)
|
||||
|
||||
//a few notes on DP compat:
|
||||
//'dpwater' makes numerous assumptions about DP internals
|
||||
//by default there is a single pass that uses the pass's normal tcmods
|
||||
//the fresnel has a user-supplied min+max rather than an exponent
|
||||
//both parts are tinted individually
|
||||
//if alpha is enabled, the regular water texture is blended over the top, again using the same crappy tcmods...
|
||||
|
||||
//legacy crap
|
||||
"#ifndef FRESNEL\n"
|
||||
"#define FRESNEL 5.0\n"
|
||||
"#endif\n"
|
||||
"#ifndef TINT\n"
|
||||
"#define TINT 0.7,0.8,0.7\n"
|
||||
"#endif\n"
|
||||
"#ifndef STRENGTH\n"
|
||||
"#define STRENGTH 0.1\n"
|
||||
"#endif\n"
|
||||
"#ifndef TXSCALE\n"
|
||||
"#define TXSCALE 0.2\n"
|
||||
"#endif\n"
|
||||
"#ifndef TINT\n"
|
||||
"#define TINT vec3(0.7, 0.8, 0.7)\n"
|
||||
|
||||
//current values (referring to legacy defaults where needed)
|
||||
"#ifndef FRESNEL_EXP\n"
|
||||
"#define FRESNEL_EXP 5.0\n"
|
||||
"#endif\n"
|
||||
"#ifndef FRESNEL_MIN\n"
|
||||
"#define FRESNEL_MIN 0.0\n"
|
||||
"#endif\n"
|
||||
"#ifndef FRESNEL_RANGE\n"
|
||||
"#define FRESNEL_RANGE 1.0\n"
|
||||
"#endif\n"
|
||||
"#ifndef STRENGTH_REFL\n"
|
||||
"#define STRENGTH_REFL STRENGTH\n"
|
||||
"#endif\n"
|
||||
"#ifndef STRENGTH_REFR\n"
|
||||
"#define STRENGTH_REFR STRENGTH\n"
|
||||
"#endif\n"
|
||||
"#ifndef TXSCALE1\n"
|
||||
"#define TXSCALE1 TXSCALE\n"
|
||||
"#endif\n"
|
||||
"#ifndef TXSCALE2\n"
|
||||
"#define TXSCALE2 TXSCALE\n"
|
||||
"#endif\n"
|
||||
"#ifndef TINT_REFR\n"
|
||||
"#define TINT_REFR TINT\n"
|
||||
"#endif\n"
|
||||
"#ifndef TINT_REFL\n"
|
||||
"#define TINT_REFL 1.0,1.0,1.0\n"
|
||||
"#endif\n"
|
||||
"#ifndef FOGTINT\n"
|
||||
"#define FOGTINT vec3(0.2, 0.3, 0.2)\n"
|
||||
"#define FOGTINT 0.2,0.3,0.2\n"
|
||||
"#endif\n"
|
||||
|
||||
"varying vec2 tc;\n"
|
||||
|
@ -381,9 +427,6 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
|||
"varying vec3 norm;\n"
|
||||
"varying vec3 eye;\n"
|
||||
"#ifdef VERTEX_SHADER\n"
|
||||
"attribute vec2 v_texcoord;\n"
|
||||
"attribute vec3 v_normal;\n"
|
||||
"uniform vec3 e_eyepos;\n"
|
||||
"void main (void)\n"
|
||||
"{\n"
|
||||
"tc = v_texcoord.st;\n"
|
||||
|
@ -394,45 +437,48 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
|||
"}\n"
|
||||
"#endif\n"
|
||||
"#ifdef FRAGMENT_SHADER\n"
|
||||
"#ifdef ALPHA\n"
|
||||
"#include \"sys/fog.h\"\n"
|
||||
"#endif\n"
|
||||
|
||||
|
||||
"#define s_refract s_t0\n"
|
||||
"#define s_reflect s_t1\n"
|
||||
"#define s_ripplemap s_t2\n"
|
||||
"#define s_refractdepth s_t3\n"
|
||||
|
||||
"uniform float cvar_r_glsl_turbscale;\n"
|
||||
"uniform sampler2D s_normalmap;\n"
|
||||
"uniform sampler2D s_diffuse;\n"
|
||||
"uniform sampler2D s_refract; //refract\n"
|
||||
"uniform sampler2D s_reflect; //reflection\n"
|
||||
"uniform sampler2D s_refractdepth; //refraction depth\n"
|
||||
"uniform sampler2D s_ripplemap; //ripplemap\n"
|
||||
|
||||
"uniform float e_time;\n"
|
||||
"void main (void)\n"
|
||||
"{\n"
|
||||
"vec2 stc, ntc;\n"
|
||||
"vec2 stc; //screen tex coords\n"
|
||||
"vec2 ntc; //normalmap/diffuse tex coords\n"
|
||||
"vec3 n, refr, refl;\n"
|
||||
"float fres;\n"
|
||||
"float depth;\n"
|
||||
"stc = (1.0 + (tf.xy / tf.w)) * 0.5;\n"
|
||||
//hack the texture coords slightly so that there are no obvious gaps
|
||||
//hack the texture coords slightly so that there are less obvious gaps
|
||||
"stc.t -= 1.5*norm.z/1080.0;\n"
|
||||
|
||||
"#if 0//def USEMODS\n"
|
||||
"ntc = tc;\n"
|
||||
"n = texture2D(s_normalmap, ntc).xyz - 0.5;\n"
|
||||
"#else\n"
|
||||
//apply q1-style warp, just for kicks
|
||||
"ntc.s = tc.s + sin(tc.t+e_time)*0.125;\n"
|
||||
"ntc.t = tc.t + sin(tc.s+e_time)*0.125;\n"
|
||||
|
||||
//generate the two wave patterns from the normalmap
|
||||
"n = (texture2D(s_normalmap, TXSCALE*tc + vec2(e_time*0.1, 0.0)).xyz);\n"
|
||||
"n += (texture2D(s_normalmap, TXSCALE*tc - vec2(0, e_time*0.097)).xyz);\n"
|
||||
"n = (texture2D(s_normalmap, vec2(TXSCALE1)*tc + vec2(e_time*0.1, 0.0)).xyz);\n"
|
||||
"n += (texture2D(s_normalmap, vec2(TXSCALE2)*tc - vec2(0, e_time*0.097)).xyz);\n"
|
||||
"n -= 1.0 - 4.0/256.0;\n"
|
||||
"#endif\n"
|
||||
|
||||
"#ifdef RIPPLEMAP\n"
|
||||
"n += texture2D(s_ripplemap, stc).rgb*3.0;\n"
|
||||
"#endif\n"
|
||||
"n = normalize(n);\n"
|
||||
|
||||
//the fresnel term decides how transparent the water should be
|
||||
"fres = pow(1.0-abs(dot(normalize(n), normalize(eye))), float(FRESNEL));\n"
|
||||
"fres = pow(1.0-abs(dot(n, normalize(eye))), float(FRESNEL_EXP)) * float(FRESNEL_RANGE) + float(FRESNEL_MIN);\n"
|
||||
|
||||
"#ifdef DEPTH\n"
|
||||
"float far = #include \"cvar/gl_maxdist\";\n"
|
||||
|
@ -465,22 +511,30 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
|
|||
|
||||
|
||||
//refraction image (and water fog, if possible)
|
||||
"refr = texture2D(s_refract, stc + n.st*STRENGTH*cvar_r_glsl_turbscale).rgb * TINT;\n"
|
||||
"refr = texture2D(s_refract, stc + n.st*float(STRENGTH_REFR)*float(r_glsl_turbscale_refract)).rgb * vec3(TINT_REFR);\n"
|
||||
"#ifdef DEPTH\n"
|
||||
"refr = mix(refr, FOGTINT, min(depth/4096.0, 1.0));\n"
|
||||
"refr = mix(refr, vec3(FOGTINT), min(depth/4096.0, 1.0));\n"
|
||||
"#endif\n"
|
||||
|
||||
//reflection/diffuse
|
||||
"#ifdef REFLECT\n"
|
||||
"refl = texture2D(s_reflect, stc - n.st*STRENGTH*cvar_r_glsl_turbscale).rgb;\n"
|
||||
"refl = texture2D(s_reflect, stc - n.st*float(STRENGTH_REFL)*float(r_glsl_turbscale_reflect)).rgb * vec3(TINT_REFL);\n"
|
||||
"#else\n"
|
||||
"refl = texture2D(s_diffuse, ntc).xyz;\n"
|
||||
"refl = texture2D(s_diffuse, ntc).xyz * vec3(TINT_REFL);\n"
|
||||
"#endif\n"
|
||||
//FIXME: add specular
|
||||
|
||||
//interplate by fresnel
|
||||
"refr = mix(refr, refl, fres);\n"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
"#ifdef ALPHA\n"
|
||||
"vec4 ts = texture2D(s_diffuse, ntc);\n"
|
||||
"vec4 surf = fog4blend(vec4(ts.rgb, float(ALPHA)*ts.a));\n"
|
||||
"refr = mix(refr, surf.rgb, surf.a);\n"
|
||||
"#endif\n"
|
||||
|
||||
//done
|
||||
"gl_FragColor = vec4(refr, 1.0);\n"
|
||||
"}\n"
|
||||
|
|
|
@ -859,7 +859,7 @@ unsigned int WINAPI BlockingClient(FTPclient_t *cl)
|
|||
unsigned long _false = false;
|
||||
if (ioctlsocket (cl->controlsock, FIONBIO, &_false) == -1)
|
||||
{
|
||||
IWebPrintf ("FTP_ServerRun: blocking error: %s\n", strerror(qerrno));
|
||||
IWebPrintf ("FTP_ServerRun: blocking error: %s\n", strerror(neterrno()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1425,6 +1425,19 @@ qboolean DL_CreateThread(struct dl_download *dl, vfsfile_t *file, void (*NotifyF
|
|||
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
qboolean DL_CreateThread(struct dl_download *dl, vfsfile_t *file, void (*NotifyFunction)(struct dl_download *dl))
|
||||
{
|
||||
if (!dl)
|
||||
return false;
|
||||
|
||||
if (file)
|
||||
dl->file = file;
|
||||
if (NotifyFunction)
|
||||
dl->notifycomplete = NotifyFunction;
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*create a standalone download context*/
|
||||
|
|
|
@ -523,19 +523,26 @@ cont:
|
|||
cl->file = IWebGenerateFile(resource+1, content, contentlen);
|
||||
else
|
||||
{
|
||||
char filename[MAX_OSPATH], *q;
|
||||
cl->file = NULL;
|
||||
if (SV_AllowDownload(resource+1))
|
||||
Q_strncpyz(filename, resource+1, sizeof(filename));
|
||||
q = strchr(filename, '?');
|
||||
if (q) *q = 0;
|
||||
|
||||
if (SV_AllowDownload(filename))
|
||||
{
|
||||
char nbuf[MAX_OSPATH];
|
||||
if (cl->acceptgzip && strlen(resource+1) < sizeof(nbuf)-4)
|
||||
|
||||
if (cl->acceptgzip && strlen(filename) < sizeof(nbuf)-4)
|
||||
{
|
||||
sprintf(nbuf, "%s.gz", resource+1);
|
||||
Q_strncpyz(nbuf, filename, sizeof(nbuf));
|
||||
Q_strncatz(nbuf, ".gz", sizeof(nbuf));
|
||||
cl->file = FS_OpenVFS(nbuf, "rb", FS_GAME);
|
||||
}
|
||||
if (cl->file)
|
||||
gzipped = true;
|
||||
else
|
||||
cl->file = FS_OpenVFS(resource+1, "rb", FS_GAME);
|
||||
cl->file = FS_OpenVFS(filename, "rb", FS_GAME);
|
||||
}
|
||||
|
||||
if (!cl->file)
|
||||
|
@ -695,7 +702,12 @@ void VARGS Q_snprintfz (char *dest, size_t size, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
#ifdef _WIN32
|
||||
#undef _vsnprintf
|
||||
_vsnprintf (dest, size-1, fmt, args);
|
||||
#else
|
||||
vsnprintf (dest, size-1, fmt, args);
|
||||
#endif
|
||||
va_end (args);
|
||||
//make sure its terminated.
|
||||
dest[size-1] = 0;
|
||||
|
|
|
@ -8,6 +8,12 @@
|
|||
|
||||
qboolean SV_AllowDownload (const char *name)
|
||||
{
|
||||
if (strstr(name, ".."))
|
||||
return false;
|
||||
if (strchr(name, ':'))
|
||||
return false;
|
||||
if (*name == '/' || *name == '\\')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
char com_token[sizeof(com_token)];
|
||||
|
@ -120,12 +126,18 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef _MSC_VER
|
||||
#define ULL(x) x##ui64
|
||||
#else
|
||||
#define ULL(x) x##ull
|
||||
#endif
|
||||
|
||||
static time_t Sys_FileTimeToTime(FILETIME ft)
|
||||
{
|
||||
ULARGE_INTEGER ull;
|
||||
ull.LowPart = ft.dwLowDateTime;
|
||||
ull.HighPart = ft.dwHighDateTime;
|
||||
return ull.QuadPart / 10000000ULL - 11644473600ULL;
|
||||
return ull.QuadPart / ULL(10000000) - ULL(11644473600);
|
||||
}
|
||||
void COM_EnumerateFiles (const char *match, int (*func)(const char *, qofs_t, time_t mtime, void *, searchpathfuncs_t *f), void *parm)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,7 @@ static void VARGS QC_snprintfz (char *dest, size_t size, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
vsnprintf (dest, size-1, fmt, args);
|
||||
_vsnprintf (dest, size-1, fmt, args);
|
||||
va_end (args);
|
||||
//make sure its terminated.
|
||||
dest[size-1] = 0;
|
||||
|
|
|
@ -1272,13 +1272,13 @@ pbool PDECL PR_DumpProfiles (pubprogfuncs_t *ppf, pbool resetprofiles)
|
|||
progfuncs_t *progfuncs = (progfuncs_t*)ppf;
|
||||
struct progstate_s *ps;
|
||||
unsigned int i, f, j, s;
|
||||
unsigned long long cpufrequency;
|
||||
prclocks_t cpufrequency;
|
||||
struct
|
||||
{
|
||||
char *fname;
|
||||
int profile;
|
||||
unsigned long long profiletime;
|
||||
unsigned long long totaltime;
|
||||
prclocks_t profiletime;
|
||||
prclocks_t totaltime;
|
||||
} *sorted, t;
|
||||
if (!prinst.profiling)
|
||||
{
|
||||
|
@ -1329,7 +1329,7 @@ pbool PDECL PR_DumpProfiles (pubprogfuncs_t *ppf, pbool resetprofiles)
|
|||
//print it out
|
||||
printf("%8s %9s %10s: %s\n", "ops", "self-time", "total-time", "function");
|
||||
for (f = 0; f < s; f++)
|
||||
printf("%8u %9f %10f: %s\n", sorted[f].profile, (float)(((double)sorted[f].profiletime) / cpufrequency), (float)(((double)sorted[f].totaltime) / cpufrequency), sorted[f].fname);
|
||||
printf("%8u %9f %10f: %s\n", sorted[f].profile, ull2dbl(sorted[f].profiletime) / ull2dbl(cpufrequency), ull2dbl(sorted[f].totaltime) / ull2dbl(cpufrequency), sorted[f].fname);
|
||||
free(sorted);
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -23,6 +23,14 @@ void BZ_Free(void *data);
|
|||
typedef int dstring_t;
|
||||
#define QCC_string_t dstring_t
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1300
|
||||
#define prclocks_t unsigned __int64
|
||||
#define ull2dbl(x) ((double)(__int64)x)
|
||||
#else
|
||||
#define prclocks_t unsigned long long
|
||||
#define ull2dbl(x) ((double)x)
|
||||
#endif
|
||||
|
||||
//typedef enum {ev_void, ev_string, ev_float, ev_vector, ev_entity, ev_field, ev_function, ev_pointer, ev_integer, ev_struct, ev_union} etype_t;
|
||||
// 0 1 2 3 4 5 6 7 8 9 10
|
||||
|
||||
|
@ -531,8 +539,8 @@ typedef struct
|
|||
int locals; // total ints of parms + locals
|
||||
|
||||
int profile; //number of qc instructions executed.
|
||||
unsigned long long profiletime; //total time inside (cpu cycles)
|
||||
unsigned long long profilechildtime; //time inside children (excluding builtins, cpu cycles)
|
||||
prclocks_t profiletime; //total time inside (cpu cycles)
|
||||
prclocks_t profilechildtime; //time inside children (excluding builtins, cpu cycles)
|
||||
|
||||
string_t s_name;
|
||||
string_t s_file; // source file defined in
|
||||
|
|
|
@ -513,7 +513,7 @@ static void VARGS QC_snprintfz (char *dest, size_t size, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
vsnprintf (dest, size-1, fmt, args);
|
||||
_vsnprintf (dest, size-1, fmt, args);
|
||||
va_end (args);
|
||||
//make sure its terminated.
|
||||
dest[size-1] = 0;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
#if __STDC_VERSION__ >= 199901L
|
||||
#define fte_restrict restrict
|
||||
#elif defined(_MSC_VER)
|
||||
#elif defined(_MSC_VER) && _MSC_VER >= 1400
|
||||
#define fte_restrict __restrict
|
||||
#else
|
||||
#define fte_restrict
|
||||
|
@ -36,13 +36,13 @@
|
|||
#if !defined(Sys_GetClock) && defined(_WIN32)
|
||||
//windows has some specific functions for this (traditionally wrapping rdtsc)
|
||||
//note: on some systems, you may need to force cpu affinity to a single core via task manager
|
||||
static unsigned long long Sys_GetClock(void)
|
||||
static prclocks_t Sys_GetClock(void)
|
||||
{
|
||||
LARGE_INTEGER li;
|
||||
QueryPerformanceCounter(&li);
|
||||
return li.QuadPart;
|
||||
}
|
||||
unsigned long long Sys_GetClockRate(void)
|
||||
prclocks_t Sys_GetClockRate(void)
|
||||
{
|
||||
LARGE_INTEGER li;
|
||||
QueryPerformanceFrequency(&li);
|
||||
|
@ -57,14 +57,14 @@
|
|||
#if defined(_POSIX_TIMERS) && _POSIX_TIMERS >= 0
|
||||
#include <time.h>
|
||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
||||
static unsigned long long Sys_GetClock(void)
|
||||
static prclocks_t Sys_GetClock(void)
|
||||
{
|
||||
struct timespec c;
|
||||
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &c);
|
||||
return (c.tv_sec*1000000000ull) + c.tv_nsec;
|
||||
}
|
||||
#define Sys_GetClock Sys_GetClock
|
||||
unsigned long long Sys_GetClockRate(void)
|
||||
prclocks_t Sys_GetClockRate(void)
|
||||
{
|
||||
return 1000000000ull;
|
||||
}
|
||||
|
@ -75,13 +75,13 @@
|
|||
#if !defined(Sys_GetClock) && defined(__unix__)
|
||||
#include <time.h>
|
||||
#define Sys_GetClock() clock()
|
||||
unsigned long long Sys_GetClockRate(void) { return CLOCKS_PER_SEC; }
|
||||
prclocks_t Sys_GetClockRate(void) { return CLOCKS_PER_SEC; }
|
||||
#endif
|
||||
|
||||
#ifndef Sys_GetClock
|
||||
//other systems have no choice but to omit this feature in some way. this is just for profiling, so we can get away with stubs.
|
||||
#define Sys_GetClock() 0
|
||||
unsigned long long Sys_GetClockRate(void) { return 1; }
|
||||
prclocks_t Sys_GetClockRate(void) { return 1; }
|
||||
#endif
|
||||
|
||||
//=============================================================================
|
||||
|
@ -157,7 +157,7 @@ static void VARGS QC_snprintfz (char *dest, size_t size, const char *fmt, ...)
|
|||
{
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
vsnprintf (dest, size-1, fmt, args);
|
||||
_vsnprintf (dest, size-1, fmt, args);
|
||||
va_end (args);
|
||||
//make sure its terminated.
|
||||
dest[size-1] = 0;
|
||||
|
@ -548,7 +548,7 @@ int ASMCALL PR_LeaveFunction (progfuncs_t *progfuncs)
|
|||
|
||||
if (prinst.profiling)
|
||||
{
|
||||
unsigned long long cycles;
|
||||
prclocks_t cycles;
|
||||
cycles = Sys_GetClock() - pr_stack[pr_depth].timestamp;
|
||||
if (cycles > prinst.profilingalert)
|
||||
printf("QC call to %s took over a second\n", PR_StringToNative(&progfuncs->funcs,pr_xfunction->s_name));
|
||||
|
|
|
@ -65,7 +65,7 @@ typedef struct
|
|||
unsigned char progsnum;
|
||||
int s;
|
||||
int pushed;
|
||||
unsigned long long timestamp;
|
||||
prclocks_t timestamp;
|
||||
} prstack_t;
|
||||
|
||||
typedef struct
|
||||
|
@ -134,7 +134,7 @@ typedef struct prinst_s
|
|||
int exitdepth;
|
||||
|
||||
pbool profiling;
|
||||
unsigned long long profilingalert;
|
||||
prclocks_t profilingalert;
|
||||
mfunction_t *pr_xfunction;
|
||||
#define pr_xfunction prinst.pr_xfunction
|
||||
int pr_xstatement;
|
||||
|
@ -449,7 +449,8 @@ fdef_t *PDECL ED_FieldInfo (pubprogfuncs_t *progfuncs, unsigned int *count);
|
|||
char *PDECL PR_UglyValueString (pubprogfuncs_t *progfuncs, etype_t type, eval_t *val);
|
||||
pbool PDECL ED_ParseEval (pubprogfuncs_t *progfuncs, eval_t *eval, int type, const char *s);
|
||||
|
||||
unsigned long long Sys_GetClockRate(void);
|
||||
|
||||
prclocks_t Sys_GetClockRate(void);
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -7451,10 +7451,10 @@ QCC_sref_t QCC_EvaluateCast(QCC_sref_t src, QCC_type_t *cast, pbool implicit)
|
|||
src.cast = cast;
|
||||
}
|
||||
/*cast from int->float will convert*/
|
||||
else if (totype == ev_float && src.cast->type == ev_integer)
|
||||
else if (totype == ev_float && (src.cast->type == ev_integer || (src.cast->type == ev_entity && !implicit)))
|
||||
src = QCC_PR_Statement (&pr_opcodes[OP_CONV_ITOF], src, nullsref, NULL);
|
||||
/*cast from float->int will convert*/
|
||||
else if (totype == ev_integer && src.cast->type == ev_float)
|
||||
else if ((totype == ev_integer || (totype == ev_entity && !implicit)) && src.cast->type == ev_float)
|
||||
src = QCC_PR_Statement (&pr_opcodes[OP_CONV_FTOI], src, nullsref, NULL);
|
||||
else if (totype == ev_entity && src.cast->type == ev_entity)
|
||||
{
|
||||
|
|
|
@ -1842,10 +1842,18 @@ int QCC_PR_LexInteger (void)
|
|||
return atoi (pr_token);
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define longlong __int64
|
||||
#define LL(x) x##i64
|
||||
#else
|
||||
#define longlong long long
|
||||
#define LL(x) x##ll
|
||||
#endif
|
||||
|
||||
void QCC_PR_LexNumber (void)
|
||||
{
|
||||
int tokenlen = 0;
|
||||
long long num=0;
|
||||
longlong num=0;
|
||||
int base=0;
|
||||
int c;
|
||||
int sign=1;
|
||||
|
@ -1926,7 +1934,7 @@ void QCC_PR_LexNumber (void)
|
|||
pr_immediate._float = num*sign;
|
||||
|
||||
num*=sign;
|
||||
if ((long long)pr_immediate._float != (long long)num)
|
||||
if ((longlong)pr_immediate._float != (longlong)num)
|
||||
QCC_PR_ParseWarning(WARN_OVERFLOW, "numerical overflow");
|
||||
return;
|
||||
}
|
||||
|
@ -1939,9 +1947,9 @@ void QCC_PR_LexNumber (void)
|
|||
pr_immediate._int = num*sign;
|
||||
|
||||
num*=sign;
|
||||
if ((long long)pr_immediate._int != (long long)num)
|
||||
if ((longlong)pr_immediate._int != (longlong)num)
|
||||
{
|
||||
if (((long long)pr_immediate._int & 0xffffffff80000000ll) != 0xffffffff80000000ll)
|
||||
if (((longlong)pr_immediate._int & LL(0xffffffff80000000)) != LL(0xffffffff80000000))
|
||||
QCC_PR_ParseWarning(WARN_OVERFLOW, "numerical overflow");
|
||||
}
|
||||
return;
|
||||
|
@ -1973,9 +1981,9 @@ qccxhex:
|
|||
pr_immediate._int = num*sign;
|
||||
|
||||
num*=sign;
|
||||
if ((long long)pr_immediate._int != (long long)num)
|
||||
if ((longlong)pr_immediate._int != (longlong)num)
|
||||
{
|
||||
if (((long long)pr_immediate._int & 0xffffffff80000000ll) != 0xffffffff80000000ll)
|
||||
if (((longlong)pr_immediate._int & LL(0xffffffff80000000)) != LL(0xffffffff80000000))
|
||||
QCC_PR_ParseWarning(WARN_OVERFLOW, "numerical overflow");
|
||||
}
|
||||
}
|
||||
|
@ -1988,7 +1996,7 @@ qccxhex:
|
|||
pr_immediate._float = (float)(num*sign);
|
||||
|
||||
num*=sign;
|
||||
if ((long long)pr_immediate._float != (long long)num && base == 16)
|
||||
if ((longlong)pr_immediate._float != (longlong)num && base == 16)
|
||||
QCC_PR_ParseWarning(WARN_OVERFLOW, "numerical overflow %lld will be rounded to %f", num, pr_immediate._float);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6101,8 +6101,6 @@ void QCBUILTIN PF_sqlversion (pubprogfuncs_t *prinst, struct globalvars_s *pr_gl
|
|||
|
||||
void PR_SQLCycle(void)
|
||||
{
|
||||
if (!SQL_Available())
|
||||
return;
|
||||
SQL_ServerCycle();
|
||||
}
|
||||
#endif
|
||||
|
@ -8313,6 +8311,36 @@ static void QCBUILTIN PF_te_explosion2(pubprogfuncs_t *prinst, struct globalvars
|
|||
SV_MulticastProtExt(org, MULTICAST_PHS, pr_global_struct->dimension_send, 0, 0);
|
||||
}
|
||||
|
||||
//DP_TE_FLAMEJET
|
||||
static void QCBUILTIN PF_te_flamejet(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
float *org = G_VECTOR(OFS_PARM0);
|
||||
float *vel = G_VECTOR(OFS_PARM1);
|
||||
float howmany = bound(0,G_FLOAT(OFS_PARM2),255);
|
||||
|
||||
MSG_WriteByte (&sv.multicast, svc_temp_entity);
|
||||
MSG_WriteByte (&sv.multicast, TEDP_FLAMEJET);
|
||||
MSG_WriteCoord (&sv.multicast, org[0]);
|
||||
MSG_WriteCoord (&sv.multicast, org[1]);
|
||||
MSG_WriteCoord (&sv.multicast, org[2]);
|
||||
MSG_WriteCoord (&sv.multicast, vel[0]);
|
||||
MSG_WriteCoord (&sv.multicast, vel[1]);
|
||||
MSG_WriteCoord (&sv.multicast, vel[2]);
|
||||
MSG_WriteByte (&sv.multicast, howmany);
|
||||
#ifdef NQPROT
|
||||
MSG_WriteByte (&sv.nqmulticast, svc_temp_entity);
|
||||
MSG_WriteByte (&sv.nqmulticast, TEDP_FLAMEJET);
|
||||
MSG_WriteCoord (&sv.nqmulticast, org[0]);
|
||||
MSG_WriteCoord (&sv.nqmulticast, org[1]);
|
||||
MSG_WriteCoord (&sv.nqmulticast, org[2]);
|
||||
MSG_WriteCoord (&sv.nqmulticast, vel[0]);
|
||||
MSG_WriteCoord (&sv.nqmulticast, vel[1]);
|
||||
MSG_WriteCoord (&sv.nqmulticast, vel[2]);
|
||||
MSG_WriteByte (&sv.nqmulticast, howmany);
|
||||
#endif
|
||||
SV_MulticastProtExt(org, MULTICAST_PHS, pr_global_struct->dimension_send, 0, 0);
|
||||
}
|
||||
|
||||
//DP_TE_STANDARDEFFECTBUILTINS
|
||||
//void(entity own, vector start, vector end) te_lightning1 = #428;
|
||||
static void QCBUILTIN PF_te_lightning1(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
|
@ -9843,6 +9871,8 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
|
|||
{"fputs", PF_fputs, 0, 0, 0, 113, D("void(filestream fhandle, string s, optional string s2, optional string s3, optional string s4, optional string s5, optional string s6, optional string s7)", "Writes the given string(s) into the file. For compatibility with fgets, you should ensure that the string is terminated with a \\n - this will not otherwise be done for you. It is up to the engine whether dos or unix line endings are actually written.")}, // (FRIK_FILE)
|
||||
{"fread", PF_fread, 0, 0, 0, 0, D("int(filestream fhandle, void *ptr, int size)", "Reads binary data out of the file. Returns truncated lengths if the read exceeds the length of the file.")},
|
||||
{"fwrite", PF_fwrite, 0, 0, 0, 0, D("int(filestream fhandle, void *ptr, int size)", "Writes binary data out of the file.")},
|
||||
{"fseek", PF_fseek, 0, 0, 0, 0, D("#define ftell fseek //c compat\nint(filestream fhandle, optional int newoffset)", "Changes the current position of the file, if specified. Returns prior position, in bytes.")},
|
||||
{"fsize", PF_fsize, 0, 0, 0, 0, D("int(filestream fhandle, optional int newsize)", "Reports the total size of the file, in bytes. Can also be used to truncate/extend the file")},
|
||||
{"strlen", PF_strlen, 0, 0, 0, 114, "float(string s)"}, // (FRIK_FILE)
|
||||
{"strcat", PF_strcat, 0, 0, 0, 115, "string(string s1, optional string s2, optional string s3, optional string s4, optional string s5, optional string s6, optional string s7, optional string s8)"}, // (FRIK_FILE)
|
||||
{"substring", PF_substring, 0, 0, 0, 116, "string(string s, float start, float length)"}, // (FRIK_FILE)
|
||||
|
@ -10279,7 +10309,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
|
|||
{"spawnclient", PF_spawnclient, 0, 0, 0, 454, "entity()"},//DP_SV_BOTCLIENT
|
||||
{"clienttype", PF_clienttype, 0, 0, 0, 455, "float(entity client)"},//botclient
|
||||
{"WriteUnterminatedString",PF_WriteString2,0, 0, 0, 456, "void(float target, string str)"}, //writestring but without the null terminator. makes things a little nicer.
|
||||
// {"te_flamejet", PF_te_flamejet, 0, 0, 0, 457, "void(vector org, vector vel, float howmany)"},//DP_TE_FLAMEJET
|
||||
{"te_flamejet", PF_te_flamejet, 0, 0, 0, 457, "void(vector org, vector vel, float howmany)"},//DP_TE_FLAMEJET
|
||||
// {"undefined", PF_Fixme, 0, 0, 0, 458, ""},
|
||||
{"edict_num", PF_edict_for_num, 0, 0, 0, 459, "entity(float entnum)"},//DP_QC_EDICT_NUM
|
||||
{"buf_create", PF_buf_create, 0, 0, 0, 460, "strbuf()"},//DP_QC_STRINGBUFFERS
|
||||
|
|
|
@ -1436,11 +1436,11 @@ static qintptr_t QVM_NextClient (void *offset, quintptr_t mask, const qintptr_t
|
|||
static qintptr_t QVM_SetPause (void *offset, quintptr_t mask, const qintptr_t *arg)
|
||||
{
|
||||
int pause = VM_LONG(arg[0]);
|
||||
if ((sv.paused&1) == (pause&1))
|
||||
return sv.paused&1; //nothing changed, ignore it.
|
||||
if ((sv.paused&PAUSE_EXPLICIT) == (pause&PAUSE_EXPLICIT))
|
||||
return !!(sv.paused&PAUSE_EXPLICIT); //nothing changed, ignore it.
|
||||
sv.paused = pause;
|
||||
sv.pausedstart = Sys_DoubleTime();
|
||||
return sv.paused&1;
|
||||
return !!(sv.paused&PAUSE_EXPLICIT);
|
||||
}
|
||||
static qintptr_t QVM_NotYetImplemented (void *offset, quintptr_t mask, const qintptr_t *arg)
|
||||
{
|
||||
|
|
|
@ -122,8 +122,13 @@ typedef struct
|
|||
int framenum;
|
||||
int logindatabase;
|
||||
|
||||
qboolean paused; // are we paused?
|
||||
float pausedstart;
|
||||
enum
|
||||
{
|
||||
PAUSE_EXPLICIT = 1, //someone hit pause
|
||||
PAUSE_SERVICE = 2, //we're running as a service and someone paused us rather than killing us.
|
||||
PAUSE_AUTO = 4 //console is down in a singleplayer game.
|
||||
} paused;
|
||||
float pausedstart;
|
||||
|
||||
//check player/eyes models for hacks
|
||||
unsigned model_player_checksum;
|
||||
|
|
|
@ -1198,10 +1198,6 @@ char *SV_BannedReason (netadr_t *a)
|
|||
return reason;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
|
||||
static void SV_FilterIP_f (void)
|
||||
{
|
||||
bannedips_t proto;
|
||||
|
@ -2425,36 +2421,64 @@ static void SV_Gamedir (void)
|
|||
SV_Gamedir_f
|
||||
|
||||
Sets the gamedir and path to a different directory.
|
||||
FIXME: should block this if we're on a server at the time
|
||||
================
|
||||
*/
|
||||
static void SV_Gamedir_f (void)
|
||||
{
|
||||
char *dir;
|
||||
int argc = Cmd_Argc();
|
||||
|
||||
if (Cmd_Argc() == 1)
|
||||
if (argc == 1)
|
||||
{
|
||||
Con_TPrintf ("Current gamedir: %s\n", FS_GetGamedir(true));
|
||||
return;
|
||||
}
|
||||
|
||||
if (Cmd_Argc() != 2)
|
||||
if (argc < 2)
|
||||
{
|
||||
Con_TPrintf ("Usage: gamedir <newgamedir>\n");
|
||||
return;
|
||||
}
|
||||
|
||||
dir = Cmd_Argv(1);
|
||||
if (argc == 2)
|
||||
dir = Z_StrDup(Cmd_Argv(1));
|
||||
else
|
||||
{
|
||||
int i;
|
||||
size_t l = 1;
|
||||
for (i = 1; i < argc; i++)
|
||||
l += strlen(Cmd_Argv(i))+1;
|
||||
dir = Z_Malloc(l);
|
||||
for (i = 1; i < argc; i++)
|
||||
{ //disgusting hack for quakespasm's "game extendedgame -missionpack" crap.
|
||||
//games with a leading hypen are inserted before others, with the hyphen ignored.
|
||||
if (*Cmd_Argv(i) != '-')
|
||||
continue;
|
||||
if (*dir)
|
||||
Q_strncatz(dir, ";", l);
|
||||
Q_strncatz(dir, Cmd_Argv(i)+1, l);
|
||||
}
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (*Cmd_Argv(i) == '-')
|
||||
continue;
|
||||
if (*dir)
|
||||
Q_strncatz(dir, ";", l);
|
||||
Q_strncatz(dir, Cmd_Argv(i), l);
|
||||
}
|
||||
}
|
||||
|
||||
if (strstr(dir, "..") || strstr(dir, "/")
|
||||
|| strstr(dir, "\\") || strstr(dir, ":") )
|
||||
{
|
||||
Con_TPrintf ("%s should be a single filename, not a path\n", Cmd_Argv(0));
|
||||
return;
|
||||
}
|
||||
|
||||
dir = Z_StrDup(dir);
|
||||
COM_Gamedir (dir, NULL);
|
||||
Info_SetValueForStarKey (svs.info, "*gamedir", dir, MAX_SERVERINFO_STRING);
|
||||
else
|
||||
{
|
||||
COM_Gamedir (dir, NULL);
|
||||
Info_SetValueForStarKey (svs.info, "*gamedir", dir, MAX_SERVERINFO_STRING);
|
||||
}
|
||||
Z_Free(dir);
|
||||
}
|
||||
|
||||
|
|
|
@ -260,6 +260,7 @@ void SV_Shutdown (void)
|
|||
#endif
|
||||
Cvar_Shutdown();
|
||||
Cmd_Shutdown();
|
||||
PM_Shutdown();
|
||||
|
||||
#ifdef WEBSERVER
|
||||
IWebShutdown();
|
||||
|
@ -764,7 +765,7 @@ void PIN_SaveMessages(void)
|
|||
f = FS_OpenVFS("pinned.txt", "wb", FS_GAMEONLY);
|
||||
if (!f)
|
||||
{
|
||||
Con_TPrintf("couldn't write to %s\n", "pinned.txt");
|
||||
Con_TPrintf(CON_ERROR "couldn't write to %s\n", "pinned.txt");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4203,7 +4204,7 @@ void SV_CheckTimeouts (void)
|
|||
cl->netchan.remote_address.type = NA_INVALID; //don't mess up from not knowing their address.
|
||||
}
|
||||
}
|
||||
if ((sv.paused&1) && !nclients)
|
||||
if ((sv.paused&PAUSE_EXPLICIT) && !nclients)
|
||||
{
|
||||
// nobody left, unpause the server
|
||||
if (SV_TogglePause(NULL))
|
||||
|
@ -4454,8 +4455,8 @@ float SV_Frame (void)
|
|||
/*server is effectively paused if there are no clients*/
|
||||
// if (sv.spawned_client_slots == 0 && sv.spawned_observer_slots == 0 && (cls.state != ca_connected))
|
||||
// isidle = true;
|
||||
if ((sv.paused & 4) != ((isidle||(sv.spawned_client_slots==0&&!deathmatch.ival))?4:0))
|
||||
sv.paused ^= 4;
|
||||
if ((sv.paused & PAUSE_AUTO) != ((isidle||(sv.spawned_client_slots==0&&!deathmatch.ival))?PAUSE_AUTO:0))
|
||||
sv.paused ^= PAUSE_AUTO;
|
||||
#endif
|
||||
|
||||
if (oldpaused != sv.paused)
|
||||
|
@ -5269,6 +5270,9 @@ void SV_ExecInitialConfigs(char *defaultexec)
|
|||
Cbuf_AddText("cvar_purgedefaults\n", RESTRICT_LOCAL); //reset cvar defaults to their engine-specified values. the tail end of 'exec default.cfg' will update non-cheat defaults to mod-specified values.
|
||||
Cbuf_AddText("cvarreset *\n", RESTRICT_LOCAL); //reset all cvars to their current (engine) defaults
|
||||
Cbuf_AddText("alias restart \"changelevel .\"\n",RESTRICT_LOCAL);
|
||||
|
||||
Cbuf_AddText(va("sv_gamedir \"%s\"\n", FS_GetGamedir(true)), RESTRICT_LOCAL);
|
||||
|
||||
Cbuf_AddText(defaultexec, RESTRICT_LOCAL);
|
||||
Cbuf_AddText("\n", RESTRICT_LOCAL);
|
||||
|
||||
|
@ -5360,6 +5364,7 @@ void SV_Init (quakeparms_t *parms)
|
|||
Plug_Initialise(true);
|
||||
#endif
|
||||
|
||||
Cvar_ParseWatches();
|
||||
host_initialized = true;
|
||||
|
||||
|
||||
|
|
|
@ -1777,7 +1777,7 @@ void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg)
|
|||
bits |= SU_EXTEND1;
|
||||
if (bits >= (1u<<24))
|
||||
bits |= SU_EXTEND2;
|
||||
if (bits >= (1ull<<32))
|
||||
if (bits >= ((quint64_t)1u<<32))
|
||||
bits |= SU_EXTEND3;
|
||||
|
||||
// send the data
|
||||
|
|
|
@ -169,6 +169,7 @@ queryrequest_t *SQL_PullRequest(sqlserver_t *server, qboolean lock)
|
|||
sqlserver_t **sqlservers;
|
||||
int sqlservercount;
|
||||
int sqlavailable;
|
||||
int sqlinited;
|
||||
|
||||
#ifdef USE_SQLITE
|
||||
//this is to try to sandbox sqlite so it can only edit the file its originally opened with.
|
||||
|
@ -821,6 +822,9 @@ int SQL_NewServer(const char *driver, const char **paramstr)
|
|||
else // invalid driver choice so we bomb out
|
||||
return -1;
|
||||
|
||||
if (!SQL_Available()) //also makes sure the drivers are actually loaded.
|
||||
return -1;
|
||||
|
||||
if (!(sqlavailable & (1u<<drvchoice)))
|
||||
return -1;
|
||||
|
||||
|
@ -1020,6 +1024,25 @@ const char *SQL_Info(sqlserver_t *server)
|
|||
|
||||
qboolean SQL_Available(void)
|
||||
{
|
||||
if (!sqlinited)
|
||||
{
|
||||
sqlinited = true;
|
||||
#ifdef USE_MYSQL
|
||||
//mysql pokes network etc. there's no sandbox. people can use quake clients to pry upon private databases.
|
||||
if (COM_CheckParm("-mysql"))
|
||||
if (SQL_MYSQLInit())
|
||||
sqlavailable |= 1u<<SQLDRV_MYSQL;
|
||||
#endif
|
||||
#ifdef USE_SQLITE
|
||||
//our sqlite implementation is sandboxed. we block database attachments, and restrict the master database name.
|
||||
sqlitehandle = Sys_LoadLibrary("sqlite3", sqlitefuncs);
|
||||
if (sqlitehandle)
|
||||
{
|
||||
sqlavailable |= 1u<<SQLDRV_SQLITE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return !!sqlavailable;
|
||||
}
|
||||
|
||||
|
@ -1029,10 +1052,22 @@ void SQL_Status_f(void)
|
|||
int i;
|
||||
char *stat;
|
||||
|
||||
if (!SQL_Available())
|
||||
Con_Printf("No SQL library available.\n");
|
||||
SQL_Available(); //also ensures any drivers are loaded.
|
||||
#ifdef USE_MYSQL
|
||||
if (!COM_CheckParm("-mysql"))
|
||||
Con_Printf("mysql: %s\n", "requires -mysql cmdline argument");
|
||||
else
|
||||
Con_Printf("%i connections\n", sqlservercount);
|
||||
Con_Printf("mysql: %s\n", (sqlavailable&(1u<<SQLDRV_MYSQL))?"loaded":"unavailable");
|
||||
#else
|
||||
Con_Printf("mysql: %s\n", "disabled at compile time");
|
||||
#endif
|
||||
#ifdef USE_SQLITE
|
||||
Con_Printf("sqlite: %s\n", (sqlavailable&(1u<<SQLDRV_SQLITE))?"loaded":"unavailable");
|
||||
#else
|
||||
Con_Printf("sqlite: %s\n", "disabled at compile time");
|
||||
#endif
|
||||
|
||||
Con_Printf("%i connections\n", sqlservercount);
|
||||
for (i = 0; i < sqlservercount; i++)
|
||||
{
|
||||
int reqnum = 0;
|
||||
|
@ -1243,20 +1278,6 @@ qboolean SQL_MYSQLInit(void)
|
|||
void SQL_Init(void)
|
||||
{
|
||||
sqlavailable = 0;
|
||||
#ifdef USE_MYSQL
|
||||
//mysql pokes network etc. there's no sandbox. people can use quake clients to pry upon private databases.
|
||||
if (COM_CheckParm("-mysql"))
|
||||
if (SQL_MYSQLInit())
|
||||
sqlavailable |= 1u<<SQLDRV_MYSQL;
|
||||
#endif
|
||||
#ifdef USE_SQLITE
|
||||
//our sqlite implementation is sandboxed. we block database attachments, and restrict the master database name.
|
||||
sqlitehandle = Sys_LoadLibrary("sqlite3", sqlitefuncs);
|
||||
if (sqlitehandle)
|
||||
{
|
||||
sqlavailable |= 1u<<SQLDRV_SQLITE;
|
||||
}
|
||||
#endif
|
||||
|
||||
Cmd_AddCommand ("sqlstatus", SQL_Status_f);
|
||||
Cmd_AddCommand ("sqlkill", SQL_Kill_f);
|
||||
|
@ -1291,6 +1312,7 @@ void SQL_DeInit(void)
|
|||
sqlavailable = 0;
|
||||
|
||||
SQL_KillServers();
|
||||
sqlinited = false;
|
||||
|
||||
#ifdef USE_MYSQL
|
||||
if (qmysql_library_end)
|
||||
|
|
|
@ -1456,7 +1456,7 @@ void ServerMainLoop(void)
|
|||
MyServiceStatus.dwWaitHint = 0;
|
||||
|
||||
SetServiceStatus (ServerServiceStatusHandle, &MyServiceStatus);
|
||||
sv.paused |= 2;
|
||||
sv.paused |= PAUSE_SERVICE;
|
||||
break;
|
||||
case SERVICE_CONTROL_CONTINUE:
|
||||
// Initialization complete - report running status.
|
||||
|
@ -1466,7 +1466,7 @@ void ServerMainLoop(void)
|
|||
|
||||
SetServiceStatus (ServerServiceStatusHandle, &MyServiceStatus);
|
||||
|
||||
sv.paused &= ~2;
|
||||
sv.paused &= ~PAUSE_SERVICE;
|
||||
break;
|
||||
case SERVICE_CONTROL_STOP: //leave the loop
|
||||
return;
|
||||
|
|
|
@ -1069,15 +1069,17 @@ void SV_SendClientPrespawnInfo(client_t *client)
|
|||
|
||||
if (client->prespawn_idx >= maxclientsupportedsounds || !sv.strings.sound_precache[client->prespawn_idx])
|
||||
{
|
||||
//write final-end-of-list
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
started = 0;
|
||||
|
||||
if (sv.strings.sound_precache[client->prespawn_idx] && !(client->plimitwarned & PLIMIT_SOUNDS))
|
||||
{
|
||||
client->plimitwarned |= PLIMIT_SOUNDS;
|
||||
SV_ClientPrintf(client, PRINT_HIGH, "WARNING: Your client's network protocol only supports %i sounds. Please upgrade or enable extensions.\n", client->prespawn_idx);
|
||||
}
|
||||
//write final-end-of-list
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
started = 0;
|
||||
|
||||
client->prespawn_stage++;
|
||||
client->prespawn_idx = 0;
|
||||
break;
|
||||
|
@ -1171,15 +1173,16 @@ void SV_SendClientPrespawnInfo(client_t *client)
|
|||
|
||||
if (client->prespawn_idx >= client->maxmodels || !sv.strings.model_precache[client->prespawn_idx])
|
||||
{
|
||||
//write final-end-of-list
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
started = 0;
|
||||
|
||||
if (sv.strings.model_precache[client->prespawn_idx] && !(client->plimitwarned & PLIMIT_MODELS))
|
||||
{
|
||||
client->plimitwarned |= PLIMIT_MODELS;
|
||||
SV_ClientPrintf(client, PRINT_HIGH, "WARNING: Your client's network protocol only supports %i models. Please upgrade or enable extensions.\n", client->prespawn_idx);
|
||||
}
|
||||
//write final-end-of-list
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
MSG_WriteByte (&client->netchan.message, 0);
|
||||
started = 0;
|
||||
|
||||
client->prespawn_stage++;
|
||||
client->prespawn_idx = 0;
|
||||
|
@ -2045,7 +2048,7 @@ void SV_Begin_f (void)
|
|||
ClientReliableWrite_Begin (host_client, svc_setpause, 2);
|
||||
ClientReliableWrite_Byte (host_client, sv.paused!=0);
|
||||
}
|
||||
if (sv.paused&~4)
|
||||
if (sv.paused&~PAUSE_AUTO)
|
||||
SV_ClientTPrintf(host_client, PRINT_HIGH, "server is paused\n");
|
||||
}
|
||||
|
||||
|
@ -3781,7 +3784,7 @@ qboolean SV_TogglePause (client_t *initiator)
|
|||
{
|
||||
int newv;
|
||||
|
||||
newv = sv.paused^1;
|
||||
newv = sv.paused^PAUSE_EXPLICIT;
|
||||
|
||||
if (!PR_ShouldTogglePause(initiator, newv))
|
||||
return false;
|
||||
|
@ -3815,7 +3818,7 @@ void SV_Pause_f (void)
|
|||
|
||||
if (SV_TogglePause(host_client))
|
||||
{
|
||||
if (sv.paused & 1)
|
||||
if (sv.paused & PAUSE_EXPLICIT)
|
||||
SV_BroadcastTPrintf (PRINT_HIGH, "%s paused the game\n", host_client->name);
|
||||
else
|
||||
SV_BroadcastTPrintf (PRINT_HIGH, "%s unpaused the game\n", host_client->name);
|
||||
|
@ -5420,7 +5423,7 @@ void SVNQ_Begin_f (void)
|
|||
ClientReliableWrite_Begin (host_client, svc_setpause, 2);
|
||||
ClientReliableWrite_Byte (host_client, sv.paused!=0);
|
||||
}
|
||||
if (sv.paused&~4)
|
||||
if (sv.paused&~PAUSE_AUTO)
|
||||
SV_ClientTPrintf(host_client, PRINT_HIGH, "server is paused\n");
|
||||
}
|
||||
|
||||
|
@ -7238,11 +7241,6 @@ void SV_ExecuteClientMessage (client_t *cl)
|
|||
|
||||
if (sv_antilag.ival || !*sv_antilag.string)
|
||||
{
|
||||
/*
|
||||
extern cvar_t temp1;
|
||||
if (temp1.ival)
|
||||
frame = &cl->frameunion.frames[(cl->netchan.incoming_acknowledged+temp1.ival) & UPDATE_MASK];
|
||||
*/
|
||||
#ifdef warningmsg
|
||||
#pragma warningmsg("FIXME: make antilag optionally support non-player ents too")
|
||||
#endif
|
||||
|
|
|
@ -23,12 +23,12 @@ I think globals.maxentities is the hard cap, rather than current max like in q1.
|
|||
//I hope you're c99 and have a __func__
|
||||
#endif
|
||||
|
||||
extern cvar_t temp1;
|
||||
//extern cvar_t temp1;
|
||||
#define ignore(s) Con_DPrintf("Fixme: " s "\n")
|
||||
#define notimpl(l) Con_Printf("halflife sv builtin not implemented on line %i\n", l)
|
||||
#define notimpf(f) Con_Printf("halflife sv builtin %s not implemented\n", f)
|
||||
#define bi_begin() if (temp1.ival)Con_Printf("enter %s\n", __func__)
|
||||
#define bi_end() if (temp1.ival)Con_Printf("leave %s\n", __func__)
|
||||
#define bi_begin() //if (temp1.ival)Con_Printf("enter %s\n", __func__)
|
||||
#define bi_end() //if (temp1.ival)Con_Printf("leave %s\n", __func__)
|
||||
#define bi_trace() bi_begin(); bi_end()
|
||||
|
||||
|
||||
|
@ -2055,7 +2055,6 @@ static void SVHL_RunCmdR(hledict_t *ed, usercmd_t *ucmd)
|
|||
{
|
||||
int i;
|
||||
hledict_t *other;
|
||||
extern cvar_t temp1;
|
||||
|
||||
// chop up very long commands
|
||||
if (ucmd->msec > 50)
|
||||
|
|
|
@ -687,12 +687,25 @@ static int VARGS SVQ2_PointContents (vec3_t p)
|
|||
|
||||
static cvar_t *VARGS Q2Cvar_Get (const char *var_name, const char *value, int flags)
|
||||
{
|
||||
cvar_t *var = Cvar_Get(var_name, value, flags, "Quake2 game variables");
|
||||
cvar_t *var;
|
||||
//q2 gamecode knows about these flags. anything else is probably a bug, or 3rd-party extension.
|
||||
flags &= (CVAR_NOSET|CVAR_SERVERINFO|CVAR_USERINFO|CVAR_ARCHIVE|CVAR_LATCH);
|
||||
|
||||
var = Cvar_Get(var_name, value, flags, "Quake2 game variables");
|
||||
if (!var)
|
||||
{
|
||||
Con_Printf("Q2Cvar_Get: variable %s not creatable\n", var_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//allow this to change all < cvar_latch values.
|
||||
//this allows q2 dlls to apply different flags to a cvar without destroying our important ones (like cheat).
|
||||
flags |= var->flags;
|
||||
if (flags != var->flags)
|
||||
{
|
||||
var->flags = flags;
|
||||
Cvar_Set(var, var->string);
|
||||
}
|
||||
return var;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#define Z_TAG_BOTLIB 221726
|
||||
|
||||
botlib_export_t *FTE_GetBotLibAPI(int apiVersion, botlib_import_t *import)
|
||||
static botlib_export_t *FTE_GetBotLibAPI(int apiVersion, botlib_import_t *import)
|
||||
{ //a stub that will prevent botlib from loading.
|
||||
#ifdef BOTLIB_STATIC
|
||||
return GetBotLibAPI(apiVersion, import);
|
||||
|
@ -1598,22 +1598,22 @@ static int QDECL BL_FOpenFile(const char *name, fileHandle_t *handle, fsMode_t m
|
|||
{
|
||||
return VM_fopen((char*)name, (int*)handle, mode, Z_TAG_BOTLIB);
|
||||
}
|
||||
static int QDECL BL_FRead( void *buffer, int len, fileHandle_t f )
|
||||
static int QDECL BL_FRead(void *buffer, int len, fileHandle_t f)
|
||||
{
|
||||
return VM_FRead(buffer, len, (int)f, Z_TAG_BOTLIB);
|
||||
}
|
||||
//int BL_FWrite( const void *buffer, int len, fileHandle_t f )
|
||||
//{
|
||||
// return VM_FWrite(buffer, len, f, Z_TAG_BOTLIB);
|
||||
//}
|
||||
static void QDECL BL_FCloseFile( fileHandle_t f )
|
||||
static int QDECL BL_FWrite(const void *buffer, int len, fileHandle_t f)
|
||||
{
|
||||
return VM_FWrite(buffer, len, (int)f, Z_TAG_BOTLIB);
|
||||
}
|
||||
static void QDECL BL_FCloseFile(fileHandle_t f)
|
||||
{
|
||||
VM_fclose((int)f, Z_TAG_BOTLIB);
|
||||
}
|
||||
//int BL_Seek( fileHandle_t f )
|
||||
//{
|
||||
// VM_fseek(f, Z_TAG_BOTLIB)
|
||||
//}
|
||||
static int QDECL BL_Seek(fileHandle_t f, long offset, int seektype)
|
||||
{ // on success, apparently returns 0
|
||||
return VM_FSeek((int)f, offset, seektype, Z_TAG_BOTLIB)?0:-1;
|
||||
}
|
||||
static char *QDECL BL_BSPEntityData(void)
|
||||
{
|
||||
return sv.world.worldmodel->entities;
|
||||
|
@ -1705,6 +1705,12 @@ static void QDECL BL_BotClientCommand(int clientnum, char *command)
|
|||
VM_Call(q3gamevm, GAME_CLIENT_COMMAND, clientnum);
|
||||
}
|
||||
|
||||
static int QDECL BL_DebugLineCreate(void) {return 0;}
|
||||
static void QDECL BL_DebugLineDelete(int line) {}
|
||||
static void QDECL BL_DebugLineShow(int line, vec3_t start, vec3_t end, int color) {}
|
||||
static int QDECL BL_DebugPolygonCreate(int color, int numPoints, vec3_t *points) {return 0;}
|
||||
static void QDECL BL_DebugPolygonDelete(int id) {}
|
||||
|
||||
#endif
|
||||
|
||||
static void SV_InitBotLib(void)
|
||||
|
@ -1731,15 +1737,15 @@ static void SV_InitBotLib(void)
|
|||
import.HunkAlloc = BL_HunkMalloc;
|
||||
import.FS_FOpenFile = BL_FOpenFile;
|
||||
import.FS_Read = BL_FRead;
|
||||
// import.FS_Write = BL_FWrite;
|
||||
import.FS_Write = BL_FWrite;
|
||||
import.FS_FCloseFile = BL_FCloseFile;
|
||||
// import.FS_Seek = BL_Seek;
|
||||
// import.DebugLineCreate
|
||||
// import.DebugLineDelete
|
||||
// import.DebugLineShow
|
||||
//
|
||||
// import.DebugPolygonCreate
|
||||
// import.DebugPolygonDelete
|
||||
import.FS_Seek = BL_Seek;
|
||||
|
||||
import.DebugLineCreate = BL_DebugLineCreate;
|
||||
import.DebugLineDelete = BL_DebugLineDelete;
|
||||
import.DebugLineShow = BL_DebugLineShow;
|
||||
import.DebugPolygonCreate= BL_DebugPolygonCreate;
|
||||
import.DebugPolygonDelete = BL_DebugPolygonDelete;
|
||||
|
||||
// Z_FreeTags(Z_TAG_BOTLIB);
|
||||
botlibmemoryavailable = 1024*1024*16;
|
||||
|
|
|
@ -1,25 +1,71 @@
|
|||
!!cvarf r_glsl_turbscale
|
||||
//modifier: REFLECT (s_t2 is a reflection instead of diffusemap)
|
||||
//modifier: STRENGTH (0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: FRESNEL (5=water)
|
||||
//modifier: TXSCALE (0.2 - wave strength)
|
||||
//modifier: RIPPLEMAP (s_t3 contains a ripplemap
|
||||
//modifier: TINT (some colour value)
|
||||
!!cvardf r_glsl_turbscale_reflect=1 //simpler scaler
|
||||
!!cvardf r_glsl_turbscale_refract=1 //simpler scaler
|
||||
!!samps 4 diffuse
|
||||
|
||||
#include "sys/defs.h"
|
||||
|
||||
//modifier: REFLECT (s_t2 is a reflection instead of diffusemap)
|
||||
//modifier: STRENGTH_REFL (distortion strength - 0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: STRENGTH_REFL (distortion strength - 0.1 = fairly gentle, 0.2 = big waves)
|
||||
//modifier: FRESNEL_EXP (5=water)
|
||||
//modifier: TXSCALE (wave size - 0.2)
|
||||
//modifier: RIPPLEMAP (s_t3 contains a ripplemap
|
||||
//modifier: TINT_REFR (some colour value)
|
||||
//modifier: TINT_REFL (some colour value)
|
||||
//modifier: ALPHA (mix in the normal water texture over the top)
|
||||
//modifier: USEMODS (use single-texture scrolling via tcmods - note, also forces the engine to actually use tcmod etc)
|
||||
|
||||
//a few notes on DP compat:
|
||||
//'dpwater' makes numerous assumptions about DP internals
|
||||
//by default there is a single pass that uses the pass's normal tcmods
|
||||
//the fresnel has a user-supplied min+max rather than an exponent
|
||||
//both parts are tinted individually
|
||||
//if alpha is enabled, the regular water texture is blended over the top, again using the same crappy tcmods...
|
||||
|
||||
//legacy crap
|
||||
#ifndef FRESNEL
|
||||
#define FRESNEL 5.0
|
||||
#endif
|
||||
#ifndef TINT
|
||||
#define TINT 0.7,0.8,0.7
|
||||
#endif
|
||||
#ifndef STRENGTH
|
||||
#define STRENGTH 0.1
|
||||
#endif
|
||||
#ifndef TXSCALE
|
||||
#define TXSCALE 0.2
|
||||
#endif
|
||||
#ifndef TINT
|
||||
#define TINT vec3(0.7, 0.8, 0.7)
|
||||
|
||||
//current values (referring to legacy defaults where needed)
|
||||
#ifndef FRESNEL_EXP
|
||||
#define FRESNEL_EXP 5.0
|
||||
#endif
|
||||
#ifndef FRESNEL_MIN
|
||||
#define FRESNEL_MIN 0.0
|
||||
#endif
|
||||
#ifndef FRESNEL_RANGE
|
||||
#define FRESNEL_RANGE 1.0
|
||||
#endif
|
||||
#ifndef STRENGTH_REFL
|
||||
#define STRENGTH_REFL STRENGTH
|
||||
#endif
|
||||
#ifndef STRENGTH_REFR
|
||||
#define STRENGTH_REFR STRENGTH
|
||||
#endif
|
||||
#ifndef TXSCALE1
|
||||
#define TXSCALE1 TXSCALE
|
||||
#endif
|
||||
#ifndef TXSCALE2
|
||||
#define TXSCALE2 TXSCALE
|
||||
#endif
|
||||
#ifndef TINT_REFR
|
||||
#define TINT_REFR TINT
|
||||
#endif
|
||||
#ifndef TINT_REFL
|
||||
#define TINT_REFL 1.0,1.0,1.0
|
||||
#endif
|
||||
#ifndef FOGTINT
|
||||
#define FOGTINT vec3(0.2, 0.3, 0.2)
|
||||
#define FOGTINT 0.2,0.3,0.2
|
||||
#endif
|
||||
|
||||
varying vec2 tc;
|
||||
|
@ -27,9 +73,6 @@ varying vec4 tf;
|
|||
varying vec3 norm;
|
||||
varying vec3 eye;
|
||||
#ifdef VERTEX_SHADER
|
||||
attribute vec2 v_texcoord;
|
||||
attribute vec3 v_normal;
|
||||
uniform vec3 e_eyepos;
|
||||
void main (void)
|
||||
{
|
||||
tc = v_texcoord.st;
|
||||
|
@ -40,45 +83,48 @@ void main (void)
|
|||
}
|
||||
#endif
|
||||
#ifdef FRAGMENT_SHADER
|
||||
#ifdef ALPHA
|
||||
#include "sys/fog.h"
|
||||
#endif
|
||||
|
||||
|
||||
#define s_refract s_t0
|
||||
#define s_reflect s_t1
|
||||
#define s_ripplemap s_t2
|
||||
#define s_refractdepth s_t3
|
||||
|
||||
uniform float cvar_r_glsl_turbscale;
|
||||
uniform sampler2D s_normalmap;
|
||||
uniform sampler2D s_diffuse;
|
||||
uniform sampler2D s_refract; //refract
|
||||
uniform sampler2D s_reflect; //reflection
|
||||
uniform sampler2D s_refractdepth; //refraction depth
|
||||
uniform sampler2D s_ripplemap; //ripplemap
|
||||
|
||||
uniform float e_time;
|
||||
void main (void)
|
||||
{
|
||||
vec2 stc, ntc;
|
||||
vec2 stc; //screen tex coords
|
||||
vec2 ntc; //normalmap/diffuse tex coords
|
||||
vec3 n, refr, refl;
|
||||
float fres;
|
||||
float depth;
|
||||
stc = (1.0 + (tf.xy / tf.w)) * 0.5;
|
||||
//hack the texture coords slightly so that there are no obvious gaps
|
||||
//hack the texture coords slightly so that there are less obvious gaps
|
||||
stc.t -= 1.5*norm.z/1080.0;
|
||||
|
||||
#if 0//def USEMODS
|
||||
ntc = tc;
|
||||
n = texture2D(s_normalmap, ntc).xyz - 0.5;
|
||||
#else
|
||||
//apply q1-style warp, just for kicks
|
||||
ntc.s = tc.s + sin(tc.t+e_time)*0.125;
|
||||
ntc.t = tc.t + sin(tc.s+e_time)*0.125;
|
||||
|
||||
//generate the two wave patterns from the normalmap
|
||||
n = (texture2D(s_normalmap, TXSCALE*tc + vec2(e_time*0.1, 0.0)).xyz);
|
||||
n += (texture2D(s_normalmap, TXSCALE*tc - vec2(0, e_time*0.097)).xyz);
|
||||
n = (texture2D(s_normalmap, vec2(TXSCALE1)*tc + vec2(e_time*0.1, 0.0)).xyz);
|
||||
n += (texture2D(s_normalmap, vec2(TXSCALE2)*tc - vec2(0, e_time*0.097)).xyz);
|
||||
n -= 1.0 - 4.0/256.0;
|
||||
#endif
|
||||
|
||||
#ifdef RIPPLEMAP
|
||||
n += texture2D(s_ripplemap, stc).rgb*3.0;
|
||||
#endif
|
||||
n = normalize(n);
|
||||
|
||||
//the fresnel term decides how transparent the water should be
|
||||
fres = pow(1.0-abs(dot(normalize(n), normalize(eye))), float(FRESNEL));
|
||||
fres = pow(1.0-abs(dot(n, normalize(eye))), float(FRESNEL_EXP)) * float(FRESNEL_RANGE) + float(FRESNEL_MIN);
|
||||
|
||||
#ifdef DEPTH
|
||||
float far = #include "cvar/gl_maxdist";
|
||||
|
@ -111,22 +157,30 @@ void main (void)
|
|||
|
||||
|
||||
//refraction image (and water fog, if possible)
|
||||
refr = texture2D(s_refract, stc + n.st*STRENGTH*cvar_r_glsl_turbscale).rgb * TINT;
|
||||
refr = texture2D(s_refract, stc + n.st*float(STRENGTH_REFR)*float(r_glsl_turbscale_refract)).rgb * vec3(TINT_REFR);
|
||||
#ifdef DEPTH
|
||||
refr = mix(refr, FOGTINT, min(depth/4096.0, 1.0));
|
||||
refr = mix(refr, vec3(FOGTINT), min(depth/4096.0, 1.0));
|
||||
#endif
|
||||
|
||||
//reflection/diffuse
|
||||
#ifdef REFLECT
|
||||
refl = texture2D(s_reflect, stc - n.st*STRENGTH*cvar_r_glsl_turbscale).rgb;
|
||||
refl = texture2D(s_reflect, stc - n.st*float(STRENGTH_REFL)*float(r_glsl_turbscale_reflect)).rgb * vec3(TINT_REFL);
|
||||
#else
|
||||
refl = texture2D(s_diffuse, ntc).xyz;
|
||||
refl = texture2D(s_diffuse, ntc).xyz * vec3(TINT_REFL);
|
||||
#endif
|
||||
//FIXME: add specular
|
||||
|
||||
//interplate by fresnel
|
||||
refr = mix(refr, refl, fres);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef ALPHA
|
||||
vec4 ts = texture2D(s_diffuse, ntc);
|
||||
vec4 surf = fog4blend(vec4(ts.rgb, float(ALPHA)*ts.a));
|
||||
refr = mix(refr, surf.rgb, surf.a);
|
||||
#endif
|
||||
|
||||
//done
|
||||
gl_FragColor = vec4(refr, 1.0);
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ void SWRast_Sync(struct workqueue_s *wq);
|
|||
|
||||
qboolean SW_VID_Init(rendererstate_t *info, unsigned char *palette);
|
||||
void SW_VID_DeInit(void);
|
||||
qboolean SW_VID_ApplyGammaRamps (unsigned short *ramps);
|
||||
qboolean SW_VID_ApplyGammaRamps (unsigned int rampcount, unsigned short *ramps);
|
||||
char *SW_VID_GetRGBInfo(int *truevidwidth, int *truevidheight, enum uploadfmt *fmt);
|
||||
void SW_VID_SetWindowCaption(const char *msg);
|
||||
void SW_VID_SwapBuffers(void);
|
||||
|
|
|
@ -1484,14 +1484,6 @@ void VKBE_InitFramePools(struct vkframe *frame)
|
|||
VkAssert(vkAllocateCommandBuffers(vk.device, &cbai, &frame->cbuf));
|
||||
}
|
||||
|
||||
{
|
||||
VkSemaphoreCreateInfo seminfo = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
|
||||
#ifndef THREADACQUIRE
|
||||
VkAssert(vkCreateSemaphore(vk.device, &seminfo, vkallocationcb, &frame->vsyncsemaphore));
|
||||
#endif
|
||||
VkAssert(vkCreateSemaphore(vk.device, &seminfo, vkallocationcb, &frame->presentsemaphore));
|
||||
}
|
||||
|
||||
{
|
||||
VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};
|
||||
fci.flags = VK_FENCE_CREATE_SIGNALED_BIT;
|
||||
|
@ -3299,8 +3291,13 @@ static void BE_DrawMeshChain_Internal(void)
|
|||
for (mno = 0, vertcount = 0; mno < shaderstate.nummeshes; mno++)
|
||||
{
|
||||
m = shaderstate.meshlist[mno];
|
||||
for (i = 0; i < m->numindexes; i++)
|
||||
map[i] = m->indexes[i]+vertcount;
|
||||
if (!vertcount)
|
||||
memcpy(map, m->indexes, sizeof(index_t)*m->numindexes);
|
||||
else
|
||||
{
|
||||
for (i = 0; i < m->numindexes; i++)
|
||||
map[i] = m->indexes[i]+vertcount;
|
||||
}
|
||||
map += m->numindexes;
|
||||
vertcount += m->numvertexes;
|
||||
}
|
||||
|
@ -3802,6 +3799,9 @@ void VKBE_GenBatchVBOs(vbo_t **vbochain, batch_t *firstbatch, batch_t *stopbatch
|
|||
}
|
||||
}
|
||||
|
||||
if (!maxvboverts || !maxvboelements)
|
||||
return;
|
||||
|
||||
//determine array offsets.
|
||||
vbovdatastart = vbovdata = NULL;
|
||||
vbo->coord.vk.offs = vbovdata-vbovdatastart; vbovdata += sizeof(vecV_t)*maxvboverts;
|
||||
|
@ -5687,7 +5687,10 @@ static void VK_TerminateShadowMap(void)
|
|||
unsigned int sbuf, i;
|
||||
|
||||
if (vk.shadow_renderpass != VK_NULL_HANDLE)
|
||||
{
|
||||
vkDestroyRenderPass(vk.device, vk.shadow_renderpass, vkallocationcb);
|
||||
vk.shadow_renderpass = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
for (sbuf = 0; sbuf < countof(shaderstate.shadow); sbuf++)
|
||||
{
|
||||
|
|
|
@ -9,6 +9,7 @@ extern qboolean vid_isfullscreen;
|
|||
extern cvar_t vk_submissionthread;
|
||||
extern cvar_t vk_debug;
|
||||
extern cvar_t vk_loadglsl;
|
||||
extern cvar_t vk_dualqueue;
|
||||
extern cvar_t vid_srgb, vid_vsync, vid_triplebuffer, r_stereo_method;
|
||||
void R2D_Console_Resize(void);
|
||||
|
||||
|
@ -17,6 +18,7 @@ const char *vklayerlist[] =
|
|||
#if 1
|
||||
"VK_LAYER_LUNARG_standard_validation"
|
||||
#else
|
||||
//older versions of the sdk were crashing out on me,
|
||||
// "VK_LAYER_LUNARG_api_dump",
|
||||
"VK_LAYER_LUNARG_device_limits",
|
||||
//"VK_LAYER_LUNARG_draw_state",
|
||||
|
@ -52,6 +54,7 @@ static void VK_Submit_DoWork(void);
|
|||
|
||||
static void VK_DestroyRenderPass(void);
|
||||
static void VK_CreateRenderPass(void);
|
||||
static void VK_Shutdown_PostProc(void);
|
||||
|
||||
struct vulkaninfo_s vk;
|
||||
static struct vk_rendertarg postproc[4];
|
||||
|
@ -152,13 +155,12 @@ static void VK_DestroySwapChain(void)
|
|||
Sys_WaitOnThread(vk.submitthread);
|
||||
vk.submitthread = NULL;
|
||||
}
|
||||
#ifdef THREADACQUIRE
|
||||
vk.dopresent(NULL);
|
||||
while (vk.aquirenext < vk.aquirelast)
|
||||
{
|
||||
VkAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX));
|
||||
VkWarnAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX));
|
||||
vk.aquirenext++;
|
||||
}
|
||||
#endif
|
||||
while (vk.work)
|
||||
{
|
||||
Sys_LockConditional(vk.submitcondition);
|
||||
|
@ -197,10 +199,10 @@ static void VK_DestroySwapChain(void)
|
|||
VK_DestroyVkTexture(&vk.backbufs[i].depth);
|
||||
}
|
||||
|
||||
#ifdef THREADACQUIRE
|
||||
vk.dopresent(NULL);
|
||||
while (vk.aquirenext < vk.aquirelast)
|
||||
{
|
||||
VkAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX));
|
||||
VkWarnAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX));
|
||||
vk.aquirenext++;
|
||||
}
|
||||
for (i = 0; i < ACQUIRELIMIT; i++)
|
||||
|
@ -209,7 +211,6 @@ static void VK_DestroySwapChain(void)
|
|||
vkDestroyFence(vk.device, vk.acquirefences[i], vkallocationcb);
|
||||
vk.acquirefences[i] = VK_NULL_HANDLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
while(vk.unusedframes)
|
||||
{
|
||||
|
@ -220,10 +221,6 @@ static void VK_DestroySwapChain(void)
|
|||
|
||||
vkResetCommandBuffer(frame->cbuf, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
|
||||
vkFreeCommandBuffers(vk.device, vk.cmdpool, 1, &frame->cbuf);
|
||||
#ifndef THREADACQUIRE
|
||||
vkDestroySemaphore(vk.device, frame->vsyncsemaphore, vkallocationcb);
|
||||
#endif
|
||||
vkDestroySemaphore(vk.device, frame->presentsemaphore, vkallocationcb);
|
||||
vkDestroyFence(vk.device, frame->finishedfence, vkallocationcb);
|
||||
Z_Free(frame);
|
||||
}
|
||||
|
@ -255,6 +252,8 @@ static qboolean VK_CreateSwapChain(void)
|
|||
VkImageView attachments[2];
|
||||
VkFramebufferCreateInfo fb_info = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO};
|
||||
|
||||
vk.dopresent(NULL); //make sure they're all pushed through.
|
||||
|
||||
VkAssert(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.gpu, vk.surface, &fmtcount, NULL));
|
||||
surffmts = malloc(sizeof(VkSurfaceFormatKHR)*fmtcount);
|
||||
VkAssert(vkGetPhysicalDeviceSurfaceFormatsKHR(vk.gpu, vk.surface, &fmtcount, surffmts));
|
||||
|
@ -375,7 +374,6 @@ static qboolean VK_CreateSwapChain(void)
|
|||
images = malloc(sizeof(VkImage)*vk.backbuf_count);
|
||||
VkAssert(vkGetSwapchainImagesKHR(vk.device, vk.swapchain, &vk.backbuf_count, images));
|
||||
|
||||
#ifdef THREADACQUIRE
|
||||
vk.aquirelast = vk.aquirenext = 0;
|
||||
for (i = 0; i < ACQUIRELIMIT; i++)
|
||||
{
|
||||
|
@ -388,7 +386,6 @@ static qboolean VK_CreateSwapChain(void)
|
|||
VkAssert(vkAcquireNextImageKHR(vk.device, vk.swapchain, UINT64_MAX, VK_NULL_HANDLE, vk.acquirefences[vk.aquirelast%ACQUIRELIMIT], &vk.acquirebufferidx[vk.aquirelast%ACQUIRELIMIT]));
|
||||
vk.aquirelast++;
|
||||
}
|
||||
#endif
|
||||
|
||||
VK_CreateRenderPass();
|
||||
if (reloadshaders)
|
||||
|
@ -429,6 +426,8 @@ static qboolean VK_CreateSwapChain(void)
|
|||
vk.backbufs[i].colour.image = images[i];
|
||||
VkAssert(vkCreateImageView(vk.device, &ivci, vkallocationcb, &vk.backbufs[i].colour.view));
|
||||
|
||||
vk.backbufs[i].firstuse = true;
|
||||
|
||||
{
|
||||
VkImageCreateInfo depthinfo = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO};
|
||||
depthinfo.flags = 0;
|
||||
|
@ -481,6 +480,11 @@ static qboolean VK_CreateSwapChain(void)
|
|||
|
||||
attachments[0] = vk.backbufs[i].colour.view;
|
||||
VkAssert(vkCreateFramebuffer(vk.device, &fb_info, vkallocationcb, &vk.backbufs[i].framebuffer));
|
||||
|
||||
{
|
||||
VkSemaphoreCreateInfo seminfo = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
|
||||
VkAssert(vkCreateSemaphore(vk.device, &seminfo, vkallocationcb, &vk.backbufs[i].presentsemaphore));
|
||||
}
|
||||
}
|
||||
free(images);
|
||||
|
||||
|
@ -1086,6 +1090,7 @@ void VK_R_DeInit (void)
|
|||
{
|
||||
R_GAliasFlushSkinCache(true);
|
||||
Surf_DeInit();
|
||||
VK_Shutdown_PostProc();
|
||||
VK_DestroySwapChain();
|
||||
VKBE_Shutdown();
|
||||
Shader_Shutdown();
|
||||
|
@ -1203,7 +1208,17 @@ void VK_Set2D(void)
|
|||
BE_SelectEntity(&r_worldentity);
|
||||
}
|
||||
|
||||
void VK_Init_PostProc(void)
|
||||
static void VK_Shutdown_PostProc(void)
|
||||
{
|
||||
unsigned int i;
|
||||
for (i = 0; i < countof(postproc); i++)
|
||||
VKBE_RT_Gen(&postproc[i], 0, 0, true);
|
||||
|
||||
vk.scenepp_waterwarp = NULL;
|
||||
vk.scenepp_antialias = NULL;
|
||||
VK_R_BloomShutdown();
|
||||
}
|
||||
static void VK_Init_PostProc(void)
|
||||
{
|
||||
texid_t scenepp_texture_warp, scenepp_texture_edge;
|
||||
//this block liberated from the opengl code
|
||||
|
@ -1641,15 +1656,23 @@ void VK_R_RenderView (void)
|
|||
}
|
||||
|
||||
custompostproc = NULL;
|
||||
if (!(r_refdef.flags & RDF_NOWORLDMODEL) && (*r_postprocshader.string))
|
||||
if (r_refdef.flags & RDF_NOWORLDMODEL)
|
||||
renderscale = 1; //with no worldmodel, this is probably meant to be transparent so make sure that there's no post-proc stuff messing up transparencies.
|
||||
else
|
||||
{
|
||||
custompostproc = R_RegisterCustom(r_postprocshader.string, SUF_NONE, NULL, NULL);
|
||||
if (custompostproc)
|
||||
r_refdef.flags |= RDF_CUSTOMPOSTPROC;
|
||||
}
|
||||
if (*r_postprocshader.string)
|
||||
{
|
||||
custompostproc = R_RegisterCustom(r_postprocshader.string, SUF_NONE, NULL, NULL);
|
||||
if (custompostproc)
|
||||
r_refdef.flags |= RDF_CUSTOMPOSTPROC;
|
||||
}
|
||||
|
||||
if (!(r_refdef.flags & RDF_NOWORLDMODEL) && r_fxaa.ival) //overlays will have problems.
|
||||
r_refdef.flags |= RDF_ANTIALIAS;
|
||||
if (r_fxaa.ival) //overlays will have problems.
|
||||
r_refdef.flags |= RDF_ANTIALIAS;
|
||||
|
||||
if (R_CanBloom())
|
||||
r_refdef.flags |= RDF_BLOOM;
|
||||
}
|
||||
|
||||
//
|
||||
// figure out the viewport
|
||||
|
@ -1691,9 +1714,6 @@ void VK_R_RenderView (void)
|
|||
//FIXME: VF_RT_*
|
||||
//FIXME: if we're meant to be using msaa, render the scene to an msaa target and then resolve.
|
||||
|
||||
if (R_CanBloom())
|
||||
r_refdef.flags |= RDF_BLOOM;
|
||||
|
||||
postproc_buf = 0;
|
||||
if (r_refdef.flags & (RDF_ALLPOSTPROC|RDF_RENDERSCALE))
|
||||
{
|
||||
|
@ -2085,9 +2105,6 @@ static void VK_PaintScreen(void)
|
|||
qboolean VK_SCR_GrabBackBuffer(void)
|
||||
{
|
||||
RSpeedLocals();
|
||||
#ifndef THREADACQUIRE
|
||||
VkResult err;
|
||||
#endif
|
||||
|
||||
if (vk.frame) //erk, we already have one...
|
||||
return true;
|
||||
|
@ -2104,7 +2121,6 @@ qboolean VK_SCR_GrabBackBuffer(void)
|
|||
vk.unusedframes = newframe;
|
||||
}
|
||||
|
||||
#ifdef THREADACQUIRE
|
||||
while (vk.aquirenext == vk.aquirelast)
|
||||
{ //we're still waiting for the render thread to increment acquirelast.
|
||||
Sys_Sleep(0); //o.O
|
||||
|
@ -2114,7 +2130,13 @@ qboolean VK_SCR_GrabBackBuffer(void)
|
|||
if (1)//vk.vsync)
|
||||
{
|
||||
//friendly wait
|
||||
VkAssert(vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX));
|
||||
VkResult err = vkWaitForFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT], VK_FALSE, UINT64_MAX);
|
||||
if (err)
|
||||
{
|
||||
if (err == VK_ERROR_DEVICE_LOST)
|
||||
Sys_Error("Vulkan device lost");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{ //busy wait, to try to get the highest fps possible
|
||||
|
@ -2124,37 +2146,6 @@ qboolean VK_SCR_GrabBackBuffer(void)
|
|||
vk.bufferidx = vk.acquirebufferidx[vk.aquirenext%ACQUIRELIMIT];
|
||||
VkAssert(vkResetFences(vk.device, 1, &vk.acquirefences[vk.aquirenext%ACQUIRELIMIT]));
|
||||
vk.aquirenext++;
|
||||
#else
|
||||
Sys_LockMutex(vk.swapchain_mutex);
|
||||
err = vkAcquireNextImageKHR(vk.device, vk.swapchain, UINT64_MAX, vk.unusedframes->vsyncsemaphore, vk.acquirefence, &vk.bufferidx);
|
||||
Sys_UnlockMutex(vk.swapchain_mutex);
|
||||
switch(err)
|
||||
{
|
||||
case VK_ERROR_OUT_OF_DATE_KHR:
|
||||
vk.neednewswapchain = true;
|
||||
return false;
|
||||
case VK_SUBOPTIMAL_KHR:
|
||||
vk.neednewswapchain = true;
|
||||
break; //this is still a success
|
||||
case VK_SUCCESS:
|
||||
break; //yay
|
||||
case VK_ERROR_SURFACE_LOST_KHR:
|
||||
//window was destroyed.
|
||||
//shouldn't really happen...
|
||||
return false;
|
||||
case VK_NOT_READY: //VK_NOT_READY is returned if timeout is zero and no image was available. (timeout is not 0)
|
||||
RSpeedEnd(RSPEED_SETUP);
|
||||
Con_DPrintf("vkAcquireNextImageKHR: unexpected VK_NOT_READY\n");
|
||||
return false; //timed out
|
||||
case VK_TIMEOUT: //VK_TIMEOUT is returned if timeout is greater than zero and less than UINT64_MAX, and no image became available within the time allowed.
|
||||
RSpeedEnd(RSPEED_SETUP);
|
||||
Con_DPrintf("vkAcquireNextImageKHR: unexpected VK_TIMEOUT\n");
|
||||
return false; //timed out
|
||||
default:
|
||||
Sys_Error("vkAcquireNextImageKHR == %i", err);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
//grab the first unused
|
||||
Sys_LockConditional(vk.submitcondition);
|
||||
|
@ -2199,7 +2190,7 @@ qboolean VK_SCR_GrabBackBuffer(void)
|
|||
imgbarrier.pNext = NULL;
|
||||
imgbarrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
|
||||
imgbarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
|
||||
imgbarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;// VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; //'Alternately, oldLayout can be VK_IMAGE_LAYOUT_UNDEFINED, if the image’s contents need not be preserved.'
|
||||
imgbarrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; //'Alternately, oldLayout can be VK_IMAGE_LAYOUT_UNDEFINED, if the image’s contents need not be preserved.'
|
||||
imgbarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
|
||||
imgbarrier.image = vk.frame->backbuf->colour.image;
|
||||
imgbarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
|
@ -2207,8 +2198,15 @@ qboolean VK_SCR_GrabBackBuffer(void)
|
|||
imgbarrier.subresourceRange.levelCount = 1;
|
||||
imgbarrier.subresourceRange.baseArrayLayer = 0;
|
||||
imgbarrier.subresourceRange.layerCount = 1;
|
||||
imgbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imgbarrier.srcQueueFamilyIndex = vk.queuefam[1];
|
||||
imgbarrier.dstQueueFamilyIndex = vk.queuefam[0];
|
||||
if (vk.frame->backbuf->firstuse)
|
||||
{
|
||||
imgbarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
imgbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
vk.frame->backbuf->firstuse = false;
|
||||
}
|
||||
vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier);
|
||||
}
|
||||
{
|
||||
|
@ -2390,8 +2388,8 @@ qboolean VK_SCR_UpdateScreen (void)
|
|||
imgbarrier.subresourceRange.levelCount = 1;
|
||||
imgbarrier.subresourceRange.baseArrayLayer = 0;
|
||||
imgbarrier.subresourceRange.layerCount = 1;
|
||||
imgbarrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imgbarrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
|
||||
imgbarrier.srcQueueFamilyIndex = vk.queuefam[0];
|
||||
imgbarrier.dstQueueFamilyIndex = vk.queuefam[1];
|
||||
vkCmdPipelineBarrier(vk.frame->cbuf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, NULL, 0, NULL, 1, &imgbarrier);
|
||||
}
|
||||
|
||||
|
@ -2402,16 +2400,6 @@ qboolean VK_SCR_UpdateScreen (void)
|
|||
|
||||
bufs[0] = vk.frame->cbuf;
|
||||
|
||||
#ifndef THREADACQUIRE
|
||||
{
|
||||
RSpeedRemark();
|
||||
//make sure we actually got a buffer. required for vsync
|
||||
VkAssert(vkWaitForFences(vk.device, 1, &vk.acquirefence, VK_FALSE, UINT64_MAX));
|
||||
VkAssert(vkResetFences(vk.device, 1, &vk.acquirefence));
|
||||
RSpeedEnd(RSPEED_SETUP);
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
struct vk_presented *fw = Z_Malloc(sizeof(*fw));
|
||||
fw->fw.Passed = VK_Presented;
|
||||
|
@ -2421,13 +2409,7 @@ qboolean VK_SCR_UpdateScreen (void)
|
|||
vk.frame->frameendjobs = vk.frameendjobs;
|
||||
vk.frameendjobs = NULL;
|
||||
|
||||
VK_Submit_Work(bufs[0],
|
||||
#ifndef THREADACQUIRE
|
||||
vk.frame->vsyncsemaphore
|
||||
#else
|
||||
VK_NULL_HANDLE
|
||||
#endif
|
||||
, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk.frame->presentsemaphore, vk.frame->finishedfence, vk.frame, &fw->fw);
|
||||
VK_Submit_Work(bufs[0], VK_NULL_HANDLE, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, vk.frame->backbuf->presentsemaphore, vk.frame->finishedfence, vk.frame, &fw->fw);
|
||||
}
|
||||
|
||||
//now would be a good time to do any compute work or lightmap updates...
|
||||
|
@ -2538,6 +2520,46 @@ static VkRenderPassCreateInfo rp_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_I
|
|||
}
|
||||
}
|
||||
|
||||
void VK_DoPresent(struct vkframe *theframe)
|
||||
{
|
||||
VkResult err;
|
||||
uint32_t framenum;
|
||||
VkPresentInfoKHR presinfo = {VK_STRUCTURE_TYPE_PRESENT_INFO_KHR};
|
||||
if (!theframe)
|
||||
return; //used to ensure that the queue is flushed at shutdown
|
||||
framenum = theframe->backbuf - vk.backbufs;
|
||||
presinfo.waitSemaphoreCount = 1;
|
||||
presinfo.pWaitSemaphores = &theframe->backbuf->presentsemaphore;
|
||||
presinfo.swapchainCount = 1;
|
||||
presinfo.pSwapchains = &vk.swapchain;
|
||||
presinfo.pImageIndices = &framenum;
|
||||
|
||||
{
|
||||
RSpeedMark();
|
||||
err = vkQueuePresentKHR(vk.queue_present, &presinfo);
|
||||
RSpeedEnd(RSPEED_PRESENT);
|
||||
}
|
||||
{
|
||||
RSpeedMark();
|
||||
if (err)
|
||||
{
|
||||
Con_Printf("ERROR: vkQueuePresentKHR: %x\n", err);
|
||||
vk.neednewswapchain = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
err = vkAcquireNextImageKHR(vk.device, vk.swapchain, 0, VK_NULL_HANDLE, vk.acquirefences[vk.aquirelast%ACQUIRELIMIT], &vk.acquirebufferidx[vk.aquirelast%ACQUIRELIMIT]);
|
||||
if (err)
|
||||
{
|
||||
Con_Printf("ERROR: vkAcquireNextImageKHR: %x\n", err);
|
||||
vk.neednewswapchain = true;
|
||||
}
|
||||
vk.aquirelast++;
|
||||
}
|
||||
RSpeedEnd(RSPEED_ACQUIRE);
|
||||
}
|
||||
}
|
||||
|
||||
static void VK_Submit_DoWork(void)
|
||||
{
|
||||
VkCommandBuffer cbuf[64];
|
||||
|
@ -2588,50 +2610,15 @@ static void VK_Submit_DoWork(void)
|
|||
err = vkQueueSubmit(vk.queue_render, subcount, subinfo, waitfence);
|
||||
if (err)
|
||||
{
|
||||
Con_Printf("ERROR: vkQueueSubmit: %x\n", err);
|
||||
Con_Printf("ERROR: vkQueueSubmit: %i\n", err);
|
||||
errored = vk.neednewswapchain = true;
|
||||
}
|
||||
RSpeedEnd(RSPEED_SUBMIT);
|
||||
}
|
||||
|
||||
if (present)
|
||||
if (present && !errored)
|
||||
{
|
||||
// struct vkframe **link;
|
||||
uint32_t framenum = present->backbuf - vk.backbufs;
|
||||
VkPresentInfoKHR presinfo = {VK_STRUCTURE_TYPE_PRESENT_INFO_KHR};
|
||||
presinfo.waitSemaphoreCount = 1;
|
||||
presinfo.pWaitSemaphores = &present->presentsemaphore;
|
||||
presinfo.swapchainCount = 1;
|
||||
presinfo.pSwapchains = &vk.swapchain;
|
||||
presinfo.pImageIndices = &framenum;
|
||||
|
||||
if (!errored)
|
||||
{
|
||||
RSpeedMark();
|
||||
Sys_LockMutex(vk.swapchain_mutex);
|
||||
err = vkQueuePresentKHR(vk.queue_present, &presinfo);
|
||||
Sys_UnlockMutex(vk.swapchain_mutex);
|
||||
RSpeedEnd(RSPEED_PRESENT);
|
||||
RSpeedRemark();
|
||||
if (err)
|
||||
{
|
||||
Con_Printf("ERROR: vkQueuePresentKHR: %x\n", err);
|
||||
errored = vk.neednewswapchain = true;
|
||||
}
|
||||
#ifdef THREADACQUIRE
|
||||
else
|
||||
{
|
||||
err = vkAcquireNextImageKHR(vk.device, vk.swapchain, 0, VK_NULL_HANDLE, vk.acquirefences[vk.aquirelast%ACQUIRELIMIT], &vk.acquirebufferidx[vk.aquirelast%ACQUIRELIMIT]);
|
||||
if (err)
|
||||
{
|
||||
Con_Printf("ERROR: vkAcquireNextImageKHR: %x\n", err);
|
||||
errored = vk.neednewswapchain = true;
|
||||
}
|
||||
vk.aquirelast++;
|
||||
}
|
||||
#endif
|
||||
RSpeedEnd(RSPEED_ACQUIRE);
|
||||
}
|
||||
vk.dopresent(present);
|
||||
}
|
||||
|
||||
Sys_LockConditional(vk.submitcondition);
|
||||
|
@ -2660,9 +2647,6 @@ int VK_Submit_Thread(void *arg)
|
|||
Sys_ConditionWait(vk.submitcondition);
|
||||
|
||||
VK_Submit_DoWork();
|
||||
|
||||
//Sys_ConditionSignal(vk.acquirecondition);
|
||||
|
||||
}
|
||||
Sys_UnlockConditional(vk.submitcondition);
|
||||
return true;
|
||||
|
@ -2745,8 +2729,9 @@ void VK_CheckTextureFormats(void)
|
|||
}
|
||||
|
||||
//initialise the vulkan instance, context, device, etc.
|
||||
qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*createSurface)(void))
|
||||
qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*createSurface)(void), void (*dopresent)(struct vkframe *theframe))
|
||||
{
|
||||
VkQueueFamilyProperties *queueprops;
|
||||
VkResult err;
|
||||
VkApplicationInfo app;
|
||||
VkInstanceCreateInfo inst_info;
|
||||
|
@ -2761,6 +2746,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
vk.neednewswapchain = true;
|
||||
vk.triplebuffer = info->triplebuffer;
|
||||
vk.vsync = info->wait;
|
||||
vk.dopresent = dopresent?dopresent:VK_DoPresent;
|
||||
memset(&sh_config, 0, sizeof(sh_config));
|
||||
|
||||
|
||||
|
@ -2974,34 +2960,64 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
//figure out which of the device's queue's we're going to use
|
||||
{
|
||||
uint32_t queue_count, i;
|
||||
VkQueueFamilyProperties *queueprops;
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(vk.gpu, &queue_count, NULL);
|
||||
queueprops = malloc(sizeof(VkQueueFamilyProperties)*queue_count); //Oh how I wish I was able to use C99.
|
||||
vkGetPhysicalDeviceQueueFamilyProperties(vk.gpu, &queue_count, queueprops);
|
||||
|
||||
vk.queueidx[0] = ~0u;
|
||||
vk.queueidx[1] = ~0u;
|
||||
vk.queuefam[0] = ~0u;
|
||||
vk.queuefam[1] = ~0u;
|
||||
vk.queuenum[0] = 0;
|
||||
vk.queuenum[1] = 0;
|
||||
|
||||
/*
|
||||
//try to find a 'dedicated' present queue
|
||||
for (i = 0; i < queue_count; i++)
|
||||
{
|
||||
VkBool32 supportsPresent;
|
||||
VkBool32 supportsPresent = FALSE;
|
||||
VkAssert(vkGetPhysicalDeviceSurfaceSupportKHR(vk.gpu, i, vk.surface, &supportsPresent));
|
||||
|
||||
if ((queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && supportsPresent)
|
||||
if (supportsPresent && !(queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT))
|
||||
{
|
||||
vk.queueidx[0] = i;
|
||||
vk.queueidx[1] = i;
|
||||
vk.queuefam[1] = i;
|
||||
break;
|
||||
}
|
||||
else if (vk.queueidx[0] == ~0u && (queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT))
|
||||
vk.queueidx[0] = i;
|
||||
else if (vk.queueidx[1] == ~0u && supportsPresent)
|
||||
vk.queueidx[1] = i;
|
||||
}
|
||||
|
||||
free(queueprops);
|
||||
|
||||
if (vk.queueidx[0] == ~0u || vk.queueidx[1] == ~0u)
|
||||
if (vk.queuefam[1] != ~0u)
|
||||
{ //try to find a good graphics queue
|
||||
for (i = 0; i < queue_count; i++)
|
||||
{
|
||||
if (queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
|
||||
{
|
||||
vk.queuefam[0] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else*/
|
||||
{
|
||||
for (i = 0; i < queue_count; i++)
|
||||
{
|
||||
VkBool32 supportsPresent;
|
||||
VkAssert(vkGetPhysicalDeviceSurfaceSupportKHR(vk.gpu, i, vk.surface, &supportsPresent));
|
||||
|
||||
if ((queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) && supportsPresent)
|
||||
{
|
||||
vk.queuefam[0] = i;
|
||||
vk.queuefam[1] = i;
|
||||
break;
|
||||
}
|
||||
else if (vk.queuefam[0] == ~0u && (queueprops[i].queueFlags & VK_QUEUE_GRAPHICS_BIT))
|
||||
vk.queuefam[0] = i;
|
||||
else if (vk.queuefam[1] == ~0u && supportsPresent)
|
||||
vk.queuefam[1] = i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (vk.queuefam[0] == ~0u || vk.queuefam[1] == ~0u)
|
||||
{
|
||||
free(queueprops);
|
||||
Con_Printf("unable to find suitable queues\n");
|
||||
return false;
|
||||
}
|
||||
|
@ -3023,7 +3039,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
{
|
||||
const char *devextensions[8];
|
||||
size_t numdevextensions = 0;
|
||||
float queue_priorities[1] = {1.0};
|
||||
float queue_priorities[2] = {0.8, 1.0};
|
||||
VkDeviceQueueCreateInfo queueinf[2] = {{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO},{VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO}};
|
||||
VkDeviceCreateInfo devinf = {VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO};
|
||||
|
||||
|
@ -3033,15 +3049,39 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
|
||||
|
||||
queueinf[0].pNext = NULL;
|
||||
queueinf[0].queueFamilyIndex = vk.queueidx[0];
|
||||
queueinf[0].queueCount = countof(queue_priorities);
|
||||
queueinf[0].queueFamilyIndex = vk.queuefam[0];
|
||||
queueinf[0].queueCount = 1;
|
||||
queueinf[0].pQueuePriorities = queue_priorities;
|
||||
queueinf[1].pNext = NULL;
|
||||
queueinf[1].queueFamilyIndex = vk.queueidx[1];
|
||||
queueinf[1].queueCount = countof(queue_priorities);
|
||||
queueinf[1].pQueuePriorities = queue_priorities;
|
||||
queueinf[1].queueFamilyIndex = vk.queuefam[1];
|
||||
queueinf[1].queueCount = 1;
|
||||
queueinf[1].pQueuePriorities = &queue_priorities[1];
|
||||
|
||||
if (vk.queuefam[0] == vk.queuefam[1])
|
||||
{
|
||||
devinf.queueCreateInfoCount = 1;
|
||||
|
||||
if (queueprops[queueinf[0].queueFamilyIndex].queueCount >= 2 && vk_dualqueue.ival)
|
||||
{
|
||||
queueinf[0].queueCount = 2;
|
||||
vk.queuenum[1] = 1;
|
||||
Con_DPrintf("Using duel queue\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
queueinf[0].queueCount = 1;
|
||||
vk.dopresent = VK_DoPresent; //can't split submit+present onto different queues, so do these on a single thread.
|
||||
Con_DPrintf("Using single queue\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
devinf.queueCreateInfoCount = 2;
|
||||
Con_DPrintf("Using separate queue families\n");
|
||||
}
|
||||
|
||||
free(queueprops);
|
||||
|
||||
devinf.queueCreateInfoCount = (vk.queueidx[0]==vk.queueidx[0])?1:2;
|
||||
devinf.pQueueCreateInfos = queueinf;
|
||||
devinf.enabledLayerCount = vklayercount;
|
||||
devinf.ppEnabledLayerNames = vklayerlist;
|
||||
|
@ -3073,15 +3113,15 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
#undef VKFunc
|
||||
#endif
|
||||
|
||||
vkGetDeviceQueue(vk.device, vk.queueidx[0], 0, &vk.queue_render);
|
||||
vkGetDeviceQueue(vk.device, vk.queueidx[1], 0, &vk.queue_present);
|
||||
vkGetDeviceQueue(vk.device, vk.queuefam[0], vk.queuenum[0], &vk.queue_render);
|
||||
vkGetDeviceQueue(vk.device, vk.queuefam[1], vk.queuenum[1], &vk.queue_present);
|
||||
|
||||
|
||||
vkGetPhysicalDeviceMemoryProperties(vk.gpu, &vk.memory_properties);
|
||||
|
||||
{
|
||||
VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO};
|
||||
cpci.queueFamilyIndex = vk.queueidx[0];
|
||||
cpci.queueFamilyIndex = vk.queuefam[0];
|
||||
cpci.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT|VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
|
||||
VkAssert(vkCreateCommandPool(vk.device, &cpci, vkallocationcb, &vk.cmdpool));
|
||||
}
|
||||
|
@ -3133,25 +3173,7 @@ qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*creat
|
|||
else //16bit depth is guarenteed in vulkan
|
||||
vk.depthformat = VK_FORMAT_D16_UNORM;
|
||||
|
||||
#ifndef THREADACQUIRE
|
||||
{
|
||||
VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO};
|
||||
VkAssert(vkCreateFence(vk.device,&fci,vkallocationcb,&vk.acquirefence));
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
void (*pDeleteProg) (program_t *prog, unsigned int permu);
|
||||
qboolean (*pLoadBlob) (program_t *prog, const char *name, unsigned int permu, vfsfile_t *blobfile);
|
||||
qboolean (*pCreateProgram) (program_t *prog, const char *name, unsigned int permu, int ver, const char **precompilerconstants, const char *vert, const char *tcs, const char *tes, const char *geom, const char *frag, qboolean noerrors, vfsfile_t *blobfile);
|
||||
qboolean (*pValidateProgram)(program_t *prog, const char *name, unsigned int permu, qboolean noerrors, vfsfile_t *blobfile);
|
||||
void (*pProgAutoFields) (program_t *prog, const char *name, cvar_t **cvars, char **cvarnames, int *cvartypes);
|
||||
*/
|
||||
|
||||
|
||||
vk.swapchain_mutex = Sys_CreateMutex();
|
||||
vk.submitcondition = Sys_CreateConditional();
|
||||
vk.acquirecondition = Sys_CreateConditional();
|
||||
|
||||
{
|
||||
VkPipelineCacheCreateInfo pci = {VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO};
|
||||
|
@ -3187,10 +3209,6 @@ void VK_Shutdown(void)
|
|||
if (vk.cmdpool)
|
||||
vkDestroyCommandPool(vk.device, vk.cmdpool, vkallocationcb);
|
||||
VK_DestroyRenderPass();
|
||||
#ifndef THREADACQUIRE
|
||||
if (vk.acquirefence)
|
||||
vkDestroyFence(vk.device, vk.acquirefence, vkallocationcb);
|
||||
#endif
|
||||
|
||||
if (vk.pipelinecache)
|
||||
{
|
||||
|
@ -3212,16 +3230,14 @@ void VK_Shutdown(void)
|
|||
vkDestroyDebugReportCallbackEXT(vk.instance, vk_debugcallback, vkallocationcb);
|
||||
vk_debugcallback = VK_NULL_HANDLE;
|
||||
}
|
||||
|
||||
if (vk.surface)
|
||||
vkDestroySurfaceKHR(vk.instance, vk.surface, vkallocationcb);
|
||||
if (vk.instance)
|
||||
vkDestroyInstance(vk.instance, vkallocationcb);
|
||||
if (vk.swapchain_mutex)
|
||||
Sys_DestroyMutex(vk.swapchain_mutex);
|
||||
if (vk.submitcondition)
|
||||
Sys_DestroyConditional(vk.submitcondition);
|
||||
if (vk.acquirecondition)
|
||||
Sys_DestroyConditional(vk.acquirecondition);
|
||||
|
||||
memset(&vk, 0, sizeof(vk));
|
||||
qrenderer = QR_NONE;
|
||||
|
||||
|
|
|
@ -401,12 +401,15 @@ static qboolean VID_SetFullDIBMode (rendererstate_t *info)
|
|||
gdevmode.dmFields |= DM_BITSPERPEL;
|
||||
if (info->rate)
|
||||
gdevmode.dmFields |= DM_DISPLAYFREQUENCY;
|
||||
gdevmode.dmBitsPerPel = info->bpp;
|
||||
if (info->bpp && (gdevmode.dmBitsPerPel < 15))
|
||||
{
|
||||
if (info->bpp && (info->bpp < 15))
|
||||
{ //low values get you a warning. otherwise only 16 and 32bit are allowed.
|
||||
Con_Printf("Forcing at least 15bpp\n");
|
||||
gdevmode.dmBitsPerPel = 16;
|
||||
}
|
||||
else if (info->bpp == 16)
|
||||
gdevmode.dmBitsPerPel = 16;
|
||||
else
|
||||
gdevmode.dmBitsPerPel = 32;
|
||||
gdevmode.dmDisplayFrequency = info->rate;
|
||||
gdevmode.dmPelsWidth = info->width;
|
||||
gdevmode.dmPelsHeight = info->height;
|
||||
|
@ -632,6 +635,18 @@ static qboolean VK_CreateSurface(void)
|
|||
return true;
|
||||
}
|
||||
|
||||
#ifdef WTHREAD
|
||||
static void VK_Win32_Present(struct vkframe *theframe)
|
||||
{
|
||||
// if (theframe)
|
||||
// PostMessage(mainwindow, WM_USER+7, 0, (LPARAM)theframe);
|
||||
// else
|
||||
SendMessage(mainwindow, WM_USER+7, 0, (LPARAM)theframe);
|
||||
}
|
||||
#else
|
||||
#define VK_Present NULL
|
||||
#endif
|
||||
|
||||
static qboolean VID_AttachVulkan (rendererstate_t *info)
|
||||
{ //make sure we can get a valid renderer.
|
||||
#ifdef VK_NO_PROTOTYPES
|
||||
|
@ -648,7 +663,7 @@ static qboolean VID_AttachVulkan (rendererstate_t *info)
|
|||
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) GetProcAddress(hInstVulkan, "vkGetInstanceProcAddr");
|
||||
#endif
|
||||
|
||||
return VK_Init(info, VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_CreateSurface);
|
||||
return VK_Init(info, VK_KHR_WIN32_SURFACE_EXTENSION_NAME, VK_CreateSurface, VK_Win32_Present);
|
||||
}
|
||||
|
||||
|
||||
|
@ -841,10 +856,6 @@ static void VKVID_Recenter_f(void)
|
|||
//int nx = 0;
|
||||
//int ny = 0;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#define strtoull _strtoui64
|
||||
#endif
|
||||
|
||||
if (Cmd_Argc() > 1)
|
||||
sys_parentleft = atoi(Cmd_Argv(1));
|
||||
if (Cmd_Argc() > 2)
|
||||
|
@ -1438,6 +1449,9 @@ static LONG WINAPI VKMainWndProc (
|
|||
STT_Event();
|
||||
#endif
|
||||
break;
|
||||
case WM_USER+7:
|
||||
VK_DoPresent((struct vkframe*)lParam);
|
||||
break;
|
||||
|
||||
case WM_GETMINMAXINFO:
|
||||
{
|
||||
|
|
|
@ -15,15 +15,14 @@
|
|||
#endif
|
||||
|
||||
#define VK_NO_PROTOTYPES
|
||||
#include <vulkan/vulkan.h>
|
||||
#include "../vulkan/vulkan.h"
|
||||
|
||||
#if defined(_MSC_VER) && !defined(UINT64_MAX)
|
||||
#define UINT64_MAX _UI64_MAX
|
||||
#ifndef _UI64_MAX
|
||||
#define _UI64_MAX 0xffffffffffffffffui64
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define THREADACQUIRE //should be better behaved, with no extra locks needed.
|
||||
|
||||
|
||||
|
||||
#ifndef VKInstWin32Funcs
|
||||
#define VKInstWin32Funcs
|
||||
|
@ -168,8 +167,10 @@
|
|||
#define vkallocationcb NULL
|
||||
#ifdef _DEBUG
|
||||
#define VkAssert(f) do {VkResult err = f; if (err) Sys_Error("%s == %i", #f, err); } while(0)
|
||||
#define VkWarnAssert(f) do {VkResult err = f; if (err) Con_Printf("%s == %i\n", #f, err); } while(0)
|
||||
#else
|
||||
#define VkAssert(f) f
|
||||
#define VkWarnAssert(f) f
|
||||
#endif
|
||||
|
||||
typedef struct vk_image_s
|
||||
|
@ -207,6 +208,8 @@ struct vk_rendertarg
|
|||
qboolean depthcleared; //starting a new gameview needs cleared depth relative to other views, but the first probably won't.
|
||||
|
||||
VkRenderPassBeginInfo restartinfo;
|
||||
VkSemaphore presentsemaphore;
|
||||
qboolean firstuse;
|
||||
};
|
||||
struct vk_rendertarg_cube
|
||||
{
|
||||
|
@ -225,21 +228,18 @@ extern struct vulkaninfo_s
|
|||
VkDevice device;
|
||||
VkPhysicalDevice gpu;
|
||||
VkSurfaceKHR surface;
|
||||
uint32_t queueidx[2]; //queue families, render+present
|
||||
uint32_t queuefam[2]; //queue families, render+present
|
||||
uint32_t queuenum[2]; //queue families, render+present
|
||||
VkQueue queue_render;
|
||||
VkQueue queue_present;
|
||||
VkPhysicalDeviceMemoryProperties memory_properties;
|
||||
VkCommandPool cmdpool;
|
||||
|
||||
#ifdef THREADACQUIRE
|
||||
#define ACQUIRELIMIT 8
|
||||
VkFence acquirefences[ACQUIRELIMIT];
|
||||
uint32_t acquirebufferidx[ACQUIRELIMIT];
|
||||
unsigned int aquirenext;
|
||||
volatile unsigned int aquirelast; //set inside the submission thread
|
||||
#else
|
||||
VkFence acquirefence;
|
||||
#endif
|
||||
|
||||
VkPipelineCache pipelinecache;
|
||||
|
||||
|
@ -281,10 +281,6 @@ extern struct vulkaninfo_s
|
|||
struct vk_rendertarg *rendertarg;
|
||||
struct vkframe {
|
||||
struct vkframe *next;
|
||||
#ifndef THREADACQUIRE
|
||||
VkSemaphore vsyncsemaphore;
|
||||
#endif
|
||||
VkSemaphore presentsemaphore;
|
||||
VkCommandBuffer cbuf;
|
||||
struct dynbuffer *dynbufs[DB_MAX];
|
||||
struct descpool *descpools;
|
||||
|
@ -299,7 +295,6 @@ extern struct vulkaninfo_s
|
|||
VkRenderPass shadow_renderpass; //clears depth etc.
|
||||
VkRenderPass renderpass[3]; //initial, resume
|
||||
VkSwapchainKHR swapchain;
|
||||
void *swapchain_mutex; //acquire+present need some syncronisation.
|
||||
uint32_t bufferidx;
|
||||
|
||||
VkFormat depthformat;
|
||||
|
@ -321,7 +316,7 @@ extern struct vulkaninfo_s
|
|||
} *work;
|
||||
void *submitthread;
|
||||
void *submitcondition;
|
||||
void *acquirecondition;
|
||||
void (*dopresent)(struct vkframe *theframe);
|
||||
|
||||
texid_t sourcecolour;
|
||||
texid_t sourcedepth;
|
||||
|
@ -344,8 +339,9 @@ uint32_t vk_find_memory_try(uint32_t typeBits, VkFlags requirements_mask);
|
|||
uint32_t vk_find_memory_require(uint32_t typeBits, VkFlags requirements_mask);
|
||||
|
||||
qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips);
|
||||
void VK_DoPresent(struct vkframe *theframe);
|
||||
|
||||
qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*createSurface)(void));
|
||||
qboolean VK_Init(rendererstate_t *info, const char *sysextname, qboolean (*createSurface)(void), void (*dopresent)(struct vkframe *theframe));
|
||||
void VK_Shutdown(void);
|
||||
|
||||
void VK_R_BloomBlend (texid_t source, int x, int y, int w, int h);
|
||||
|
|
|
@ -45,12 +45,12 @@ int emscriptenfte_setupcanvas(
|
|||
int width,
|
||||
int height,
|
||||
void(*Resized)(int newwidth, int newheight),
|
||||
void(*Mouse)(int devid,int abs,float x,float y,float z,float size),
|
||||
void(*Button)(int devid, int down, int mbutton),
|
||||
int(*Keyboard)(int devid, int down, int keycode, int unicode),
|
||||
void(*Mouse)(unsigned int devid,int abs,float x,float y,float z,float size),
|
||||
void(*Button)(unsigned int devid, int down, int mbutton),
|
||||
int(*Keyboard)(unsigned int devid, int down, int keycode, int unicode),
|
||||
void(*LoadFile)(char *url, char *mime, int filehandle),
|
||||
void(*buttonevent)(int joydev, int button, int ispressed),
|
||||
void(*axisevent)(int joydev, int axis, float value),
|
||||
void(*buttonevent)(unsigned int joydev, int button, int ispressed),
|
||||
void(*axisevent)(unsigned int joydev, int axis, float value),
|
||||
int (*ShouldSwitchToFullscreen)(void)
|
||||
);
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ static void *GLVID_getsdlglfunction(char *functionname)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void IN_JoystickButtonEvent(int joydevid, int button, int ispressed)
|
||||
static void IN_JoystickButtonEvent(unsigned int joydevid, int button, int ispressed)
|
||||
{
|
||||
if (button >= 32+4)
|
||||
return;
|
||||
|
@ -103,7 +103,7 @@ static unsigned int domkeytoshift(unsigned int code)
|
|||
// Con_DPrintf("You just pressed dom key %u, which is quake key %u\n", code, tab[code]);
|
||||
return tab[code];
|
||||
}
|
||||
static int DOM_KeyEvent(int devid, int down, int scan, int uni)
|
||||
static int DOM_KeyEvent(unsigned int devid, int down, int scan, int uni)
|
||||
{
|
||||
extern int shift_down;
|
||||
// Con_Printf("Key %s %i %i:%c\n", down?"down":"up", scan, uni, uni?(char)uni:' ');
|
||||
|
@ -129,7 +129,7 @@ static int DOM_KeyEvent(int devid, int down, int scan, int uni)
|
|||
return true;
|
||||
// return false;
|
||||
}
|
||||
static void DOM_ButtonEvent(int devid, int down, int button)
|
||||
static void DOM_ButtonEvent(unsigned int devid, int down, int button)
|
||||
{
|
||||
if (down == 2)
|
||||
{
|
||||
|
|
|
@ -2960,13 +2960,13 @@ void SCR_HUD_Group9(hud_t *hud)
|
|||
// for frags and players
|
||||
typedef struct sort_teams_info_s
|
||||
{
|
||||
char *name;
|
||||
int frags;
|
||||
int min_ping;
|
||||
int avg_ping;
|
||||
int max_ping;
|
||||
int nplayers;
|
||||
int top, bottom; // leader colours
|
||||
char *name;
|
||||
int frags;
|
||||
int min_ping;
|
||||
int avg_ping;
|
||||
int max_ping;
|
||||
int nplayers;
|
||||
int top, bottom; // leader colours
|
||||
int rlcount; // Number of RL's present in the team. (Cokeman 2006-05-27)
|
||||
}
|
||||
sort_teams_info_t;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue