# Copyright (c) Microsoft Corporation. 
# Licensed under the MIT license. 

import math
import os
import sys
import glob
import gc
import threading

from pathlib import Path
from simplygon import simplygon_loader
from simplygon import Simplygon


def RunAggregation(sg: Simplygon.ISimplygon):
    sgSceneImporter = sg.CreateSceneImporter()
    sgSceneImporter.SetImportFilePath( "../Assets/ObscuredTeapot/ObscuredTeapot.obj" )
    if not sgSceneImporter.RunImport():
        raise Exception("Failed to load ObscuredTeapot/ObscuredTeapot.obj.")
    sgScene = sgSceneImporter.GetScene()

    # Create the aggregation pipeline. 
    sgAggregationPipeline = sg.CreateAggregationPipeline()

    sgAggregationSettings = sgAggregationPipeline.GetAggregationSettings()

    # Add a selection set to the scene with all nodes which should be aggregated. 
    sgSceneSelectionSetTable = sgScene.GetSelectionSetTable()
    sgAggregationTargetSelectionSet = sg.CreateSelectionSet()
    sgAggregationTargetSelectionSet.SetName("AggregationTarget")
    sgRootTeapot001 = sgScene.GetNodeFromPath("Root/Teapot001")
    if sgRootTeapot001 is not None:
        sgAggregationTargetSelectionSet.AddItem(sgRootTeapot001.GetNodeGUID())
    sgSceneSelectionSetTable.AddSelectionSet(sgAggregationTargetSelectionSet)

    # Merge all geometries into a single geometry. 
    sgAggregationSettings.SetMergeGeometries( True )

    # Use the selection set created earlier. 
    sgAggregationSettings.SetProcessSelectionSetName( "AggregationTarget" )

    # Start the aggregation pipeline. 
    sgAggregationPipeline.RunScene(sgScene, Simplygon.EPipelineRunMode_RunInThisProcess)

    # Get the processed scene. 
    sgProcessedScene = sgAggregationPipeline.GetProcessedScene()

    sgSceneExporter = sg.CreateSceneExporter()
    sgSceneExporter.SetScene(sgProcessedScene)
    sgSceneExporter.SetExportFilePath( "AggregationOutput.fbx" )
    if not sgSceneExporter.RunExport():
        raise Exception("Failed to save AggregationOutput.fbx.")


if __name__ == '__main__':
    sg = simplygon_loader.init_simplygon()

    RunAggregation(sg)

    sg = None
    gc.collect()

