Inheritance: MonoBehaviour
示例#1
0
 void Start()
 {
     c_transform=transform;
     c_playerTransform=GameObject.FindGameObjectWithTag("Player").transform;
     c_lineRenderer=gameObject.GetComponent<LineRenderer>();
     c_wireFrame=gameObject.GetComponent<WireFrame>();
 }
示例#2
0
        public void Glue_SerializeDeserialize_WithHeadersWithChineseText()
        {
            var hdr = "<a><remote name='久有归天愿'/></a>";

            var frm1 = new WireFrame(123, false, FID.Generate(), hdr);


            var utfLen = WireFrame.HEADERS_ENCODING.GetByteCount(hdr);

            Aver.IsTrue(utfLen > hdr.Length);
            Console.WriteLine("{0} has {1} byte len and {2} char len".Args(hdr, utfLen, hdr.Length));

            Aver.AreEqual(WireFrame.FRAME_LENGTH + utfLen, frm1.Length);

            var ms = new MemoryStream();

            Aver.AreEqual(WireFrame.FRAME_LENGTH + utfLen, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Aver.IsTrue(frm1.Type == frm2.Type);
            Aver.AreEqual(frm1.RequestID, frm2.RequestID);
            Aver.AreEqual(frm1.OneWay, frm2.OneWay);

            Aver.AreEqual(frm1.Length, frm2.Length);
            Aver.AreEqual(frm1.Format, frm2.Format);
            Aver.AreEqual(frm1.HeadersContent, frm2.HeadersContent);

            Aver.IsFalse(frm2.OneWay);

            Aver.AreEqual("久有归天愿", frm2.Headers["remote"].AttrByName("name").Value);
        }
示例#3
0
        public void Echo_SerializeDeserialize()
        {
            var frm1 = new WireFrame(FrameType.Echo, 123, true, FID.Generate());

            Assert.IsFalse(frm1.OneWay);
            Assert.AreEqual(WireFrame.FRAME_LENGTH, frm1.Length);

            var ms = new MemoryStream();

            Assert.AreEqual(WireFrame.FRAME_LENGTH, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Assert.AreEqual(frm1.Type, frm2.Type);
            Assert.AreEqual(frm1.RequestID, frm2.RequestID);
            Assert.AreEqual(frm1.OneWay, frm2.OneWay);

            Assert.AreEqual(frm1.Length, frm2.Length);
            Assert.AreEqual(frm1.Format, frm2.Format);
            Assert.AreEqual(frm1.HeadersContent, frm2.HeadersContent);

            Assert.IsFalse(frm2.OneWay);
        }
示例#4
0
        public void Glue_SerializeDeserialize_WithHeadersWithLatinText()
        {
            var hdr = "<a><remote name='zzz'/></a>";//Latin only chars

            var frm1 = new WireFrame(123, false, FID.Generate(), hdr);


            var utfLen = WireFrame.HEADERS_ENCODING.GetByteCount(hdr);

            Aver.IsTrue(utfLen == hdr.Length);

            Aver.AreEqual(WireFrame.FRAME_LENGTH + hdr.Length, frm1.Length);

            var ms = new MemoryStream();

            Aver.AreEqual(WireFrame.FRAME_LENGTH + hdr.Length, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Aver.IsTrue(frm1.Type == frm2.Type);
            Aver.AreEqual(frm1.RequestID, frm2.RequestID);
            Aver.AreEqual(frm1.OneWay, frm2.OneWay);

            Aver.AreEqual(frm1.Length, frm2.Length);
            Aver.AreEqual(frm1.Format, frm2.Format);
            Aver.AreEqual(frm1.HeadersContent, frm2.HeadersContent);

            Aver.IsFalse(frm2.OneWay);

            Aver.AreEqual("zzz", frm2.Headers["remote"].AttrByName("name").Value);
        }
示例#5
0
        public void HeartBeat_SerializeDeserialize()
        {
            var frm1 = new WireFrame(FrameType.Heartbeat, 123, false, FID.Generate());

            Aver.IsTrue(frm1.OneWay);
            Aver.AreEqual(WireFrame.FRAME_LENGTH, frm1.Length);

            var ms = new MemoryStream();

            Aver.AreEqual(WireFrame.FRAME_LENGTH, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Aver.IsTrue(frm1.Type == frm2.Type);
            Aver.AreEqual(frm1.RequestID, frm2.RequestID);
            Aver.AreEqual(frm1.OneWay, frm2.OneWay);

            Aver.AreEqual(frm1.Length, frm2.Length);
            Aver.AreEqual(frm1.Format, frm2.Format);
            Aver.AreEqual(frm1.HeadersContent, frm2.HeadersContent);

            Aver.IsTrue(frm2.OneWay);
        }
            public void Forward(WireFrame frame)
            {
                if (_dismissed)
                {
                    return;
                }

                OtherEndpoint.Forward(frame);
            }
示例#7
0
        protected override RequestMsg DoDecodeRequest(WireFrame frame, MemoryStream ms, ISerializer serializer)
        {
            var utf8 = ms.GetBuffer();
            var json = Encoding.UTF8.GetString(utf8, (int)ms.Position, (int)ms.Length - (int)ms.Position);
            var data = JSONReader.DeserializeDataObject(json) as JSONDataMap;

            if (data == null)
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_REQUEST_ERROR.Args(nameof(AppTermBinding), "data==null"));
            }

            var reqID    = new FID(data["request-id"].AsULong(handling: ConvertErrorHandling.Throw)); //kuda ego vstavit?
            var instance = data["instance"].AsNullableGUID(handling: ConvertErrorHandling.Throw);
            var oneWay   = data["one-way"].AsBool();
            var method   = data["method"].AsString();

            MethodSpec mspec;

            if (method.EqualsOrdIgnoreCase(nameof(Contracts.IRemoteTerminal.Connect)))
            {
                mspec = AppTermBinding.METHOD_CONNECT;
            }
            else if (method.EqualsOrdIgnoreCase(nameof(Contracts.IRemoteTerminal.Execute)))
            {
                mspec = AppTermBinding.METHOD_EXECUTE;
            }
            else if (method.EqualsOrdIgnoreCase(nameof(Contracts.IRemoteTerminal.Disconnect)))
            {
                mspec = AppTermBinding.METHOD_DISCONNECT;
            }
            else
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_REQUEST_ERROR.Args(nameof(AppTermBinding), "unknown method `{0}`".Args(method)));
            }

            var args = data["command"] == null ? new object[0] : new object[] { data["command"].AsString() };

            var result = new RequestAnyMsg(AppTermBinding.TYPE_CONTRACT, mspec, oneWay, instance, args);

            var autht = data["auth-token"].AsString();

            if (autht != null)
            {
                var hdr = new AuthenticationHeader(Security.SkyAuthenticationTokenSerializer.Deserialize(autht));
                result.Headers.Add(hdr);
            }
            var authc = data["auth-cred"].AsString();

            if (authc != null)
            {
                var hdr = new AuthenticationHeader(Azos.Security.IDPasswordCredentials.FromBasicAuth(authc));
                result.Headers.Add(hdr);
            }

            return(result);
        }
    //OnInspectorGUIをoverrideする
    public override void OnInspectorGUI()
    {
        //デフォルトのInspectorを表示
        DrawDefaultInspector();

        WireFrame t = target as WireFrame;

        //描画モード変更
        if (GUILayout.Button("描画モード更新"))
        {
            //押したときの処理
            t.SetMT();
        }
    }
示例#9
0
        protected override ResponseMsg DoDecodeResponse(WireFrame frame, MemoryStream ms)
        {
            var utf8 = ms.GetBuffer();
            var json = Encoding.UTF8.GetString(utf8, (int)ms.Position, (int)ms.Length - (int)ms.Position);
            var data = json.JSONToDataObject() as JSONDataMap;

            if (data == null)
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_RESPONSE_ERROR.Args(nameof(AppTermBinding), "data==null"));
            }


            var reqID    = new FID(data["request-id"].AsULong(handling: ConvertErrorHandling.Throw));
            var instance = data["instance"].AsNullableGUID(handling: ConvertErrorHandling.Throw);

            object returnValue = data["return"];

            if (returnValue == null || returnValue is string)
            {
                //return as-is
            }
            else if (returnValue is JSONDataMap map)//error or Remote Terminal
            {
                var errorContent = map["error-content"].AsString();
                if (errorContent != null)
                {
                    returnValue = WrappedExceptionData.FromBase64(errorContent);
                }
                else
                {
                    returnValue = new Contracts.RemoteTerminalInfo(map);
                }
            }
            else
            {
                throw new ProtocolException(StringConsts.GLUE_BINDING_RESPONSE_ERROR.Args(nameof(AppTermBinding), "data.return is " + returnValue.GetType().FullName));
            }


            var result = new ResponseMsg(reqID, instance, returnValue);

            return(result);
        }
示例#10
0
 public void Render(List <GameObject> terrains)
 {
     foreach (GameObject terrain in terrains)
     {
         var terrainComponent = terrain.GetComponent <Terrain>();
         PrepareTerrain(terrainComponent);
         LoadModelMatrix(terrain);
         if (WireFrame.IsEnabled())
         {
             GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);
         }
         GL.DrawElements(BeginMode.Triangles, terrainComponent.model.vertexCount, DrawElementsType.UnsignedInt, 0);
         if (WireFrame.IsEnabled())
         {
             GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
         }
         UnbindTexturedModel();
     }
 }
示例#11
0
                public void Forward(WireFrame frame)
                {
                    if (_dismissed)
                    {
                        return;
                    }

                    ++FrameCounter;

                    if (_recursion || _frameBuffer.Count > 0 || _decide())
                    {
                        _frameBuffer.Enqueue(frame);
                    }
                    else
                    {
                        _recursion = true;
                        OtherEndpoint.Forward(frame);
                        _recursion = false;
                    }
                }
示例#12
0
    public void SetWireFrames(float distance)
    {
        for(int i=1 ; i<tr.Length ; i++){
            wf=tr[i].GetComponent<WireFrame>();
            lr=tr[i].GetComponent<LineRenderer>();

            if(distance!=0){
                if(!wf.enabled) wf.enabled=true;
                if(!lr.enabled) lr.enabled=true;
            }else{
                if(wf.enabled) wf.enabled=false;
                if(lr.enabled) lr.enabled=false;
            }
            if(wf.enabled && lr.enabled){
                tempVector3.x=((maxDistance-distance)/maxDistance)*thickness;
                lr.SetWidth(tempVector3.x, tempVector3.x);
                tempVector3.x=roughness*Random.value*3;
                lr.sharedMaterial.mainTextureScale = tempVector3;
            }
        }
    }
示例#13
0
 public void Render(Dictionary <TexturedModel, List <GameObject> > entities)
 {
     foreach (TexturedModel model in entities.Keys)
     {
         entities.TryGetValue(model, out List <GameObject> batch);
         PrepareTexturedModel(model);
         foreach (GameObject entity in batch)
         {
             PrepareInstance(entity);
             if (WireFrame.IsEnabled())
             {
                 GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line);
             }
             GL.DrawElements(BeginMode.Triangles, model.rawModel.vertexCount, DrawElementsType.UnsignedInt, 0);
             if (WireFrame.IsEnabled())
             {
                 GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill);
             }
         }
         UnbindTexturedModel();
     }
 }
示例#14
0
 public void Forward(WireFrame frame)
 {
     _pump.Send(frame);
 }
示例#15
0
        private void Update(object sender, GameUpdatedEventArgs args)
        {
            if (!Focused)
            {
                return;
            }
            DebugScreenTexts();

            if (Input.GetKeyDown(Key.Escape) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.Back))
            {
                Exit();
            }
            if (Input.GetKeyDown(Key.F) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadDown))
            {
                FrameRate.Enable(!FrameRate.IsEnabled());
            }
            if (Input.GetKeyDown(Key.Z) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadUp))
            {
                WireFrame.Enable(!WireFrame.IsEnabled());
            }
            if (Input.GetKeyDown(Key.Q) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadLeft))
            {
                ProfilerScreen.enabled = !ProfilerScreen.enabled;
                text1.enabled          = !text1.enabled;
                text2.enabled          = !text2.enabled;
            }
            if (Input.GetKeyDown(Key.G) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.Start))
            {
                Gaming = !Gaming;
            }
            if (Input.GetKeyDown(Key.V) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadRight))
            {
                if (VSync == VSyncMode.Off)
                {
                    VSync = VSyncMode.On;
                }
                else
                {
                    VSync = VSyncMode.Off;
                }
            }
            if (Input.GetKeyDown(Key.L) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.LeftShoulder))
            {
                Input.LockCursor(!Input.GetLockCursor());
                Input.ShowCursor(!Input.GetCursorVisibility());
                CameraFollowMouse = !CameraFollowMouse;
                if (Input.GetLockCursor())
                {
                    Input.SetMousePositionScreenCenter(0, 0);
                }
            }

            if (!Gaming)
            {
                const float cameraSpeed = 20.0f;

                if (Input.GetKey(Key.Space))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
                }
                if (Input.GetKey(Key.ShiftLeft))
                {
                    MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
                }
                if (ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButton(Buttons.A))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
                }
                if (ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButton(Buttons.B))
                {
                    MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
                }

                if (Input.GetKey(Key.A))
                {
                    MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime;
                }
                if (Input.GetKey(Key.D))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime;
                }
                if (ControllerManager.ControllerExists(0))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime * ControllerManager.GetController(0).GetAxis(Controller.Axis.HorizontalLeft);
                }

                if (Input.GetKey(Key.W))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime;
                }
                if (Input.GetKey(Key.S))
                {
                    MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime;
                }
                if (ControllerManager.ControllerExists(0))
                {
                    MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime * ControllerManager.GetController(0).GetAxis(Controller.Axis.VerticalLeft);
                }

                if (CameraFollowMouse)
                {
                    Vector2 delta       = Input.GetMouseDelta();
                    var     sensitivity = Camera.Sensitivity;
                    if (ControllerManager.ControllerExists(0))
                    {
                        var newDelta = ControllerManager.GetController(0).GetAxis(3, 4);
                        if (Math.Abs(newDelta.X) + Math.Abs(newDelta.Y) > 0)
                        {
                            delta       = newDelta;
                            sensitivity = 100 * args.DeltaTime;
                        }
                    }

                    if (Input.GetLockCursor())
                    {
                        Input.SetMousePositionScreenCenter(0, 0);
                    }

                    MainCamera.gameObject.transform.Rotate(-delta.Y * sensitivity, -delta.X * sensitivity, 0);
                    MainCamera.gameObject.transform.rotation = new Vector3(Math.Clamp(MainCamera.gameObject.transform.rotation.X, -89f, 89f), MainCamera.gameObject.transform.rotation.Y, MainCamera.gameObject.transform.rotation.Z);
                }
            }
            else
            {
                const float movementSpeed = 10.0f;
                var         movement      = Vector3.Zero;

                if (ControllerManager.ControllerExists(0))
                {
                    movement.Z = ControllerManager.GetController(0).GetAxis(Controller.Axis.VerticalLeft);
                }
                if (Input.GetKey(Key.W))
                {
                    movement.Z += 1;
                }
                if (Input.GetKey(Key.S))
                {
                    movement.Z -= 1;
                }

                if (ControllerManager.ControllerExists(0))
                {
                    movement.X = -ControllerManager.GetController(0).GetAxis(Controller.Axis.HorizontalLeft);
                }
                if (Input.GetKey(Key.A))
                {
                    movement.X += 1;
                }
                if (Input.GetKey(Key.D))
                {
                    movement.X -= 1;
                }

                if (CameraFollowMouse)
                {
                    Vector2 delta = Input.GetMouseDelta();

                    if (ControllerManager.ControllerExists(0))
                    {
                        var newDelta = ControllerManager.GetController(0).GetAxis(2, 3);
                        if (Math.Abs(newDelta.X) > 0)
                        {
                            delta = newDelta;
                        }
                    }

                    if (Input.GetLockCursor())
                    {
                        Input.SetMousePositionScreenCenter(0, 0);
                    }

                    // if (delta.X < 0) MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Right * 10 * args.DeltaTime;
                    // if (delta.X > 0) MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Right * 10 * args.DeltaTime;
                    // MainCamera.gameObject.transform.LookAt(player.transform.position);
                }
                else
                {
                    if (movement.Z != 0 || movement.X != 0)
                    {
                        var camForward = MainCamera.gameObject.transform.Front;
                        camForward.Y = 0;
                        camForward.Normalize();
                        var camRight = MainCamera.gameObject.transform.Right;
                        camRight.Y = 0;
                        camRight.Normalize();

                        if (!Targeting)
                        {
                            var direction = player.transform.position + (camForward * -movement.Z + camRight * movement.X).Normalized();
                            player.transform.RotateTowardsTarget(direction, args.DeltaTime * 5, 270);
                        }
                        else
                        {
                            player.transform.RotateTowardsTarget(target.transform.position, 1, 90);
                        }


                        var movementVector = new Vector3(((camForward * -movement.Z + camRight * movement.X) * movementSpeed * args.DeltaTime).X, 0, ((camForward * -movement.Z + camRight * movement.X) * movementSpeed * args.DeltaTime).Z);

                        player.transform.position -= movementVector;
                    }

                    var pos = player.transform.position;
                    MainCamera.gameObject.transform.rotation = new Vector3(-15f, -180, MainCamera.gameObject.transform.rotation.Z);
                    MainCamera.gameObject.transform.position = new Vector3(pos.X, pos.Y + 6, pos.Z - 7);
                }
            }
        }
示例#16
0
        public void BadPointers()
        {
            var data = new ulong[1];
            var wf   = new WireFrame(new Memory <ulong>[] { new Memory <ulong>(data) });
            var d0   = DeserializerState.CreateRoot(wf);

            Assert.AreEqual(ObjectKind.Nil, d0.Kind);
            WirePointer p = default;

            p.BeginStruct(1, 0);
            p.Offset = 0;
            data[0]  = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfBits, 64);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfBytes, 8);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfEmpty, 6400);
            data[0] = p;
            var d1 = DeserializerState.CreateRoot(wf);

            p.BeginList(ListKind.ListOfInts, 2);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfLongs, 1);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfPointers, 1);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfShorts, 4);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.BeginList(ListKind.ListOfStructs, 1);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.SetFarPointer(0, 0, false);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.SetFarPointer(1, 0, false);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.SetFarPointer(0, 1, false);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));
            p.SetFarPointer(0, 0, true);
            data[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf));

            var data2 = new ulong[3];
            var wf2   = new WireFrame(new Memory <ulong>[] { new Memory <ulong>(data2) });

            p.BeginList(ListKind.ListOfStructs, 1);
            data2[0] = p;
            data2[1] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf2));

            p.SetFarPointer(0, 1, true);
            data2[0] = p;
            data2[1] = 0;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf2));

            p.SetFarPointer(0, 1, false);
            data2[1] = p;
            data2[2] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf2));

            p.SetFarPointer(0, 2, true);
            data2[0] = p;
            Assert.ThrowsException <DeserializationException>(() => DeserializerState.CreateRoot(wf2));
        }
示例#17
0
        private void Update(object sender, GameUpdatedEventArgs args)
        {
            if (!Focused)
            {
                return;
            }
            DebugScreenTexts();
            if (lockToMouseObject != null)
            {
                if (Input.GetMouseButtonDown(MouseButton.Right))
                {
                    var component = lockToMouseObject.GetComponent <RaycastTarget>();
                    component.focused = false;
                    component.onLoseFocus();
                    lockToMouseObject = null;
                    return;
                }

                if (!Input.GetKey(Key.R))
                {
                    var mult = 5.25f;
                    if (Input.GetKey(Key.Up))
                    {
                        lockToMouseObject.transform.position += lockToMouseObject.transform.Up * args.DeltaTime * mult;
                    }
                    if (Input.GetKey(Key.Down))
                    {
                        lockToMouseObject.transform.position -= lockToMouseObject.transform.Up * args.DeltaTime * mult;
                    }
                    if (Input.GetKey(Key.Left))
                    {
                        lockToMouseObject.transform.position -= lockToMouseObject.transform.Right * args.DeltaTime * mult;
                    }
                    if (Input.GetKey(Key.Right))
                    {
                        lockToMouseObject.transform.position += lockToMouseObject.transform.Right * args.DeltaTime * mult;
                    }
                    if (Input.GetKey(Key.ControlRight))
                    {
                        lockToMouseObject.transform.position -= lockToMouseObject.transform.Front * args.DeltaTime * mult;
                    }
                    if (Input.GetKey(Key.ShiftRight))
                    {
                        lockToMouseObject.transform.position += lockToMouseObject.transform.Front * args.DeltaTime * mult;
                    }
                }
                else
                {
                    var mult = 20;
                    if (Input.GetKey(Key.Up))
                    {
                        lockToMouseObject.transform.Rotate(lockToMouseObject.transform.Up * args.DeltaTime * mult);
                    }
                    if (Input.GetKey(Key.Down))
                    {
                        lockToMouseObject.transform.Rotate(-lockToMouseObject.transform.Up * args.DeltaTime * mult);
                    }
                    if (Input.GetKey(Key.Left))
                    {
                        lockToMouseObject.transform.Rotate(-lockToMouseObject.transform.Right * args.DeltaTime * mult);
                    }
                    if (Input.GetKey(Key.Right))
                    {
                        lockToMouseObject.transform.Rotate(lockToMouseObject.transform.Right * args.DeltaTime * mult);
                    }
                    if (Input.GetKey(Key.ControlRight))
                    {
                        lockToMouseObject.transform.Rotate(-lockToMouseObject.transform.Front * args.DeltaTime * mult);
                    }
                    if (Input.GetKey(Key.ShiftRight))
                    {
                        lockToMouseObject.transform.Rotate(lockToMouseObject.transform.Front * args.DeltaTime * mult);
                    }
                }
            }


            if (Input.GetKeyDown(Key.Escape) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.Back))
            {
                Exit();
            }
            if (Input.GetKeyDown(Key.F) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadDown))
            {
                FrameRate.Enable(!FrameRate.IsEnabled());
            }
            if (Input.GetKeyDown(Key.Z) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadUp))
            {
                WireFrame.Enable(!WireFrame.IsEnabled());
            }
            if (Input.GetKeyDown(Key.Q) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadLeft))
            {
                ProfilerScreen.enabled = !ProfilerScreen.enabled;
                text1.enabled          = !text1.enabled;
                text2.enabled          = !text2.enabled;
            }
            if (Input.GetKeyDown(Key.V) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.DPadRight))
            {
                if (VSync == VSyncMode.Off)
                {
                    VSync = VSyncMode.On;
                }
                else
                {
                    VSync = VSyncMode.Off;
                }
            }
            if (Input.GetKeyDown(Key.L) || ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButtonDown(Buttons.LeftShoulder))
            {
                Input.LockCursor(!Input.GetLockCursor());
                Input.ShowCursor(!Input.GetCursorVisibility());
                CameraFollowMouse = !CameraFollowMouse;
                if (Input.GetLockCursor())
                {
                    Input.SetMousePositionScreenCenter(0, 0);
                }
            }

            const float cameraSpeed = 5;

            if (Input.GetKey(Key.Space))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
            }
            if (Input.GetKey(Key.ShiftLeft))
            {
                MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
            }
            if (ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButton(Buttons.A))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
            }
            if (ControllerManager.ControllerExists(0) && ControllerManager.GetController(0).GetButton(Buttons.B))
            {
                MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Up * cameraSpeed * args.DeltaTime;
            }

            if (Input.GetKey(Key.A))
            {
                MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime;
            }
            if (Input.GetKey(Key.D))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime;
            }
            if (ControllerManager.ControllerExists(0))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Right * cameraSpeed * args.DeltaTime * ControllerManager.GetController(0).GetAxis(Controller.Axis.HorizontalLeft);
            }

            if (Input.GetKey(Key.W))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime;
            }
            if (Input.GetKey(Key.S))
            {
                MainCamera.gameObject.transform.position -= MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime;
            }
            if (ControllerManager.ControllerExists(0))
            {
                MainCamera.gameObject.transform.position += MainCamera.gameObject.transform.Front * cameraSpeed * args.DeltaTime * ControllerManager.GetController(0).GetAxis(Controller.Axis.VerticalLeft);
            }

            if (CameraFollowMouse)
            {
                Vector2 delta       = Input.GetMouseDelta();
                var     sensitivity = Camera.Sensitivity;
                if (ControllerManager.ControllerExists(0))
                {
                    var newDelta = ControllerManager.GetController(0).GetAxis(3, 4);
                    if (Math.Abs(newDelta.X) + Math.Abs(newDelta.Y) > 0)
                    {
                        delta       = newDelta;
                        sensitivity = 100 * args.DeltaTime;
                    }
                }

                if (Input.GetLockCursor())
                {
                    Input.SetMousePositionScreenCenter(0, 0);
                }

                MainCamera.gameObject.transform.Rotate(-delta.Y * sensitivity, -delta.X * sensitivity, 0);
                MainCamera.gameObject.transform.rotation = new Vector3(Math.Clamp(MainCamera.gameObject.transform.rotation.X, -89f, 89f), MainCamera.gameObject.transform.rotation.Y, MainCamera.gameObject.transform.rotation.Z);
            }
        }
        /// <summary>
        /// Processes a sent or received RPC frame
        /// </summary>
        /// <param name="dir">frame direction</param>
        /// <param name="frame">actual frame</param>
        public void TraceFrame(FrameDirection dir, WireFrame frame)
        {
            if (!_timer.IsRunning)
            {
                _timer.Start();
            }

            _traceWriter.Write($@"{_timer.ElapsedTicks, 10} | {Thread.CurrentThread.ManagedThreadId, 10} | ");
            _traceWriter.Write(dir == FrameDirection.Tx ? "Tx  |" : "Rx  |");

            var    dec = DeserializerState.CreateRoot(frame);
            var    msg = Message.READER.create(dec);
            string tag;

            switch (msg.which)
            {
            case Message.WHICH.Abort:
                _traceWriter.WriteLine($"ABORT {msg.Abort.Reason}");
                break;

            case Message.WHICH.Bootstrap:
                tag = dir == FrameDirection.Tx ? "Q" : "A";
                _traceWriter.WriteLine($"BOOTSTRAP {tag}{msg.Bootstrap.QuestionId}");
                break;

            case Message.WHICH.Call:
                tag = dir == FrameDirection.Tx ? "Q" : "A";
                _traceWriter.Write($"CALL {tag}{msg.Call.QuestionId}, I: {msg.Call.InterfaceId:x} M: {msg.Call.MethodId} ");
                RenderMessageTarget(msg.Call.Target, dir);
                _traceWriter.Write(HeaderSpace);
                _traceWriter.WriteLine($"Send results to {msg.Call.SendResultsTo.which}");
                RenderCapTable(msg.Call.Params.CapTable, dir);
                break;

            case Message.WHICH.Disembargo:
                _traceWriter.Write($"DISEMBARGO {msg.Disembargo.Context.which}");
                switch (msg.Disembargo.Context.which)
                {
                case Disembargo.context.WHICH.Provide:
                    _traceWriter.Write($" {msg.Disembargo.Context.Provide}");
                    break;

                case Disembargo.context.WHICH.ReceiverLoopback:
                    _traceWriter.Write($" E{msg.Disembargo.Context.ReceiverLoopback}");
                    break;

                case Disembargo.context.WHICH.SenderLoopback:
                    _traceWriter.Write($" E{msg.Disembargo.Context.SenderLoopback}");
                    break;
                }
                _traceWriter.WriteLine(".");
                _traceWriter.Write(HeaderSpace);
                RenderMessageTarget(msg.Disembargo.Target, dir);
                break;

            case Message.WHICH.Finish:
                tag = dir == FrameDirection.Tx ? "Q" : "A";
                _traceWriter.WriteLine($"FINISH {tag}{msg.Finish.QuestionId}, release: {msg.Finish.ReleaseResultCaps}");
                break;

            case Message.WHICH.Release:
                tag = dir == FrameDirection.Tx ? "CR" : "CL";
                _traceWriter.WriteLine($"RELEASE {tag}{msg.Release.Id}, count: {msg.Release.ReferenceCount}");
                break;

            case Message.WHICH.Resolve:
                tag = dir == FrameDirection.Tx ? "CL" : "CR";
                _traceWriter.Write($"RESOLVE {tag}{msg.Resolve.PromiseId}: {msg.Resolve.which}");
                switch (msg.Resolve.which)
                {
                case Resolve.WHICH.Cap:
                    RenderCapDescriptor(msg.Resolve.Cap, dir);
                    _traceWriter.WriteLine(".");
                    break;

                case Resolve.WHICH.Exception:
                    _traceWriter.WriteLine($" {msg.Resolve.Exception.Reason}");
                    break;
                }
                break;

            case Message.WHICH.Return:
                tag = dir == FrameDirection.Tx ? "A" : "Q";
                _traceWriter.Write($"RETURN {tag}{msg.Return.AnswerId} {msg.Return.which}");
                switch (msg.Return.which)
                {
                case Return.WHICH.Exception:
                    _traceWriter.WriteLine($" {msg.Return.Exception.Reason}");
                    break;

                case Return.WHICH.Results:
                    _traceWriter.WriteLine($", release: {msg.Return.ReleaseParamCaps}");
                    RenderCapTable(msg.Return.Results.CapTable, dir);
                    break;

                case Return.WHICH.TakeFromOtherQuestion:
                    tag = dir == FrameDirection.Tx ? "Q" : "A";
                    _traceWriter.WriteLine($" {tag}{msg.Return.TakeFromOtherQuestion}");
                    break;

                default:
                    _traceWriter.WriteLine();
                    break;
                }
                break;

            case Message.WHICH.Unimplemented:
                _traceWriter.WriteLine($"UNIMPLEMENTED {msg.Unimplemented.which}");
                break;

            case Message.WHICH.Accept:
                _traceWriter.WriteLine("ACCEPT");
                break;

            case Message.WHICH.Join:
                _traceWriter.WriteLine("JOIN");
                break;

            case Message.WHICH.Provide:
                _traceWriter.WriteLine($"PROVIDE {msg.Provide.QuestionId}");
                RenderMessageTarget(msg.Provide.Target, dir);
                break;

            case Message.WHICH.ObsoleteDelete:
                _traceWriter.WriteLine("OBSOLETEDELETE");
                break;

            case Message.WHICH.ObsoleteSave:
                _traceWriter.WriteLine("OBSOLETESAVE");
                break;

            default:
                _traceWriter.WriteLine($"Unknown message {msg.which}");
                break;
            }
        }