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; } }
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; } } } }