private void CheckLightingInfo(GraphicsDevice gd, SceneContext sc) { if (_lightingSettingChanged) { UpdateLightingInfo(gd, sc); } }
private void UpdateLightingInfo(GraphicsDevice gd, SceneContext sc) { if (sc.LightingInfoBuffer != null) { int lightScale; if (_overbright.Value) { lightScale = LightScaleRange; } else { //Round up the scale lightScale = (int)((Math.Pow(2.0, 1.0 / _lightingGamma.Value) * LightScaleRange) + 0.5); } var info = new LightingInfo { MainGamma = _mainGamma.Value, TextureGamma = _textureGamma.Value, LightingGamma = _lightingGamma.Value, Brightness = _brightness.Value, LightScale = lightScale, //Only enable if fullbright is turned off OverbrightEnabled = (!Fullbright.Value && _overbright.Value) ? 1 : 0, Fullbright = Fullbright.Value ? 1 : 0, }; gd.UpdateBuffer(sc.LightingInfoBuffer, 0, ref info); _lightingSettingChanged = false; } }
public void Render( GraphicsDevice gd, CommandList rc, SceneContext sc, RenderPasses pass, BoundingFrustum frustum, Vector3 viewPosition, RenderQueue renderQueue, List <IRenderable> renderableList, Comparer <RenderItemIndex> comparer, bool threaded) { renderQueue.Clear(); renderableList.Clear(); CollectFreeObjects(pass, renderableList); renderQueue.AddRange(renderableList, viewPosition); if (comparer == null) { renderQueue.Sort(); } else { renderQueue.Sort(comparer); } foreach (var renderable in renderQueue) { renderable.Render(gd, rc, sc, pass); } }
public RenderContext(GraphicsDevice gd, CommandList cl, SceneContext sc, RenderPasses renderPass) { GraphicsDevice = gd; CommandList = cl; SceneContext = sc; RenderPass = renderPass; }
public void Render(GraphicsDevice gd, CommandList cl, SceneContext sc, RenderPasses renderPass) { Debug.Assert(renderPass == RenderPasses.Overlay); ImGuiInterface.Draw(); _imguiRenderer.Render(gd, cl); }
public void CreateNewDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc, ResourceScope scope) { foreach (var r in _newResourceContainers) { r.CreateDeviceObjects(gd, cl, sc, scope); } _newResourceContainers.Clear(); }
public void CreateAllDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc, ResourceScope scope) { UpdateLightingInfo(gd, sc); foreach (var r in _resourceContainers) { r.CreateDeviceObjects(gd, cl, sc, scope); } }
public virtual void CreateDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc) { var factory = gd.ResourceFactory; ProjectionMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic)); ViewMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic)); CameraInfoBuffer = factory.CreateBuffer(new BufferDescription((uint)Unsafe.SizeOf <CameraInfo>(), BufferUsage.UniformBuffer | BufferUsage.Dynamic)); WorldAndInverseBuffer = factory.CreateBuffer(new BufferDescription((uint)Marshal.SizeOf <WorldAndInverse>(), BufferUsage.UniformBuffer | BufferUsage.Dynamic)); LightingInfoBuffer = factory.CreateBuffer(new BufferDescription((uint)Unsafe.SizeOf <LightingInfo>(), BufferUsage.UniformBuffer)); //Float arrays are handled by padding each element up to the size of a vec4, //so we have to account for the padding in creating and initializing the buffer var numLightStyleElements = BSPConstants.MaxLightStyles * LightStylesElementMultiplier; LightStylesBuffer = factory.CreateBuffer(new BufferDescription((uint)(numLightStyleElements * Marshal.SizeOf <int>()), BufferUsage.UniformBuffer)); //Initialize the buffer to all zeroes var lightStylesValues = new float[numLightStyleElements]; Array.Fill(lightStylesValues, 0.0f); gd.UpdateBuffer(LightStylesBuffer, 0, lightStylesValues); //TODO: pull filter settings and anisotropy from config var mainSamplerDescription = new SamplerDescription { AddressModeU = SamplerAddressMode.Wrap, AddressModeV = SamplerAddressMode.Wrap, AddressModeW = SamplerAddressMode.Wrap, Filter = SamplerFilter.MinLinear_MagLinear_MipLinear, LodBias = 0, MinimumLod = 0, MaximumLod = uint.MaxValue, MaximumAnisotropy = 4, }; MainSampler = factory.CreateSampler(ref mainSamplerDescription); if (Camera != null) { UpdateCameraBuffers(cl); } TextureSamplerResourceLayout = factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("SourceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment), new ResourceLayoutElementDescription("SourceSampler", ResourceKind.Sampler, ShaderStages.Fragment))); RecreateWindowSizedResources(gd, cl); }
public override void CreateDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc, ResourceScope scope) { if ((scope & ResourceScope.Global) == 0) { return; } if (_imguiRenderer == null) { _imguiRenderer = new ImGuiRenderer(gd, sc.MainSceneFramebuffer.OutputDescription, _width, _height); ImGui.StyleColorsClassic(); } else { _imguiRenderer.CreateDeviceResources(gd, sc.MainSceneFramebuffer.OutputDescription); } }
public void UpdateLightStyles(GraphicsDevice gd, SceneContext sc) { if (sc.LightStylesBuffer != null) { //Update the style buffer now, before anything is drawn for (var i = 0; i < BSPConstants.MaxLightStyles; ++i) { var value = LightStyles.GetStyleValue(i); if (_cachedLightStyles[i] != value) { _cachedLightStyles[i] = value; //Index is multiplied here because of padding. See buffer creation code gd.UpdateBuffer(sc.LightStylesBuffer, (uint)(i * Marshal.SizeOf <float>() * SceneContext.LightStylesElementMultiplier), ref value); } } } }
private void RenderAllSingleThread(GraphicsDevice gd, CommandList cl, SceneContext sc) { CheckLightingInfo(gd, sc); UpdateLightStyles(gd, sc); float depthClear = gd.IsDepthRangeZeroToOne ? 0f : 1f; // Main scene cl.SetFramebuffer(sc.MainSceneFramebuffer); cl.ClearColorTarget(0, RgbaFloat.Grey); var fbWidth = sc.MainSceneFramebuffer.Width; var fbHeight = sc.MainSceneFramebuffer.Height; cl.SetViewport(0, new Viewport(0, 0, fbWidth, fbHeight, 0, 1)); cl.SetFullViewports(); cl.SetFullScissorRects(); cl.ClearDepthStencil(depthClear); sc.UpdateCameraBuffers(cl); var cameraFrustum = new BoundingFrustum(Camera.ViewMatrix * Camera.ProjectionMatrix); Render(gd, cl, sc, RenderPasses.Standard, cameraFrustum, Camera.Position, _renderQueues[0], _renderableStage[0], null, false); Render(gd, cl, sc, RenderPasses.AlphaBlend, cameraFrustum, Camera.Position, _renderQueues[0], _renderableStage[0], null, false); Render(gd, cl, sc, RenderPasses.Overlay, cameraFrustum, Camera.Position, _renderQueues[0], _renderableStage[0], null, false); if (sc.MainSceneColorTexture.SampleCount != TextureSampleCount.Count1) { cl.ResolveTexture(sc.MainSceneColorTexture, sc.MainSceneResolvedColorTexture); } //Render to the swap chain buffer cl.SetFramebuffer(gd.SwapchainFramebuffer); fbWidth = gd.SwapchainFramebuffer.Width; fbHeight = gd.SwapchainFramebuffer.Height; cl.SetFullViewports(); Render(gd, cl, sc, RenderPasses.SwapchainOutput, new BoundingFrustum(), Camera.Position, _renderQueues[0], _renderableStage[0], null, false); cl.End(); gd.SubmitCommands(cl); }
public abstract void CreateDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc, ResourceScope scope);
public void RenderAllStages(GraphicsDevice gd, CommandList cl, SceneContext sc) { RenderAllSingleThread(gd, cl, sc); }