re-add Cube screenshot feature
parent
110151ad56
commit
59c99daa9c
|
@ -2,6 +2,7 @@
|
||||||
using MoonWorks.Math;
|
using MoonWorks.Math;
|
||||||
using MoonWorks.Math.Float;
|
using MoonWorks.Math.Float;
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace MoonWorks.Test
|
namespace MoonWorks.Test
|
||||||
|
@ -25,6 +26,8 @@ namespace MoonWorks.Test
|
||||||
|
|
||||||
private CpuBuffer transferBuffer;
|
private CpuBuffer transferBuffer;
|
||||||
private CpuBuffer cubemapTransferBuffer;
|
private CpuBuffer cubemapTransferBuffer;
|
||||||
|
private CpuBuffer screenshotTransferBuffer;
|
||||||
|
private Texture screenshotTexture;
|
||||||
|
|
||||||
private Texture skyboxTexture;
|
private Texture skyboxTexture;
|
||||||
private Sampler skyboxSampler;
|
private Sampler skyboxSampler;
|
||||||
|
@ -36,8 +39,8 @@ namespace MoonWorks.Test
|
||||||
private bool depthOnlyEnabled = false;
|
private bool depthOnlyEnabled = false;
|
||||||
private Vector3 camPos = new Vector3(0, 1.5f, 4f);
|
private Vector3 camPos = new Vector3(0, 1.5f, 4f);
|
||||||
|
|
||||||
private TaskFactory taskFactory = new TaskFactory();
|
|
||||||
private bool takeScreenshot;
|
private bool takeScreenshot;
|
||||||
|
private bool swapchainCopied; // don't want to take screenshot if the swapchain was invalid
|
||||||
|
|
||||||
struct DepthUniforms
|
struct DepthUniforms
|
||||||
{
|
{
|
||||||
|
@ -72,9 +75,7 @@ namespace MoonWorks.Test
|
||||||
Depth = 1
|
Depth = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
var pixelData = ImageUtils.GetPixelDataFromFile(imagePaths[i], out var _, out var _, out var sizeInBytes);
|
ImageUtils.DecodeIntoCpuBuffer(imagePaths[i], cubemapTransferBuffer, 0, SetDataOptions.Overwrite);
|
||||||
cubemapTransferBuffer.SetData(new Span<byte>((void*) pixelData, (int) sizeInBytes), SetDataOptions.Overwrite);
|
|
||||||
ImageUtils.FreePixelData(pixelData);
|
|
||||||
|
|
||||||
commandBuffer.BeginCopyPass();
|
commandBuffer.BeginCopyPass();
|
||||||
commandBuffer.UploadToTexture(cubemapTransferBuffer, textureSlice, new BufferImageCopy(0, 0, 0));
|
commandBuffer.UploadToTexture(cubemapTransferBuffer, textureSlice, new BufferImageCopy(0, 0, 0));
|
||||||
|
@ -157,6 +158,8 @@ namespace MoonWorks.Test
|
||||||
|
|
||||||
transferBuffer = new CpuBuffer(GraphicsDevice, 32768);
|
transferBuffer = new CpuBuffer(GraphicsDevice, 32768);
|
||||||
cubemapTransferBuffer = new CpuBuffer(GraphicsDevice, 2048 * 2048 * 4);
|
cubemapTransferBuffer = new CpuBuffer(GraphicsDevice, 2048 * 2048 * 4);
|
||||||
|
screenshotTransferBuffer = new CpuBuffer(GraphicsDevice, MainWindow.Width * MainWindow.Height * 4);
|
||||||
|
screenshotTexture = Texture.CreateTexture2D(GraphicsDevice, MainWindow.Width, MainWindow.Height, MainWindow.SwapchainFormat, 0);
|
||||||
|
|
||||||
Task loadingTask = Task.Run(() => UploadGPUAssets());
|
Task loadingTask = Task.Run(() => UploadGPUAssets());
|
||||||
|
|
||||||
|
@ -497,31 +500,53 @@ namespace MoonWorks.Test
|
||||||
|
|
||||||
cmdbuf.EndRenderPass();
|
cmdbuf.EndRenderPass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (takeScreenshot)
|
||||||
|
{
|
||||||
|
cmdbuf.BeginCopyPass();
|
||||||
|
cmdbuf.CopyTextureToTexture(swapchainTexture, screenshotTexture);
|
||||||
|
cmdbuf.EndCopyPass();
|
||||||
|
|
||||||
|
swapchainCopied = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GraphicsDevice.Submit(cmdbuf);
|
GraphicsDevice.Submit(cmdbuf);
|
||||||
|
|
||||||
if (takeScreenshot)
|
if (takeScreenshot && swapchainCopied)
|
||||||
{
|
{
|
||||||
if (swapchainTexture != null)
|
Task.Run(TakeScreenshot);
|
||||||
{
|
|
||||||
taskFactory.StartNew(TakeScreenshot, swapchainTexture);
|
|
||||||
}
|
|
||||||
|
|
||||||
takeScreenshot = false;
|
takeScreenshot = false;
|
||||||
|
swapchainCopied = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private System.Action<object?> TakeScreenshot = texture =>
|
private unsafe void TakeScreenshot()
|
||||||
{
|
{
|
||||||
/*
|
var commandBuffer = GraphicsDevice.AcquireCommandBuffer();
|
||||||
if (texture != null)
|
|
||||||
{
|
commandBuffer.BeginCopyPass();
|
||||||
((Texture) texture).SavePNG(System.IO.Path.Combine(System.AppContext.BaseDirectory, "screenshot.png"));
|
commandBuffer.DownloadFromTexture(
|
||||||
}
|
screenshotTexture,
|
||||||
*/
|
screenshotTransferBuffer
|
||||||
};
|
);
|
||||||
|
commandBuffer.EndCopyPass();
|
||||||
|
|
||||||
|
var fence = GraphicsDevice.SubmitAndAcquireFence(commandBuffer);
|
||||||
|
GraphicsDevice.WaitForFences(fence);
|
||||||
|
GraphicsDevice.ReleaseFence(fence);
|
||||||
|
|
||||||
|
ImageUtils.SavePNG(
|
||||||
|
Path.Combine(System.AppContext.BaseDirectory, "screenshot.png"),
|
||||||
|
screenshotTransferBuffer,
|
||||||
|
0,
|
||||||
|
(int) screenshotTexture.Width,
|
||||||
|
(int) screenshotTexture.Height,
|
||||||
|
screenshotTexture.Format == TextureFormat.B8G8R8A8
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue