示例#1
0
        public void BeginUI()
        {
            if (renderType == RenderType.World)
            {
                // Complete world rendering
                Flush();
                worldBuffer.Unbind();

                // Render the world buffer into the UI buffer
                screenBuffer.Bind();

                var scale      = Window.EffectiveWindowScale;
                var bufferSize = new Size((int)(screenSprite.Bounds.Width / scale), (int)(-screenSprite.Bounds.Height / scale));

                SpriteRenderer.SetAntialiasingPixelsPerTexel(Window.SurfaceSize.Height * 1f / worldSprite.Bounds.Height);
                RgbaSpriteRenderer.DrawSprite(worldSprite, float3.Zero, new float2(bufferSize));
                Flush();
                SpriteRenderer.SetAntialiasingPixelsPerTexel(0);
            }
            else
            {
                // World rendering was skipped
                BeginFrame();
                screenBuffer.Bind();
            }

            renderType = RenderType.UI;
        }
示例#2
0
        public void BeginFrame(int2 scroll, float zoom)
        {
            Context.Clear();

            var surfaceSize       = Window.SurfaceSize;
            var surfaceBufferSize = surfaceSize.NextPowerOf2();

            if (screenSprite == null || screenSprite.Sheet.Size != surfaceBufferSize)
            {
                if (screenBuffer != null)
                {
                    screenBuffer.Dispose();
                }

                // Render the screen into a frame buffer to simplify reading back screenshots
                screenBuffer = Context.CreateFrameBuffer(surfaceBufferSize, Color.FromArgb(0xFF, 0, 0, 0));
            }

            if (screenSprite == null || surfaceSize.Width != screenSprite.Bounds.Width || -surfaceSize.Height != screenSprite.Bounds.Height)
            {
                var screenSheet = new Sheet(SheetType.BGRA, screenBuffer.Texture);

                // Flip sprite in Y to match OpenGL's bottom-left origin
                var screenBounds = Rectangle.FromLTRB(0, surfaceSize.Height, surfaceSize.Width, 0);
                screenSprite = new Sprite(screenSheet, screenBounds, TextureChannel.RGBA);
            }

            screenBuffer.Bind();
            SetViewportParams(scroll, zoom);
        }
示例#3
0
        public void BeginWorld(Rectangle worldViewport)
        {
            if (renderType != RenderType.None)
            {
                throw new InvalidOperationException("BeginWorld called with renderType = {0}, expected RenderType.None.".F(renderType));
            }

            BeginFrame();

            var worldBufferSize = worldViewport.Size.NextPowerOf2();

            if (worldSprite == null || worldSprite.Sheet.Size != worldBufferSize)
            {
                if (worldBuffer != null)
                {
                    worldBuffer.Dispose();
                }

                // Render the world into a framebuffer at 1:1 scaling to allow the depth buffer to match the artwork at all zoom levels
                worldBuffer = Context.CreateFrameBuffer(worldBufferSize);

                // Pixel art scaling mode is a customized bilinear sampling
                worldBuffer.Texture.ScaleFilter = TextureScaleFilter.Linear;
            }

            if (worldSprite == null || worldViewport.Size != worldSprite.Bounds.Size)
            {
                var worldSheet = new Sheet(SheetType.BGRA, worldBuffer.Texture);
                worldSprite = new Sprite(worldSheet, new Rectangle(int2.Zero, worldViewport.Size), TextureChannel.RGBA);
            }

            worldBuffer.Bind();

            if (worldBufferSize != lastWorldBufferSize || lastWorldViewport != worldViewport)
            {
                var depthScale = worldBufferSize.Height / (worldBufferSize.Height + depthMargin);
                WorldSpriteRenderer.SetViewportParams(worldBufferSize, depthScale, depthScale / 2, worldViewport.Location);
                WorldModelRenderer.SetViewportParams(worldBufferSize, worldViewport.Location);

                lastWorldViewport   = worldViewport;
                lastWorldBufferSize = worldBufferSize;
            }

            renderType = RenderType.World;
        }
示例#4
0
        public void BeginWorld(Rectangle worldViewport)
        {
            if (renderType != RenderType.None)
            {
                throw new InvalidOperationException($"BeginWorld called with renderType = {renderType}, expected RenderType.None.");
            }

            BeginFrame();

            if (worldSheet == null)
            {
                throw new InvalidOperationException($"BeginWorld called before SetMaximumViewportSize has been set.");
            }

            if (worldSprite == null || worldViewport.Size != lastWorldViewportSize)
            {
                // Downscale world rendering if needed to fit within the framebuffer
                var vw = worldViewport.Size.Width;
                var vh = worldViewport.Size.Height;
                var bw = worldSheet.Size.Width;
                var bh = worldSheet.Size.Height;
                worldDownscaleFactor = 1;
                while (vw / worldDownscaleFactor > bw || vh / worldDownscaleFactor > bh)
                {
                    worldDownscaleFactor++;
                }

                var s = new Size(vw / worldDownscaleFactor, vh / worldDownscaleFactor);
                worldSprite           = new Sprite(worldSheet, new Rectangle(int2.Zero, s), TextureChannel.RGBA);
                lastWorldViewportSize = worldViewport.Size;
            }

            worldBuffer.Bind();

            if (lastWorldViewport != worldViewport)
            {
                WorldSpriteRenderer.SetViewportParams(worldSheet.Size, worldDownscaleFactor, depthMargin, worldViewport.Location);
                WorldModelRenderer.SetViewportParams(worldSheet.Size, worldViewport.Location);

                lastWorldViewport = worldViewport;
            }

            renderType = RenderType.World;
        }