DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
UndergroundDiag.c
См. документацию.
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()
Определения CachedEquipmentStorageBase.c:29
DayZGame g_Game
Определения DayZGame.c:3942
vector m_Position
Cached world position.
Определения Effect.c:43
proto GizmoApi GetGizmoApi()
JsonDataAreaData Data
Определения JsonDataContaminatedArea.c:13
vector m_Transform[4]
If 'OnDebug' is to be called.
Определения Object.c:21
string m_Data
Определения UniversalTemperatureSource.c:267
proto void SelectUser(Managed instance)
proto void DeselectTracker(Managed tracker)
vector GetPosition()
Определения IntroSceneCharacter.c:129
TODO doc.
Определения EnScript.c:118
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:284
ErrorExSeverity
Определения EnDebug.c:62
enum ShapeType ErrorEx
proto native void SetPosition(vector position)
Set the world position of the Effect.
Определения Effect.c:463
ShapeFlags
Определения EnDebug.c:126
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
proto native volatile void Update()
Определения PlayerSoundManager.c:125
proto native void SetTransform(vector mat[4], bool immedUpdate=true)