5class WeaponLiftDiagData
11 float m_WeaponStartDist
12 float m_WeaponEndDist;
13 float m_EffectiveAttachmentLength;
14 float m_ObstructionDistanceCfg;
15 float m_ObstructionDistance;
18 float m_RayRadiusOverride;
19 ref RaycastRVResult m_RayResult;
23 vector m_LastPosition;
26 float m_InterpInTimeLift;
27 float m_InterpOutTime;
28 float m_InterpCurrTime;
29 float m_InterpCurrValue;
30 float m_InterpTgtValue;
31 float m_InterpSmoothValue;
41 for (
int i = 0; i < 4; ++i)
m_Transform[i] = transform[i];
45 void SetAimAngles(
float udAngle,
float lrAngle,
float udAngle11,
float lrAngle11)
49 m_AimUD11 = udAngle11;
50 m_AimLR11 = lrAngle11;
54 void SetWeaponRayParams(vector rayOrigin, vector rayDirection,
float weaponStartDist,
float weaponEndDist,
float effectiveAttachmentLength,
float obstructionDistanceCfg,
float obstructionDistance,
float rayRadius)
57 m_Direction = rayDirection;
58 m_WeaponStartDist = weaponStartDist;
59 m_WeaponEndDist = weaponEndDist;
60 m_EffectiveAttachmentLength = effectiveAttachmentLength;
61 m_ObstructionDistanceCfg = obstructionDistanceCfg;
62 m_ObstructionDistance = obstructionDistance;
63 m_RayRadius = rayRadius;
67 void SetIntersectionParams(RaycastRVResult rayResult,
float hitFraction = 0,
float hitDistance = 0)
69 m_RayResult = rayResult;
70 m_HitFraction = hitFraction;
71 m_HitDistance = hitDistance;
75 void SetLastPosition(vector lastPosition)
77 m_LastPosition = lastPosition;
81 void SetInterpolation(
float inTime,
float inTimeLift,
float outTime,
float currentTime,
float smoothValue,
float currentValue,
float targetValue)
83 m_InterpInTime = inTime;
84 m_InterpInTimeLift = inTimeLift;
85 m_InterpOutTime = outTime;
86 m_InterpCurrTime = currentTime;
87 m_InterpSmoothValue = smoothValue;
88 m_InterpCurrValue = currentValue;
89 m_InterpTgtValue = targetValue;
96 SetIntersectionParams(null, 0, 0);
97 SetWeaponRayParams(vector.Zero, vector.Zero, 0, 0, 0, 0, 0, 0);
98 SetLastPosition(vector.Zero);
99 SetInterpolation(0,0,0,0,0,0,0);
100 SetAimAngles(0,0,0,0);
108 private ref WeaponLiftDiagData
m_Data =
new WeaponLiftDiagData();
110 private const int COLOR_START = 0xFF2ECC71;
111 private const int COLOR_END = 0xFF4B77BE;
112 private const int COLOR_END_NOATTACH = 0xFFF7CA18;
113 private const int COLOR_OBSTRUCTION = 0xFFFF00FF;
114 private const int COLOR_HIT = 0xFFFF0000;
115 private const int COLOR_GUIDE = 0xC03A3A3A;
116 private const int COLOR_WEAPON = 0x1FFFFFFF;
117 private const int COLOR_LAST_POS = 0x3AF7CA18;
119 private bool m_bDrawGizmos =
true;
120 private bool m_bDrawTransform =
false;
121 private bool m_bSmallShapes =
false;
122 private bool m_bZBuffer =
false;
123 private bool m_bWireOnly =
true;
124 private bool m_bForceRaised =
false;
125 private int m_iColorCrosshair=
false;
127 private int m_iCrosshairR = 255;
128 private int m_iCrosshairG = 0;
129 private int m_iCrosshairB = 0;
130 private int m_iCrosshairA = 255;
132 private float m_fCrosshairBlendPow = 1;
135 WeaponLiftDiagData
Data()
147 void DrawDiag(
int mode,
float deltaTime)
149 const int MODE_BASIC = 1;
150 const int MODE_EXTENDED = 2;
153 bool wasColoringCrosshair = m_iColorCrosshair;
155 WeaponLiftDiagData data =
m_Data;
159 DbgUI.Begin(
"Weapon Lift/Obstruction Diag");
162 int gray = 0x80FFFFFF;
163 int darkObst = gray&COLOR_OBSTRUCTION;
164 int endNoAttachCol = gray & COLOR_END_NOATTACH;
165 DbgUI.ColoredText(
COLOR_WHITE,
"Weapon properties");
166 DbgUI.ColoredText(COLOR_START,
" weaponStartDist: " + data.m_WeaponStartDist);
167 DbgUI.ColoredText(
COLOR_WHITE,
" weaponLength: " + (data.m_WeaponEndDist - data.m_WeaponStartDist));
168 DbgUI.ColoredText(COLOR_END,
" weaponEndDist: " + data.m_WeaponEndDist);
169 if (data.m_EffectiveAttachmentLength > 0)
171 DbgUI.ColoredText(gray,
" attachmentLength: " + data.m_EffectiveAttachmentLength);
172 DbgUI.ColoredText(endNoAttachCol,
" distNoAttachment: " + (data.m_WeaponEndDist-data.m_EffectiveAttachmentLength));
175 DbgUI.ColoredText(COLOR_OBSTRUCTION,
" obstructionDist(cfg): " + data.m_ObstructionDistanceCfg);
176 if (DbgUI.FloatOverride(
"weaponObstruction", data.m_ObstructionDistance, 0.0, data.m_WeaponEndDist - data.m_EffectiveAttachmentLength))
178 data.m_ObstructionDistance += data.m_EffectiveAttachmentLength;
181 DbgUI.ColoredText(darkObst,
" obstructionDist(act): " + data.m_ObstructionDistance);
182 DbgUI.ColoredText(COLOR_HIT,
" hitDistance: " + data.m_HitDistance);
183 DbgUI.PushID_Str(
"rayRadiusText");
184 DbgUI.ColoredText(0xFFAAAAAA,
" rayRadius: " + data.m_RayRadius );
188 float rayRadius = data.m_RayRadius;
189 if (DbgUI.FloatOverride(
"rayRadiusOverride", rayRadius, 0.0, 0.200, 1000))
191 data.m_RayRadiusOverride = rayRadius;
195 data.m_RayRadiusOverride = rayRadius;
202 DbgUI.Check(
"Force raised", m_bForceRaised);
203 TStringArray crossMode = {
"Off",
"On Obstruction",
"On Lift",
"On Both (Blend)" };
204 DbgUI.Combo(
"Color crosshair", m_iColorCrosshair, crossMode);
208 if (m_iColorCrosshair)
211 float r = m_iCrosshairR;
212 float g = m_iCrosshairG;
213 float b = m_iCrosshairB;
214 float a = m_iCrosshairA;
215 DbgUI.ColoredText(
ARGB(m_iCrosshairA, m_iCrosshairR, m_iCrosshairG, m_iCrosshairB),
" -|-");
217 DbgUI.SliderFloat(
"Red: ", r, 0, 255);
219 DbgUI.PushID_Str(
"ObstructionDiagColorR");
220 DbgUI.ColoredText(0xFFFF0000, m_iCrosshairR.ToString());
223 DbgUI.SliderFloat(
"Green: ", g, 0, 255);
225 DbgUI.PushID_Str(
"ObstructionDiagColorG");
226 DbgUI.ColoredText(0xFF00FF00, m_iCrosshairG.ToString());
229 DbgUI.SliderFloat(
"Blue: ", b, 0, 255);
231 DbgUI.PushID_Str(
"ObstructionDiagColorB");
232 DbgUI.ColoredText(0xFF0000FF, m_iCrosshairB.ToString());
235 DbgUI.SliderFloat(
"Alpha: ", a, 0, 255);
237 DbgUI.PushID_Str(
"ObstructionDiagColorA");
238 DbgUI.ColoredText(0xAAFFFFFF, m_iCrosshairA.ToString());
245 float pow = m_fCrosshairBlendPow * 5000;
246 DbgUI.SliderFloat(
"BlendPow: ", pow, 1, 5000);
250 m_fCrosshairBlendPow = pow;
256 if (mode > MODE_BASIC)
259 DbgUI.ColoredText(
COLOR_WHITE,
"Intersection data");
260 if (data.m_RayResult && data.m_RayResult.surface)
262 DbgUI.Text(
" Name: " + data.m_RayResult.surface.GetName());
263 DbgUI.Text(
" EntryName: " + data.m_RayResult.surface.GetEntryName());
264 DbgUI.Text(
" SurfaceType: " + data.m_RayResult.surface.GetSurfaceType());
266 DbgUI.Text(
" IsPassThrough: " + data.m_RayResult.surface.IsPassthrough());
267 DbgUI.Text(
" IsSolid: " + data.m_RayResult.surface.IsSolid());
269 DbgUI.Text(
" HitFraction: " + data.m_HitFraction);
273 DbgUI.Text(
" Name: - " );
274 DbgUI.Text(
" EntryName: - " );
275 DbgUI.Text(
" SurfaceType: - " );
277 DbgUI.Text(
" IsPassThrough: - " );
278 DbgUI.Text(
" IsSolid: - " );
280 DbgUI.Text(
" HitFraction: - " );
286 if (mode > MODE_BASIC)
290 DbgUI.Text(
" In time: " + data.m_InterpInTime);
291 DbgUI.Text(
" In time lift: " + data.m_InterpInTimeLift);
292 DbgUI.Text(
" Out time: " + data.m_InterpOutTime);
293 DbgUI.Text(
" Current time: " + data.m_InterpCurrTime);
294 DbgUI.Text(
" Actual value: " + data.m_InterpCurrValue);
295 DbgUI.Text(
" Target value: " + data.m_InterpTgtValue);
296 DbgUI.Text(
" Smooth value: " + data.m_InterpSmoothValue);
301 if (mode > MODE_BASIC)
305 DbgUI.ColoredText(0xFF80FF80,
" UD Angle: " + data.m_AimUD);
306 DbgUI.ColoredText(0xFFAAFFAA,
" UD[-1,1]: " + data.m_AimUD11);
307 DbgUI.ColoredText(0xFFFF8080,
" LR Angle: " + data.m_AimLR);
308 DbgUI.ColoredText(0xFFFFAAAA,
" LR[-1,1]: " + data.m_AimLR11);
313 if (mode > MODE_BASIC)
317 DbgUI.Check(
" Draw shapes", m_bDrawGizmos);
318 DbgUI.Check(
" Small shapes", m_bSmallShapes);
319 DbgUI.Check(
" Z-buffer", m_bZBuffer);
320 DbgUI.Check(
" Draw approx transform", m_bDrawTransform);
321 DbgUI.Check(
" Wire only", m_bWireOnly);
326 if (mode >= MODE_BASIC)
328 DbgUI.ColoredText(
COLOR_WHITE,
"CfgGameplay WeaponObstructionData");
329 DbgUI.Text(
" Static: " + EnumTools.EnumToString(
EWeaponObstructionMode, CfgGameplayHandler.GetWeaponObstructionModeStatic()));
330 DbgUI.Text(
" Dynamic: " + EnumTools.EnumToString(
EWeaponObstructionMode, CfgGameplayHandler.GetWeaponObstructionModeDynamic()));
340 HumanInputController hic = ply.GetInputController();
344 float radius = rayRadius;
345 if (m_bSmallShapes) radius = 0.01;
348 if (m_bDrawTransform)
Shape.CreateMatrix(data.m_Transform, 1.0, 0.05);
367 vector wepStart = data.m_Start + (data.m_WeaponStartDist * data.m_Direction);
368 vector wepEnd = data.m_Start + (data.m_WeaponEndDist * data.m_Direction);
369 vector wepEndNoAttach = data.m_Start + ((data.m_WeaponEndDist - data.m_EffectiveAttachmentLength) * data.m_Direction);
374 Shape.Create(
ShapeType.LINE, COLOR_GUIDE, flags2, data.m_Start, wepEnd);
376 Shape.CreateSphere(COLOR_START, flags, wepStart, radius);
377 Shape.CreateSphere(COLOR_END_NOATTACH, flags, wepEndNoAttach, radius);
378 Shape.CreateSphere(COLOR_END, flags, wepEnd, radius);
380 if (data.m_ObstructionDistance != 0)
382 vector wepObstr = data.m_Start + (data.m_ObstructionDistance * data.m_Direction);
383 Shape.CreateSphere(COLOR_OBSTRUCTION, flags, wepObstr, radius);
386 if (mode >= MODE_EXTENDED && data.m_LastPosition != vector.Zero)
388 Shape.Create(
ShapeType.LINE, COLOR_LAST_POS, flags2, data.m_Start, data.m_LastPosition);
392 float cylinderLength = (wepEnd - wepStart).Length();
393 vector cylinderOffset = 0.5 * cylinderLength * data.m_Transform[2];
394 Shape cylinder =
Shape.CreateCylinder(
COLOR_WHITE, flags2, vector.Zero, 0.3 * radius, cylinderLength);
395 vector tm0[4], tm1[3];
396 Math3D.DirectionAndUpMatrix(data.m_Transform[2], data.m_Transform[1], tm0);
397 Math3D.YawPitchRollMatrix(
"90 0 90", tm1);
398 Math3D.MatrixMultiply3(tm0, tm1, tm0);
399 float fraction = Math.Clamp(data.m_HitFraction, 0, 1);
400 if (!data.m_RayResult) fraction = 1.0;
401 vector center = (data.m_Start + (fraction * (wepEnd - data.m_Start))) - cylinderOffset;
403 cylinder.SetMatrix(tm0);
406 if (data.m_RayResult)
408 Shape.CreateSphere(COLOR_HIT, flags, data.m_RayResult.pos, 0.5 * radius);
412 if (m_iColorCrosshair || wasColoringCrosshair)
414 int crossColor = 0xFFFFFFFF;
415 if (m_iColorCrosshair)
418 if (m_iColorCrosshair == 1)
420 float hitFraction =
Data().m_HitFraction;
421 if (hitFraction != 0 && hitFraction < 1.0)
423 crossColor =
ARGB(m_iCrosshairA, m_iCrosshairR, m_iCrosshairG, m_iCrosshairB);
426 else if (m_iColorCrosshair == 2)
428 float hitDist =
Data().m_HitDistance;
429 float obstDist =
Data().m_ObstructionDistance;
430 if (hitDist != 0 && hitDist < obstDist)
432 crossColor =
ARGB(m_iCrosshairA, m_iCrosshairR, m_iCrosshairG, m_iCrosshairB);
435 else if (m_iColorCrosshair == 3)
438 if (
Data().m_HitFraction != 0)
440 float fr = 1.0-Math.InverseLerp(
Data().m_ObstructionDistance,
Data().m_WeaponEndDist,
Data().m_HitDistance );
441 t = Math.Clamp( fr, 0.0, 1.0 );
442 t = Math.Pow(t, m_fCrosshairBlendPow);
446 int bA = Math.Lerp(white, m_iCrosshairA, t);
447 int bR = Math.Lerp(white, m_iCrosshairR, t);
448 int bG = Math.Lerp(white, m_iCrosshairG, t);
449 int bB = Math.Lerp(white, m_iCrosshairB, t);
451 crossColor =
ARGB(bA, bR, bG, bB);
458 Widget cw = ww.FindAnyWidget(
"CrossHairs");
461 Widget child = cw.GetChildren();
464 child.SetColor(crossColor);
465 child = child.GetSibling();
vector m_Transform[4]
If 'OnDebug' is to be called.
void Clear(bool clearFile=false)
proto native DayZPlayer GetPlayer()
proto native WorkspaceWidget GetWorkspace()
proto string ToString(bool simple=true)
proto native CGame GetGame()
array< string > TStringArray
HumanInputControllerOverrideType
int ARGB(int a, int r, int g, int b)