Exemple #1
0
 private void CheckLightingInfo(GraphicsDevice gd, SceneContext sc)
 {
     if (_lightingSettingChanged)
     {
         UpdateLightingInfo(gd, sc);
     }
 }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        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);
        }
Exemple #6
0
        public void CreateNewDeviceObjects(GraphicsDevice gd, CommandList cl, SceneContext sc, ResourceScope scope)
        {
            foreach (var r in _newResourceContainers)
            {
                r.CreateDeviceObjects(gd, cl, sc, scope);
            }

            _newResourceContainers.Clear();
        }
Exemple #7
0
        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);
            }
        }
Exemple #8
0
        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);
            }
        }
Exemple #10
0
        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);
                    }
                }
            }
        }
Exemple #11
0
        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);
Exemple #13
0
 public void RenderAllStages(GraphicsDevice gd, CommandList cl, SceneContext sc)
 {
     RenderAllSingleThread(gd, cl, sc);
 }