From 2b466592cd19ee55eb996a46b16ef896d2a7823a Mon Sep 17 00:00:00 2001 From: TimePath Date: Sat, 12 Mar 2016 22:15:35 +1100 Subject: [PATCH] _Movetype_UnstickEntity: optimize --- qcsrc/common/physics/movetypes/movetypes.qc | 45 +++++++++++++-------- qcsrc/common/physics/movetypes/movetypes.qh | 2 - 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 0d6b98eaa..de623b503 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -411,8 +411,9 @@ void _Movetype_LinkEdict(entity this, bool touch_triggers) // SV_LinkEdict _Movetype_LinkEdict_TouchAreaGrid(this); } -bool _Movetype_TestEntityPosition(entity this, vector ofs) // SV_TestEntityPosition +bool _Movetype_TestEntityPosition(/*entity this, */ vector ofs) // SV_TestEntityPosition { + SELFPARAM(); // XXX: performance // vector org = this.move_origin + ofs; int cont = this.dphitcontentsmask; @@ -430,24 +431,34 @@ bool _Movetype_TestEntityPosition(entity this, vector ofs) // SV_TestEntityPosi bool _Movetype_UnstickEntity(entity this) // SV_UnstickEntity { - if(!_Movetype_TestEntityPosition(this, '0 0 0')) return true; - if(!_Movetype_TestEntityPosition(this, '-1 0 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 0 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '0 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '0 1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '-1 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 -1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '-1 1 0')) goto success; - if(!_Movetype_TestEntityPosition(this, '1 1 0')) goto success; - for (int i = 1; i <= 17; ++i) + entity oldself = this; + setself(this); + if (!_Movetype_TestEntityPosition(/* this, */ ' 0 0 0')) { + setself(oldself); + return true; + } + #define X(v) if (_Movetype_TestEntityPosition(/* this, */ v)) + X('-1 0 0') X(' 1 0 0') + X(' 0 -1 0') X(' 0 1 0') + X('-1 -1 0') X(' 1 -1 0') + X('-1 1 0') X(' 1 1 0') + #undef X { - if(!_Movetype_TestEntityPosition(this, '0 0 -1' * i)) goto success; - if(!_Movetype_TestEntityPosition(this, '0 0 1' * i)) goto success; + #define X(i) \ + if (_Movetype_TestEntityPosition(/* this, */ '0 0 -1' * i)) \ + if (_Movetype_TestEntityPosition(/* this, */ '0 0 1' * i)) + X(01) X(02) X(03) X(04) X(05) X(06) X(07) X(08) + X(09) X(10) X(11) X(12) X(13) X(14) X(15) X(16) + X(17) + #undef X + { + setself(oldself); + LOG_DEBUGF("Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n", + etof(this), this.classname, vtos(this.move_origin)); + return false; + } } - LOG_DEBUGF("Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n", - etof(this), this.classname, vtos(this.move_origin)); - return false; - : success; + setself(oldself); LOG_DEBUGF("Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n", etof(this), this.classname, vtos(this.move_origin)); _Movetype_LinkEdict(this, true); diff --git a/qcsrc/common/physics/movetypes/movetypes.qh b/qcsrc/common/physics/movetypes/movetypes.qh index 9342ecb21..ada026df9 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qh +++ b/qcsrc/common/physics/movetypes/movetypes.qh @@ -42,8 +42,6 @@ void _Movetype_CheckWaterTransition(entity ent); float _Movetype_CheckWater(entity ent); void _Movetype_LinkEdict_TouchAreaGrid(entity this); void _Movetype_LinkEdict(entity this, float touch_triggers); -float _Movetype_TestEntityPosition(entity this, vector ofs); -float _Movetype_UnstickEntity(entity this); vector _Movetype_ClipVelocity(vector vel, vector norm, float f); void _Movetype_PushEntityTrace(entity this, vector push); float _Movetype_PushEntity(entity this, vector push, float failonstartsolid); -- 2.39.2