]> O.S.I.I.S - jp/vke.net.git/commitdiff
wip
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 18 Jul 2020 18:37:56 +0000 (20:37 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 18 Jul 2020 18:37:56 +0000 (20:37 +0200)
25 files changed:
Directory.Build.props
addons/CrowWindow/CrowWindow.csproj
addons/CrowWindow/VkCrowWindow.cs
addons/gltfLoader/gltfLoader.csproj
samples/Directory.Build.props
samples/Model/main.cs
samples/RayTests/main.cs
samples/Textured/main.cs
samples/TexturedCube/main.cs
samples/common/CrowWin.cs [deleted file]
samples/common/Utils.cs [new file with mode: 0644]
samples/compute/delaunay.cs
samples/crowWin/FSQPipeline.cs [deleted file]
samples/crowWin/Program.cs
samples/crowWin/VkCrowWindow.cs [deleted file]
samples/crowWin/crowWin.csproj
samples/crowWin/shaders/simpletexture.frag [deleted file]
samples/deferred/DeferredPbrRenderer.cs
samples/deferred/main.cs
samples/shadow/main.cs
samples/vkeEditor/CrowPipeline.cs
vke/src/StbImage.cs
vke/src/Utils.cs
vke/src/base/HostBuffer.cs
vke/src/base/SwapChain.cs

index a755d5ddd368ce8c066f84f6840163cf7e47d894..e13416fd3b133c960e673ec022108399f3ddabf0 100644 (file)
@@ -2,18 +2,22 @@
        <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>
index a02a429aed3abdbd662067a9f4e77e65deeb8599..f9372c687fcf9bcf07eb6b9e7475106c94debca1 100644 (file)
@@ -6,7 +6,7 @@
     <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>
@@ -17,7 +17,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Crow" Version="0.9.0-beta" />
+    <PackageReference Include="Crow" Version="0.9.1-beta" />
   </ItemGroup>
   <ItemGroup>
     <Compile Remove="main.cs" />
index 636ddf23b0fccce1a4002b77ab77274f959a20e8..6a3f951c818250aed5477c270f3852f53ad2a423 100644 (file)
@@ -25,7 +25,8 @@ namespace vke {
 
                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;
@@ -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 () {
index 9c83a86ef4650cbff3de447af4bbc6801684c397..9ef3364c4fda1512818200e49ef80a1da850c330 100644 (file)
@@ -6,7 +6,7 @@
     <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>
index 93eff46b4e55f88ed13ceeb0a361ace6513de777..d18a95fa1ab2442e24880857a6a786f740ec1f02 100644 (file)
                <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">
@@ -45,5 +43,6 @@
                <EmbeddedResource Include="ui\**\*.*">
                        <LogicalName>ui.%(Filename)%(Extension)</LogicalName>
                </EmbeddedResource>
-       </ItemGroup>     
+       </ItemGroup>
+       
 </Project>
index 67194563a75218c240d7d0a93b80df42490b1d0a..e1b38c01465aeac2aa2e17bc2bf0888b689c25a0 100644 (file)
@@ -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);
index e3c687ab10d631f497276ea02c5e00cc8feaf147..37917b513d66e0c9e4e9d96aeef96f993979b212 100644 (file)
@@ -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<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);
                        }
@@ -265,8 +253,8 @@ namespace deferred {
 
                        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);
                        }
                }
@@ -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;
index f2702d6e36e18ab43fb0eb58fe8eedb16d3c4c0d..bf903f1d53138db982be223c4b7cfc5a3ffad43c 100644 (file)
@@ -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 () {
index c91c22ae3ef2c42d22427ceb13df019b7c57d536..b42ec9d69f821f3ce75c224466b22b061e07abbc 100644 (file)
@@ -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 (file)
index ee7b2ac..0000000
+++ /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<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
-       }
-}
diff --git a/samples/common/Utils.cs b/samples/common/Utils.cs
new file mode 100644 (file)
index 0000000..94cab8a
--- /dev/null
@@ -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",
+               };
+       }
+}
index 228f6ec310dabb1c3575bf56ea99778aa991de27..97bfb5da1eafa55c084aa9725895c5809440cc4d 100644 (file)
@@ -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 (file)
index db4cadb..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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);
-               }
-       }
-
-}
index dd493fd8572a706242103451f8e6ce998f02fd6b..096f5cefb183add0e73cdb7c6763cd5fbb8410fd 100644 (file)
@@ -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 (file)
index 9e05b92..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-// 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);
-               }
-
-       }
-}
index 50911273b26a5c6086769526d157b20bfdfcdc06..6d5941de6b3ba25e09cab92a31e7852740430748 100644 (file)
@@ -1,9 +1,6 @@
 <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" />-->
@@ -11,4 +8,7 @@
                        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
                </None>
        </ItemGroup>    
+       <ItemGroup>
+         <ProjectReference Include="..\..\addons\CrowWindow\CrowWindow.csproj" />
+       </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/samples/crowWin/shaders/simpletexture.frag b/samples/crowWin/shaders/simpletexture.frag
deleted file mode 100644 (file)
index 95cab5f..0000000
+++ /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);
-}
index 9482386fb19d335aec781550b52648bdcba55277..8327b202f54040251fa34fac174fe50542965d0d 100644 (file)
@@ -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) {
index 1e32c50a70afeb30006302f4217cb25e8bf4fd88..a735ee9a6f8a22a1942cdacfda780afdccb57b0e 100644 (file)
@@ -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 ();
index 56ba57f2c75356deb191c0a59176596bb1d95228..118e5a20cbe3d57d6ac5a840e3166bdb19954662 100644 (file)
@@ -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;
index c5940b97fc1e4dee7f693039d9212de0ef449e5a..6fbb907a3fbce894eaeebcfb1cecb318108cf71f 100644 (file)
@@ -7,6 +7,7 @@ using System.Threading;
 using Glfw;
 using vke;
 using Vulkan;
+using Image = vke.Image;
 
 namespace vkeEditor {
 
index d56ef18637de728c7b112c3eee3124e3c0ad8c5c..9f75677bedc454840ec083d03fc4707d957f97f4 100644 (file)
@@ -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
index 0a188184e34959a5f4c72fe715f95b3aaa4358ee..473a7e253ece89d6dee9e7b44501783948523ce6 100644 (file)
@@ -10,7 +10,6 @@ using System.Xml.Serialization;
 
 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)
index f61cb845f7ccaa23e3a85dbf06afb1dde5b5911b..9e9bf2e02f1f15792607fe14d382402dfb8319c9 100644 (file)
@@ -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<T> () * data.Length), keepMapped, coherentMem) {
                        TSize = Marshal.SizeOf<T> ();
-                       Map ();
+                       if (!keepMapped)
+                               Map ();
                        Update (data, createInfo.size);
                        if (!keepMapped)
                                Unmap ();
index dba30fd94e4c697e6b05cfb8d072690309d3c213..be67ed6b95d1cab8925e66916ec2b274d86b91eb 100644 (file)
@@ -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);