19 static bool ClampHeading (
float pDt, SDayZPlayerHeadingModel pModel, out
float pLastHeadingDiff)
21 float aDiff = pModel.m_fHeadingAngle - pModel.m_fOrientationAngle;
26 else if (aDiff >
Math.PI)
33 if (pLastHeadingDiff < -Math.PI_HALF && aDiff > 0)
35 aDiff = -
Math.PI + 0.01;
36 pLastHeadingDiff = aDiff;
37 pModel.m_fHeadingAngle = pModel.m_fOrientationAngle + aDiff;
43 else if (pLastHeadingDiff >
Math.PI_HALF && aDiff < 0)
45 aDiff =
Math.PI - 0.01;
46 pLastHeadingDiff = aDiff;
47 pModel.m_fHeadingAngle = pModel.m_fOrientationAngle + aDiff;
54 pLastHeadingDiff = aDiff;
64 static float CONST_ROTLIMIT =
Math.PI * 0.95;
67 static bool RotateOrient (
float pDt, SDayZPlayerHeadingModel pModel, out
float pLastHeadingDiff)
69 float aDiff = pModel.m_fHeadingAngle - pModel.m_fOrientationAngle;
71 while (aDiff < -
Math.PI)
75 while (aDiff >
Math.PI)
82 if (pLastHeadingDiff < -Math.PI_HALF && aDiff > 0)
86 else if (pLastHeadingDiff >
Math.PI_HALF && aDiff < 0)
91 pLastHeadingDiff = aDiff;
92 if (aDiff < -CONST_ROTLIMIT)
95 if (aDiff < -(
Math.PI_HALF + CONST_ROTLIMIT))
101 pModel.m_fOrientationAngle += aDiff + CONST_ROTLIMIT;
104 else if (aDiff > CONST_ROTLIMIT)
107 if (aDiff > (
Math.PI_HALF + CONST_ROTLIMIT))
109 pLastHeadingDiff = 0;
113 pModel.m_fOrientationAngle += aDiff - CONST_ROTLIMIT;
122 static bool RestrictHeading(
float pDt, SDayZPlayerHeadingModel pModel, out
float pLastHeadingDiff, HeadingRestrictData restrictData)
124 pModel.m_fHeadingAngle =
ClampAngle(pModel.m_fHeadingAngle, restrictData);
129 protected static float ClampAngle(
float angle, HeadingRestrictData restrictData)
133 if (restrictData.m_RestrictedR > restrictData.m_RestrictedL)
135 if (angle > restrictData.m_RestrictedL && angle < restrictData.m_RestrictedR)
144 if (angle > restrictData.m_RestrictedR + 90 *
Math.DEG2RAD)
145 return restrictData.m_RestrictedL;
146 else if (angle < restrictData.m_RestrictedL - 90 *
Math.DEG2RAD)
147 return restrictData.m_RestrictedR;
149 return Math.Clamp(angle, restrictData.m_RestrictedL, restrictData.m_RestrictedR);
152 else if (restrictData.m_RestrictedR < restrictData.m_RestrictedL)
154 if ((angle >= -180 && angle < restrictData.m_RestrictedR) || (angle <= 180 && angle > restrictData.m_RestrictedL))
165 testOtherDir =
Math.AbsFloat(restrictData.m_RestrictedR - angle);
166 if (testOtherDir < restrictData.m_AngleRangeInverted - testOtherDir)
167 return restrictData.m_RestrictedR;
169 return restrictData.m_RestrictedL;
173 testOtherDir =
Math.AbsFloat(restrictData.m_RestrictedL - angle);
174 if (testOtherDir < restrictData.m_AngleRangeInverted - testOtherDir)
175 return restrictData.m_RestrictedL;
177 return restrictData.m_RestrictedR;
187 static bool NoHeading(
float pDt, SDayZPlayerHeadingModel pModel, out
float pLastHeadingDiff)
189 pLastHeadingDiff = 0;
190 pModel.m_fHeadingAngle = pModel.m_fOrientationAngle;