From c1132b873a91622477711c7a6626f878cc15ae84 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sat, 18 Jul 2020 20:37:56 +0200 Subject: [PATCH] wip --- Directory.Build.props | 12 +- addons/CrowWindow/CrowWindow.csproj | 4 +- addons/CrowWindow/VkCrowWindow.cs | 11 +- addons/gltfLoader/gltfLoader.csproj | 2 +- samples/Directory.Build.props | 25 +- samples/Model/main.cs | 2 +- samples/RayTests/main.cs | 40 +-- samples/Textured/main.cs | 10 +- samples/TexturedCube/main.cs | 10 +- samples/common/CrowWin.cs | 254 ---------------- samples/common/Utils.cs | 23 ++ samples/compute/delaunay.cs | 1 + samples/crowWin/FSQPipeline.cs | 42 --- samples/crowWin/Program.cs | 3 +- samples/crowWin/VkCrowWindow.cs | 248 ---------------- samples/crowWin/crowWin.csproj | 8 +- samples/crowWin/shaders/simpletexture.frag | 14 - samples/deferred/DeferredPbrRenderer.cs | 4 + samples/deferred/main.cs | 318 +++++++++++---------- samples/shadow/main.cs | 15 - samples/vkeEditor/CrowPipeline.cs | 1 + vke/src/StbImage.cs | 12 +- vke/src/Utils.cs | 1 - vke/src/base/HostBuffer.cs | 3 +- vke/src/base/SwapChain.cs | 2 +- 25 files changed, 262 insertions(+), 803 deletions(-) delete mode 100644 samples/common/CrowWin.cs create mode 100644 samples/common/Utils.cs delete mode 100644 samples/crowWin/FSQPipeline.cs delete mode 100644 samples/crowWin/VkCrowWindow.cs delete mode 100644 samples/crowWin/shaders/simpletexture.frag diff --git a/Directory.Build.props b/Directory.Build.props index a755d5d..e13416f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,18 +2,22 @@ $(MSBuildThisFileDirectory) $(SolutionDir)build\$(Configuration)\ + 0.1.44 $(SpirVTasksReleaseVersion)-beta - 0.1.20 + 0.1.21 $(VkeReleaseVersion)-beta - true - false + 7.2 + + false + false + - $(DefineConstants);_MEMORY_POOLS + $(DefineConstants);MEMORY_POOLS $(DefineConstants);STB_SHARP diff --git a/addons/CrowWindow/CrowWindow.csproj b/addons/CrowWindow/CrowWindow.csproj index a02a429..f9372c6 100644 --- a/addons/CrowWindow/CrowWindow.csproj +++ b/addons/CrowWindow/CrowWindow.csproj @@ -6,7 +6,7 @@ $(VkeReleaseVersion) vke.net addon to creaet a vulkan window with crow gui support. vulkan gui ui c# vke.net - $(AssemblyVersion) + $(VkePackageVersion) True False https://github.com/jpbruyere/vke.net/blob/master/README.md @@ -17,7 +17,7 @@ - + diff --git a/addons/CrowWindow/VkCrowWindow.cs b/addons/CrowWindow/VkCrowWindow.cs index 636ddf2..6a3f951 100644 --- a/addons/CrowWindow/VkCrowWindow.cs +++ b/addons/CrowWindow/VkCrowWindow.cs @@ -25,7 +25,8 @@ namespace vke { public bool MouseIsInInterface => iFace.HoverWidget != null; - + /// Duration in millisecond of the interval between interface update. + protected int CrowUpdateInterval = 5; protected FSQPipeline fsqPl; DescriptorPool dsPool; protected DescriptorSet descSet; @@ -33,14 +34,16 @@ namespace vke { 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 (); @@ -158,7 +161,7 @@ namespace vke { running = true; while (running) { iFace.Update (); - Thread.Sleep (10); + Thread.Sleep (CrowUpdateInterval); } } void initCrowSurface () { diff --git a/addons/gltfLoader/gltfLoader.csproj b/addons/gltfLoader/gltfLoader.csproj index 9c83a86..9ef3364 100644 --- a/addons/gltfLoader/gltfLoader.csproj +++ b/addons/gltfLoader/gltfLoader.csproj @@ -6,7 +6,7 @@ $(VkeReleaseVersion) vke.net glTF addons vulkan C# gltf - $(AssemblyVersion) + $(VkePackageVersion) True False https://github.com/jpbruyere/vke.net/blob/master/README.md diff --git a/samples/Directory.Build.props b/samples/Directory.Build.props index 93eff46..d18a95f 100644 --- a/samples/Directory.Build.props +++ b/samples/Directory.Build.props @@ -18,25 +18,23 @@ $(MSBuildThisFileDirectory)common\shaders $(SolutionDir)build\$(Configuration)\ - - - - TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;_WITH_SHADOWS;_WITH_VKVG - - - NETSTANDARD;NETSTANDARD2_0;WITH_SHADOWS;_WITH_VKVG - + _WITH_SHADOWS;_WITH_VKVG + + + - + + - - + + + @@ -45,5 +43,6 @@ ui.%(Filename)%(Extension) - + + diff --git a/samples/Model/main.cs b/samples/Model/main.cs index 6719456..e1b38c0 100644 --- a/samples/Model/main.cs +++ b/samples/Model/main.cs @@ -101,7 +101,7 @@ namespace Model{ 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); diff --git a/samples/RayTests/main.cs b/samples/RayTests/main.cs index e3c687a..37917b5 100644 --- a/samples/RayTests/main.cs +++ b/samples/RayTests/main.cs @@ -6,6 +6,7 @@ using vke.glTF; using Glfw; using Vulkan; using vke.Environment; +using Image = vke.Image; namespace deferred { class Deferred : VkWindow { @@ -51,21 +52,6 @@ namespace deferred { 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, @@ -150,6 +136,11 @@ namespace deferred { 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); @@ -161,12 +152,9 @@ namespace deferred { init (); - LoadModel (transferQ, modelPathes [curModelIndex]); - - //dev.WaitIdle (); + LoadModel (transferQ, vke.samples.Utils.GltfFiles[curModelIndex]); } - void LoadModel (Queue transferQ, string path) { dev.WaitIdle (); @@ -241,8 +229,8 @@ namespace deferred { new SpecializationConstant (1, camera.FarPlane), new SpecializationConstant (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); } @@ -265,8 +253,8 @@ namespace deferred { using (SpecializationInfo constants = new SpecializationInfo ( new SpecializationConstant (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); } } @@ -307,7 +295,7 @@ namespace deferred { 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; @@ -367,7 +355,7 @@ namespace deferred { 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); @@ -416,7 +404,7 @@ namespace deferred { public override void Update () { if (reloadModel) { - LoadModel (transferQ, modelPathes[curModelIndex]); + LoadModel (transferQ, vke.samples.Utils.GltfFiles [curModelIndex]); updateViewRequested = true; rebuildBuffers = true; diff --git a/samples/Textured/main.cs b/samples/Textured/main.cs index f2702d6..bf903f1 100644 --- a/samples/Textured/main.cs +++ b/samples/Textured/main.cs @@ -59,11 +59,11 @@ namespace Textured { 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 () { diff --git a/samples/TexturedCube/main.cs b/samples/TexturedCube/main.cs index c91c22a..b42ec9d 100644 --- a/samples/TexturedCube/main.cs +++ b/samples/TexturedCube/main.cs @@ -96,11 +96,11 @@ namespace TextureCube { }; 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; diff --git a/samples/common/CrowWin.cs b/samples/common/CrowWin.cs deleted file mode 100644 index ee7b2ac..0000000 --- a/samples/common/CrowWin.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System; -using Glfw; -using Vulkan; -using System.Threading; - -namespace Crow { - public class CrowWin : vke.VkWindow, IValueChange { - #region IValueChange implementation - public event EventHandler 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 (); - } - } - - /// - /// rebuild command buffers if needed - /// - 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 - } -} diff --git a/samples/common/Utils.cs b/samples/common/Utils.cs new file mode 100644 index 0000000..94cab8a --- /dev/null +++ b/samples/common/Utils.cs @@ -0,0 +1,23 @@ +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", + }; + } +} diff --git a/samples/compute/delaunay.cs b/samples/compute/delaunay.cs index 228f6ec..97bfb5d 100644 --- a/samples/compute/delaunay.cs +++ b/samples/compute/delaunay.cs @@ -2,6 +2,7 @@ using Glfw; using Vulkan; using vke; +using Image = vke.Image; namespace delaunay { class Program : VkWindow { diff --git a/samples/crowWin/FSQPipeline.cs b/samples/crowWin/FSQPipeline.cs deleted file mode 100644 index db4cadb..0000000 --- a/samples/crowWin/FSQPipeline.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2019 Jean-Philippe Bruyère -// -// 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); - } - } - -} diff --git a/samples/crowWin/Program.cs b/samples/crowWin/Program.cs index dd493fd..096f5ce 100644 --- a/samples/crowWin/Program.cs +++ b/samples/crowWin/Program.cs @@ -19,6 +19,7 @@ namespace vkeEditor { #endif using (Program vke = new Program ()) { + vke.CrowUpdateInterval = 15; vke.Run (); } } @@ -151,7 +152,7 @@ namespace vkeEditor { cmds[i].BindIndexBuffer (ibo, VkIndexType.Uint16); cmds[i].DrawIndexed ((uint)indices.Length); - RecordDraw (cmds[i]); + this.recordUICmd (cmds[i]); pipeline.RenderPass.End (cmds[i]); diff --git a/samples/crowWin/VkCrowWindow.cs b/samples/crowWin/VkCrowWindow.cs deleted file mode 100644 index 9e05b92..0000000 --- a/samples/crowWin/VkCrowWindow.cs +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) 2019 Jean-Philippe Bruyère -// -// 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 { - /// - /// 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. - /// - public class CrowWindow : VkWindow, IValueChange { - #region IValueChange implementation - public event EventHandler 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 (); - } - } - - /// - /// command buffer must have been reseted - /// - 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); - } - - } -} diff --git a/samples/crowWin/crowWin.csproj b/samples/crowWin/crowWin.csproj index 5091127..6d5941d 100644 --- a/samples/crowWin/crowWin.csproj +++ b/samples/crowWin/crowWin.csproj @@ -1,9 +1,6 @@ - - false - - + @@ -11,4 +8,7 @@ PreserveNewest + + + \ No newline at end of file diff --git a/samples/crowWin/shaders/simpletexture.frag b/samples/crowWin/shaders/simpletexture.frag deleted file mode 100644 index 95cab5f..0000000 --- a/samples/crowWin/shaders/simpletexture.frag +++ /dev/null @@ -1,14 +0,0 @@ -#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); -} diff --git a/samples/deferred/DeferredPbrRenderer.cs b/samples/deferred/DeferredPbrRenderer.cs index 9482386..8327b20 100644 --- a/samples/deferred/DeferredPbrRenderer.cs +++ b/samples/deferred/DeferredPbrRenderer.cs @@ -330,6 +330,10 @@ namespace deferred { 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) { diff --git a/samples/deferred/main.cs b/samples/deferred/main.cs index 1e32c50..a735ee9 100644 --- a/samples/deferred/main.cs +++ b/samples/deferred/main.cs @@ -22,7 +22,7 @@ namespace deferred { #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; @@ -56,29 +56,11 @@ namespace deferred { 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; @@ -103,18 +85,18 @@ namespace deferred { 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) @@ -134,8 +116,7 @@ namespace deferred { 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); @@ -181,6 +162,21 @@ namespace deferred { } 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; @@ -208,8 +204,8 @@ namespace deferred { 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); @@ -236,133 +232,145 @@ namespace deferred { } 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; } @@ -372,7 +380,7 @@ namespace deferred { dev.WaitIdle (); if (disposing) { if (!isDisposed) { - frameBuffers?.Dispose(); + frameBuffers?.Dispose (); renderer?.Dispose (); plToneMap?.Dispose (); descriptorPool?.Dispose (); diff --git a/samples/shadow/main.cs b/samples/shadow/main.cs index 56ba57f..118e5a2 100644 --- a/samples/shadow/main.cs +++ b/samples/shadow/main.cs @@ -58,21 +58,6 @@ namespace deferred { 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; diff --git a/samples/vkeEditor/CrowPipeline.cs b/samples/vkeEditor/CrowPipeline.cs index c5940b9..6fbb907 100644 --- a/samples/vkeEditor/CrowPipeline.cs +++ b/samples/vkeEditor/CrowPipeline.cs @@ -7,6 +7,7 @@ using System.Threading; using Glfw; using vke; using Vulkan; +using Image = vke.Image; namespace vkeEditor { diff --git a/vke/src/StbImage.cs b/vke/src/StbImage.cs index d56ef18..9f75677 100644 --- a/vke/src/StbImage.cs +++ b/vke/src/StbImage.cs @@ -6,24 +6,24 @@ using System.IO; 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 @@ -95,7 +95,7 @@ namespace vke { 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 diff --git a/vke/src/Utils.cs b/vke/src/Utils.cs index 0a18818..473a7e2 100644 --- a/vke/src/Utils.cs +++ b/vke/src/Utils.cs @@ -10,7 +10,6 @@ using System.Xml.Serialization; namespace Vulkan { public static partial class Utils { - public static string DataDirectory => "../../../datas/"; /// Throw an erro if VkResult != Success. public static void CheckResult (VkResult result, string errorString = "Call failed") { if (result != VkResult.Success) diff --git a/vke/src/base/HostBuffer.cs b/vke/src/base/HostBuffer.cs index f61cb84..9e9bf2e 100644 --- a/vke/src/base/HostBuffer.cs +++ b/vke/src/base/HostBuffer.cs @@ -52,7 +52,8 @@ namespace vke { public HostBuffer (Device device, VkBufferUsageFlags usage, T[] data, bool keepMapped = false, bool coherentMem = true) : base (device, usage, (ulong)(Marshal.SizeOf () * data.Length), keepMapped, coherentMem) { TSize = Marshal.SizeOf (); - Map (); + if (!keepMapped) + Map (); Update (data, createInfo.size); if (!keepMapped) Unmap (); diff --git a/vke/src/base/SwapChain.cs b/vke/src/base/SwapChain.cs index dba30fd..be67ed6 100644 --- a/vke/src/base/SwapChain.cs +++ b/vke/src/base/SwapChain.cs @@ -77,7 +77,7 @@ namespace vke { } } 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); -- 2.47.3