Esempio n. 1
0
    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;
                }
            }
        }
    }
Esempio n. 2
0
    // 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();
    }
Esempio n. 3
0
    // 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);
        }
    }
Esempio n. 4
0
    public override void OnInspectorGUI()
    {
        BEScene beScene = (BEScene)target;

        if (DrawDefaultInspector())
        {
            beScene.ApplyCorrectMaterialAndLayerSetting();
        }
    }
Esempio n. 5
0
    void Start()
    {
        mainCamera            = this.GetComponent <Camera> ();
        mainCamera.clearFlags = CameraClearFlags.Nothing;
        beScene = BEScene.FindBEScene();

        mesh     = new Mesh();
        material = new Material(Shader.Find("Hidden/Occipital/LensDistortionMesh"));
    }
Esempio n. 6
0
    /// 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");
    }
Esempio n. 7
0
    /**
     * 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.");
        }
    }
Esempio n. 8
0
    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.");
            }
        }
    }
Esempio n. 9
0
    /**
     * 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());
    }
Esempio n. 10
0
    /// 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();
    }
Esempio n. 11
0
    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();
    }
Esempio n. 12
0
 void Start()
 {
     beScene = BEScene.FindBEScene();
     beScene.renderMaterial = renderMaterials[materialIndex];
     Debug.Log("Initial Material: <b>" + beScene.renderMaterial.name + "</b>");
 }
Esempio n. 13
0
    /**
     * 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");
        }
    }