This example shows how to use the Reduction processor with a visibility camera.
// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. #include <string> #include <stdlib.h> #include <filesystem> #include <future> #include "SimplygonLoader.h" void RunReduction(Simplygon::ISimplygon* sg) { Simplygon::spSceneImporter sgSceneImporter = sg->CreateSceneImporter(); sgSceneImporter->SetImportFilePath( "../Assets/ObscuredTeapot/Teapot.obj" ); if(!sgSceneImporter->RunImport()) throw std::exception("Failed to load ObscuredTeapot/Teapot.obj."); Simplygon::spScene sgScene = sgSceneImporter->GetScene(); // Create the reduction processor. Simplygon::spReductionProcessor sgReductionProcessor = sg->CreateReductionProcessor(); sgReductionProcessor->SetScene( sgScene ); Simplygon::spReductionSettings sgReductionSettings = sgReductionProcessor->GetReductionSettings(); Simplygon::spVisibilitySettings sgVisibilitySettings = sgReductionProcessor->GetVisibilitySettings(); // Set reduction target to triangle ratio with a ratio of 50%. sgReductionSettings->SetReductionTargets( Simplygon::EStopCondition::All, true, false, false, false ); sgReductionSettings->SetReductionTargetTriangleRatio( 0.5f ); // Add a camera to the scene. We'll use this later as a visibility camera. Simplygon::spSelectionSetTable sgSceneSelectionSetTable = sgScene->GetSelectionSetTable(); Simplygon::spSelectionSet sgCameraSelectionSet = sg->CreateSelectionSet(); sgCameraSelectionSet->SetName("Camera"); Simplygon::spSceneCamera sgCameraSceneCamera = sg->CreateSceneCamera(); sgCameraSceneCamera->SetCustomSphereCameraPath(4, 90, 180, 90); sgScene->GetRootNode()->AddChild(sgCameraSceneCamera); sgCameraSelectionSet->AddItem(sgCameraSceneCamera->GetNodeGUID()); sgSceneSelectionSetTable->AddSelectionSet(sgCameraSelectionSet); // Use the camera previously added. sgVisibilitySettings->SetCameraSelectionSetName( "Camera" ); // Enabled GPU based visibility calculations. sgVisibilitySettings->SetComputeVisibilityMode( Simplygon::EComputeVisibilityMode::DirectX ); // Disabled conservative mode. sgVisibilitySettings->SetConservativeMode( false ); // Remove all non visible geometry. sgVisibilitySettings->SetCullOccludedGeometry( true ); // Skip filling nonvisible regions. sgVisibilitySettings->SetFillNonVisibleAreaThreshold( 0.0f ); // Don't remove non occluding triangles. sgVisibilitySettings->SetRemoveTrianglesNotOccludingOtherTriangles( false ); // Remove all back facing triangles. sgVisibilitySettings->SetUseBackfaceCulling( true ); // Don't use visibility weights. sgVisibilitySettings->SetUseVisibilityWeightsInReducer( false ); // Start the reduction process. sgReductionProcessor->RunProcessing(); Simplygon::spSceneExporter sgSceneExporter = sg->CreateSceneExporter(); sgSceneExporter->SetScene(sgScene); sgSceneExporter->SetExportFilePath( "ReductionOutput.fbx" ); if(!sgSceneExporter->RunExport()) throw std::exception("Failed to save ReductionOutput.fbx."); } void main() { Simplygon::ISimplygon* sg = NULL; Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg ); if( initval != Simplygon::EErrorCodes::NoError ) { return; } RunReduction(sg); Simplygon::Deinitialize(sg); }
Copied!