message: clusterizer: Add C++ templated wrappers
  It's now possible to build meshlets or cluster bounds from 16-bit index
  buffers. Note that we still produce meshopt_Meshlet structure which has
  32-bit vertex indices, but since this structure isn't intended for use
  at runtime it should be trivial to repack the data later.
diff: @@ -145,7 +145,7 @@ MESHOPTIMIZER_API int meshopt_decodeVertexBuffer(void* destination, size_t verte
  * Reduces the number of triangles in the mesh, attempting to preserve mesh appearance as much as possible
  * Returns the number of indices after simplification, with destination containing new index data
  *
  - * destination must contain enough space for the source index buffer (since optimization is iterative, this means index_count elements - *not* target_index_count!)
  + * destination must contain enough space for the *source* index buffer (since optimization is iterative, this means index_count elements - *not* target_index_count!)
  * vertex_positions should have float3 position in the first 12 bytes of each vertex - similar to glVertexPointer
  */
  MESHOPTIMIZER_EXPERIMENTAL size_t meshopt_simplify(unsigned int* destination, const unsigned int* indices, size_t index_count, const float* vertex_positions, size_t vertex_count, size_t vertex_positions_stride, size_t target_index_count, float target_error);
  @@ -274,7 +274,6 @@ struct meshopt_Bounds
  MESHOPTIMIZER_EXPERIMENTAL struct meshopt_Bounds meshopt_computeClusterBounds(const unsigned int* indices, size_t index_count, const float* vertex_positions, size_t vertex_count, size_t vertex_positions_stride);
  MESHOPTIMIZER_EXPERIMENTAL struct meshopt_Bounds meshopt_computeMeshletBounds(const struct meshopt_Meshlet* meshlet, const float* vertex_positions, size_t vertex_count, size_t vertex_positions_stride);
  -
  #ifdef __cplusplus
  } /* extern "C" */
  #endif
  @@ -494,6 +493,22 @@ inline meshopt_VertexFetchStatistics meshopt_analyzeVertexFetch(const T* indices
  return meshopt_analyzeVertexFetch(in.data, index_count, vertex_count, vertex_size);
  }
  +
  +template <typename T>
  +inline size_t meshopt_buildMeshlets(meshopt_Meshlet* destination, const T* indices, size_t index_count, size_t vertex_count, size_t max_vertices, size_t max_triangles)
  +{
  + meshopt_IndexAdapter<T> in(0, indices, index_count);
  +
  + return meshopt_buildMeshlets(destination, in.data, index_count, vertex_count, max_vertices, max_triangles);
  +}
  +
  +template <typename T>
  +inline meshopt_Bounds meshopt_computeClusterBounds(const T* indices, size_t index_count, const float* vertex_positions, size_t vertex_count, size_t vertex_positions_stride)
  +{
  + meshopt_IndexAdapter<T> in(0, indices, index_count);
  +
  + return meshopt_computeClusterBounds(in.data, index_count, vertex_positions, vertex_count, vertex_positions_stride);
  +}
  #endif
  /* Inline implementation */
  