set up test
parent
f728288558
commit
b6f8bd8c97
|
@ -1,2 +1,3 @@
|
|||
bin/
|
||||
obj/
|
||||
.vs/
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "lib/MoonWorks"]
|
||||
path = lib/MoonWorks
|
||||
url = https://gitea.moonside.games/MoonsideGames/MoonWorks.git
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 254 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include=".\moonlibs\windows\**\*.*" Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true' AND '$(Platform)' != 'x86'">
|
||||
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include=".\moonlibs\osx\**\*.*" Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::OSX)))' == 'true'" >
|
||||
<Link>osx\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include=".\moonlibs\lib64\**\*.*" Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'" >
|
||||
<Link>lib64\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -17,4 +17,10 @@
|
|||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include=".\lib\MoonWorks\MoonWorks.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project=".\CopyMoonlibs.targets"/>
|
||||
</Project>
|
||||
|
|
|
@ -1,34 +1,49 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26124.0
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30717.126
|
||||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonWorksTest", "MoonWorksTest.csproj", "{D03DE2E4-7731-4E13-B3DC-DB94F4156681}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorksTest", "MoonWorksTest.csproj", "{D03DE2E4-7731-4E13-B3DC-DB94F4156681}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks", "lib\MoonWorks\MoonWorks.csproj", "{38EE757C-50C0-4ABF-851D-45586C1077A1}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FAudio-CS.Core", "lib\MoonWorks\lib\FAudio\csharp\FAudio-CS.Core.csproj", "{3C123688-D3E5-48D7-8003-DDA4E93BFE6E}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RefreshCS", "lib\MoonWorks\lib\RefreshCS\RefreshCS.csproj", "{1EF0BDFD-5583-41DE-9BF4-9E7112651D12}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SDL2-CS.Core", "lib\MoonWorks\lib\SDL2-CS\SDL2-CS.Core.csproj", "{C0759474-25B1-4F51-AE5E-1E1F424BAC89}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x64.Build.0 = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x64.ActiveCfg = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x64.Build.0 = Release|x64
|
||||
{38EE757C-50C0-4ABF-851D-45586C1077A1}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{38EE757C-50C0-4ABF-851D-45586C1077A1}.Debug|x64.Build.0 = Debug|x64
|
||||
{38EE757C-50C0-4ABF-851D-45586C1077A1}.Release|x64.ActiveCfg = Release|x64
|
||||
{38EE757C-50C0-4ABF-851D-45586C1077A1}.Release|x64.Build.0 = Release|x64
|
||||
{3C123688-D3E5-48D7-8003-DDA4E93BFE6E}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{3C123688-D3E5-48D7-8003-DDA4E93BFE6E}.Debug|x64.Build.0 = Debug|x64
|
||||
{3C123688-D3E5-48D7-8003-DDA4E93BFE6E}.Release|x64.ActiveCfg = Release|x64
|
||||
{3C123688-D3E5-48D7-8003-DDA4E93BFE6E}.Release|x64.Build.0 = Release|x64
|
||||
{1EF0BDFD-5583-41DE-9BF4-9E7112651D12}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{1EF0BDFD-5583-41DE-9BF4-9E7112651D12}.Debug|x64.Build.0 = Debug|x64
|
||||
{1EF0BDFD-5583-41DE-9BF4-9E7112651D12}.Release|x64.ActiveCfg = Release|x64
|
||||
{1EF0BDFD-5583-41DE-9BF4-9E7112651D12}.Release|x64.Build.0 = Release|x64
|
||||
{C0759474-25B1-4F51-AE5E-1E1F424BAC89}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{C0759474-25B1-4F51-AE5E-1E1F424BAC89}.Debug|x64.Build.0 = Debug|x64
|
||||
{C0759474-25B1-4F51-AE5E-1E1F424BAC89}.Release|x64.ActiveCfg = Release|x64
|
||||
{C0759474-25B1-4F51-AE5E-1E1F424BAC89}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|Any CPU.ActiveCfg = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|Any CPU.Build.0 = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x64.Build.0 = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x86.ActiveCfg = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Debug|x86.Build.0 = Debug|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|Any CPU.ActiveCfg = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|Any CPU.Build.0 = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x64.ActiveCfg = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x64.Build.0 = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x86.ActiveCfg = Release|x64
|
||||
{D03DE2E4-7731-4E13-B3DC-DB94F4156681}.Release|x86.Build.0 = Release|x64
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {7DA782A1-7B3E-42D2-B4EF-EDB951E06A13}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 408e438efcf8a19992c3b0ecd74bfd11b65441e6
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,20 @@
|
|||
using MoonWorks;
|
||||
|
||||
namespace MoonWorksTest
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
WindowCreateInfo windowCreateInfo = new WindowCreateInfo
|
||||
{
|
||||
WindowWidth = 1280,
|
||||
WindowHeight = 720,
|
||||
ScreenMode = ScreenMode.Windowed
|
||||
};
|
||||
|
||||
TestGame game = new TestGame(windowCreateInfo, PresentMode.FIFO, 60, true);
|
||||
game.Run();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace MoonWorksTest
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
struct RaymarchUniforms
|
||||
{
|
||||
public float time, padding;
|
||||
public float resolutionX, resolutionY;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,303 @@
|
|||
using MoonWorks;
|
||||
using MoonWorks.Graphics;
|
||||
using RefreshCS;
|
||||
using System.Threading;
|
||||
|
||||
namespace MoonWorksTest
|
||||
{
|
||||
public class TestGame : Game
|
||||
{
|
||||
ShaderModule passthroughVertexShaderModule;
|
||||
ShaderModule raymarchFragmentShaderModule;
|
||||
RaymarchUniforms raymarchUniforms;
|
||||
|
||||
Texture woodTexture;
|
||||
Texture noiseTexture;
|
||||
Sampler sampler;
|
||||
|
||||
Buffer vertexBuffer;
|
||||
|
||||
RefreshCS.Refresh.Rect renderArea;
|
||||
RefreshCS.Refresh.Rect flip;
|
||||
RefreshCS.Refresh.Color clearColor;
|
||||
|
||||
Texture mainColorTargetTexture;
|
||||
TextureSlice mainColorTargetTextureSlice;
|
||||
ColorTarget mainColorTarget;
|
||||
|
||||
RenderPass mainRenderPass;
|
||||
Framebuffer mainFramebuffer;
|
||||
GraphicsPipeline mainGraphicsPipeline;
|
||||
|
||||
byte[] screenshotPixels;
|
||||
Buffer screenshotBuffer;
|
||||
uint screenShotBufferSize;
|
||||
Thread screenshotThread;
|
||||
|
||||
public TestGame(WindowCreateInfo windowCreateInfo, PresentMode presentMode, int targetTimestep = 60, bool debugMode = false) : base(windowCreateInfo, presentMode, targetTimestep, debugMode)
|
||||
{
|
||||
var windowWidth = windowCreateInfo.WindowWidth;
|
||||
var windowHeight = windowCreateInfo.WindowHeight;
|
||||
|
||||
passthroughVertexShaderModule = new ShaderModule(GraphicsDevice, new System.IO.FileInfo("Content/passthrough_vert.spv"));
|
||||
raymarchFragmentShaderModule = new ShaderModule(GraphicsDevice, new System.IO.FileInfo("Content/hexagon_grid.spv"));
|
||||
|
||||
raymarchUniforms.time = 0;
|
||||
raymarchUniforms.padding = 0;
|
||||
raymarchUniforms.resolutionX = windowWidth;
|
||||
raymarchUniforms.resolutionY = windowHeight;
|
||||
|
||||
woodTexture = Texture.LoadPNG(GraphicsDevice, new System.IO.FileInfo("Content/woodgrain.png"));
|
||||
noiseTexture = Texture.LoadPNG(GraphicsDevice, new System.IO.FileInfo("Content/noise.png"));
|
||||
|
||||
SamplerState samplerState = SamplerState.LinearWrap;
|
||||
sampler = new Sampler(GraphicsDevice, ref samplerState);
|
||||
|
||||
/* Load Vertex Data */
|
||||
|
||||
var vertices = new Vertex[3];
|
||||
vertices[0].x = -1;
|
||||
vertices[0].y = -1;
|
||||
vertices[0].z = 0;
|
||||
vertices[0].u = 0;
|
||||
vertices[0].v = 1;
|
||||
|
||||
vertices[1].x = 3;
|
||||
vertices[1].y = -1;
|
||||
vertices[1].z = 0;
|
||||
vertices[1].u = 1;
|
||||
vertices[1].v = 1;
|
||||
|
||||
vertices[2].x = -1;
|
||||
vertices[2].y = 3;
|
||||
vertices[2].z = 0;
|
||||
vertices[2].u = 0;
|
||||
vertices[2].v = 0;
|
||||
|
||||
vertexBuffer = new Buffer(GraphicsDevice, Refresh.BufferUsageFlags.Vertex, 4 * 5 * 3);
|
||||
vertexBuffer.SetData(0, vertices, 4 * 5 * 3);
|
||||
|
||||
/* Render Pass */
|
||||
|
||||
renderArea.x = 0;
|
||||
renderArea.y = 0;
|
||||
renderArea.w = (int) windowWidth;
|
||||
renderArea.h = (int) windowHeight;
|
||||
|
||||
flip.x = 0;
|
||||
flip.y = (int) windowHeight;
|
||||
flip.w = (int) windowWidth;
|
||||
flip.h = -(int) windowHeight;
|
||||
|
||||
clearColor.r = 237;
|
||||
clearColor.g = 41;
|
||||
clearColor.b = 57;
|
||||
clearColor.a = byte.MaxValue;
|
||||
|
||||
Refresh.ColorTargetDescription colorTargetDescription = new Refresh.ColorTargetDescription
|
||||
{
|
||||
format = Refresh.ColorFormat.R8G8B8A8,
|
||||
multisampleCount = Refresh.SampleCount.One,
|
||||
loadOp = Refresh.LoadOp.Clear,
|
||||
storeOp = Refresh.StoreOp.Store
|
||||
};
|
||||
|
||||
mainRenderPass = new RenderPass(GraphicsDevice, colorTargetDescription);
|
||||
|
||||
mainColorTargetTexture = Texture.CreateTexture2D(
|
||||
GraphicsDevice,
|
||||
windowWidth,
|
||||
windowHeight,
|
||||
Refresh.ColorFormat.R8G8B8A8,
|
||||
Refresh.TextureUsageFlags.ColorTargetBit
|
||||
);
|
||||
|
||||
mainColorTargetTextureSlice = new TextureSlice(mainColorTargetTexture);
|
||||
|
||||
mainColorTarget = new ColorTarget(GraphicsDevice, Refresh.SampleCount.One, ref mainColorTargetTextureSlice);
|
||||
|
||||
mainFramebuffer = new Framebuffer(
|
||||
GraphicsDevice,
|
||||
windowWidth,
|
||||
windowHeight,
|
||||
mainRenderPass,
|
||||
null,
|
||||
mainColorTarget
|
||||
);
|
||||
|
||||
/* Pipeline */
|
||||
|
||||
ColorTargetBlendState[] colorTargetBlendStates = new ColorTargetBlendState[1]
|
||||
{
|
||||
ColorTargetBlendState.None
|
||||
};
|
||||
|
||||
ColorBlendState colorBlendState = new ColorBlendState
|
||||
{
|
||||
LogicOpEnable = false,
|
||||
LogicOp = Refresh.LogicOp.NoOp,
|
||||
BlendConstants = new BlendConstants(),
|
||||
ColorTargetBlendStates = colorTargetBlendStates
|
||||
};
|
||||
|
||||
DepthStencilState depthStencilState = DepthStencilState.Disable;
|
||||
|
||||
ShaderStageState vertexShaderState = new ShaderStageState
|
||||
{
|
||||
ShaderModule = passthroughVertexShaderModule,
|
||||
EntryPointName = "main",
|
||||
UniformBufferSize = 0
|
||||
};
|
||||
|
||||
ShaderStageState fragmentShaderState = new ShaderStageState
|
||||
{
|
||||
ShaderModule = raymarchFragmentShaderModule,
|
||||
EntryPointName = "main",
|
||||
UniformBufferSize = 4
|
||||
};
|
||||
|
||||
MultisampleState multisampleState = MultisampleState.None;
|
||||
|
||||
GraphicsPipelineLayoutCreateInfo pipelineLayoutCreateInfo = new GraphicsPipelineLayoutCreateInfo
|
||||
{
|
||||
VertexSamplerBindingCount = 0,
|
||||
FragmentSamplerBindingCount = 2
|
||||
};
|
||||
|
||||
RasterizerState rasterizerState = RasterizerState.CullCounterClockwise;
|
||||
|
||||
var vertexBindings = new Refresh.VertexBinding[1]
|
||||
{
|
||||
new Refresh.VertexBinding
|
||||
{
|
||||
binding = 0,
|
||||
inputRate = Refresh.VertexInputRate.Vertex,
|
||||
stride = 4 * 5
|
||||
}
|
||||
};
|
||||
|
||||
var vertexAttributes = new Refresh.VertexAttribute[2]
|
||||
{
|
||||
new Refresh.VertexAttribute
|
||||
{
|
||||
binding = 0,
|
||||
location = 0,
|
||||
format = Refresh.VertexElementFormat.Vector3,
|
||||
offset = 0
|
||||
},
|
||||
new Refresh.VertexAttribute
|
||||
{
|
||||
binding = 0,
|
||||
location = 1,
|
||||
format = Refresh.VertexElementFormat.Vector2,
|
||||
offset = 4 * 3
|
||||
}
|
||||
};
|
||||
|
||||
VertexInputState vertexInputState = new VertexInputState
|
||||
{
|
||||
VertexBindings = vertexBindings,
|
||||
VertexAttributes = vertexAttributes
|
||||
};
|
||||
|
||||
var viewports = new Refresh.Viewport[1]
|
||||
{
|
||||
new Refresh.Viewport
|
||||
{
|
||||
x = 0,
|
||||
y = 0,
|
||||
w = windowWidth,
|
||||
h = windowHeight,
|
||||
minDepth = 0,
|
||||
maxDepth = 1
|
||||
}
|
||||
};
|
||||
|
||||
var scissors = new Refresh.Rect[1]
|
||||
{
|
||||
new Refresh.Rect
|
||||
{
|
||||
x = 0,
|
||||
y = 0,
|
||||
w = (int) windowWidth,
|
||||
h = (int) windowHeight
|
||||
}
|
||||
};
|
||||
|
||||
ViewportState viewportState = new ViewportState
|
||||
{
|
||||
Viewports = viewports,
|
||||
Scissors = scissors
|
||||
};
|
||||
|
||||
mainGraphicsPipeline = new GraphicsPipeline(
|
||||
GraphicsDevice,
|
||||
colorBlendState,
|
||||
depthStencilState,
|
||||
vertexShaderState,
|
||||
fragmentShaderState,
|
||||
multisampleState,
|
||||
pipelineLayoutCreateInfo,
|
||||
rasterizerState,
|
||||
Refresh.PrimitiveType.TriangleList,
|
||||
vertexInputState,
|
||||
viewportState,
|
||||
mainRenderPass
|
||||
);
|
||||
|
||||
screenShotBufferSize = windowWidth * windowHeight * 4;
|
||||
screenshotPixels = new byte[screenShotBufferSize];
|
||||
screenshotBuffer = new Buffer(GraphicsDevice, 0, screenShotBufferSize);
|
||||
screenshotThread = new Thread(new ThreadStart(SaveScreenshot));
|
||||
}
|
||||
|
||||
protected override void Update(double dt)
|
||||
{
|
||||
raymarchUniforms.time += (float) dt;
|
||||
}
|
||||
|
||||
protected override void Draw()
|
||||
{
|
||||
var screenshotPressed = Input.Keyboard.IsPressed(Keycode.S);
|
||||
|
||||
var commandBuffer = GraphicsDevice.AcquireCommandBuffer();
|
||||
|
||||
commandBuffer.BeginRenderPass(
|
||||
mainRenderPass,
|
||||
mainFramebuffer,
|
||||
ref renderArea,
|
||||
clearColor
|
||||
);
|
||||
|
||||
commandBuffer.BindGraphicsPipeline(mainGraphicsPipeline);
|
||||
var fragmentParamOffset = commandBuffer.PushFragmentShaderParams(raymarchUniforms);
|
||||
commandBuffer.BindVertexBuffers(0, new BufferBinding(vertexBuffer, 0));
|
||||
commandBuffer.BindFragmentSamplers(
|
||||
new TextureSamplerBinding(woodTexture, sampler),
|
||||
new TextureSamplerBinding(noiseTexture, sampler)
|
||||
);
|
||||
commandBuffer.DrawPrimitives(0, 1, 0, fragmentParamOffset);
|
||||
commandBuffer.EndRenderPass();
|
||||
|
||||
if (screenshotPressed)
|
||||
{
|
||||
commandBuffer.CopyTextureToBuffer(ref mainColorTargetTextureSlice, screenshotBuffer);
|
||||
}
|
||||
|
||||
commandBuffer.QueuePresent(ref mainColorTargetTextureSlice, ref flip, Refresh.Filter.Nearest);
|
||||
GraphicsDevice.Submit(commandBuffer);
|
||||
|
||||
if (screenshotPressed)
|
||||
{
|
||||
screenshotThread.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void SaveScreenshot()
|
||||
{
|
||||
GraphicsDevice.Wait();
|
||||
screenshotBuffer.GetData(screenshotPixels, screenShotBufferSize);
|
||||
Texture.SavePNG("screenshot.png", 1280, 720, screenshotPixels);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace MoonWorksTest
|
||||
{
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
struct Vertex
|
||||
{
|
||||
public float x, y, z;
|
||||
public float u, v;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue