public void UpdateStreamData(byte[] buffer, int offset = 0) { var settings = streamSource.streamSettings; Buffer.BlockCopy(buffer, offset + 1, blendShapesBuffer, 0, settings.BlendShapeSize); byte statusByte = buffer[offset + settings.bufferSize - 1]; m_FaceActive = (statusByte & (1 << 0)) != 0; m_StartRecordRequest = (statusByte & (1 << 1)) != 0; m_StopRecordRequest = (statusByte & (1 << 2)) != 0; if (m_VerboseLogging) { Buffer.BlockCopy(buffer, offset + settings.FrameNumberOffset, m_FrameNumArray, 0, settings.FrameNumberSize); Buffer.BlockCopy(buffer, offset + settings.FrameTimeOffset, m_FrameTimeArray, 0, settings.FrameTimeSize); Debug.Log(string.Format("{0} : {1}", m_FrameNumArray[0], m_FrameTimeArray[0])); } if (m_FaceActive) { Buffer.BlockCopy(buffer, offset + settings.HeadPoseOffset, m_HeadPoseArray, 0, BlendShapeUtils.PoseSize); Buffer.BlockCopy(buffer, offset + settings.CameraPoseOffset, m_CameraPoseArray, 0, BlendShapeUtils.PoseSize); BlendShapeUtils.ArrayToPose(m_HeadPoseArray, ref m_HeadPose); BlendShapeUtils.ArrayToPose(m_CameraPoseArray, ref m_CameraPose); } }
/// <summary> /// Starts stream thread using the provided socket. /// </summary> /// <param name="socket">The socket to use when streaming blend shape data.</param> public void StartCapture(Socket socket) { m_CameraTransform = Camera.main.transform; if (!m_CameraTransform) { Debug.LogWarning("Could not find main camera. Camera pose will not be captured"); m_CameraTransform = transform; // Use this transform to avoid null references } m_StartTime = Time.time; enabled = true; var poseArray = new float[BlendShapeUtils.PoseFloatCount]; var cameraPoseArray = new float[BlendShapeUtils.PoseFloatCount]; var frameNum = new int[1]; var frameTime = new float[1]; Application.targetFrameRate = 60; m_Running = true; new Thread(() => { var count = 0; #if UNITY_IOS var lastIndex = m_Buffer.Length - 1; #endif while (m_Running) { try { if (socket.Connected) { if (m_CurrentTime > 0) { frameNum[0] = count++; frameTime[0] = m_CurrentTime - m_StartTime; m_CurrentTime = -1; m_Buffer[0] = m_StreamSettings.ErrorCheck; Buffer.BlockCopy(m_BlendShapes, 0, m_Buffer, 1, m_StreamSettings.BlendShapeSize); BlendShapeUtils.PoseToArray(m_FacePose, poseArray); BlendShapeUtils.PoseToArray(m_CameraPose, cameraPoseArray); Buffer.BlockCopy(poseArray, 0, m_Buffer, m_StreamSettings.HeadPoseOffset, BlendShapeUtils.PoseSize); Buffer.BlockCopy(cameraPoseArray, 0, m_Buffer, m_StreamSettings.CameraPoseOffset, BlendShapeUtils.PoseSize); Buffer.BlockCopy(frameNum, 0, m_Buffer, m_StreamSettings.FrameNumberOffset, m_StreamSettings.FrameNumberSize); Buffer.BlockCopy(frameTime, 0, m_Buffer, m_StreamSettings.FrameTimeOffset, m_StreamSettings.FrameTimeSize); #if UNITY_IOS m_Buffer[lastIndex] = (byte)(m_ARFaceActive ? 1 : 0); #endif socket.Send(m_Buffer); } } else { TryTimeout(); } } catch (Exception e) { Debug.LogError(e.Message); TryTimeout(); } Thread.Sleep(k_SleepTime); } }).Start(); }