3using System.Collections;
4using System.Collections.Generic;
9using JetBrains.Annotations;
13using Valve.VR.InteractionSystem;
24 [RequireComponent(typeof(pb_MetaDataComponent))]
27 #region Initialization & Singleton
32 this.name =
"Level Editor SceneGraph Root";
39 if (GameObject.Find(
"Iris asztal.Small"))
41 transform.SetParent(GameObject.Find(
"Iris asztal.Small").transform,
true);
46 yield
return new WaitForSeconds(0.5f);
57 foreach (var rb
in rigidList)
60 rb.isKinematic =
false;
69 private bool isEditingEnv, isEditingTools =
false;
70 internal string currentLevelName =
"";
71 private static List<Rigidbody> rigidList =
new List<Rigidbody>();
98 if (
instance.onObjectInstantiated ==
null)
99 instance.onObjectInstantiated = listener;
101 instance.onObjectInstantiated += listener;
120 if (
instance.onLevelCleared ==
null)
123 instance.onLevelCleared += listener;
135 GameObject go = (GameObject)GameObject.Instantiate(original);
137 if (original.transform.parent !=
null)
138 go.transform.SetParent(original.transform.parent);
140 go.transform.parent =
instance.transform;
144 if (
instance.onObjectInstantiated !=
null)
147 AddHashHolder(go.transform);
152 private static void AddHashHolder(Transform t)
154 var hash = t.gameObject.AddComponent<
HashHolder>().Hash;
155 foreach (Transform child
in t)
157 AddHashHolder(child);
168 GameObject go = (GameObject)GameObject.Instantiate(original, position, rotation);
170 if (original.transform.parent !=
null)
171 go.transform.SetParent(original.transform.parent);
173 go.transform.parent =
instance.transform;
177 if (
instance.onObjectInstantiated !=
null)
180 AddHashHolder(go.transform);
192 GameObject go = (GameObject)GameObject.Instantiate(original, position, rotation, parent);
196 if (
instance.onObjectInstantiated !=
null)
199 AddHashHolder(go.transform);
216 string scenegraph = JsonConvert.SerializeObject(
new[]
230 pb_Serialization.ConverterSettings);
231 Debug.Log(scenegraph);
238 public static void LoadLevel(
string levelJson,
bool ssol =
false)
243 FindObjectOfType<StartCanvas>(
true)?.canvas.SetActive(
true);
252 var nscb = FindObjectOfType<pb_NewSceneButton>();
261 var loaded_array = (
object[])JsonConvert.DeserializeObject<
object[]>(levelJson, pb_Serialization.ConverterSettings);
262 if (loaded_array ==
null)
264 Debug.LogWarning(
"Trying to load empty scene! Didn't save the course?");
284 if (loaded_array.Length > 2)
290 if (loaded_array.Length > 3)
303 if (loaded_array.Length > 3)
314 if (loaded_array.Length > 4)
326 var spawn = GameObject.Find(
"SpawnPoint");
330 throw new Exception(
"SpawnPoint not found!");
333 if (LoadSceneNode(loaded_array[0] as
pb_SceneNode, spawn, scene, ssol))
335 Debug.Log(
"LoadSceneNode returned true");
354 IEnumerator AfterReloaded()
356 yield
return new WaitForSeconds(3f);
371 foreach (var rb
in rigidList)
374 rb.isKinematic =
false;
378 private IEnumerator LateAllTCD()
381 Macro.allActiveTCD.Clear();
384 private static bool LoadSceneNode(
pb_SceneNode root_node, GameObject spawn, pb_Scene scene,
bool ssol,
bool envOnly =
false)
386 GameObject env =
null;
389 var curenv = GameObject.Find(
"Environment");
395 env =
new GameObject(
"Environment");
398 SpawnAllSpawnable(root_node, spawn, scene, ssol, envOnly, env);
402 if (!root || !root.transform)
410 Transform[] children =
new Transform[root.transform.childCount];
413 foreach (Transform t
in root.transform)
416 foreach (Transform t
in children)
417 t.SetParent(scene.transform);
419 pb_ObjectUtility.Destroy(root);
423 private static void SpawnAllSpawnable(
pb_SceneNode root_node, GameObject spawn, pb_Scene scene,
bool ssol,
bool envOnly, GameObject env, GameObject lastSpawned =
null)
425 foreach (var o
in root_node.
children)
430 if (o.name ==
"DobotRobot")
433 if (robot ==
null)
continue;
434 robot.transform.localPosition = o.localPos;
435 robot.transform.localRotation = o.transform.rotation;
436 robot.transform.localScale = o.transform.scale;
443 var spawned =
Instantiate(spawnable, spawn.transform.position,
Quaternion.identity, scene.transform);
444 spawned.GetComponent<
HashHolder>().oldLoadedHash = o.hash;
445 spawned.name = spawned.name.Replace(
"(Clone)",
"");
448 spawned.GetComponent<
RenameObject>().NewName = o.rename;
456 if (o.transform.isRestArea)
464 spawned.transform.SetParent(parentObject ? parentObject.transform : scene.transform,
true);
468 if (spawned.GetComponent<RawImage>())
474 spawned.transform.localPosition = o.localPos;
475 spawned.transform.localRotation = o.transform.rotation;
476 spawned.transform.localScale = o.transform.scale;
477 spawned.SetActive(o.transform.isEnabled);
491 if (!o.transform.isStatic)
493 if (o.transform.isTool)
496 blue.name +=
"_blue";
501 Destroy(blue.GetComponent<Interactable>());
502 Destroy(blue.GetComponent<Rigidbody>());
507 var bmrs = blue.GetComponentsInChildren<MeshRenderer>();
509 foreach (var bmr
in bmrs)
511 var bml =
new List<Material>();
512 for (
int i = 0; i < bmr.materials.Length; i++)
517 var currentcoll = bmr.gameObject.GetComponent<Collider>();
518 Destroy(currentcoll);
519 bmr.materials = bml.ToArray();
520 var coll = bmr.gameObject.AddComponent<MeshCollider>();
522 coll.isTrigger =
true;
527 Debug.LogError(
"Failed to get and set blue!");
530 blue.SetActive(
false);
532 spawned.AddComponent<
ToolGO>().blue = blue;
533 spawned.AddComponent<Rigidbody>().isKinematic =
true;
537 offset.
Offset = o.transform.offset;
538 offset.Rotation = o.transform.rotoffset;
539 offset.LeftOffset = o.transform.leftoffset;
540 offset.LeftRotation = o.transform.leftrotoffset;
549 spawned.AddComponent<Interactable>();
552 if (throwable.onPickUp ==
null)
554 throwable.onPickUp =
new UnityEvent();
557 if (throwable.DelayedOnPickUp ==
null)
559 throwable.DelayedOnPickUp =
new UnityEvent();
562 throwable.onPickUp.AddListener(() =>
564 blue.SetActive(
true);
565 blue.GetComponentInChildren<Collider>(
true).enabled =
false;
568 throwable.onDetachFromHand =
new UnityEvent();
570 throwable.DelayedOnPickUp.AddListener(() => { blue.GetComponentInChildren<Collider>(
true).enabled =
true; });
572 var bcoll = blue.GetComponentInChildren<Collider>(
true);
573 var ltm = blue.gameObject.AddComponent<
LerpToMe>();
575 ce.
collisions =
new List<NamedCollisionEvents>();
576 ce.collisions.Add(
new NamedCollisionEvents() { colliderName = bcoll.name, onTriggerEnter =
new UnityEvent() });
577 ce.collisions[0].onTriggerEnter.AddListener(() => { throwable.ForceDrop(); });
578 ce.collisions[0].onTriggerEnter.AddListener(() => { ltm.DoTheLerp(spawned); });
580 ltm.skipDestroy =
true;
581 ltm.onFinished =
new UnityEvent();
582 ltm.onFinished.AddListener(() => { blue.SetActive(
false); });
583 ltm.onFinished.AddListener(() => { spawned.GetComponentInChildren<Collider>().enabled =
true; });
588 var hasRigidbody = spawned.GetComponent<Rigidbody>();
589 var hasOffsetter = spawned.GetComponent<
OffsetHolder>();
590 var hasVisualOffsetter = spawned.GetComponent<
VisualOffset>();
592 var hasInteractable = spawned.GetComponent<Interactable>();
598 var rb = spawned.AddComponent<Rigidbody>() ;
600 rb.isKinematic =
true;
605 rb.isKinematic =
true;
612 offset.
Offset = o.transform.offset;
613 offset.Rotation = o.transform.rotoffset;
614 offset.LeftOffset = o.transform.leftoffset;
615 offset.LeftRotation = o.transform.leftrotoffset;
618 if (!hasVisualOffsetter)
625 if (!hasInteractable)
627 spawned.AddComponent<Interactable>() ;
646 var hasOffsetter = spawned.GetComponent<
OffsetHolder>();
647 var hasVisualOffsetter = spawned.GetComponent<
VisualOffset>();
652 offset.
Offset = o.transform.offset;
653 offset.Rotation = o.transform.rotoffset;
654 offset.LeftOffset = o.transform.leftoffset;
655 offset.LeftRotation = o.transform.leftrotoffset;
658 if (!hasVisualOffsetter)
664 if (o.convex !=
null && spawned.GetComponentInChildren<MeshCollider>())
666 spawned.GetComponentInChildren<MeshCollider>().convex = (
bool)o.convex;
667 if (o.trigger !=
null)
669 spawned.GetComponentInChildren<MeshCollider>().isTrigger = (
bool)o.trigger;
673 SetChildrenPositions(spawned.transform, o);
676 spawned.transform.SetParent(env.transform,
true);
679 if (o.children.Count > 0)
681 lastSpawned = spawned;
685 SpawnAllSpawnable(o, spawn, scene, ssol, envOnly, env, lastSpawned);
690 private static void SetupMaterials(
pb_SceneNode sn, GameObject spawned)
692 var mr = spawned.GetComponent<MeshRenderer>();
699 var comp = spawned.GetComponent(item.type);
702 if (comp is Renderer r && isEnabled !=
null)
704 r.enabled = (bool)isEnabled;
708 catch (NullReferenceException)
720 var _material = mr.materials[i];
722 if (_material.HasProperty(
"_Metallic"))
723 _material.SetFloat(
"_Metallic", mat.metallic);
724 if (_material.HasProperty(
"_Glossiness"))
725 _material.SetFloat(
"_Glossiness", mat.smoothness);
726 if (_material.HasProperty(
"_Color") && mat.color !=
default)
727 _material.SetColor(
"_Color", mat.color);
730 if (_material.HasProperty(
"_MetallicGlossMap") && !
string.IsNullOrEmpty(mat.metallicName))
732 if (_material.HasProperty(
"_BumpMap") && !
string.IsNullOrEmpty(mat.normalName))
734 if (_material.HasProperty(
"_OcclusionMap") && !
string.IsNullOrEmpty(mat.occlusionName))
739 matSettings.metallic = mat.metallic;
740 matSettings.smoothness = mat.smoothness;
741 matSettings.color = mat.color;
742 matSettings.textureName = mat.textureName;
743 matSettings.metallicName = mat.metallicName;
744 matSettings.normalName = mat.normalName;
745 matSettings.occlusionName = mat.occlusionName;
747 cth.matSettings[i] = matSettings;
761 if (isEditingTools)
return;
762 var env = GameObject.Find(
"Environment");
764 isEditingEnv = !isEditingEnv;
765 var temp =
new GameObject(
"TempHolder");
766 var count =
instance.transform.childCount;
767 for (
int i = 0; i < count; i++)
769 instance.transform.GetChild(0).SetParent(temp.transform,
true);
771 count = env.transform.childCount;
772 for (
int i = 0; i < count; i++)
774 env.transform.GetChild(0).SetParent(
instance.transform,
true);
776 count = temp.transform.childCount;
777 for (
int i = 0; i < count; i++)
779 temp.transform.GetChild(0).SetParent(env.transform,
true);
797 if (isEditingEnv)
return;
798 var envs =
new DirectoryInfo(Application.streamingAssetsPath)
799 .EnumerateFiles(
"*.env", SearchOption.AllDirectories)
801 var currentLoadedTool = envs.FirstOrDefault(x => x.Name == currentLevelName +
"_tool.env");
802 isEditingTools = !isEditingTools;
803 GameObject temp =
null;
806 temp =
new GameObject(
"TempHolder");
807 var count =
instance.transform.childCount;
808 for (
int i = 0; i < count; i++)
810 instance.transform.GetChild(0).SetParent(temp.transform,
true);
812 foreach (var tool
in tools)
814 tool?.transform.SetParent(
instance.transform,
true);
820 temp = GameObject.Find(
"TempHolder");
821 var parent = GameObject.Find(
"iris_position_helper");
825 if (currentLoadedTool !=
default(FileInfo))
827 if (
File.Exists(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name)))
829 lines =
File.ReadAllText(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name));
834 if (
File.Exists(Path.Combine(Application.streamingAssetsPath,
"tools.env")))
836 lines =
File.ReadAllText(Path.Combine(Application.streamingAssetsPath,
"tools.env"));
841 foreach (var tool
in tools)
843 if (tool ==
null)
continue;
844 tool.transform.SetParent(parent.transform,
true);
845 var blue = parent.transform.Find(tool.name +
"_blue");
848 blue.transform.position = tool.transform.position;
849 blue.transform.rotation = tool.transform.rotation;
850 blue.transform.localScale = tool.transform.localScale;
855 savefile += $
"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
856 savefile += $
"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
857 savefile += $
"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
858 savefile += $
"{tool.activeSelf};";
861 var line = lines.Split(
'\n')[j].Split(
';');
863 buffer += $
"{line[3]};";
864 buffer += $
"{line[4]};";
865 buffer += $
"{line[5]};\n";
870 savefile += $
"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
871 savefile += $
"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
872 savefile += $
"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
873 savefile += $
"{tool.activeSelf};\n";
894 savefile += $
"{tool.transform.position.x}:{tool.transform.position.y}:{tool.transform.position.z};";
895 savefile += $
"{tool.transform.eulerAngles.x}:{tool.transform.eulerAngles.y}:{tool.transform.eulerAngles.z};";
896 savefile += $
"{tool.transform.localScale.x}:{tool.transform.localScale.y}:{tool.transform.localScale.z};";
897 savefile += $
"{tool.activeSelf};\n";
901 var count = temp.transform.childCount;
902 for (
int i = 0; i < count; i++)
904 temp.transform.GetChild(0).SetParent(
instance.transform,
true);
907 if (currentLoadedTool !=
default(FileInfo))
909 File.WriteAllText(Path.Combine(Application.streamingAssetsPath, currentLoadedTool.Name), savefile);
913 File.WriteAllText(Path.Combine(Application.streamingAssetsPath,
"tools.env"), savefile);
925 private static void SetChildrenPositions(Transform parent,
pb_SceneNode node)
932 child = FindHash(parent, t.hash);
934 child = FindHashByName(parent, t, t.hash);
940 if (!child)
continue;
941 child.gameObject.SetActive(t.transform.isEnabled);
942 child.localRotation = t.transform.rotation;
943 child.localPosition = t.localPos;
944 child.localScale = t.transform.scale;
946 if (t.transform.offset !=
default || t.transform.rotoffset !=
default)
948 var offset = child.gameObject.AddComponent<
OffsetHolder>();
951 offset.
Offset = t.transform.offset;
952 offset.Rotation = t.transform.rotoffset;
953 offset.LeftOffset = t.transform.leftoffset;
954 offset.LeftRotation = t.transform.leftrotoffset;
962 SetupMaterials(t, child.gameObject);
964 var coll = child.GetComponent<MeshCollider>();
967 if (t.convex !=
null)
969 coll.convex = (bool)t.convex;
971 if (t.transform.isRestArea)
973 child.gameObject.AddComponent<
RestArea>();
981 SetChildrenPositions(child, t);
985 static Transform FindChildByRecursion(Transform aParent,
string aName)
987 if (aParent ==
null)
return null;
988 var result = aParent.Find(aName);
991 foreach (Transform child
in aParent)
993 result = FindChildByRecursion(child, aName);
1002 Debug.LogError(
"DEPRECATED!");
1004 var remoteJson = JsonConvert.DeserializeObject<
SceneNode>(levelJson);
1007 foreach (var jsonPositioner
in goList)
1014 static Transform FindHash(Transform root,
string hash)
1017 if (!hh)
return null;
1018 if (hash == hh.Hash)
return root;
1019 foreach (Transform rootChild
in root.transform)
1021 var retval = FindHash(rootChild, hash);
1031 static Transform FindHashByName(Transform root,
pb_SceneNode node,
string hash)
1034 if (!hh)
return null;
1035 if (hash == hh.Hash)
return root;
1036 if (node.
name == root.name &&
string.IsNullOrEmpty(hh.oldLoadedHash))
1041 foreach (Transform rootChild
in root.transform)
1043 var retval = FindHashByName(rootChild, node, hash);
1060 foreach (Transform t
in transform)
1061 pb_ObjectUtility.Destroy(t.gameObject);
1079 var envs =
new DirectoryInfo(Application.streamingAssetsPath)
1080 .EnumerateFiles(
"*.env", SearchOption.AllDirectories)
1082 var currentLoadedMap = envs.FirstOrDefault(x => x.Name == currentLevelName +
".env");
1083 var currentLoadedTool = envs.FirstOrDefault(x => x.Name == currentLevelName +
"_tool.env");
1084 var env_path = Path.Combine(Application.streamingAssetsPath,
"environment.env");
1085 var tool_path = Path.Combine(Application.streamingAssetsPath,
"tools.env");
1088 if (
File.Exists(env_path) || currentLoadedMap !=
default(FileInfo))
1090 var env = GameObject.Find(
"Environment");
1096 if (currentLoadedMap !=
default(FileInfo))
1098 var loaded_array = (
object[])JsonConvert.DeserializeObject<
object[]>(
File.ReadAllText(currentLoadedMap.FullName),
1099 pb_Serialization.ConverterSettings);
1100 LoadSceneNode(loaded_array[0] as
pb_SceneNode, GameObject.Find(
"SpawnPoint"),
instance,
false,
true);
1105 (
object[])JsonConvert.DeserializeObject<
object[]>(
File.ReadAllText(env_path),
1106 pb_Serialization.ConverterSettings);
1107 LoadSceneNode(loaded_array[0] as
pb_SceneNode, GameObject.Find(
"SpawnPoint"),
instance,
false,
true);
1112 if (
File.Exists(tool_path) || currentLoadedTool !=
default(FileInfo))
1114 if (currentLoadedTool !=
default(FileInfo))
1116 var loadedArray =
File.ReadAllLines(currentLoadedTool.FullName);
1122 var array = loadedArray[i].Split(
';');
1123 var blue = GameObject.Find(
"iris_position_helper").transform.Find(tool.name +
"_blue");
1124 var pos = array[0].Split(
':');
1125 var rot = array[1].Split(
':');
1126 var scl = array[2].Split(
':');
1133 tool.SetActive(act);
1140 blue.position = tool.transform.position;
1141 blue.eulerAngles = tool.transform.eulerAngles;
1142 blue.localScale = tool.transform.localScale;
1152 var loadedArray =
File.ReadAllLines(tool_path);
1158 var array = loadedArray[i].Split(
';');
1159 var blue = GameObject.Find(
"iris_position_helper").transform.Find(tool.name +
"_blue");
1167 tool.SetActive(act);
1173 blue.position = tool.transform.position;
1174 blue.eulerAngles = tool.transform.eulerAngles;
1175 blue.localScale = tool.transform.localScale;
1202 private List<GameObject> GetChildren(Transform transform)
1204 List<GameObject> children =
new List<GameObject>();
1206 foreach (Transform t
in transform)
1208 if (!t.gameObject.activeSelf)
1211 children.Add(t.gameObject);
1212 children.AddRange(GetChildren(t));
List< MatSettings > matSettings
List< NamedCollisionEvents > collisions
void LoadJson(Controller controller)
static Controller Instance
static DobotEditorManager instance
GameObject GetPrefabFromName(string goName)
static pb_PrefabBrowser instance
ChangedTextureHolder changedTexture
GameObject ToGameObject()
List< pb_SceneNode > children
List< pb_ISerializable > components
static void StripEditorComponents(GameObject target)
static void AddOnLevelLoadedListener(Callback listener)
void EditEnvironmentToggle()
static List< GameObject > Children()
static void ReloadLevel(string levelJson)
static string SaveLevel()
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation, Transform parent)
static void LoadLevel(string levelJson, bool ssol=false)
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original, Vector3 position, Quaternion rotation)
Callback< GameObject > onObjectInstantiated
void LoadEnvAndTools(bool onlyTools=false)
void EditToolsToggle(GameObject[] tools)
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original)
static void AddOnObjectInstantiatedListener(Callback< GameObject > listener)
static void AddOnLevelClearedListener(Callback listener)
bool HasTexture(string filename)
Texture2D GetFullRes(string filename)
static GlobalTextureHolder instance
static void cacheAllTCD()
static float StoF(string value)
static ModeSelect instance
static TablePositionSetter instance