public void Activate(ICamera oldCamera) { IMouseKeyboardInputSource src = InputSystem.GetInstance().MouseKeyboard; src.MouseDown += _OnMouseDown; src.MouseUp += _OnMouseUp; if (oldCamera != null) { var data = oldCamera.GetCameraData(); m_isLeftDrugging = false; m_isRightDrugging = false; var gaze = data.lookAt - data.eye; Zoom = gaze.Length(); gaze.Normalize(); var right = Vector3.Cross(data.up, gaze); var position = data.eye; m_cameraTrans.Row1 = new Vector4(right, 0); m_cameraTrans.Row2 = new Vector4(data.up, 0); m_cameraTrans.Row3 = new Vector4(gaze, 0); m_cameraTrans.Row4 = new Vector4(position, 1); } }
public void Update(double dt) { IMouseKeyboardInputSource src = InputSystem.GetInstance().MouseKeyboard; int dWheel = src.WheelDelta; Zoom = MathUtil.Clamp(Zoom + dWheel * -ZoomFactor, MinZoom, MaxZoom); Vector2 dPos = src.MousePositionDelta; if (m_isLeftDrugging) { // update angle float hAngle = dPos.X * AngleFactor; float vAngle = dPos.Y * AngleFactor; m_cameraTrans = Matrix.RotationYawPitchRoll(hAngle, vAngle, 0) * m_cameraTrans; } if (m_isRightDrugging) { // update look at position float xOffset = -dPos.X * PositionFactor; float yOffset = dPos.Y * PositionFactor; m_cameraTrans = Matrix.Translation(xOffset, yOffset, 0) * m_cameraTrans; } }
public void Deactivate() { IMouseKeyboardInputSource src = InputSystem.GetInstance().MouseKeyboard; src.MouseDown -= _OnMouseDown; src.MouseUp -= _OnMouseUp; }
public void Update(double dt) { if (m_player == null) { return; } var layoutC = m_player.FindComponent <LayoutComponent>(); Debug.Assert(layoutC != null, ""); Matrix headRotTrans = Matrix.Identity; if (m_isEnableHeadRotation) { var gameSys = GameSystem.GetInstance(); switch (gameSys.Config.InputDevice) { case GameConfig.UserInputDevices.MouseKeyboard: break; case GameConfig.UserInputDevices.Pad: { IPadInputSource src = InputSystem.GetInstance().Pad; var thumbDir = src.RightThumbInput.Direction; float magnitude = src.RightThumbInput.NormalizedMagnitude; if (magnitude >= MinimumPadMagnitude) { float maxAngle = 0.9f; m_headRotAngle.X = Math.Min(Math.Max(m_headRotAngle.X + thumbDir.Y * (float)dt, -maxAngle), maxAngle); m_headRotAngle.Y = Math.Min(Math.Max(m_headRotAngle.Y + thumbDir.X * (float)dt, -maxAngle), maxAngle); m_headRotAngle.Z = 0; } else { m_headRotAngle *= 0.9f; } } break; } headRotTrans = Matrix.RotationYawPitchRoll(m_headRotAngle.Y, m_headRotAngle.X, m_headRotAngle.Z); } //var markerC = m_player.FindComponent<ModelMarkerComponent>(); //Debug.Assert(markerC != null, ""); //var mtx = markerC.FindMarkerMatrix(10) * layoutC.Transform; var mtx = headRotTrans * layoutC.Transform * Matrix.Translation(0, 1, 0); Vector3 eye, lookAt, up; eye = mtx.TranslationVector + Vector3.UnitY; lookAt = eye + mtx.Forward * Zoom; up = Vector3.UnitY; m_camera = new DrawSystem.CameraData(eye, lookAt, up); }
/// <summary> /// Update component /// </summary> /// <param name="dT">spend time [sec]</param> public override void Update(double dT) { var cameraSys = CameraSystem.GetInstance(); var drawSys = DrawSystem.GetInstance(); // Calc camera var viewHeadMat = cameraSys.GetCameraData().GetViewMatrix() * drawSys.GetDrawContext().GetHeadMatrix(); viewHeadMat.Invert(); var moveDirection = new Vector3(viewHeadMat.Backward.X, 0, viewHeadMat.Backward.Z); moveDirection.Normalize(); var gameSys = GameSystem.GetInstance(); switch (gameSys.Config.InputDevice) { case GameConfig.UserInputDevices.MouseKeyboard: { IMouseKeyboardInputSource src = InputSystem.GetInstance().MouseKeyboard; var v = Vector3.Zero; if (src.TestKeyState(Keys.W)) { v.Z += PositionFactor; } if (src.TestKeyState(Keys.A)) { v.X -= PositionFactor; } if (src.TestKeyState(Keys.D)) { v.X += PositionFactor; } if (src.TestKeyState(Keys.S)) { v.Z -= PositionFactor; } if (v.X != 0 || v.Z != 0) { float angleY = (float)Math.Atan2(moveDirection.X, moveDirection.Z); v = Vector3.Transform(v, Matrix3x3.RotationY(angleY)); m_behaviorC.RequestMove(v); m_behaviorC.RequestTurn(v); } } break; case GameConfig.UserInputDevices.Pad: { IPadInputSource src = InputSystem.GetInstance().Pad; float angleY = (float)Math.Atan2(moveDirection.X, moveDirection.Z); var thumbDir = src.LeftThumbInput.Direction; float magnitude = src.LeftThumbInput.NormalizedMagnitude; if (magnitude >= MinimumPadMagnitude) { var v = new Vector3(thumbDir.X, 0, thumbDir.Y); v = Vector3.Transform(v, Matrix3x3.RotationY(angleY)); v = v * magnitude; m_behaviorC.RequestMove(v); m_behaviorC.RequestTurn(v); } } break; default: Debug.Fail("unsupported input device type : " + gameSys.Config.InputDevice); break; } }
/// <summary> /// Update component /// </summary> /// <param name="dT">spend time [sec]</param> public override void Update(double dT) { var mapSys = MapSystem.GetInstance(); m_coroutine.Update(dT); if (!m_coroutine.HasCompleted()) { // wait for end of character operation return; } var cameraSys = CameraSystem.GetInstance(); var drawSys = DrawSystem.GetInstance(); var gameSys = GameSystem.GetInstance(); switch (gameSys.Config.InputDevice) { case GameConfig.UserInputDevices.MouseKeyboard: { IMouseKeyboardInputSource src = InputSystem.GetInstance().MouseKeyboard; var v = Vector3.Zero; if (src.TestKeyState(Keys.W)) { v.Z += PositionFactor; } if (src.TestKeyState(Keys.A)) { v.X -= PositionFactor; } if (src.TestKeyState(Keys.D)) { v.X += PositionFactor; } if (src.TestKeyState(Keys.S)) { v.Z -= PositionFactor; } if (v.X != 0 || v.Z != 0) { // @todo } } break; case GameConfig.UserInputDevices.Pad: { IPadInputSource src = InputSystem.GetInstance().Pad; // update move { _InputType inputType = _InputType.None; var thumbDir = src.LeftThumbInput.Direction; float magnitude = src.LeftThumbInput.NormalizedMagnitude; if (magnitude >= MinimumPadMagnitude) { // use pad stick if (thumbDir.Y <= -0.851) { inputType = _InputType.Backward; } else if (thumbDir.Y >= 0.851) { inputType = _InputType.Forward; } else { if (thumbDir.X < 0) { inputType = _InputType.Left; } else { inputType = _InputType.Right; } } } else { // use pad cross key if (src.TestButtonState(InputSystem.PadButtons.Down)) { inputType = _InputType.Backward; } else if (src.TestButtonState(InputSystem.PadButtons.Up)) { inputType = _InputType.Forward; } else if (src.TestButtonState(InputSystem.PadButtons.Left)) { inputType = _InputType.Left; } else if (src.TestButtonState(InputSystem.PadButtons.Right)) { inputType = _InputType.Right; } } #if true switch (inputType) { case _InputType.Forward: { var nextDir = MapLocation.GetForwardDirection(m_currentLocation.Direction); MapLocation?nextLocation = mapSys.Walk(m_currentLocation, nextDir); if (nextLocation.HasValue) { m_currentLocation = nextLocation.Value; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(new _MoveToTask(this, pose.TranslationVector)); // no turn } } break; case _InputType.Backward: { var nextDir = MapLocation.GetBackwardDirection(m_currentLocation.Direction); m_currentLocation.Direction = nextDir; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(new _TurnToTask(this, pose.Forward)); } break; case _InputType.Left: { var nextDir = MapLocation.GetLeftDirection(m_currentLocation.Direction); m_currentLocation.Direction = nextDir; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(new _TurnToTask(this, pose.Forward)); } break; case _InputType.Right: { var nextDir = MapLocation.GetRightDirection(m_currentLocation.Direction); m_currentLocation.Direction = nextDir; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(new _TurnToTask(this, pose.Forward)); } break; } #else switch (inputType) { case _InputType.Forward: { var nextDir = MapLocation.GetForwardDirection(m_currentLocation.Direction); MapLocation?nextLocation = mapSys.Walk(m_currentLocation, nextDir); if (nextLocation.HasValue) { m_currentLocation = nextLocation.Value; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(new _MoveToTask(this, pose.TranslationVector)); // no turn } } break; case _InputType.Backward: { var nextDir = MapLocation.GetBackwardDirection(m_currentLocation.Direction); MapLocation?nextLocation = mapSys.Walk(m_currentLocation, nextDir); if (nextLocation.HasValue) { m_currentLocation = nextLocation.Value; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(Coroutine.Join(new _TurnToTask(this, pose.Forward), new _MoveToTask(this, pose.TranslationVector))); } } break; case _InputType.Left: { var nextDir = MapLocation.GetLeftDirection(m_currentLocation.Direction); MapLocation?nextLocation = mapSys.Walk(m_currentLocation, nextDir); if (nextLocation.HasValue) { m_currentLocation = nextLocation.Value; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(Coroutine.Join(new _TurnToTask(this, pose.Forward), new _MoveToTask(this, pose.TranslationVector))); } } break; case _InputType.Right: { var nextDir = MapLocation.GetRightDirection(m_currentLocation.Direction); MapLocation?nextLocation = mapSys.Walk(m_currentLocation, nextDir); if (nextLocation.HasValue) { m_currentLocation = nextLocation.Value; var pose = mapSys.GetPose(m_currentLocation); m_coroutine.Start(Coroutine.Join(new _TurnToTask(this, pose.Forward), new _MoveToTask(this, pose.TranslationVector))); } } break; } #endif } } break; default: Debug.Fail("unsupported input device type : " + gameSys.Config.InputDevice); break; } }
public void RenderFrame() { double dt = m_fps.GetDeltaTime(); var drawSys = DrawSystem.GetInstance(); var cameraSys = CameraSystem.GetInstance(); var inputSys = InputSystem.GetInstance(); var entitySys = EntitySystem.GetInstance(); var mapSys = MapSystem.GetInstance(); var cullingSys = CullingSystem.GetInstance(); // update fps { double avgDT = m_fps.GetAverageDeltaTime(); string text = String.Format("FPS:{0:f2}, DeltaTime:{1:f2}ms", 1.0 / avgDT, avgDT * 1000.0f); m_numberEntity.SetNumber(1.0f / (float)avgDT); } if (m_multiThreadCount > 1) { Task.WaitAll(m_taskList.ToArray()); var tmpTaskResult = new List <CommandList>(m_taskResultList); inputSys.Update(dt); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.Input, dt); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.Behavior, dt); cameraSys.Update(dt); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.PostBehavior, dt); DrawSystem.WorldData worldData; worldData.AmbientColor = new Color3(0.4f, 0.45f, 0.55f); worldData.FogColor = new Color3(0.3f, 0.5f, 0.8f); worldData.NearClip = 0.01f; worldData.FarClip = 100.0f; worldData.DirectionalLight = new DrawSystem.DirectionalLightData() { Direction = new Vector3(0.3f, -0.2f, 0.4f), Color = new Color3(0.6f, 0.6f, 0.5f), }; worldData.Camera = cameraSys.GetCameraData(); drawSys.BeginScene(worldData); var context = drawSys.GetDrawContext(); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.Posing, dt); mapSys.Update(dt, context); cullingSys.UpdateFrustum(); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.PreDraw, dt); drawSys.GetDrawBuffer().Process(drawSys.GetDrawContext()); entitySys.UpdateComponents(GameEntityComponent.UpdateLines.Draw, dt); // start command list generation for the next frame m_taskList.Clear(); m_taskResultList.Clear(); m_taskResultList.AddRange(Enumerable.Repeat <CommandList>(null, m_multiThreadCount)); m_accTime += dt; for (int threadIndex = 0; threadIndex < m_multiThreadCount; ++threadIndex) { int resultIndex = threadIndex; var subThreadContext = drawSys.GetSubThreadContext(threadIndex); m_taskList.Add(Task.Run(() => { // todo : do sub-thread task m_taskResultList[resultIndex] = subThreadContext.FinishCommandList(); })); } foreach (var result in tmpTaskResult) { context.ExecuteCommandList(result); } m_numberEntity.SetPose(ChrSystem.GetInstance().Player.FindComponent <LayoutComponent>().Transform); m_numberEntity.Draw(context); drawSys.EndScene(); } else { // not supported } m_fps.EndFrame(); m_fps.BeginFrame(); }