Dayz Build 1.29.163047, Scripts Rev. 123548
Dayz Code Explorer by Zeroy
Loading...
Searching...
No Matches
undergrounddiag.c
Go to the documentation of this file.
1#ifdef DEVELOPER
2#ifndef SERVER
3//----------------------------------------------------------------------------------------
5class UndergroundDiagData
6{
7}
8
9class BoxDrawGizmo : Managed
10{
11 vector m_Rotation[3];
12 private vector m_Position;
13 private vector m_Transform[4];
14
15 ref ScriptInvoker m_OnRotationChanged = new ScriptInvoker();
16
17 void BoxDrawGizmo(vector pPosition)
18 {
19 Math3D.MatrixIdentity4(m_Transform);
20 Math3D.MatrixIdentity3(m_Rotation);
21
22 SetPosition(pPosition);
23 }
24
25 void SetPosition(vector position)
26 {
27 m_Position = position;
28 m_Transform[3] = position;
29
31 }
32
33 vector GetPosition()
34 {
35 return m_Position;
36 }
37
38 void SetTransform(vector transform[4])
39 {
40 m_Transform = transform;
41
42 for (int i = 0; i < 3; ++i)
43 m_Rotation[i] = transform[i];
44
45 m_Position = transform[3];
46 }
47
48 void GetTransform(inout vector transform[4])
49 {
50 transform = m_Transform;
51 //Print(m_Transform);
52 //Print(transform);
53 /*
54 Math3D.MatrixIdentity4(transform);
55 Gizmo_GetWorldTransform(transform);
56 */
57 }
58
59 bool Gizmo_IsSupported()
60 {
61 return true;
62 }
63
64 void Gizmo_SetWorldTransform(vector transform[4], bool finalize)
65 {
66 m_OnRotationChanged.Invoke(m_Transform);
67
68 //Print(transform);
69
70 //m_Rotation[0] = transform[0];
71 //m_Rotation[1] = transform[1];
72 //m_Rotation[2] = transform[2];
73 //m_Position = transform[3];
74
75 /*
76 Math3D.MatrixIdentity4(m_Transform);
77 m_Transform[0] = m_Rotation[0];
78 m_Transform[1] = m_Rotation[1];
79 m_Transform[2] = m_Rotation[2];
80 m_Transform[3] = m_Position;
81 */
82
83 SetTransform(transform);
84
85 //for (int i = 0; i < 4; ++i)
86 // m_Transform[i] = transform[i];
87 }
88
89 void Gizmo_GetWorldTransform(vector transform[4])
90 {
91 /*
92 Math3D.MatrixIdentity4(transform);
93 m_Transform[0] = m_Rotation[0];
94 m_Transform[1] = m_Rotation[1];
95 m_Transform[2] = m_Rotation[2];
96 m_Transform[3] = m_Position;
97 */
98
99 transform = m_Transform;
100 //for(int i = 0; i < 4; ++i)
101 // Print("Gizmo_GetWorldTransform: " + transform[i]);
102
103 /*
104 //Print(m_Transform);
105
106 for (int i = 0; i < 4; ++i)
107 transform[i] = m_Transform[i];
108 */
109 }
110}
111
112class BoxDraw
113{
114 private PlayerBase m_Player;
115 private ref BoxDrawGizmo m_AA, m_BB, m_Global;
116
117
119 vector TransformPointByMatrix(vector transform[4], vector localPoint)
120 {
121 return transform[0] * localPoint[0] + transform[1] * localPoint[1] + transform[2] * localPoint[2] + transform[3];
122 }
123
124 vector InverseTransformPointByMatrix(vector transform[4], vector pointWorld)
125 {
126 // Move to origin's position
127 vector relative = pointWorld - transform[3];
128
129 // Project onto basis vectors (assuming basis is orthonormal!)
130 float localX = vector.Dot(relative, transform[0].Normalized());
131 float localY = vector.Dot(relative, transform[1].Normalized());
132 float localZ = vector.Dot(relative, transform[2].Normalized());
133
134 return Vector(localX, localY, localZ);
135 }
137
138 void BoxDraw()
139 {
140 if (!GetGizmoApi())
141 {
142 ErrorEx("Gizmo API not created, crash imminent", ErrorExSeverity.ERROR);
143 }
144
145 m_Player = PlayerBase.Cast(g_Game.GetPlayer());
146 vector position = m_Player.GetPosition();
147
148 m_AA = new BoxDrawGizmo(position);
149 m_BB = new BoxDrawGizmo(position + "1 1 1");
150 m_Global = new BoxDrawGizmo(Math3D.BoxCenter(m_AA.GetPosition(), m_BB.GetPosition()));
151
152 GetGizmoApi().SelectUser(m_AA);
153 GetGizmoApi().SelectUser(m_BB);
154 GetGizmoApi().SelectUser(m_Global);
155
156 m_Global.m_OnRotationChanged.Insert(OnGlobalRotationChanged);
157 }
158
159 void ~BoxDraw()
160 {
161 m_Global.m_OnRotationChanged.Remove(OnGlobalRotationChanged);
162
165 GetGizmoApi().DeselectTracker(m_Global);
166 }
167
168 void Update()
169 {
170 /*
171 m_AA.m_Rotation[0] = m_Global.m_Transform[0];
172 m_AA.m_Rotation[1] = m_Global.m_Transform[1];
173 m_AA.m_Rotation[2] = m_Global.m_Transform[2];
174 m_BB.m_Rotation[0] = m_Global.m_Transform[0];
175 m_BB.m_Rotation[1] = m_Global.m_Transform[1];
176 m_BB.m_Rotation[2] = m_Global.m_Transform[2];
177 */
178
179 //m_Global.m_Position = Math3D.BoxCenter(m_AA.m_Position, m_BB.m_Position);
180
181 vector boxSize = Math3D.BoxSize(m_AA.GetPosition(), m_BB.GetPosition());
182
183 vector globalTransform[4];
184 Math3D.MatrixIdentity4(globalTransform);
185 m_Global.GetTransform(globalTransform);
186 //Print(globalTransform);
187 DrawRotatedBox(globalTransform, boxSize, 0xFFFF0000);
188
189 //Print(m_AA.m_Transform[3]);
190 //vector aa = m_AA.m_Transform[3];
191 //vector bb = m_BB.m_Transform[3];
192 //Print(m_AA.GetPosition());
193 }
194
195 private void OnGlobalRotationChanged(vector transform[4])
196 {
197 //m_Global.m_Transform = transform
198 //Print(transform);
199 //Print(m_AA.m_Transform);
200 //m_AA.m_Transform[3] = TransformPointByMatrix(m_Global.m_Transform, InverseTransformPointByMatrix(m_Global.m_Transform, m_AA.GetPosition()));
201 //m_AA.Gizmo_SetWorldTransform(m_AA.m_Transform, true);
202 //m_BB.m_Position = TransformPointByMatrix(m_Global.m_Transform, InverseTransformPointByMatrix(m_Global.m_Transform, m_BB.GetPosition()));
203 }
204
205 private void DrawRotatedBox(vector transform[4], vector size, int color)
206 {
207 vector localCorners[8] = {
208 Vector(-0.5, -0.5, -0.5),
209 Vector( 0.5, -0.5, -0.5),
210 Vector( 0.5, 0.5, -0.5),
211 Vector(-0.5, 0.5, -0.5),
212 Vector(-0.5, -0.5, 0.5),
213 Vector( 0.5, -0.5, 0.5),
214 Vector( 0.5, 0.5, 0.5),
215 Vector(-0.5, 0.5, 0.5),
216 };
217
218 vector worldCorners[8];
219 for (int i = 0; i < 8; ++i)
220 {
221 vector scaled = Vector(
222 localCorners[i][0] * size[0],
223 localCorners[i][1] * size[1],
224 localCorners[i][2] * size[2],
225 );
226 worldCorners[i] = TransformPointByMatrix(transform, scaled);
227 }
228
229 int edgePairs[] = {
230 0,1, 1,2, 2,3, 3,0,
231 4,5, 5,6, 6,7, 7,4,
232 0,4, 1,5, 2,6, 3,7
233 };
234
235 for (int j = 0; j < 24; j += 2)
236 {
237 Debug.DrawLine(worldCorners[edgePairs[j]], worldCorners[edgePairs[j + 1]], color, ShapeFlags.ONCE);
238 }
239 }
240}
241
242
243//----------------------------------------------------------------------------------------
245class UndergroundDiag
246{
247 private ref UndergroundDiagData m_Data = new UndergroundDiagData();
248 private ref BoxDraw m_BoxDraw;
249
250 private const int COLOR_START = 0xFF2ECC71; // Green
251 private const int COLOR_END = 0xFF4B77BE; // Blue
252 private const int COLOR_END_NOATTACH = 0xFFF7CA18; // Yellow
253 private const int COLOR_OBSTRUCTION = 0xFFFF00FF; // Pink
254 private const int COLOR_HIT = 0xFFFF0000; // Red
255 private const int COLOR_GUIDE = 0xC03A3A3A; // Semi-transparent gray
256 private const int COLOR_WEAPON = 0x1FFFFFFF; // Semi-transparent white
257 private const int COLOR_LAST_POS = 0x3AF7CA18; // Semi-transparent yellow
258
259 private bool m_EditModeEnabled = true;
260
261 //----------------------------------------------------------------------------------------
262 UndergroundDiagData Data()
263 {
264 return m_Data;
265 }
266
267 //----------------------------------------------------------------------------------------
268 void DrawDiag(float deltaTime)
269 {
270 UndergroundDiagData data = m_Data;
271 if (data)
272 {
274 DbgUI.Begin("UndergroundDiag Diag");
275 {
277 int gray = 0x80FFFFFF; // semi transparent white (gray)
278 int darkObst = gray&COLOR_OBSTRUCTION;
279 int endNoAttachCol = gray & COLOR_END_NOATTACH;
280
281 DbgUI.Spacer(10);
282 DbgUI.Check(" Edit Mode", m_EditModeEnabled);
283 }
284 DbgUI.End();
285
286 HandleGizmos();
287 }
288 }
289
290 private void HandleGizmos()
291 {
292 if (m_EditModeEnabled)
293 {
294 if (!m_BoxDraw)
295 m_BoxDraw = new BoxDraw();
296
297 m_BoxDraw.Update();
298 }
299 else
300 {
301 if (m_BoxDraw)
302 delete m_BoxDraw;
303 }
304 }
305}
306#endif
307#endif
map m_Player
string Debug()
proto void DeselectTracker(Managed tracker)
Deselect the gizmo for the given tracker.
proto void SelectUser(Managed instance)
Scripted controls, requires the following methods to be implemented in the class void Gizmo_SetWorldT...
TODO doc.
Definition enscript.c:118
vector GetPosition()
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Definition enconvert.c:284
DayZGame g_Game
Definition dayzgame.c:3942
vector m_Position
Cached world position.
Definition effect.c:43
proto GizmoApi GetGizmoApi()
ErrorExSeverity
Definition endebug.c:62
enum ShapeType ErrorEx
proto native void SetPosition(vector position)
Set the world position of the Effect.
Definition effect.c:463
ShapeFlags
Definition endebug.c:126
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
proto native volatile void Update()
proto native void SetTransform(vector mat[4], bool immedUpdate=true)
JsonDataAreaData Data
vector m_Transform[4]
If 'OnDebug' is to be called.
Definition object.c:21