4class UndergroundTriggerHandle :
ItemBase
7 ref JsonUndergroundAreaTriggerData
m_Data;
9 void UndergroundTriggerHandle()
11 m_Data =
new JsonUndergroundAreaTriggerData();
14 string GetHandleName()
19 void SetHandleName(
string name)
24 void SetBoxDrawRef(BoxDraw boxReference)
26 m_Reference = boxReference;
30class UndergroundBreadcrumbHandle :
ItemBase
32 UndergroundTriggerHandle m_ParentTrigger;
33 BreadcrumbDraw m_Reference;
34 ref JsonUndergroundAreaBreadcrumb
m_Data;
36 void UndergroundBreadcrumbHandle()
38 m_Data =
new JsonUndergroundAreaBreadcrumb();
41 string GetHandleName()
46 void SetHandleName(
string name)
51 void SetBreadcrumbDrawRef(BreadcrumbDraw breadcrumbReference)
53 m_Reference = breadcrumbReference;
59 protected vector m_Rotation[3];
62 bool m_TransformAllowed =
false;
64 ref ScriptInvoker m_OnTransformChanged =
new ScriptInvoker();
66 void DrawGizmoBase(vector pPosition)
69 Math3D.MatrixIdentity3(m_Rotation);
76 return m_TransformAllowed;
101 void GetTransform(inout vector transform[4])
106 bool Gizmo_IsSupported()
111 void Gizmo_SetWorldTransform(vector transform[4],
bool finalize)
113 m_OnTransformChanged.Invoke(transform);
118 void Gizmo_GetWorldTransform(vector transform[4])
123 protected void IsolateYawOnly(inout vector transform[4])
125 vector inTransform[4];
127 vector col0 = inTransform[0];
128 vector col1 = inTransform[1];
129 vector col2 = inTransform[2];
134 float yaw = Math.Atan2(r02, r00);
136 float c = Math.Cos(yaw);
137 float s = Math.Sin(yaw);
143 vector yawCol0 =
Vector( c, 0, -s);
144 vector yawCol1 =
Vector( 0, 1, 0);
145 vector yawCol2 =
Vector( s, 0, c);
147 transform[0] = yawCol0;
148 transform[1] = yawCol1;
149 transform[2] = yawCol2;
150 transform[3] = inTransform[3];
154class BreadcrumbGizmo : DrawGizmoBase
158 if (!super.Gizmo_IsAllowedTransformMode(mode))
168class BoxDrawGizmo : DrawGizmoBase {}
170class BoxDrawCenterGizmo: BoxDrawGizmo
174 if (!super.Gizmo_IsAllowedTransformMode(mode))
184class BoxDrawCornerGizmo : BoxDrawGizmo
188 if (!super.Gizmo_IsAllowedTransformMode(mode))
198class ArrayBoxDraw :
array<ref BoxDraw>
202 for (
int i = 0; i <
Count(); ++i)
204 BoxDraw item =
Get(i);
210class ArrayBreadcrumbDraw :
array<ref BreadcrumbDraw>
214 for (
int i = 0; i <
Count(); ++i)
216 BreadcrumbDraw item =
Get(i);
222class UndergroundTriggerDrawBase :
Managed
229 protected vector LocalToWorldFromMat(vector mat[4], vector localPos)
231 vector right = mat[0];
233 vector forward = mat[2];
234 vector center = mat[3];
236 return center + right * localPos[0] + up * localPos[1] + forward * localPos[2];
239 protected vector WorldToLocal(BoxDrawGizmo gizmo, vector worldPos)
242 gizmo.GetTransform(mat);
244 vector right = mat[0];
246 vector forward = mat[2];
247 vector center = mat[3];
249 vector v = worldPos - center;
251 vector localPosition;
252 localPosition[0] = vector.
Dot(v, right);
253 localPosition[1] = vector.
Dot(v, up);
254 localPosition[2] = vector.
Dot(v, forward);
256 return localPosition;
260class BoxDraw : UndergroundTriggerDrawBase
262 private bool m_IsShown;
263 private bool m_IsSelected;
265 private vector m_LocalMin;
266 private vector m_LocalMax;
268 private ref BoxDrawCenterGizmo m_GizmoCenter;
269 private ref BoxDrawCornerGizmo m_GizmoMin, m_GizmoMax;
270 private UndergroundTriggerHandle m_HandleHelper
272 private ref array<ref DebugTextWorldSpace> m_DebugTextsWS;
274 private ref ScriptInvoker m_OnTransformChanged;
281 m_DebugTextsWS =
new array<ref DebugTextWorldSpace>();
283 m_GizmoCenter =
new BoxDrawCenterGizmo(
position);
289 m_GizmoCenter.SetTransform(centerMat);
292 vector he = size * 0.5;
293 m_LocalMin =
Vector(-he[0], -he[1], -he[2]);
294 m_LocalMax =
Vector( he[0], he[1], he[2]);
297 vector worldMin = LocalToWorldFromMat(centerMat, m_LocalMin);
298 vector worldMax = LocalToWorldFromMat(centerMat, m_LocalMax);
300 m_GizmoMin =
new BoxDrawCornerGizmo(worldMin);
301 m_GizmoMax =
new BoxDrawCornerGizmo(worldMax);
305 vector minMat[4];
copyarray(minMat, centerMat); minMat[3] = worldMin;
306 vector maxMat[4];
copyarray(maxMat, centerMat); maxMat[3] = worldMax;
307 m_GizmoMin.SetTransform(minMat);
308 m_GizmoMax.SetTransform(maxMat);
312 m_HandleHelper.SetBoxDrawRef(
this);
317 m_GizmoCenter.m_OnTransformChanged.Insert(OnCenterGizmoTransformChanged);
318 m_GizmoMin.m_OnTransformChanged.Insert(OnMinGizmoTransformChanged);
319 m_GizmoMax.m_OnTransformChanged.Insert(OnMaxGizmoTransformChanged);
324 m_GizmoCenter.m_OnTransformChanged.Remove(OnCenterGizmoTransformChanged);
325 m_GizmoMin.m_OnTransformChanged.Remove(OnMinGizmoTransformChanged);
326 m_GizmoMax.m_OnTransformChanged.Remove(OnMinGizmoTransformChanged);
329 m_HandleHelper.Delete();
334 vector globalTransform[4];
335 m_GizmoCenter.GetTransform(globalTransform);
336 DrawRotatedBox(globalTransform, 0x33ffb626);
339 m_HandleHelper.SetPosition(globalTransform[3] +
"0.25 0.5 0.25");
341 DrawDebugs(m_IsSelected);
344 UndergroundTriggerHandle GetTriggerHandle()
346 return m_HandleHelper;
349 ScriptInvoker Event_OnTransformChanged()
351 if (!m_OnTransformChanged)
352 m_OnTransformChanged =
new ScriptInvoker();
354 return m_OnTransformChanged;
357 void SetAllowTransform(
bool state)
359 m_GizmoMin.m_TransformAllowed = state;
360 m_GizmoMax.m_TransformAllowed = state;
361 m_GizmoCenter.m_TransformAllowed = state;
363 m_IsSelected = state;
373 override vector GetCenter()
376 m_GizmoCenter.GetTransform(transform);
384 m_GizmoCenter.GetTransform(transform);
386 return Math3D.MatrixToAngles(transform);
391 vector size = Math3D.BoxSize(m_LocalMin, m_LocalMax);
395 private void UpdateMinGizmo()
397 vector globalTransform[4];
398 m_GizmoCenter.GetTransform(globalTransform);
399 vector oldTransform[4];
400 copyarray(oldTransform, globalTransform);
401 vector worldMin = LocalToWorldFromMat(globalTransform, m_LocalMin);
402 vector worldMax = LocalToWorldFromMat(globalTransform, m_LocalMax);
406 matMin[3] = worldMin;
408 m_GizmoMin.SetTransform(matMin);
411 vector center = Math3D.BoxCenter(worldMin, worldMax);
412 globalTransform[3] = center;
413 m_GizmoCenter.SetTransform(globalTransform);
416 m_LocalMin = WorldToLocal(m_GizmoCenter, worldMin);
417 m_LocalMax = WorldToLocal(m_GizmoCenter, worldMax);
419 Event_OnTransformChanged().Invoke(oldTransform, globalTransform);
422 private void UpdateMaxGizmo()
424 vector globalTransform[4];
425 m_GizmoCenter.GetTransform(globalTransform);
426 vector oldTransform[4];
427 copyarray(oldTransform, globalTransform);
428 vector worldMin = LocalToWorldFromMat(globalTransform, m_LocalMin);
429 vector worldMax = LocalToWorldFromMat(globalTransform, m_LocalMax);
433 matMax[3] = worldMax;
435 m_GizmoMax.SetTransform(matMax);
438 vector center = Math3D.BoxCenter(worldMin, worldMax);
439 globalTransform[3] = center;
440 m_GizmoCenter.SetTransform(globalTransform);
443 m_LocalMin = WorldToLocal(m_GizmoCenter, worldMin);
444 m_LocalMax = WorldToLocal(m_GizmoCenter, worldMax);
446 Event_OnTransformChanged().Invoke(oldTransform, globalTransform);
449 private void OnCenterGizmoTransformChanged(vector transform[4])
451 vector oldTransform[4];
452 m_GizmoCenter.GetTransform(oldTransform);
453 m_GizmoCenter.SetTransform(transform);
455 Event_OnTransformChanged().Invoke(oldTransform, transform);
461 private void OnMinGizmoTransformChanged(vector transform[4])
465 vector localPosition = WorldToLocal(m_GizmoCenter, transform[3]);
466 m_LocalMin = localPosition;
471 private void OnMaxGizmoTransformChanged(vector transform[4])
475 vector localPosition = WorldToLocal(m_GizmoCenter, transform[3]);
476 m_LocalMax = localPosition;
481 private void DrawDebugs(
bool enabled)
483 m_DebugTextsWS.Clear();
487 vector globalTransform[4];
488 m_GizmoCenter.GetTransform(globalTransform);
489 vector worldMin = LocalToWorldFromMat(globalTransform, m_LocalMin);
490 vector worldMax = LocalToWorldFromMat(globalTransform, m_LocalMax);
501 private void DrawRotatedBox(vector transform[4],
int color)
503 vector cornersLocal[8];
506 cornersLocal[0] = m_LocalMin;
507 cornersLocal[1] =
Vector(m_LocalMax[0], m_LocalMin[1], m_LocalMin[2]);
508 cornersLocal[2] =
Vector(m_LocalMin[0], m_LocalMax[1], m_LocalMin[2]);
509 cornersLocal[3] =
Vector(m_LocalMax[0], m_LocalMax[1], m_LocalMin[2]);
510 cornersLocal[4] =
Vector(m_LocalMin[0], m_LocalMin[1], m_LocalMax[2]);
511 cornersLocal[5] =
Vector(m_LocalMax[0], m_LocalMin[1], m_LocalMax[2]);
512 cornersLocal[6] =
Vector(m_LocalMin[0], m_LocalMax[1], m_LocalMax[2]);
513 cornersLocal[7] = m_LocalMax;
516 for (
int i = 0; i < 8; i++)
517 c[i] = LocalToWorldFromMat(transform, cornersLocal[i]);
525 for (
int j = 0; j < 24; j += 2)
526 Debug.DrawLine(c[edgePairs[j]], c[edgePairs[j + 1]], 0xff000000,
ShapeFlags.ONCE);
557 for (
int p = 0; p < size; p += 3)
563 face[0] = c[tris[p]];
564 face[1] = c[tris[p + 1]];
565 face[2] = c[tris[p + 2]];
572class BreadcrumbDraw : UndergroundTriggerDrawBase
574 private bool m_IsShown;
575 private bool m_IsSelected;
577 private vector m_LocalMin;
578 private vector m_LocalMax;
580 private vector m_LastTransform[4];
582 private ref BreadcrumbGizmo m_GizmoCenter;
584 private ref ScriptInvoker m_OnTransformChanged;
586 private UndergroundBreadcrumbHandle m_HandleHelper
588 private ref array<ref DebugTextWorldSpace> m_DebugTextsWS;
590 void BreadcrumbDraw(vector
position)
595 m_DebugTextsWS =
new array<ref DebugTextWorldSpace>();
597 m_GizmoCenter =
new BreadcrumbGizmo(
position);
605 m_GizmoCenter.SetTransform(centerMat);
608 m_HandleHelper.SetBreadcrumbDrawRef(
this);
610 m_GizmoCenter.m_OnTransformChanged.Insert(OnCenterGizmoTransformChanged);
613 void ~BreadcrumbDraw()
615 m_GizmoCenter.m_OnTransformChanged.Remove(OnCenterGizmoTransformChanged);
618 m_HandleHelper.Delete();
621 UndergroundBreadcrumbHandle GetBreadcrumbHandle()
623 return m_HandleHelper;
626 ScriptInvoker Event_OnTransformChanged()
628 if (!m_OnTransformChanged)
629 m_OnTransformChanged =
new ScriptInvoker();
631 return m_OnTransformChanged;
634 void ApplyTransformation(vector parentOldTransform[4], vector parentNewTransform[4])
636 vector parentOldTransformInv[4];
639 float cOld = parentOldTransform[2][2];
640 float sOld = parentOldTransform[2][0];
641 float cNew = parentNewTransform[2][2];
642 float sNew = parentNewTransform[2][0];
645 float cosDelta = cNew * cOld + sNew * sOld;
646 float sinDelta = sNew * cOld - cNew * sOld;
649 vector offset = m_LastTransform[3] - parentOldTransform[3];
663 childNew[3] = parentNewTransform[3] + offset;
665 vector globalTransform[4];
666 m_GizmoCenter.GetTransform(globalTransform);
667 globalTransform[3] = childNew[3];
668 copyarray(m_LastTransform, globalTransform);
669 m_GizmoCenter.SetTransform(globalTransform);
674 vector globalTransform[4];
675 m_GizmoCenter.GetTransform(globalTransform);
676 DrawSphere(globalTransform, 0x550000cc, m_HandleHelper.m_Data.Radius);
677 DrawDebugs(m_IsSelected);
680 m_HandleHelper.SetPosition(globalTransform[3] +
"0.25 0.5 0.25");
683 void SetAllowTransform(
bool state)
685 m_GizmoCenter.m_TransformAllowed = state;
687 m_IsSelected = state;
695 override vector GetCenter()
698 m_GizmoCenter.GetTransform(transform);
703 private void OnCenterGizmoTransformChanged(vector transform[4])
705 vector oldTransform[4];
706 m_GizmoCenter.GetTransform(oldTransform);
707 m_GizmoCenter.SetTransform(transform);
711 if (m_OnTransformChanged)
712 m_OnTransformChanged.Invoke(oldTransform, transform);
715 private void DrawDebugs(
bool enabled)
717 m_DebugTextsWS.Clear();
721 vector globalTransform[4];
722 m_GizmoCenter.GetTransform(globalTransform);
724 vector
position = globalTransform[3];
730 private void DrawSphere(vector transform[4],
int color,
float radius = 0.15)
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
proto GizmoApi GetGizmoApi()
vector m_Transform[4]
If 'OnDebug' is to be called.
UndergroundTriggerCarrier m_Data
proto void SelectUser(Managed instance)
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
proto native void SetPosition(vector position)
Set the world position of the Effect.
proto void copyarray(void destArray, void srcArray)
proto native vector Vector(float x, float y, float z)
Vector constructor from components.