From dd86f6e9adcdcda9221f7ad59dd08529b484e27d Mon Sep 17 00:00:00 2001 From: emil28092005 Date: Thu, 18 Jun 2026 20:19:16 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20exclude=20Floor=20and=20Grid=20from=20sh?= =?UTF-8?q?adow=20pass=20=E2=80=94=20no=20more=20blocked=20light?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - drawCalls now include castShadow flag (bool) - Floor and Grid entities: castShadow=false (skip in shadow pass) - Shadow pass: foreach with 'if (!dc.castShadow) continue;' - Main pass: renders all objects (floor receives shadows but doesn't cast) --- src/Engine.Graphics.Vulkan/VulkanRenderer.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs index cffad2f..449ea08 100644 --- a/src/Engine.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Engine.Graphics.Vulkan/VulkanRenderer.cs @@ -118,7 +118,7 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen lightProj.M22 *= -1; var lightViewProj = lightView * lightProj; - var drawCalls = new List<(VkBuffer vertexBuf, VkBuffer indexBuf, uint indexCount, Matrix4x4 model)>(); + var drawCalls = new List<(VkBuffer vertexBuf, VkBuffer indexBuf, uint indexCount, Matrix4x4 model, bool castShadow)>(); world.Each((Entity e, ref Transform t, ref Mesh m) => { @@ -133,13 +133,15 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen _meshCache[eid] = entry; } - drawCalls.Add((entry.vb.Buffer, entry.ib.Buffer, entry.indexCount, t.GetMatrix())); + var name = e.Name(); + var castShadow = name != "Floor" && name != "Grid"; + drawCalls.Add((entry.vb.Buffer, entry.ib.Buffer, entry.indexCount, t.GetMatrix(), castShadow)); }); Render(vp, drawCalls, uboData, lightPos, lightColor, lightViewProj); } - private void Render(Matrix4x4 vp, List<(VkBuffer vertexBuf, VkBuffer indexBuf, uint indexCount, Matrix4x4 model)> drawCalls, byte* uboData, Vector4 lightPos, Vector4 lightColor, Matrix4x4 lightViewProj) + private void Render(Matrix4x4 vp, List<(VkBuffer vertexBuf, VkBuffer indexBuf, uint indexCount, Matrix4x4 model, bool castShadow)> drawCalls, byte* uboData, Vector4 lightPos, Vector4 lightColor, Matrix4x4 lightViewProj) { _frameResources.WaitFrame(_frameIndex); @@ -230,16 +232,9 @@ internal sealed unsafe class VulkanRenderer : IRenderer, Engine.Graphics.IScreen foreach (var dc in drawCalls) { + if (!dc.castShadow) continue; + var vertexBuf = dc.vertexBuf; - ulong offset = 0; - Vk.vkCmdBindVertexBuffers(cmd, 0, 1, &vertexBuf, &offset); - Vk.vkCmdBindIndexBuffer(cmd, dc.indexBuf, 0, 1); - - var model = dc.model; - Vk.vkCmdPushConstants(cmd, _shadowMap.PipelineLayout, VkShaderStageFlags.Vertex, 0, 64, &model); - - var lvpCopy = lightViewProj; - Vk.vkCmdPushConstants(cmd, _shadowMap.PipelineLayout, VkShaderStageFlags.Vertex | VkShaderStageFlags.Fragment, 96, 64, &lvpCopy); Vk.vkCmdDrawIndexed(cmd, dc.indexCount, 1, 0, 0, 0); }