/*
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 Data structures for the 3D Game Studio Heightmap format (HMP)
//!

namespace Assimp    {
namespace HMP   {

#include "./../include/assimp/Compiler/pushpack1.h"
#include <stdint.h>

// to make it easier for us, we test the magic word against both "endianesses"
#define AI_HMP_MAGIC_NUMBER_BE_4    AI_MAKE_MAGIC("HMP4")
#define AI_HMP_MAGIC_NUMBER_LE_4    AI_MAKE_MAGIC("4PMH")

#define AI_HMP_MAGIC_NUMBER_BE_5    AI_MAKE_MAGIC("HMP5")
#define AI_HMP_MAGIC_NUMBER_LE_5    AI_MAKE_MAGIC("5PMH")

#define AI_HMP_MAGIC_NUMBER_BE_7    AI_MAKE_MAGIC("HMP7")
#define AI_HMP_MAGIC_NUMBER_LE_7    AI_MAKE_MAGIC("7PMH")

// ---------------------------------------------------------------------------
/** Data structure for the header of a HMP5 file.
 *  This is also used by HMP4 and HMP7, but with modifications
*/
struct Header_HMP5
{
    int8_t  ident[4]; // "HMP5"
    int32_t     version;

    // ignored
    float   scale[3];
    float   scale_origin[3];
    float   boundingradius;

    //! Size of one triangle in x direction
    float   ftrisize_x;
    //! Size of one triangle in y direction
    float   ftrisize_y;
    //! Number of vertices in x direction
    float   fnumverts_x;

    //! Number of skins in the file
    int32_t     numskins;

    // can ignore this?
    int32_t     skinwidth;
    int32_t     skinheight;

    //!Number of vertices in the file
    int32_t     numverts;

    // ignored and zero
    int32_t     numtris;

    //! only one supported ...
    int32_t     numframes;

    //! Always 0 ...
    int32_t     num_stverts;
    int32_t     flags;
    float   size;
} PACK_STRUCT;

// ---------------------------------------------------------------------------
/** Data structure for a terrain vertex in a HMP4 file
*/
struct Vertex_HMP4
{
    uint16_t p_pos[3];
    uint8_t normals162index;
    uint8_t pad;
} PACK_STRUCT;

// ---------------------------------------------------------------------------
/** Data structure for a terrain vertex in a HMP5 file
*/
struct Vertex_HMP5
{
    uint16_t z;
    uint8_t normals162index;
    uint8_t pad;
} PACK_STRUCT;

// ---------------------------------------------------------------------------
/** Data structure for a terrain vertex in a HMP7 file
*/
struct Vertex_HMP7
{
    uint16_t     z;
    int8_t normal_x,normal_y;
} PACK_STRUCT;

#include "./../include/assimp/Compiler/poppack1.h"

} //! namespace HMP
} //! namespace Assimp
