
.. _program_listing_file_Src_GraphicsEngineVulkan_scene_MeshRange.ixx:

Program Listing for File MeshRange.ixx
======================================

|exhale_lsh| :ref:`Return to documentation for file <file_Src_GraphicsEngineVulkan_scene_MeshRange.ixx>` (``Src/GraphicsEngineVulkan/scene/MeshRange.ixx``)

.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS

.. code-block:: cpp

   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
