diff --git a/include/rendering/character_renderer.hpp b/include/rendering/character_renderer.hpp index dd6b31d3..e324622e 100644 --- a/include/rendering/character_renderer.hpp +++ b/include/rendering/character_renderer.hpp @@ -63,7 +63,8 @@ public: void render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet, const Camera& camera); void recreatePipelines(); bool initializeShadow(VkRenderPass shadowRenderPass); - void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix); + void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix, + const glm::vec3& shadowCenter = glm::vec3(0), float shadowRadius = 1e9f); void setInstancePosition(uint32_t instanceId, const glm::vec3& position); void setInstanceRotation(uint32_t instanceId, const glm::vec3& rotation); diff --git a/include/rendering/m2_renderer.hpp b/include/rendering/m2_renderer.hpp index 79931692..6a5a08e2 100644 --- a/include/rendering/m2_renderer.hpp +++ b/include/rendering/m2_renderer.hpp @@ -251,7 +251,8 @@ public: /** * Render depth-only pass for shadow casting */ - void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix, float globalTime = 0.0f); + void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix, float globalTime = 0.0f, + const glm::vec3& shadowCenter = glm::vec3(0), float shadowRadius = 1e9f); /** * Render M2 particle emitters (point sprites) diff --git a/include/rendering/renderer.hpp b/include/rendering/renderer.hpp index 667adc19..c34119cd 100644 --- a/include/rendering/renderer.hpp +++ b/include/rendering/renderer.hpp @@ -226,7 +226,7 @@ private: std::unique_ptr movementSoundManager; std::unique_ptr zoneManager; // Shadow mapping (Vulkan) - static constexpr uint32_t SHADOW_MAP_SIZE = 2048; + static constexpr uint32_t SHADOW_MAP_SIZE = 4096; VkImage shadowDepthImage = VK_NULL_HANDLE; VmaAllocation shadowDepthAlloc = VK_NULL_HANDLE; VkImageView shadowDepthView = VK_NULL_HANDLE; diff --git a/include/rendering/wmo_renderer.hpp b/include/rendering/wmo_renderer.hpp index 86b43352..9d4a62a6 100644 --- a/include/rendering/wmo_renderer.hpp +++ b/include/rendering/wmo_renderer.hpp @@ -152,7 +152,8 @@ public: /** * Render depth-only for shadow casting */ - void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix); + void renderShadow(VkCommandBuffer cmd, const glm::mat4& lightSpaceMatrix, + const glm::vec3& shadowCenter = glm::vec3(0), float shadowRadius = 1e9f); /** * Get number of loaded models diff --git a/src/core/application.cpp b/src/core/application.cpp index 017ee7fe..feba2e76 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -3735,10 +3735,14 @@ void Application::spawnOnlineCreature(uint64_t guid, uint32_t displayId, float x } // Load skin file (only for WotLK M2s - vanilla has embedded skin) - std::string skinPath = m2Path.substr(0, m2Path.size() - 3) + "00.skin"; - auto skinData = assetManager->readFile(skinPath); - if (!skinData.empty() && model.version >= 264) { - pipeline::M2Loader::loadSkin(skinData, model); + if (model.version >= 264) { + std::string skinPath = m2Path.substr(0, m2Path.size() - 3) + "00.skin"; + auto skinData = assetManager->readFile(skinPath); + if (!skinData.empty()) { + pipeline::M2Loader::loadSkin(skinData, model); + } else { + LOG_WARNING("Missing skin file for WotLK creature M2: ", skinPath); + } } // Load external .anim files for sequences without flag 0x20 @@ -5951,10 +5955,14 @@ void Application::processPendingMount() { } // Load skin file (only for WotLK M2s - vanilla has embedded skin) - std::string skinPath = m2Path.substr(0, m2Path.size() - 3) + "00.skin"; - auto skinData = assetManager->readFile(skinPath); - if (!skinData.empty() && model.version >= 264) { - pipeline::M2Loader::loadSkin(skinData, model); + if (model.version >= 264) { + std::string skinPath = m2Path.substr(0, m2Path.size() - 3) + "00.skin"; + auto skinData = assetManager->readFile(skinPath); + if (!skinData.empty()) { + pipeline::M2Loader::loadSkin(skinData, model); + } else { + LOG_WARNING("Missing skin file for WotLK mount M2: ", skinPath); + } } // Load external .anim files (only idle + run needed for mounts) diff --git a/src/rendering/renderer.cpp b/src/rendering/renderer.cpp index 589b73b5..dcf9b586 100644 --- a/src/rendering/renderer.cpp +++ b/src/rendering/renderer.cpp @@ -3907,14 +3907,15 @@ void Renderer::renderShadowPass() { vkCmdSetScissor(currentCmd, 0, 1, &sc); // Phase 7/8: render shadow casters + constexpr float kShadowCullRadius = 180.0f; // match kShadowHalfExtent if (wmoRenderer) { - wmoRenderer->renderShadow(currentCmd, lightSpaceMatrix); + wmoRenderer->renderShadow(currentCmd, lightSpaceMatrix, shadowCenter, kShadowCullRadius); } if (m2Renderer) { - m2Renderer->renderShadow(currentCmd, lightSpaceMatrix, globalTime); + m2Renderer->renderShadow(currentCmd, lightSpaceMatrix, globalTime, shadowCenter, kShadowCullRadius); } if (characterRenderer) { - characterRenderer->renderShadow(currentCmd, lightSpaceMatrix); + characterRenderer->renderShadow(currentCmd, lightSpaceMatrix, shadowCenter, kShadowCullRadius); } vkCmdEndRenderPass(currentCmd);