From b68ae63023f5117b235fd2c5185566d2454bfeba Mon Sep 17 00:00:00 2001 From: bones_was_here Date: Fri, 1 Sep 2023 21:19:27 +1000 Subject: [PATCH] Add fallback path for when engine lacks DP_QC_FINDBOX --- qcsrc/common/checkextension.qc | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/qcsrc/common/checkextension.qc b/qcsrc/common/checkextension.qc index 4906f8468..3e1a69f00 100644 --- a/qcsrc/common/checkextension.qc +++ b/qcsrc/common/checkextension.qc @@ -1,5 +1,32 @@ #include "checkextension.qh" +#ifdef GAMEQC +entity findbox_tofield_Fallback(vector mins, vector maxs, .entity tofield) +{ + // 0.03125 minimum radius because findradius returns no results if radius is zero + // but findbox for a zero-sized box returns entities touching the specified point + entity chain = findradius_tofield(0.5 * (mins + maxs), max(0.03125, 0.5 * vlen(maxs - mins)), tofield); + entity prev = NULL; + for (entity e = chain; e; e = e.tofield) + { + if (boxesoverlap(e.absmin, e.absmax, mins, maxs)) + prev = e; + else // not in box so remove from chain + { + if (prev) + prev.tofield = e.tofield; + else + chain = chain.tofield; + } + } + return chain; +} +entity findbox_Fallback(vector mins, vector maxs) +{ + return findbox_tofield_Fallback(mins, maxs, chain); +} +#endif // GAMEQC + void CheckEngineExtensions(void) { if (!cvar("pr_checkextension")) @@ -20,5 +47,14 @@ void CheckEngineExtensions(void) } #endif +#ifdef GAMEQC + if (!checkextension("DP_QC_FINDBOX")) + { + LOG_WARN("Engine lacks DP_QC_FINDBOX, performance will be suboptimal."); + findbox = findbox_Fallback; + findbox_tofield = findbox_tofield_Fallback; + } +#endif + // TODO: add proper warns/errors for other extensions we depend on } -- 2.39.2