/*
---------------------------------------------------------------------------
Open Asset Import Library (assimp)
---------------------------------------------------------------------------

Copyright (c) 2006-2017, assimp team

All rights reserved.

Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the
  following disclaimer.

* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the
  following disclaimer in the documentation and/or other
  materials provided with the distribution.

* Neither the name of the assimp team, nor the names of its
  contributors may be used to endorse or promote products
  derived from this software without specific prior
  written permission of the assimp team.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---------------------------------------------------------------------------
*/

/** @file mesh.h
 *  @brief Declares the data structures in which the imported geometry is
    returned by ASSIMP: aiMesh, aiFace and aiBone data structures.
 */
#pragma once
#ifndef AI_MESH_H_INC
#define AI_MESH_H_INC

#include "types.h"

#ifdef __cplusplus
extern "C" {
#endif

// ---------------------------------------------------------------------------
// Limits. These values are required to match the settings Assimp was
// compiled against. Therefore, do not redefine them unless you build the
// library from source using the same definitions.
// ---------------------------------------------------------------------------

/** @def AI_MAX_FACE_INDICES
 *  Maximum number of indices per face (polygon). */

#ifndef AI_MAX_FACE_INDICES
#   define AI_MAX_FACE_INDICES 0x7fff
#endif

/** @def AI_MAX_BONE_WEIGHTS
 *  Maximum number of indices per face (polygon). */

#ifndef AI_MAX_BONE_WEIGHTS
#   define AI_MAX_BONE_WEIGHTS 0x7fffffff
#endif

/** @def AI_MAX_VERTICES
 *  Maximum number of vertices per mesh.  */

#ifndef AI_MAX_VERTICES
#   define AI_MAX_VERTICES 0x7fffffff
#endif

/** @def AI_MAX_FACES
 *  Maximum number of faces per mesh. */

#ifndef AI_MAX_FACES
#   define AI_MAX_FACES 0x7fffffff
#endif

/** @def AI_MAX_NUMBER_OF_COLOR_SETS
 *  Supported number of vertex color sets per mesh. */

#ifndef AI_MAX_NUMBER_OF_COLOR_SETS
#   define AI_MAX_NUMBER_OF_COLOR_SETS 0x8
#endif // !! AI_MAX_NUMBER_OF_COLOR_SETS

/** @def AI_MAX_NUMBER_OF_TEXTURECOORDS
 *  Supported number of texture coord sets (UV(W) channels) per mesh */

#ifndef AI_MAX_NUMBER_OF_TEXTURECOORDS
#   define AI_MAX_NUMBER_OF_TEXTURECOORDS 0x8
#endif // !! AI_MAX_NUMBER_OF_TEXTURECOORDS

// ---------------------------------------------------------------------------
/** @brief A single face in a mesh, referring to multiple vertices.
 *
 * If mNumIndices is 3, we call the face 'triangle', for mNumIndices > 3
 * it's called 'polygon' (hey, that's just a definition!).
 * <br>
 * aiMesh::mPrimitiveTypes can be queried to quickly examine which types of
 * primitive are actually present in a mesh. The #aiProcess_SortByPType flag
 * executes a special post-processing algorithm which splits meshes with
 * *different* primitive types mixed up (e.g. lines and triangles) in several
 * 'clean' submeshes. Furthermore there is a configuration option (
 * #AI_CONFIG_PP_SBP_REMOVE) to force #aiProcess_SortByPType to remove
 * specific kinds of primitives from the imported scene, completely and forever.
 * In many cases you'll probably want to set this setting to
 * @code
 * aiPrimitiveType_LINE|aiPrimitiveType_POINT
 * @endcode
 * Together with the #aiProcess_Triangulate flag you can then be sure that
 * #aiFace::mNumIndices is always 3.
 * @note Take a look at the @link data Data Structures page @endlink for
 * more information on the layout and winding order of a face.
 */
struct aiFace
{
    //! Number of indices defining this face.
    //! The maximum value for this member is #AI_MAX_FACE_INDICES.
    unsigned int mNumIndices;

    //! Pointer to the indices array. Size of the array is given in numIndices.
    unsigned int* mIndices;

#ifdef __cplusplus

    //! Default constructor
    aiFace()
      : mNumIndices( 0 )
      , mIndices( NULL )
    {
    }

    //! Default destructor. Delete the index array
    ~aiFace()
    {
        delete [] mIndices;
    }

    //! Copy constructor. Copy the index array
    aiFace( const aiFace& o)
      : mIndices( NULL )
    {
        *this = o;
    }

    //! Assignment operator. Copy the index array
    aiFace& operator = ( const aiFace& o)
    {
        if (&o == this)
            return *this;

        delete[] mIndices;
        mNumIndices = o.mNumIndices;
        if (mNumIndices) {
            mIndices = new unsigned int[mNumIndices];
            ::memcpy( mIndices, o.mIndices, mNumIndices * sizeof( unsigned int));
        }
        else {
            mIndices = NULL;
        }
        return *this;
    }

    //! Comparison operator. Checks whether the index array
    //! of two faces is identical
    bool operator== (const aiFace& o) const
    {
        if (mIndices == o.mIndices)return true;
        else if (mIndices && mNumIndices == o.mNumIndices)
        {
            for (unsigned int i = 0;i < this->mNumIndices;++i)
                if (mIndices[i] != o.mIndices[i])return false;
            return true;
        }
        return false;
    }

    //! Inverse comparison operator. Checks whether the index
    //! array of two faces is NOT identical
    bool operator != (const aiFace& o) const
    {
        return !(*this == o);
    }
#endif // __cplusplus
}; // struct aiFace


// ---------------------------------------------------------------------------
/** @brief A single influence of a bone on a vertex.
 */
struct aiVertexWeight
{
    //! Index of the vertex which is influenced by the bone.
    unsigned int mVertexId;

    //! The strength of the influence in the range (0...1).
    //! The influence from all bones at one vertex amounts to 1.
    float mWeight;

#ifdef __cplusplus

    //! Default constructor
    aiVertexWeight() { }

    //! Initialisation from a given index and vertex weight factor
    //! \param pID ID
    //! \param pWeight Vertex weight factor
    aiVertexWeight( unsigned int pID, float pWeight)
        : mVertexId( pID), mWeight( pWeight)
    { /* nothing to do here */ }

#endif // __cplusplus
};


// ---------------------------------------------------------------------------
/** @brief A single bone of a mesh.
 *
 *  A bone has a name by which it can be found in the frame hierarchy and by
 *  which it can be addressed by animations. In addition it has a number of
 *  influences on vertices.
 */
struct aiBone
{
    //! The name of the bone.
    C_STRUCT aiString mName;

    //! The number of vertices affected by this bone
    //! The maximum value for this member is #AI_MAX_BONE_WEIGHTS.
    unsigned int mNumWeights;

    //! The vertices affected by this bone
    C_STRUCT aiVertexWeight* mWeights;

    //! Matrix that transforms from mesh space to bone space in bind pose
    C_STRUCT aiMatrix4x4 mOffsetMatrix;

#ifdef __cplusplus

    //! Default constructor
    aiBone()
        : mName()
        , mNumWeights( 0 )
      , mWeights( NULL )
    {
    }

    //! Copy constructor
    aiBone(const aiBone& other)
      : mName( other.mName )
      , mNumWeights( other.mNumWeights )
      , mOffsetMatrix( other.mOffsetMatrix )
    {
        if (other.mWeights && other.mNumWeights)
        {
            mWeights = new aiVertexWeight[mNumWeights];
            ::memcpy(mWeights,other.mWeights,mNumWeights * sizeof(aiVertexWeight));
        }
    }

    //! Destructor - deletes the array of vertex weights
    ~aiBone()
    {
        delete [] mWeights;
    }
#endif // __cplusplus
};


// ---------------------------------------------------------------------------
/** @brief Enumerates the types of geometric primitives supported by Assimp.
 *
 *  @see aiFace Face data structure
 *  @see aiProcess_SortByPType Per-primitive sorting of meshes
 *  @see aiProcess_Triangulate Automatic triangulation
 *  @see AI_CONFIG_PP_SBP_REMOVE Removal of specific primitive types.
 */
enum aiPrimitiveType
{
    /** A point primitive.
     *
     * This is just a single vertex in the virtual world,
     * #aiFace contains just one index for such a primitive.
     */
    aiPrimitiveType_POINT       = 0x1,

    /** A line primitive.
     *
     * This is a line defined through a start and an end position.
     * #aiFace contains exactly two indices for such a primitive.
     */
    aiPrimitiveType_LINE        = 0x2,

    /** A triangular primitive.
     *
     * A triangle consists of three indices.
     */
    aiPrimitiveType_TRIANGLE    = 0x4,

    /** A higher-level polygon with more than 3 edges.
     *
     * A triangle is a polygon, but polygon in this context means
     * "all polygons that are not triangles". The "Triangulate"-Step
     * is provided for your convenience, it splits all polygons in
     * triangles (which are much easier to handle).
     */
    aiPrimitiveType_POLYGON     = 0x8,


    /** This value is not used. It is just here to force the
     *  compiler to map this enum to a 32 Bit integer.
     */
#ifndef SWIG
    _aiPrimitiveType_Force32Bit = INT_MAX
#endif
}; //! enum aiPrimitiveType

// Get the #aiPrimitiveType flag for a specific number of face indices
#define AI_PRIMITIVE_TYPE_FOR_N_INDICES(n) \
    ((n) > 3 ? aiPrimitiveType_POLYGON : (aiPrimitiveType)(1u << ((n)-1)))



// ---------------------------------------------------------------------------
/** @brief NOT CURRENTLY IN USE. An AnimMesh is an attachment to an #aiMesh stores per-vertex
 *  animations for a particular frame.
 *
 *  You may think of an #aiAnimMesh as a `patch` for the host mesh, which
 *  replaces only certain vertex data streams at a particular time.
 *  Each mesh stores n attached attached meshes (#aiMesh::mAnimMeshes).
 *  The actual relationship between the time line and anim meshes is
 *  established by #aiMeshAnim, which references singular mesh attachments
 *  by their ID and binds them to a time offset.
*/
struct aiAnimMesh
{
    /** Replacement for aiMesh::mVertices. If this array is non-NULL,
     *  it *must* contain mNumVertices entries. The corresponding
     *  array in the host mesh must be non-NULL as well - animation
     *  meshes may neither add or nor remove vertex components (if
     *  a replacement array is NULL and the corresponding source
     *  array is not, the source data is taken instead)*/
    C_STRUCT aiVector3D* mVertices;

    /** Replacement for aiMesh::mNormals.  */
    C_STRUCT aiVector3D* mNormals;

    /** Replacement for aiMesh::mTangents. */
    C_STRUCT aiVector3D* mTangents;

    /** Replacement for aiMesh::mBitangents. */
    C_STRUCT aiVector3D* mBitangents;

    /** Replacement for aiMesh::mColors */
    C_STRUCT aiColor4D* mColors[AI_MAX_NUMBER_OF_COLOR_SETS];

    /** Replacement for aiMesh::mTextureCoords */
    C_STRUCT aiVector3D* mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];

    /** The number of vertices in the aiAnimMesh, and thus the length of all
     * the member arrays.
     *
     * This has always the same value as the mNumVertices property in the
     * corresponding aiMesh. It is duplicated here merely to make the length
     * of the member arrays accessible even if the aiMesh is not known, e.g.
     * from language bindings.
     */
    unsigned int mNumVertices;
    
    /** 
     * Weight of the AnimMesh. 
     */
    float mWeight;

#ifdef __cplusplus

    aiAnimMesh()
        : mVertices( NULL )
        , mNormals( NULL )
        , mTangents( NULL )
        , mBitangents( NULL )
        , mNumVertices( 0 )
        , mWeight( 0.0f )
    {
        // fixme consider moving this to the ctor initializer list as well
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++){
            mTextureCoords[a] = NULL;
        }
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++) {
            mColors[a] = NULL;
        }
    }

    ~aiAnimMesh()
    {
        delete [] mVertices;
        delete [] mNormals;
        delete [] mTangents;
        delete [] mBitangents;
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++) {
            delete [] mTextureCoords[a];
        }
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++) {
            delete [] mColors[a];
        }
    }

    /** Check whether the anim mesh overrides the vertex positions
     *  of its host mesh*/
    bool HasPositions() const {
        return mVertices != NULL;
    }

    /** Check whether the anim mesh overrides the vertex normals
     *  of its host mesh*/
    bool HasNormals() const {
        return mNormals != NULL;
    }

    /** Check whether the anim mesh overrides the vertex tangents
     *  and bitangents of its host mesh. As for aiMesh,
     *  tangents and bitangents always go together. */
    bool HasTangentsAndBitangents() const {
        return mTangents != NULL;
    }

    /** Check whether the anim mesh overrides a particular
     * set of vertex colors on his host mesh.
     *  @param pIndex 0<index<AI_MAX_NUMBER_OF_COLOR_SETS */
    bool HasVertexColors( unsigned int pIndex) const    {
        return pIndex >= AI_MAX_NUMBER_OF_COLOR_SETS ? false : mColors[pIndex] != NULL;
    }

    /** Check whether the anim mesh overrides a particular
     * set of texture coordinates on his host mesh.
     *  @param pIndex 0<index<AI_MAX_NUMBER_OF_TEXTURECOORDS */
    bool HasTextureCoords( unsigned int pIndex) const   {
        return pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS ? false : mTextureCoords[pIndex] != NULL;
    }

#endif
};

// ---------------------------------------------------------------------------
/** @brief Enumerates the methods of mesh morphing supported by Assimp.
 */
enum aiMorphingMethod
{
    /** Interpolation between morph targets */
    aiMorphingMethod_VERTEX_BLEND       = 0x1,

    /** Normalized morphing between morph targets  */
    aiMorphingMethod_MORPH_NORMALIZED   = 0x2,

    /** Relative morphing between morph targets  */
    aiMorphingMethod_MORPH_RELATIVE     = 0x3,

    /** This value is not used. It is just here to force the
     *  compiler to map this enum to a 32 Bit integer.
     */
#ifndef SWIG
    _aiMorphingMethod_Force32Bit = INT_MAX
#endif
}; //! enum aiMorphingMethod

// ---------------------------------------------------------------------------
/** @brief A mesh represents a geometry or model with a single material.
*
* It usually consists of a number of vertices and a series of primitives/faces
* referencing the vertices. In addition there might be a series of bones, each
* of them addressing a number of vertices with a certain weight. Vertex data
* is presented in channels with each channel containing a single per-vertex
* information such as a set of texture coords or a normal vector.
* If a data pointer is non-null, the corresponding data stream is present.
* From C++-programs you can also use the comfort functions Has*() to
* test for the presence of various data streams.
*
* A Mesh uses only a single material which is referenced by a material ID.
* @note The mPositions member is usually not optional. However, vertex positions
* *could* be missing if the #AI_SCENE_FLAGS_INCOMPLETE flag is set in
* @code
* aiScene::mFlags
* @endcode
*/
struct aiMesh
{
    /** Bitwise combination of the members of the #aiPrimitiveType enum.
     * This specifies which types of primitives are present in the mesh.
     * The "SortByPrimitiveType"-Step can be used to make sure the
     * output meshes consist of one primitive type each.
     */
    unsigned int mPrimitiveTypes;

    /** The number of vertices in this mesh.
    * This is also the size of all of the per-vertex data arrays.
    * The maximum value for this member is #AI_MAX_VERTICES.
    */
    unsigned int mNumVertices;

    /** The number of primitives (triangles, polygons, lines) in this  mesh.
    * This is also the size of the mFaces array.
    * The maximum value for this member is #AI_MAX_FACES.
    */
    unsigned int mNumFaces;

    /** Vertex positions.
    * This array is always present in a mesh. The array is
    * mNumVertices in size.
    */
    C_STRUCT aiVector3D* mVertices;

    /** Vertex normals.
    * The array contains normalized vectors, NULL if not present.
    * The array is mNumVertices in size. Normals are undefined for
    * point and line primitives. A mesh consisting of points and
    * lines only may not have normal vectors. Meshes with mixed
    * primitive types (i.e. lines and triangles) may have normals,
    * but the normals for vertices that are only referenced by
    * point or line primitives are undefined and set to QNaN (WARN:
    * qNaN compares to inequal to *everything*, even to qNaN itself.
    * Using code like this to check whether a field is qnan is:
    * @code
    * #define IS_QNAN(f) (f != f)
    * @endcode
    * still dangerous because even 1.f == 1.f could evaluate to false! (
    * remember the subtleties of IEEE754 artithmetics). Use stuff like
    * @c fpclassify instead.
    * @note Normal vectors computed by Assimp are always unit-length.
    * However, this needn't apply for normals that have been taken
    *   directly from the model file.
    */
    C_STRUCT aiVector3D* mNormals;

    /** Vertex tangents.
    * The tangent of a vertex points in the direction of the positive
    * X texture axis. The array contains normalized vectors, NULL if
    * not present. The array is mNumVertices in size. A mesh consisting
    * of points and lines only may not have normal vectors. Meshes with
    * mixed primitive types (i.e. lines and triangles) may have
    * normals, but the normals for vertices that are only referenced by
    * point or line primitives are undefined and set to qNaN.  See
    * the #mNormals member for a detailed discussion of qNaNs.
    * @note If the mesh contains tangents, it automatically also
    * contains bitangents.
    */
    C_STRUCT aiVector3D* mTangents;

    /** Vertex bitangents.
    * The bitangent of a vertex points in the direction of the positive
    * Y texture axis. The array contains normalized vectors, NULL if not
    * present. The array is mNumVertices in size.
    * @note If the mesh contains tangents, it automatically also contains
    * bitangents.
    */
    C_STRUCT aiVector3D* mBitangents;

    /** Vertex color sets.
    * A mesh may contain 0 to #AI_MAX_NUMBER_OF_COLOR_SETS vertex
    * colors per vertex. NULL if not present. Each array is
    * mNumVertices in size if present.
    */
    C_STRUCT aiColor4D* mColors[AI_MAX_NUMBER_OF_COLOR_SETS];

    /** Vertex texture coords, also known as UV channels.
    * A mesh may contain 0 to AI_MAX_NUMBER_OF_TEXTURECOORDS per
    * vertex. NULL if not present. The array is mNumVertices in size.
    */
    C_STRUCT aiVector3D* mTextureCoords[AI_MAX_NUMBER_OF_TEXTURECOORDS];

    /** Specifies the number of components for a given UV channel.
    * Up to three channels are supported (UVW, for accessing volume
    * or cube maps). If the value is 2 for a given channel n, the
    * component p.z of mTextureCoords[n][p] is set to 0.0f.
    * If the value is 1 for a given channel, p.y is set to 0.0f, too.
    * @note 4D coords are not supported
    */
    unsigned int mNumUVComponents[AI_MAX_NUMBER_OF_TEXTURECOORDS];

    /** The faces the mesh is constructed from.
    * Each face refers to a number of vertices by their indices.
    * This array is always present in a mesh, its size is given
    * in mNumFaces. If the #AI_SCENE_FLAGS_NON_VERBOSE_FORMAT
    * is NOT set each face references an unique set of vertices.
    */
    C_STRUCT aiFace* mFaces;

    /** The number of bones this mesh contains.
    * Can be 0, in which case the mBones array is NULL.
    */
    unsigned int mNumBones;

    /** The bones of this mesh.
    * A bone consists of a name by which it can be found in the
    * frame hierarchy and a set of vertex weights.
    */
    C_STRUCT aiBone** mBones;

    /** The material used by this mesh.
     * A mesh uses only a single material. If an imported model uses
     * multiple materials, the import splits up the mesh. Use this value
     * as index into the scene's material list.
     */
    unsigned int mMaterialIndex;

    /** Name of the mesh. Meshes can be named, but this is not a
     *  requirement and leaving this field empty is totally fine.
     *  There are mainly three uses for mesh names:
     *   - some formats name nodes and meshes independently.
     *   - importers tend to split meshes up to meet the
     *      one-material-per-mesh requirement. Assigning
     *      the same (dummy) name to each of the result meshes
     *      aids the caller at recovering the original mesh
     *      partitioning.
     *   - Vertex animations refer to meshes by their names.
     **/
    C_STRUCT aiString mName;


    /** The number of attachment meshes. Note! Currently only works with Collada loader. */
    unsigned int mNumAnimMeshes;

    /** Attachment meshes for this mesh, for vertex-based animation.
     *  Attachment meshes carry replacement data for some of the
     *  mesh'es vertex components (usually positions, normals).
     *  Note! Currently only works with Collada loader.*/
    C_STRUCT aiAnimMesh** mAnimMeshes;

    /** 
     *  Method of morphing when animeshes are specified. 
     */
    unsigned int mMethod;
	
#ifdef __cplusplus

    //! Default constructor. Initializes all members to 0
    aiMesh()
        : mPrimitiveTypes( 0 )
        , mNumVertices( 0 )
        , mNumFaces( 0 )
        , mVertices( NULL )
        , mNormals( NULL )
        , mTangents( NULL )
        , mBitangents( NULL )
        , mFaces( NULL )
        , mNumBones( 0 )
        , mBones( NULL )
        , mMaterialIndex( 0 )
        , mNumAnimMeshes( 0 )
        , mAnimMeshes( NULL )
        , mMethod( 0 )
    {
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++)
        {
            mNumUVComponents[a] = 0;
            mTextureCoords[a] = NULL;
        }

        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++)
            mColors[a] = NULL;
    }

    //! Deletes all storage allocated for the mesh
    ~aiMesh()
    {
        delete [] mVertices;
        delete [] mNormals;
        delete [] mTangents;
        delete [] mBitangents;
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_TEXTURECOORDS; a++) {
            delete [] mTextureCoords[a];
        }
        for( unsigned int a = 0; a < AI_MAX_NUMBER_OF_COLOR_SETS; a++) {
            delete [] mColors[a];
        }

        // DO NOT REMOVE THIS ADDITIONAL CHECK
        if (mNumBones && mBones)    {
            for( unsigned int a = 0; a < mNumBones; a++) {
                delete mBones[a];
            }
            delete [] mBones;
        }

        if (mNumAnimMeshes && mAnimMeshes)  {
            for( unsigned int a = 0; a < mNumAnimMeshes; a++) {
                delete mAnimMeshes[a];
            }
            delete [] mAnimMeshes;
        }

        delete [] mFaces;
    }

    //! Check whether the mesh contains positions. Provided no special
    //! scene flags are set, this will always be true
    bool HasPositions() const
        { return mVertices != NULL && mNumVertices > 0; }

    //! Check whether the mesh contains faces. If no special scene flags
    //! are set this should always return true
    bool HasFaces() const
        { return mFaces != NULL && mNumFaces > 0; }

    //! Check whether the mesh contains normal vectors
    bool HasNormals() const
        { return mNormals != NULL && mNumVertices > 0; }

    //! Check whether the mesh contains tangent and bitangent vectors
    //! It is not possible that it contains tangents and no bitangents
    //! (or the other way round). The existence of one of them
    //! implies that the second is there, too.
    bool HasTangentsAndBitangents() const
        { return mTangents != NULL && mBitangents != NULL && mNumVertices > 0; }

    //! Check whether the mesh contains a vertex color set
    //! \param pIndex Index of the vertex color set
    bool HasVertexColors( unsigned int pIndex) const
    {
        if( pIndex >= AI_MAX_NUMBER_OF_COLOR_SETS)
            return false;
        else
            return mColors[pIndex] != NULL && mNumVertices > 0;
    }

    //! Check whether the mesh contains a texture coordinate set
    //! \param pIndex Index of the texture coordinates set
    bool HasTextureCoords( unsigned int pIndex) const
    {
        if( pIndex >= AI_MAX_NUMBER_OF_TEXTURECOORDS)
            return false;
        else
            return mTextureCoords[pIndex] != NULL && mNumVertices > 0;
    }

    //! Get the number of UV channels the mesh contains
    unsigned int GetNumUVChannels() const
    {
        unsigned int n = 0;
        while (n < AI_MAX_NUMBER_OF_TEXTURECOORDS && mTextureCoords[n])++n;
        return n;
    }

    //! Get the number of vertex color channels the mesh contains
    unsigned int GetNumColorChannels() const
    {
        unsigned int n = 0;
        while (n < AI_MAX_NUMBER_OF_COLOR_SETS && mColors[n])++n;
        return n;
    }

    //! Check whether the mesh contains bones
    inline bool HasBones() const
        { return mBones != NULL && mNumBones > 0; }

#endif // __cplusplus
};

#ifdef __cplusplus
}
#endif //! extern "C"
#endif // AI_MESH_H_INC

