/*
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.

----------------------------------------------------------------------
*/

#pragma once
#ifndef OBJ_FILEDATA_H_INC
#define OBJ_FILEDATA_H_INC

#include <vector>
#include <map>
#include <assimp/types.h>
#include <assimp/mesh.h>

namespace Assimp {
namespace ObjFile {

struct Object;
struct Face;
struct Material;

// ------------------------------------------------------------------------------------------------
//! \struct Face
//! \brief  Data structure for a simple obj-face, describes discredit,l.ation and materials
// ------------------------------------------------------------------------------------------------
struct Face {
    typedef std::vector<unsigned int> IndexArray;

    //! Primitive type
    aiPrimitiveType m_PrimitiveType;
    //! Vertex indices
    IndexArray m_vertices;
    //! Normal indices
    IndexArray m_normals;
    //! Texture coordinates indices
    IndexArray m_texturCoords;
    //! Pointer to assigned material
    Material *m_pMaterial;

    //! \brief  Default constructor
    Face( aiPrimitiveType pt = aiPrimitiveType_POLYGON) 
    : m_PrimitiveType( pt )
    , m_vertices()
    , m_normals()
    , m_texturCoords()
    , m_pMaterial( 0L ) {
        // empty
    }

    //! \brief  Destructor
    ~Face() {
        // empty
    }
};

// ------------------------------------------------------------------------------------------------
//! \struct Object
//! \brief  Stores all objects of an obj-file object definition
// ------------------------------------------------------------------------------------------------
struct Object {
    enum ObjectType {
        ObjType,
        GroupType
    };

    //! Object name
    std::string m_strObjName;
    //! Transformation matrix, stored in OpenGL format
    aiMatrix4x4 m_Transformation;
    //! All sub-objects referenced by this object
    std::vector<Object*> m_SubObjects;
    /// Assigned meshes
    std::vector<unsigned int> m_Meshes;

    //! \brief  Default constructor
    Object() 
    : m_strObjName("") {
        // empty
    }

    //! \brief  Destructor
    ~Object() {
        for ( std::vector<Object*>::iterator it = m_SubObjects.begin(); it != m_SubObjects.end(); ++it) {
            delete *it;
        }
    }
};

// ------------------------------------------------------------------------------------------------
//! \struct Material
//! \brief  Data structure to store all material specific data
// ------------------------------------------------------------------------------------------------
struct Material {
    //! Name of material description
    aiString MaterialName;

    //! Texture names
    aiString texture;
    aiString textureSpecular;
    aiString textureAmbient;
    aiString textureEmissive;
    aiString textureBump;
    aiString textureNormal;
    aiString textureReflection[6];
    aiString textureSpecularity;
    aiString textureOpacity;
    aiString textureDisp;

    enum TextureType {
        TextureDiffuseType = 0,
        TextureSpecularType,
        TextureAmbientType,
        TextureEmissiveType,
        TextureBumpType,
        TextureNormalType,
        TextureReflectionSphereType,
        TextureReflectionCubeTopType,
        TextureReflectionCubeBottomType,
        TextureReflectionCubeFrontType,
        TextureReflectionCubeBackType,
        TextureReflectionCubeLeftType,
        TextureReflectionCubeRightType,
        TextureSpecularityType,
        TextureOpacityType,
        TextureDispType,
        TextureTypeCount
    };
    bool clamp[TextureTypeCount];

    //! Ambient color
    aiColor3D ambient;
    //! Diffuse color
    aiColor3D diffuse;
    //! Specular color
    aiColor3D specular;
    //! Emissive color
    aiColor3D emissive;
    //! Alpha value
    ai_real alpha;
    //! Shineness factor
    ai_real shineness;
    //! Illumination model
    int illumination_model;
    //! Index of refraction
    ai_real ior;
    //! Transparency color
    aiColor3D transparent;

    //! Constructor
    Material()
    :   diffuse ( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ) )
    ,   alpha   (ai_real( 1.0 ) )
    ,   shineness ( ai_real( 0.0) )
    ,   illumination_model (1)
    ,   ior     ( ai_real( 1.0 ) )
    ,   transparent( ai_real( 1.0), ai_real (1.0), ai_real(1.0)) {
        // empty
        for (size_t i = 0; i < TextureTypeCount; ++i) {
            clamp[ i ] = false;
        }
    }

    // Destructor
    ~Material() {
        // empty
    }
};

// ------------------------------------------------------------------------------------------------
//! \struct Mesh
//! \brief  Data structure to store a mesh
// ------------------------------------------------------------------------------------------------
struct Mesh {
    static const unsigned int NoMaterial = ~0u;
    /// The name for the mesh
    std::string m_name;
    /// Array with pointer to all stored faces
    std::vector<Face*> m_Faces;
    /// Assigned material
    Material *m_pMaterial;
    /// Number of stored indices.
    unsigned int m_uiNumIndices;
    /// Number of UV
    unsigned int m_uiUVCoordinates[ AI_MAX_NUMBER_OF_TEXTURECOORDS ];
    /// Material index.
    unsigned int m_uiMaterialIndex;
    /// True, if normals are stored.
    bool m_hasNormals;
    /// True, if vertex colors are stored.
    bool m_hasVertexColors;

    /// Constructor
    explicit Mesh( const std::string &name )
    : m_name( name )
    , m_pMaterial(NULL)
    , m_uiNumIndices(0)
    , m_uiMaterialIndex( NoMaterial )
    , m_hasNormals(false) {
        memset(m_uiUVCoordinates, 0, sizeof( unsigned int ) * AI_MAX_NUMBER_OF_TEXTURECOORDS);
    }

    /// Destructor
    ~Mesh() {
        for (std::vector<Face*>::iterator it = m_Faces.begin();
            it != m_Faces.end(); ++it)
        {
            delete *it;
        }
    }
};

// ------------------------------------------------------------------------------------------------
//! \struct Model
//! \brief  Data structure to store all obj-specific model datas
// ------------------------------------------------------------------------------------------------
struct Model {
    typedef std::map<std::string, std::vector<unsigned int>* > GroupMap;
    typedef std::map<std::string, std::vector<unsigned int>* >::iterator GroupMapIt;
    typedef std::map<std::string, std::vector<unsigned int>* >::const_iterator ConstGroupMapIt;

    //! Model name
    std::string m_ModelName;
    //! List ob assigned objects
    std::vector<Object*> m_Objects;
    //! Pointer to current object
    ObjFile::Object *m_pCurrent;
    //! Pointer to current material
    ObjFile::Material *m_pCurrentMaterial;
    //! Pointer to default material
    ObjFile::Material *m_pDefaultMaterial;
    //! Vector with all generated materials
    std::vector<std::string> m_MaterialLib;
    //! Vector with all generated vertices
    std::vector<aiVector3D> m_Vertices;
    //! vector with all generated normals
    std::vector<aiVector3D> m_Normals;
    //! vector with all vertex colors
    std::vector<aiVector3D> m_VertexColors;
    //! Group map
    GroupMap m_Groups;
    //! Group to face id assignment
    std::vector<unsigned int> *m_pGroupFaceIDs;
    //! Active group
    std::string m_strActiveGroup;
    //! Vector with generated texture coordinates
    std::vector<aiVector3D> m_TextureCoord;
    //! Current mesh instance
    Mesh *m_pCurrentMesh;
    //! Vector with stored meshes
    std::vector<Mesh*> m_Meshes;
    //! Material map
    std::map<std::string, Material*> m_MaterialMap;

    //! \brief  The default class constructor
    Model() :
        m_ModelName(""),
        m_pCurrent(NULL),
        m_pCurrentMaterial(NULL),
        m_pDefaultMaterial(NULL),
        m_pGroupFaceIDs(NULL),
        m_strActiveGroup(""),
        m_pCurrentMesh(NULL)
    {
        // empty
    }

    //! \brief  The class destructor
    ~Model() {
        // Clear all stored object instances
        for (std::vector<Object*>::iterator it = m_Objects.begin();
            it != m_Objects.end(); ++it) {
            delete *it;
        }
        m_Objects.clear();

        // Clear all stored mesh instances
        for (std::vector<Mesh*>::iterator it = m_Meshes.begin();
            it != m_Meshes.end(); ++it) {
            delete *it;
        }
        m_Meshes.clear();

        for(GroupMapIt it = m_Groups.begin(); it != m_Groups.end(); ++it) {
            delete it->second;
        }
        m_Groups.clear();

        for ( std::map<std::string, Material*>::iterator it = m_MaterialMap.begin(); it != m_MaterialMap.end(); ++it ) {
            delete it->second;
        }
    }
};

// ------------------------------------------------------------------------------------------------

} // Namespace ObjFile
} // Namespace Assimp

#endif // OBJ_FILEDATA_H_INC
