Skip to content

Commit

Permalink
Fix Clang 18 CI
Browse files Browse the repository at this point in the history
  • Loading branch information
stripe2933 committed Jan 28, 2025
1 parent 872851c commit 5344db3
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 67 deletions.
1 change: 1 addition & 0 deletions impl/vulkan/Frame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::uint16_t>::max();

Expand Down
141 changes: 74 additions & 67 deletions interface/vulkan/buffer/Materials.cppm
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::int16_t>(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<GpuMaterial>.
// TODO: change it to use ranges::views::concat when available.
std::vector<GpuMaterial> 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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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<std::int16_t>(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();

Expand Down

0 comments on commit 5344db3

Please sign in to comment.