# Simplygon Batch and SPL
In Simplygon 9, SPL has been replace by pipelines. You can either use pipelines from C++, C# or Python or via the Simplygon UI integrated into all our integrations.
In the Simplygon UI in Maya, Max and Unity you can import SPL files and they are converted automatically to Simplygon 9 pipelines.
Simplygon Batch in 8 is also replaced by the pipeline connect. You can now script you own batch script in C++,C# or Python with full access to our process distribution options.
Here is an example of a simple batch script using pipelines.
This example shows how to do batch processing.
// 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, std::string inputFile, std::string outputFile)
{
// Create the reduction pipeline.
Simplygon::spReductionPipeline sgReductionPipeline = sg->CreateReductionPipeline();
Simplygon::spReductionSettings sgReductionSettings = sgReductionPipeline->GetReductionSettings();
// Set reduction target to triangle ratio with a ratio of 50%.
sgReductionSettings->SetReductionTargets( Simplygon::EStopCondition::All, true, false, false, false );
sgReductionSettings->SetReductionTargetTriangleRatio( 0.5f );
// Start the reduction pipeline.
sgReductionPipeline->RunSceneFromFile(inputFile.c_str(), outputFile.c_str(), Simplygon::EPipelineRunMode::RunInNewProcess);
}
void main()
{
Simplygon::ISimplygon* sg = NULL;
Simplygon::EErrorCodes initval = Simplygon::Initialize( &sg );
if( initval != Simplygon::EErrorCodes::NoError )
{
return;
}
for(auto& itr: std::filesystem::recursive_directory_iterator("../Assets/"))
{
if (itr.path().extension().compare(".gltf") != 0)
continue;
std::string inputFile = itr.path().generic_u8string();
std::string outputFile = itr.path().stem().concat("_LOD").concat( itr.path().extension().generic_u8string() ).generic_u8string();
RunReduction(sg, inputFile, outputFile);
}
Simplygon::Deinitialize(sg);
}
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
using System;
using System.IO;
using System.Threading.Tasks;
public class Program
{
static void RunReduction(Simplygon.ISimplygon sg, string inputFile, string outputFile)
{
// Create the reduction pipeline.
using (Simplygon.spReductionPipeline sgReductionPipeline = sg.CreateReductionPipeline())
{
using (Simplygon.spReductionSettings sgReductionSettings = sgReductionPipeline.GetReductionSettings())
{
// Set reduction target to triangle ratio with a ratio of 50%.
sgReductionSettings.SetReductionTargets( Simplygon.EStopCondition.All, true, false, false, false );
sgReductionSettings.SetReductionTargetTriangleRatio( 0.5f );
}
// Start the reduction pipeline.
sgReductionPipeline.RunSceneFromFile(inputFile, outputFile, Simplygon.EPipelineRunMode.RunInNewProcess);
}
}
static void Main(string[] args)
{
using (var sg = Simplygon.Loader.InitSimplygon(out var errorCode, out var errorMessage))
{
if (errorCode != Simplygon.EErrorCodes.NoError)
return;
var inputFiles = Directory.EnumerateFiles("../Assets/", "*.gltf", SearchOption.AllDirectories);
foreach (string inputFile in inputFiles)
{
string outputFile = Path.Combine(Path.GetFileNameWithoutExtension(inputFile) + "_LOD" + Path.GetExtension(inputFile));
RunReduction(sg, inputFile, outputFile);
}
}
}
}
# 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 RunReduction(sg: Simplygon.ISimplygon, inputFile, outputFile):
# Create the reduction pipeline.
sgReductionPipeline = sg.CreateReductionPipeline()
sgReductionSettings = sgReductionPipeline.GetReductionSettings()
# Set reduction target to triangle ratio with a ratio of 50%.
sgReductionSettings.SetReductionTargets( Simplygon.EStopCondition_All, True, False, False, False )
sgReductionSettings.SetReductionTargetTriangleRatio( 0.5 )
# Start the reduction pipeline.
sgReductionPipeline.RunSceneFromFile(inputFile, outputFile, Simplygon.EPipelineRunMode_RunInNewProcess)
if __name__ == '__main__':
sg = simplygon_loader.init_simplygon()
if sg is not None:
inputFiles = glob.glob('../Assets/' + '/**/*.gltf', recursive=True)
for inputFile in inputFiles:
outputFile = Path(inputFile).stem + '_LOD' + Path(inputFile).suffix
RunReduction(sg, inputFile, outputFile)
sg = None
gc.collect()