internal void NewFrame() { current = this; GUIContext g = this.uiContext; WindowManager w = g.WindowManager; if (!g.Initialized) { // Initialize on first frame g.Initialized = true; } // Time g.DeltaTime = Time.deltaTime; g.Time += g.DeltaTime; g.FrameCount++; //fps var detlaTime = g.Time - g.lastFPSUpdateTime; g.lastFrameCount++; if (detlaTime > 1000) { g.fps = (int)g.lastFrameCount; g.lastFrameCount = 0; g.lastFPSUpdateTime = g.Time; } #region Input #region mouse position if (Mouse.Instance.Position.X < 0 && Mouse.Instance.Position.Y < 0) { Mouse.Instance.Position = new Point(-9999.0f, -9999.0f); } if ((Mouse.Instance.Position.X < 0 && Mouse.Instance.Position.Y < 0) || (Mouse.Instance.LastPosition.X < 0 && Mouse.Instance.LastPosition.Y < 0)) // if mouse just appeared or disappeared (negative coordinate) we cancel out movement in MouseDelta { Mouse.Instance.MouseDelta = Vector.Zero; } else { Mouse.Instance.MouseDelta = Mouse.Instance.Position - Mouse.Instance.LastPosition; } Mouse.Instance.LastPosition = Mouse.Instance.Position; #endregion #region mouse left button Mouse.Instance.LeftButtonPressed = Mouse.Instance.LeftButtonState == KeyState.Down && Mouse.Instance.LeftButtonDownDuration < 0; Mouse.Instance.LeftButtonReleased = Mouse.Instance.LeftButtonState == KeyState.Up && Mouse.Instance.LeftButtonDownDuration >= 0; Mouse.Instance.LeftButtonDownDurationPrev = Mouse.Instance.LeftButtonDownDuration; Mouse.Instance.LeftButtonDownDuration = Mouse.Instance.LeftButtonState == KeyState.Down ? (Mouse.Instance.LeftButtonDownDuration < 0 ? 0 : Mouse.Instance.LeftButtonDownDuration + g.DeltaTime) : -1; Mouse.Instance.LeftButtonDoubleClicked = false; if (Mouse.Instance.LeftButtonPressed) { if (g.Time - Mouse.Instance.LeftButtonClickedTime < Mouse.DoubleClickIntervalTimeSpan) { if ((Mouse.Instance.Position - Mouse.Instance.LeftButtonPressedPos).LengthSquared < Mouse.DoubleClickMaxDistance * Mouse.DoubleClickMaxDistance) { Mouse.Instance.LeftButtonDoubleClicked = true; } Mouse.Instance.LeftButtonClickedTime = -99999; // so the third click isn't turned into a double-click } else { Mouse.Instance.LeftButtonClickedTime = g.Time; } Mouse.Instance.LeftButtonPressedPos = Mouse.Instance.Position; Mouse.Instance.DragMaxDiatanceSquared = 0; } else if (Mouse.Instance.LeftButtonState == KeyState.Down) { Mouse.Instance.DragMaxDiatanceSquared = Math.Max(Mouse.Instance.DragMaxDiatanceSquared, (Mouse.Instance.Position - Mouse.Instance.LeftButtonPressedPos).LengthSquared); } if (Mouse.Instance.LeftButtonPressed) { ++Mouse.Instance.LeftButtonPressedTimes; } if (Mouse.Instance.LeftButtonReleased) { ++Mouse.Instance.LeftButtonReleasedTimes; } if (Mouse.Instance.LeftButtonDoubleClicked) { ++Mouse.Instance.LeftButtonDoubleClickedTimes; } #endregion #region mouse right button Mouse.Instance.RightButtonPressed = Mouse.Instance.RightButtonState == KeyState.Down && Mouse.Instance.RightButtonDownDuration < 0; Mouse.Instance.RightButtonReleased = Mouse.Instance.RightButtonState == KeyState.Up && Mouse.Instance.RightButtonDownDuration >= 0; Mouse.Instance.RightButtonDownDuration = Mouse.Instance.RightButtonState == KeyState.Down ? (Mouse.Instance.RightButtonDownDuration < 0 ? 0 : Mouse.Instance.RightButtonDownDuration + g.DeltaTime) : -1; if (Mouse.Instance.RightButtonPressed) { ++Mouse.Instance.RightButtonPressedTimes; } if (Mouse.Instance.RightButtonReleased) { ++Mouse.Instance.RightButtonReleasedTimes; } #endregion #endregion // Clear reference to active widget if the widget isn't alive anymore g.HoveredIdPreviousFrame = g.HoverId; g.HoverId = 0; g.HoverIdAllowOverlap = false; if (!g.ActiveIdIsAlive && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0) { g.SetActiveID(0); } g.ActiveIdPreviousFrame = g.ActiveId; g.ActiveIdIsAlive = false; g.ActiveIdIsJustActivated = false; w.NewFrame(g); // Create implicit window - we will only render it if the user has added something to it. GUI.Begin("Debug", ref this.debugWindowOpen, (0, 0), (200, 140), 0.8); }
internal static void NewFrame() { GUIContext g = Application.ImGuiContext; WindowManager w = g.WindowManager; if (!g.Initialized) { // Initialize on first frame g.Initialized = true; } g.ConfigFlagsLastFrame = g.ConfigFlagsCurrFrame; g.ConfigFlagsCurrFrame = IO.ConfigFlags; // Time g.DeltaTime = Time.deltaTime; g.Time += g.DeltaTime; g.FrameCount++; Metrics.ActiveWindows = 0; //fps var detlaTime = g.Time - g.lastFPSUpdateTime; g.lastFrameCount++; if (detlaTime > 1000) { g.fps = (int)g.lastFrameCount; g.lastFrameCount = 0; g.lastFPSUpdateTime = g.Time; } UpdateViewportsNewFrame(); #region Input //TODO move to Mouse #region mouse position if (Mouse.Instance.Position.X < 0 && Mouse.Instance.Position.Y < 0) { Mouse.Instance.Position = new Point(-9999.0f, -9999.0f); } if ((Mouse.Instance.Position.X < 0 && Mouse.Instance.Position.Y < 0) || (Mouse.Instance.LastPosition.X < 0 && Mouse.Instance.LastPosition.Y < 0)) // if mouse just appeared or disappeared (negative coordinate) we cancel out movement in MouseDelta { Mouse.Instance.MouseDelta = Vector.Zero; } else { Mouse.Instance.MouseDelta = Mouse.Instance.Position - Mouse.Instance.LastPosition; } Mouse.Instance.LastPosition = Mouse.Instance.Position; #endregion #region mouse left button Mouse.Instance.LeftButtonPressed = Mouse.Instance.LeftButtonState == KeyState.Down && Mouse.Instance.LeftButtonDownDuration < 0; Mouse.Instance.LeftButtonReleased = Mouse.Instance.LeftButtonState == KeyState.Up && Mouse.Instance.LeftButtonDownDuration >= 0; Mouse.Instance.LeftButtonDownDurationPrev = Mouse.Instance.LeftButtonDownDuration; Mouse.Instance.LeftButtonDownDuration = Mouse.Instance.LeftButtonState == KeyState.Down ? (Mouse.Instance.LeftButtonDownDuration < 0 ? 0 : Mouse.Instance.LeftButtonDownDuration + g.DeltaTime) : -1; Mouse.Instance.LeftButtonDoubleClicked = false; if (Mouse.Instance.LeftButtonPressed) { if (g.Time - Mouse.Instance.LeftButtonClickedTime < Mouse.DoubleClickIntervalTimeSpan) { if ((Mouse.Instance.Position - Mouse.Instance.LeftButtonPressedPosition).LengthSquared < Mouse.DoubleClickMaxDistance * Mouse.DoubleClickMaxDistance) { Mouse.Instance.LeftButtonDoubleClicked = true; } Mouse.Instance.LeftButtonClickedTime = -99999; // so the third click isn't turned into a double-click } else { Mouse.Instance.LeftButtonClickedTime = g.Time; } Mouse.Instance.LeftButtonPressedPosition = Mouse.Instance.Position; Mouse.Instance.DragMaxDistanceSquared = 0; } else if (Mouse.Instance.LeftButtonState == KeyState.Down) { Mouse.Instance.DragMaxDistanceSquared = Math.Max(Mouse.Instance.DragMaxDistanceSquared, (Mouse.Instance.Position - Mouse.Instance.LeftButtonPressedPosition).LengthSquared); } if (Mouse.Instance.LeftButtonPressed) { ++Mouse.Instance.LeftButtonPressedTimes; } if (Mouse.Instance.LeftButtonReleased) { ++Mouse.Instance.LeftButtonReleasedTimes; } if (Mouse.Instance.LeftButtonDoubleClicked) { ++Mouse.Instance.LeftButtonDoubleClickedTimes; } #endregion #region mouse right button Mouse.Instance.RightButtonPressed = Mouse.Instance.RightButtonState == KeyState.Down && Mouse.Instance.RightButtonDownDuration < 0; Mouse.Instance.RightButtonReleased = Mouse.Instance.RightButtonState == KeyState.Up && Mouse.Instance.RightButtonDownDuration >= 0; Mouse.Instance.RightButtonDownDuration = Mouse.Instance.RightButtonState == KeyState.Down ? (Mouse.Instance.RightButtonDownDuration < 0 ? 0 : Mouse.Instance.RightButtonDownDuration + g.DeltaTime) : -1; if (Mouse.Instance.RightButtonPressed) { ++Mouse.Instance.RightButtonPressedTimes; } if (Mouse.Instance.RightButtonReleased) { ++Mouse.Instance.RightButtonReleasedTimes; } #endregion #endregion // Update HoverId data // 1. record data related to previous frame // 2. reset g.HoverId = 0; g.HoverIdAllowOverlap = false; g.HoveredIdPreviousFrame = g.HoverId; // Update ActiveId data // 1. record data related to previous frame // 2. reset if (g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId && g.ActiveId != 0) {//Clear reference to active widget if the widget isn't alive anymore g.SetActiveID(0, null); } g.ActiveIdPreviousFrame = g.ActiveId; g.ActiveIdIsAlive = 0; g.ActiveIdPreviousFrameIsAlive = false; g.ActiveIdIsJustActivated = false; w.NewFrame(g); foreach (var form in w.Viewports) { if (!form.PlatformWindowCreated) { continue; } form.ForeBackGroundRenderOpen(); } // [DEBUG] Item picker tool - start with DebugStartItemPicker() // useful to visually select an item and break into its call-stack. UpdateDebugToolItemPicker(); // Create implicit debug window - we will only render it if the user has added something to it. GUI.Begin("Debug##Default", Application.InitialDebugWindowRect); }