diff --git a/.gitignore b/.gitignore index 354be3d7..7c4ba716 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ nuget-feed **/*.user **/BuildOutput.sarif sarif-output +**/.DS_Store diff --git a/Directory.Build.props b/Directory.Build.props index d780ccc4..c5b0fa29 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ $(RestoreSources);../nuget-feed;https://api.nuget.org/v3/index.json - g603c7f2521 + g9c18bddece 0e92bb5 9b51cce 331cf83 diff --git a/extern/Veldrid b/extern/Veldrid index 603c7f25..9c18bdde 160000 --- a/extern/Veldrid +++ b/extern/Veldrid @@ -1 +1 @@ -Subproject commit 603c7f25219588229248594352679a73270cdd95 +Subproject commit 9c18bddece5f12dc2794f4e57d9a5dfc4d42d063 diff --git a/get-dependencies.sh b/get-dependencies.sh index 35949ada..5ab93c96 100755 --- a/get-dependencies.sh +++ b/get-dependencies.sh @@ -33,14 +33,14 @@ MlangHash=`git -C extern/Mlang rev-parse --short HEAD` NLayerHash=`git -C extern/NLayer rev-parse --short HEAD` Configuration=Release ConfigSuffix= -VeldridHash=notactuallyused +VeldridHash=4.9.0-717ab09d CommonFlags="--include-symbols -p:EmbedAllSources=true -p:DebugType=portable -p:SymbolPackageFormat=snupkg -clp:ErrorsOnly -o nuget-feed" dotnet pack extern/DefaultEcs/source/DefaultEcs/DefaultEcs.csproj -c SafeDebug $CommonFlags "-p:TEST=true" --version-suffix safe-$DefaultEcsHash dotnet pack extern/DefaultEcs/source/DefaultEcs/DefaultEcs.csproj -c $Configuration $CommonFlags "-p:TEST=true" --version-suffix $DefaultEcsHash$ConfigSuffix -dotnet pack extern/Veldrid/src/Veldrid/Veldrid.csproj -c $Configuration $CommonFlags "-p:ExcludeOpenGL=true" "-p:ExcludeD3D11=true" --version-suffix $VeldridHash$ConfigSuffix -dotnet pack extern/Veldrid/src/Veldrid.MetalBindings/Veldrid.MetalBindings.csproj -c $Configuration $CommonFlags --version-suffix $VeldridHash$ConfigSuffix -dotnet pack extern/Veldrid/src/Veldrid.RenderDoc/Veldrid.RenderDoc.csproj -c $Configuration $CommonFlags --version-suffix $VeldridHash$ConfigSuffix +dotnet pack extern/Veldrid/src/Veldrid/Veldrid.csproj -c $Configuration $CommonFlags "-p:ExcludeOpenGL=true" "-p:ExcludeD3D11=true" "-p:ExcludeMetal=true" +dotnet pack extern/Veldrid/src/Veldrid.MetalBindings/Veldrid.MetalBindings.csproj -c $Configuration $CommonFlags +dotnet pack extern/Veldrid/src/Veldrid.RenderDoc/Veldrid.RenderDoc.csproj -c $Configuration $CommonFlags dotnet pack extern/ImGui.NET/src/ImGui.NET/ImGui.NET.csproj -c $Configuration $CommonFlags -p:PackagePrereleaseIdentifier=-$ImGuiNETHash$ConfigSuffix dotnet pack extern/ImGui.NET/src/ImGuizmo.NET/ImGuizmo.NET.csproj -c $Configuration $CommonFlags -p:PackagePrereleaseIdentifier=-$ImGuiNETHash$ConfigSuffix dotnet pack extern/Mlang/Mlang/Mlang.csproj -c $Configuration $CommonFlags --version-suffix $MlangHash diff --git a/zzre.core/imgui/FramebufferArea.cs b/zzre.core/imgui/FramebufferArea.cs index f7cd264a..4909afc7 100644 --- a/zzre.core/imgui/FramebufferArea.cs +++ b/zzre.core/imgui/FramebufferArea.cs @@ -48,12 +48,12 @@ public FramebufferArea(Window parent, GraphicsDevice device) protected override void DisposeManaged() { base.DisposeManaged(); + if (bindingHandle != IntPtr.Zero) + ImGuiRenderer.RemoveImGuiBinding(targetColor); WindowContainer.OnceBeforeUpdate += () => { - // Delay disposal so we do not attempt to render the ImGui commands - // with the framebuffer texture already disposed - if (bindingHandle != IntPtr.Zero) - ImGuiRenderer.RemoveImGuiBinding(targetColor); + // Delay disposal so we do not attempt to dispose resources + // that are still in-flight bindingHandle = IntPtr.Zero; targetColor.Dispose(); targetDepth.Dispose(); diff --git a/zzre.core/imgui/ImGuiRenderer.cs b/zzre.core/imgui/ImGuiRenderer.cs index fad83db2..afd5b591 100644 --- a/zzre.core/imgui/ImGuiRenderer.cs +++ b/zzre.core/imgui/ImGuiRenderer.cs @@ -133,12 +133,12 @@ public void CreateDeviceResources(GraphicsDevice gd, OutputDescription outputDes _gd = gd; _colorSpaceHandling = colorSpaceHandling; ResourceFactory factory = gd.ResourceFactory; - _vertexBuffer = factory.CreateBuffer(new BufferDescription(10000, BufferUsage.VertexBuffer | BufferUsage.Dynamic)); + _vertexBuffer = factory.CreateBuffer(new BufferDescription(10000, BufferUsage.VertexBuffer | BufferUsage.DynamicWrite)); _vertexBuffer.Name = "ImGui.NET Vertex Buffer"; - _indexBuffer = factory.CreateBuffer(new BufferDescription(2000, BufferUsage.IndexBuffer | BufferUsage.Dynamic)); + _indexBuffer = factory.CreateBuffer(new BufferDescription(2000, BufferUsage.IndexBuffer | BufferUsage.DynamicWrite)); _indexBuffer.Name = "ImGui.NET Index Buffer"; - _projMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.Dynamic)); + _projMatrixBuffer = factory.CreateBuffer(new BufferDescription(64, BufferUsage.UniformBuffer | BufferUsage.DynamicWrite)); _projMatrixBuffer.Name = "ImGui.NET Projection Buffer"; byte[] vertexShaderBytes = GetEmbeddedResourceBytes("imgui-vertex"); @@ -179,7 +179,7 @@ public void CreateDeviceResources(GraphicsDevice gd, OutputDescription outputDes [_layout, _textureLayout], outputDescription, ResourceBindingModel.Default); - _pipeline = factory.CreateGraphicsPipeline(ref pd); + _pipeline = factory.CreateGraphicsPipeline(pd); _pipeline.Name = "ImGui.NET Pipeline"; _mainResourceSet = factory.CreateResourceSet(new ResourceSetDescription(_layout, @@ -258,15 +258,8 @@ public void RemoveImGuiBinding(Texture texture) /// /// Retrieves the shader texture binding for the given helper handle. /// - public ResourceSet GetImageResourceSet(IntPtr imGuiBinding) - { - if (!_viewsById.TryGetValue(imGuiBinding, out ResourceSetInfo rsi)) - { - throw new InvalidOperationException("No registered ImGui binding with id " + imGuiBinding.ToString()); - } - - return rsi.ResourceSet; - } + private ResourceSet GetImageResourceSet(IntPtr imGuiBinding) => + _viewsById.GetValueOrDefault(imGuiBinding).ResourceSet; public void ClearCachedImageResources() { @@ -628,7 +621,7 @@ private unsafe void RenderImDrawData(ImDrawDataPtr draw_data, GraphicsDevice gd, if (totalVBSize > _vertexBuffer.SizeInBytes) { _vertexBuffer.Dispose(); - _vertexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)(totalVBSize * 1.5f), BufferUsage.VertexBuffer | BufferUsage.Dynamic)); + _vertexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)(totalVBSize * 1.5f), BufferUsage.VertexBuffer | BufferUsage.DynamicWrite)); _vertexBuffer.Name = $"ImGui.NET Vertex Buffer"; } @@ -636,7 +629,7 @@ private unsafe void RenderImDrawData(ImDrawDataPtr draw_data, GraphicsDevice gd, if (totalIBSize > _indexBuffer.SizeInBytes) { _indexBuffer.Dispose(); - _indexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)(totalIBSize * 1.5f), BufferUsage.IndexBuffer | BufferUsage.Dynamic)); + _indexBuffer = gd.ResourceFactory.CreateBuffer(new BufferDescription((uint)(totalIBSize * 1.5f), BufferUsage.IndexBuffer | BufferUsage.DynamicWrite)); _indexBuffer.Name = $"ImGui.NET Index Buffer"; } @@ -705,7 +698,10 @@ private unsafe void RenderImDrawData(ImDrawDataPtr draw_data, GraphicsDevice gd, } else { - cl.SetGraphicsResourceSet(1, GetImageResourceSet(pcmd.TextureId)); + var resourceSet = GetImageResourceSet(pcmd.TextureId); + if (resourceSet == null) + continue; + cl.SetGraphicsResourceSet(1, resourceSet); } } diff --git a/zzre.core/imgui/WindowContainer.cs b/zzre.core/imgui/WindowContainer.cs index 91726676..bcac7c80 100644 --- a/zzre.core/imgui/WindowContainer.cs +++ b/zzre.core/imgui/WindowContainer.cs @@ -50,7 +50,7 @@ public WindowContainer(SdlWindow window, GraphicsDevice device) { Device = device; - var fb = device.MainSwapchain.Framebuffer; + var fb = device.MainSwapchain!.Framebuffer; ImGuiRenderer = new(device, fb.OutputDescription, (int)fb.Width, (int)fb.Height, ColorSpaceHandling.Legacy, callNewFrame: false); ImGuizmoNET.ImGuizmo.SetImGuiContext(ImGui.GetCurrentContext()); ImGuizmoNET.ImGuizmo.AllowAxisFlip(false); @@ -186,7 +186,7 @@ public void Render() Device.WaitForFence(fence); fence.Reset(); commandList.Begin(); - commandList.SetFramebuffer(Device.MainSwapchain.Framebuffer); + commandList.SetFramebuffer(Device.MainSwapchain!.Framebuffer); commandList.ClearColorTarget(0, RgbaFloat.Cyan); ImGuiRenderer.Render(Device, commandList); commandList.End(); diff --git a/zzre.core/rendering/BaseMaterial.cs b/zzre.core/rendering/BaseMaterial.cs index d1660363..c7408be6 100644 --- a/zzre.core/rendering/BaseMaterial.cs +++ b/zzre.core/rendering/BaseMaterial.cs @@ -48,7 +48,7 @@ public void Apply(CommandList cl) resourceSet = factory.CreateResourceSet(new ResourceSetDescription() { Layout = layout, - BoundResources = Bindings.Select(b => b.Resource).ToArray() + BoundResources = Bindings.Select(b => b.Resource).ToArray()! }); resourceSet.Name = $"{parentName} Set {index}"; } diff --git a/zzre.core/rendering/DynamicGraphicsBuffer.cs b/zzre.core/rendering/DynamicGraphicsBuffer.cs index ea11a8e2..61f91547 100644 --- a/zzre.core/rendering/DynamicGraphicsBuffer.cs +++ b/zzre.core/rendering/DynamicGraphicsBuffer.cs @@ -151,7 +151,7 @@ public void Update(CommandList cl) foreach (var range in dirtyBytes) { var offset = range.GetOffset(capacityInBytes); - cl.UpdateBuffer(OptionalBuffer, (uint)offset, bytes.AsSpan(range)); + cl.UpdateBuffer(OptionalBuffer!, (uint)offset, bytes.AsSpan(range)); } dirtyBytes.Clear(); } diff --git a/zzre.core/rendering/DynamicMesh.cs b/zzre.core/rendering/DynamicMesh.cs index 2132c9a5..602c1f2b 100644 --- a/zzre.core/rendering/DynamicMesh.cs +++ b/zzre.core/rendering/DynamicMesh.cs @@ -28,7 +28,7 @@ public unsafe Attribute(GraphicsDevice device, bool dynamic, string meshName, st { Name = name; buffer = new(device, - BufferUsage.VertexBuffer | (dynamic ? BufferUsage.Dynamic : default), + BufferUsage.VertexBuffer | (dynamic ? BufferUsage.DynamicWrite : default), $"{meshName} {name}", minGrowFactor) { @@ -82,7 +82,7 @@ public DynamicMesh(ITagContainer diContainer, this.minGrowFactor = minGrowFactor; indexBuffer = new(graphicsDevice, - BufferUsage.IndexBuffer | (dynamic ? BufferUsage.Dynamic : default), + BufferUsage.IndexBuffer | (dynamic ? BufferUsage.DynamicWrite : default), name + " Indices", minGrowFactor) { diff --git a/zzre.core/rendering/MlangMaterial.cs b/zzre.core/rendering/MlangMaterial.cs index bd2a95df..6158c88a 100644 --- a/zzre.core/rendering/MlangMaterial.cs +++ b/zzre.core/rendering/MlangMaterial.cs @@ -110,7 +110,7 @@ public void ApplyBindings(CommandList cl) throw new InvalidOperationException($"Binding {bindingInfo.Name} is not set"); setDescriptions[bindingInfo.SetIndex].BoundResources[bindingInfo.BindingIndex] = binding.Resource; } - resourceSets = setDescriptions.Select(Device.ResourceFactory.CreateResourceSet).ToArray(); + resourceSets = setDescriptions.Select(d => Device.ResourceFactory.CreateResourceSet(d)).ToArray(); } for (int i = 0; i < resourceSets.Length; i++) cl.SetGraphicsResourceSet((uint)i, resourceSets[i]); diff --git a/zzre.core/rendering/ShaderVariantCollection.cs b/zzre.core/rendering/ShaderVariantCollection.cs index 631e46d4..978e9399 100644 --- a/zzre.core/rendering/ShaderVariantCollection.cs +++ b/zzre.core/rendering/ShaderVariantCollection.cs @@ -159,7 +159,7 @@ private ResourceLayout[] CreateResourceLayouts(ShaderVariant variant) layouts[binding.SetIndex].Elements[binding.BindingIndex] = new( binding.Name, kind, ShaderStages.Fragment | ShaderStages.Vertex); } - return layouts.Select(Factory.CreateResourceLayout).ToArray(); + return layouts.Select(l => Factory.CreateResourceLayout(l)).ToArray(); } private BlendStateDescription CreateBlendState(PipelineState state) => new() diff --git a/zzre.core/rendering/UniformBuffer.cs b/zzre.core/rendering/UniformBuffer.cs index 6e337b36..62bf7698 100644 --- a/zzre.core/rendering/UniformBuffer.cs +++ b/zzre.core/rendering/UniformBuffer.cs @@ -25,7 +25,7 @@ public UniformBuffer(ResourceFactory factory, bool dynamic = false) uint alignedSize = (uint)Marshal.SizeOf(); alignedSize = (alignedSize + 15) / 16 * 16; Buffer = factory.CreateBuffer(new BufferDescription(alignedSize, BufferUsage.UniformBuffer | - (dynamic ? BufferUsage.Dynamic : default))); + (dynamic ? BufferUsage.DynamicWrite : default))); Buffer.Name = $"{GetType().Name} {GetHashCode()}"; } diff --git a/zzre/game/systems/model/ModelRenderer.cs b/zzre/game/systems/model/ModelRenderer.cs index 62a5c592..3f131ddc 100644 --- a/zzre/game/systems/model/ModelRenderer.cs +++ b/zzre/game/systems/model/ModelRenderer.cs @@ -93,11 +93,15 @@ private void Update( else clumpCounts[^1] = clumpCounts[^1].Increment(); + var m = entity.TryGet().GetValueOrDefault(components.TexShift.Default).Matrix; instanceArena!.Add(new() { tint = materialInfo.Color, world = location.LocalToWorld, - texShift = entity.TryGet().GetValueOrDefault(components.TexShift.Default).Matrix + texShift = new( + m.M11, m.M12, 0f, + m.M21, m.M22, 0f, + m.M31, m.M32, 1f) }); } diff --git a/zzre/game/systems/sound/SoundEmitter.cs b/zzre/game/systems/sound/SoundEmitter.cs index ee3da8ad..95fb2f76 100644 --- a/zzre/game/systems/sound/SoundEmitter.cs +++ b/zzre/game/systems/sound/SoundEmitter.cs @@ -55,7 +55,7 @@ public override void Dispose() // just to be safe: also delete all sources using (context.EnsureIsCurrent()) - device.AL.DeleteSources(sourcePool.ToArray()); + device.AL.DeleteSources([.. sourcePool]); sourcePool.Clear(); spawnEmitterSubscription?.Dispose(); diff --git a/zzre/materials/ModelMaterial.cs b/zzre/materials/ModelMaterial.cs index 11090481..47986589 100644 --- a/zzre/materials/ModelMaterial.cs +++ b/zzre/materials/ModelMaterial.cs @@ -1,6 +1,7 @@ using System; using System.Numerics; using System.Runtime.InteropServices; +using Silk.NET.Maths; using zzio; using zzre.rendering; @@ -28,7 +29,7 @@ public struct ModelFactors public struct ModelInstance { public Matrix4x4 world; - public Matrix3x2 texShift; + public Matrix3X3 texShift; public IColor tint; } @@ -111,7 +112,7 @@ public ModelMaterial(ITagContainer diContainer) : base(diContainer, "model") public sealed class ModelInstanceBuffer : DynamicMesh { private readonly Attribute attrWorld; - private readonly Attribute attrTexShift; + private readonly Attribute> attrTexShift; private readonly Attribute attrTint; public ModelInstanceBuffer(ITagContainer diContainer, @@ -121,7 +122,7 @@ public ModelInstanceBuffer(ITagContainer diContainer, : base(diContainer, dynamic, name) { attrWorld = AddAttribute("world"); - attrTexShift = AddAttribute("inTexShift"); + attrTexShift = AddAttribute>("inTexShift"); attrTint = AddAttribute("inTint"); Preallocate(preallocateInstances, 0); } diff --git a/zzre/rendering/SkeletonPoseBinding.cs b/zzre/rendering/SkeletonPoseBinding.cs index 8054b9ea..c9d2a706 100644 --- a/zzre/rendering/SkeletonPoseBinding.cs +++ b/zzre/rendering/SkeletonPoseBinding.cs @@ -25,7 +25,7 @@ public Skeleton? Skeleton poseBuffer?.Dispose(); poseBuffer = Parent.Device.ResourceFactory.CreateBuffer(new BufferDescription( MaxBoneCount * 4 * 4 * sizeof(float), - BufferUsage.StructuredBufferReadOnly | BufferUsage.Dynamic, + BufferUsage.StructuredBufferReadOnly | BufferUsage.DynamicWrite, 4 * 4 * sizeof(float))); poseBuffer.Name = $"{skeleton.Name} Pose {GetHashCode()}"; poseBufferRange = new DeviceBufferRange(PoseBuffer, 0, poseBuffer.SizeInBytes); diff --git a/zzre/shaders/model.mlang b/zzre/shaders/model.mlang index 4b1ad16c..e61bebc9 100644 --- a/zzre/shaders/model.mlang +++ b/zzre/shaders/model.mlang @@ -10,11 +10,8 @@ option HasFog; variants exclude if (IsSkinned && (IsInstanced || HasEnvMap || HasTexShift)); variants exclude if (!IsInstanced && (HasTexShift || HasEnvMap || !DepthWrite || !DepthTest || Blend != IsOpaque)); // we only use opaque materials for non-instanced currently -attributes -{ - float3 inPos; - byte4_norm inColor; -} +attributes float3 inPos; +attributes if (!IsSkinned) byte4_norm inColor; attributes if (HasEnvMap) float3 inNormal; attributes if (!HasEnvMap) float2 inUV; attributes if (IsSkinned) @@ -24,7 +21,7 @@ attributes if (IsSkinned) } instances mat4 world; -instances if (HasTexShift) mat3x2 inTexShift; +instances if (HasTexShift) mat3 inTexShift; instances byte4_norm inTint; varying @@ -130,7 +127,7 @@ vertex else uv = inUV; if (HasTexShift) - uv = inTexShift * vec3(uv, 1); + uv = vec3(inTexShift * vec3(uv, 1)).xy; varUV = uv; if (IsSkinned) diff --git a/zzre/tools/TestRaycaster.cs b/zzre/tools/TestRaycaster.cs index 18619d6e..62ff194e 100644 --- a/zzre/tools/TestRaycaster.cs +++ b/zzre/tools/TestRaycaster.cs @@ -5,7 +5,6 @@ using Veldrid; using zzre.imgui; using zzre.rendering; -using System.Linq; using Quaternion = System.Numerics.Quaternion; using zzio.vfs; using zzio.rwbs; @@ -154,7 +153,7 @@ private void OnRender() : IColor.Black; }); - device.UpdateTexture(fbArea.Framebuffer.ColorTargets.First().Target, pixels, 0, 0, 0, + device.UpdateTexture(fbArea.Framebuffer.ColorTargets[0].Target, pixels!, 0, 0, 0, fbArea.Framebuffer.Width, fbArea.Framebuffer.Height, 1, 0, 0); }