# Impostor processor
Impostor processor overview in optimization concepts
# Impostor processor settings
This settings object contains the settings for the impostor generation that is performed by the impostor processor. These settings include parameters for choosing the impostor type and fetching the settings for that impostor type.
- Billboard cloud settings, the settings controlling the billboard cloud generation
- Flip book settings, the settings controlling the flip book generation
- Impostor from single view settings, the settings controlling the single view impostor generation
Following settings objects are available in impostor processor:
# Examples
The following examples shows how to use the different impostor types.
# Billboard cloud, mode: Foliage
This example shows how to use the Impostor processor type: Billboard cloud with mode: Foliage.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include <string>
#include <stdlib.h>
#include <filesystem>
#include <future>
#include "SimplygonLoader.h"
void RunBillboardCloudFoliage(Simplygon::ISimplygon* sg)
{
Simplygon::spSceneImporter sgSceneImporter = sg->CreateSceneImporter();
sgSceneImporter->SetImportFilePath( "../Assets/Tree/Tree.obj" );
if(!sgSceneImporter->RunImport())
throw std::exception("Failed to load Tree/Tree.obj.");
Simplygon::spScene sgScene = sgSceneImporter->GetScene();
// For all materials in the scene set the blend mode to blend (instead of opaque)
int materialCount = (int)sgScene->GetMaterialTable()->GetMaterialsCount();
for (int i = 0; i < materialCount; ++i)
{
sgScene->GetMaterialTable()->GetMaterial(i)->SetBlendMode(Simplygon::EMaterialBlendMode::Blend);
}
// Create the Impostor processor.
Simplygon::spImpostorProcessor sgImpostorProcessor = sg->CreateImpostorProcessor();
sgImpostorProcessor->SetScene( sgScene );
Simplygon::spImpostorSettings sgImpostorSettings = sgImpostorProcessor->GetImpostorSettings();
// Set impostor type to Billboard cloud.
sgImpostorSettings->SetImpostorType( Simplygon::EImpostorType::BillboardCloud );
Simplygon::spBillboardCloudSettings sgBillboardCloudSettings = sgImpostorSettings->GetBillboardCloudSettings();
// Set billboard cloud mode to Foliage.
sgBillboardCloudSettings->SetBillboardMode( Simplygon::EBillboardMode::Foliage );
sgBillboardCloudSettings->SetBillboardDensity( 0.5f );
sgBillboardCloudSettings->SetGeometricComplexity( 0.9f );
sgBillboardCloudSettings->SetMaxPlaneCount( 10 );
sgBillboardCloudSettings->SetTwoSided( true );
Simplygon::spFoliageSettings sgFoliageSettings = sgBillboardCloudSettings->GetFoliageSettings();
// Set the parameters for separating foliage and trunk.
sgFoliageSettings->SetSeparateTrunkAndFoliage( true );
sgFoliageSettings->SetSeparateFoliageTriangleRatio( 0.5f );
sgFoliageSettings->SetSeparateFoliageTriangleThreshold( 10 );
sgFoliageSettings->SetSeparateFoliageAreaThreshold( 0.1f );
sgFoliageSettings->SetSeparateFoliageSizeThreshold( 0.1f );
sgFoliageSettings->SetTrunkReductionRatio( 0.5f );
Simplygon::spMappingImageSettings sgMappingImageSettings = sgImpostorProcessor->GetMappingImageSettings();
sgMappingImageSettings->SetMaximumLayers( 10 );
Simplygon::spMappingImageOutputMaterialSettings sgOutputMaterialSettings = sgMappingImageSettings->GetOutputMaterialSettings(0);
// Setting the size of the output material for the mapping image. This will be the output size of the
// textures when we do material casting in a later stage.
sgOutputMaterialSettings->SetTextureWidth( 1024 );
sgOutputMaterialSettings->SetTextureHeight( 1024 );
sgOutputMaterialSettings->SetMultisamplingLevel( 2 );
// Start the impostor process.
sgImpostorProcessor->RunProcessing();
// Setup and run the diffuse material casting.
Simplygon::spColorCaster sgDiffuseCaster = sg->CreateColorCaster();
sgDiffuseCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgDiffuseCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgDiffuseCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgDiffuseCaster->SetOutputFilePath( "DiffuseTexture" );
Simplygon::spColorCasterSettings sgDiffuseCasterSettings = sgDiffuseCaster->GetColorCasterSettings();
sgDiffuseCasterSettings->SetMaterialChannel( "Diffuse" );
sgDiffuseCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgDiffuseCasterSettings->SetBakeOpacityInAlpha( false );
sgDiffuseCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8G8B8 );
sgDiffuseCasterSettings->SetDilation( 10 );
sgDiffuseCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgDiffuseCaster->RunProcessing();
std::string diffuseTextureFilePath = sgDiffuseCaster->GetOutputFilePath();
// Setup and run the specular material casting.
Simplygon::spColorCaster sgSpecularCaster = sg->CreateColorCaster();
sgSpecularCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgSpecularCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgSpecularCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgSpecularCaster->SetOutputFilePath( "SpecularTexture" );
Simplygon::spColorCasterSettings sgSpecularCasterSettings = sgSpecularCaster->GetColorCasterSettings();
sgSpecularCasterSettings->SetMaterialChannel( "Specular" );
sgSpecularCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgSpecularCasterSettings->SetDilation( 10 );
sgSpecularCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgSpecularCaster->RunProcessing();
std::string specularTextureFilePath = sgSpecularCaster->GetOutputFilePath();
// Setup and run the normals material casting.
Simplygon::spNormalCaster sgNormalsCaster = sg->CreateNormalCaster();
sgNormalsCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgNormalsCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgNormalsCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgNormalsCaster->SetOutputFilePath( "NormalsTexture" );
Simplygon::spNormalCasterSettings sgNormalsCasterSettings = sgNormalsCaster->GetNormalCasterSettings();
sgNormalsCasterSettings->SetMaterialChannel( "Normals" );
sgNormalsCasterSettings->SetGenerateTangentSpaceNormals( true );
sgNormalsCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgNormalsCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8G8B8 );
sgNormalsCasterSettings->SetDilation( 10 );
sgNormalsCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgNormalsCaster->RunProcessing();
std::string normalsTextureFilePath = sgNormalsCaster->GetOutputFilePath();
// Setup and run the opacity material casting. Make sure the there is no dilation or fill.
Simplygon::spOpacityCaster sgOpacityCaster = sg->CreateOpacityCaster();
sgOpacityCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgOpacityCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgOpacityCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgOpacityCaster->SetOutputFilePath( "OpacityTexture" );
Simplygon::spOpacityCasterSettings sgOpacityCasterSettings = sgOpacityCaster->GetOpacityCasterSettings();
sgOpacityCasterSettings->SetMaterialChannel( "Opacity" );
sgOpacityCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgOpacityCasterSettings->SetDilation( 0 );
sgOpacityCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::NoFill );
sgOpacityCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8 );
sgOpacityCaster->RunProcessing();
std::string opacityTextureFilePath = sgOpacityCaster->GetOutputFilePath();
// Update scene with new casted textures.
Simplygon::spMaterialTable sgMaterialTable = sgScene->GetMaterialTable();
Simplygon::spTextureTable sgTextureTable = sgScene->GetTextureTable();
Simplygon::spMaterial sgMaterial = sgMaterialTable->GetMaterial(sgImpostorProcessor->GetBillboardCloudMaterialId());
Simplygon::spTexture sgDiffuseTexture = sg->CreateTexture();
sgDiffuseTexture->SetName( "Diffuse" );
sgDiffuseTexture->SetFilePath( diffuseTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgDiffuseTexture );
Simplygon::spShadingTextureNode sgDiffuseTextureShadingNode = sg->CreateShadingTextureNode();
sgDiffuseTextureShadingNode->SetTexCoordLevel( 0 );
sgDiffuseTextureShadingNode->SetTextureName( "Diffuse" );
sgMaterial->AddMaterialChannel( "Diffuse" );
sgMaterial->SetShadingNetwork( "Diffuse", sgDiffuseTextureShadingNode );
Simplygon::spTexture sgSpecularTexture = sg->CreateTexture();
sgSpecularTexture->SetName( "Specular" );
sgSpecularTexture->SetFilePath( specularTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgSpecularTexture );
Simplygon::spShadingTextureNode sgSpecularTextureShadingNode = sg->CreateShadingTextureNode();
sgSpecularTextureShadingNode->SetTexCoordLevel( 0 );
sgSpecularTextureShadingNode->SetTextureName( "Specular" );
sgMaterial->AddMaterialChannel( "Specular" );
sgMaterial->SetShadingNetwork( "Specular", sgSpecularTextureShadingNode );
Simplygon::spTexture sgNormalsTexture = sg->CreateTexture();
sgNormalsTexture->SetName( "Normals" );
sgNormalsTexture->SetFilePath( normalsTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgNormalsTexture );
Simplygon::spShadingTextureNode sgNormalsTextureShadingNode = sg->CreateShadingTextureNode();
sgNormalsTextureShadingNode->SetTexCoordLevel( 0 );
sgNormalsTextureShadingNode->SetTextureName( "Normals" );
sgMaterial->AddMaterialChannel( "Normals" );
sgMaterial->SetShadingNetwork( "Normals", sgNormalsTextureShadingNode );
Simplygon::spTexture sgOpacityTexture = sg->CreateTexture();
sgOpacityTexture->SetName( "Opacity" );
sgOpacityTexture->SetFilePath( opacityTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgOpacityTexture );
Simplygon::spShadingTextureNode sgOpacityTextureShadingNode = sg->CreateShadingTextureNode();
sgOpacityTextureShadingNode->SetTexCoordLevel( 0 );
sgOpacityTextureShadingNode->SetTextureName( "Opacity" );
sgMaterial->AddMaterialChannel( "Opacity" );
sgMaterial->SetShadingNetwork( "Opacity", sgOpacityTextureShadingNode );
Simplygon::spSceneExporter sgSceneExporter = sg->CreateSceneExporter();
sgSceneExporter->SetScene(sgScene);
sgSceneExporter->SetExportFilePath( "FoliageOutput.obj" );
if(!sgSceneExporter->RunExport())
throw std::exception("Failed to save FoliageOutput.obj.");
}
int main()
{
Simplygon::ISimplygon* sg = NULL;
Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg );
if( initval != Simplygon::EErrorCodes::NoError )
{
return int(initval);
}
RunBillboardCloudFoliage(sg);
Simplygon::Deinitialize(sg);
return 0;
}
# Billboard cloud, mode: Outer shell
This example shows how to use the Impostor processor type: Billboard cloud with mode: OuterShell.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include <string>
#include <stdlib.h>
#include <filesystem>
#include <future>
#include "SimplygonLoader.h"
void RunBillboardCloudOuterShell(Simplygon::ISimplygon* sg)
{
Simplygon::spSceneImporter sgSceneImporter = sg->CreateSceneImporter();
sgSceneImporter->SetImportFilePath( "../Assets/Cages/Cages.obj" );
if(!sgSceneImporter->RunImport())
throw std::exception("Failed to load Cages/Cages.obj.");
Simplygon::spScene sgScene = sgSceneImporter->GetScene();
// For all materials in the scene set the blend mode to blend (instead of opaque)
int materialCount = (int)sgScene->GetMaterialTable()->GetMaterialsCount();
for (int i = 0; i < materialCount; ++i)
{
sgScene->GetMaterialTable()->GetMaterial(i)->SetBlendMode(Simplygon::EMaterialBlendMode::Blend);
}
// Create the Impostor processor.
Simplygon::spImpostorProcessor sgImpostorProcessor = sg->CreateImpostorProcessor();
sgImpostorProcessor->SetScene( sgScene );
Simplygon::spImpostorSettings sgImpostorSettings = sgImpostorProcessor->GetImpostorSettings();
// Set impostor type to Billboard cloud.
sgImpostorSettings->SetImpostorType( Simplygon::EImpostorType::BillboardCloud );
Simplygon::spBillboardCloudSettings sgBillboardCloudSettings = sgImpostorSettings->GetBillboardCloudSettings();
// Set billboard cloud mode to OuterShell.
sgBillboardCloudSettings->SetBillboardMode( Simplygon::EBillboardMode::OuterShell );
sgBillboardCloudSettings->SetBillboardDensity( 0.5f );
sgBillboardCloudSettings->SetGeometricComplexity( 0.9f );
sgBillboardCloudSettings->SetMaxPlaneCount( 20 );
sgBillboardCloudSettings->SetTwoSided( false );
Simplygon::spMappingImageSettings sgMappingImageSettings = sgImpostorProcessor->GetMappingImageSettings();
Simplygon::spMappingImageOutputMaterialSettings sgOutputMaterialSettings = sgMappingImageSettings->GetOutputMaterialSettings(0);
// Setting the size of the output material for the mapping image. This will be the output size of the
// textures when we do material casting in a later stage.
sgOutputMaterialSettings->SetTextureWidth( 1024 );
sgOutputMaterialSettings->SetTextureHeight( 1024 );
sgOutputMaterialSettings->SetMultisamplingLevel( 2 );
// Start the impostor process.
sgImpostorProcessor->RunProcessing();
// Setup and run the diffuse material casting.
Simplygon::spColorCaster sgDiffuseCaster = sg->CreateColorCaster();
sgDiffuseCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgDiffuseCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgDiffuseCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgDiffuseCaster->SetOutputFilePath( "DiffuseTexture" );
Simplygon::spColorCasterSettings sgDiffuseCasterSettings = sgDiffuseCaster->GetColorCasterSettings();
sgDiffuseCasterSettings->SetMaterialChannel( "Diffuse" );
sgDiffuseCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgDiffuseCasterSettings->SetBakeOpacityInAlpha( false );
sgDiffuseCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8G8B8 );
sgDiffuseCasterSettings->SetDilation( 10 );
sgDiffuseCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgDiffuseCaster->RunProcessing();
std::string diffuseTextureFilePath = sgDiffuseCaster->GetOutputFilePath();
// Setup and run the specular material casting.
Simplygon::spColorCaster sgSpecularCaster = sg->CreateColorCaster();
sgSpecularCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgSpecularCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgSpecularCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgSpecularCaster->SetOutputFilePath( "SpecularTexture" );
Simplygon::spColorCasterSettings sgSpecularCasterSettings = sgSpecularCaster->GetColorCasterSettings();
sgSpecularCasterSettings->SetMaterialChannel( "Specular" );
sgSpecularCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgSpecularCasterSettings->SetDilation( 10 );
sgSpecularCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgSpecularCaster->RunProcessing();
std::string specularTextureFilePath = sgSpecularCaster->GetOutputFilePath();
// Setup and run the normals material casting.
Simplygon::spNormalCaster sgNormalsCaster = sg->CreateNormalCaster();
sgNormalsCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgNormalsCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgNormalsCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgNormalsCaster->SetOutputFilePath( "NormalsTexture" );
Simplygon::spNormalCasterSettings sgNormalsCasterSettings = sgNormalsCaster->GetNormalCasterSettings();
sgNormalsCasterSettings->SetMaterialChannel( "Normals" );
sgNormalsCasterSettings->SetGenerateTangentSpaceNormals( true );
sgNormalsCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgNormalsCasterSettings->SetDilation( 10 );
sgNormalsCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgNormalsCaster->RunProcessing();
std::string normalsTextureFilePath = sgNormalsCaster->GetOutputFilePath();
// Setup and run the opacity material casting. Make sure the there is no dilation or fill.
Simplygon::spOpacityCaster sgOpacityCaster = sg->CreateOpacityCaster();
sgOpacityCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgOpacityCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgOpacityCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgOpacityCaster->SetOutputFilePath( "OpacityTexture" );
Simplygon::spOpacityCasterSettings sgOpacityCasterSettings = sgOpacityCaster->GetOpacityCasterSettings();
sgOpacityCasterSettings->SetMaterialChannel( "Opacity" );
sgOpacityCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgOpacityCasterSettings->SetDilation( 0 );
sgOpacityCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::NoFill );
sgOpacityCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8 );
sgOpacityCaster->RunProcessing();
std::string opacityTextureFilePath = sgOpacityCaster->GetOutputFilePath();
// Update scene with new casted textures.
Simplygon::spMaterialTable sgMaterialTable = sg->CreateMaterialTable();
Simplygon::spTextureTable sgTextureTable = sg->CreateTextureTable();
Simplygon::spMaterial sgMaterial = sg->CreateMaterial();
Simplygon::spTexture sgDiffuseTexture = sg->CreateTexture();
sgDiffuseTexture->SetName( "Diffuse" );
sgDiffuseTexture->SetFilePath( diffuseTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgDiffuseTexture );
Simplygon::spShadingTextureNode sgDiffuseTextureShadingNode = sg->CreateShadingTextureNode();
sgDiffuseTextureShadingNode->SetTexCoordLevel( 0 );
sgDiffuseTextureShadingNode->SetTextureName( "Diffuse" );
sgMaterial->AddMaterialChannel( "Diffuse" );
sgMaterial->SetShadingNetwork( "Diffuse", sgDiffuseTextureShadingNode );
Simplygon::spTexture sgSpecularTexture = sg->CreateTexture();
sgSpecularTexture->SetName( "Specular" );
sgSpecularTexture->SetFilePath( specularTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgSpecularTexture );
Simplygon::spShadingTextureNode sgSpecularTextureShadingNode = sg->CreateShadingTextureNode();
sgSpecularTextureShadingNode->SetTexCoordLevel( 0 );
sgSpecularTextureShadingNode->SetTextureName( "Specular" );
sgMaterial->AddMaterialChannel( "Specular" );
sgMaterial->SetShadingNetwork( "Specular", sgSpecularTextureShadingNode );
Simplygon::spTexture sgNormalsTexture = sg->CreateTexture();
sgNormalsTexture->SetName( "Normals" );
sgNormalsTexture->SetFilePath( normalsTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgNormalsTexture );
Simplygon::spShadingTextureNode sgNormalsTextureShadingNode = sg->CreateShadingTextureNode();
sgNormalsTextureShadingNode->SetTexCoordLevel( 0 );
sgNormalsTextureShadingNode->SetTextureName( "Normals" );
sgMaterial->AddMaterialChannel( "Normals" );
sgMaterial->SetShadingNetwork( "Normals", sgNormalsTextureShadingNode );
Simplygon::spTexture sgOpacityTexture = sg->CreateTexture();
sgOpacityTexture->SetName( "Opacity" );
sgOpacityTexture->SetFilePath( opacityTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgOpacityTexture );
Simplygon::spShadingTextureNode sgOpacityTextureShadingNode = sg->CreateShadingTextureNode();
sgOpacityTextureShadingNode->SetTexCoordLevel( 0 );
sgOpacityTextureShadingNode->SetTextureName( "Opacity" );
sgMaterial->AddMaterialChannel( "Opacity" );
sgMaterial->SetShadingNetwork( "Opacity", sgOpacityTextureShadingNode );
sgMaterialTable->AddMaterial( sgMaterial );
sgScene->GetTextureTable()->Clear();
sgScene->GetMaterialTable()->Clear();
sgScene->GetTextureTable()->Copy(sgTextureTable);
sgScene->GetMaterialTable()->Copy(sgMaterialTable);
Simplygon::spSceneExporter sgSceneExporter = sg->CreateSceneExporter();
sgSceneExporter->SetScene(sgScene);
sgSceneExporter->SetExportFilePath( "OuterShellOutput.obj" );
if(!sgSceneExporter->RunExport())
throw std::exception("Failed to save OuterShellOutput.obj.");
}
int main()
{
Simplygon::ISimplygon* sg = NULL;
Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg );
if( initval != Simplygon::EErrorCodes::NoError )
{
return int(initval);
}
RunBillboardCloudOuterShell(sg);
Simplygon::Deinitialize(sg);
return 0;
}
# Flip book
This example shows how to use the Impostor processor type: Flip book.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include <string>
#include <stdlib.h>
#include <filesystem>
#include <future>
#include "SimplygonLoader.h"
void RunFlipbook(Simplygon::ISimplygon* sg)
{
Simplygon::spSceneImporter sgSceneImporter = sg->CreateSceneImporter();
sgSceneImporter->SetImportFilePath( "../Assets/Tree/Tree.obj" );
if(!sgSceneImporter->RunImport())
throw std::exception("Failed to load Tree/Tree.obj.");
Simplygon::spScene sgScene = sgSceneImporter->GetScene();
// For all materials in the scene set the blend mode to blend (instead of opaque)
int materialCount = (int)sgScene->GetMaterialTable()->GetMaterialsCount();
for (int i = 0; i < materialCount; ++i)
{
sgScene->GetMaterialTable()->GetMaterial(i)->SetBlendMode(Simplygon::EMaterialBlendMode::Blend);
}
// Create the Impostor processor.
Simplygon::spImpostorProcessor sgImpostorProcessor = sg->CreateImpostorProcessor();
sgImpostorProcessor->SetScene( sgScene );
Simplygon::spImpostorSettings sgImpostorSettings = sgImpostorProcessor->GetImpostorSettings();
// Set impostor type to From single view.
sgImpostorSettings->SetImpostorType( Simplygon::EImpostorType::Flipbook );
Simplygon::spFlipbookSettings sgFlipbookSettings = sgImpostorSettings->GetFlipbookSettings();
sgFlipbookSettings->SetNumberOfViews( 9 );
sgFlipbookSettings->SetViewDirectionX( 1.0f );
sgFlipbookSettings->SetViewDirectionY( 0.0f );
sgFlipbookSettings->SetViewDirectionZ( 0.0f );
sgFlipbookSettings->SetUpVectorX( 0.0f );
sgFlipbookSettings->SetUpVectorY( 1.0f );
sgFlipbookSettings->SetUpVectorZ( 0.0f );
Simplygon::spMappingImageSettings sgMappingImageSettings = sgImpostorProcessor->GetMappingImageSettings();
sgMappingImageSettings->SetMaximumLayers( 10 );
Simplygon::spMappingImageOutputMaterialSettings sgOutputMaterialSettings = sgMappingImageSettings->GetOutputMaterialSettings(0);
// Setting the size of the output material for the mapping image. This will be the output size of the
// textures when we do material casting in a later stage.
sgOutputMaterialSettings->SetTextureWidth( 256 );
sgOutputMaterialSettings->SetTextureHeight( 256 );
sgOutputMaterialSettings->SetMultisamplingLevel( 2 );
// Start the impostor process.
sgImpostorProcessor->RunProcessing();
// Setup and run the diffuse material casting.
Simplygon::spColorCaster sgDiffuseCaster = sg->CreateColorCaster();
sgDiffuseCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgDiffuseCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgDiffuseCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgDiffuseCaster->SetOutputFilePath( "DiffuseTexture" );
Simplygon::spColorCasterSettings sgDiffuseCasterSettings = sgDiffuseCaster->GetColorCasterSettings();
sgDiffuseCasterSettings->SetMaterialChannel( "Diffuse" );
sgDiffuseCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgDiffuseCasterSettings->SetBakeOpacityInAlpha( false );
sgDiffuseCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8G8B8 );
sgDiffuseCasterSettings->SetDilation( 10 );
sgDiffuseCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgDiffuseCaster->RunProcessing();
std::string diffuseTextureFilePath = sgDiffuseCaster->GetOutputFilePath();
// Setup and run the specular material casting.
Simplygon::spColorCaster sgSpecularCaster = sg->CreateColorCaster();
sgSpecularCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgSpecularCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgSpecularCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgSpecularCaster->SetOutputFilePath( "SpecularTexture" );
Simplygon::spColorCasterSettings sgSpecularCasterSettings = sgSpecularCaster->GetColorCasterSettings();
sgSpecularCasterSettings->SetMaterialChannel( "Specular" );
sgSpecularCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgSpecularCasterSettings->SetDilation( 10 );
sgSpecularCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgSpecularCaster->RunProcessing();
std::string specularTextureFilePath = sgSpecularCaster->GetOutputFilePath();
// Setup and run the normals material casting.
Simplygon::spNormalCaster sgNormalsCaster = sg->CreateNormalCaster();
sgNormalsCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgNormalsCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgNormalsCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgNormalsCaster->SetOutputFilePath( "NormalsTexture" );
Simplygon::spNormalCasterSettings sgNormalsCasterSettings = sgNormalsCaster->GetNormalCasterSettings();
sgNormalsCasterSettings->SetMaterialChannel( "Normals" );
sgNormalsCasterSettings->SetGenerateTangentSpaceNormals( true );
sgNormalsCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgNormalsCasterSettings->SetDilation( 10 );
sgNormalsCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgNormalsCaster->RunProcessing();
std::string normalsTextureFilePath = sgNormalsCaster->GetOutputFilePath();
// Setup and run the opacity material casting. Make sure the there is no dilation or fill.
Simplygon::spOpacityCaster sgOpacityCaster = sg->CreateOpacityCaster();
sgOpacityCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgOpacityCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgOpacityCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgOpacityCaster->SetOutputFilePath( "OpacityTexture" );
Simplygon::spOpacityCasterSettings sgOpacityCasterSettings = sgOpacityCaster->GetOpacityCasterSettings();
sgOpacityCasterSettings->SetMaterialChannel( "Opacity" );
sgOpacityCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgOpacityCasterSettings->SetDilation( 0 );
sgOpacityCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::NoFill );
sgOpacityCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8 );
sgOpacityCaster->RunProcessing();
std::string opacityTextureFilePath = sgOpacityCaster->GetOutputFilePath();
// Update scene with new casted textures.
Simplygon::spMaterialTable sgMaterialTable = sg->CreateMaterialTable();
Simplygon::spTextureTable sgTextureTable = sg->CreateTextureTable();
Simplygon::spMaterial sgMaterial = sg->CreateMaterial();
Simplygon::spTexture sgDiffuseTexture = sg->CreateTexture();
sgDiffuseTexture->SetName( "Diffuse" );
sgDiffuseTexture->SetFilePath( diffuseTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgDiffuseTexture );
Simplygon::spShadingTextureNode sgDiffuseTextureShadingNode = sg->CreateShadingTextureNode();
sgDiffuseTextureShadingNode->SetTexCoordLevel( 0 );
sgDiffuseTextureShadingNode->SetTextureName( "Diffuse" );
sgMaterial->AddMaterialChannel( "Diffuse" );
sgMaterial->SetShadingNetwork( "Diffuse", sgDiffuseTextureShadingNode );
Simplygon::spTexture sgSpecularTexture = sg->CreateTexture();
sgSpecularTexture->SetName( "Specular" );
sgSpecularTexture->SetFilePath( specularTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgSpecularTexture );
Simplygon::spShadingTextureNode sgSpecularTextureShadingNode = sg->CreateShadingTextureNode();
sgSpecularTextureShadingNode->SetTexCoordLevel( 0 );
sgSpecularTextureShadingNode->SetTextureName( "Specular" );
sgMaterial->AddMaterialChannel( "Specular" );
sgMaterial->SetShadingNetwork( "Specular", sgSpecularTextureShadingNode );
Simplygon::spTexture sgNormalsTexture = sg->CreateTexture();
sgNormalsTexture->SetName( "Normals" );
sgNormalsTexture->SetFilePath( normalsTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgNormalsTexture );
Simplygon::spShadingTextureNode sgNormalsTextureShadingNode = sg->CreateShadingTextureNode();
sgNormalsTextureShadingNode->SetTexCoordLevel( 0 );
sgNormalsTextureShadingNode->SetTextureName( "Normals" );
sgMaterial->AddMaterialChannel( "Normals" );
sgMaterial->SetShadingNetwork( "Normals", sgNormalsTextureShadingNode );
Simplygon::spTexture sgOpacityTexture = sg->CreateTexture();
sgOpacityTexture->SetName( "Opacity" );
sgOpacityTexture->SetFilePath( opacityTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgOpacityTexture );
Simplygon::spShadingTextureNode sgOpacityTextureShadingNode = sg->CreateShadingTextureNode();
sgOpacityTextureShadingNode->SetTexCoordLevel( 0 );
sgOpacityTextureShadingNode->SetTextureName( "Opacity" );
sgMaterial->AddMaterialChannel( "Opacity" );
sgMaterial->SetShadingNetwork( "Opacity", sgOpacityTextureShadingNode );
sgMaterialTable->AddMaterial( sgMaterial );
sgScene->GetTextureTable()->Clear();
sgScene->GetMaterialTable()->Clear();
sgScene->GetTextureTable()->Copy(sgTextureTable);
sgScene->GetMaterialTable()->Copy(sgMaterialTable);
Simplygon::spSceneExporter sgSceneExporter = sg->CreateSceneExporter();
sgSceneExporter->SetScene(sgScene);
sgSceneExporter->SetExportFilePath( "FlipbookOutput.obj" );
if(!sgSceneExporter->RunExport())
throw std::exception("Failed to save FlipbookOutput.obj.");
}
int main()
{
Simplygon::ISimplygon* sg = NULL;
Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg );
if( initval != Simplygon::EErrorCodes::NoError )
{
return int(initval);
}
RunFlipbook(sg);
Simplygon::Deinitialize(sg);
return 0;
}
# From single view
This example shows how to use the Impostor processor type: Impostor from single view.
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
#include <string>
#include <stdlib.h>
#include <filesystem>
#include <future>
#include "SimplygonLoader.h"
void RunImpostorFromSingleView(Simplygon::ISimplygon* sg)
{
Simplygon::spSceneImporter sgSceneImporter = sg->CreateSceneImporter();
sgSceneImporter->SetImportFilePath( "../Assets/Wall/Wall.obj" );
if(!sgSceneImporter->RunImport())
throw std::exception("Failed to load Wall/Wall.obj.");
Simplygon::spScene sgScene = sgSceneImporter->GetScene();
// For all materials in the scene set the blend mode to blend (instead of opaque)
int materialCount = (int)sgScene->GetMaterialTable()->GetMaterialsCount();
for (int i = 0; i < materialCount; ++i)
{
sgScene->GetMaterialTable()->GetMaterial(i)->SetBlendMode(Simplygon::EMaterialBlendMode::Blend);
}
// Create the Impostor processor.
Simplygon::spImpostorProcessor sgImpostorProcessor = sg->CreateImpostorProcessor();
sgImpostorProcessor->SetScene( sgScene );
Simplygon::spImpostorSettings sgImpostorSettings = sgImpostorProcessor->GetImpostorSettings();
// Set impostor type to From single view.
sgImpostorSettings->SetImpostorType( Simplygon::EImpostorType::FromSingleView );
Simplygon::real viewDir[] = {0.0f, 0.0f, -1.0f};
Simplygon::spImpostorFromSingleViewSettings sgImpostorFromSingleViewSettings = sgImpostorSettings->GetImpostorFromSingleViewSettings();
sgImpostorFromSingleViewSettings->SetUseTightFitting( true );
sgImpostorFromSingleViewSettings->SetTightFittingDepthOffset( 1.0f );
sgImpostorFromSingleViewSettings->SetTexCoordPadding( 0.01f );
sgImpostorFromSingleViewSettings->SetViewDirection( viewDir );
// Once geometry and settings are set, you can calculate the aspect ratio for the textures.
Simplygon::real aspect = sgImpostorProcessor->GetSingleViewAspectRatio();
if (aspect < 0.0f)
throw std::exception("Failed to compute aspect ratio!");
int xDim = int(aspect * 512);
int yDim = int(1.f * 512);
Simplygon::spMappingImageSettings sgMappingImageSettings = sgImpostorProcessor->GetMappingImageSettings();
sgMappingImageSettings->SetMaximumLayers( 10 );
Simplygon::spMappingImageOutputMaterialSettings sgOutputMaterialSettings = sgMappingImageSettings->GetOutputMaterialSettings(0);
// Setting the size of the output material for the mapping image. This will be the output size of the
// textures when we do material casting in a later stage.
sgOutputMaterialSettings->SetTextureWidth( xDim );
sgOutputMaterialSettings->SetTextureHeight( yDim );
sgOutputMaterialSettings->SetMultisamplingLevel( 2 );
// Start the impostor process.
sgImpostorProcessor->RunProcessing();
// Setup and run the diffuse material casting.
Simplygon::spColorCaster sgDiffuseCaster = sg->CreateColorCaster();
sgDiffuseCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgDiffuseCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgDiffuseCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgDiffuseCaster->SetOutputFilePath( "DiffuseTexture" );
Simplygon::spColorCasterSettings sgDiffuseCasterSettings = sgDiffuseCaster->GetColorCasterSettings();
sgDiffuseCasterSettings->SetMaterialChannel( "Diffuse" );
sgDiffuseCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgDiffuseCasterSettings->SetBakeOpacityInAlpha( false );
sgDiffuseCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8G8B8 );
sgDiffuseCasterSettings->SetDilation( 10 );
sgDiffuseCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgDiffuseCaster->RunProcessing();
std::string diffuseTextureFilePath = sgDiffuseCaster->GetOutputFilePath();
// Setup and run the specular material casting.
Simplygon::spColorCaster sgSpecularCaster = sg->CreateColorCaster();
sgSpecularCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgSpecularCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgSpecularCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgSpecularCaster->SetOutputFilePath( "SpecularTexture" );
Simplygon::spColorCasterSettings sgSpecularCasterSettings = sgSpecularCaster->GetColorCasterSettings();
sgSpecularCasterSettings->SetMaterialChannel( "Specular" );
sgSpecularCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgSpecularCasterSettings->SetDilation( 10 );
sgSpecularCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgSpecularCaster->RunProcessing();
std::string specularTextureFilePath = sgSpecularCaster->GetOutputFilePath();
// Setup and run the normals material casting.
Simplygon::spNormalCaster sgNormalsCaster = sg->CreateNormalCaster();
sgNormalsCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgNormalsCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgNormalsCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgNormalsCaster->SetOutputFilePath( "NormalsTexture" );
Simplygon::spNormalCasterSettings sgNormalsCasterSettings = sgNormalsCaster->GetNormalCasterSettings();
sgNormalsCasterSettings->SetMaterialChannel( "Normals" );
sgNormalsCasterSettings->SetGenerateTangentSpaceNormals( true );
sgNormalsCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgNormalsCasterSettings->SetDilation( 10 );
sgNormalsCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::Interpolate );
sgNormalsCaster->RunProcessing();
std::string normalsTextureFilePath = sgNormalsCaster->GetOutputFilePath();
// Setup and run the opacity material casting. Make sure the there is no dilation or fill.
Simplygon::spOpacityCaster sgOpacityCaster = sg->CreateOpacityCaster();
sgOpacityCaster->SetMappingImage( sgImpostorProcessor->GetMappingImage() );
sgOpacityCaster->SetSourceMaterials( sgScene->GetMaterialTable() );
sgOpacityCaster->SetSourceTextures( sgScene->GetTextureTable() );
sgOpacityCaster->SetOutputFilePath( "OpacityTexture" );
Simplygon::spOpacityCasterSettings sgOpacityCasterSettings = sgOpacityCaster->GetOpacityCasterSettings();
sgOpacityCasterSettings->SetMaterialChannel( "Opacity" );
sgOpacityCasterSettings->SetOutputImageFileFormat( Simplygon::EImageOutputFormat::PNG );
sgOpacityCasterSettings->SetDilation( 0 );
sgOpacityCasterSettings->SetFillMode( Simplygon::EAtlasFillMode::NoFill );
sgOpacityCasterSettings->SetOutputPixelFormat( Simplygon::EPixelFormat::R8 );
sgOpacityCaster->RunProcessing();
std::string opacityTextureFilePath = sgOpacityCaster->GetOutputFilePath();
// Update scene with new casted textures.
Simplygon::spMaterialTable sgMaterialTable = sg->CreateMaterialTable();
Simplygon::spTextureTable sgTextureTable = sg->CreateTextureTable();
Simplygon::spMaterial sgMaterial = sg->CreateMaterial();
Simplygon::spTexture sgDiffuseTexture = sg->CreateTexture();
sgDiffuseTexture->SetName( "Diffuse" );
sgDiffuseTexture->SetFilePath( diffuseTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgDiffuseTexture );
Simplygon::spShadingTextureNode sgDiffuseTextureShadingNode = sg->CreateShadingTextureNode();
sgDiffuseTextureShadingNode->SetTexCoordLevel( 0 );
sgDiffuseTextureShadingNode->SetTextureName( "Diffuse" );
sgMaterial->AddMaterialChannel( "Diffuse" );
sgMaterial->SetShadingNetwork( "Diffuse", sgDiffuseTextureShadingNode );
Simplygon::spTexture sgSpecularTexture = sg->CreateTexture();
sgSpecularTexture->SetName( "Specular" );
sgSpecularTexture->SetFilePath( specularTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgSpecularTexture );
Simplygon::spShadingTextureNode sgSpecularTextureShadingNode = sg->CreateShadingTextureNode();
sgSpecularTextureShadingNode->SetTexCoordLevel( 0 );
sgSpecularTextureShadingNode->SetTextureName( "Specular" );
sgMaterial->AddMaterialChannel( "Specular" );
sgMaterial->SetShadingNetwork( "Specular", sgSpecularTextureShadingNode );
Simplygon::spTexture sgNormalsTexture = sg->CreateTexture();
sgNormalsTexture->SetName( "Normals" );
sgNormalsTexture->SetFilePath( normalsTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgNormalsTexture );
Simplygon::spShadingTextureNode sgNormalsTextureShadingNode = sg->CreateShadingTextureNode();
sgNormalsTextureShadingNode->SetTexCoordLevel( 0 );
sgNormalsTextureShadingNode->SetTextureName( "Normals" );
sgMaterial->AddMaterialChannel( "Normals" );
sgMaterial->SetShadingNetwork( "Normals", sgNormalsTextureShadingNode );
Simplygon::spTexture sgOpacityTexture = sg->CreateTexture();
sgOpacityTexture->SetName( "Opacity" );
sgOpacityTexture->SetFilePath( opacityTextureFilePath.c_str() );
sgTextureTable->AddTexture( sgOpacityTexture );
Simplygon::spShadingTextureNode sgOpacityTextureShadingNode = sg->CreateShadingTextureNode();
sgOpacityTextureShadingNode->SetTexCoordLevel( 0 );
sgOpacityTextureShadingNode->SetTextureName( "Opacity" );
sgMaterial->AddMaterialChannel( "Opacity" );
sgMaterial->SetShadingNetwork( "Opacity", sgOpacityTextureShadingNode );
sgMaterialTable->AddMaterial( sgMaterial );
sgScene->GetTextureTable()->Clear();
sgScene->GetMaterialTable()->Clear();
sgScene->GetTextureTable()->Copy(sgTextureTable);
sgScene->GetMaterialTable()->Copy(sgMaterialTable);
Simplygon::spScene sgImpostorScene = sg->CreateScene();
Simplygon::spGeometryData sgImpostorGeometry = sgImpostorProcessor->GetImpostorGeometryFromSingleView();
sgImpostorScene->GetRootNode()->CreateChildMesh(sgImpostorGeometry);
sgImpostorScene->GetMaterialTable()->Copy(sgScene->GetMaterialTable());
sgImpostorScene->GetTextureTable()->Copy(sgScene->GetTextureTable());
Simplygon::spSceneExporter sgSceneExporter = sg->CreateSceneExporter();
sgSceneExporter->SetScene(sgImpostorScene);
sgSceneExporter->SetExportFilePath( "ImpostorFromSingleViewOutput.obj" );
if(!sgSceneExporter->RunExport())
throw std::exception("Failed to save ImpostorFromSingleViewOutput.obj.");
}
int main()
{
Simplygon::ISimplygon* sg = NULL;
Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg );
if( initval != Simplygon::EErrorCodes::NoError )
{
return int(initval);
}
RunImpostorFromSingleView(sg);
Simplygon::Deinitialize(sg);
return 0;
}