///////////////////////////////////////////////////////////////////////////
//
// 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();
}