Exemplo n.º 1
0
        /// <summary>
        /// Draws all of the user interface components.
        /// </summary>
        /// <remarks>Do not call this method. This method will be called automatically</remarks>
        /// <param name="elapsedTime"></param>
        /// <param name="clear"></param>
        /// <param name="renderRightEye"></param>
        public void Draw(float elapsedTime, bool clear, bool renderRightEye)
        {
            State.Device.DepthStencilState = DepthStencilState.None;

            passedTime += elapsedTime;
            if (passedTime >= 1000)
            {
                passedTime  = 0;
                prevCounter = counter;
                counter     = 1;
            }
            else if (elapsedTime != 0)
            {
                counter++;
            }

            float y = 5;
            float x = 5;

            if (State.ShowFPS)
            {
                if (debugFont == null)
                {
                    throw new GoblinException("You need to add 'DebugFont.spritefont' file to your " +
                                              "content directory before you can display debug information");
                }

                UI2DRenderer.WriteText(new Vector2(x, y), prevCounter + " FPS", State.DebugTextColor, debugFont);
                y += 20;
            }

            if (State.ShowTriangleCount)
            {
                if (debugFont == null)
                {
                    throw new GoblinException("You need to add 'DebugFont.spritefont' file to your " +
                                              "content directory before you can display debug information");
                }

                UI2DRenderer.WriteText(new Vector2(x, y), triangleCount + " Triangles", State.DebugTextColor, debugFont);
                y += 20;
            }

            if (State.ShowNotifications)
            {
                if (debugFont == null)
                {
                    throw new GoblinException("You need to add 'DebugFont.spritefont' file to your " +
                                              "content directory before you can display debug information");
                }

                if (Notifier.MessageCount > 0)
                {
                    messages.AddRange(Notifier.GetMessages());
                }

                if (messages.Count > 0)
                {
                    float yGap = Notifier.Font.MeasureString(messages[0].Message).Y;
                    Color color;
                    switch (Notifier.Placement)
                    {
                    case Notifier.NotifierPlacement.TopRight:
                        y = 0;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Right,
                                                   GoblinEnums.VerticalAlignment.None);
                            y += yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.TopMiddle:
                        y = 0;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Center,
                                                   GoblinEnums.VerticalAlignment.None);
                            y += yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.TopLeft:
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Left,
                                                   GoblinEnums.VerticalAlignment.None);
                            y += yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.BottomRight:
                        y = State.Height - yGap;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Right,
                                                   GoblinEnums.VerticalAlignment.None);
                            y -= yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.BottomMiddle:
                        y = State.Height - yGap;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Center,
                                                   GoblinEnums.VerticalAlignment.None);
                            y -= yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.BottomLeft:
                        y = State.Height - yGap;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(0, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Left,
                                                   GoblinEnums.VerticalAlignment.None);
                            y -= yGap;
                        }
                        break;

                    case Notifier.NotifierPlacement.Custom:
                        x = Notifier.CustomStartLocation.X;
                        y = Notifier.CustomStartLocation.Y;
                        for (int i = messages.Count - 1; i >= 0; i--)
                        {
                            color = Notifier.Color;
                            if (messages[i].StartFadeOut)
                            {
                                color = new Color(color.R, color.G, color.B,
                                                  (byte)messages[i].FadeOutInterpolator.Value);
                            }
                            UI2DRenderer.WriteText(new Vector2(x, y), messages[i].Message, color,
                                                   Notifier.Font, Vector2.One, GoblinEnums.HorizontalAlignment.Right,
                                                   GoblinEnums.VerticalAlignment.None);
                            x -= Notifier.CustomAppearDirection.X;
                            y += Notifier.CustomAppearDirection.Y;
                        }
                        break;
                    }

                    if (Notifier.FadeOutTime > 0)
                    {
                        double currentTime = DateTime.Now.TimeOfDay.TotalMilliseconds;
                        for (int i = 0; i < messages.Count; i++)
                        {
                            if (!messages[i].StartFadeOut)
                            {
                                if ((currentTime - messages[i].StartTime) >= Notifier.FadeOutTime)
                                {
                                    messages[i].StartFadeOut = true;
                                    messages[i].FadeOutInterpolator.Start();
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }

                        int deleteCount = 0;
                        for (int i = 0; i < messages.Count; i++)
                        {
                            if (messages[i].StartFadeOut)
                            {
                                if (messages[i].FadeOutInterpolator.Done)
                                {
                                    deleteCount++;
                                }
                            }
                            else
                            {
                                break;
                            }
                        }

                        messages.RemoveRange(0, deleteCount);
                    }
                }
            }

            foreach (G2DComponent comp2d in comp2Ds)
            {
                comp2d.RenderWidget();
            }

            if (renderRightEye)
            {
                UI2DRenderer.Flush(clear, -globalUIShift / 2);
            }
            else
            {
                UI2DRenderer.Flush(clear, globalUIShift / 2);
            }

            State.Device.DepthStencilState = DepthStencilState.Default;

            UI3DRenderer.Flush(clear);
        }