static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { // Construct new BridgeEngineScene GameObject if we just imported it. foreach (var assetPath in importedAssets) { if (assetPath == BEScene.ImportFolderPath() && BridgeEngineUnity.IsInScene() && (BEScene.IsInScene() == false)) { BEScene.CreateNewBridgeEngineScene(); break; } } // Clean-up if we removed the BridgeEngineScene. foreach (var assetPath in deletedAssets) { if (assetPath == BEScene.ImportFolderPath() && BridgeEngineUnity.IsInScene() && BEScene.IsInScene()) { Debug.Log("Removing " + BEScene.gameObjectName + " from Hierarchy"); GameObject beScene = GameObject.Find(BEScene.gameObjectName); if (beScene) { GameObject.DestroyImmediate(beScene); break; } } } }
// Watch for user drag-drop of BridgeEngineScene into Unity's Assets folder, // and move it into the correct imported location. static void MoveBridgeEngineSceneFolder() { string beSceneRootPath = "Assets/BridgeEngineScene"; if (Directory.Exists("Assets/BridgeEngineScene") == false) { return; } Debug.Log("Importing BridgeEngineScene into location " + BEScene.ImportFolderPath()); // Make sure the target base path is present. if (!Directory.Exists(BEScene.EditorResourcesFolderPath())) { Directory.CreateDirectory(BEScene.EditorResourcesFolderPath()); } // If Imported folder already exists, replace it. string beSceneFolderPath = BEScene.ImportFolderPath(); if (Directory.Exists(beSceneFolderPath)) { Directory.Delete(beSceneFolderPath, true); } // Now move BridgeEngineScene folder into place. Directory.Move(beSceneRootPath, beSceneFolderPath); AssetDatabase.Refresh(); }
// Use this for initialization void Start() { // Deactivate all the objects to place by default. foreach (GameObject o in placeObjects) { o.SetActive(false); } // Hide placement ring by default on start. placementRing.SetActive(false); // Create an EventTriggers on every collidable mesh in BEScene BEScene beScene = BEScene.FindBEScene(); Debug.Assert(beScene != null, "BESampleMRController requires a valid @BridgeEngineScene to work properly"); foreach (MeshCollider collider in beScene.GetComponentsInChildren <MeshCollider>()) { var trigger = collider.gameObject.AddComponent <EventTrigger>(); worldEventTriggers.Add(trigger); EventTrigger.Entry entryEnter = new EventTrigger.Entry(); entryEnter.eventID = EventTriggerType.PointerEnter; entryEnter.callback.AddListener((data) => { OnPlaceHilight(true); }); trigger.triggers.Add(entryEnter); EventTrigger.Entry entryExit = new EventTrigger.Entry(); entryExit.eventID = EventTriggerType.PointerExit; entryExit.callback.AddListener((data) => { OnPlaceHilight(false); }); trigger.triggers.Add(entryExit); } }
public override void OnInspectorGUI() { BEScene beScene = (BEScene)target; if (DrawDefaultInspector()) { beScene.ApplyCorrectMaterialAndLayerSetting(); } }
void Start() { mainCamera = this.GetComponent <Camera> (); mainCamera.clearFlags = CameraClearFlags.Nothing; beScene = BEScene.FindBEScene(); mesh = new Mesh(); material = new Material(Shader.Find("Hidden/Occipital/LensDistortionMesh")); }
/// Construct a new top level @BridgeEngineScene object and set it up. public static void CreateNewBridgeEngineScene() { BEScene beScene = GameObject.FindObjectOfType <BEScene>(); // Remove the old beScene GameObject. if (beScene != null) { Debug.Log("Replacing " + BEScene.gameObjectName + " in Hierarchy"); GameObject.DestroyImmediate(beScene.gameObject); } Debug.Log("Creating " + BEScene.gameObjectName + " in Hierarchy"); beScene = (new GameObject()).AddComponent <BEScene>(); beScene.name = BEScene.gameObjectName; // Default the material to LiveColorProjShadow var material = AssetDatabase.LoadAssetAtPath <Material>("Assets/BridgeEngine/Materials/LiveCamProjShadow.mat"); beScene.renderMaterial = material; // Load mesh object from beSceneFolder. string beSceneFolderName = ImportFolderName(); GameObject meshBaseObject = Resources.Load <GameObject>(Path.Combine(beSceneFolderName, "colorizedMesh")); if (meshBaseObject == null) { meshBaseObject = Resources.Load <GameObject>(Path.Combine(beSceneFolderName, "coarseMesh")); } if (meshBaseObject == null) { Debug.LogWarning("Could not load a mesh from either colourizedMeshor or coarseMesh"); return; } var obj = GameObject.Instantiate <GameObject>(meshBaseObject); obj.tag = "EditorOnly"; obj.AddComponent <EditorOnlyScript>(); obj.transform.parent = beScene.transform; obj.transform.localScale = new Vector3(-1, -1, 1); // Make all sub-meshes collidable, editorOnly, and removed at runtime MeshFilter[] meshes = obj.GetComponentsInChildren <MeshFilter>(); foreach (MeshFilter meshFilter in meshes) { MeshCollider collider = meshFilter.gameObject.AddComponent <MeshCollider>(); collider.sharedMesh = meshFilter.sharedMesh; meshFilter.tag = "EditorOnly"; meshFilter.gameObject.AddComponent <EditorOnlyScript>(); } beScene.ApplyCorrectMaterialAndLayerSetting(); Debug.Log("`BridgeEngineScene` folder imported"); }
/** * Automatically attach to BEUnity on the default MainCamera, and add a listener for onControllerDidPressButton events. */ void Awake() { beScene = BEScene.FindBEScene(); if (beScene == null) { Debug.LogWarning("BESampleMRController needs a @BridgeEngineScene to work properly."); return; } beUnity = BridgeEngineUnity.main; if (beUnity) { beUnity.onControllerButtonEvent.AddListener(OnButtonEvent); } else { Debug.LogWarning("Cannot connect to BridgeEngineUnity controller."); } }
void ImportBridgeEngineSceneFolder() { string path = EditorUtility.OpenFolderPanel("Select BridgeEngineScene Folder", "~/Desktop/", ""); if (string.IsNullOrEmpty(path) == false || Directory.Exists(path)) { string dirName = Path.GetFileName(path); if (dirName == "BridgeEngineScene") { string destPath = BEScene.ImportFolderPath(); if (Directory.Exists(destPath)) { string message = destPath + " folder exists. Would you like to replace it? "; bool replace = EditorUtility.DisplayDialog("Replace Folder?", message, "Replace", "Cancel"); if (replace) { Debug.Log("Deleting old `BridgeEngineScene`..."); if (Directory.Exists(destPath)) { Directory.Delete(destPath, true); } } else { Debug.Log("`BridgeEngineScene` import cancelled"); return; } } Debug.Log("Importing new `BridgeEngineScene`..."); DirectoryCopy(path, destPath, true); AssetDatabase.Refresh(); } else { Debug.LogWarning("Safety check: folder name is not `BridgeEngineScene` so not importing."); } } }
/** * Detect if there's a duplicate instance of BridgeEngineUnity main script loaded, * as this could seriousely muck-up interop to BE. * Set up the camera near and far clipping planes, and register the interop callbacks. */ IEnumerator Start() { #if !UNITY_EDITOR // Bridge Engine is guaranteed to be ready on start. // Immediately load the mesh, only if we have a BEScene to load them into. if (BEScene.IsInScene()) { BridgeEngineUnityInterop.be_loadMeshes(ScanMeshCallback); } else { Debug.Log("No @BridgeEngineScene present, skipping loading world meshes"); } #endif if (isStereoModeActive) { stereoCamera = mainCamera.gameObject.AddComponent <BEStereoCamera>(); } else { monoCamera = mainCamera.gameObject.AddComponent <BEMonoCamera>(); } Application.targetFrameRate = 60; lastTrackerUpdate.trackerPoseAccuracy = BETrackerPoseAccuracy.Uninitialized; // Configure the Tracking UIs BridgeEngineUnity instance. var lostTrackingBillboard = gameObject.GetComponentInChildren <BELostTrackingBillboard>(includeInactive: true); if (lostTrackingBillboard) { lostTrackingBillboard.beUnity = this; } // Register for callbacks. RegisterTrackerCallback(); ControllerRegisterAndStart(); return(HideOverlayAfterSplash()); }
/// Add an inspector header that manages the BridgeEngineScene folder import. public override void OnInspectorGUI() { if (Directory.Exists("Assets/BridgeEngineScene") == false) { if (BEScene.ImportFolderExists() == false) { EditorGUILayout.HelpBox("You can import your own BridgeEngineScene folder. Use a sample app, scan a space, and use iTunes to copy the BridgeEngineScene folder onto your desktop. Then import it to Unity for quicker testing.", MessageType.Info, true); if (GUILayout.Button("Import BridgeEngineScene folder...")) { ImportBridgeEngineSceneFolder(); } } else { EditorGUILayout.HelpBox("Editor/Resources/ImportedBridgeEngineScene is present", MessageType.None, true); if (BEScene.IsInScene() == false && GUILayout.Button("Rebuild " + BEScene.gameObjectName)) { BEScene.CreateNewBridgeEngineScene(); } if (GUILayout.Button("Remove Imported BridgeEngineScene")) { RemoveBridgeEngineSceneFolder(); } } } else { EditorGUILayout.HelpBox("BridgeEngineScene needs to be imported into the correct place.", MessageType.Info, true); if (GUILayout.Button("Import BridgeEngineScene folder...")) { MoveBridgeEngineSceneFolder(); } } EditorGUILayout.Space(); base.OnInspectorGUI(); }
void RemoveBridgeEngineSceneFolder() { string beSceneFolder = BEScene.ImportFolderPath(); // Prefetch the next parent to check below. DirectoryInfo nextParent = Directory.GetParent(beSceneFolder); // Explicitely delete the BridgeEngineScene folder. if (Directory.Exists(beSceneFolder)) { Directory.Delete(beSceneFolder, true); File.Delete(beSceneFolder + ".meta"); } // Clear out any empty Folders in reverse descending order. // Stopping at the top level "Assets" folder. while (nextParent != null && nextParent.Name != "Assets") { DirectoryInfo currentDir = nextParent; nextParent = nextParent.Parent; try { currentDir.Delete(); // Delete any empty paths. // And clean up the meta file associated with it. string metaFile = currentDir.ToString() + ".meta"; if (File.Exists(metaFile)) { File.Delete(metaFile); } } catch (IOException) { // Stop early, we hit a non-empty folder or something else. nextParent = null; } } AssetDatabase.Refresh(); }
void Start() { beScene = BEScene.FindBEScene(); beScene.renderMaterial = renderMaterials[materialIndex]; Debug.Log("Initial Material: <b>" + beScene.renderMaterial.name + "</b>"); }
/** * Called when mesh i / n is scanned, so we can re-create it in Unity */ void ScannedMeshTransfer(int meshIndex, int meshCount, int verticesCount, IntPtr positions, IntPtr normals, IntPtr colors, IntPtr uvs, int indiciesCount, IntPtr indicies16) { string desc = string.Format("Scanned Object {0}/{1}", meshIndex + 1, meshCount); // Debug.LogFormat("ScannedMeshTransfer. {0} / {1}. verticesCount = {2}. indiciesCount = {3}", meshIndex, meshCount, verticesCount, indiciesCount); if (meshCount <= 0) { return; } if (meshIndex >= meshCount) { return; } // Make sure we have a valid BEScene object to attach the meshes to. var beSceneObject = BEScene.FindBEScene(); // We expect a valid scene, or something's wrong. if (beSceneObject == null) { Debug.LogFormat("BridgeEngineScene not found, couldn't load mesh \"{0}\"", desc); return; } var meshInTransfer = new Mesh(); // strings allocate string meshDesc = "[Mesh]" + desc; meshInTransfer.name = meshDesc; meshInTransfer.subMeshCount = 1; meshInTransfer.vertices = BridgeEngineUnityInterop.GetNativeArray <Vector3>(positions, verticesCount); int[] indxArray = BridgeEngineUnityInterop.GetNativeIndxArray(indicies16, indiciesCount); bool useForRendering = true; if (useForRendering) { meshInTransfer.normals = BridgeEngineUnityInterop.GetNativeArray <Vector3>(normals, verticesCount); meshInTransfer.colors = BridgeEngineUnityInterop.GetNativeArray <Color>(colors, verticesCount); meshInTransfer.uv = BridgeEngineUnityInterop.GetNativeArray <Vector2>(uvs, verticesCount); if (meshInTransfer.normals == null) { meshInTransfer.RecalculateNormals(); } } meshInTransfer.SetIndices(indxArray, MeshTopology.Triangles, 0, true); var meshObject = new GameObject(desc); meshObject.transform.SetParent(beSceneObject.transform, false); // Don't do any magic with the BEScene transform. if (useForRendering) { meshObject.AddComponent <MeshFilter>().sharedMesh = meshInTransfer; meshObject.AddComponent <MeshRenderer>(); } // Make sure the mesh has physics MeshCollider collider = meshObject.GetComponent <MeshCollider>() ?? meshObject.AddComponent <MeshCollider>(); collider.sharedMesh = meshInTransfer; // transfer complete if (meshIndex == meshCount - 1) { beSceneObject.ApplyCorrectMaterialAndLayerSetting(); Debug.Log("ScannedMeshTransfer. Complete, applying materials"); } }