Пример #1
0
 public void Set(TableRef <ITexture> texture, TableRef <ISampler> sampler, Extents2DF srcRegion, Extents2DF dstRegion)
 {
     _texture   = texture;
     _sampler   = sampler;
     _srcRegion = srcRegion;
     _dstRegion = dstRegion;
 }
Пример #2
0
        public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion)
        {
            if (texture is TextureView srcTexture)
            {
                SupportBufferUpdater.Commit();

                var oldCullMode          = _newState.CullMode;
                var oldStencilTestEnable = _newState.StencilTestEnable;
                var oldDepthTestEnable   = _newState.DepthTestEnable;
                var oldDepthWriteEnable  = _newState.DepthWriteEnable;
                var oldTopology          = _newState.Topology;
                var oldViewports         = _dynamicState.Viewports;
                var oldViewportsCount    = _newState.ViewportsCount;

                _newState.CullMode          = CullModeFlags.CullModeNone;
                _newState.StencilTestEnable = false;
                _newState.DepthTestEnable   = false;
                _newState.DepthWriteEnable  = false;
                SignalStateChange();

                Gd.HelperShader.DrawTexture(
                    Gd,
                    this,
                    srcTexture,
                    sampler,
                    srcRegion,
                    dstRegion);

                _newState.CullMode          = oldCullMode;
                _newState.StencilTestEnable = oldStencilTestEnable;
                _newState.DepthTestEnable   = oldDepthTestEnable;
                _newState.DepthWriteEnable  = oldDepthWriteEnable;
                _newState.Topology          = oldTopology;

                _dynamicState.Viewports      = oldViewports;
                _dynamicState.ViewportsCount = (int)oldViewportsCount;
                _dynamicState.SetViewportsDirty();

                _newState.ViewportsCount = oldViewportsCount;
                SignalStateChange();
            }
        }
Пример #3
0
 public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion)
 {
     if (texture is TextureView view && sampler is Sampler samp)
     {
         if (HwCapabilities.SupportsDrawTexture)
         {
             GL.NV.DrawTexture(
                 view.Handle,
                 samp.Handle,
                 dstRegion.X1,
                 dstRegion.Y1,
                 dstRegion.X2,
                 dstRegion.Y2,
                 0,
                 srcRegion.X1 / view.Width,
                 srcRegion.Y1 / view.Height,
                 srcRegion.X2 / view.Width,
                 srcRegion.Y2 / view.Height);
         }
         else
         {
Пример #4
0
 public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion)
 {
     _renderer.New <DrawTextureCommand>().Set(Ref(texture), Ref(sampler), srcRegion, dstRegion);
     _renderer.QueueCommand();
 }
Пример #5
0
        public void DrawTexture(
            VulkanRenderer gd,
            PipelineBase pipeline,
            TextureView src,
            ISampler srcSampler,
            Extents2DF srcRegion,
            Extents2DF dstRegion)
        {
            const int RegionBufferSize = 16;

            pipeline.SetTextureAndSampler(ShaderStage.Fragment, 0, src, srcSampler);

            Span <float> region = stackalloc float[RegionBufferSize / sizeof(float)];

            region[0] = srcRegion.X1 / src.Width;
            region[1] = srcRegion.X2 / src.Width;
            region[2] = srcRegion.Y1 / src.Height;
            region[3] = srcRegion.Y2 / src.Height;

            if (dstRegion.X1 > dstRegion.X2)
            {
                (region[0], region[1]) = (region[1], region[0]);
            }

            if (dstRegion.Y1 > dstRegion.Y2)
            {
                (region[2], region[3]) = (region[3], region[2]);
            }

            var bufferHandle = gd.BufferManager.CreateWithHandle(gd, RegionBufferSize, false);

            gd.BufferManager.SetData <float>(bufferHandle, 0, region);

            Span <BufferRange> bufferRanges = stackalloc BufferRange[1];

            bufferRanges[0] = new BufferRange(bufferHandle, 0, RegionBufferSize);

            pipeline.SetUniformBuffers(1, bufferRanges);

            Span <GAL.Viewport> viewports = stackalloc GAL.Viewport[1];

            var rect = new Rectangle <float>(
                MathF.Min(dstRegion.X1, dstRegion.X2),
                MathF.Min(dstRegion.Y1, dstRegion.Y2),
                MathF.Abs(dstRegion.X2 - dstRegion.X1),
                MathF.Abs(dstRegion.Y2 - dstRegion.Y1));

            viewports[0] = new GAL.Viewport(
                rect,
                ViewportSwizzle.PositiveX,
                ViewportSwizzle.PositiveY,
                ViewportSwizzle.PositiveZ,
                ViewportSwizzle.PositiveW,
                0f,
                1f);

            Span <Rectangle <int> > scissors = stackalloc Rectangle <int> [1];

            pipeline.SetProgram(_programColorBlit);
            pipeline.SetViewports(viewports, false);
            pipeline.SetPrimitiveTopology(GAL.PrimitiveTopology.TriangleStrip);
            pipeline.Draw(4, 1, 0, 0);

            gd.BufferManager.Delete(bufferHandle);
        }