<PropertyGroup>
<RootDirectory>$(MSBuildThisFileDirectory)</RootDirectory>
<RestoreAdditionalProjectSources Condition="Exists('$(SolutionDir)build\$(Configuration)\')">$(SolutionDir)build\$(Configuration)\</RestoreAdditionalProjectSources>
+
<SpirVTasksReleaseVersion>0.1.44</SpirVTasksReleaseVersion>
<SpirVTasksPackageVersion>$(SpirVTasksReleaseVersion)-beta</SpirVTasksPackageVersion>
- <VkeReleaseVersion>0.1.20</VkeReleaseVersion>
+ <VkeReleaseVersion>0.1.21</VkeReleaseVersion>
<VkePackageVersion>$(VkeReleaseVersion)-beta</VkePackageVersion>
- <UseStbSharp>true</UseStbSharp>
- <UseMemoryPools>false</UseMemoryPools>
+
<LangVersion>7.2</LangVersion>
+
+ <UseStbSharp>false</UseStbSharp>
+ <UseMemoryPools>false</UseMemoryPools>
+
</PropertyGroup>
<PropertyGroup Condition=" '$(UseMemoryPools)' == 'true'">
- <DefineConstants>$(DefineConstants);_MEMORY_POOLS</DefineConstants>
+ <DefineConstants>$(DefineConstants);MEMORY_POOLS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(UseStbSharp)' == 'true'">
<DefineConstants>$(DefineConstants);STB_SHARP</DefineConstants>
<AssemblyVersion>$(VkeReleaseVersion)</AssemblyVersion>
<Description>vke.net addon to creaet a vulkan window with crow gui support.</Description>
<PackageTags>vulkan gui ui c# vke.net</PackageTags>
- <PackageVersion>$(AssemblyVersion)</PackageVersion>
+ <PackageVersion>$(VkePackageVersion)</PackageVersion>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/jpbruyere/vke.net/blob/master/README.md</PackageProjectUrl>
</PropertyGroup>
<ItemGroup>
- <PackageReference Include="Crow" Version="0.9.0-beta" />
+ <PackageReference Include="Crow" Version="0.9.1-beta" />
</ItemGroup>
<ItemGroup>
<Compile Remove="main.cs" />
public bool MouseIsInInterface =>
iFace.HoverWidget != null;
-
+ /// <summary>Duration in millisecond of the interval between interface update.</summary>
+ protected int CrowUpdateInterval = 5;
protected FSQPipeline fsqPl;
DescriptorPool dsPool;
protected DescriptorSet descSet;
PrimaryCommandBuffer cmdUpdateCrow;
Image crowImage;
HostBuffer crowBuffer;
- Interface iFace;
+ protected Interface iFace;
protected RenderPass renderPass;
volatile bool running;
-
VkDescriptorSetLayoutBinding dslBinding = new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler);
+ public CrowWindow (string name = "VkCrowWindow", uint _width = 800, uint _height = 600, bool vSync = true)
+ : base (name, _width, _height, vSync) { }
+
protected override void initVulkan () {
base.initVulkan ();
running = true;
while (running) {
iFace.Update ();
- Thread.Sleep (10);
+ Thread.Sleep (CrowUpdateInterval);
}
}
void initCrowSurface () {
<AssemblyVersion>$(VkeReleaseVersion)</AssemblyVersion>
<Description>vke.net glTF addons</Description>
<PackageTags>vulkan C# gltf</PackageTags>
- <PackageVersion>$(AssemblyVersion)</PackageVersion>
+ <PackageVersion>$(VkePackageVersion)</PackageVersion>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
<PackageProjectUrl>https://github.com/jpbruyere/vke.net/blob/master/README.md</PackageProjectUrl>
<SpirVAdditionalIncludeDirectories>$(MSBuildThisFileDirectory)common\shaders</SpirVAdditionalIncludeDirectories>
<RestoreAdditionalProjectSources Condition="Exists('$(SolutionDir)build\$(Configuration)\')">$(SolutionDir)build\$(Configuration)\</RestoreAdditionalProjectSources>
- </PropertyGroup>
-
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
- <DefineConstants>TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;_WITH_SHADOWS;_WITH_VKVG</DefineConstants>
- </PropertyGroup>
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
- <DefineConstants>NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;_WITH_VKVG</DefineConstants>
- </PropertyGroup>
+ <DefineConstants>_WITH_SHADOWS;_WITH_VKVG</DefineConstants>
+ </PropertyGroup>
+
<ItemGroup Condition=" '$(Configuration)|$(Platform)' != 'BuildPackages|AnyCPU' ">
<ProjectReference Include="..\..\vke\vke.csproj" />
+ <PackageReference Include="SpirVTasks" Version="$(SpirVTasksPackageVersion)" />
</ItemGroup>
- <ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'BuildPackages|AnyCPU' ">
+ <!--<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'BuildPackages|AnyCPU' ">
<PackageReference Include="vke" Version="$(VkePackageVersion)" />
- </ItemGroup>
+ </ItemGroup>-->
+
<ItemGroup>
- <PackageReference Include="SpirVTasks" Version="$(SpirVTasksPackageVersion)" />
- </ItemGroup>
+ <Compile Include="$(MSBuildThisFileDirectory)common\Utils.cs"/>
+ </ItemGroup>
+
<ItemGroup>
<GLSLShader Include="shaders\**\*.frag;shaders\**\*.vert;shaders\**\*.comp;shaders\**\*.geom">
<EmbeddedResource Include="ui\**\*.*">
<LogicalName>ui.%(Filename)%(Extension)</LogicalName>
</EmbeddedResource>
- </ItemGroup>
+ </ItemGroup>
+
</Project>
buildModelPipeline ();
- helmet = new SimpleModel (presentQueue, Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf");
+ helmet = new SimpleModel (presentQueue, vke.samples.Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf");
dsMatrices = descriptorPool.Allocate (descLayoutMatrix);
dsTextures = descriptorPool.Allocate (descLayoutTextures);
using Glfw;
using Vulkan;
using vke.Environment;
+using Image = vke.Image;
namespace deferred {
class Deferred : VkWindow {
transferQ = new Queue (dev, VkQueueFlags.Transfer);
computeQ = new Queue (dev, VkQueueFlags.Compute);
}
- string[] cubemapPathes = {
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- };
- string[] modelPathes = {
- "/mnt/devel/vkPinball/data/models/pinball.gltf",
- Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- Utils.DataDirectory + "models/shadow.glb",
- Utils.DataDirectory + "models/Hubble.glb",
- Utils.DataDirectory + "models/MER_static.glb",
- Utils.DataDirectory + "models/ISS_stationary.glb",
- };
public enum DebugView {
none,
Deferred () : base("deferred") {
+
+
+ }
+ protected override void initVulkan () {
+ base.initVulkan ();
dbgmsg = new vke.DebugUtils.Messenger (instance, VkDebugUtilsMessageTypeFlagsEXT.PerformanceEXT | VkDebugUtilsMessageTypeFlagsEXT.ValidationEXT | VkDebugUtilsMessageTypeFlagsEXT.GeneralEXT,
VkDebugUtilsMessageSeverityFlagsEXT.InfoEXT |
VkDebugUtilsMessageSeverityFlagsEXT.WarningEXT | VkDebugUtilsMessageSeverityFlagsEXT.ErrorEXT | VkDebugUtilsMessageSeverityFlagsEXT.VerboseEXT);
init ();
- LoadModel (transferQ, modelPathes [curModelIndex]);
-
- //dev.WaitIdle ();
+ LoadModel (transferQ, vke.samples.Utils.GltfFiles[curModelIndex]);
}
-
void LoadModel (Queue transferQ, string path)
{
dev.WaitIdle ();
new SpecializationConstant<float> (1, camera.FarPlane),
new SpecializationConstant<float> (2, MAX_MATERIAL_COUNT))) {
- cfg.AddShader (VkShaderStageFlags.Vertex, "#RayTests.GBuffPbr.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#RayTests.GBuffPbrTexArray.frag.spv", constants);
+ cfg.AddShader (dev, VkShaderStageFlags.Vertex, "#RayTests.GBuffPbr.vert.spv");
+ cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#RayTests.GBuffPbrTexArray.frag.spv", constants);
plGBuff = new GraphicPipeline (cfg);
}
using (SpecializationInfo constants = new SpecializationInfo (
new SpecializationConstant<uint> (0, (uint)lights.Length))) {
- cfg.AddShader (VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#RayTests.compose.frag.spv", constants);
+ cfg.AddShader (dev, VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
+ cfg.AddShader (dev, VkShaderStageFlags.Fragment, "#RayTests.compose.frag.spv", constants);
plLighting = new GraphicPipeline (cfg);
}
}
dsMain.Handle.SetDebugMarkerName (dev, "dsLighting");
EnvironmentCube.STR_FRAG_PATH = "#RayTests.skybox.frag.spv";
- envCube = new EnvironmentCube (cubemapPathes[2], plLighting.Layout, presentQueue, plLighting.RenderPass);
+ envCube = new EnvironmentCube (vke.samples.Utils.CubeMaps[2], plLighting.Layout, presentQueue, plLighting.RenderPass);
matrices.prefilteredCubeMipLevels = envCube.prefilterCube.CreateInfo.mipLevels;
for (int i = 0; i < swapChain.ImageCount; ++i) {
cmds[i]?.Free ();
cmds[i] = cmdPool.AllocateAndStart ();
- CommandBuffer cmd = cmds [i];
+ PrimaryCommandBuffer cmd = cmds [i];
rpGBuff.Begin (cmd, fbGBuff);
public override void Update () {
if (reloadModel) {
- LoadModel (transferQ, modelPathes[curModelIndex]);
+ LoadModel (transferQ, vke.samples.Utils.GltfFiles [curModelIndex]);
updateViewRequested = true;
rebuildBuffers = true;
ushort[] indices = { 0, 1, 2, 2, 0, 3 };
int currentImgIndex = 0;
string[] imgPathes = {
- Utils.DataDirectory + "models/Bricks16_col.jpg",
- Utils.DataDirectory + "textures/texturearray_rocks_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/texture.jpg",
- Utils.DataDirectory + "textures/tex256.jpg",
- Utils.DataDirectory + "font.ktx",
+ vke.samples.Utils.DataDirectory + "models/Bricks16_col.jpg",
+ vke.samples.Utils.DataDirectory + "textures/texturearray_rocks_bc3_unorm.ktx",
+ vke.samples.Utils.DataDirectory + "textures/texture.jpg",
+ vke.samples.Utils.DataDirectory + "textures/tex256.jpg",
+ vke.samples.Utils.DataDirectory + "font.ktx",
};
protected override void initVulkan () {
};
int currentImgIndex = 4;
string[] imgPathes = {
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
+ vke.samples.Utils.DataDirectory + "textures/uffizi_cube.ktx",
+ vke.samples.Utils.DataDirectory + "textures/papermill.ktx",
+ vke.samples.Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
+ vke.samples.Utils.DataDirectory + "textures/gcanyon_cube.ktx",
+ vke.samples.Utils.DataDirectory + "textures/pisa_cube.ktx",
};
VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1;
+++ /dev/null
-using System;
-using Glfw;
-using Vulkan;
-using System.Threading;
-
-namespace Crow {
- public class CrowWin : vke.VkWindow, IValueChange {
- #region IValueChange implementation
- public event EventHandler<ValueChangeEventArgs> ValueChanged;
- public virtual void NotifyValueChanged (string MemberName, object _value) {
- if (ValueChanged != null)
- ValueChanged.Invoke (this, new ValueChangeEventArgs (MemberName, _value));
- }
- #endregion
-
- vke.DescriptorPool descriptorPool;
- vke.DescriptorSetLayout descLayout;
- vke.DescriptorSet dsCrow;
-
- vke.GraphicPipeline uiPipeline;
- vke.FrameBuffer[] uiFrameBuffers;
-
- protected Interface crow;
- protected vkvg.Device vkvgDev;
- protected vke.Image uiImage;
- protected bool isRunning, rebuildBuffers;
-
- protected CrowWin (string name = "CrowWin", uint _width = 1024, uint _height = 768, bool vSync = false) :
- base (name, _width, _height, vSync) {
-
- Thread crowThread = new Thread (crow_thread_func);
- crowThread.IsBackground = true;
- crowThread.Start ();
-
- while (crow == null)
- Thread.Sleep (2);
-
- initUISurface ();
-
- initUIPipeline ();
- }
-
- protected override void render () {
- int idx = swapChain.GetNextImage ();
-
- if (idx < 0) {
- OnResize ();
- return;
- }
-
- lock (crow.RenderMutex) {
- presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx]);
- presentQueue.Present (swapChain, drawComplete[idx]);
- presentQueue.WaitIdle ();
- }
- Thread.Sleep (1);
- }
-
- void initUIPipeline (VkSampleCountFlags samples = VkSampleCountFlags.SampleCount1) {
- descriptorPool = new vke.DescriptorPool (dev, 1, new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler));
- descLayout = new vke.DescriptorSetLayout (dev,
- new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler)
- );
-
- vke.GraphicPipelineConfig cfg = vke.GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, samples, false);
- cfg.Layout = new vke.PipelineLayout (dev, descLayout);
- cfg.RenderPass = new vke.RenderPass (dev, swapChain.ColorFormat, samples);
- cfg.AddShader (VkShaderStageFlags.Vertex, "#deferred.FullScreenQuad.vert.spv");
- cfg.AddShader (VkShaderStageFlags.Fragment, "#deferred.simpletexture.frag.spv");
-
- cfg.blendAttachments[0] = new VkPipelineColorBlendAttachmentState (true);
-
- uiPipeline = new vke.GraphicPipeline (cfg);
-
- dsCrow = descriptorPool.Allocate (descLayout);
- }
- void initUISurface () {
- lock (crow.UpdateMutex) {
- uiImage?.Dispose ();
- uiImage = new vke.Image (dev, new VkImage ((ulong)crow.surf.VkImage.ToInt64 ()), VkFormat.B8g8r8a8Unorm,
- VkImageUsageFlags.Sampled, swapChain.Width, swapChain.Height);
- uiImage.SetName ("uiImage");
- uiImage.CreateView (VkImageViewType.ImageView2D, VkImageAspectFlags.Color);
- uiImage.CreateSampler (VkFilter.Nearest, VkFilter.Nearest, VkSamplerMipmapMode.Nearest, VkSamplerAddressMode.ClampToBorder);
- uiImage.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
- }
- }
-
- void crow_thread_func () {
- vkvgDev = new vkvg.Device (instance.Handle, phy.Handle, dev.VkDev.Handle, presentQueue.qFamIndex,
- vkvg.SampleCount.Sample_4, presentQueue.index);
-
- crow = new Interface (vkvgDev, (int)swapChain.Width, (int)swapChain.Height);
-
- isRunning = true;
- while (isRunning) {
- crow.Update ();
- Thread.Sleep (2);
- }
-
- dev.WaitIdle ();
- crow.Dispose ();
- vkvgDev.Dispose ();
- crow = null;
- }
-
- protected void loadWindow (string path, object dataSource = null) {
- try {
- Widget w = crow.FindByName (path);
- if (w != null) {
- crow.PutOnTop (w);
- return;
- }
- w = crow.Load (path);
- w.Name = path;
- w.DataSource = dataSource;
-
- } catch (Exception ex) {
- System.Diagnostics.Debug.WriteLine (ex.ToString ());
- }
- }
- protected virtual void recordDraw (vke.CommandBuffer cmd, int imageIndex) { }
-
- void buildCommandBuffers () {
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- cmds[i]?.Free ();
- cmds[i] = cmdPool.AllocateAndStart ();
-
- vke.CommandBuffer cmd = cmds[i];
-
- recordDraw (cmd, i);
-
- uiPipeline.RenderPass.Begin (cmd, uiFrameBuffers[i]);
-
- uiPipeline.Bind (cmd);
- cmd.BindDescriptorSet (uiPipeline.Layout, dsCrow);
-
- uiImage.SetLayout (cmd, VkImageAspectFlags.Color, VkImageLayout.ColorAttachmentOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.FragmentShader);
-
- cmd.Draw (3, 1, 0, 0);
-
- uiImage.SetLayout (cmd, VkImageAspectFlags.Color, VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.ColorAttachmentOptimal,
- VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.BottomOfPipe);
-
- uiPipeline.RenderPass.End (cmd);
-
- cmds[i].End ();
- }
- }
-
- /// <summary>
- /// rebuild command buffers if needed
- /// </summary>
- public override void Update () {
- if (rebuildBuffers) {
- buildCommandBuffers ();
- rebuildBuffers = false;
- }
- }
-
- protected override void OnResize () {
- dev.WaitIdle ();
-
- crow.ProcessResize (new Rectangle (0, 0, (int)swapChain.Width, (int)swapChain.Height));
-
- initUISurface ();
-
- vke.DescriptorSetWrites uboUpdate = new vke.DescriptorSetWrites (dsCrow, descLayout);
- uboUpdate.Write (dev, uiImage.Descriptor);
-
- if (uiFrameBuffers != null)
- for (int i = 0; i < swapChain.ImageCount; ++i)
- uiFrameBuffers[i]?.Dispose ();
-
- uiFrameBuffers = new vke.FrameBuffer[swapChain.ImageCount];
-
- for (int i = 0; i < swapChain.ImageCount; ++i) {
- uiFrameBuffers[i] = new vke.FrameBuffer (uiPipeline.RenderPass, swapChain.Width, swapChain.Height,
- (uiPipeline.Samples == VkSampleCountFlags.SampleCount1) ? new vke.Image[] {
- swapChain.images[i],
- } : new vke.Image[] {
- null,
- swapChain.images[i]
- });
- uiFrameBuffers[i].SetName ("ui FB " + i);
- }
-
- buildCommandBuffers ();
- dev.WaitIdle ();
- }
-
- #region Mouse and keyboard
- protected override void onScroll (double xOffset, double yOffset) {
- if (KeyModifiers.HasFlag (Modifier.Shift))
- crow.ProcessMouseWheelChanged ((float)xOffset);
- else
- crow.ProcessMouseWheelChanged ((float)yOffset);
- }
- protected override void onMouseMove (double xPos, double yPos) {
- if (crow.ProcessMouseMove ((int)xPos, (int)yPos))
- return;
- base.onMouseMove (xPos, yPos);
- }
- protected override void onMouseButtonDown (Glfw.MouseButton button) {
- if (crow.ProcessMouseButtonDown ((MouseButton)button))
- return;
- base.onMouseButtonDown (button);
- }
- protected override void onMouseButtonUp (Glfw.MouseButton button) {
- if (crow.ProcessMouseButtonUp ((MouseButton)button))
- return;
- base.onMouseButtonUp (button);
- }
- protected override void onKeyDown (Glfw.Key key, int scanCode, Modifier modifiers) {
- if (crow.ProcessKeyDown ((Key)key))
- return;
- base.onKeyDown (key, scanCode, modifiers);
- }
- protected override void onKeyUp (Glfw.Key key, int scanCode, Modifier modifiers) {
- if (crow.ProcessKeyUp ((Key)key))
- return;
- }
- protected override void onChar (CodePoint cp) {
- if (crow.ProcessKeyPress (cp.ToChar ()))
- return;
- }
- #endregion
-
- #region dispose
- protected override void Dispose (bool disposing) {
- if (disposing) {
- if (!isDisposed) {
- dev.WaitIdle ();
- isRunning = false;
-
- for (int i = 0; i < swapChain.ImageCount; ++i)
- uiFrameBuffers[i]?.Dispose ();
-
- uiPipeline.Dispose ();
- descLayout.Dispose ();
- descriptorPool.Dispose ();
-
- uiImage?.Dispose ();
- while (crow != null)
- Thread.Sleep (1);
- }
- }
-
- base.Dispose (disposing);
- }
- #endregion
- }
-}
--- /dev/null
+using System.IO;
+using System.Linq;
+
+namespace vke.samples {
+ public static class Utils {
+ public static string DataDirectory => "../../../datas/";
+ static string[] gltfExtensions = new[] { ".gltf", ".glb"};
+
+ public static string[] GltfFiles =>
+ Directory
+ .GetFiles (Path.Combine (DataDirectory, "models"), "*", SearchOption.AllDirectories)
+ .Where (file => gltfExtensions.Any (file.ToLower ().EndsWith))
+ .ToArray ();
+
+ public static string[] CubeMaps = {
+ DataDirectory + "textures/papermill.ktx",
+ DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
+ DataDirectory + "textures/gcanyon_cube.ktx",
+ DataDirectory + "textures/pisa_cube.ktx",
+ DataDirectory + "textures/uffizi_cube.ktx",
+ };
+ }
+}
using Glfw;
using Vulkan;
using vke;
+using Image = vke.Image;
namespace delaunay {
class Program : VkWindow {
+++ /dev/null
-// Copyright (c) 2019 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
-//
-// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
-using System;
-using System.Numerics;
-using vke;
-using Vulkan;
-
-namespace vke {
-
- public class FSQPipeline : GraphicPipeline {
- public static string FragPath = "#shaders.simpletexture.frag.spv";
- public FSQPipeline (RenderPass renderPass, PipelineLayout pipelineLayout, int attachment = 0, PipelineCache pipelineCache = null)
- : base (renderPass, pipelineCache, "FSQ pipeline") {
-
- GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault (VkPrimitiveTopology.TriangleList, this.RenderPass.Samples, false);
- cfg.RenderPass = RenderPass;
- cfg.Layout = pipelineLayout;
- cfg.AddShader (Dev, VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv");
- cfg.AddShader (Dev, VkShaderStageFlags.Fragment, FragPath);
- cfg.multisampleState.rasterizationSamples = Samples;
-
- cfg.blendAttachments[attachment] = new VkPipelineColorBlendAttachmentState (true);
-
- layout = cfg.Layout;
-
- init (cfg);
-
- cfg.DisposeShaders ();
- }
-
- public virtual void RecordDraw (CommandBuffer cmd) {
- Bind (cmd);
- cmd.Draw (3, 1, 0, 0);
- }
-
- protected override void Dispose (bool disposing) {
- base.Dispose (disposing);
- }
- }
-
-}
#endif
using (Program vke = new Program ()) {
+ vke.CrowUpdateInterval = 15;
vke.Run ();
}
}
cmds[i].BindIndexBuffer (ibo, VkIndexType.Uint16);
cmds[i].DrawIndexed ((uint)indices.Length);
- RecordDraw (cmds[i]);
+ this.recordUICmd (cmds[i]);
pipeline.RenderPass.End (cmds[i]);
+++ /dev/null
-// Copyright (c) 2019 Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
-//
-// This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
-using System;
-using System.Numerics;
-using System.Runtime.InteropServices;
-using Glfw;
-using vke;
-using Vulkan;
-using Crow;
-using System.Threading;
-
-namespace vke {
- /// <summary>
- /// Vulkan context with Crow enabled window.
- /// Crow vector drawing is handled with Cairo Image on an Host mapped vulkan image.
- /// This is an easy way to have GUI in my samples with low GPU cost. Most of the ui
- /// is cached on cpu memory images.
- /// </summary>
- public class CrowWindow : VkWindow, IValueChange {
- #region IValueChange implementation
- public event EventHandler<ValueChangeEventArgs> ValueChanged;
- public virtual void NotifyValueChanged (string MemberName, object _value)
- {
- ValueChanged?.Invoke (this, new ValueChangeEventArgs (MemberName, _value));
- }
- #endregion
-
- public bool MouseIsInInterface =>
- iFace.HoverWidget != null;
-
- FSQPipeline fsqPl;
- DescriptorPool dsPool;
- DescriptorSet descSet;
- CommandPool cmdPoolCrow;
- PrimaryCommandBuffer cmdUpdateCrow;
- Image crowImage;
- HostBuffer crowBuffer;
- Interface iFace;
- protected RenderPass renderPass;
-
- volatile bool running;
-
-
- VkDescriptorSetLayoutBinding dslBinding = new VkDescriptorSetLayoutBinding (0, VkShaderStageFlags.Fragment, VkDescriptorType.CombinedImageSampler);
-
- protected override void initVulkan () {
- base.initVulkan ();
-
- iFace = new Interface ((int)Width, (int)Height, WindowHandle);
- iFace.Init ();
-
- CreateRenderPass ();
-
- fsqPl = new FSQPipeline (renderPass,
- new PipelineLayout (dev, new DescriptorSetLayout (dev, dslBinding)));
-
- cmdPoolCrow = new CommandPool (presentQueue, VkCommandPoolCreateFlags.ResetCommandBuffer);
- cmdUpdateCrow = cmdPoolCrow.AllocateCommandBuffer ();
-
- dsPool = new DescriptorPool (dev, 1, new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler));
- descSet = dsPool.Allocate (fsqPl.Layout.DescriptorSetLayouts[0]);
-
- Thread ui = new Thread (crowThread);
- ui.IsBackground = true;
- ui.Start ();
- }
- protected virtual void CreateRenderPass () {
- renderPass = new RenderPass (dev, swapChain.ColorFormat, dev.GetSuitableDepthFormat (), VkSampleCountFlags.SampleCount1);
- }
-
-
- protected override void onMouseMove (double xPos, double yPos)
- {
- if (iFace.OnMouseMove ((int)xPos, (int)yPos))
- return;
- base.onMouseMove (xPos, yPos);
- }
- protected override void onMouseButtonDown (MouseButton button) {
- if (iFace.OnMouseButtonDown (button))
- return;
- base.onMouseButtonDown (button);
- }
- protected override void onMouseButtonUp (MouseButton button)
- {
- if (iFace.OnMouseButtonUp (button))
- return;
- base.onMouseButtonUp (button);
- }
- protected override void onChar (CodePoint cp) {
- if (iFace.OnKeyPress (cp.ToChar()))
- return;
- base.onChar (cp);
- }
- protected override void onKeyUp (Key key, int scanCode, Modifier modifiers) {
- if (iFace.OnKeyUp (key))
- return;
- base.onKeyUp (key, scanCode, modifiers);
- }
- protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
- if (iFace.OnKeyDown (key))
- return;
- base.onKeyDown (key, scanCode, modifiers);
- }
-
- protected override void render () {
-
- int idx = swapChain.GetNextImage ();
- if (idx < 0) {
- OnResize ();
- return;
- }
-
- if (cmds[idx] == null)
- return;
-
- drawFence.Wait ();
- drawFence.Reset ();
-
- if (Monitor.IsEntered (iFace.UpdateMutex))
- Monitor.Exit (iFace.UpdateMutex);
-
- presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx], drawFence);
- presentQueue.Present (swapChain, drawComplete[idx]);
- }
-
- public override void Update () {
- if (iFace.IsDirty) {
- drawFence.Wait ();
- drawFence.Reset ();
- Monitor.Enter (iFace.UpdateMutex);
- presentQueue.Submit (cmdUpdateCrow, default, default, drawFence);
- iFace.IsDirty = false;
- }
-
- NotifyValueChanged ("fps", fps);
- }
-
- protected override void OnResize ()
- {
- base.OnResize ();
- dev.WaitIdle ();
- initCrowSurface ();
- iFace.ProcessResize (new Rectangle (0, 0, (int)Width, (int)Height));
- }
-
- public void RecordDraw (CommandBuffer cmd) {
- //fsqPl.Bind (cmd);
- //cmd.BindDescriptorSet()
- fsqPl.BindDescriptorSet (cmd, descSet, 0);
- fsqPl.RecordDraw (cmd);
- }
-
- void crowThread () {
- while (iFace.surf == null) {
- Thread.Sleep (10);
- }
- running = true;
- while (running) {
- iFace.Update ();
- Thread.Sleep (10);
- }
- }
- void initCrowSurface () {
- lock (iFace.UpdateMutex) {
- iFace.surf?.Dispose ();
- crowImage?.Dispose ();
- crowBuffer?.Dispose ();
-
- crowBuffer = new HostBuffer (dev, VkBufferUsageFlags.TransferSrc | VkBufferUsageFlags.TransferDst, Width * Height * 4, true);
-
- crowImage = new Image (dev, VkFormat.B8g8r8a8Unorm, VkImageUsageFlags.Sampled | VkImageUsageFlags.TransferDst,
- VkMemoryPropertyFlags.DeviceLocal, Width, Height, VkImageType.Image2D, VkSampleCountFlags.SampleCount1, VkImageTiling.Linear);
- crowImage.CreateView (VkImageViewType.ImageView2D, VkImageAspectFlags.Color);
- crowImage.CreateSampler (VkFilter.Nearest, VkFilter.Nearest, VkSamplerMipmapMode.Nearest, VkSamplerAddressMode.ClampToBorder);
- crowImage.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
-
- DescriptorSetWrites dsw = new DescriptorSetWrites (descSet, dslBinding);
- dsw.Write (dev, crowImage.Descriptor);
-
- iFace.surf = new Crow.Cairo.ImageSurface (crowBuffer.MappedData, Crow.Cairo.Format.ARGB32,
- (int)Width, (int)Height, (int)Width * 4);
-
- PrimaryCommandBuffer cmd = cmdPoolCrow.AllocateAndStart (VkCommandBufferUsageFlags.OneTimeSubmit);
- crowImage.SetLayout (cmd, VkImageAspectFlags.Color, VkImageLayout.Preinitialized, VkImageLayout.ShaderReadOnlyOptimal);
- presentQueue.EndSubmitAndWait (cmd, true);
-
- recordUpdateCrowCmd ();
- }
- }
-
- /// <summary>
- /// command buffer must have been reseted
- /// </summary>
- void recordUpdateCrowCmd () {
- cmdPoolCrow.Reset ();
- cmdUpdateCrow.Start ();
- crowImage.SetLayout (cmdUpdateCrow, VkImageAspectFlags.Color,
- VkImageLayout.ShaderReadOnlyOptimal, VkImageLayout.TransferDstOptimal,
- VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.Transfer);
-
- crowBuffer.CopyTo (cmdUpdateCrow, crowImage, VkImageLayout.ShaderReadOnlyOptimal);
-
- crowImage.SetLayout (cmdUpdateCrow, VkImageAspectFlags.Color,
- VkImageLayout.TransferDstOptimal, VkImageLayout.ShaderReadOnlyOptimal,
- VkPipelineStageFlags.Transfer, VkPipelineStageFlags.FragmentShader);
- cmdUpdateCrow.End ();
- }
-
-
- protected void loadWindow (string path, object dataSource = null) {
- try {
- Widget w = iFace.FindByName (path);
- if (w != null) {
- iFace.PutOnTop (w);
- return;
- }
- w = iFace.Load (path);
- w.Name = path;
- w.DataSource = dataSource;
-
- } catch (Exception ex) {
- System.Diagnostics.Debug.WriteLine (ex.ToString ());
- }
- }
- protected void closeWindow (string path) {
- Widget g = iFace.FindByName (path);
- if (g != null)
- iFace.DeleteWidget (g);
- }
-
-
- protected override void Dispose (bool disposing) {
- dev.WaitIdle ();
-
- running = false;
- fsqPl.Dispose ();
- dsPool.Dispose ();
- cmdPoolCrow.Dispose ();
- crowImage?.Dispose ();
- crowBuffer?.Dispose ();
- iFace.Dispose ();
-
- base.Dispose (disposing);
- }
-
- }
-}
<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <IncludeDefaultNoneItems>false</IncludeDefaultNoneItems>
- </PropertyGroup>
<ItemGroup>
- <PackageReference Include="Crow" Version="0.9.0-beta" />
+ <PackageReference Include="Crow" Version="0.9.1-beta" />
</ItemGroup>
<ItemGroup>
<!-- <GLSLShader Remove="shaders\**\*.frag;shaders\**\*.vert;shaders\**\*.comp;shaders\**\*.geom" />-->
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\addons\CrowWindow\CrowWindow.csproj" />
+ </ItemGroup>
</Project>
\ No newline at end of file
+++ /dev/null
-#version 450
-
-#extension GL_ARB_separate_shader_objects : enable
-#extension GL_ARB_shading_language_420pack : enable
-
-layout (set = 0, binding = 0) uniform sampler2D samplerColor;
-
-layout (location = 0) in vec2 inUV;
-layout (location = 0) out vec4 outFragColor;
-
-void main()
-{
- outFragColor = texture(samplerColor, inUV);
-}
dev.WaitIdle ();
model?.Dispose ();
+ Console.ForegroundColor = ConsoleColor.DarkGreen;
+ Console.WriteLine ($"Loading:{path}");
+ Console.ResetColor ();
+
if (TEXTURE_ARRAY) {
PbrModelTexArray mod = new PbrModelTexArray (transferQ, path);
if (mod.texArray != null) {
#endif
SwapChain.PREFERED_FORMAT = VkFormat.B8g8r8a8Srgb;
DeferredPbrRenderer.TEXTURE_ARRAY = true;
- DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount8;
+ DeferredPbrRenderer.NUM_SAMPLES = VkSampleCountFlags.SampleCount4;
DeferredPbrRenderer.HDR_FORMAT = VkFormat.R32g32b32a32Sfloat;
DeferredPbrRenderer.MRT_FORMAT = VkFormat.R32g32b32a32Sfloat;
transferQ = new Queue (dev, VkQueueFlags.Transfer);
computeQ = new Queue (dev, VkQueueFlags.Compute);
}
- string[] cubemapPathes = {
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- };
- string[] modelPathes = {
- //"/mnt/devel/vkPinball/data/models/pinball.gltf",
- //"/mnt/devel/pinball.net/data/test.glb",
- //Utils.DataDirectory + "models/Box.gltf",
- //Utils.DataDirectory + "models/cubeOnPlane.glb",
- //Utils.DataDirectory + "models/shadow.glb",
- Utils.DataDirectory + "models/cube.gltf",
- Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- //Utils.DataDirectory + "models/shadow.glb",
- Utils.DataDirectory + "models/Hubble.glb",
- Utils.DataDirectory + "models/MER_static.glb",
- Utils.DataDirectory + "models/ISS_stationary.glb",
- };
-
- int curModelIndex = 0;
- bool reloadModel;
+
+ string[] modelPathes = vke.samples.Utils.GltfFiles;
+
+ int curModelIndex = 0, curCubeMap = 2;
+ bool reloadModel, reloadCubeMap;
bool rebuildBuffers;
Queue transferQ, computeQ;
VkDebugUtilsMessageSeverityFlagsEXT.VerboseEXT);
#endif
- camera = new Camera (Utils.DegreesToRadians (45f), 1f, 0.1f, 16f);
+ camera = new Camera (Utils.DegreesToRadians (60f), 1f, 0.1f, 16f);
camera.SetPosition (0, 0, -2);
//renderer = new DeferredPbrRenderer (presentQueue, cubemapPathes[2], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
- renderer = new DeferredPbrRenderer (presentQueue, cubemapPathes[2], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
+ renderer = new DeferredPbrRenderer (presentQueue, vke.samples.Utils.CubeMaps[curCubeMap], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
renderer.LoadModel (transferQ, modelPathes[curModelIndex]);
camera.Model = Matrix4x4.CreateScale (1f / Math.Max (Math.Max (renderer.modelAABB.Width, renderer.modelAABB.Height), renderer.modelAABB.Depth));
init_final_pl ();
}
- void init_final_pl() {
+ void init_final_pl () {
descriptorPool = new DescriptorPool (dev, 3,
new VkDescriptorPoolSize (VkDescriptorType.CombinedImageSampler, 2),
new VkDescriptorPoolSize (VkDescriptorType.StorageImage, 4)
cfg.RenderPass = new RenderPass (dev, swapChain.ColorFormat, DeferredPbrRenderer.NUM_SAMPLES);
using (ShaderInfo vs = new ShaderInfo (dev, VkShaderStageFlags.Vertex, "#vke.FullScreenQuad.vert.spv"))
- using (ShaderInfo fs = new ShaderInfo (dev, VkShaderStageFlags.Fragment, "#shaders.tone_mapping.frag.spv"))
- {
+ using (ShaderInfo fs = new ShaderInfo (dev, VkShaderStageFlags.Fragment, "#shaders.tone_mapping.frag.spv")) {
cfg.AddShaders (vs, fs);
plToneMap = new GraphicPipeline (cfg);
}
public override void Update () {
+ if (reloadCubeMap) {
+ dev.WaitIdle ();
+ renderer.Dispose ();
+ renderer = new DeferredPbrRenderer (presentQueue, vke.samples.Utils.CubeMaps[curCubeMap], swapChain.Width, swapChain.Height, camera.NearPlane, camera.FarPlane);
+ renderer.Resize (Width, Height);
+ DescriptorSetWrites dsUpdate = new DescriptorSetWrites (plToneMap.Layout.DescriptorSetLayouts[0].Bindings[0]);
+ dsUpdate.Write (dev, descriptorSet, renderer.hdrImgResolved.Descriptor);
+ renderer.LoadModel (transferQ, modelPathes[curModelIndex]);
+ reloadCubeMap = reloadModel = false;
+ updateViewRequested = true;
+ rebuildBuffers = true;
+#if WITH_SHADOWS
+ renderer.shadowMapRenderer.updateShadowMap = true;
+#endif
+ }
if (reloadModel) {
renderer.LoadModel (transferQ, modelPathes[curModelIndex]);
reloadModel = false;
UpdateView ();
- frameBuffers?.Dispose();
- frameBuffers = plToneMap.RenderPass.CreateFrameBuffers(swapChain);
+ frameBuffers?.Dispose ();
+ frameBuffers = plToneMap.RenderPass.CreateFrameBuffers (swapChain);
DescriptorSetWrites dsUpdate = new DescriptorSetWrites (plToneMap.Layout.DescriptorSetLayouts[0].Bindings[0]);
dsUpdate.Write (dev, descriptorSet, renderer.hdrImgResolved.Descriptor);
}
protected override void onKeyDown (Key key, int scanCode, Modifier modifiers) {
switch (key) {
- case Key.F:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.debugFace--;
- if (renderer.debugFace < 0)
- renderer.debugFace = 5;
- } else {
- renderer.debugFace++;
- if (renderer.debugFace >= 5)
- renderer.debugFace = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.M:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.debugMip--;
- if (renderer.debugMip < 0)
- renderer.debugMip = (int)renderer.envCube.prefilterCube.CreateInfo.mipLevels - 1;
- } else {
- renderer.debugMip++;
- if (renderer.debugMip >= renderer.envCube.prefilterCube.CreateInfo.mipLevels)
- renderer.debugMip = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.L:
- if (modifiers.HasFlag (Modifier.Shift)) {
- renderer.lightNumDebug--;
- if (renderer.lightNumDebug < 0)
- renderer.lightNumDebug = (int)renderer.lights.Length - 1;
- } else {
- renderer.lightNumDebug++;
- if (renderer.lightNumDebug >= renderer.lights.Length)
- renderer.lightNumDebug = 0;
- }
- rebuildBuffers = true;
- break;
- case Key.Keypad0:
- case Key.Keypad1:
- case Key.Keypad2:
- case Key.Keypad3:
- case Key.Keypad4:
- case Key.Keypad5:
- case Key.Keypad6:
- case Key.Keypad7:
- case Key.Keypad8:
- case Key.Keypad9:
- renderer.currentDebugView = (DeferredPbrRenderer.DebugView)(int)key-320;
- rebuildBuffers = true;
- break;
- case Key.KeypadDivide:
- renderer.currentDebugView = DeferredPbrRenderer.DebugView.irradiance;
- rebuildBuffers = true;
- break;
- case Key.S:
- if (modifiers.HasFlag (Modifier.Control)) {
- renderer.pipelineCache.Save ();
- Console.WriteLine ($"Pipeline Cache saved.");
- } else {
- renderer.currentDebugView = DeferredPbrRenderer.DebugView.shadowMap;
- rebuildBuffers = true;
- }
- break;
- case Key.Up:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight(-Vector4.UnitZ);
- else
- camera.Move (0, 0, 1);
- break;
- case Key.Down:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitZ);
- else
- camera.Move (0, 0, -1);
- break;
- case Key.Left:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (-Vector4.UnitX);
- else
- camera.Move (1, 0, 0);
- break;
- case Key.Right:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitX);
- else
- camera.Move (-1, 0, 0);
- break;
- case Key.PageUp:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (Vector4.UnitY);
- else
- camera.Move (0, 1, 0);
- break;
- case Key.PageDown:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.MoveLight (-Vector4.UnitY);
- else
- camera.Move (0, -1, 0);
- break;
- case Key.F2:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.exposure -= 0.3f;
- else
- renderer.exposure += 0.3f;
- rebuildBuffers = true;
- break;
- case Key.F3:
- if (modifiers.HasFlag (Modifier.Shift))
- renderer.gamma -= 0.1f;
- else
- renderer.gamma += 0.1f;
+ case Key.F:
+ if (modifiers.HasFlag (Modifier.Shift)) {
+ renderer.debugFace--;
+ if (renderer.debugFace < 0)
+ renderer.debugFace = 5;
+ } else {
+ renderer.debugFace++;
+ if (renderer.debugFace >= 5)
+ renderer.debugFace = 0;
+ }
+ rebuildBuffers = true;
+ break;
+ case Key.M:
+ if (modifiers.HasFlag (Modifier.Shift)) {
+ renderer.debugMip--;
+ if (renderer.debugMip < 0)
+ renderer.debugMip = (int)renderer.envCube.prefilterCube.CreateInfo.mipLevels - 1;
+ } else {
+ renderer.debugMip++;
+ if (renderer.debugMip >= renderer.envCube.prefilterCube.CreateInfo.mipLevels)
+ renderer.debugMip = 0;
+ }
+ rebuildBuffers = true;
+ break;
+ case Key.L:
+ if (modifiers.HasFlag (Modifier.Shift)) {
+ renderer.lightNumDebug--;
+ if (renderer.lightNumDebug < 0)
+ renderer.lightNumDebug = (int)renderer.lights.Length - 1;
+ } else {
+ renderer.lightNumDebug++;
+ if (renderer.lightNumDebug >= renderer.lights.Length)
+ renderer.lightNumDebug = 0;
+ }
+ rebuildBuffers = true;
+ break;
+ case Key.Keypad0:
+ case Key.Keypad1:
+ case Key.Keypad2:
+ case Key.Keypad3:
+ case Key.Keypad4:
+ case Key.Keypad5:
+ case Key.Keypad6:
+ case Key.Keypad7:
+ case Key.Keypad8:
+ case Key.Keypad9:
+ renderer.currentDebugView = (DeferredPbrRenderer.DebugView)(int)key - 320;
+ rebuildBuffers = true;
+ break;
+ case Key.KeypadDivide:
+ renderer.currentDebugView = DeferredPbrRenderer.DebugView.irradiance;
+ rebuildBuffers = true;
+ break;
+ case Key.S:
+ if (modifiers.HasFlag (Modifier.Control)) {
+ renderer.pipelineCache.Save ();
+ Console.WriteLine ($"Pipeline Cache saved.");
+ } else {
+ renderer.currentDebugView = DeferredPbrRenderer.DebugView.shadowMap;
rebuildBuffers = true;
- break;
- case Key.KeypadAdd:
+ }
+ break;
+ case Key.Up:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (-Vector4.UnitZ);
+ else
+ camera.Move (0, 0, 1);
+ break;
+ case Key.Down:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (Vector4.UnitZ);
+ else
+ camera.Move (0, 0, -1);
+ break;
+ case Key.Left:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (-Vector4.UnitX);
+ else
+ camera.Move (1, 0, 0);
+ break;
+ case Key.Right:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (Vector4.UnitX);
+ else
+ camera.Move (-1, 0, 0);
+ break;
+ case Key.PageUp:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (Vector4.UnitY);
+ else
+ camera.Move (0, 1, 0);
+ break;
+ case Key.PageDown:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.MoveLight (-Vector4.UnitY);
+ else
+ camera.Move (0, -1, 0);
+ break;
+ case Key.F2:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.exposure -= 0.3f;
+ else
+ renderer.exposure += 0.3f;
+ rebuildBuffers = true;
+ break;
+ case Key.F3:
+ if (modifiers.HasFlag (Modifier.Shift))
+ renderer.gamma -= 0.1f;
+ else
+ renderer.gamma += 0.1f;
+ rebuildBuffers = true;
+ break;
+ case Key.Space:
+ if (modifiers.HasFlag (Modifier.Control)) {
+ curModelIndex--;
+ if (curModelIndex < 0)
+ curModelIndex = modelPathes.Length - 1;
+ } else {
curModelIndex++;
if (curModelIndex >= modelPathes.Length)
curModelIndex = 0;
- reloadModel = true;
- break;
- case Key.KeypadSubtract:
- curModelIndex--;
- if (curModelIndex < 0)
- curModelIndex = modelPathes.Length -1;
- reloadModel = true;
- break;
- default:
- base.onKeyDown (key, scanCode, modifiers);
- return;
+ }
+ reloadModel = true;
+ break;
+ case Key.C:
+ if (modifiers.HasFlag (Modifier.Control)) {
+ curCubeMap--;
+ if (curCubeMap < 0)
+ curCubeMap = vke.samples.Utils.CubeMaps.Length - 1;
+ } else {
+ curCubeMap++;
+ if (curCubeMap >= vke.samples.Utils.CubeMaps.Length)
+ curCubeMap = 0;
+ }
+ reloadCubeMap = true;
+ break;
+ default:
+ base.onKeyDown (key, scanCode, modifiers);
+ return;
}
updateViewRequested = true;
}
dev.WaitIdle ();
if (disposing) {
if (!isDisposed) {
- frameBuffers?.Dispose();
+ frameBuffers?.Dispose ();
renderer?.Dispose ();
plToneMap?.Dispose ();
descriptorPool?.Dispose ();
transferQ = new Queue (dev, VkQueueFlags.Transfer);
computeQ = new Queue (dev, VkQueueFlags.Compute);
}
- string[] cubemapPathes = {
- Utils.DataDirectory + "textures/papermill.ktx",
- Utils.DataDirectory + "textures/cubemap_yokohama_bc3_unorm.ktx",
- Utils.DataDirectory + "textures/gcanyon_cube.ktx",
- Utils.DataDirectory + "textures/pisa_cube.ktx",
- Utils.DataDirectory + "textures/uffizi_cube.ktx",
- };
- string[] modelPathes = {
- Utils.DataDirectory + "models/cubeOnPlane.glb",
- //"/mnt/devel/vkPinball/data/models/pinball.gltf",
- Utils.DataDirectory + "models/DamagedHelmet/glTF/DamagedHelmet.gltf",
- Utils.DataDirectory + "models/Hubble.glb",
- Utils.DataDirectory + "models/MER_static.glb",
- Utils.DataDirectory + "models/ISS_stationary.glb",
- };
int curModelIndex = 0;
bool reloadModel;
using Glfw;
using vke;
using Vulkan;
+using Image = vke.Image;
namespace vkeEditor {
using System.Runtime.InteropServices;
namespace vke {
- public class StbImage : IDisposable {
+ public class StbImage : IDisposable {
#if STB_SHARP
GCHandle gcHandle;
public IntPtr Handle => gcHandle.AddrOfPinnedObject ();
#else
const string stblib = "stb";
- [DllImport (stblib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "stbi_load")]
- static extern IntPtr Load ([MarshalAs (UnmanagedType.LPStr)] string filename, out int x, out int y, out int channels_in_file, int desired_channels);
+ [DllImport (stblib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "stbi_load")]
+ static extern IntPtr Load ([MarshalAs (UnmanagedType.LPStr)] string filename, out int x, out int y, out int channels_in_file, int desired_channels);
[DllImport (stblib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "stbi_load_from_memory")]
- static extern IntPtr Load (IntPtr bitmap, int byteCount, out int x, out int y, out int channels_in_file, int desired_channels);
+ static extern IntPtr Load (IntPtr bitmap, int byteCount, out int x, out int y, out int channels_in_file, int desired_channels);
[DllImport (stblib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "stbi_load_from_memory")]
static extern IntPtr Load (ref byte bitmap, int byteCount, out int x, out int y, out int channels_in_file, int desired_channels);
[DllImport (stblib, CallingConvention = CallingConvention.Cdecl, EntryPoint = "stbi_image_free")]
- static extern void FreeImage (IntPtr img);
+ static extern void FreeImage (IntPtr img);
public IntPtr Handle { get; private set; }
#endif
Channels = (int)stbi.Comp;
gcHandle = GCHandle.Alloc (stbi.Data, GCHandleType.Pinned);
#else
- Handle = StbImage.Load (ref MemoryMarshal.GetReference(bitmap.Span), bitmap.Length, out Width, out Height, out Channels, requestedChannels);
+ Handle = StbImage.Load (ref MemoryMarshal.GetReference (bitmap.Span), bitmap.Length, out Width, out Height, out Channels, requestedChannels);
if (Handle == IntPtr.Zero)
throw new Exception ($"STBI image loading error.");
#endif
namespace Vulkan {
public static partial class Utils {
- public static string DataDirectory => "../../../datas/";
/// <summary>Throw an erro if VkResult != Success.</summary>
public static void CheckResult (VkResult result, string errorString = "Call failed") {
if (result != VkResult.Success)
public HostBuffer (Device device, VkBufferUsageFlags usage, T[] data, bool keepMapped = false, bool coherentMem = true)
: base (device, usage, (ulong)(Marshal.SizeOf<T> () * data.Length), keepMapped, coherentMem) {
TSize = Marshal.SizeOf<T> ();
- Map ();
+ if (!keepMapped)
+ Map ();
Update (data, createInfo.size);
if (!keepMapped)
Unmap ();
}
}
if (createInfos.presentMode != presentMode)
- throw new Exception ("Invalid presentMode for swapchain: " + presentMode);
+ throw new Exception ("Unsuported presentMode for swapchain: " + presentMode);
createInfos.surface = presentQueue.Surface;
createInfos.imageExtent = new VkExtent2D (width, height);