示例#1
0
文件: Engine.cs 项目: bsimser/CoM
    /**
     * Draws all visibile game states.
     */
    virtual public void DoDraw()
    {
        // check for any cache updates that need to happen
        GuiContainer.ValidateAll();

        if (!EnableCamera)
        {
            GL.Clear(true, true, Color.black);
        }

        // draws all layers into a render texture.
        bool layerComposite = false;

        RenderTexture compositeTexture = null;

        PureGUIMatrix = GUI.matrix;

        GUI.matrix    = Matrix4x4.Scale(new Vector3(GuiScale, GuiScale, 1));
        BaseGUIMatrix = GUI.matrix;

        if (layerComposite)
        {
            compositeTexture = RenderTexture.GetTemporary(Screen.width, Screen.height);
            Graphics.SetRenderTarget(compositeTexture);
            GL.Clear(true, true, Color.clear);
        }

        // states are drawn backwards from the last state to block vision
        int firstStateToDraw;

        for (firstStateToDraw = 0; firstStateToDraw < StateList.Count; firstStateToDraw++)
        {
            if (!StateList[firstStateToDraw].TransparentDraw)
            {
                break;
            }
        }

        if (!HideGUI)
        {
            for (int lp = firstStateToDraw; lp >= 0; lp--)
            {
                try {
                    StateList[lp].Draw();
                } catch (Exception error) {
                    Trace.LogDebug("Error drawing state {0} of {1}: {2}", lp, StateList.Count, error.Message);
                }
            }
        }

        if (layerComposite)
        {
            Graphics.SetRenderTarget(null);
            var dp = DrawParameters.Default;
            //Graphics.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), compositeTexture, new Rect(0, 0, Screen.width, Screen.height), 0, 0, 0, 0, Color.white, dp.GetPreparedMaterial(compositeTexture));
            Graphics.Blit(compositeTexture, dp.GetPreparedMaterial(compositeTexture));
            RenderTexture.ReleaseTemporary(compositeTexture);
        }

        // draw notifications
        for (int lp = 0; lp < notificationList.Count; lp++)
        {
            var notification = notificationList[lp];
            notification.Update();
            notification.Draw();
        }

        if (DragDrop != null)
        {
            DragDrop.Draw();
        }

        if (Settings.General.ShowFPS)
        {
            FPSLabel.Draw();
        }

        if (Settings.Advanced.ShowLogs)
        {
            CurrentState.PositionComponent(LogWindow, 1, 0);
            LogWindow.Update();
            LogWindow.Draw();
        }
    }