/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2015 Mario Luzeiro <mrluzeiro@ua.pt>
 * Copyright (C) 1992-2015 KiCad Developers, see AUTHORS.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

/**
 * @file  c3dmodel.h
 * @brief define an internal structure to be used by the 3D renders
 */


#ifndef C3DMODEL_H
#define C3DMODEL_H

#include "plugins/3dapi/xv3d_types.h"


typedef struct
{
    SFVEC3F m_Ambient;          //
    SFVEC3F m_Diffuse;          ///< Default diffuse color if m_Color is NULL
    SFVEC3F m_Emissive;         //
    SFVEC3F m_Specular;         //
    float   m_Shininess;        //
    float   m_Transparency;     ///< 1.0 is completely transparent, 0.0 completely opaque

    // !TODO: to be implemented
    /*struct textures
    {
        wxString m_Ambient;            // map_Ka
        wxString m_Diffuse;            // map_Kd
        wxString m_Specular;           // map_Ks
        wxString m_Specular_highlight; // map_Ns
        wxString m_Bump;               // map_bump, bump
        wxString m_Displacement;       // disp
        wxString m_Alpha;              // map_d
    };*/
} SMATERIAL;


/// Per-vertex normal/color/texcoors structure.
/// CONDITIONS:
///     m_Positions size == m_Normals size == m_Texcoords size == m_Color size
///     m_Texcoords can be NULL, textures will not be applied in that case
///     m_Color can be NULL, it will use the m_Diffuse color for every triangle
///     any m_FaceIdx must be an index of a the element lists
///     m_MaterialIdx must be an existent material index stored in the parent model
/// SCALES:
/// m_Positions units are in mm, example:
///  0.1 unit ==  0.1 mm
///  1.0 unit ==  1.0 mm
/// 10.0 unit == 10.0 mm
///
/// To convert this units to pcbunits, use the convertion facto UNITS3D_TO_UNITSPCB
///
/// m_Normals, m_Color and m_Texcoords are beween 0.0f and 1.0f
typedef struct
{
    unsigned int    m_VertexSize;   ///< Number of vertex in the arrays
    SFVEC3F        *m_Positions;    ///< Vertex position array
    SFVEC3F        *m_Normals;      ///< Vertex normals array
    SFVEC2F        *m_Texcoords;    ///< Vertex texture coordinates array, can be NULL
    SFVEC3F        *m_Color;        ///< Vertex color array, can be NULL
    unsigned int    m_FaceIdxSize;  ///< Number of elements of the m_FaceIdx array
    unsigned int   *m_FaceIdx;      ///< Triangle Face Indexes
    unsigned int    m_MaterialIdx;  ///< Material Index to be used in this mesh (must be < m_MaterialsSize )
} SMESH;


/// Store the a model based on meshes and materials
typedef struct
{
    unsigned int    m_MeshesSize;       ///< Number of meshes in the array
    SMESH          *m_Meshes;           ///< The meshes list of this model

    unsigned int    m_MaterialsSize;    ///< Number of materials in the material array
    SMATERIAL      *m_Materials;        ///< The materials list of this model
} S3DMODEL;

#endif // C3DMODEL_H
