internal GameScene(Application.Client client, ClientWorld world, GameConsole console) { this.client = client; Player = null !; Screen.SetCursor(visible: false, locked: true); ui = new GameUserInterface( client, client.Keybinds.Input.Listener, drawBackground: false); List <ISettingsProvider> settingsProviders = new() { client.Settings, Application.Client.Instance.Keybinds }; ui.SetSettingsProviders(settingsProviders); ui.SetConsoleProvider(console); ui.SetPerformanceProvider(client); ui.WorldExit += client.LoadStartScene; ui.AnyOverlayOpen += () => { Screen.SetOverlayLock(); Screen.SetCursor(visible: true, locked: false); }; ui.AnyOverlayClosed += () => { Screen.ClearOverlayLock(); Screen.SetCursor(visible: false, locked: true); }; World = world; counter = world.UpdateCounter; uiToggle = client.Keybinds.GetToggle(client.Keybinds.UI); screenshotButton = client.Keybinds.GetPushButton(client.Keybinds.Screenshot); consoleToggle = client.Keybinds.GetToggle(client.Keybinds.Console); escapeButton = client.Keybinds.GetPushButton(client.Keybinds.Escape); }
internal StartScene(Application.Client client) { this.client = client; WorldProvider worldProvider = new(Program.WorldsDirectory); worldProvider.WorldActivation += client.LoadGameScene; List <ISettingsProvider> settingsProviders = new() { client.Settings, Application.Client.Instance.Keybinds, client.Graphics }; ui = new StartUserInterface( client, client.Keybinds.Input.Listener, worldProvider, settingsProviders, drawBackground: true); }
internal Screen(Application.Client client) { Instance = this; Client = client; client.Resize += OnResize; #region MULTISAMPLED FBO int maxSamples = GL.GetInteger(GetPName.MaxSamples); samples = Math.Clamp(Client.Graphics.SampleCount, min: 1, maxSamples); logger.LogDebug( Events.VisualQuality, "Set sample count to {Samples}, of maximum {Max} possible samples", samples, maxSamples); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); GL.Enable(EnableCap.Multisample); msTex = GL.GenTexture(); GL.BindTexture(TextureTarget.Texture2DMultisample, msTex); GL.TexImage2DMultisample( TextureTargetMultisample.Texture2DMultisample, samples, PixelInternalFormat.Rgba8, Size.X, Size.Y, fixedsamplelocations: true); GL.BindTexture(TextureTarget.Texture2DMultisample, texture: 0); GL.CreateFramebuffers(n: 1, out msFBO); GL.NamedFramebufferTexture(msFBO, FramebufferAttachment.ColorAttachment0, msTex, level: 0); FramebufferStatus multisampledFboStatus = GL.CheckNamedFramebufferStatus(msFBO, FramebufferTarget.Framebuffer); while (multisampledFboStatus != FramebufferStatus.FramebufferComplete) { logger.LogWarning( Events.VisualsSetup, "Multi-sampled FBO not complete [{Status}], waiting...", multisampledFboStatus); Thread.Sleep(millisecondsTimeout: 100); multisampledFboStatus = GL.CheckNamedFramebufferStatus(msFBO, FramebufferTarget.Framebuffer); } GL.CreateRenderbuffers(n: 1, out msRBO); GL.NamedRenderbufferStorageMultisample(msRBO, samples, RenderbufferStorage.Depth24Stencil8, Size.X, Size.Y); GL.NamedFramebufferRenderbuffer( msFBO, FramebufferAttachment.DepthStencilAttachment, RenderbufferTarget.Renderbuffer, msRBO); GL.BindFramebuffer(FramebufferTarget.Framebuffer, msFBO); GL.DrawBuffer(DrawBufferMode.ColorAttachment0); #endregion MULTISAMPLED FBO #region DEPTH TEXTURE depthTex = GL.GenTexture(); GL.ActiveTexture(TextureUnit.Texture20); GL.BindTexture(TextureTarget.Texture2D, depthTex); GL.TexImage2D( TextureTarget.Texture2D, level: 0, PixelInternalFormat.DepthComponent, Size.X, Size.Y, border: 0, PixelFormat.DepthComponent, PixelType.Float, IntPtr.Zero); GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest); GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest); GL.CreateFramebuffers(n: 1, out depthFBO); GL.NamedFramebufferTexture(depthFBO, FramebufferAttachment.DepthAttachment, depthTex, level: 0); FramebufferStatus depthFboStatus = GL.CheckNamedFramebufferStatus(depthFBO, FramebufferTarget.Framebuffer); while (depthFboStatus != FramebufferStatus.FramebufferComplete) { logger.LogWarning(Events.VisualsSetup, "Depth FBO not complete [{Status}], waiting...", depthFboStatus); Thread.Sleep(millisecondsTimeout: 100); depthFboStatus = GL.CheckNamedFramebufferStatus(depthFBO, FramebufferTarget.Framebuffer); } GL.ActiveTexture(TextureUnit.Texture0); #endregion DEPTH TEXTURE #region SCREENSHOT FBO GL.CreateFramebuffers(n: 1, out screenshotFBO); GL.CreateRenderbuffers(n: 1, out screenshotRBO); GL.NamedRenderbufferStorage(screenshotRBO, RenderbufferStorage.Rgba8, Size.X, Size.Y); GL.NamedFramebufferRenderbuffer( screenshotFBO, FramebufferAttachment.ColorAttachment0, RenderbufferTarget.Renderbuffer, screenshotRBO); FramebufferStatus screenshotFboStatus = GL.CheckNamedFramebufferStatus(screenshotFBO, FramebufferTarget.Framebuffer); while (screenshotFboStatus != FramebufferStatus.FramebufferComplete) { logger.LogWarning( Events.VisualsSetup, "Screenshot FBO not complete [{Status}], waiting...", screenshotFboStatus); Thread.Sleep(millisecondsTimeout: 100); screenshotFboStatus = GL.CheckNamedFramebufferStatus(screenshotFBO, FramebufferTarget.Framebuffer); } #endregion SCREENSHOT FBO }