///////////////////////////////////////////////////////////////////////////
//
//  System:    Simplygon
//  File:      ParameterizerExample.cpp
//  Language:  C++
//
//  Copyright (c) 2019 Microsoft. All rights reserved.
//
//  This is private property, and it is illegal to copy or distribute in
//  any form, without written authorization by the copyright owner(s).
//
///////////////////////////////////////////////////////////////////////////
//
//  #Description# 
//
//  This example shows how to generate unique texture coordinates for a
//  mesh using the spParameterizer. 
//
//  To generate texture coordinates and baking the original materials to 
//  the new UVs, see MaterialCastingExample.
//
///////////////////////////////////////////////////////////////////////////
#include "../Common/Example.h"
void RunExample( const std::string& readFrom, const std::string& writeTo );
int main( int argc, char* argv[] )
    {
    try
    {
        InitExample();
        // Set global variable. Using Orthonormal method for calculating
        // tangentspace.
        sg->SetGlobalSetting("DefaultTBNType", SG_TANGENTSPACEMETHOD_ORTHONORMAL);
        //sg->SetGlobalSetting( "DefaultTBNType" , SG_TANGENTSPACEMETHOD_3DSMAX );
        std::string assetPath = GetAssetPath();
        // Run the example code
        RunExample(assetPath + "object.obj", "object_with_UVs.obj");
        DeinitExample();
    }
    catch (const std::exception& ex)
    {
        std::cerr << ex.what() << std::endl;
        return -1;
    }
    return 0;
    }
void RunExample( const std::string& readFrom, const std::string& writeTo )
    {
    //Import the wavefront OBJ file
    spWavefrontImporter importer = sg->CreateWavefrontImporter();
    importer->SetImportFilePath( readFrom.c_str() );
    if( !importer->RunImport() )
        ExitWithError( "Couldn't load Wavefront object file." );
    //The scene will contain the read geometry, and the .obj reader will have put
    //all geometries in mesh nodes that are direct children of the root. Hence,
    //we can easily iterate through them.
    spScene scene = importer->GetScene();
    //Create a parameterizer object
    spParameterizer param = sg->CreateParameterizer();
    //Set the properties for the parameterizer
    param->SetMaxStretch( 0.25f );
    param->SetTextureWidth( 512 );
    param->SetTextureHeight( 512 );
    // Parameterize all the objects in the file.
    for( uint geomId = 0; geomId < scene->GetRootNode()->GetChildCount(); ++geomId )
        {
        //Cast the node to mesh node, and fetch geometry pointer from it
        spGeometryData geom = SimplygonSDK::SafeCast<ISceneMesh>( scene->GetRootNode()->GetChild( geomId ) )->GetGeometry();
        //If the mesh does not have UVs, create them
        if( geom->GetTexCoords( 0 ) == nullptr )
            geom->AddTexCoords( 0 );
        //Parameterize the selected geometry and input the generated texture coordinates
        //into the first (index 0) UV field.
        if( !param->Parameterize( geom, geom->GetTexCoords( 0 ) ) )
            std::cout << "Couldn't parameterize geometry." << std::endl;
        }
    //Export the mesh with the new UVs
    spWavefrontExporter exporter = sg->CreateWavefrontExporter();
    exporter->SetExportFilePath( writeTo.c_str() );
    exporter->SetScene( scene );
    exporter->RunExport();
    }