예제 #1
0
        public void ReceiveFrame()
        {
            lFrameRGB.Clear();
            lFrameVerts.Clear();
            lBodies.Clear();

            int nToRead;
            byte[] buffer = new byte[1024];

            while (oSocket.Available == 0)
            {
                if (!SocketConnected())
                    return;
            }

            oSocket.Receive(buffer, 4, SocketFlags.None);

            //string result = System.Text.Encoding.UTF8.GetString(buffer);
            //n_to_read = Int32.Parse(result);

            nToRead = BitConverter.ToInt32(buffer, 0);

            if (nToRead == -1)
            {
                bNoMoreStoredFrames = true;
                return;
            }

            buffer = new byte[nToRead];
            int nAlreadyRead = 0;

            while (nAlreadyRead != nToRead)
            {
                while (oSocket.Available == 0)
                {
                    if (!SocketConnected())
                        return;
                }

                nAlreadyRead += oSocket.Receive(buffer, nAlreadyRead, nToRead - nAlreadyRead, SocketFlags.None);
            }

            //Receive depth and color data
            int startIdx = 0;

            int n_vertices = BitConverter.ToInt32(buffer, startIdx);
            startIdx += 4;

            for (int i = 0; i < n_vertices; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    lFrameRGB.Add(buffer[startIdx++]);
                }
                for (int j = 0; j < 3; j++)
                {
                    lFrameVerts.Add(BitConverter.ToSingle(buffer, startIdx));
                    startIdx += 4;
                }
            }

            //Receive body data
            int nBodies = BitConverter.ToInt32(buffer, startIdx);
            startIdx += 4;
            for (int i = 0; i < nBodies; i++)
            {
                Body tempBody = new Body();
                tempBody.bTracked = BitConverter.ToBoolean(buffer, startIdx++);
                int nJoints = BitConverter.ToInt32(buffer, startIdx);
                startIdx += 4;

                tempBody.lJoints = new List<Joint>(nJoints);
                tempBody.lJointsInColorSpace = new List<Point2f>(nJoints);

                for (int j = 0; j < nJoints; j++)
                {
                    Joint tempJoint = new Joint();
                    Point2f tempPoint = new Point2f();

                    tempJoint.jointType = (JointType)BitConverter.ToInt32(buffer, startIdx);
                    startIdx += 4;
                    tempJoint.trackingState = (TrackingState)BitConverter.ToInt32(buffer, startIdx);
                    startIdx += 4;
                    tempJoint.position.X = BitConverter.ToSingle(buffer, startIdx);
                    startIdx += 4;
                    tempJoint.position.Y = BitConverter.ToSingle(buffer, startIdx);
                    startIdx += 4;
                    tempJoint.position.Z = BitConverter.ToSingle(buffer, startIdx);
                    startIdx += 4;

                    tempPoint.X = BitConverter.ToSingle(buffer, startIdx);
                    startIdx += 4;
                    tempPoint.Y = BitConverter.ToSingle(buffer, startIdx);
                    startIdx += 4;

                    tempBody.lJoints.Add(tempJoint);
                    tempBody.lJointsInColorSpace.Add(tempPoint);
                }

                lBodies.Add(tempBody);
            }
        }
예제 #2
0
        public void ReceiveFrame()
        {
            lFrameRGB.Clear();
            lFrameVerts.Clear();
            lFrameNormals.Clear();
            lFrameUVs.Clear();
            lFrameIndices.Clear();
            lBodies.Clear();

            int nToRead;

            byte[] buffer = new byte[1024];

            while (oSocket.Available == 0)
            {
                if (!SocketConnected())
                {
                    return;
                }
            }

            oSocket.Receive(buffer, 8, SocketFlags.None);
            nToRead = BitConverter.ToInt32(buffer, 0);
            int iCompressed = BitConverter.ToInt32(buffer, 4);

            if (nToRead == -1)
            {
                bNoMoreStoredFrames = true;
                return;
            }

            buffer = new byte[nToRead];
            int nAlreadyRead = 0;

            while (nAlreadyRead != nToRead)
            {
                while (oSocket.Available == 0)
                {
                    if (!SocketConnected())
                    {
                        return;
                    }
                }

                nAlreadyRead += oSocket.Receive(buffer, nAlreadyRead, nToRead - nAlreadyRead, SocketFlags.None);
            }



            if (iCompressed == 1)
            {
                buffer = ZSTDDecompressor.Decompress(buffer);
            }

            //Receive depth and color data
            int startIdx = 0;

            int n_vertices = BitConverter.ToInt32(buffer, startIdx);

            startIdx += 4;

            for (int i = 0; i < n_vertices; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    lFrameRGB.Add(buffer[startIdx++]);
                }
                for (int j = 0; j < 3; j++)
                {
                    float val = BitConverter.ToInt16(buffer, startIdx);
                    //converting from milimeters to meters
                    val /= 1000.0f;
                    lFrameVerts.Add(val);
                    startIdx += 2;
                }
                for (int j = 0; j < 3; j++)
                {
                    short val = BitConverter.ToInt16(buffer, startIdx);
                    lFrameNormals.Add(val);
                    startIdx += 2;
                }
                for (int j = 0; j < 2; j++)
                {
                    short val = BitConverter.ToInt16(buffer, startIdx);
                    lFrameUVs.Add(val);
                    startIdx += 2;
                }
            }

            int n_indices = BitConverter.ToInt32(buffer, startIdx);

            startIdx += 4;

            for (int i = 0; i < n_indices; i++)
            {
                ushort val = BitConverter.ToUInt16(buffer, startIdx);
                startIdx += 2;
                lFrameIndices.Add(val);
            }

            //Receive body data
            int nBodies = BitConverter.ToInt32(buffer, startIdx);

            startIdx += 4;
            for (int i = 0; i < nBodies; i++)
            {
                Body tempBody = new Body();
                tempBody.bTracked = BitConverter.ToBoolean(buffer, startIdx++);
                int nJoints = BitConverter.ToInt32(buffer, startIdx);
                startIdx += 4;

                tempBody.lJoints             = new List <Joint>(nJoints);
                tempBody.lJointsInColorSpace = new List <Point2f>(nJoints);

                for (int j = 0; j < nJoints; j++)
                {
                    Joint   tempJoint = new Joint();
                    Point2f tempPoint = new Point2f();

                    tempJoint.jointType     = (JointType)BitConverter.ToInt32(buffer, startIdx);
                    startIdx               += 4;
                    tempJoint.trackingState = (TrackingState)BitConverter.ToInt32(buffer, startIdx);
                    startIdx               += 4;
                    tempJoint.position.X    = BitConverter.ToSingle(buffer, startIdx);
                    startIdx               += 4;
                    tempJoint.position.Y    = BitConverter.ToSingle(buffer, startIdx);
                    startIdx               += 4;
                    tempJoint.position.Z    = BitConverter.ToSingle(buffer, startIdx);
                    startIdx               += 4;

                    tempPoint.X = BitConverter.ToSingle(buffer, startIdx);
                    startIdx   += 4;
                    tempPoint.Y = BitConverter.ToSingle(buffer, startIdx);
                    startIdx   += 4;

                    tempBody.lJoints.Add(tempJoint);
                    tempBody.lJointsInColorSpace.Add(tempPoint);
                }

                lBodies.Add(tempBody);
            }
        }