Esempio n. 1
0
 public void GetStateExtParams(out VectorInt32Math outPosition, out ushort outMovingProgress, out short outLatitude,
     out short outLongitude, out bool outIsEatenCrumb)
 {
     lock (m_observerStateParamsMutex)
     {
         outPosition = m_position;
         outMovingProgress = m_movingProgress;
         outLatitude = m_latitude;
         outLongitude = m_longitude;
         outIsEatenCrumb = m_isEatenCrumb;
     }
 }
Esempio n. 2
0
        void PPhTick()
        {
            {
                MsgGetState msg = new MsgGetState();
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (GetTimeMs() - m_lastUpdateStateExtTime > 20)  // get position/orientation data every n milliseconds
            {
                m_lastUpdateStateExtTime = GetTimeMs();
                MsgGetStateExt msg = new MsgGetStateExt();
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (GetTimeMs() - m_lastStatisticRequestTime > STATISTIC_REQUEST_PERIOD)
            {
                m_lastStatisticRequestTime = GetTimeMs();
                MsgGetStatistics msg = new MsgGetStatistics();
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isLeft)
            {
                MsgRotateLeft msg = new MsgRotateLeft();
                msg.m_value = 4;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isRight)
            {
                MsgRotateRight msg = new MsgRotateRight();
                msg.m_value = 4;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isUp)
            {
                MsgRotateDown msg = new MsgRotateDown();
                msg.m_value = 4;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isDown)
            {
                MsgRotateUp msg = new MsgRotateUp();
                msg.m_value = 4;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isForward)
            {
                MsgMoveForward msg = new MsgMoveForward();
                msg.m_value = 16;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }
            if (m_isBackward)
            {
                MsgMoveBackward msg = new MsgMoveBackward();
                msg.m_value = 16;
                byte[] buffer = msg.GetBuffer();
                m_clientUdp.Send(buffer, buffer.Length, m_remoteEndPoint);
            }

            // receive bytes
            IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
            while (m_clientUdp.Available > 0)
		    {
                byte[] buffer = m_clientUdp.Receive(ref anyIP);
                if (buffer.Length > 0)
                {
                    switch ((MsgType)buffer[0])
                    {
                        case MsgType.GetStateResponse:
                            {
                                MsgGetStateResponse msg = ServerProtocol.QueryMessage<MsgGetStateResponse>(buffer);
                                m_timeOfTheUniverse = msg.m_time;
                            }
                            break;
                        case MsgType.GetStateExtResponse:
                            {
                                MsgGetStateExtResponse msg = ServerProtocol.QueryMessage<MsgGetStateExtResponse>(buffer);
                                lock (m_observerStateParamsMutex)
                                {
                                    m_latitude = msg.m_latitude;
                                    m_longitude = msg.m_longitude;
                                    m_position = msg.m_pos;
                                    m_movingProgress = msg.m_movingProgress;
                                    if (m_eatenCrumbNum < msg.m_eatenCrumbNum)
                                    {
                                        m_eatenCrumbNum = msg.m_eatenCrumbNum;
                                        m_eatenCrumbPos = msg.m_eatenCrumbPos;
                                        m_isEatenCrumb = true;
                                    }
                                }
                            }
                            break;
                        case MsgType.SendPhoton:
                			{
                                MsgSendPhoton msg = ServerProtocol.QueryMessage<MsgSendPhoton>(buffer);
                                // receive photons back // revert Y-coordinate because of texture format
                                // photon (x,y) placed to [CommonParams.OBSERVER_EYE_SIZE - y -1][x] for simple copy to texture
                                lock (m_eyeTextureMutex)
                                {
                                    m_eyeColorArray[CommonParams.OBSERVER_EYE_SIZE - msg.m_posY - 1, msg.m_posX] = msg.m_color;
                                    m_eyeUpdateTimeArray[CommonParams.OBSERVER_EYE_SIZE - msg.m_posY - 1, msg.m_posX] = m_timeOfTheUniverse;
                                }
                            }
                            break;
                        case MsgType.GetStatisticsResponse:
                            {
                                MsgGetStatisticsResponse msg = ServerProtocol.QueryMessage<MsgGetStatisticsResponse>(buffer);
                                lock (m_serverStatisticsMutex)
                                {
                                    m_quantumOfTimePerSecond = msg.m_fps;
                                    m_tickTimeMusAverageObserverThread = msg.m_observerThreadTickTime;
                                    m_tickTimeMusAverageUniverseThreadsMin = msg.m_universeThreadMinTickTime;
                                    m_tickTimeMusAverageUniverseThreadsMax = msg.m_universeThreadMaxTickTime;
                                    m_universeThreadsNum = msg.m_universeThreadsCount;
                                    m_clientServerPerformanceRatio = msg.m_clientServerPerformanceRatio;
                                    m_serverClientPerformanceRatio = msg.m_serverClientPerformanceRatio;
                                }
                            }
                            break;
                    }
                }
            }
        }