From 9e2b89e3860f7ca42a3dfcda37cf14d312a54341 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Thu, 20 Jan 2022 12:18:24 -0800 Subject: [PATCH] NSEntity: BBox will now account for rotation whenever SetModel() is used. --- src/gs-entbase/shared/NSEntity.h | 1 + src/gs-entbase/shared/NSEntity.qc | 52 ++++++++++++++++++++++++++++--- src/shared/math.h | 3 +- src/shared/math.qc | 9 ++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/src/gs-entbase/shared/NSEntity.h b/src/gs-entbase/shared/NSEntity.h index df4ac400..964ab8a1 100644 --- a/src/gs-entbase/shared/NSEntity.h +++ b/src/gs-entbase/shared/NSEntity.h @@ -82,4 +82,5 @@ class NSEntity:NSTrigger virtual void(vector, vector) SetSize; virtual void(string, string) SpawnKey; nonvirtual void(void) Destroy; + virtual void(void) UpdateBounds; }; diff --git a/src/gs-entbase/shared/NSEntity.qc b/src/gs-entbase/shared/NSEntity.qc index 5bbb373a..f0401c26 100644 --- a/src/gs-entbase/shared/NSEntity.qc +++ b/src/gs-entbase/shared/NSEntity.qc @@ -283,6 +283,12 @@ NSEntity::SetSolid(float newSolid) SetSendFlags(BASEFL_CHANGED_SOLID); } +void +NSEntity::UpdateBounds(void) +{ + SetSize(m_vecMins, m_vecMaxs); +} + void NSEntity::SetAngles(vector newAngles) { @@ -291,20 +297,54 @@ NSEntity::SetAngles(vector newAngles) angles = newAngles; SetSendFlags(BASEFL_CHANGED_ANGLES); + UpdateBounds(); } + void NSEntity::SetSize(vector newMins, vector newMaxs) { - float sz = 1.0f; + float flScale = 1.0f; + m_vecMins = newMins; m_vecMaxs = newMaxs; - if (scale != 0.0) - sz = scale; + /* avoid useless computation */ + if (angles != [0,0,0]) { + /* adjust bbox according to rotation */ + vector vecCorner[8]; + newMins = newMaxs = [0,0,0]; + for (int i = 0; i < 8; i++) { + vecCorner[i][0] = (i & 1) ? m_vecMins[0] : m_vecMaxs[0]; + vecCorner[i][1] = (i & 2) ? m_vecMins[1] : m_vecMaxs[1]; + vecCorner[i][2] = (i & 4) ? m_vecMins[2] : m_vecMaxs[2]; + vecCorner[i] += origin; + vecCorner[i] = Math_RotateAroundPivot(vecCorner[i], origin, angles[1]); + vecCorner[i] -= origin; - setsize(this, m_vecMins * sz, m_vecMaxs * sz); + if (!(vecCorner[i][0] <= newMaxs[0])) + newMaxs[0] = vecCorner[i][0]; + if (!(vecCorner[i][1] <= newMaxs[1])) + newMaxs[1] = vecCorner[i][1]; + if (!(vecCorner[i][2] <= newMaxs[2])) + newMaxs[2] = vecCorner[i][2]; + + if (!(vecCorner[i][0] >= newMins[0])) + newMins[0] = vecCorner[i][0]; + if (!(vecCorner[i][1] >= newMins[1])) + newMins[1] = vecCorner[i][1]; + if (!(vecCorner[i][2] >= newMins[2])) + newMins[2] = vecCorner[i][2]; + } + } + + /* 0.0 is never valid, if you want it to disappear do something else */ + if (scale != 0.0) + flScale = scale; + + setsize(this, newMins * flScale, newMaxs * flScale); SetSendFlags(BASEFL_CHANGED_SIZE); } + void NSEntity::SetOrigin(vector newOrigin) { @@ -315,13 +355,15 @@ NSEntity::SetOrigin(vector newOrigin) SetSendFlags(BASEFL_CHANGED_ORIGIN); } - void NSEntity::SetModel(string newModel) { model = newModel; setmodel(this, newModel); + + /* mins/maxs have been updated by setmodel */ SetSize(mins, maxs); + SetSendFlags(BASEFL_CHANGED_MODELINDEX); } void diff --git a/src/shared/math.h b/src/shared/math.h index 9dad9fc0..4d2ee63b 100644 --- a/src/shared/math.h +++ b/src/shared/math.h @@ -20,4 +20,5 @@ float Math_LerpAngle(float fStart, float fEnd, float fAmount); float Math_Lerp(float fA, float fB, float fPercent); float Math_FixDelta(float fDelta); vector Math_Reflect(vector v1, vector v2); -vector Math_RandomVector(float flyup); \ No newline at end of file +vector Math_RandomVector(float flyup); +vector Math_RotateAroundPivot(vector pos, vector pivot, float degr); \ No newline at end of file diff --git a/src/shared/math.qc b/src/shared/math.qc index 67be39d5..c1408927 100644 --- a/src/shared/math.qc +++ b/src/shared/math.qc @@ -58,4 +58,13 @@ Math_RandomVector(float fFlyUp) } return tmp * 2.0f; +} + +vector +Math_RotateAroundPivot(vector pos, vector pivot, float degr) +{ + vector new = pos; + new[0] = pivot[0] + (pos[0] - pivot[0]) * cos(degr) - (pos[1] - pivot[1]) * sin(degr); + new[1] = pivot[1] + (pos[0] - pivot[0]) * sin(degr) + (pos[1] - pivot[1]) * cos(degr); + return new; } \ No newline at end of file