Program Listing for File MeshRange.ixx

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