diff --git a/CMakeLists.txt b/CMakeLists.txt index 21da7183..2b4ba611 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -855,6 +855,38 @@ ELSE() ENDIF() ENDIF() +#ODE Physics library plugin +SET(FTE_PLUG_ODE true CACHE STRING "Compile ODE rigid body physics plugin.") +SET_PROPERTY(CACHE FTE_PLUG_ODE PROPERTY STRINGS false true static) +IF(FTE_PLUG_ODE) + FIND_PATH(LIBODE_INCLUDE_DIR ode/ode.h) + IF (LIBODE_INCLUDE_DIR) + FIND_LIBRARY(LIBODE_LIBRARY ode) + ENDIF() + IF (LIBODE_LIBRARY) + IF (FTE_PLUG_ODE STREQUAL "static") + #SET (FTE_COMMON_FILES ${FTE_COMMON_FILES} engine/common/com_phys_ode.c) + SET(FTE_LIB_DEFINES "${FTE_LIB_DEFINES};USE_INTERNAL_ODE;ODE_STATIC") + SET(FTE_LIBS ${FTE_LIBS} ${LIBODE_LIBRARY}) + SET(FTESV_LIBS ${FTE_LIBS} ${LIBODE_LIBRARY}) + SET(FTE_INCLUDES ${FTE_INCLUDES} ${ODE_INCLUDE_DIRS}) + ELSE() + ADD_LIBRARY(plug_ode MODULE + plugins/plugin.c + engine/common/com_phys_ode.c + engine/common/mathlib.c + ) + TARGET_INCLUDE_DIRECTORIES(plug_ode PUBLIC ${ODE_INCLUDE_DIRS}) + SET_TARGET_PROPERTIES(plug_ode PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN;ODE_STATIC") + TARGET_LINK_LIBRARIES(plug_ode ${SYS_LIBS} ${LIBODE_LIBRARY}) + + EMBED_PLUGIN_META(ode "ODE Physics" "Provides Rigid Body Physics behaviours.") + ENDIF() + ELSE() + MESSAGE(WARNING "ODE library not found, no ode plugin for you") + ENDIF() +ENDIF() + IF(ANDROID) #android sucks. everything is a library. so we build the engine as a shared library and completely ignore dedicated servers+tools SET(FTE_ENGINE_FTEDROID true CACHE BOOL "Compile ftedroid engine shared library.") @@ -865,6 +897,7 @@ IF(ANDROID) ${FTE_CLIENT_FILES} ) SET_TARGET_PROPERTIES(ftedroid PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_DEFINES};${FTE_REVISON}") + TARGET_INCLUDE_DIRECTORIES(ftedroid PUBLIC ${FTE_INCLUDES}) TARGET_LINK_LIBRARIES(ftedroid ${FTE_LIBS} ) SET(INSTALLTARGS ${INSTALLTARGS} ftedroid) ENDIF() @@ -879,6 +912,7 @@ ELSE() ${FTE_SERVER_FILES} ) SET_TARGET_PROPERTIES(fteqw PROPERTIES COMPILE_DEFINITIONS "${FTE_LIB_DEFINES};${FTE_DEFINES};${FTE_REVISON}") + TARGET_INCLUDE_DIRECTORIES(fteqw PUBLIC ${FTE_INCLUDES}) TARGET_LINK_LIBRARIES(fteqw ${FTE_LIBS}) SET(INSTALLTARGS ${INSTALLTARGS} fteqw) ENDIF() @@ -891,6 +925,7 @@ ELSE() ${FTE_SERVER_FILES} ) SET_TARGET_PROPERTIES(fteqw-sv PROPERTIES COMPILE_DEFINITIONS "SERVERONLY;${FTE_LIB_DEFINES};${FTESV_DEFINES};${FTE_REVISON}") + TARGET_INCLUDE_DIRECTORIES(fteqw-sv PUBLIC ${FTE_INCLUDES}) TARGET_LINK_LIBRARIES(fteqw-sv ${FTESV_LIBS}) SET(INSTALLTARGS ${INSTALLTARGS} fteqw-sv) ENDIF() @@ -903,6 +938,7 @@ ELSE() ${FTE_CLIENT_FILES} ) SET_TARGET_PROPERTIES(fteqw-cl PROPERTIES COMPILE_DEFINITIONS "CLIENTONLY;${FTE_LIB_DEFINES};${FTE_DEFINES};${FTE_REVISON}") + TARGET_INCLUDE_DIRECTORIES(fteqw-cl PUBLIC ${FTE_INCLUDES}) TARGET_LINK_LIBRARIES(fteqw-cl ${FTE_LIBS}) SET(INSTALLTARGS ${INSTALLTARGS} fteqw-cl) ENDIF() @@ -1179,29 +1215,6 @@ ENDIF() # ENDIF() #ENDIF() -#ODE Physics library plugin -SET(FTE_PLUG_ODE true CACHE BOOL "Compile ODE rigid body physics plugin.") -IF(FTE_PLUG_ODE) - FIND_PATH(LIBODE_INCLUDE_DIR ode/ode.h) - IF (LIBODE_INCLUDE_DIR) - FIND_LIBRARY(LIBODE_LIBRARY ode) - ENDIF() - IF (LIBODE_LIBRARY) - ADD_LIBRARY(plug_ode MODULE - plugins/plugin.c - engine/common/com_phys_ode.c - engine/common/mathlib.c - ) - TARGET_INCLUDE_DIRECTORIES(plug_ode PUBLIC ${ODE_INCLUDE_DIRS}) - SET_TARGET_PROPERTIES(plug_ode PROPERTIES COMPILE_DEFINITIONS "FTEPLUGIN;ODE_STATIC") - TARGET_LINK_LIBRARIES(plug_ode ${SYS_LIBS} ${LIBODE_LIBRARY}) - - EMBED_PLUGIN_META(ode "ODE Physics" "Provides Rigid Body Physics behaviours.") - ELSE() - MESSAGE(WARNING "ODE library not found, no ode plugin for you") - ENDIF() -ENDIF() - #EzQuake Hud port plugin SET(FTE_PLUG_EZHUD true CACHE BOOL "Compile MoreQuakeWorld Hud plugin .") IF(FTE_PLUG_EZHUD) diff --git a/engine/Makefile b/engine/Makefile index 7cfc233f..8e170831 100644 --- a/engine/Makefile +++ b/engine/Makefile @@ -123,7 +123,7 @@ endif FTE_CONFIG?=fteqw ifneq ($(findstring msvc,$(FTE_TARGET)),msvc) ifeq (,$(FTE_CONFIG_EXTRA)) - export FTE_CONFIG_EXTRA := $(shell $(CC) -xc -E -P -DFTE_TARGET_$(FTE_TARGET) -DCOMPILE_OPTS common/config_$(FTE_CONFIG).h) + export FTE_CONFIG_EXTRA := $(shell $(CC) -xc -E -P -DFTE_TARGET_$(FTE_TARGET) -DCOMPILE_OPTS $(CFLAGS) common/config_$(FTE_CONFIG).h) endif endif BRANDFLAGS+=-DCONFIG_FILE_NAME=config_$(FTE_CONFIG).h $(FTE_CONFIG_EXTRA) @@ -156,8 +156,13 @@ ifneq (,$(findstring -Os,$(FTE_CONFIG_EXTRA))) CPUOPTIMIZATIONS+=-Os BRANDFLAGS:=$(filter-out -O%,$(BRANDFLAGS)) endif +ifneq (,$(findstring DLINK_ODE,$(FTE_CONFIG_EXTRA))) + #ode library will be statically linked. + LINK_ODE=1 +endif ifneq (,$(findstring DLINK_INTERNAL_BULLET,$(FTE_CONFIG_EXTRA))) - INTERNAL_BULLET=1 #bullet plugin will be built into the exe itself + #bullet plugin will be built into the exe itself + INTERNAL_BULLET=1 endif ifeq ($(BITS),64) @@ -1040,6 +1045,10 @@ ifeq (1,$(LINK_ZLIB)) CLIENTLIBFLAGS+=-DZLIB_STATIC CLIENTLDDEPS+=-lz endif +ifeq (1,$(LINK_ODE)) + ALL_CFLAGS+=$(shell $(PKGCONFIG) ode --cflags --silence-errors) -DODE_STATIC + COMMONLDDEPS+=$(shell $(PKGCONFIG) ode --libs --silence-errors) +endif ifeq (1,$(strip $(INTERNAL_BULLET))) COMMON_OBJS+=com_phys_bullet.o ALL_CFLAGS+=-I/usr/include/bullet -I$(ARCHLIBS)/bullet3-$(BULLETVER)/src diff --git a/engine/client/render.h b/engine/client/render.h index cffe4943..5e61d10e 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -726,8 +726,15 @@ extern cvar_t gl_playermip; extern cvar_t r_lightmap_saturation; +#ifdef FTEPLUGIN //evil hack... boo hiss. +extern cvar_t *cvar_r_meshpitch; +extern cvar_t *cvar_r_meshroll; +#define r_meshpitch (*cvar_r_meshpitch) +#define r_meshroll (*cvar_r_meshroll) +#else extern cvar_t r_meshpitch; extern cvar_t r_meshroll; //gah! +#endif extern cvar_t vid_hardwaregamma; enum { diff --git a/engine/common/com_phys_ode.c b/engine/common/com_phys_ode.c index 12ffda2c..b42ea61e 100644 --- a/engine/common/com_phys_ode.c +++ b/engine/common/com_phys_ode.c @@ -27,7 +27,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //if we're not building as an fte-specific plugin, we must be being built as part of the fte engine itself. //(no, we don't want to act as a plugin for ezquake...) #ifndef FTEPLUGIN -#define FTEENGINE #define FTEPLUGIN #define Plug_Init Plug_ODE_Init #endif @@ -60,11 +59,11 @@ static int VectorCompare (const vec3_t v1, const vec3_t v2) return 1; } +cvar_t *cvar_r_meshpitch; +cvar_t *cvar_r_meshroll; #endif static rbeplugfuncs_t *rbefuncs; -cvar_t r_meshpitch; -cvar_t r_meshroll; //============================================================================ // physics engine support @@ -88,6 +87,9 @@ cvar_t r_meshroll; #define dDOUBLE #include "ode/ode.h" #else +#ifndef ODE_DYNAMIC +#define ODE_DYNAMIC +#endif #ifdef WINAPI // ODE does not use WINAPI #define ODE_API VARGS /*vargs because fte likes to be compiled fastcall (vargs is defined as cdecl...)*/ @@ -736,6 +738,11 @@ dGeomID (ODE_API *dCreateTriMesh)(dSpaceID space, dTriMeshDataID Data, d //int (ODE_API *dGeomTriMeshGetTriangleCount )(dGeomID g); //void (ODE_API *dGeomTriMeshDataUpdate)(dTriMeshDataID g); +typedef void dMessageFunction (int errnum, const char *msg, va_list ap); +void (ODE_API *dSetErrorHandler) (dMessageFunction *fn); +void (ODE_API *dSetDebugHandler) (dMessageFunction *fn); +void (ODE_API *dSetMessageHandler) (dMessageFunction *fn); + static dllfunction_t odefuncs[] = { // {"dGetConfiguration", (void **) &dGetConfiguration}, @@ -1182,6 +1189,10 @@ static dllfunction_t odefuncs[] = // {"dGeomTriMeshGetPoint", (void **) &dGeomTriMeshGetPoint}, // {"dGeomTriMeshGetTriangleCount", (void **) &dGeomTriMeshGetTriangleCount}, // {"dGeomTriMeshDataUpdate", (void **) &dGeomTriMeshDataUpdate}, + + {(void **) &dSetErrorHandler, "dSetErrorHandler"}, + {(void **) &dSetDebugHandler, "dSetDebugHandler"}, + {(void **) &dSetMessageHandler, "dSetMessageHandler"}, {NULL, NULL} }; @@ -1241,14 +1252,14 @@ static void World_ODE_RunCmd(world_t *world, rbecommandqueue_t *cmd); #define vsnprintf(s,l,f,a) _vsnprintf(s,l,f,a);string[sizeof(string)-1] = 0; #endif -void MyODEErrorHandler (int errnum, const char *msg, va_list ap) +static void MyODEErrorHandler (int errnum, const char *msg, va_list ap) { char string[1024]; vsnprintf (string,sizeof(string), msg, ap); string[sizeof(string)-1] = 0; - Sys_Errorf("ODE ERROR %i: %s", errnum, string); + Sys_Error("ODE ERROR %i: %s", errnum, string); } -void MyODEMessageHandler (int errnum, const char *msg, va_list ap) +static void MyODEMessageHandler (int errnum, const char *msg, va_list ap) { char string[1024]; vsnprintf (string,sizeof(string), msg, ap); @@ -1299,7 +1310,7 @@ static qboolean World_ODE_Init(void) #ifdef ODE_DYNAMIC // Load the DLL - ode_dll = pSys_LoadLibrary(dllname, odefuncs); + ode_dll = plugfuncs->LoadDLL(dllname, odefuncs); if (ode_dll) #endif { @@ -1317,7 +1328,7 @@ static qboolean World_ODE_Init(void) # else Con_Printf("ode library not compiled for double precision - incompatible! Not using ODE physics.\n"); # endif - pSys_CloseLibrary(ode_dll); + plugfuncs->CloseDLL(ode_dll); ode_dll = NULL; } #endif @@ -1326,6 +1337,7 @@ static qboolean World_ODE_Init(void) #ifdef ODE_DYNAMIC if (!ode_dll) { + Con_Printf("ODE plugin failed: \"%s\" library missing.\n", dllname); return false; } #endif @@ -1344,7 +1356,7 @@ static void World_ODE_Shutdown(void) { dCloseODE(); #ifdef ODE_DYNAMIC - pSys_CloseLibrary(ode_dll); + plugfuncs->CloseDLL(ode_dll); ode_dll = NULL; #endif } @@ -2265,7 +2277,7 @@ static void World_ODE_Frame_BodyFromEntity(world_t *world, wedict_t *ed) dMassSetCylinderTotal(&mass, massval, axisindex+1, radius, length); break; default: - Sys_Errorf("World_ODE_BodyFromEntity: unrecognized solid value %i was accepted by filter\n", solid); + Sys_Error("World_ODE_BodyFromEntity: unrecognized solid value %i was accepted by filter\n", solid); } Matrix3x4_InvertTo4x4_Simple(ed->rbe.offsetmatrix, ed->rbe.offsetimatrix); ed->rbe.massbuf = BZ_Malloc(sizeof(dMass)); @@ -2738,8 +2750,10 @@ static void QDECL World_ODE_Start(world_t *world) memset(ctx, 0, sizeof(*ctx)); world->rbe = &ctx->pub; +#ifndef FTEENGINE r_meshpitch.value = cvarfuncs->GetFloat("r_meshpitch"); r_meshroll.value = cvarfuncs->GetFloat("r_meshroll"); +#endif VectorAvg(world->worldmodel->mins, world->worldmodel->maxs, center); VectorSubtract(world->worldmodel->maxs, center, extents); @@ -2831,12 +2845,11 @@ static void QDECL Plug_ODE_Shutdown(void) qboolean Plug_Init(void) { -#ifndef ODE_STATIC - CHECKBUILTIN(Sys_LoadLibrary); - CHECKBUILTIN(Sys_CloseLibrary); -#endif - rbefuncs = plugfuncs->GetEngineInterface("RBE", sizeof(*rbefuncs)); +#ifndef FTEENGINE + cvar_r_meshpitch = cvarfuncs->GetNVFDG("r_meshpitch", "1", 0, NULL, NULL); + cvar_r_meshroll = cvarfuncs->GetNVFDG("r_meshroll", "1", 0, NULL, NULL); +#endif if (rbefuncs && ( rbefuncs->version < RBEPLUGFUNCS_VERSION || rbefuncs->wedictsize != sizeof(wedict_t))) rbefuncs = NULL; @@ -2845,13 +2858,6 @@ qboolean Plug_Init(void) Con_Printf("ODE plugin failed: Engine is incompatible.\n"); return false; } -#ifndef ODE_STATIC - if (!BUILTINISVALID(Sys_LoadLibrary) || !BUILTINISVALID(Sys_CloseLibrary)) - { - Con_Printf("ODE plugin failed: Engine too old.\n"); - return false; - } -#endif if (!rbefuncs || !rbefuncs->RegisterPhysicsEngine) Con_Printf("ODE plugin failed: Engine doesn't support physics engine plugins.\n"); @@ -2861,7 +2867,6 @@ qboolean Plug_Init(void) { if (!World_ODE_Init()) { - Con_Printf("ODE plugin failed: ODE library missing.\n"); rbefuncs->UnregisterPhysicsEngine("ODE"); return false; } diff --git a/engine/common/config_fteqw.h b/engine/common/config_fteqw.h index 876692fb..40d2cffe 100644 --- a/engine/common/config_fteqw.h +++ b/engine/common/config_fteqw.h @@ -221,5 +221,9 @@ //enable some staticaly linked libraries -DLINK_FREETYPE //international text requires international fonts. +#if defined(USE_INTERNAL_ODE) && !defined(ODE_DYNAMIC) +-DLINK_ODE +#endif + //-Os //optimise for size instead of speed. less cpu cache needed means that its sometimes faster anyway. #endif diff --git a/engine/common/plugin.c b/engine/common/plugin.c index fbc1975e..903ed796 100644 --- a/engine/common/plugin.c +++ b/engine/common/plugin.c @@ -14,17 +14,24 @@ static struct plugin_s *q3plug; #ifdef PLUGINS +#define Q_snprintf Q_snprintfz +#define Q_strlcpy Q_strncpyz +#define Q_strlcat Q_strncatz +#define Sys_Errorf Sys_Error + #ifdef MODELFMT_GLTF - #define Q_snprintf Q_snprintfz - #define Q_strlcpy Q_strncpyz - #define Q_strlcat Q_strncatz #include "../plugins/models/gltf.c" #endif +#ifdef USE_INTERNAL_ODE + #include "../engine/common/com_phys_ode.c" +#endif cvar_t plug_sbar = CVARD("plug_sbar", "3", "Controls whether plugins are allowed to draw the hud, rather than the engine (when allowed by csqc). This is typically used to permit the ezhud plugin without needing to bother unloading it.\n=0: never use hud plugins.\n&1: Use hud plugins in deathmatch.\n&2: Use hud plugins in singleplayer/coop.\n=3: Always use hud plugins (when loaded)."); cvar_t plug_loaddefault = CVARD("plug_loaddefault", "1", "0: Load plugins only via explicit plug_load commands\n1: Load built-in plugins and those selected via the package manager\n2: Scan for misc plugins, loading all that can be found, but not built-ins.\n3: Scan for plugins, and then load any built-ins"); -qboolean Plug_Q3_Init(void); +extern qboolean Plug_Q3_Init(void); +extern qboolean Plug_Bullet_Init(void); +extern qboolean Plug_ODE_Init(void); static struct { const char *name; diff --git a/engine/common/pr_common.h b/engine/common/pr_common.h index d1222a85..435219ef 100644 --- a/engine/common/pr_common.h +++ b/engine/common/pr_common.h @@ -1,6 +1,9 @@ +#ifndef PR_COMMON_H +#define PR_COMMON_H #ifdef __cplusplus extern "C" { #endif + #include "progtype.h" #include "progslib.h" @@ -1173,3 +1176,4 @@ enum #ifdef __cplusplus }; #endif +#endif