public void Set(TableRef <ITexture> texture, TableRef <ISampler> sampler, Extents2DF srcRegion, Extents2DF dstRegion) { _texture = texture; _sampler = sampler; _srcRegion = srcRegion; _dstRegion = dstRegion; }
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(); } }
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 {
public void DrawTexture(ITexture texture, ISampler sampler, Extents2DF srcRegion, Extents2DF dstRegion) { _renderer.New <DrawTextureCommand>().Set(Ref(texture), Ref(sampler), srcRegion, dstRegion); _renderer.QueueCommand(); }
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); }