public void SendCameraData(IConnectionProvider connectionProvider, Camera camera, DateTime time)
        {
            writer.BeginMessage(RemoteMessage.ARCameraData);

            writer.Write(camera.transform.position.x);
            writer.Write(camera.transform.position.y);
            writer.Write(camera.transform.position.z);

            writer.Write(camera.transform.rotation.x);
            writer.Write(camera.transform.rotation.y);
            writer.Write(camera.transform.rotation.z);
            writer.Write(camera.transform.rotation.w);

            for (int i = 0; i < 16; i++)
            {
                writer.Write(camera.projectionMatrix[0]);
            }

            writer.Write(camera.fieldOfView);

            writer.Write(time.Ticks);

            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendTouchInput(IConnectionProvider connectionProvider)
        {
            for (int i = 0; i < Input.touchCount; ++i)
            {
                Touch touch = Input.GetTouch(i);
                writer.BeginMessage(RemoteMessage.TouchInput);
                writer.Write(touch.position.x);
                writer.Write(touch.position.y);
                writer.Write((long)Time.frameCount);
                writer.Write(touch.fingerId);
                writer.Write((int)touch.phase);
                writer.Write((int)touch.tapCount);

                // Added in Unity 5.4
                writer.Write(touch.radius);
                writer.Write(touch.radiusVariance);
                writer.Write((int)touch.type);
                writer.Write(touch.pressure);
                writer.Write(touch.maximumPossiblePressure);
                writer.Write(touch.azimuthAngle);
                writer.Write(touch.altitudeAngle);

                writer.EndMessage(stream);
            }

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendGyroscopeInput(IConnectionProvider connectionProvider)
        {
            // TODO: check updateInterval here..
            Gyroscope gyro = Input.gyro;

            writer.BeginMessage(RemoteMessage.GyroInput);
            writer.Write(gyro.rotationRate.x);
            writer.Write(gyro.rotationRate.y);
            writer.Write(gyro.rotationRate.z);
            writer.Write(gyro.rotationRateUnbiased.x);
            writer.Write(gyro.rotationRateUnbiased.y);
            writer.Write(gyro.rotationRateUnbiased.z);
            writer.Write(gyro.gravity.x);
            writer.Write(gyro.gravity.y);
            writer.Write(gyro.gravity.z);
            writer.Write(gyro.userAcceleration.x);
            writer.Write(gyro.userAcceleration.y);
            writer.Write(gyro.userAcceleration.z);
            writer.Write(gyro.attitude.x);
            writer.Write(gyro.attitude.y);
            writer.Write(gyro.attitude.z);
            writer.Write(gyro.attitude.w);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendJoystickNames(IConnectionProvider connectionProvider)
        {
            string[] joystickNames = Input.GetJoystickNames();

            if (joystickNames.Length == 0 && oldJoystickNames.Length == 0)
            {
                return;
            }

            if (!Enumerable.SequenceEqual(oldJoystickNames, joystickNames))
            {
                oldJoystickNames = joystickNames;

                writer.BeginMessage(RemoteMessage.JoystickNames);
                writer.Write((byte)joystickNames.Length);

                foreach (string joystickName in joystickNames)
                {
                    writer.Write(joystickName);
                }

                writer.EndMessage(stream);
            }

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendLocationServiceData(IConnectionProvider connectionProvider)
        {
            var data = new OldLocationData
            {
                isEnabledByUser = Input.location.isEnabledByUser,
                status          = Input.location.status,
                lastData        = Input.location.status == LocationServiceStatus.Running ? Input.location.lastData : default(LocationInfo)
            };

            if (oldLocationData.HasValue && (oldLocationData.Value.Equals(data)))
            {
                return;
            }

            writer.BeginMessage(RemoteMessage.LocationServiceData);
            writer.Write(data.isEnabledByUser);
            writer.Write((int)data.status);
            writer.Write(data.lastData.timestamp);
            writer.Write(data.lastData.latitude);
            writer.Write(data.lastData.longitude);
            writer.Write(data.lastData.altitude);
            writer.Write(data.lastData.horizontalAccuracy);
            writer.Write(data.lastData.verticalAccuracy);
            writer.EndMessage(stream);

            oldLocationData = data;

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendReadyToStream(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.ReadyToScreenStream);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendDeviceOrientation(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.DeviceOrientation);
            writer.Write((int)Screen.orientation);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        internal void SendCustomData(IConnectionProvider connectionProvider, Func <PacketWriter, object> p, int v)
        {
            writer.BeginMessage(RemoteMessage.CustomData);
            writer.Write(v);
            p(writer);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendHello(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.Hello);
            writer.Write("UnityRemote");
            writer.Write((uint)0);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendDeviceFeatures(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.DeviceFeatures);
            writer.Write(Input.touchPressureSupported);
            writer.Write(Input.stylusTouchSupported);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendTrackingStateChanged(IConnectionProvider connectionProvider, int data)
        {
            writer.BeginMessage(RemoteMessage.ARTrackingStateChanged);

            writer.Write(data);

            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendCustomData(IConnectionProvider connectionProvider, byte[] data, int id)
        {
            writer.BeginMessage(RemoteMessage.CustomData);
            writer.Write(id);
            writer.Write(data.Length);
            writer.Write(data);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendAccelerometerInput(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.AccelerometerInput);
            writer.Write(Input.acceleration.x);
            writer.Write(Input.acceleration.y);
            writer.Write(Input.acceleration.z);
            writer.Write(Time.deltaTime);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendTouchInput(IConnectionProvider connectionProvider, int ph, float x, float y)
        {
            writer.BeginMessage(RemoteMessage.CustomData);
            writer.Write((int)CustomDataID.InputEvent + 1);
            writer.Write(ph);
            writer.Write(x);
            writer.Write(y);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendGyroscopeSettings(IConnectionProvider connectionProvider)
        {
            Gyroscope gyro = Input.gyro;

            writer.BeginMessage(RemoteMessage.GyroSettings);
            writer.Write(gyro.enabled ? 1 : 0);
            writer.Write(gyro.updateInterval);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendOptions(IConnectionProvider connectionProvider)
        {
            // Add Screen size information
            // TODO: only send when changed
            writer.BeginMessage(RemoteMessage.Options);
            writer.Write(Screen.width);
            writer.Write(Screen.height);
            writer.Write((int)Screen.orientation);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendJoystickInput(IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.JoystickInput);

            for (int joystick = 0; joystick < MAX_JOYSTICKS; joystick++)
            {
                WriteJoystick(joystick);
            }

            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendWebCamDeviceList(IConnectionProvider connectionProvider, RemoteWebCamDevice[] devices)
        {
            writer.BeginMessage(RemoteMessage.WebCamDeviceList);
            writer.Write((uint)devices.Length);
            foreach (var device in devices)
            {
                writer.Write(device.device.isFrontFacing);
                writer.Write(device.name);
            }
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendWebCamStream(string name, int width, int height, byte[] image, int angle, bool verticallyMirrored, IConnectionProvider connectionProvider)
        {
            writer.BeginMessage(RemoteMessage.WebCamStream);
            writer.Write(name);
            writer.Write((uint)width);
            writer.Write((uint)height);
            writer.Write(angle);
            writer.Write(verticallyMirrored);
            writer.Write((uint)image.Length);
            writer.Write(image);
            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
        public void SendPointCloudUpdated(IConnectionProvider connectionProvider, List <Vector3> points)
        {
            writer.BeginMessage(RemoteMessage.ARPointCloudData);

            writer.Write(points.Count);

            for (int i = 0; i < points.Count; i++)
            {
                writer.Write(points[i].x);
                writer.Write(points[i].y);
                writer.Write(points[i].z);
            }

            writer.EndMessage(stream);


            connectionProvider.SendMessage(stream);
        }
        public void SendPlane(IConnectionProvider connectionProvider, int type, BoundedPlane Plane)
        {
            writer.BeginMessage(RemoteMessage.ARPlaneData);

            writer.Write((DateTime.UtcNow - ARRemotePath.connectedTime).TotalSeconds);

            writer.Write(Plane.Center.x);
            writer.Write(Plane.Center.y);
            writer.Write(Plane.Center.z);

            writer.Write(Plane.Pose.position.x);
            writer.Write(Plane.Pose.position.y);
            writer.Write(Plane.Pose.position.z);

            writer.Write(Plane.Pose.rotation.x);
            writer.Write(Plane.Pose.rotation.y);
            writer.Write(Plane.Pose.rotation.z);
            writer.Write(Plane.Pose.rotation.w);

            writer.Write(Plane.Size.x);
            writer.Write(Plane.Size.y);

            writer.Write((int)Plane.Alignment);

            writer.Write(type);

            byte[]    t         = StructToByteArray <TrackableId>(Plane.Id);
            IdToArray idToArray = ByteArrayToType <IdToArray>(t);

            writer.Write(idToArray.id0);
            writer.Write(idToArray.id1);

            byte[]    subsumedToByte  = StructToByteArray <TrackableId>(Plane.SubsumedById);
            IdToArray subsumedToArray = ByteArrayToType <IdToArray>(subsumedToByte);

            writer.Write(subsumedToArray.id0);
            writer.Write(subsumedToArray.id1);


            writer.EndMessage(stream);

            connectionProvider.SendMessage(stream);
        }
        public void SendPointCloudUpdated(IConnectionProvider connectionProvider, PointCLoudUpdated data)
        {
            int size = sizeof(int) + (sizeof(float) * data.size * 3);

            byte[] buffer = new byte[size];

            MemoryStream stream = new MemoryStream(buffer);
            BinaryWriter reader = new BinaryWriter(stream);

            reader.Write(data.size);

            foreach (var p in data.points)
            {
                reader.Write(p.x);
                reader.Write(p.y);
                reader.Write(p.z);
            }

            reader.Close();

            connectionProvider.SendMessage(buffer, pointCloudUpdatedID);
        }
        public void SendCompassData(IConnectionProvider connectionProvider)
        {
            var compass = Input.compass;
            var data    = new OldCompassData
            {
                enabled         = compass.enabled,
                magneticHeading = compass.magneticHeading,
                trueHeading     = compass.trueHeading,
                headingAccuracy = 0.0f,
                rawVector       = compass.rawVector,
                timestamp       = compass.timestamp,
            };

            if (oldCompassData.HasValue && (oldCompassData.Value.Equals(data)))
            {
                return;
            }

            writer.BeginMessage(RemoteMessage.CompassData);
            writer.Write(data.enabled);
            writer.Write(data.magneticHeading);
            writer.Write(data.trueHeading);
            writer.Write(data.headingAccuracy);
            writer.Write(data.rawVector.x);
            writer.Write(data.rawVector.y);
            writer.Write(data.rawVector.z);
            writer.Write(data.timestamp);
            writer.EndMessage(stream);

            oldCompassData = data;

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
 public void SendTrackingStateChanged(IConnectionProvider connectionProvider, TrackingStateChanged data)
 {
     connectionProvider.SendMessage(StructToByteArray <TrackingStateChanged>(data), trackingStateChanged);
 }
 public void SendFrameReceived(IConnectionProvider connectionProvider, CameraFrameReceived data)
 {
     connectionProvider.SendMessage(StructToByteArray <CameraFrameReceived>(data), frameReceivedID);
 }
        public void SendFrameReceived(IConnectionProvider connectionProvider, ARCameraFrameEventArgs frameEventArgs)
        {
            if (ARSubsystemManager.cameraSubsystem == null)
            {
                return;
            }

            writer.BeginMessage(RemoteMessage.ARCameraFrameData);

            writer.Write(frameEventArgs.lightEstimation.averageBrightness.GetValueOrDefault());
            writer.Write(frameEventArgs.lightEstimation.averageColorTemperature.GetValueOrDefault());
            writer.Write(frameEventArgs.time.GetValueOrDefault());

            var gotDisplayMatrix = ARSubsystemManager.cameraSubsystem.TryGetDisplayMatrix(ref dm);

            writer.Write(gotDisplayMatrix);

            if (gotDisplayMatrix)
            {
                for (int i = 0; i < 16; i++)
                {
                    writer.Write(dm[i]);
                }
            }

            Matrix4x4 pm = Matrix4x4.identity;
            var       gotProjectionMatrix = ARSubsystemManager.cameraSubsystem.TryGetProjectionMatrix(ref pm);

            writer.Write(gotProjectionMatrix);

            if (gotProjectionMatrix)
            {
                for (int i = 0; i < 16; i++)
                {
                    writer.Write(pm[i]);
                }
            }


            byte fieldMask = 0;

            if (frameEventArgs.time.HasValue)
            {
                fieldMask |= 1 << 0;
            }
            if (frameEventArgs.lightEstimation.averageBrightness.HasValue)
            {
                fieldMask |= 1 << 1;
            }
            if (frameEventArgs.lightEstimation.averageColorTemperature.HasValue)
            {
                fieldMask |= 1 << 2;
            }
            if (gotProjectionMatrix)
            {
                fieldMask |= 1 << 3;
            }
            if (gotDisplayMatrix)
            {
                fieldMask |= 1 << 4;
            }

            writer.Write(fieldMask);

            writer.EndMessage(stream);

            if (connectionProvider != null)
            {
                connectionProvider.SendMessage(stream);
            }
        }
 public void SendReferenePointUpdate(IConnectionProvider connectionProvider, ReferencePointUpdateID data)
 {
     connectionProvider.SendMessage(StructToByteArray <ReferencePointUpdateID>(data), referencePointUpdateID);
 }
 public void SendPlane(IConnectionProvider connectionProvider, PlaneData planeData)
 {
     connectionProvider.SendMessage(StructToByteArray <PlaneData>(planeData), planeEventID);
 }