mirror of
https://github.com/Q3Rally-Team/q3rally.git
synced 2024-11-25 05:11:00 +00:00
ioquake3 resync to revision 6920 from 6893.
Updated to latest recommended build settings, increased deployment target to 10.7 Further tweaks to Xcode project Now works as well as possible in Xcode 11 Figured out method of referencing GLSL generated C files outside of code directory Update README.md Add C syntax highlighting to readme Simplify glsl -> C stringification Make LCC path resolution more robust GitHub Actions setup Remove old CI system configurations Add status badge to README Fix shader stringify Run apt-get update before installing deps Avoid platform sed differences Run actions on pull request too Use `r_texturemode GL_LINEAR_MIPMAP_LINEAR` by default [sdl] Turn tentative definition into actual definition. Add TOOLS_CFLAGS to build preamble Fix use of TOOLS_CC being reported as CC Use the correct compiler for tools when cross building under cygwin Allow using pulseaudio for SDL audio capture Restore bots crushing unseen player on q3tourney6 in non-CTF Fix the number of weights in the IQM model calculation Fixes a crash when compiling the project on windows in 64 bit mode.
This commit is contained in:
parent
5fd3d16c15
commit
1568196e27
12 changed files with 133 additions and 29 deletions
|
@ -44,7 +44,7 @@ ifndef BUILD_DEFINES
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# ioquake3 svn version that this is based on
|
# ioquake3 svn version that this is based on
|
||||||
IOQ3_REVISION = 6893
|
IOQ3_REVISION = 6920
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
#
|
#
|
||||||
|
@ -271,6 +271,7 @@ VORBISDIR=$(MOUNT_DIR)/libvorbis-1.3.6
|
||||||
OPUSDIR=$(MOUNT_DIR)/opus-1.2.1
|
OPUSDIR=$(MOUNT_DIR)/opus-1.2.1
|
||||||
OPUSFILEDIR=$(MOUNT_DIR)/opusfile-0.9
|
OPUSFILEDIR=$(MOUNT_DIR)/opusfile-0.9
|
||||||
ZDIR=$(MOUNT_DIR)/zlib
|
ZDIR=$(MOUNT_DIR)/zlib
|
||||||
|
TOOLSDIR=$(MOUNT_DIR)/tools
|
||||||
Q3ASMDIR=$(MOUNT_DIR)/tools/asm
|
Q3ASMDIR=$(MOUNT_DIR)/tools/asm
|
||||||
LBURGDIR=$(MOUNT_DIR)/tools/lcc/lburg
|
LBURGDIR=$(MOUNT_DIR)/tools/lcc/lburg
|
||||||
Q3CPPDIR=$(MOUNT_DIR)/tools/lcc/cpp
|
Q3CPPDIR=$(MOUNT_DIR)/tools/lcc/cpp
|
||||||
|
@ -655,7 +656,19 @@ ifdef MINGW
|
||||||
|
|
||||||
ifeq ($(COMPILE_PLATFORM),cygwin)
|
ifeq ($(COMPILE_PLATFORM),cygwin)
|
||||||
TOOLS_BINEXT=.exe
|
TOOLS_BINEXT=.exe
|
||||||
TOOLS_CC=$(CC)
|
|
||||||
|
# Under cygwin the default of using gcc for TOOLS_CC won't work, so
|
||||||
|
# we need to figure out the appropriate compiler to use, based on the
|
||||||
|
# host architecture that we're running under (as tools run on the host)
|
||||||
|
ifeq ($(COMPILE_ARCH),x86_64)
|
||||||
|
TOOLS_MINGW_PREFIXES=x86_64-w64-mingw32 amd64-mingw32msvc
|
||||||
|
endif
|
||||||
|
ifeq ($(COMPILE_ARCH),x86)
|
||||||
|
TOOLS_MINGW_PREFIXES=i686-w64-mingw32 i586-mingw32msvc i686-pc-mingw32
|
||||||
|
endif
|
||||||
|
|
||||||
|
TOOLS_CC=$(firstword $(strip $(foreach TOOLS_MINGW_PREFIX, $(TOOLS_MINGW_PREFIXES), \
|
||||||
|
$(call bin_path, $(TOOLS_MINGW_PREFIX)-gcc))))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIBS= -lws2_32 -lwinmm -lpsapi
|
LIBS= -lws2_32 -lwinmm -lpsapi
|
||||||
|
@ -1253,9 +1266,7 @@ endef
|
||||||
define DO_REF_STR
|
define DO_REF_STR
|
||||||
$(echo_cmd) "REF_STR $<"
|
$(echo_cmd) "REF_STR $<"
|
||||||
$(Q)rm -f $@
|
$(Q)rm -f $@
|
||||||
$(Q)echo "const char *fallbackShader_$(notdir $(basename $<)) =" >> $@
|
$(Q)$(STRINGIFY) $< $@
|
||||||
$(Q)cat $< | sed -e 's/^/\"/;s/$$/\\n\"/' | tr -d '\r' >> $@
|
|
||||||
$(Q)echo ";" >> $@
|
|
||||||
endef
|
endef
|
||||||
|
|
||||||
define DO_BOT_CC
|
define DO_BOT_CC
|
||||||
|
@ -1424,6 +1435,9 @@ endif
|
||||||
@echo " SERVER_CFLAGS:"
|
@echo " SERVER_CFLAGS:"
|
||||||
$(call print_wrapped, $(SERVER_CFLAGS))
|
$(call print_wrapped, $(SERVER_CFLAGS))
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@echo " TOOLS_CFLAGS:"
|
||||||
|
$(call print_wrapped, $(TOOLS_CFLAGS))
|
||||||
|
@echo ""
|
||||||
@echo " LDFLAGS:"
|
@echo " LDFLAGS:"
|
||||||
$(call print_wrapped, $(LDFLAGS))
|
$(call print_wrapped, $(LDFLAGS))
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@ -1529,6 +1543,7 @@ Q3RCC = $(B)/tools/q3rcc$(TOOLS_BINEXT)
|
||||||
Q3CPP = $(B)/tools/q3cpp$(TOOLS_BINEXT)
|
Q3CPP = $(B)/tools/q3cpp$(TOOLS_BINEXT)
|
||||||
Q3LCC = $(B)/tools/q3lcc$(TOOLS_BINEXT)
|
Q3LCC = $(B)/tools/q3lcc$(TOOLS_BINEXT)
|
||||||
Q3ASM = $(B)/tools/q3asm$(TOOLS_BINEXT)
|
Q3ASM = $(B)/tools/q3asm$(TOOLS_BINEXT)
|
||||||
|
STRINGIFY = $(B)/tools/stringify$(TOOLS_BINEXT)
|
||||||
|
|
||||||
LBURGOBJ= \
|
LBURGOBJ= \
|
||||||
$(B)/tools/lburg/lburg.o \
|
$(B)/tools/lburg/lburg.o \
|
||||||
|
@ -1622,6 +1637,10 @@ $(Q3LCC): $(Q3LCCOBJ) $(Q3RCC) $(Q3CPP)
|
||||||
$(echo_cmd) "LD $@"
|
$(echo_cmd) "LD $@"
|
||||||
$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $(Q3LCCOBJ) $(TOOLS_LIBS)
|
$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $(Q3LCCOBJ) $(TOOLS_LIBS)
|
||||||
|
|
||||||
|
$(STRINGIFY): $(TOOLSDIR)/stringify.c
|
||||||
|
$(echo_cmd) "TOOLS_CC $@"
|
||||||
|
$(Q)$(TOOLS_CC) $(TOOLS_CFLAGS) $(TOOLS_LDFLAGS) -o $@ $(TOOLSDIR)/stringify.c $(TOOLS_LIBS)
|
||||||
|
|
||||||
define DO_Q3LCC
|
define DO_Q3LCC
|
||||||
$(echo_cmd) "Q3LCC $<"
|
$(echo_cmd) "Q3LCC $<"
|
||||||
$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) $(BUILD_DEFINES) -o $@ $<
|
$(Q)$(Q3LCC) $(BASEGAME_CFLAGS) $(BUILD_DEFINES) -o $@ $<
|
||||||
|
@ -2795,7 +2814,7 @@ $(B)/renderergl1/%.o: $(RGL1DIR)/%.c
|
||||||
$(B)/renderergl1/tr_altivec.o: $(RGL1DIR)/tr_altivec.c
|
$(B)/renderergl1/tr_altivec.o: $(RGL1DIR)/tr_altivec.c
|
||||||
$(DO_REF_CC_ALTIVEC)
|
$(DO_REF_CC_ALTIVEC)
|
||||||
|
|
||||||
$(B)/renderergl2/glsl/%.c: $(RGL2DIR)/glsl/%.glsl
|
$(B)/renderergl2/glsl/%.c: $(RGL2DIR)/glsl/%.glsl $(STRINGIFY)
|
||||||
$(DO_REF_STR)
|
$(DO_REF_STR)
|
||||||
|
|
||||||
$(B)/renderergl2/glsl/%.o: $(B)/renderergl2/glsl/%.c
|
$(B)/renderergl2/glsl/%.o: $(B)/renderergl2/glsl/%.c
|
||||||
|
@ -3020,7 +3039,7 @@ toolsclean2:
|
||||||
@echo "TOOLS_CLEAN $(B)"
|
@echo "TOOLS_CLEAN $(B)"
|
||||||
@rm -f $(TOOLSOBJ)
|
@rm -f $(TOOLSOBJ)
|
||||||
@rm -f $(TOOLSOBJ_D_FILES)
|
@rm -f $(TOOLSOBJ_D_FILES)
|
||||||
@rm -f $(LBURG) $(DAGCHECK_C) $(Q3RCC) $(Q3CPP) $(Q3LCC) $(Q3ASM)
|
@rm -f $(LBURG) $(DAGCHECK_C) $(Q3RCC) $(Q3CPP) $(Q3LCC) $(Q3ASM) $(STRINGIFY)
|
||||||
|
|
||||||
distclean: clean toolsclean
|
distclean: clean toolsclean
|
||||||
@rm -rf $(BUILD_DIR)
|
@rm -rf $(BUILD_DIR)
|
||||||
|
|
|
@ -30,9 +30,15 @@
|
||||||
; uint8_t qvmcall64(int *programStack, int *opStack, intptr_t *instructionPointers, byte *dataBase);
|
; uint8_t qvmcall64(int *programStack, int *opStack, intptr_t *instructionPointers, byte *dataBase);
|
||||||
|
|
||||||
qvmcall64 PROC
|
qvmcall64 PROC
|
||||||
push rsi ; push non-volatile registers to stack
|
push r12 ; push all non-volatile registers to stack
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
push rdi
|
push rdi
|
||||||
|
push rsi
|
||||||
push rbx
|
push rbx
|
||||||
|
push rbp
|
||||||
|
|
||||||
; need to save pointer in rcx so we can write back the programData value to caller
|
; need to save pointer in rcx so we can write back the programData value to caller
|
||||||
push rcx
|
push rcx
|
||||||
|
|
||||||
|
@ -48,9 +54,14 @@ qvmcall64 PROC
|
||||||
mov dword ptr [rcx], esi ; write back the programStack value
|
mov dword ptr [rcx], esi ; write back the programStack value
|
||||||
mov al, bl ; return opStack offset
|
mov al, bl ; return opStack offset
|
||||||
|
|
||||||
|
pop rbp ; restore all non-volatile registers after the call
|
||||||
pop rbx
|
pop rbx
|
||||||
pop rdi
|
|
||||||
pop rsi
|
pop rsi
|
||||||
|
pop rdi
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
pop r12
|
||||||
|
|
||||||
ret
|
ret
|
||||||
qvmcall64 ENDP
|
qvmcall64 ENDP
|
||||||
|
|
|
@ -3815,7 +3815,7 @@ void BotMapScripts(bot_state_t *bs) {
|
||||||
shootbutton = qfalse;
|
shootbutton = qfalse;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (bs->enemy == i) {
|
else if (gametype < GT_CTF || bs->enemy == i) {
|
||||||
shootbutton = qtrue;
|
shootbutton = qtrue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1081,7 +1081,7 @@ void R_Register( void )
|
||||||
r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE );
|
r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE );
|
||||||
r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "1", CVAR_ARCHIVE );
|
r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "1", CVAR_ARCHIVE );
|
||||||
r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE);
|
r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE);
|
||||||
r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE );
|
r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR", CVAR_ARCHIVE );
|
||||||
r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0",
|
r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0",
|
||||||
CVAR_ARCHIVE | CVAR_LATCH );
|
CVAR_ARCHIVE | CVAR_LATCH );
|
||||||
r_gamma = ri.Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE );
|
r_gamma = ri.Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE );
|
||||||
|
|
|
@ -1346,7 +1346,7 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
||||||
vtxMat[10] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 10];
|
vtxMat[10] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 10];
|
||||||
vtxMat[11] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 11];
|
vtxMat[11] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 11];
|
||||||
|
|
||||||
for( j = 1; j < 3; j++ ) {
|
for( j = 1; j < 4; j++ ) {
|
||||||
if ( blendWeights[j] <= 0.0f ) {
|
if ( blendWeights[j] <= 0.0f ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1304,7 +1304,7 @@ void R_Register( void )
|
||||||
r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE );
|
r_dynamiclight = ri.Cvar_Get( "r_dynamiclight", "1", CVAR_ARCHIVE );
|
||||||
r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "1", CVAR_ARCHIVE );
|
r_dlightBacks = ri.Cvar_Get( "r_dlightBacks", "1", CVAR_ARCHIVE );
|
||||||
r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE);
|
r_finish = ri.Cvar_Get ("r_finish", "0", CVAR_ARCHIVE);
|
||||||
r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_NEAREST", CVAR_ARCHIVE );
|
r_textureMode = ri.Cvar_Get( "r_textureMode", "GL_LINEAR_MIPMAP_LINEAR", CVAR_ARCHIVE );
|
||||||
r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0",
|
r_swapInterval = ri.Cvar_Get( "r_swapInterval", "0",
|
||||||
CVAR_ARCHIVE | CVAR_LATCH );
|
CVAR_ARCHIVE | CVAR_LATCH );
|
||||||
r_gamma = ri.Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE );
|
r_gamma = ri.Cvar_Get( "r_gamma", "1", CVAR_ARCHIVE );
|
||||||
|
|
|
@ -1528,7 +1528,7 @@ void RB_IQMSurfaceAnim( surfaceType_t *surface ) {
|
||||||
vtxMat[10] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 10];
|
vtxMat[10] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 10];
|
||||||
vtxMat[11] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 11];
|
vtxMat[11] = blendWeights[0] * poseMats[12 * data->influenceBlendIndexes[4*influence + 0] + 11];
|
||||||
|
|
||||||
for( j = 1; j < 3; j++ ) {
|
for( j = 1; j < 4; j++ ) {
|
||||||
if ( blendWeights[j] <= 0.0f ) {
|
if ( blendWeights[j] <= 0.0f ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ void (APIENTRYP qglMultiTexCoord2fARB) (GLenum target, GLfloat s, GLfloat t);
|
||||||
void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count);
|
void (APIENTRYP qglLockArraysEXT) (GLint first, GLsizei count);
|
||||||
void (APIENTRYP qglUnlockArraysEXT) (void);
|
void (APIENTRYP qglUnlockArraysEXT) (void);
|
||||||
|
|
||||||
#define GLE(ret, name, ...) name##proc * qgl##name;
|
#define GLE(ret, name, ...) name##proc * qgl##name = NULL;
|
||||||
QGL_1_1_PROCS;
|
QGL_1_1_PROCS;
|
||||||
QGL_1_1_FIXED_FUNCTION_PROCS;
|
QGL_1_1_FIXED_FUNCTION_PROCS;
|
||||||
QGL_DESKTOP_1_1_PROCS;
|
QGL_DESKTOP_1_1_PROCS;
|
||||||
|
|
|
@ -281,12 +281,7 @@ qboolean SNDDMA_Init(void)
|
||||||
#ifdef USE_SDL_AUDIO_CAPTURE
|
#ifdef USE_SDL_AUDIO_CAPTURE
|
||||||
// !!! FIXME: some of these SDL_OpenAudioDevice() values should be cvars.
|
// !!! FIXME: some of these SDL_OpenAudioDevice() values should be cvars.
|
||||||
s_sdlCapture = Cvar_Get( "s_sdlCapture", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
s_sdlCapture = Cvar_Get( "s_sdlCapture", "1", CVAR_ARCHIVE | CVAR_LATCH );
|
||||||
// !!! FIXME: pulseaudio capture records audio the entire time the program is running. https://bugzilla.libsdl.org/show_bug.cgi?id=4087
|
if (!s_sdlCapture->integer)
|
||||||
if (Q_stricmp(SDL_GetCurrentAudioDriver(), "pulseaudio") == 0)
|
|
||||||
{
|
|
||||||
Com_Printf("SDL audio capture support disabled for pulseaudio (https://bugzilla.libsdl.org/show_bug.cgi?id=4087)\n");
|
|
||||||
}
|
|
||||||
else if (!s_sdlCapture->integer)
|
|
||||||
{
|
{
|
||||||
Com_Printf("SDL audio capture support disabled by user ('+set s_sdlCapture 1' to enable)\n");
|
Com_Printf("SDL audio capture support disabled by user ('+set s_sdlCapture 1' to enable)\n");
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,10 @@ void UpdatePaths( const char *lccBinary )
|
||||||
|
|
||||||
strncpy( basepath, lccBinary, basepathsz );
|
strncpy( basepath, lccBinary, basepathsz );
|
||||||
basepath[basepathsz] = 0;
|
basepath[basepathsz] = 0;
|
||||||
p = strrchr( basepath, PATH_SEP );
|
p = strrchr( basepath, '/' );
|
||||||
|
|
||||||
|
if( !p )
|
||||||
|
p = strrchr( basepath, '\\' );
|
||||||
|
|
||||||
if( p )
|
if( p )
|
||||||
{
|
{
|
||||||
|
|
51
engine/code/tools/stringify.c
Normal file
51
engine/code/tools/stringify.c
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
FILE *ifp;
|
||||||
|
FILE *ofp;
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
if(argc < 3)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
char *inFile = argv[1];
|
||||||
|
char *outFile = argv[2];
|
||||||
|
|
||||||
|
ifp = fopen(inFile, "r");
|
||||||
|
if(!ifp)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
ofp = fopen(outFile, "w");
|
||||||
|
if(!ofp)
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
// Strip extension
|
||||||
|
char *base = basename(inFile);
|
||||||
|
*strrchr(base, '.') = '\0';
|
||||||
|
|
||||||
|
fprintf(ofp, "const char *fallbackShader_%s =\n", base);
|
||||||
|
|
||||||
|
while(fgets(buffer, sizeof(buffer), ifp))
|
||||||
|
{
|
||||||
|
// Strip trailing whitespace from line
|
||||||
|
char *end = buffer + strlen(buffer) - 1;
|
||||||
|
while(end >= buffer && isspace(*end))
|
||||||
|
end--;
|
||||||
|
|
||||||
|
end[1] = '\0';
|
||||||
|
|
||||||
|
// Write line enquoted, with a newline
|
||||||
|
fprintf(ofp, "\"%s\\n\"\n", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(ofp, ";\n");
|
||||||
|
|
||||||
|
fclose(ifp);
|
||||||
|
fclose(ofp);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
![Build](https://github.com/ioquake/ioq3/workflows/Build/badge.svg)
|
||||||
|
|
||||||
,---------------------------------------.
|
,---------------------------------------.
|
||||||
| _ _ ____ |
|
| _ _ ____ |
|
||||||
| (_)___ __ _ _ _ __ _| |_____|__ / |
|
| (_)___ __ _ _ _ __ _| |_____|__ / |
|
||||||
|
@ -5,13 +7,13 @@
|
||||||
| |_\___/\__, |\_,_\__,_|_\_\___|___/ |
|
| |_\___/\__, |\_,_\__,_|_\_\___|___/ |
|
||||||
| |_| |
|
| |_| |
|
||||||
| |
|
| |
|
||||||
`---------- http://ioquake3.org --------'
|
`--------- https://ioquake3.org --------'
|
||||||
|
|
||||||
The intent of this project is to provide a baseline Quake 3 which may be used
|
The intent of this project is to provide a baseline Quake 3 which may be used
|
||||||
for further development and baseq3 fun.
|
for further development and baseq3 fun.
|
||||||
Some of the major features currently implemented are:
|
Some of the major features currently implemented are:
|
||||||
|
|
||||||
* SDL backend
|
* SDL 2 backend
|
||||||
* OpenAL sound API support (multiple speaker support and better sound
|
* OpenAL sound API support (multiple speaker support and better sound
|
||||||
quality)
|
quality)
|
||||||
* Full x86_64 support on Linux
|
* Full x86_64 support on Linux
|
||||||
|
@ -45,6 +47,27 @@ If you've got issues that you aren't sure are worth filing as bugs, or just
|
||||||
want to chat, please visit our forums:
|
want to chat, please visit our forums:
|
||||||
http://discourse.ioquake.org
|
http://discourse.ioquake.org
|
||||||
|
|
||||||
|
# Thank You:
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="https://www.digitalocean.com/">Digital Ocean<br/>
|
||||||
|
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/PoweredByDO/DO_Powered_by_Badge_blue.svg" width="201px">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
---
|
||||||
|
<p>
|
||||||
|
<a href="https://www.discourse.org/">Discourse<br/>
|
||||||
|
<img src=
|
||||||
|
"https://user-images.githubusercontent.com/1681963/52239617-e2683480-289c-11e9-922b-5da55472e5b4.png"
|
||||||
|
width="300px"></a>
|
||||||
|
</p>
|
||||||
|
---
|
||||||
|
<p>
|
||||||
|
<a href="https://icculus.org/">icculus dot org<br/>
|
||||||
|
<img src="http://icculus.org/icculus-org-now.png" width="300px"></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
# Compilation and installation
|
# Compilation and installation
|
||||||
|
|
||||||
For *nix
|
For *nix
|
||||||
|
@ -359,11 +382,13 @@ value in the prototype with intptr_t (arg0, arg1, ...stay int).
|
||||||
|
|
||||||
Add the following code snippet to q_shared.h:
|
Add the following code snippet to q_shared.h:
|
||||||
|
|
||||||
|
```c
|
||||||
#ifdef Q3_VM
|
#ifdef Q3_VM
|
||||||
typedef int intptr_t;
|
typedef int intptr_t;
|
||||||
#else
|
#else
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#endif
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
Note if you simply wish to run mods on a 64bit platform you do not need to
|
Note if you simply wish to run mods on a 64bit platform you do not need to
|
||||||
recompile anything since by default Q3 uses a virtual machine system.
|
recompile anything since by default Q3 uses a virtual machine system.
|
||||||
|
|
Loading…
Reference in a new issue