Exemple #1
0
/**
 * 相対パスのファイル名をテクスチャのファイル名として再帰的に設定する
 *
 * @param node FbxNode
 */
void FbxFileLoader::set_relative_file_name_to_texture_file_name_recursive( FbxNode* node )
{
	if ( ! node )
	{
		return;
	}

	for ( int n = 0; n < node->GetMaterialCount(); n++ )
	{
		FbxSurfaceMaterial* material = node->GetMaterial( n );

		if ( ! material )
		{
			continue;
		}

		for ( auto p = material->GetFirstProperty(); p.IsValid(); p = material->GetNextProperty( p ) )
		{
			for ( int m = 0; m < p.GetSrcObjectCount< FbxTexture >(); m++ )
			{
				FbxLayeredTexture* layered_texture = p.GetSrcObject< FbxLayeredTexture >( m );
				FbxFileTexture* file_texture = nullptr;

				if ( layered_texture )
				{
					for ( int l = 0; l < layered_texture->GetSrcObjectCount< FbxTexture >(); l++ )
					{
						if ( ! layered_texture->GetSrcObject< FbxTexture >( l ) )
						{
							continue;
						}

						file_texture = FbxCast< FbxFileTexture >( layered_texture->GetSrcObject< FbxTexture >( l ) );
					}
				}
				else
				{
					if ( ! p.GetSrcObject< FbxTexture >( m ) )
					{
						continue;
					}

					file_texture = FbxCast< FbxFileTexture >( p.GetSrcObject< FbxTexture >( m ) );
				}

				if ( file_texture )
				{
					const string_t relative_file_name = file_texture->GetRelativeFileName();

					if ( ! file_texture->SetFileName( relative_file_name.c_str() ) )
					{
						COMMON_THROW_EXCEPTION_MESSAGE( string_t( "FbxFileTexture::SetFileName failed : " ) + relative_file_name );
					}
					/*
					if ( ! file_texture->SetRelativeFileName( relative_file_name.c_str() ) )
					{
						COMMON_THROW_EXCEPTION_MESSAGE( string_t( "FbxFileTexture::SetRelativeFileName failed : " ) + relative_file_name );
					}
					*/
				}
			}
		}
	}

	for ( int n = 0; n < node->GetChildCount(); n++ )
	{
		set_relative_file_name_to_texture_file_name_recursive( node->GetChild( n ) );
	}
}