Program Listing for File MeshRange.ixx#
↰ Return to documentation for file (Src/GraphicsEngineVulkan/scene/MeshRange.ixx)
module;
#include <cstddef>
#include <vector>
export module kataglyphis.vulkan.mesh_range;
import kataglyphis.vulkan.vertex;
export namespace Kataglyphis {
struct MeshRange
{
std::size_t vertexBase;
std::size_t vertexCount;
std::size_t indexStart;
std::size_t indexCount;
std::size_t triStart;
std::size_t triCount;
// glTF material.doubleSided for this range's material; uploadParsed forwards
// it to add_new_mesh so the raster pass can disable back-face culling for
// this mesh only. false for single-sided / absent material (and always
// false for OBJ, which has no double-sided concept).
bool doubleSided = false;
};
struct MeshSlice
{
std::vector<Vertex> vertices;
std::vector<unsigned int> indices;
std::vector<unsigned int> materialIndex;
};
MeshSlice sliceMeshRange(const MeshRange &range,
const std::vector<Vertex> &vertices,
const std::vector<unsigned int> &indices,
const std::vector<unsigned int> &materialIndex)
{
if (range.vertexBase > vertices.size() || range.vertexCount > vertices.size() - range.vertexBase
|| range.indexStart > indices.size() || range.indexCount > indices.size() - range.indexStart
|| range.triStart > materialIndex.size() || range.triCount > materialIndex.size() - range.triStart) {
return {};
}
MeshSlice slice;
slice.vertices.assign(vertices.begin() + static_cast<std::ptrdiff_t>(range.vertexBase),
vertices.begin() + static_cast<std::ptrdiff_t>(range.vertexBase + range.vertexCount));
slice.indices.reserve(range.indexCount);
for (std::size_t i = 0; i < range.indexCount; ++i) {
slice.indices.push_back(indices[range.indexStart + i] - static_cast<unsigned int>(range.vertexBase));
}
slice.materialIndex.assign(materialIndex.begin() + static_cast<std::ptrdiff_t>(range.triStart),
materialIndex.begin() + static_cast<std::ptrdiff_t>(range.triStart + range.triCount));
return slice;
}
}// namespace Kataglyphis