/// <summary>
        /// Creates a new GUICanvas. Only one may exist.
        /// </summary>
        public GUICanvas()
        {
            Assert.Fatal(GUICanvas._instance == null, "GUICanvas Constructor - GUICanvas already exists.");
            GUICanvas._instance = this;

            _awake = true;
            _visible = true;

            Name = "Canvas";

            // initialize the drawing utility
            DrawUtil.Setup();
        }
        /// <summary>
        /// Sets up the engine.  
        /// </summary>
        void _SetupEngine()
        {
            // if we have a d3d device, init video now
            if (_graphicsManager.GraphicsDevice != null)
            {
                // create gfx device
                _gfxDevice = new GFXDevice();

                // override shader profile...
                _gfxDevice.ForceUserShaderProfile = _settings.ForceUserShaderProfile;
                _gfxDevice.UserShaderProfile = _settings.UserShaderProfile;

                // initialize the device
                _gfxDevice.Init(_graphicsManager);

                _ApplyVideoProfile();
            }

            // create audio device
            if (_settings.EnableAudio && _sfxDevice == null && _settings.AudioGlobalSettingsFile != string.Empty)
            {
                TorqueConsole.Echo("Initializing audio...");

                try
                {
                    _sfxDevice = new AudioEngine(_settings.AudioGlobalSettingsFile);
                }
                catch (ArgumentException e) // catch this one so that we can continue running without needing update all of our xact files.
                {
                    _sfxDevice = null;
                    TorqueConsole.Error("TorqueEngineComponent::_SetupEngine - Failed to initialize XACT: " + e.ToString());
                }
            }

            // create gui canvas
            _canvas = new GUICanvas();
            TorqueObjectDatabase.Instance.Register(_canvas);

            TorqueConsole.Echo("Initializing GUICanvas...");

            // put a default gui on the canvas
            GUISceneview defaultContentControl = new GUISceneview();
            defaultContentControl.Name = "DefaultSceneView";
            defaultContentControl.Style = new GUIStyle();
            _canvas.SetContentControl(defaultContentControl);

            // configure time handling on game object.
            if (_settings.UseFixedTimeStep)
            {
                ProcessList.Instance.TickMS = _settings.TickMS; // use for a constant tick (with interpolation)

                if (_settings.UseInterpolation)
                {
                    // We want to interpolate between ticks, have xna give use updates whenever it has time
                    ProcessList.Instance.UseInterpolation = true;
                    Game.IsFixedTimeStep = false;
                }
                else
                {
                    // we only want to render on tick boundaries (no interpolation) so tell xna
                    // to only give us tick divisible updates.
                    ProcessList.Instance.UseInterpolation = false;
                    Game.IsFixedTimeStep = true;
                    Game.TargetElapsedTime = new TimeSpan(0, 0, 0, 0, _settings.TickMS);
                }
            }
            else
            {
                // Variable ticks and no interpolation so tell xna to give us updates whenever it has time
                ProcessList.Instance.TickMS = 0; // use for a variable tick (no interpolation)
                ProcessList.Instance.UseInterpolation = false; // not needed, but for clarity
                Game.IsFixedTimeStep = false;
            }

            TorqueConsole.Echo("Initializing event manager...");

            TorqueEventManager.ListenEvents(_timeEvent, _UpdateSim);
            TorqueEventManager.ListenEvents(PumpEvent, InputManager.Instance.Pump);

            // set up inputs
            Torque.Platform.XGamePadDevice.EnumerateGamepads();
            #if !XBOX
            Torque.Platform.XKeyboardDevice.EnumerateKeyboards();
            Torque.Platform.XMouseDevice.EnumerateMouses();
            Microsoft.Xna.Framework.Input.Mouse.WindowHandle = Game.Window.Handle;
            #endif

            TorqueConsole.Echo("Initializing content manager...");
            // Create global content manager
            ContentManager cm = new ContentManager(this.Game.Services);
            ResourceManager.Instance.GlobalContentManager = cm;

            // make it the current CM
            ResourceManager.Instance.PushContentManager(cm);

            #if DEBUG
            // setup journaling
            if (_settings.JournalMode != TorqueJournal.JournalMode.None)
            {
                TorqueConsole.Echo("Initializing journaling...");
                bool ok;
                string err;
                TorqueJournal journal = new TorqueJournal();

                if (Settings.JournalMode == TorqueJournal.JournalMode.Play)
                {
                    err = " for reading.";
                    ok = journal.OpenForRead(_settings.JournalFile);
                }
                else
                {
                    err = " for writing.";
                    ok = journal.OpenForWrite(_settings.JournalFile);
                }

                Assert.Fatal(ok, "Not able to open journal file " + _settings.JournalFile + err);

                if (ok)
                    TorqueEventManager.Instance.Journal = journal;
            }
            #endif
        }