private void FlushFrame() { InputSnapshot input = Window.PumpEvents(); VxInput.UpdateFrameInput(input); if (!Window.Exists) { return; } _cl.Begin(); _cl.SetFramebuffer(Device.MainSwapchain.Framebuffer); _cl.ClearDepthStencil(Device.IsDepthRangeZeroToOne ? 0f : 1f); _cl.ClearColorTarget(0, ClearColor); Vector3 cameraLookDir = Vector3.Transform(-Vector3.UnitZ, _cameraRotation); Matrix4x4 view = Matrix4x4.CreateLookAt(_cameraPosition, _cameraPosition + cameraLookDir, Vector3.UnitY); Matrix4x4 projection = MathUtil.CreatePerspective( Device, Device.IsDepthRangeZeroToOne, 1f, (float)Window.Width / Window.Height, 0.5f, 1000f); _cl.UpdateBuffer(_viewProjectionBuffer, 0, view * projection); SceneInfo sceneInfo = new SceneInfo { LightDir = Vector4.Normalize(new Vector4(0.2f, -0.6f, -1f, 0)), LightColor = new Vector4(1, 1, 1, 1) }; _cl.UpdateBuffer(_sceneInfoBuffer, 0, sceneInfo); _cl.SetPipeline(_modelPipeline); _cl.SetGraphicsResourceSet(0, _viewProjectionSet); _cl.SetGraphicsResourceSet(1, _worldSet); _cl.SetGraphicsResourceSet(2, _modelParamsSet); foreach (DrawSubmission submission in _drawSubmissions) { SubmitDraw(submission); } _drawSubmissions.Clear(); _imguiRenderer.Render(Device, _cl); _imguiRenderer.Update(Vx.FrameTime, input); _cl.End(); Device.SubmitCommands(_cl); Device.SwapBuffers(Device.MainSwapchain); Device.WaitForIdle(); }
public void Update() { Vector2 newMousePos = VxInput.MousePosition; Vector2 mouseDelta = newMousePos - _lastMousePos; _lastMousePos = newMousePos; _yaw = _yaw + -mouseDelta.X * _mouseSensitivity; _pitch = MathUtil.Clamp(_pitch - mouseDelta.Y * _mouseSensitivity, -1.5f, 1.5f); Quaternion camRot = Quaternion.CreateFromYawPitchRoll(_yaw, _pitch, 0f); Vector3 camForward = Vector3.Transform(-Vector3.UnitZ, camRot); Vector3 camRight = Vector3.Cross(camForward, Vector3.UnitY); Vector3 camUp = Vector3.Cross(camRight, camForward); Vector3 moveDir = Vector3.Zero; if (VxInput.GetKey(Key.W)) { moveDir += camForward; } if (VxInput.GetKey(Key.S)) { moveDir += -camForward; } if (VxInput.GetKey(Key.A)) { moveDir += -camRight; } if (VxInput.GetKey(Key.D)) { moveDir += camRight; } if (VxInput.GetKey(Key.Q)) { moveDir += -camUp; } if (VxInput.GetKey(Key.E)) { moveDir += camUp; } if (moveDir != Vector3.Zero) { float turboFactor = VxInput.GetKey(Key.ControlLeft) ? 0.125f : VxInput.GetKey(Key.ShiftLeft) ? 2f : 1f; Position += Vector3.Normalize(moveDir) * _moveSpeed * Vx.FrameTime * turboFactor; } Vx.Camera(); Vx.Position(Position); Vx.Rotation(camRot); }