Newer
Older
HoloAnatomy / Assets / HoloToolkit-Examples / Sharing / SharingService / Scripts / RoomTest.cs
SURFACEBOOK2\jackwynne on 25 May 2018 8 KB v1
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.

using UnityEngine;
using Random = System.Random;

namespace HoloToolkit.Sharing.Tests
{
    /// <summary>
    /// Test class for demonstrating creating rooms and anchors.
    /// </summary>
    public class RoomTest : MonoBehaviour
    {
        private RoomManagerAdapter listener;
        private RoomManager roomMgr;

        private string roomName = "New Room";
        private Vector2 scrollViewVector = Vector2.zero;
        private int padding = 4;
        private int areaWidth = 400;
        private int areaHeight = 300;
        private int buttonWidth = 80;
        private int lineHeight = 20;

        private Vector2 anchorScrollVector = Vector2.zero;
        private string anchorName = "New Anchor";
        private readonly byte[] anchorTestData = new byte[5 * 1024 * 1024]; // 5 meg test buffer

        private void Start()
        {
            for (int i = 0; i < anchorTestData.Length; ++i)
            {
                anchorTestData[i] = (byte)(i % 256);
            }

            SharingStage stage = SharingStage.Instance;
            if (stage != null)
            {
                SharingManager sharingMgr = stage.Manager;
                if (sharingMgr != null)
                {
                    roomMgr = sharingMgr.GetRoomManager();

                    listener = new RoomManagerAdapter();
                    listener.RoomAddedEvent += OnRoomAdded;
                    listener.RoomClosedEvent += OnRoomClosed;
                    listener.UserJoinedRoomEvent += OnUserJoinedRoom;
                    listener.UserLeftRoomEvent += OnUserLeftRoom;
                    listener.AnchorsChangedEvent += OnAnchorsChanged;
                    listener.AnchorsDownloadedEvent += OnAnchorsDownloaded;
                    listener.AnchorUploadedEvent += OnAnchorUploadComplete;

                    roomMgr.AddListener(listener);
                }
            }
        }

        private void OnDestroy()
        {
            roomMgr.RemoveListener(listener);
            listener.Dispose();
        }

        private void OnGUI()
        {
            // Make a background box
            scrollViewVector = GUI.BeginScrollView(
                new Rect(25, 25, areaWidth, areaHeight),
                scrollViewVector,
                new Rect(0, 0, areaWidth, areaHeight));

            if (roomMgr != null)
            {
                SessionManager sessionMgr = SharingStage.Instance.Manager.GetSessionManager();
                if (sessionMgr != null)
                {
                    roomName = GUI.TextField(
                            new Rect(buttonWidth + padding, 0, areaWidth - (buttonWidth + padding), lineHeight),
                            roomName);

                    if (GUI.Button(new Rect(0, 0, buttonWidth, lineHeight), "Create"))
                    {
                        Random rnd = new Random();

                        Room newRoom = roomMgr.CreateRoom(roomName, rnd.Next(), false);
                        if (newRoom == null)
                        {
                            Debug.LogWarning("Cannot create room");
                        }
                    }

                    Room currentRoom = roomMgr.GetCurrentRoom();

                    for (int i = 0; i < roomMgr.GetRoomCount(); ++i)
                    {
                        Room room = roomMgr.GetRoom(i);

                        int vOffset = (padding + lineHeight) * (i + 1);
                        int hOffset = 0;

                        bool keepOpen = GUI.Toggle(new Rect(hOffset, vOffset, lineHeight, lineHeight), room.GetKeepOpen(), "");
                        room.SetKeepOpen(keepOpen);

                        hOffset += lineHeight + padding;

                        if (currentRoom != null && room.GetID() == currentRoom.GetID())
                        {
                            if (GUI.Button(new Rect(hOffset, vOffset, buttonWidth, lineHeight), "Leave"))
                            {
                                roomMgr.LeaveRoom();
                            }
                        }
                        else
                        {
                            if (GUI.Button(new Rect(hOffset, vOffset, buttonWidth, lineHeight), "Join"))
                            {
                                if (!roomMgr.JoinRoom(room))
                                {
                                    Debug.LogWarning("Cannot join room");
                                }
                            }
                        }

                        hOffset += buttonWidth + padding;

                        GUI.Label(new Rect(hOffset, vOffset, areaWidth - (buttonWidth + padding), lineHeight),
                            room.GetName().GetString());
                    }
                }
            }

            // End the ScrollView
            GUI.EndScrollView();

            if (roomMgr != null)
            {
                Room currentRoom = roomMgr.GetCurrentRoom();

                if (currentRoom != null)
                {
                    // Display option to upload anchor
                    anchorScrollVector = GUI.BeginScrollView(
                        new Rect(areaWidth + 50, 25, areaWidth, areaHeight),
                        anchorScrollVector,
                        new Rect(0, 0, areaWidth, areaHeight));

                    anchorName =
                        GUI.TextField(
                            new Rect(
                                buttonWidth + padding,
                                0,
                                areaWidth - (buttonWidth + padding),
                                lineHeight),
                            anchorName);

                    if (GUI.Button(new Rect(0, 0, buttonWidth, lineHeight), "Create"))
                    {
                        if (!roomMgr.UploadAnchor(currentRoom, anchorName, anchorTestData, anchorTestData.Length))
                        {
                            Debug.LogError("Failed to start anchor upload");
                        }
                    }

                    for (int i = 0; i < currentRoom.GetAnchorCount(); ++i)
                    {
                        int vOffset = (padding + lineHeight) * (i + 1);

                        XString currentRoomAnchor = currentRoom.GetAnchorName(i);

                        GUI.Label(
                            new Rect(
                                buttonWidth + padding,
                                vOffset,
                                areaWidth - (buttonWidth + padding),
                                lineHeight),
                            currentRoomAnchor);

                        if (GUI.Button(new Rect(0, vOffset, buttonWidth, lineHeight), "Download"))
                        {
                            if (!roomMgr.DownloadAnchor(currentRoom, currentRoomAnchor))
                            {
                                Debug.LogWarning("Failed to start anchor download");
                            }
                        }
                    }

                    GUI.EndScrollView();
                }
            }
        }

        private void OnRoomAdded(Room newRoom)
        {
            Debug.LogFormat("Room {0} added", newRoom.GetName().GetString());
        }

        private void OnRoomClosed(Room room)
        {
            Debug.LogFormat("Room {0} closed", room.GetName().GetString());
        }

        private void OnUserJoinedRoom(Room room, int user)
        {
            User joinedUser = SharingStage.Instance.SessionUsersTracker.GetUserById(user);
            Debug.LogFormat("User {0} joined Room {1}", joinedUser.GetName(), room.GetName().GetString());
        }

        private void OnUserLeftRoom(Room room, int user)
        {
            User leftUser = SharingStage.Instance.SessionUsersTracker.GetUserById(user);
            Debug.LogFormat("User {0} left Room {1}", leftUser.GetName(), room.GetName().GetString());
        }

        private void OnAnchorsChanged(Room room)
        {
            Debug.LogFormat("Anchors changed for Room {0}", room.GetName().GetString());
        }

        private void OnAnchorsDownloaded(bool successful, AnchorDownloadRequest request, XString failureReason)
        {
            if (successful)
            {
                Debug.LogFormat("Anchors download succeeded for Room {0}", request.GetRoom().GetName().GetString());
            }
            else
            {
                Debug.LogFormat("Anchors download failed: {0}", failureReason.GetString());
            }
        }

        private void OnAnchorUploadComplete(bool successful, XString failureReason)
        {
            if (successful)
            {
                Debug.Log("Anchors upload succeeded");
            }
            else
            {
                Debug.LogFormat("Anchors upload failed: {0}", failureReason.GetString());
            }
        }
    }
}