/*
    Lwo2MeshWriter based on the MilkShape exporter
    Dennis Verbeek (dennis.verbeek@chello.nl)

    Linux port by Magnus Møller Petersen (magnus@moaner.dk]

    doExportSkeleton is unfinished
*/

#ifndef _LWO2MESH_H_
#define _LWO2MESH_H_

#include "lwObject.h"
#include "Ogre.h"

#if OGRE_PLATFORM == OGRE_PLATFORM_LINUX

/* GNU libc has no equivalent to _splitpath() and _makepath(), so we'll write my
 * own using a combination of string functions and dirname() / basname().
 */

// I've pulled the following values from the top of my head.
#define _MAX_DRIVE 256
#define _MAX_FNAME 256
#define _MAX_DIR   256
#define _MAX_EXT   256

// Function prototypes.
void _splitpath( const char *_fn, char *_drive, char *_dir, char *_node, char *_ext );
void _makepath( char *_fn, const char *_drive, const char *_dir, const char *_node,
        const char *_ext );

#endif

using namespace Ogre;

enum Parameters
{
    InfoOnly,
    PrintVMaps,
    UseSharedVertexData,
    UseSeparateLayers,
    GenerateLOD,
    GenerateEdgeLists,
    GenerateTangents,
    UseFixedMethod,
    ExportMaterials,
    RenameMaterials,
    UseInteractiveMethod,
    UseObjectMethod,
    UsePrefixMethod,
    ExportSkeleton,
    HasNormals,
    MakeNewSubMesh,
    LinearCopy
};

#define NUMFLAGS 17

class Lwo2MeshWriter
{
public: 
    bool writeLwo2Mesh(lwObject *nobject, char *ndest);
private:
    void prepLwObject(void);

    void doExportMaterials(void);

    Skeleton *doExportSkeleton(const String &skelName, int layer);

    VertexData *setupVertexData(unsigned short vertexCount, VertexData *oldVertexData = 0, bool deleteOldVertexData = true);
    void copyPoints(int surfaceIndex, unsigned long polygontype, vpoints &sourcepoints, vpoints &destpoints);
    void copyPolygons(int surfaceIndex, unsigned long polygontype, vpolygons &sourcepolygons, vpolygons &destpolygons);
    void copyDataToVertexData(vpoints &points,
        vpolygons &polygons,
        vvmaps &vmaps,
        IndexData *indexData,
        VertexData *vertexData,
        unsigned short vertexDataOffset = 0);

    inline int getPointIndex(lwPoint *point, vpoints &points);
    inline void getTextureVMaps(vtextures &textures, vvmaps &svmaps, vvmaps &dvmaps);

    inline String makeLayerFileName(char* dest, unsigned int l, char *layername);
    inline String makeMaterialFileName(char* dest);

    char *dest;
    lwObject *object;
    MeshPtr ogreMesh;
    
    unsigned int nLayers;
    unsigned int nSurfaces;
    
    unsigned int numPolygons;
    unsigned int *numLayerPolygons;
    unsigned int *numLayerSurfacePolygons;
    unsigned int *numSurfacePolygons;
    
    unsigned int vertexCount;
    unsigned int *numLayerVertices;
    unsigned int *numLayerSurfaceVertices;
    unsigned int *numSurfaceVertices;
};

#endif // _LWO2MESH_H_

