re-add Cube screenshot feature

refresh2
cosmonaut 2024-02-22 22:51:01 -08:00
parent 110151ad56
commit 59c99daa9c
1 changed files with 42 additions and 17 deletions

View File

@ -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)
{ {