From 5344db37b9c6515645d7d20feff6c5439ac0db16 Mon Sep 17 00:00:00 2001 From: LEE KYOUNGHEON Date: Wed, 29 Jan 2025 00:26:46 +0900 Subject: [PATCH] Fix Clang 18 CI --- impl/vulkan/Frame.cpp | 1 + interface/vulkan/buffer/Materials.cppm | 141 +++++++++++++------------ 2 files changed, 75 insertions(+), 67 deletions(-) diff --git a/impl/vulkan/Frame.cpp b/impl/vulkan/Frame.cpp index 7fe45ab..8ea21a5 100644 --- a/impl/vulkan/Frame.cpp +++ b/impl/vulkan/Frame.cpp @@ -13,6 +13,7 @@ import :helpers.fastgltf; import :helpers.functional; import :helpers.ranges; import :vulkan.ag.DepthPrepass; +import :vulkan.buffer.IndirectDrawCommands; constexpr auto NO_INDEX = std::numeric_limits::max(); diff --git a/interface/vulkan/buffer/Materials.cppm b/interface/vulkan/buffer/Materials.cppm index c12fb36..552adbd 100644 --- a/interface/vulkan/buffer/Materials.cppm +++ b/interface/vulkan/buffer/Materials.cppm @@ -86,79 +86,86 @@ namespace vk_gltf_viewer::vulkan::buffer { const fastgltf::Asset &asset, const Gpu &gpu ) const { - vku::AllocatedBuffer buffer = vku::MappedBuffer { - gpu.allocator, - std::from_range, ranges::views::concat( - to_range(value_if(useFallbackMaterialAtZero, []() { return GpuMaterial{}; })), // fallback material if required - asset.materials | std::views::transform([&](const fastgltf::Material& material) { - GpuMaterial gpuMaterial { - .baseColorFactor = glm::gtc::make_vec4(material.pbrData.baseColorFactor.data()), - .metallicFactor = material.pbrData.metallicFactor, - .roughnessFactor = material.pbrData.roughnessFactor, - .emissiveFactor = glm::gtc::make_vec3(material.emissiveFactor.data()), - .alphaCutOff = material.alphaCutoff, - }; - - if (const auto& baseColorTexture = material.pbrData.baseColorTexture) { - gpuMaterial.baseColorTexcoordIndex = baseColorTexture->texCoordIndex; - gpuMaterial.baseColorTextureIndex = static_cast(baseColorTexture->textureIndex); - - if (const auto &transform = baseColorTexture->transform) { - gpuMaterial.baseColorTextureTransform = getTextureTransform(*transform); - if (transform->texCoordIndex) { - gpuMaterial.baseColorTexcoordIndex = *transform->texCoordIndex; - } - } + // This is workaround for Clang 18's bug that ranges::views::concat cannot be used with std::optional. + // TODO: change it to use ranges::views::concat when available. + std::vector bufferData; + bufferData.reserve(asset.materials.size() + useFallbackMaterialAtZero); + if (useFallbackMaterialAtZero) { + bufferData.push_back({}); + } + bufferData.append_range(asset.materials | std::views::transform([&](const fastgltf::Material& material) { + GpuMaterial gpuMaterial { + .baseColorFactor = glm::gtc::make_vec4(material.pbrData.baseColorFactor.data()), + .metallicFactor = material.pbrData.metallicFactor, + .roughnessFactor = material.pbrData.roughnessFactor, + .emissiveFactor = glm::gtc::make_vec3(material.emissiveFactor.data()), + .alphaCutOff = material.alphaCutoff, + }; + + if (const auto& baseColorTexture = material.pbrData.baseColorTexture) { + gpuMaterial.baseColorTexcoordIndex = baseColorTexture->texCoordIndex; + gpuMaterial.baseColorTextureIndex = static_cast(baseColorTexture->textureIndex); + + if (const auto &transform = baseColorTexture->transform) { + gpuMaterial.baseColorTextureTransform = getTextureTransform(*transform); + if (transform->texCoordIndex) { + gpuMaterial.baseColorTexcoordIndex = *transform->texCoordIndex; } - if (const auto& metallicRoughnessTexture = material.pbrData.metallicRoughnessTexture) { - gpuMaterial.metallicRoughnessTexcoordIndex = metallicRoughnessTexture->texCoordIndex; - gpuMaterial.metallicRoughnessTextureIndex = static_cast(metallicRoughnessTexture->textureIndex); - - if (const auto &transform = metallicRoughnessTexture->transform) { - gpuMaterial.metallicRoughnessTextureTransform = getTextureTransform(*transform); - if (transform->texCoordIndex) { - gpuMaterial.metallicRoughnessTexcoordIndex = *transform->texCoordIndex; - } - } + } + } + if (const auto& metallicRoughnessTexture = material.pbrData.metallicRoughnessTexture) { + gpuMaterial.metallicRoughnessTexcoordIndex = metallicRoughnessTexture->texCoordIndex; + gpuMaterial.metallicRoughnessTextureIndex = static_cast(metallicRoughnessTexture->textureIndex); + + if (const auto &transform = metallicRoughnessTexture->transform) { + gpuMaterial.metallicRoughnessTextureTransform = getTextureTransform(*transform); + if (transform->texCoordIndex) { + gpuMaterial.metallicRoughnessTexcoordIndex = *transform->texCoordIndex; } - if (const auto& normalTexture = material.normalTexture) { - gpuMaterial.normalTexcoordIndex = normalTexture->texCoordIndex; - gpuMaterial.normalTextureIndex = static_cast(normalTexture->textureIndex); - gpuMaterial.normalScale = normalTexture->scale; - - if (const auto &transform = normalTexture->transform) { - gpuMaterial.normalTextureTransform = getTextureTransform(*transform); - if (transform->texCoordIndex) { - gpuMaterial.normalTexcoordIndex = *transform->texCoordIndex; - } - } + } + } + if (const auto& normalTexture = material.normalTexture) { + gpuMaterial.normalTexcoordIndex = normalTexture->texCoordIndex; + gpuMaterial.normalTextureIndex = static_cast(normalTexture->textureIndex); + gpuMaterial.normalScale = normalTexture->scale; + + if (const auto &transform = normalTexture->transform) { + gpuMaterial.normalTextureTransform = getTextureTransform(*transform); + if (transform->texCoordIndex) { + gpuMaterial.normalTexcoordIndex = *transform->texCoordIndex; } - if (const auto& occlusionTexture = material.occlusionTexture) { - gpuMaterial.occlusionTexcoordIndex = occlusionTexture->texCoordIndex; - gpuMaterial.occlusionTextureIndex = static_cast(occlusionTexture->textureIndex); - gpuMaterial.occlusionStrength = occlusionTexture->strength; - - if (const auto &transform = occlusionTexture->transform) { - gpuMaterial.occlusionTextureTransform = getTextureTransform(*transform); - if (transform->texCoordIndex) { - gpuMaterial.occlusionTexcoordIndex = *transform->texCoordIndex; - } - } + } + } + if (const auto& occlusionTexture = material.occlusionTexture) { + gpuMaterial.occlusionTexcoordIndex = occlusionTexture->texCoordIndex; + gpuMaterial.occlusionTextureIndex = static_cast(occlusionTexture->textureIndex); + gpuMaterial.occlusionStrength = occlusionTexture->strength; + + if (const auto &transform = occlusionTexture->transform) { + gpuMaterial.occlusionTextureTransform = getTextureTransform(*transform); + if (transform->texCoordIndex) { + gpuMaterial.occlusionTexcoordIndex = *transform->texCoordIndex; } - if (const auto& emissiveTexture = material.emissiveTexture) { - gpuMaterial.emissiveTexcoordIndex = emissiveTexture->texCoordIndex; - gpuMaterial.emissiveTextureIndex = static_cast(emissiveTexture->textureIndex); - - if (const auto &transform = emissiveTexture->transform) { - gpuMaterial.emissiveTextureTransform = getTextureTransform(*transform); - if (transform->texCoordIndex) { - gpuMaterial.emissiveTexcoordIndex = *transform->texCoordIndex; - } - } + } + } + if (const auto& emissiveTexture = material.emissiveTexture) { + gpuMaterial.emissiveTexcoordIndex = emissiveTexture->texCoordIndex; + gpuMaterial.emissiveTextureIndex = static_cast(emissiveTexture->textureIndex); + + if (const auto &transform = emissiveTexture->transform) { + gpuMaterial.emissiveTextureTransform = getTextureTransform(*transform); + if (transform->texCoordIndex) { + gpuMaterial.emissiveTexcoordIndex = *transform->texCoordIndex; } + } + } - return gpuMaterial; - })), + return gpuMaterial; + })); + + vku::AllocatedBuffer buffer = vku::MappedBuffer { + gpu.allocator, + std::from_range, bufferData, gpu.isUmaDevice ? vk::BufferUsageFlagBits::eStorageBuffer : vk::BufferUsageFlagBits::eTransferSrc, }.unmap();