//chooses an appropriate state for the rendering engine private void chooseDesiredEngineState() { FractalEngineState state = FractalEngineState.Offline; if (!this.ReadyToRender || !renderer.HasGraphics) { state = FractalEngineState.Offline; } else if ( this.ClientSize.IsEmpty || this.RendererSize.IsEmpty || this.Resizing || this.DlgActive || FractalManager.Fractal == null) { state = FractalEngineState.Suspended; } else { state = FractalEngineState.Online; } engineMgr.DesiredEngineState = state; if (config.AutoSizeRenderer) { engineMgr.DesiredOutputSize = renderer.ClientSize; } else { engineMgr.DesiredOutputSize = config.CustomRes; } updateEngineStatusPanel(); //if an engine error hasn't been shown before, do the engine error dialog. if (engineMgr.EngineState == FractalEngineState.Error && !engineErrorShown) { engineErrorShown = true; ErrorForm.Show(engineMgr.CurrentException); } }
private void updateEngineStatusPanel() { if (engineMgr == null) { return; } FractalEngineState cs = engineMgr.EngineState; FractalEngineState ds = engineMgr.DesiredEngineState; string str = ""; switch (cs) { case FractalEngineState.Online: switch (ds) { case FractalEngineState.Online: str = "is online."; break; case FractalEngineState.Suspended: str = "is suspending..."; break; case FractalEngineState.Offline: str = "is shutting Down..."; break; } engineStatusPanel.Visible = false; renderer.Visible = true; break; case FractalEngineState.Suspended: switch (ds) { case FractalEngineState.Online: str = "is resuming..."; break; case FractalEngineState.Suspended: str = "is suspended."; break; case FractalEngineState.Offline: str = "is shutting Down..."; break; } renderer.Visible = false; viewEngineErrorButton.Visible = false; restartEngineButton.Visible = false; engineStatusPanel.Visible = true; break; case FractalEngineState.Offline: switch (ds) { case FractalEngineState.Online: str = "is starting..."; break; case FractalEngineState.Suspended: str = "is starting..."; break; case FractalEngineState.Offline: str = "is offline."; break; } renderer.Visible = false; viewEngineErrorButton.Visible = false; restartEngineButton.Visible = false; engineStatusPanel.Visible = true; break; case FractalEngineState.Error: default: str = "has crashed."; renderer.Visible = false; viewEngineErrorButton.Visible = true; restartEngineButton.Visible = true; engineStatusPanel.Visible = true; break; } engineStatusLabel.Text = string.Format("Fractal engine {0}", str); }
private void switchState(FractalEngineState rs) { FractalEngineState cs = this.EngineState; //the current engine state try{ if (rs == cs) { return; //they match, do nothing } else if (cs == FractalEngineState.Online) { if (rs == FractalEngineState.Suspended) //go from online to suspended { engine.Deallocate(); } else if (rs == FractalEngineState.Offline) //go from online to offline { shutdownEngine(); } } else if (cs == FractalEngineState.Suspended) { if (rs == FractalEngineState.Online) //go from suspended to online { allocateEngine(); } else if (rs == FractalEngineState.Offline) //go from suspended to offline { shutdownEngine(); } } else if (cs == FractalEngineState.Offline) { if (rs == FractalEngineState.Online) //go from offline to online { deviceEntry = chooseDevice(); engine = deviceEntry.CreateFractalEngine(mainForm.Renderer.Context); allocateEngine(); } else if (rs == FractalEngineState.Suspended) //go from offline to suspended { deviceEntry = chooseDevice(); engine = deviceEntry.CreateFractalEngine(mainForm.Renderer.Context); } } else if (cs == FractalEngineState.Error) { if (rs == FractalEngineState.Offline) //go from error to offline { shutdownEngine(); } } } catch (Exception ex) //if something goes wrong, switch to the error state { shutdownEngine(); if (ex is NoDevicesFoundException) { currentException = ex; } else { currentException = new FractalEngineStateException(deviceEntry == null ? EngineType.Auto : deviceEntry.EngineType, cs, rs, ex); } } }
public FractalEngineStateException(EngineType engineType, FractalEngineState fromState, FractalEngineState toState, Exception innerException) : base(engineType, "An error has occured in the fractal engine.", innerException) { this.Data["fromState"] = (object)fromState; this.Data["toState"] = (object)toState; }
public void UpdateEngineState() { FractalEngineState rs = this.DesiredEngineState; //the desired engine state switchState(rs); }