Tanoda
pb_TransformEditor.cs
Go to the documentation of this file.
1using System;
2using UnityEngine;
3using System.Collections;
4using System.Collections.Generic;
5using System.Reflection;
8using UnityEngine.UI;
10
11#if !UNITY_WEBGL
12using Valve.VR.InteractionSystem;
13#endif
14
15namespace GILES.Interface
16{
21 {
22 private Transform _transform;
23
24 public enum eType
25 {
26 Static,
27 Interactive,
28 Tool
29 }
30
31 protected override void InitializeGUI()
32 {
33 _transform = (Transform) target;
34 var isStatic = _transform.GetComponent<StaticGO>() != null;
35 var isTool = _transform.GetComponent<ToolGO>() != null;
36 pb_TypeInspector enabled_inspector = pb_InspectorResolver.GetInspector(typeof(bool));
37
38 enabled_inspector.Initialize("Enabled", UpdateEnabled, OnSetEnabled);
39 enabled_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoReflection(_transform.gameObject, "enabled"), "GameObject Enabled" ); };
40 enabled_inspector.transform.SetParent(transform);
41
42 pb_GUIUtility.AddVerticalLayoutGroup(gameObject);
43
44
45 pb_TypeInspector type_inspector = pb_InspectorResolver.GetInspector(typeof(eType));
46 pb_TypeInspector position_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3));
47 pb_TypeInspector localposition_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3));
48 pb_TypeInspector rotation_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3));
49 pb_TypeInspector scale_inspector = pb_InspectorResolver.GetInspector(typeof(Vector3));
50 pb_TypeInspector bounds_inspector = pb_InspectorResolver.GetInspector(typeof(Bounds));
51 pb_TypeInspector twoHandGrab_inspector = pb_InspectorResolver.GetInspector(typeof(bool));
52#if DANA
53 pb_TypeInspector restArea_inspector = pb_InspectorResolver.GetInspector(typeof(bool));
54
55#endif
56
57 type_inspector.Initialize("Type", UpdateType, OnTypeSet);
58 position_inspector.Initialize("Position", UpdateLocalPosition, OnSetPosition);
59 localposition_inspector.Initialize("Local Position", UpdatePosition, OnSetLocalPosition);
60 rotation_inspector.Initialize("Rotation", UpdateRotation, OnSetRotation);
61 scale_inspector.Initialize("Scale", UpdateScale, OnSetScale);
62 bounds_inspector.Initialize("Size", UpdateBounds, null);
63 twoHandGrab_inspector.Initialize("Grab with two hand", UpdateTwoHand, OnTwoHandSet);
64#if DANA
65 restArea_inspector.Initialize("Is Rest Area", UpdateRestArea, OnRestAreaSet);
66
67#endif
68
69 type_inspector.SetDeclaringType(typeof(eType));
70 type_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoTransform(_transform), "Set Type: " + (_transform.GetComponent<StaticGO>() ? Macro.T("Static") : (_transform.GetComponent<ToolGO>() ? Macro.T("Tool") : Macro.T("Interactive"))) ); };
71 position_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoTransform(_transform), "Set Position: " + _transform.position.ToString("G") ); };
72 localposition_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoTransform(_transform), "Set Local Position: " + _transform.localPosition.ToString("G") ); };
73 rotation_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoTransform(_transform), "Set Rotation: " + _transform.localRotation.eulerAngles.ToString("G")); };
74 scale_inspector.onValueBeginChange = () => { Undo.RegisterState( new UndoTransform(_transform), "Set Scale: " + _transform.localScale.ToString("G") ); };
75
76 type_inspector.transform.SetParent(transform);
77 position_inspector.transform.SetParent(transform);
78 localposition_inspector.transform.SetParent(transform);
79 rotation_inspector.transform.SetParent(transform);
80 scale_inspector.transform.SetParent(transform);
81 bounds_inspector.transform.SetParent(transform);
82 twoHandGrab_inspector.transform.SetParent(transform);
83
84
85 {
86
87 var horizontalParent1 = new GameObject("ResetTransformButton");
88 var hlg1 = horizontalParent1.AddComponent<HorizontalLayoutGroup>();
89 var lec1 = horizontalParent1.AddComponent<LayoutElement>();
90 lec1.minHeight = 32;
91 horizontalParent1.transform.SetParent(transform);
92
93 var buttonGO = new GameObject("ClickButton");
94 var image = buttonGO.AddComponent<Image>();
95 var button = buttonGO.AddComponent<Button>();
96 var textGO = new GameObject("LabelGO");
97 var text = textGO.AddComponent<Text>();
98 textGO.GetComponent<RectTransform>().sizeDelta = new Vector2(65, 14);
99 text.font = Font.CreateDynamicFontFromOSFont("Arial", 24);
100 text.alignment = TextAnchor.MiddleCenter;
101 text.text = Macro.T("Reset Transform");
102 text.horizontalOverflow = HorizontalWrapMode.Overflow;
103 text.verticalOverflow = VerticalWrapMode.Overflow;
104 text.color = Color.white;
105 text.resizeTextForBestFit = true;
106 text.resizeTextMaxSize = 16;
107 textGO.transform.SetParent(buttonGO.transform);
108 image.sprite = GameObject.Find("DoNOTDelete").transform.Find("SaveButton").GetComponent<Image>().sprite;
109 //image.sprite = GameObject.Find("SaveButton").GetComponent<Image>().sprite;
110 image.type = Image.Type.Sliced;
111 image.color = new Color(255, 255, 255, 40 / 255.0f);
112 image.pixelsPerUnitMultiplier = 2f;
113 buttonGO.transform.SetParent(horizontalParent1.transform);
114 button.onClick.AddListener(() => {
115 var hh = _transform.GetComponent<HashHolder>();
116 if (hh)
117 {
118 _transform.localEulerAngles = hh.origLocalEuler;
119 _transform.localPosition = hh.origLocalPos;
120 }
121 });
122 }
123
124#if DANA
125 restArea_inspector.transform.SetParent(transform);
126
127#endif
128
129 var horizontalParent = new GameObject("HorizontalParent");
130 var hlg = horizontalParent.AddComponent<HorizontalLayoutGroup>();
131 var lec = horizontalParent.AddComponent<LayoutElement>();
132 lec.minHeight = 32;
133 horizontalParent.transform.SetParent(transform);
134
135 {
136 var buttonGO = new GameObject("ClickButton");
137 var image = buttonGO.AddComponent<Image>();
138 var button = buttonGO.AddComponent<Button>();
139 var textGO = new GameObject("LabelGO");
140 var text = textGO.AddComponent<Text>();
141 textGO.GetComponent<RectTransform>().sizeDelta = new Vector2(65, 14);
142 text.font = Font.CreateDynamicFontFromOSFont("Arial", 24);
143 text.alignment = TextAnchor.MiddleCenter;
144 text.text = Macro.T("Copy");
145 text.color = Color.white;
146 text.resizeTextForBestFit = true;
147 text.resizeTextMaxSize = 16;
148 textGO.transform.SetParent(buttonGO.transform);
149 image.sprite = GameObject.Find("DoNOTDelete").transform.Find("SaveButton").GetComponent<Image>().sprite;
150 //image.sprite = GameObject.Find("SaveButton").GetComponent<Image>().sprite;
151 image.type = Image.Type.Sliced;
152 image.color = new Color(255,255,255, 40/255.0f);
153 image.pixelsPerUnitMultiplier = 2f;
154 buttonGO.transform.SetParent(horizontalParent.transform);
155 button.onClick.AddListener(() => TransformCopy.instance.Copy(_transform));
156 }
157
158 {
159 var buttonGO = new GameObject("ClickButton");
160 var image = buttonGO.AddComponent<Image>();
161 var button = buttonGO.AddComponent<Button>();
162 var textGO = new GameObject("LabelGO");
163 var text = textGO.AddComponent<Text>();
164 textGO.GetComponent<RectTransform>().sizeDelta = new Vector2(65, 14);
165 text.font = Font.CreateDynamicFontFromOSFont("Arial", 24);
166 text.alignment = TextAnchor.MiddleCenter;
167 text.text = Macro.T("Paste");
168 text.color = Color.white;
169 text.resizeTextForBestFit = true;
170 text.resizeTextMaxSize = 16;
171 textGO.transform.SetParent(buttonGO.transform);
172 image.sprite = GameObject.Find("DoNOTDelete").transform.Find("SaveButton").GetComponent<Image>().sprite;
173 //image.sprite = GameObject.Find("SaveButton").GetComponent<Image>().sprite;
174 image.type = Image.Type.Sliced;
175 image.color = new Color(255,255,255, 40/255.0f);
176 image.pixelsPerUnitMultiplier = 2f;
177 buttonGO.transform.SetParent(horizontalParent.transform);
178 button.onClick.AddListener(() => TransformCopy.instance.Paste(_transform));
179 }
180
181 //try
182 //{
183 // var bounds = getBounds(_transform.gameObject).size;
184 //
185 // var textHolder = new GameObject("SizeOfTheModel");
186 // var le = textHolder.AddComponent<LayoutElement>();
187 // le.minHeight = 26;
188 // Text text = textHolder.AddComponent<Text>();
189 // text.font = Font.CreateDynamicFontFromOSFont("Arial", 24);
190 // text.color = Color.white;
191 // text.resizeTextForBestFit = true;
192 // text.resizeTextMaxSize = 20;
193 // text.alignment = TextAnchor.MiddleLeft;
194 // var x = bounds.x > 0.99f ? (bounds.x).ToString("F1") + "m" : bounds.x * 100 > 0.99f ? (bounds.x * 100).ToString("F1") + "cm" : (bounds.x * 1000).ToString("F1") + "mm";
195 // var y = bounds.x > 0.99f ? (bounds.y).ToString("F1") + "m" : bounds.y * 100 > 0.99f ? (bounds.y * 100).ToString("F1") + "cm" : (bounds.y * 1000).ToString("F1") + "mm";
196 // var z = bounds.z > 0.99f ? (bounds.z).ToString("F1") + "m" : bounds.z * 100 > 0.99f ? (bounds.z * 100).ToString("F1") + "cm" : (bounds.z * 1000).ToString("F1") + "mm";
197 // text.text = $"X: {x} Y: {y} Z: {z}";
198 // textHolder.GetComponent<RectTransform>().sizeDelta = new Vector2(190, 16);
199 // textHolder.transform.SetParent(transform);
200 //
201 //}
202 //catch (Exception)
203 //{
204 // // ignored
205 //}
206
207 (type_inspector as pb_EnumInspector).dropdown.SetValueWithoutNotify(isStatic ? 0 : isTool ? 2 : 1);
208 var ops = (type_inspector as pb_EnumInspector).dropdown.options;
209 foreach (var o in ops)
210 {
211 o.text = Macro.T(o.text);
212 }
213
214 (type_inspector as pb_EnumInspector).dropdown.options = ops;
215
216
217 }
218
219 private void OnRestAreaSet(object value)
220 {
221 if ((bool)value)
222 {
223 _transform.gameObject.DemandComponent<RestArea>();
224 }
225 else
226 {
227 Destroy(_transform.gameObject.GetComponent<RestArea>());
228 }
229 }
230
231 private object UpdateRestArea()
232 {
233 var ra = _transform.GetComponent<RestArea>();
234 return ra != null ? true : false;
235 }
236
237 private void OnTwoHandSet(object value)
238 {
239 if ((bool)value)
240 {
241 _transform.gameObject.DemandComponent<TwoHandGrab>().enabled = false;
242 }
243 else
244 {
245 Destroy(_transform.gameObject.GetComponent<TwoHandGrab>());
246 }
247 }
248
249 private object UpdateTwoHand()
250 {
251 var ra = _transform.GetComponent<TwoHandGrab>();
252 return ra != null ? true : false;
253 }
254
255 Bounds getBounds(GameObject objeto)
256 {
257 Bounds bounds;
258 Renderer childRender;
259 bounds = getRenderBounds(objeto);
260 if (bounds.extents.x == 0)
261 {
262 bounds = new Bounds(objeto.transform.position, Vector3.zero);
263 foreach (Transform child in objeto.transform)
264 {
265 childRender = child.GetComponent<Renderer>();
266 if (childRender)
267 {
268 bounds.Encapsulate(childRender.bounds);
269 }
270 else
271 {
272 bounds.Encapsulate(getBounds(child.gameObject));
273 }
274 }
275 }
276
277 return bounds;
278 }
279
280 Bounds getRenderBounds(GameObject objeto)
281 {
282 Bounds bounds = new Bounds(Vector3.zero, Vector3.zero);
283 Renderer render = objeto.GetComponent<Renderer>();
284 if (render != null)
285 {
286 return render.bounds;
287 }
288
289 return bounds;
290 }
291
292
293 private void OnTypeSet(int value0, object enumString)
294 {
295 foreach (var go in pb_Selection.gameObjects)
296 {
297
298 if (enumString.ToString() == "Static")
299 {
300 //_transform.gameObject.isStatic = true; //Editor only :/
301 var isStatic = go.GetComponent<StaticGO>();
302 var isTool = go.GetComponent<ToolGO>();
303 var hasRigidbody = go.GetComponent<Rigidbody>();
304 var hasOffsetter = go.GetComponent<OffsetHolder>();
305 var hasVisualOffsetter = go.GetComponent<VisualOffset>();
306#if !UNITY_WEBGL
307 var hasInteractable = go.GetComponent<Interactable>();
308 var hasThrowable = go.GetComponent<ThrowableCanDisable>();
309 #endif
310
311 if (isTool)
312 {
313 Destroy(isTool);
314 }
315 if (!isStatic)
316 {
317 go.AddComponent<StaticGO>();
318 }
319
320#if !UNITY_WEBGL
321 if (hasThrowable)
322 {
323 Destroy(hasThrowable);
324 }
325#endif
326
327#if !UNITY_WEBGL
328 if (hasInteractable)
329 {
330 Destroy(hasInteractable);
331 }
332 #endif
333 if (hasRigidbody)
334 {
335 Destroy(hasRigidbody);
336 }
337 if (!hasOffsetter)
338 {
339 go.AddComponent<OffsetHolder>();
340 }
341 if (!hasVisualOffsetter)
342 {
343 go.AddComponent<VisualOffset>();
344 }
345 }
346 if (enumString.ToString() == "Interactive")
347 {
348 //_transform.gameObject.isStatic = false;
349 var isStatic = go.GetComponent<StaticGO>();
350 var isTool = go.GetComponent<ToolGO>();
351 var hasRigidbody = go.GetComponent<Rigidbody>();
352 var hasOffsetter = go.GetComponent<OffsetHolder>();
353 var hasVisualOffsetter = go.GetComponent<VisualOffset>();
354#if !UNITY_WEBGL
355 var hasInteractable = go.GetComponent<Interactable>();
356 var hasThrowable = go.GetComponent<ThrowableCanDisable>();
357
358#endif
359 if (isStatic)
360 {
361 Destroy(isStatic);
362 }
363
364 if (isTool)
365 {
366 Destroy(isTool);
367 }
368
369 if (!hasRigidbody)
370 {
371 go.AddComponent<Rigidbody>().isKinematic = true;
372 }
373 if (!hasOffsetter)
374 {
375 go.AddComponent<OffsetHolder>();
376 }
377 if(!hasVisualOffsetter)
378 {
379 go.AddComponent<VisualOffset>();
380 }
381
382#if !UNITY_WEBGL
383 if (!hasInteractable)
384 {
385 go.AddComponent<Interactable>();
386 }
387
388 if (!hasThrowable)
389 {
390 go.AddComponent<ThrowableCanDisable>();
391 }
392#endif
393 }
394
395 if (enumString.ToString() == "Tool")
396 {
397 var isStatic = go.GetComponent<StaticGO>();
398 var isTool = go.GetComponent<ToolGO>();
399 var hasRigidbody = go.GetComponent<Rigidbody>();
400 var hasOffsetter = go.GetComponent<OffsetHolder>();
401 var hasVisualOffsetter = go.GetComponent<VisualOffset>();
402
403 var blue = Instantiate(go);
404
405#if !UNITY_WEBGL
406 var hasInteractable = go.GetComponent<Interactable>();
407 var hasThrowable = go.GetComponent<ThrowableCanDisable>();
408
409
410 Destroy(blue.GetComponent<ThrowableCanDisable>());
411 Destroy(blue.GetComponent<Interactable>());
412 Destroy(blue.GetComponent<Rigidbody>());
413
414 try
415 {
416 var blueRef = TablePositionSetter.instance.transform.Find("hammer_blue");
417 var bmrs = blue.GetComponentsInChildren<MeshRenderer>();
418 var bluemat = blueRef.gameObject.GetComponent<MeshRenderer>().material;
419 foreach (var bmr in bmrs)
420 {
421 var bml = new List<Material>();
422 for (int i = 0; i < bmr.materials.Length; i++)
423 {
424 bml.Add(bluemat);
425 }
426
427 var currentcoll = bmr.gameObject.GetComponent<Collider>();
428 Destroy(currentcoll);
429 bmr.materials = bml.ToArray();
430 var coll = bmr.gameObject.AddComponent<MeshCollider>();
431 coll.convex = true;
432 coll.isTrigger = true;
433 }
434 }
435 catch (Exception)
436 {
437 Debug.Log("Failed to get and set blue!");
438 }
439
440#endif
441 blue.SetActive(false);
442
443 if (isStatic)
444 {
445 Destroy(isStatic);
446 }
447 if (!isTool)
448 {
449 go.AddComponent<ToolGO>().blue = blue;
450 }
451
452 if (!hasRigidbody)
453 {
454 go.AddComponent<Rigidbody>().isKinematic = true;
455 }
456 if (!hasOffsetter)
457 {
458 go.AddComponent<OffsetHolder>();
459 }
460 if(!hasVisualOffsetter)
461 {
462 go.AddComponent<VisualOffset>();
463 }
464
465#if !UNITY_WEBGL
466 if (!hasInteractable)
467 {
468 go.AddComponent<Interactable>();
469 }
470
471 if (!hasThrowable)
472 {
473 hasThrowable = go.AddComponent<ThrowableCanDisable>();
474 }
475
476 hasThrowable.delayEventSeconds = 2.5f;
477 if (hasThrowable.onPickUp == null)
478 {
479 hasThrowable.onPickUp = new UnityEvent();
480 }
481 if (hasThrowable.DelayedOnPickUp == null)
482 {
483 hasThrowable.DelayedOnPickUp = new UnityEvent();
484 }
485 hasThrowable.onPickUp.AddListener(() =>
486 {
487 blue.SetActive(true);
488 blue.GetComponentInChildren<Collider>(true).enabled = false;
489 });
490
491 hasThrowable.onDetachFromHand = new UnityEvent();
492
493 hasThrowable.DelayedOnPickUp.AddListener(() =>
494 {
495 blue.GetComponentInChildren<Collider>(true).enabled = true;
496 });
497
498 var bcoll = blue.GetComponentInChildren<Collider>(true);
499 var ltm = blue.gameObject.AddComponent<LerpToMe>();
500 var ce = bcoll.gameObject.AddComponent<CollisionEvents>();
501 ce.collisions = new List<NamedCollisionEvents>();
502 ce.collisions.Add(new NamedCollisionEvents(){colliderName = bcoll.name, onTriggerEnter = new UnityEvent()});
503 ce.collisions[0].onTriggerEnter.AddListener(() => { hasThrowable.ForceDrop(); });
504 ce.collisions[0].onTriggerEnter.AddListener(() => { ltm.DoTheLerp(go.gameObject); });
505
506 ltm.skipDestroy = true;
507 ltm.onFinished = new UnityEvent();
508 ltm.onFinished.AddListener(() => { blue.SetActive(false); });
509 ltm.onFinished.AddListener(() => { go.GetComponentInChildren<Collider>().enabled = true; });
510#endif
511 }
512
513 }
514
515 StartCoroutine(LateRebuild());
516 }
517
518 IEnumerator LateRebuild()
519 {
520 yield return new WaitForEndOfFrame();
521 pb_Inspector.instance.RebuildInspector(pb_Selection.activeGameObject);
522 }
523
524
525 object UpdateEnabled()
526 {
527 return _transform.gameObject.activeSelf;
528 }
529
530 void OnSetEnabled(object value)
531 {
532 foreach (var go in pb_Selection.gameObjects)
533 {
534 go.SetActive((bool) value);
535 }
536 _transform.gameObject.SetActive((bool) value);
537 pb_ComponentDiff.AddDiff(target, "enabled", _transform.gameObject.activeSelf);
538 }
539
540 void Update()
541 {
542 if(Input.GetMouseButton(0))
543 {
544 if(pb_SelectionHandle.instance != null && pb_SelectionHandle.instance.InUse())
545 {
546 UpdateGUI();
547 }
548 }
549 }
550
551 object UpdatePosition(int index)
552 {
553 return _transform.position;
554 }
555 object UpdateLocalPosition(int index)
556 {
557 return _transform.localPosition;
558 }
559
560 object UpdateType(int index)
561 {
562 var isStatic = _transform.GetComponent<StaticGO>() != null;
563 var isTool = _transform.GetComponent<ToolGO>() != null;
564 return isStatic ? eType.Static : isTool ? eType.Tool : eType.Interactive;
565 }
566
567 void OnSetPosition(int index, object value)
568 {
569
570 foreach (var go in pb_Selection.gameObjects)
571 {
572 go.transform.position = (Vector3)value;
573 }
574 _transform.position = (Vector3)value;
575 pb_Selection.OnExternalUpdate();
576
577 pb_ComponentDiff.AddDiff(target, "position", _transform.position);
578 }
579
580 void OnSetLocalPosition(int index, object value)
581 {
582
583 foreach (var go in pb_Selection.gameObjects)
584 {
585 go.transform.localPosition = (Vector3)value;
586 }
587 _transform.localPosition = (Vector3)value;
588 pb_Selection.OnExternalUpdate();
589
590 pb_ComponentDiff.AddDiff(target, "localposition", _transform.localPosition);
591 }
592
593 object UpdateRotation(int index)
594 {
595 return _transform.localEulerAngles;
596 }
597
598 void OnSetRotation(int index, object value)
599 {
600 foreach (var go in pb_Selection.gameObjects)
601 {
602 go.transform.localRotation = Quaternion.Euler( (Vector3) value );
603 }
604 _transform.localRotation = Quaternion.Euler( (Vector3) value );
605 pb_Selection.OnExternalUpdate();
606 }
607
608 object UpdateScale(int index)
609 {
610 return _transform.localScale;
611 }
612
613 void OnSetScale(int index, object value)
614 {
615 foreach (var go in pb_Selection.gameObjects)
616 {
617 go.transform.localScale = (Vector3)value;
618 }
619 _transform.localScale = (Vector3) value;
620 pb_Selection.OnExternalUpdate();
621 }
622
623 object UpdateBounds(int index)
624 {
625 return getBounds(_transform.gameObject);
626 }
627 }
628}
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
System.Drawing.Image Image
Definition: TestScript.cs:37
UnityEngine.Color Color
Definition: TestScript.cs:32
List< NamedCollisionEvents > collisions
Component target
The UnityEngine.Component being edited.
static void AddDiff(Component component, string name, object value)
static void RegisterState(IUndo target, string message)
Definition: Undo.cs:214
Vector3 origLocalEuler
Definition: HashHolder.cs:7
Definition: Macro.cs:12
static string T(string key)
Definition: Macro.cs:19
static TablePositionSetter instance
Definition: ToolGO.cs:6
void Copy(Transform value)
void Paste(Transform pasteTo)
static TransformCopy instance
Definition: TransformCopy.cs:9
Tool
Definition: pb_Enum.cs:24
Credit Erdener Gonenc - @PixelEnvision.