<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://ricardoreis.net/trilibwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Trilib</id>
	<title>TriLib - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="https://ricardoreis.net/trilibwiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Trilib"/>
	<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php/Especial:Contribui%C3%A7%C3%B5es/Trilib"/>
	<updated>2026-10-26T09:06:50Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=142</id>
		<title>Supported File Formats</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=142"/>
		<updated>2025-01-26T01:34:59Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib 2.0 works with a smaller file-formats subset compared with the first version. This decision has been taken to focus on the most used file-formats and offer a more stable and feature-rich experience with these formats.&lt;br /&gt;
==Model file formats:==&lt;br /&gt;
FBX (Accepts version 7.0 onwards)&lt;br /&gt;
&lt;br /&gt;
OBJ&lt;br /&gt;
&lt;br /&gt;
GLTF 2 (Accepts Draco decompression using an experimental feature)&lt;br /&gt;
&lt;br /&gt;
STL&lt;br /&gt;
&lt;br /&gt;
PLY&lt;br /&gt;
&lt;br /&gt;
3MF (No extension supported)&lt;br /&gt;
&lt;br /&gt;
ZIP&lt;br /&gt;
&lt;br /&gt;
DAE (Collada) support is experimental. The full Collada support is in the works.&lt;br /&gt;
==Texture file formats:==&lt;br /&gt;
BMP&lt;br /&gt;
&lt;br /&gt;
GIF&lt;br /&gt;
&lt;br /&gt;
JPG&lt;br /&gt;
&lt;br /&gt;
PNG&lt;br /&gt;
&lt;br /&gt;
PSD&lt;br /&gt;
&lt;br /&gt;
TGA&lt;br /&gt;
&lt;br /&gt;
HDR (Used to load Skyboxes, not ready for common Texture usage)&lt;br /&gt;
&lt;br /&gt;
TIFF&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=141</id>
		<title>Supported File Formats</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=141"/>
		<updated>2025-01-21T21:14:23Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Texture file formats: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib 2.0 works with a smaller file-formats subset compared with the first version. This decision has been taken to focus on the most used file-formats and offer a more stable and feature-rich experience with these formats.&lt;br /&gt;
==Model file formats:==&lt;br /&gt;
FBX (Accepts version 7.0 onwards)&lt;br /&gt;
&lt;br /&gt;
OBJ&lt;br /&gt;
&lt;br /&gt;
GLTF 2 (Accepts Draco decompression using an experimental feature)&lt;br /&gt;
&lt;br /&gt;
STL&lt;br /&gt;
&lt;br /&gt;
PLY&lt;br /&gt;
&lt;br /&gt;
3MF&lt;br /&gt;
&lt;br /&gt;
ZIP&lt;br /&gt;
&lt;br /&gt;
DAE (Collada) support is experimental. The full Collada support is in the works.&lt;br /&gt;
==Texture file formats:==&lt;br /&gt;
BMP&lt;br /&gt;
&lt;br /&gt;
GIF&lt;br /&gt;
&lt;br /&gt;
JPG&lt;br /&gt;
&lt;br /&gt;
PNG&lt;br /&gt;
&lt;br /&gt;
PSD&lt;br /&gt;
&lt;br /&gt;
TGA&lt;br /&gt;
&lt;br /&gt;
HDR (Used to load Skyboxes, not ready for common Texture usage)&lt;br /&gt;
&lt;br /&gt;
TIFF&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=140</id>
		<title>Basic Usage</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=140"/>
		<updated>2025-01-21T19:26:43Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three main methods to load models and their dependencies in TriLib:&lt;br /&gt;
&lt;br /&gt;
* Local File-System Loading&lt;br /&gt;
* URL Loading&lt;br /&gt;
* Custom Source Loading&lt;br /&gt;
&lt;br /&gt;
The user can adapt other loading mechanisms as the core loading methods accept Streams as data input and Scriptable Objects called Mappers, used to load Textures and external data from custom data Streams.&lt;br /&gt;
&lt;br /&gt;
==Local File-System Loading==&lt;br /&gt;
&lt;br /&gt;
=== Using File Picker ===&lt;br /&gt;
Loading models from the local file-system is simplified by using the StandaloneFileBrowser classes that come with TriLib.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the AssetLoaderFilePicker instance.&lt;br /&gt;
			// AssetLoaderFilePicker is a class that allows users to select models from the local file system.&lt;br /&gt;
			var assetLoaderFilePicker = AssetLoaderFilePicker.Create();&lt;br /&gt;
&lt;br /&gt;
			// Shows the model selection file-picker.&lt;br /&gt;
			assetLoaderFilePicker.LoadModelFromFilePickerAsync(&amp;quot;Select a File&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnBeginLoad, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Model Filename ===&lt;br /&gt;
You can also load your Models, passing the Model Filename to the AssetLoader methods.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Loads the model from the &amp;quot;PATH_TO_MY_FILE.FBX&amp;quot; path&lt;br /&gt;
			AssetLoader.LoadModelFromFile(&amp;quot;PATH_TO_MY_FILE.FBX&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== URL Loading ==&lt;br /&gt;
&lt;br /&gt;
You can use the AssetDownloader class to load models from URLs (network). The usage is relatively simple and similar to the local file-system loading.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from the &amp;lt;code&amp;gt;AssetDownloader.LoadModelFromUri&amp;lt;/code&amp;gt; call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from URL&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the web-request.&lt;br /&gt;
			// The web-request contains information on how to download the model.&lt;br /&gt;
			// Let's download a model from the TriLib website.&lt;br /&gt;
			var webRequest = AssetDownloader.CreateWebRequest(&amp;quot;https://ricardoreis.net/trilib/demos/avatars/003/003_visemes.zip&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from this call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
			// Begins the model downloading.&lt;br /&gt;
			AssetDownloader.LoadModelFromUri(webRequest, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions, null, null);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Transparent_Materials&amp;diff=139</id>
		<title>Transparent Materials</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Transparent_Materials&amp;diff=139"/>
		<updated>2024-09-04T14:42:44Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib can handle transparent materials differently, so if your material is not loaded correctly, you could try changing your &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; instance &amp;lt;code&amp;gt;AlphaMaterialMode&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are three possible values for this field:&lt;br /&gt;
&lt;br /&gt;
* Cutout:[[Arquivo:Cutout Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;Cutout&amp;quot; material mode, TriLib will set the material Rendering Mode to &amp;quot;Cutout&amp;quot; whenever an alpha texture/material is found. Cutout materials can cast shadows, and uses depth test.]]&lt;br /&gt;
* Transparent:[[Arquivo:Transparent Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;Transparent&amp;quot; material mode, TriLib will set the material Rendering Mode to &amp;quot;Transparent&amp;quot; whenever an alpha texture/material is found. Transparent materials can't cast shadows and don't uses depth pass.]]&lt;br /&gt;
* CutoutAndTransparent:[[Arquivo:Cutout and Transparent Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;CutoutAndTransparent&amp;quot; alpha material mode, TriLib will create an extra mesh whenever an alpha texture/material is found. The underlying mesh will use a material with the &amp;quot;Transparent&amp;quot; Rendering Mode, and the overlying mesh will use the &amp;quot;Cutout&amp;quot; Rendering Mode.&amp;lt;br /&amp;gt;This alpha material mode is suitable when your object is composed of textures that are partially transparent, but should cast shadows and be use depth test.  &amp;lt;br /&amp;gt;*You can control the ratio between what is considered opaque/transparent modifying the included TriLib materials.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Included TriLib materials can be found in the following folders:&lt;br /&gt;
&lt;br /&gt;
* TriLib/Resources/Materials/Standard/Standard&lt;br /&gt;
* TriLibHDRP/Resources/Materials/HDRP/Standard&lt;br /&gt;
* TriLibUniversalRP/Resources/Materials/UniversalRP/Standard&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Running_TriLib_in_Headless_Mode&amp;diff=138</id>
		<title>Running TriLib in Headless Mode</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Running_TriLib_in_Headless_Mode&amp;diff=138"/>
		<updated>2024-05-18T12:19:37Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When running Unity Editor in Headless Mode, you must define the Material Mapper TriLib is going to use.&lt;br /&gt;
&lt;br /&gt;
To do that, pass it with the &amp;quot;-'''trilib_mappers'''&amp;quot; command-line argument.&lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
 UnityEditor.exe -batchmode -trilib_mappers StandardMaterialMapper&lt;br /&gt;
Possible values are:&lt;br /&gt;
&lt;br /&gt;
* StandardMaterialMapper&lt;br /&gt;
* HDRPMaterialMapper&lt;br /&gt;
* UniversalRPMaterialMapper&lt;br /&gt;
* Or any other Material Mapper asset you included in your Project.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=137</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=137"/>
		<updated>2024-05-18T12:19:12Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Inconsistencies]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
&lt;br /&gt;
[[Loading models from URI]]&lt;br /&gt;
&lt;br /&gt;
[[Error saving TLC files]]&lt;br /&gt;
&lt;br /&gt;
[[Importing Humanoid Animations]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=136</id>
		<title>How to track loaded resources</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=136"/>
		<updated>2024-05-18T12:18:54Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can use the following snippet on your loading methods &amp;lt;code&amp;gt;'''onMaterialsLoad'''&amp;lt;/code&amp;gt; callback to track the loaded resources if you need to copy/move them elsewhere:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//ModelPath contains the loaded model path&lt;br /&gt;
var modelPath = assetLoaderContext.Filename;&lt;br /&gt;
if (!string.IsNullOrEmpty(modelPath))&lt;br /&gt;
{&lt;br /&gt;
	//Do stuff&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded textures list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedCompoundTextures)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded texture filename&lt;br /&gt;
	string finalPath = kvp.Key.ResolvedFilename;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded resources list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedExternalData)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded resource filename&lt;br /&gt;
	string finalPath = kvp.Value;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=135</id>
		<title>How to track loaded resources</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=135"/>
		<updated>2024-05-18T12:17:53Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On your loading methods &amp;lt;code&amp;gt;onMaterialsLoad&amp;lt;/code&amp;gt; callback, you can use the following snippet to track the loaded resources, in case you need to copy/move them elsewhere:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//ModelPath contains the loaded model path&lt;br /&gt;
var modelPath = assetLoaderContext.Filename;&lt;br /&gt;
if (!string.IsNullOrEmpty(modelPath))&lt;br /&gt;
{&lt;br /&gt;
	//Do stuff&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded textures list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedCompoundTextures)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded texture filename&lt;br /&gt;
	string finalPath = kvp.Key.ResolvedFilename;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded resources list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedExternalData)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded resource filename&lt;br /&gt;
	string finalPath = kvp.Value;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=134</id>
		<title>How to track loaded resources</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=134"/>
		<updated>2024-05-18T12:17:07Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On your loading methods &amp;lt;code&amp;gt;onMaterialsLoad&amp;lt;/code&amp;gt; callback, you can use the following snippet to track the loaded resources, in case you need to copy/move them elsewhere:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//ModelPath contains the loaded model path&lt;br /&gt;
var modelPath = assetLoaderContext.Filename;&lt;br /&gt;
if (!string.IsNullOrEmpty(modelPath))&lt;br /&gt;
{&lt;br /&gt;
	//Do stuff&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded textures list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedTextures)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded texture filename&lt;br /&gt;
	string finalPath = kvp.Key.ResolvedFilename;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded resources list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedExternalData)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded resource filename&lt;br /&gt;
	string finalPath = kvp.Value;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=133</id>
		<title>Importing Humanoid Animations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=133"/>
		<updated>2024-05-18T12:16:27Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib offers a versatile range of animation importing options, all of which can be easily configured using the &amp;lt;code&amp;gt;'''AssetLoaderOptions.AnimationType'''&amp;lt;/code&amp;gt; field:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Legacy&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib will create Animation Clips for the loaded model (if it contains animations) and add an &amp;quot;Animation&amp;quot; component to the loaded Game Object.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Generic&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;lt;code&amp;gt;'''AssetLoaderOptionss.AvatarDefinition'''&amp;lt;/code&amp;gt; value:&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CreateFromThisModel&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a generic avatar for the loaded model, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CopyFromOtherAvatar&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;lt;code&amp;gt;'''AssetLoaderOptions.Avatar'''&amp;lt;/code&amp;gt; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Humanoid&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;lt;code&amp;gt;'''AssetLoaderOptionss.AvatarDefinition'''&amp;lt;/code&amp;gt; value:&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CreateFromThisModel&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a humanoid avatar for the loaded model using the Avatar Mapper set at the &amp;lt;code&amp;gt;'''AssetLoaderOptions.HumanoidAvatarMapper'''&amp;lt;/code&amp;gt; field, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CopyFromOtherAvatar&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;lt;code&amp;gt;'''AssetLoaderOptions.Avatar'''&amp;lt;/code&amp;gt; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
&lt;br /&gt;
TriLib cannot import generic or humanoid animations due to a Unity engine limitation. However, we are actively working on a side project that will soon enable humanoid animation importing.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=132</id>
		<title>Importing Humanoid Animations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=132"/>
		<updated>2024-05-18T12:16:05Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib offers a versatile range of animation importing options, all of which can be easily configured using the &amp;lt;code&amp;gt;AssetLoaderOptions.AnimationType&amp;lt;/code&amp;gt; field:&lt;br /&gt;
&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Legacy&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib will create Animation Clips for the loaded model (if it contains animations) and add an &amp;quot;Animation&amp;quot; component to the loaded Game Object.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Generic&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;lt;code&amp;gt;AssetLoaderOptionss.AvatarDefinition&amp;lt;/code&amp;gt; value:&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CreateFromThisModel&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a generic avatar for the loaded model, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CopyFromOtherAvatar&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;lt;code&amp;gt;AssetLoaderOptions.Avatar&amp;lt;/code&amp;gt; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;Humanoid&amp;lt;/code&amp;gt;''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;lt;code&amp;gt;AssetLoaderOptionss.AvatarDefinition&amp;lt;/code&amp;gt; value:&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CreateFromThisModel&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a humanoid avatar for the loaded model using the Avatar Mapper set at the &amp;lt;code&amp;gt;AssetLoaderOptions.HumanoidAvatarMapper&amp;lt;/code&amp;gt; field, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''&amp;lt;code&amp;gt;CopyFromOtherAvatar&amp;lt;/code&amp;gt;''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;lt;code&amp;gt;AssetLoaderOptions.Avatar&amp;lt;/code&amp;gt; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
&lt;br /&gt;
TriLib cannot import generic or humanoid animations due to a Unity engine limitation. However, we are actively working on a side project that will soon enable humanoid animation importing.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Error_saving_TLC_files&amp;diff=131</id>
		<title>Error saving TLC files</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Error_saving_TLC_files&amp;diff=131"/>
		<updated>2024-05-18T12:14:27Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib has a cache system that extracts FBX embedded files data to disk to save loading times.&lt;br /&gt;
&lt;br /&gt;
Sometimes, the platform you're targeting needs to give access to the temporary folder where the files are extracted.&lt;br /&gt;
&lt;br /&gt;
If you encounter a &amp;quot;System.UnauthorizedAccessException&amp;quot; error when loading a model with TriLib, you could try turning off this behavior by setting &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; instance &amp;lt;code&amp;gt;ExtractEmbeddedData&amp;lt;/code&amp;gt; field value to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Loading_models_from_URI&amp;diff=130</id>
		<title>Loading models from URI</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Loading_models_from_URI&amp;diff=130"/>
		<updated>2024-05-18T12:13:34Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A recurrent issue when loading models from URI is caused by Cross-Origin Resource Sharing restrictions, resulting in the error message &amp;quot;TriLib is unable to load the given file.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For instance, web servers can use these restrictions to prevent unauthorized websites from making requests to the server.&lt;br /&gt;
&lt;br /&gt;
This issue should not happen when loading models using TriLib from a desktop or a mobile application.&lt;br /&gt;
&lt;br /&gt;
To get more information on Cross-Origin Resource Sharing, please refer to:&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=SharpZipLib_conflicts&amp;diff=129</id>
		<title>SharpZipLib conflicts</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=SharpZipLib_conflicts&amp;diff=129"/>
		<updated>2024-05-18T12:12:39Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib uses SharpZipLib (https://github.com/icsharpcode/SharpZipLib) to handle Zip files.&lt;br /&gt;
&lt;br /&gt;
When importing TriLib to your project, you might get conflicts saying '''&amp;quot;ICSharpCode.SharpZipLib.dll&amp;quot;''' has been found in multiple places in the solution.&lt;br /&gt;
&lt;br /&gt;
This happens because your solution already has a SharpZipLib library.&lt;br /&gt;
&lt;br /&gt;
You can fix that by keeping only the most up-to-date SharpZipLib version. TriLib uses SharpZipLib version '''1.2.0.7'''.&lt;br /&gt;
&lt;br /&gt;
You can find the library in the '''&amp;quot;Assets/TriLib/TriLibCore/Plugins/Dependencies&amp;quot;''' folder.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=SharpZipLib_conflicts&amp;diff=128</id>
		<title>SharpZipLib conflicts</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=SharpZipLib_conflicts&amp;diff=128"/>
		<updated>2024-05-18T12:12:10Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib uses SharpZipLib (https://github.com/icsharpcode/SharpZipLib) to handle Zip files.&lt;br /&gt;
&lt;br /&gt;
When importing TriLib to your project, you might get conflicts saying '''&amp;quot;ICSharpCode.SharpZipLib.dll&amp;quot;''' has been found in multiple places in the solution.&lt;br /&gt;
&lt;br /&gt;
This happens because your solution already has a SharpZipLib library on it.&lt;br /&gt;
&lt;br /&gt;
You can fix that by keeping only the most up-to-date SharpZipLib version. TriLib uses SharpZipLib version '''1.2.0.7'''.&lt;br /&gt;
&lt;br /&gt;
You can find the library in the '''&amp;quot;Assets/TriLib/TriLibCore/Plugins/Dependencies&amp;quot;''' folder.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=StandaloneFileBrowser_can%27t_be_found&amp;diff=127</id>
		<title>StandaloneFileBrowser can't be found</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=StandaloneFileBrowser_can%27t_be_found&amp;diff=127"/>
		<updated>2024-05-18T12:11:50Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib comes with a custom version of '''StandaloneFileBrowser''' (the original can be found here: https://github.com/gkngkc/UnityStandaloneFileBrowser)&lt;br /&gt;
&lt;br /&gt;
It is an optional package, and if you don't want to use it, you can import only the &amp;quot;'''TriLibCore'''&amp;quot; (and the folder from your rendering pipeline, in case you're using anything other than the Standard rendering pipeline) folder from the TriLib package.&lt;br /&gt;
&lt;br /&gt;
When building/running your application, you may get a message saying &amp;quot;StandaloneFileBrowse can't be found&amp;quot; or something similar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generally, this happens because the appropriate StandaloneFileBrowser plugin hasn't been included in your build project.&lt;br /&gt;
&lt;br /&gt;
You can fix these issues by doing the following:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Step1.png|commoldura|To make sure StandaloneFileBrowser is included in your build project, head to the '''&amp;quot;Assets/TriLib/TriLibStandaloneFileBrowser/Plugins&amp;quot;''' directory and look for the plugin file according to the platform you will deploy to.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In this case, I'm selecting the '''&amp;quot;x64&amp;quot;''' StandaloneFileBrowser plugin inside the '''&amp;quot;Windows&amp;quot;''' folder, as I will deploy my application to Windows x64 devices.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Step2.png|commoldura|You can then select the appropriate architecture you want the selected plugin to be used, then click '''&amp;quot;Apply&amp;quot;'''.]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Plugin directories&lt;br /&gt;
!Platform&lt;br /&gt;
!Directory&lt;br /&gt;
|-&lt;br /&gt;
|Android&lt;br /&gt;
|Android&lt;br /&gt;
|-&lt;br /&gt;
|iOS&lt;br /&gt;
|iOS&lt;br /&gt;
|-&lt;br /&gt;
|Linux&lt;br /&gt;
|Linux&lt;br /&gt;
|-&lt;br /&gt;
|OSX&lt;br /&gt;
|StandaloneFileBrowser.bundle&lt;br /&gt;
|-&lt;br /&gt;
|Windows&lt;br /&gt;
|Windows&lt;br /&gt;
|-&lt;br /&gt;
|WebGL&lt;br /&gt;
|StandaloneFileBrowser.jslib&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Scripted_Importers_Conflict&amp;diff=126</id>
		<title>Scripted Importers Conflict</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Scripted_Importers_Conflict&amp;diff=126"/>
		<updated>2024-05-18T12:11:08Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib 2.0 uses Scripted Importers to allow users to import models inside Unity Editor and not only in the Runtime.&lt;br /&gt;
&lt;br /&gt;
If you're getting any Scripted Importer conflict error message when adding TriLib to your project, please head to the &amp;quot;'''Project Settings-&amp;gt;TriLib'''&amp;quot; area where you can disable individual In-Editor Importers.&lt;br /&gt;
[[Arquivo:Image.png|alt=TriLib Project Settings|miniaturadaimagem|TriLib Project Settings]]&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Measurement_Units&amp;diff=125</id>
		<title>Measurement Units</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Measurement_Units&amp;diff=125"/>
		<updated>2024-05-18T12:10:41Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;3D authoring software has its own measurement units. TriLib has some options to convert between these units and Unity units.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;By default, 1 Unity unit is 1 Meter.&lt;br /&gt;
&lt;br /&gt;
To keep the original measurement unit used when exporting your models, make sure your &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; instance &amp;lt;code&amp;gt;UseFileScale&amp;lt;/code&amp;gt; field is set to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; .This way, TriLib will try to use the measurement unit used when your model has been exported.&lt;br /&gt;
&lt;br /&gt;
If the default Unity measurement units is unsuitable, you can multiply the scale with any factor using the &amp;lt;code&amp;gt;AssetLoaderOptions.ScaleFactor&amp;lt;/code&amp;gt; field. By default, this value is &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, which keeps the original measurement unit used when exporting your model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Only FBX and DAE files have options to export the measurement unit used when authoring the models. TriLib keeps the original units when loading models created in any other file format.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Transparent_Materials&amp;diff=124</id>
		<title>Transparent Materials</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Transparent_Materials&amp;diff=124"/>
		<updated>2024-05-18T12:08:36Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib can handle transparent materials differently, so if your material is not loaded correctly, you could try changing your &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; instance &amp;lt;code&amp;gt;AlphaMaterialMode&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are three possible values for this field:&lt;br /&gt;
&lt;br /&gt;
* Cutout:[[Arquivo:Cutout Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;Cutout&amp;quot; material mode, TriLib will set the material Rendering Mode to &amp;quot;Transparent&amp;quot; whenever an alpha texture/material is found. Cutout materials can cast shadows, and uses depth test.]]&lt;br /&gt;
* Transparent:[[Arquivo:Transparent Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;Transparent&amp;quot; material mode, TriLib will set the material Rendering Mode to &amp;quot;Transparent&amp;quot; whenever an alpha texture/material is found. Transparent materials can't cast shadows and don't uses depth pass.]]&lt;br /&gt;
* CutoutAndTransparent:[[Arquivo:Cutout and Transparent Material Mode.png|nenhum|miniaturadaimagem|In &amp;quot;CutoutAndTransparent&amp;quot; alpha material mode, TriLib will create an extra mesh whenever an alpha texture/material is found. The underlying mesh will use a material with the &amp;quot;Transparent&amp;quot; Rendering Mode, and the overlying mesh will use the &amp;quot;Cutout&amp;quot; Rendering Mode.&amp;lt;br /&amp;gt;This alpha material mode is suitable when your object is composed of textures that are partially transparent, but should cast shadows and be use depth test.  &amp;lt;br /&amp;gt;*You can control the ratio between what is considered opaque/transparent modifying the included TriLib materials.]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;Included TriLib materials can be found in the following folders:&lt;br /&gt;
&lt;br /&gt;
* TriLib/Resources/Materials/Standard/Standard&lt;br /&gt;
* TriLibHDRP/Resources/Materials/HDRP/Standard&lt;br /&gt;
* TriLibUniversalRP/Resources/Materials/UniversalRP/Standard&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Inconsistencies&amp;diff=123</id>
		<title>Material Color Inconsistencies</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Inconsistencies&amp;diff=123"/>
		<updated>2024-05-18T12:07:35Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes, when loading model materials, the color might differ from what other viewers are showing.&lt;br /&gt;
&lt;br /&gt;
TriLib will convert material color values and texture colors by default to the gamma (sRGB) representation.&lt;br /&gt;
&lt;br /&gt;
If you don't want this to happen, disable these behaviors by turning off your '''&amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;ApplyGammaCurveToMaterialColors&amp;lt;/code&amp;gt;'''  and '''&amp;lt;code&amp;gt;LoadTexturesAsSRGB&amp;lt;/code&amp;gt;''' fields.&lt;br /&gt;
&lt;br /&gt;
Another reason for colors to differ is when TriLib does not apply ambient color to FBX materials.&lt;br /&gt;
&lt;br /&gt;
You can enable the '''&amp;lt;code&amp;gt;FBXReader.ApplyAbientColor&amp;lt;/code&amp;gt;''' static field so TriLib can apply ambient color to FBX materials.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials&amp;diff=122</id>
		<title>Missing Materials</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials&amp;diff=122"/>
		<updated>2024-05-18T12:06:00Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes, TriLib might not load your model with the original colors or textures.&lt;br /&gt;
&lt;br /&gt;
There are a few reasons this might happen:&lt;br /&gt;
&lt;br /&gt;
If your model uses textures, they must be located in the same folder as the model or inside the model Zip file if you're loading your model from Zip files.&lt;br /&gt;
&lt;br /&gt;
Depending on your exporting options, model textures can be embedded in the model itself. (glTF2 and FBX files accept this feature)&lt;br /&gt;
&lt;br /&gt;
If your model doesn't use textures, make sure the resource files it uses are located in the same folder as the model or inside the model Zip file if you're loading your model from Zip files.&lt;br /&gt;
&lt;br /&gt;
glTF2 files sometimes contain &amp;quot;.bin&amp;quot; resource files, and OBJ (Wavefront) files sometimes contain &amp;quot;.mtl&amp;quot; (material library) files.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials_(Pink_color)&amp;diff=121</id>
		<title>Missing Materials (Pink color)</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials_(Pink_color)&amp;diff=121"/>
		<updated>2024-05-18T12:04:38Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes, TriLib may be unable to figure out the best Material Mapper for your rendering pipeline.&lt;br /&gt;
&lt;br /&gt;
If you're getting pink (missing) materials when loading your model, please head to the '''&amp;quot;Edit-&amp;gt;Project Settings-&amp;gt;TriLib'''&amp;quot; area.&lt;br /&gt;
&lt;br /&gt;
There, you can enable the right Material Mapper for the rendering pipeline your project is using:[[Arquivo:Image.png|miniaturadaimagem|TriLib Project Settings]]&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=120</id>
		<title>Migrating from TriLib 1 to TriLib 2</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=120"/>
		<updated>2024-05-18T12:04:03Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The usage of TriLib 2 is very similar to TriLib 1, but some fundamental changes have been made.&lt;br /&gt;
==Loading a Model from a File==&lt;br /&gt;
When loading a model from a file in TriLib 1, the following snippets are used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.																&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.														&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject); //Loads the model synchronously and stores the reference in myGameObject.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoaderAsync = new AssetLoaderAsync()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
	var thread = assetLoaderAsync.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject, delegate(GameObject myGameObject) {&lt;br /&gt;
		//Here you can get the reference to the loaded model using myGameObject.&lt;br /&gt;
	}); //Loads the model asynchronously and returns the reference to the created Task/Thread.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first difference with TriLib 2 is that we don't have to specify whether we want to sync or async load our models. TriLib 2 will use async on platforms that support it and sync loading when there is no async support.&lt;br /&gt;
&lt;br /&gt;
* On TriLib 2, we don't have to instantiate an &amp;lt;code&amp;gt;AssetLoader&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;AssetLoaderAsync&amp;lt;/code&amp;gt; class. All loading is now done using the &amp;lt;code&amp;gt;AssetLoader&amp;lt;/code&amp;gt; static class.&lt;br /&gt;
* TriLib 2 no longer returns a Game Object or a Thread. Instead, it will produce an &amp;lt;code&amp;gt;AssetLoaderContext&amp;lt;/code&amp;gt; object containing the loaded Game Object as the &amp;lt;code&amp;gt;RootGameObject&amp;lt;/code&amp;gt; field and much more information regarding the model loading.&lt;br /&gt;
* TriLib 2 also uses &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt;, but these have changed to adopt a cleaner and file-format agnostic approach. The way we create the &amp;lt;code&amp;gt;AssetLoaderOptions&amp;lt;/code&amp;gt; remains the same.&lt;br /&gt;
&lt;br /&gt;
Given these changes, a simple TriLib 2 model loading that matches the TriLib 1 samples above could be reproduced as:&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
AssetLoader.LoadModelFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, null, delegate(AssetLoaderContext assetLoaderContext) {&lt;br /&gt;
	var myGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
}, null, null, null, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loading a Model from a Custom Source==&lt;br /&gt;
TriLib 1 allows loading models from byte arrays using a callback to retrieve the custom data, a callback to check if such data exists, and a callback to return custom external textures data from any external resource the model uses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var modelData = File.ReadAllBytes(&amp;quot;PATH_TO_MY_FILE.OBJ&amp;quot;);&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromMemory(modelData, &amp;quot;MY_FILE.OBJ&amp;quot;, assetLoaderOptions, null, &amp;quot;PATH_TO&amp;quot;, &lt;br /&gt;
	delegate(string path, int fileId, ref int fileSize) { //External data reading callback&lt;br /&gt;
		var resourceData = File.ReadAllBytes(path); //Reads all external file data&lt;br /&gt;
		fileSize = resourceData.Length; //Retrieves the external file size&lt;br /&gt;
		return resourceData; //Returns the external file data&lt;br /&gt;
	},&lt;br /&gt;
	delegate(string path, int fileId) { //External data checking callback&lt;br /&gt;
		return File.Exists(path); //Returns true when the external file exists&lt;br /&gt;
	},&lt;br /&gt;
	delegate (string path, string basePath) { //External texture data reading callback&lt;br /&gt;
		var finalPath = Path.Combine(basePath, path); //Combines the model base path with the texture path&lt;br /&gt;
		if (File.Exists(finalPath)) { //Checks if there is a file on the combined path&lt;br /&gt;
			return File.ReadAllBytes(finalPath); //Returns the file data&lt;br /&gt;
		}&lt;br /&gt;
		return null; //Returns null when the given file could not be found&lt;br /&gt;
	},&lt;br /&gt;
	delegate (float progress) { //Progress handling callback&lt;br /&gt;
		Debug.Log(&amp;quot;Loaded:&amp;quot; + progress); //Writes the model loading progress to the console&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TriLib 2 uses different approaches to load models from custom data sources:&lt;br /&gt;
&lt;br /&gt;
* First, TriLib 2 works with &amp;lt;code&amp;gt;Stream&amp;lt;/code&amp;gt; data reading.&lt;br /&gt;
* Second, any external resource the model uses has to be loaded using a class inheriting the &amp;lt;code&amp;gt;ExternalDataMapper&amp;lt;/code&amp;gt; class.&lt;br /&gt;
* Third, any external texture the model uses has to be loaded using a class inheriting the &amp;lt;code&amp;gt;TextureMapper&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
The example below loads a model from a custom Stream and handles its external resources with custom &amp;lt;code&amp;gt;ExternalDataMapper&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TextureMapper&amp;lt;/code&amp;gt; classes.&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
assetLoaderOptions.ExternalDataMapper = ScriptableObject.CreateInstance&amp;lt;ExternalDataMapperSample&amp;gt;();&lt;br /&gt;
assetLoaderOptions.TextureMapper = ScriptableObject.CreateInstance&amp;lt;TextureMapperSample&amp;gt;();&lt;br /&gt;
var modelPath = &amp;quot;PATH_TO_MY_MODEL.FBX&amp;quot;;&lt;br /&gt;
AssetLoader.LoadModelFromStream(File.OpenRead(modelPath), modelPath, null, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are the Mappers used on the code above. One creates a &amp;lt;code&amp;gt;Steam&amp;lt;/code&amp;gt; from external resource files, and the other creates a &amp;lt;code&amp;gt;TextureLoadingContext&amp;lt;/code&amp;gt; from files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class ExternalDataMapperSample : ExternalDataMapper&lt;br /&gt;
{&lt;br /&gt;
	public override Stream Map(AssetLoaderContext assetLoaderContext, string originalFilename, out string finalPath)&lt;br /&gt;
	{&lt;br /&gt;
		finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(originalFilename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			Debug.Log($&amp;quot;Found external file at: {finalPath}&amp;quot;);&lt;br /&gt;
			return File.OpenRead(finalPath);&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;File {originalFilename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class TextureMapperSample : TextureMapper&lt;br /&gt;
{&lt;br /&gt;
	public override TextureLoadingContext Map(AssetLoaderContext assetLoaderContext, ITexture texture)&lt;br /&gt;
	{&lt;br /&gt;
		var finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(texture.Filename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			var textureLoadingContext = new TextureLoadingContext&lt;br /&gt;
			{&lt;br /&gt;
				Context = assetLoaderContext,&lt;br /&gt;
				Stream = File.OpenRead(finalPath),&lt;br /&gt;
				Texture = texture&lt;br /&gt;
			};&lt;br /&gt;
			Debug.Log($&amp;quot;Found texture at: {finalPath}&amp;quot;);&lt;br /&gt;
			return textureLoadingContext;&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;Texture {texture.Filename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Avatar_Importing&amp;diff=119</id>
		<title>Avatar Importing</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Avatar_Importing&amp;diff=119"/>
		<updated>2024-05-18T11:57:49Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Arquivo:Avatar Importing Banner.png|alt=]]&lt;br /&gt;
&lt;br /&gt;
TriLib allows importing characters to use as Unity Avatars.&lt;br /&gt;
&lt;br /&gt;
To achieve this, TriLib uses classes that inherit the &amp;lt;code&amp;gt;HumanoidAvatarMapper&amp;lt;/code&amp;gt; class, which are responsible for mapping the character bones with Unity Avatar Humanoid Muscles.&lt;br /&gt;
&lt;br /&gt;
TriLib comes with the Mixamo and Biped Humanoid Avatar Mapper, which contains the settings to load characters rigged in Mixamo or created using 3Ds Max Biped, among other standard bone hierarchies.&lt;br /&gt;
&lt;br /&gt;
You can easily include your bone-mapping schemes by inheriting the &amp;lt;code&amp;gt;ByNameHumanoidAvatarMapper&amp;lt;/code&amp;gt; class or simply creating an instance from the class in your Assets and manually adding name-mapping.&lt;br /&gt;
&lt;br /&gt;
If you have a different bone-hierarchy and you don't want to build one Avatar Mapper programatically, you can use the Mixamo and Biped Avatar Mapper as a template.&lt;br /&gt;
&lt;br /&gt;
Just click with the right mouse button in your &amp;quot;Project Explorer&amp;quot; inside Unity and select &amp;quot;'''Create-&amp;gt;TriLib-&amp;gt;Mappers-&amp;gt;Humanoid-&amp;gt; Mixamo and Biped by Name Humanoid Avatar Mapper'''&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:By Name Avatar Humanoid Avatar Mapper Editor.png|alt=]]&lt;br /&gt;
&lt;br /&gt;
When creating the Avatar Mapper, you can set up the name matching by editing the generated Prefab: &lt;br /&gt;
&lt;br /&gt;
1) This is the list of the bones name-matching.&lt;br /&gt;
&lt;br /&gt;
2) The &amp;quot;Human Bone&amp;quot; dropdown lets you select the Unity Humanoid Bone to be mapped on the given item.&lt;br /&gt;
&lt;br /&gt;
3) The &amp;quot;Bone Names&amp;quot; list lets you add multiple Transform names to be matched when TriLib is trying to find the right Transform for the given item.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can then use the generated Prefab into your &amp;lt;code&amp;gt;AssetLoaderOptions.AvatarMapper&amp;lt;/code&amp;gt; field.&lt;br /&gt;
&lt;br /&gt;
Here is a sample with all bone names accepted by the Mixamo and Biped Humanoid Avatar Mapper:&lt;br /&gt;
&lt;br /&gt;
[[Arquivo:Avatar Importing Bone Scheme.png|alt=]]&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* Your model must be in T-Pose or Star-Pose.&lt;br /&gt;
* Only FBX and GLTF file formats work as Avatars.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can test your Avatars at:  &lt;br /&gt;
&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2demo/avatarloader/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=118</id>
		<title>Basic Usage</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=118"/>
		<updated>2024-05-18T11:55:58Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* URL Loading */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three main methods to load models and their dependencies in TriLib:&lt;br /&gt;
&lt;br /&gt;
* Local File-System Loading&lt;br /&gt;
* URL Loading&lt;br /&gt;
* Custom Source Loading&lt;br /&gt;
&lt;br /&gt;
The user can adapt other loading mechanisms as the core loading methods accept Streams as data input and Scriptable Objects called [https://ricardoreis.net/trilib/trilib2/docs/namespace_tri_lib_core_1_1_mappers.html Mappers], used to load Textures and external data from custom data Streams.&lt;br /&gt;
&lt;br /&gt;
==Local File-System Loading==&lt;br /&gt;
&lt;br /&gt;
=== Using File Picker ===&lt;br /&gt;
Loading models from the local file-system is simplified by using the StandaloneFileBrowser classes that come with TriLib.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the AssetLoaderFilePicker instance.&lt;br /&gt;
			// AssetLoaderFilePicker is a class that allows users to select models from the local file system.&lt;br /&gt;
			var assetLoaderFilePicker = AssetLoaderFilePicker.Create();&lt;br /&gt;
&lt;br /&gt;
			// Shows the model selection file-picker.&lt;br /&gt;
			assetLoaderFilePicker.LoadModelFromFilePickerAsync(&amp;quot;Select a File&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnBeginLoad, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Model Filename ===&lt;br /&gt;
You can also load your Models, passing the Model Filename to the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader.html AssetLoader] methods.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Loads the model from the &amp;quot;PATH_TO_MY_FILE.FBX&amp;quot; path&lt;br /&gt;
			AssetLoader.LoadModelFromFile(&amp;quot;PATH_TO_MY_FILE.FBX&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== URL Loading ==&lt;br /&gt;
&lt;br /&gt;
You can use the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_downloader.html AssetDownloader] class to load models from URLs (network). The usage is relatively simple and similar to the local file-system loading.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from the &amp;lt;code&amp;gt;AssetDownloader.LoadModelFromUri&amp;lt;/code&amp;gt; call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from URL&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the web-request.&lt;br /&gt;
			// The web-request contains information on how to download the model.&lt;br /&gt;
			// Let's download a model from the TriLib website.&lt;br /&gt;
			var webRequest = AssetDownloader.CreateWebRequest(&amp;quot;https://ricardoreis.net/trilib/demos/avatars/003/003_visemes.zip&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from this call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
			// Begins the model downloading.&lt;br /&gt;
			AssetDownloader.LoadModelFromUri(webRequest, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions, null, null);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=117</id>
		<title>File Format specific Options</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=117"/>
		<updated>2024-05-18T11:54:55Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some file formats TriLib accepts have unique options you can set with static reader properties:&lt;br /&gt;
&lt;br /&gt;
== FBX ==&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Fbx.Reader.FbxReader.PivotMode&amp;lt;/code&amp;gt;:''' Change field to define how TriLib will handle FBX object pivots. The &amp;quot;legacy&amp;quot; (default) option don't use pivots.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Fbx.Reader.FbxReader.FBXConversionPrecision&amp;lt;/code&amp;gt;:''' Floating point data on FBX files is stored as 16-bits (double) precision. You can define a multiplier on this static field applied to all FBX floating-point data when loading the model.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Fbx.Reader.FbxReader.ApplyAmbientColor&amp;lt;/code&amp;gt;:''' Turn on this field to apply ambient color to Phong materials.&lt;br /&gt;
&lt;br /&gt;
== GLTF ==&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Gltf.Reader.GltfReader.DracoDecompressorCallback&amp;lt;/code&amp;gt;:''' You can pass a custom callback to decompress Draco meshes using this static field. If you turn on Draco Decompression on the Project Settings-&amp;gt;TriLib area, TriLib will automatically set this field value to use a built-in Draco decoder.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Gltf.Reader.GltfReader.SpotLightDistance&amp;lt;/code&amp;gt;:''' glTF2 lights using &amp;lt;u&amp;gt;KHR_lights_punctual&amp;lt;/u&amp;gt; don't have a configurable distance. Change this value to set the default punctual lights distance.&lt;br /&gt;
&lt;br /&gt;
== STL ==&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Stl.Reader.StlReader.FixInfacingNormals&amp;lt;/code&amp;gt;:''' Some STL files may contain normals facing the opposite direction. If you turn on this static field, TriLib will re-align the model normals when loading.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Stl.Reader.StlReader.ImportNormals&amp;lt;/code&amp;gt;:''' Turn on this field to enable STL normal importing.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Stl.Reader.StlReader.LoadWithYUp&amp;lt;/code&amp;gt;:'''Turn on this field to load your model with the Z axis pointing up.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Stl.Reader.StlReader.StoreTriangleIndexInTexCoord0&amp;lt;/code&amp;gt;:''' Turn off this field to stop storing the index of the triangle in the X component of the mesh texture coordinates.&lt;br /&gt;
&lt;br /&gt;
== PLY ==&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Ply.Reader.PlyReader.PlyConversionPrecision&amp;lt;/code&amp;gt;:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
== OBJ ==&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Obj.Reader.ObjReader.ParseNumbersAsDouble&amp;lt;/code&amp;gt;:''' Turn on this field to parse OBJ file number data as doubles and improve precision.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Obj.Reader.ObjReader.ObjConversionPrecision&amp;lt;/code&amp;gt;:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;TriLibCore.Obj.Reader.ObjReader.ParseVertexColors&amp;lt;/code&amp;gt;:''' Turn off this field to disable OBJ vertex color reading.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=116</id>
		<title>File Format specific Options</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=116"/>
		<updated>2024-05-18T11:53:50Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some file formats TriLib accepts have unique options you can set with static reader properties:&lt;br /&gt;
&lt;br /&gt;
== FBX ==&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.PivotMode:''' Change field to define how TriLib will handle FBX object pivots. The &amp;quot;legacy&amp;quot; (default) option don't use pivots.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.FBXConversionPrecision:''' Floating point data on FBX files is stored as 16-bits (double) precision. You can define a multiplier on this static field applied to all FBX floating-point data when loading the model.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.ApplyAmbientColor: Tu'''rn on this field to apply ambient color to Phong materials.&lt;br /&gt;
&lt;br /&gt;
== GLTF ==&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.DracoDecompressorCallback:''' You can pass a custom callback to decompress Draco meshes using this static field. If you turn on Draco Decompression on the Project Settings-&amp;gt;TriLib area, TriLib will automatically set this field value to use a built-in Draco decoder.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.SpotLightDistance:''' glTF2 lights using &amp;lt;u&amp;gt;KHR_lights_punctual&amp;lt;/u&amp;gt; don't have a configurable distance. Change this value to set the default punctual lights distance.&lt;br /&gt;
&lt;br /&gt;
== STL ==&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.FixInfacingNormals:''' Some STL files may contain normals facing the opposite direction. If you turn on this static field, TriLib will re-align the model normals when loading.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.ImportNormals:''' Turn on this field to enable STL normal importing.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.LoadWithYUp:'''Turn on this field to load your model with the Z axis pointing up.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.StoreTriangleIndexInTexCoord0:''' Turn off this field to stop storing the index of the triangle in the X component of the mesh texture coordinates.&lt;br /&gt;
&lt;br /&gt;
== PLY ==&lt;br /&gt;
'''TriLibCore.Ply.Reader.PlyReader.PlyConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
== OBJ ==&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseNumbersAsDouble:''' Turn on this field to parse OBJ file number data as doubles and improve precision.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ObjConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseVertexColors:''' Turn off this field to disable OBJ vertex color reading.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=115</id>
		<title>File Format specific Options</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=115"/>
		<updated>2024-05-18T11:53:18Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some file formats TriLib accepts have unique options you can set with static reader properties:&lt;br /&gt;
&lt;br /&gt;
== FBX ==&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.PivotMode:''' Change field to define how TriLib will handle FBX object pivots. The &amp;quot;legacy&amp;quot; (default) option don't use pivots.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.FBXConversionPrecision:''' Floating point data on FBX files is stored as 16-bits (double) precision. You can define a multiplier on this static field applied to all FBX floating-point data when loading the model.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.ApplyAmbientColor: Tu'''rn on this field to apply ambient color to Phong materials.&lt;br /&gt;
&lt;br /&gt;
== GLTF ==&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.DracoDecompressorCallback:''' You can pass a custom callback to decompress Draco meshes using this static field. If you turn on Draco Decompression on the Project Settings-&amp;gt;TriLib area, TriLib will automatically set this field value to use a built-in Draco decoder.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.SpotLightDistance:''' glTF2 lights using KHR_lights_punctual don't have a configurable distance. Change this value to set the default punctual lights distance.&lt;br /&gt;
&lt;br /&gt;
== STL ==&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.FixInfacingNormals:''' Some STL files may contain normals facing the opposite direction. If you turn on this static field, TriLib will re-align the model normals when loading.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.ImportNormals:''' Turn on this field to enable STL normal importing.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.LoadWithYUp:'''Turn on this field to load your model with the Z axis pointing up.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.StoreTriangleIndexInTexCoord0:''' Turn off this field to stop storing the index of the triangle in the X component of the mesh texture coordinates.&lt;br /&gt;
&lt;br /&gt;
== PLY ==&lt;br /&gt;
'''TriLibCore.Ply.Reader.PlyReader.PlyConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
== OBJ ==&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseNumbersAsDouble:''' Turn on this field to parse OBJ file number data as doubles and improve precision.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ObjConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseVertexColors:''' Turn off this field to disable OBJ vertex color reading.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=114</id>
		<title>File Format specific Options</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=File_Format_specific_Options&amp;diff=114"/>
		<updated>2024-05-18T11:52:14Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* FBX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some file formats TriLib accepts have unique options you can set with static reader properties:&lt;br /&gt;
&lt;br /&gt;
== FBX ==&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.PivotMode:''' Change field to define how TriLib will handle FBX object pivots. The &amp;quot;legacy&amp;quot; (default) option don't use pivots.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.FBXConversionPrecision:''' Floating point data on FBX files is stored as 16-bits (double) precision. You can define a multiplier on this static field applied to all FBX floating-point data when loading the model.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Fbx.Reader.FbxReader.ApplyAmbientColor: Tu'''rn on this field to apply ambient color to Phong materials.&lt;br /&gt;
&lt;br /&gt;
== GLTF ==&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.DracoDecompressorCallback:''' You can pass a custom callback to decompress Draco meshes using this static field. If you turn on Draco Decompression on the Project Settings-&amp;gt;TriLib area, TriLib will automatically set this field value to use a built-in Draco decoder.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Gltf.Reader.GltfReader.SpotLightDistance:''' glTF2 lights using KHR_lights_punctual don't have a configurable distance. Change this value to set the default Spot Lights distance.&lt;br /&gt;
&lt;br /&gt;
== STL ==&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.FixInfacingNormals:''' Some STL files may contain normals facing the opposite direction. If you turn on this static field, TriLib will re-align the model normals when loading.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.ImportNormals:''' Turn on this field to enable STL normal importing.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.LoadWithYUp:'''Turn on this field to load your model with the Z axis pointing up.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Stl.Reader.StlReader.StoreTriangleIndexInTexCoord0:''' Turn off this field to stop storing the index of the triangle in the X component of the mesh texture coordinates.&lt;br /&gt;
&lt;br /&gt;
== PLY ==&lt;br /&gt;
'''TriLibCore.Ply.Reader.PlyReader.PlyConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
== OBJ ==&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseNumbersAsDouble:''' Turn on this field to parse OBJ file number data as doubles and improve precision.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ObjConversionPrecision:''' Experimental: Any value passed here will be multiplied with any &amp;quot;double precision&amp;quot; data when converting them to floats.&lt;br /&gt;
&lt;br /&gt;
'''TriLibCore.Obj.Reader.ObjReader.ParseVertexColors:''' Turn off this field to disable OBJ vertex color reading.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=113</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=113"/>
		<updated>2024-05-18T11:41:22Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Inconsistencies]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
&lt;br /&gt;
[[Loading models from URI]]&lt;br /&gt;
&lt;br /&gt;
[[Error saving TLC files]]&lt;br /&gt;
&lt;br /&gt;
[[Importing Humanoid Animations]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=112</id>
		<title>Importing Humanoid Animations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Importing_Humanoid_Animations&amp;diff=112"/>
		<updated>2024-05-18T11:41:04Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Criou página com 'TriLib offers a versatile range of animation importing options, all of which can be easily configured using the &amp;quot;'''AssetLoaderOptions.AnimationType'''&amp;quot; field:  * '''Legacy''': Using this animation importing type, TriLib will create Animation Clips for the loaded model (if it contains animations) and add an &amp;quot;Animation&amp;quot; component to the loaded Game Object. * '''Generic''': Using this animation importing type, TriLib does not create Animation Clips, but it does the followi...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib offers a versatile range of animation importing options, all of which can be easily configured using the &amp;quot;'''AssetLoaderOptions.AnimationType'''&amp;quot; field:&lt;br /&gt;
&lt;br /&gt;
* '''Legacy''': Using this animation importing type, TriLib will create Animation Clips for the loaded model (if it contains animations) and add an &amp;quot;Animation&amp;quot; component to the loaded Game Object.&lt;br /&gt;
* '''Generic''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;quot;'''AssetLoaderOptionss.AvatarDefinition'''&amp;quot; value:&lt;br /&gt;
** '''CreateFromThisModel''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a generic avatar for the loaded model, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''CopyFromOtherAvatar''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;quot;'''AssetLoaderOptions.Avatar'''&amp;quot; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
* '''Humanoid''': Using this animation importing type, TriLib does not create Animation Clips, but it does the following, depending on the &amp;quot;'''AssetLoaderOptionss.AvatarDefinition'''&amp;quot; value:&lt;br /&gt;
** '''CreateFromThisModel''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object, creates a humanoid avatar for the loaded model using the Avatar Mapper set at the &amp;quot;'''AssetLoaderOptions.HumanoidAvatarMapper'''&amp;quot; field, and uses it at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
** '''CopyFromOtherAvatar''': TriLib adds an &amp;quot;Animator&amp;quot; component to the loaded Game Object and uses the avatar at &amp;quot;'''AssetLoaderOptions.Avatar'''&amp;quot; at the &amp;quot;Animator&amp;quot; component.&lt;br /&gt;
&lt;br /&gt;
TriLib cannot import generic or humanoid animations due to a Unity engine limitation. However, we are actively working on a side project that will soon enable humanoid animation importing.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=111</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=111"/>
		<updated>2024-05-18T10:25:19Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Inconsistencies]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
&lt;br /&gt;
[[Loading models from URI]]&lt;br /&gt;
&lt;br /&gt;
[[Error saving TLC files]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Error_saving_TLC_files&amp;diff=110</id>
		<title>Error saving TLC files</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Error_saving_TLC_files&amp;diff=110"/>
		<updated>2024-05-18T10:24:56Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Criou página com 'TriLib has a cache system that extracts FBX embedded files data to disk to save loading times.  Sometimes, the platform you're targeting needs to give access to the temporary folder where the files are extracted.  If you encounter a &amp;quot;System.UnauthorizedAccessException&amp;quot; error when loading a model with TriLib, you could try turning off this behavior by setting 'AssetLoaderOptions.ExtractEmbeddedData' to 'false'.'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib has a cache system that extracts FBX embedded files data to disk to save loading times.&lt;br /&gt;
&lt;br /&gt;
Sometimes, the platform you're targeting needs to give access to the temporary folder where the files are extracted.&lt;br /&gt;
&lt;br /&gt;
If you encounter a &amp;quot;System.UnauthorizedAccessException&amp;quot; error when loading a model with TriLib, you could try turning off this behavior by setting 'AssetLoaderOptions.ExtractEmbeddedData' to 'false'.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=109</id>
		<title>How to track loaded resources</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=How_to_track_loaded_resources&amp;diff=109"/>
		<updated>2024-05-06T13:40:51Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;On your &amp;quot;onMaterialsLoad&amp;quot; callback, you can use the following snippet to track the loaded resources, in case you need to copy/move them elsewhere:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//ModelPath contains the loaded model path&lt;br /&gt;
var modelPath = assetLoaderContext.Filename;&lt;br /&gt;
if (!string.IsNullOrEmpty(modelPath))&lt;br /&gt;
{&lt;br /&gt;
	//Do stuff&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded textures list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedTextures)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded texture filename&lt;br /&gt;
	string finalPath = kvp.Key.ResolvedFilename;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Iterate the loaded resources list&lt;br /&gt;
foreach (var kvp in assetLoaderContext.LoadedExternalData)&lt;br /&gt;
{&lt;br /&gt;
	//FinalPath contains the loaded resource filename&lt;br /&gt;
	string finalPath = kvp.Value;&lt;br /&gt;
	if (!string.IsNullOrEmpty(finalPath))&lt;br /&gt;
	{&lt;br /&gt;
		//Do stuff&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=108</id>
		<title>Known Issues/Limitations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=108"/>
		<updated>2024-04-30T16:20:15Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib is not a model exporter.&lt;br /&gt;
&lt;br /&gt;
The FBX importer does not import multiple texture layers yet.  &lt;br /&gt;
&lt;br /&gt;
Some FBX files may present incompatibilities.&lt;br /&gt;
&lt;br /&gt;
3MF beam lattice format is not supported yet.&lt;br /&gt;
&lt;br /&gt;
3MF PBR specular materials are not supported yet.&lt;br /&gt;
&lt;br /&gt;
Blend-shape normals and tangents are not imported yet.&lt;br /&gt;
&lt;br /&gt;
DAE (Collada) support is experimental. The full Collada support is in the works.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=107</id>
		<title>Known Issues/Limitations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=107"/>
		<updated>2024-04-30T16:19:34Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib is not a Model exporter.&lt;br /&gt;
&lt;br /&gt;
The FBX Importer does not import multiple texture layers yet.  &lt;br /&gt;
&lt;br /&gt;
Some FBX files may present incompatibilities.&lt;br /&gt;
&lt;br /&gt;
3MF Beam Lattice format is not supported yet.&lt;br /&gt;
&lt;br /&gt;
3MF PBR Specular materials are not supported yet.&lt;br /&gt;
&lt;br /&gt;
Blend-shape normals and tangents are not imported yet.&lt;br /&gt;
&lt;br /&gt;
DAE (Collada) support is experimental. The full Collada support is in the works.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=106</id>
		<title>Supported File Formats</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Supported_File_Formats&amp;diff=106"/>
		<updated>2024-04-30T16:19:17Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Model file formats: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib 2.0 works with a smaller file-formats subset compared with the first version. This decision has been taken to focus on the most used file-formats and offer a more stable and feature-rich experience with these formats.&lt;br /&gt;
==Model file formats:==&lt;br /&gt;
FBX (Accepts version 7.0 onwards)&lt;br /&gt;
&lt;br /&gt;
OBJ&lt;br /&gt;
&lt;br /&gt;
GLTF 2 (Accepts Draco decompression using an experimental feature)&lt;br /&gt;
&lt;br /&gt;
STL&lt;br /&gt;
&lt;br /&gt;
PLY&lt;br /&gt;
&lt;br /&gt;
3MF&lt;br /&gt;
&lt;br /&gt;
ZIP&lt;br /&gt;
&lt;br /&gt;
DAE (Collada) support is experimental. The full Collada support is in the works.&lt;br /&gt;
==Texture file formats:==&lt;br /&gt;
BMP&lt;br /&gt;
&lt;br /&gt;
GIF&lt;br /&gt;
&lt;br /&gt;
JPG&lt;br /&gt;
&lt;br /&gt;
PNG&lt;br /&gt;
&lt;br /&gt;
PSD&lt;br /&gt;
&lt;br /&gt;
TGA&lt;br /&gt;
&lt;br /&gt;
HDR (Used to load Skyboxes, not ready for common Texture usage)&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=105</id>
		<title>Migrating from TriLib 1 to TriLib 2</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=105"/>
		<updated>2024-04-30T16:16:30Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The usage of TriLib 2 is very similar to TriLib 1, but some fundamental changes have been made.&lt;br /&gt;
==Loading a Model from a File==&lt;br /&gt;
When loading a model from a file in TriLib 1, the following snippets are used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.																&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.														&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject); //Loads the model synchronously and stores the reference in myGameObject.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoaderAsync = new AssetLoaderAsync()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
	var thread = assetLoaderAsync.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject, delegate(GameObject myGameObject) {&lt;br /&gt;
		//Here you can get the reference to the loaded model using myGameObject.&lt;br /&gt;
	}); //Loads the model asynchronously and returns the reference to the created Task/Thread.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first difference on TriLib 2 is that we don't have to specify if we want to sync or async load our models since TriLib 2 will use async on platforms that support it and fallback to sync loading when there is no support.&lt;br /&gt;
&lt;br /&gt;
* On TriLib 2, we don't have to instantiate an AssetLoader or AssetLoaderAsync class. All loading is done using the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader.html AssetLoader] static class now.&lt;br /&gt;
* TriLib 2 no longer returns a GameObject or a Thread when loading a model. Instead, it will produce an [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html AssetLoaderContext] object containing the loaded GameObject as the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html#a2dd4cc3184e8ef2787f20d31dcad7c67 RootGameObject] field and much more information regarding the model loading.&lt;br /&gt;
* TriLib 2 also uses [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions], but these have changed to adopt a cleaner and file-format agnostic approach. The way we create the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions] remains the same.&lt;br /&gt;
&lt;br /&gt;
Given these changes, a simple TriLib 2 model loading that matches the TriLib 1 samples above could be reproduced as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
AssetLoader.LoadModelFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, null, delegate(AssetLoaderContext assetLoaderContext) {&lt;br /&gt;
	var myGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
}, null, null, null, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loading a Model from a Custom Source==&lt;br /&gt;
TriLib 1 allows loading models from byte arrays using a callback to retrieve the custom data, a callback to check if such data exists, and a callback to return custom external textures data from any external resource the model uses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var modelData = File.ReadAllBytes(&amp;quot;PATH_TO_MY_FILE.OBJ&amp;quot;);&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromMemory(modelData, &amp;quot;MY_FILE.OBJ&amp;quot;, assetLoaderOptions, null, &amp;quot;PATH_TO&amp;quot;, &lt;br /&gt;
	delegate(string path, int fileId, ref int fileSize) { //External data reading callback&lt;br /&gt;
		var resourceData = File.ReadAllBytes(path); //Reads all external file data&lt;br /&gt;
		fileSize = resourceData.Length; //Retrieves the external file size&lt;br /&gt;
		return resourceData; //Returns the external file data&lt;br /&gt;
	},&lt;br /&gt;
	delegate(string path, int fileId) { //External data checking callback&lt;br /&gt;
		return File.Exists(path); //Returns true when the external file exists&lt;br /&gt;
	},&lt;br /&gt;
	delegate (string path, string basePath) { //External texture data reading callback&lt;br /&gt;
		var finalPath = Path.Combine(basePath, path); //Combines the model base path with the texture path&lt;br /&gt;
		if (File.Exists(finalPath)) { //Checks if there is a file on the combined path&lt;br /&gt;
			return File.ReadAllBytes(finalPath); //Returns the file data&lt;br /&gt;
		}&lt;br /&gt;
		return null; //Returns null when the given file could not be found&lt;br /&gt;
	},&lt;br /&gt;
	delegate (float progress) { //Progress handling callback&lt;br /&gt;
		Debug.Log(&amp;quot;Loaded:&amp;quot; + progress); //Writes the model loading progress to the console&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TriLib 2 uses different approaches to load models from custom data sources:&lt;br /&gt;
&lt;br /&gt;
* First, it doesn't work with byte arrays, specifically anymore. TriLib 2 works with Stream data reading.  &lt;br /&gt;
* Second, any external resource the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] class. &lt;br /&gt;
* Third, any external texture the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The example below loads a model from a custom Stream and handles its external resources with custom [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] and [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
assetLoaderOptions.ExternalDataMapper = ScriptableObject.CreateInstance&amp;lt;ExternalDataMapperSample&amp;gt;();&lt;br /&gt;
assetLoaderOptions.TextureMapper = ScriptableObject.CreateInstance&amp;lt;TextureMapperSample&amp;gt;();&lt;br /&gt;
var modelPath = &amp;quot;PATH_TO_MY_MODEL.FBX&amp;quot;;&lt;br /&gt;
AssetLoader.LoadModelFromStream(File.OpenRead(modelPath), modelPath, null, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are the [https://ricardoreis.net/trilib/trilib2/docs/namespace_tri_lib_core_1_1_mappers.html Mappers] used on the code above. One creates Steams from external resource files and the other creates [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_texture_loading_context.html TextureLoadingContexts] from files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class ExternalDataMapperSample : ExternalDataMapper&lt;br /&gt;
{&lt;br /&gt;
	public override Stream Map(AssetLoaderContext assetLoaderContext, string originalFilename, out string finalPath)&lt;br /&gt;
	{&lt;br /&gt;
		finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(originalFilename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			Debug.Log($&amp;quot;Found external file at: {finalPath}&amp;quot;);&lt;br /&gt;
			return File.OpenRead(finalPath);&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;File {originalFilename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class TextureMapperSample : TextureMapper&lt;br /&gt;
{&lt;br /&gt;
	public override TextureLoadingContext Map(AssetLoaderContext assetLoaderContext, ITexture texture)&lt;br /&gt;
	{&lt;br /&gt;
		var finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(texture.Filename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			var textureLoadingContext = new TextureLoadingContext&lt;br /&gt;
			{&lt;br /&gt;
				Context = assetLoaderContext,&lt;br /&gt;
				Stream = File.OpenRead(finalPath),&lt;br /&gt;
				Texture = texture&lt;br /&gt;
			};&lt;br /&gt;
			Debug.Log($&amp;quot;Found texture at: {finalPath}&amp;quot;);&lt;br /&gt;
			return textureLoadingContext;&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;Texture {texture.Filename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=104</id>
		<title>Migrating from TriLib 1 to TriLib 2</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=104"/>
		<updated>2024-04-30T16:14:58Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The usage of TriLib 2 is very similar to TriLib 1, but some fundamental changes have been made.&lt;br /&gt;
==Loading a Model from a File==&lt;br /&gt;
When loading a model from a file in TriLib 1, the following snippets are used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
																	//AssetLoaderOptions let you specify options to load your model.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
	&lt;br /&gt;
	//You can modify assetLoaderOptions before passing it to LoadFromFile method. You can check the AssetLoaderOptions API reference at:&lt;br /&gt;
	//https://ricardoreis.net/trilib/manual/html/class_tri_lib_1_1_asset_loader_options.html&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject); //Loads the model synchronously and stores the reference in myGameObject.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoaderAsync = new AssetLoaderAsync()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
																	//AssetLoaderOptions let you specify options to load your model.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
	&lt;br /&gt;
	//You can modify assetLoaderOptions before passing it to LoadFromFile method. You can check the AssetLoaderOptions API reference at:&lt;br /&gt;
	//https://ricardoreis.net/trilib/manual/html/class_tri_lib_1_1_asset_loader_options.html&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
&lt;br /&gt;
	var thread = assetLoaderAsync.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject, delegate(GameObject myGameObject) {&lt;br /&gt;
		//Here you can get the reference to the loaded model using myGameObject.&lt;br /&gt;
	}); //Loads the model asynchronously and returns the reference to the created Task/Thread.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first difference on TriLib 2 is that we don't have to specify if we want to sync or async load our models since TriLib 2 will use async on platforms that support it and fallback to sync loading when there is no support.&lt;br /&gt;
&lt;br /&gt;
* On TriLib 2, we don't have to instantiate an AssetLoader or AssetLoaderAsync class. All loading is done using the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader.html AssetLoader] static class now.&lt;br /&gt;
* TriLib 2 no longer returns a GameObject or a Thread when loading a model. Instead, it will produce an [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html AssetLoaderContext] object containing the loaded GameObject as the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html#a2dd4cc3184e8ef2787f20d31dcad7c67 RootGameObject] field and much more information regarding the model loading.&lt;br /&gt;
* TriLib 2 also uses [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions], but these have changed to adopt a cleaner and file-format agnostic approach. The way we create the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions] remains the same.&lt;br /&gt;
&lt;br /&gt;
Given these changes, a simple TriLib 2 model loading that matches the TriLib 1 samples above could be reproduced as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
AssetLoader.LoadModelFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, null, delegate(AssetLoaderContext assetLoaderContext) {&lt;br /&gt;
	var myGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
}, null, null, null, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loading a Model from a Custom Source==&lt;br /&gt;
TriLib 1 allows loading models from byte arrays using a callback to retrieve the custom data, a callback to check if such data exists, and a callback to return custom external textures data from any external resource the model uses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var modelData = File.ReadAllBytes(&amp;quot;PATH_TO_MY_FILE.OBJ&amp;quot;);&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromMemory(modelData, &amp;quot;MY_FILE.OBJ&amp;quot;, assetLoaderOptions, null, &amp;quot;PATH_TO&amp;quot;, &lt;br /&gt;
	delegate(string path, int fileId, ref int fileSize) { //External data reading callback&lt;br /&gt;
		var resourceData = File.ReadAllBytes(path); //Reads all external file data&lt;br /&gt;
		fileSize = resourceData.Length; //Retrieves the external file size&lt;br /&gt;
		return resourceData; //Returns the external file data&lt;br /&gt;
	},&lt;br /&gt;
	delegate(string path, int fileId) { //External data checking callback&lt;br /&gt;
		return File.Exists(path); //Returns true when the external file exists&lt;br /&gt;
	},&lt;br /&gt;
	delegate (string path, string basePath) { //External texture data reading callback&lt;br /&gt;
		var finalPath = Path.Combine(basePath, path); //Combines the model base path with the texture path&lt;br /&gt;
		if (File.Exists(finalPath)) { //Checks if there is a file on the combined path&lt;br /&gt;
			return File.ReadAllBytes(finalPath); //Returns the file data&lt;br /&gt;
		}&lt;br /&gt;
		return null; //Returns null when the given file could not be found&lt;br /&gt;
	},&lt;br /&gt;
	delegate (float progress) { //Progress handling callback&lt;br /&gt;
		Debug.Log(&amp;quot;Loaded:&amp;quot; + progress); //Writes the model loading progress to the console&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TriLib 2 uses different approaches to load models from custom data sources:&lt;br /&gt;
&lt;br /&gt;
* First, it doesn't work with byte arrays, specifically anymore. TriLib 2 works with Stream data reading.  &lt;br /&gt;
* Second, any external resource the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] class. &lt;br /&gt;
* Third, any external texture the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The example below loads a model from a custom Stream and handles its external resources with custom [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] and [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
assetLoaderOptions.ExternalDataMapper = ScriptableObject.CreateInstance&amp;lt;ExternalDataMapperSample&amp;gt;();&lt;br /&gt;
assetLoaderOptions.TextureMapper = ScriptableObject.CreateInstance&amp;lt;TextureMapperSample&amp;gt;();&lt;br /&gt;
var modelPath = &amp;quot;PATH_TO_MY_MODEL.FBX&amp;quot;;&lt;br /&gt;
AssetLoader.LoadModelFromStream(File.OpenRead(modelPath), modelPath, null, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are the [https://ricardoreis.net/trilib/trilib2/docs/namespace_tri_lib_core_1_1_mappers.html Mappers] used on the code above. One creates Steams from external resource files and the other creates [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_texture_loading_context.html TextureLoadingContexts] from files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class ExternalDataMapperSample : ExternalDataMapper&lt;br /&gt;
{&lt;br /&gt;
	public override Stream Map(AssetLoaderContext assetLoaderContext, string originalFilename, out string finalPath)&lt;br /&gt;
	{&lt;br /&gt;
		finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(originalFilename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			Debug.Log($&amp;quot;Found external file at: {finalPath}&amp;quot;);&lt;br /&gt;
			return File.OpenRead(finalPath);&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;File {originalFilename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class TextureMapperSample : TextureMapper&lt;br /&gt;
{&lt;br /&gt;
	public override TextureLoadingContext Map(AssetLoaderContext assetLoaderContext, ITexture texture)&lt;br /&gt;
	{&lt;br /&gt;
		var finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(texture.Filename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			var textureLoadingContext = new TextureLoadingContext&lt;br /&gt;
			{&lt;br /&gt;
				Context = assetLoaderContext,&lt;br /&gt;
				Stream = File.OpenRead(finalPath),&lt;br /&gt;
				Texture = texture&lt;br /&gt;
			};&lt;br /&gt;
			Debug.Log($&amp;quot;Found texture at: {finalPath}&amp;quot;);&lt;br /&gt;
			return textureLoadingContext;&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;Texture {texture.Filename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=103</id>
		<title>Migrating from TriLib 1 to TriLib 2</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Migrating_from_TriLib_1_to_TriLib_2&amp;diff=103"/>
		<updated>2024-04-30T16:14:30Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The usage of TriLib 2 is very similar to TriLib 1, but some fundamental changes have been made.&lt;br /&gt;
==Loading a Model from a File==&lt;br /&gt;
When loading a model from a file in TriLib 1, the following snippets are used:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
																	//AssetLoaderOptions let you specify options to load your model.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
	&lt;br /&gt;
	//You can modify assetLoaderOptions before passing it to LoadFromFile method. You can check the AssetLoaderOptions API reference at:&lt;br /&gt;
	//https://ricardoreis.net/trilib/manual/html/class_tri_lib_1_1_asset_loader_options.html&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject); //Loads the model synchronously and stores the reference in myGameObject.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
using (var assetLoaderAsync = new AssetLoaderAsync()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();   //Creates the AssetLoaderOptions instance.&lt;br /&gt;
																	//AssetLoaderOptions let you specify options to load your model.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
	&lt;br /&gt;
	//You can modify assetLoaderOptions before passing it to LoadFromFile method. You can check the AssetLoaderOptions API reference at:&lt;br /&gt;
	//https://ricardoreis.net/trilib/manual/html/class_tri_lib_1_1_asset_loader_options.html&lt;br /&gt;
	&lt;br /&gt;
	var wrapperGameObject = gameObject;                             //Sets the game object where your model will be loaded into.&lt;br /&gt;
																	//(Optional) You can skip this object creation and it's parameter or pass null.&lt;br /&gt;
&lt;br /&gt;
	var thread = assetLoaderAsync.LoadFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, assetLoaderOptions, wrapperGameObject, delegate(GameObject myGameObject) {&lt;br /&gt;
		//Here you can get the reference to the loaded model using myGameObject.&lt;br /&gt;
	}); //Loads the model asynchronously and returns the reference to the created Task/Thread.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first difference on TriLib 2 is that we don't have to specify if we want to sync or async load our models since TriLib 2 will use async on platforms that support it and fallback to sync loading when there is no support.&lt;br /&gt;
&lt;br /&gt;
* On TriLib 2, we don't have to instantiate an AssetLoader or AssetLoaderAsync class. All loading is done using the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader.html AssetLoader] static class now.&lt;br /&gt;
* TriLib 2 no longer returns a GameObject or a Thread when loading a model. Instead, it will produce an [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html AssetLoaderContext] object containing the loaded GameObject as the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_context.html#a2dd4cc3184e8ef2787f20d31dcad7c67 RootGameObject] field and much more information regarding the model loading.&lt;br /&gt;
* TriLib 2 also uses [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions], but these have changed to adopt a cleaner and file-format agnostic approach. The way we create the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader_options.html AssetLoaderOptions] remains the same.&lt;br /&gt;
&lt;br /&gt;
Given these changes, a simple TriLib 2 model loading that matches the TriLib 1 samples above could be reproduced as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
AssetLoader.LoadModelFromFile(&amp;quot;PATH TO MY FILE.FBX&amp;quot;, null, delegate(AssetLoaderContext assetLoaderContext) {&lt;br /&gt;
	var myGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
}, null, null, null, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Loading a Model from a Custom Source==&lt;br /&gt;
TriLib 1 allows loading models from byte arrays using a callback to retrieve the custom data, a callback to check if such data exists, and a callback to return custom external textures data from any external resource the model uses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 1 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var modelData = File.ReadAllBytes(&amp;quot;PATH_TO_MY_FILE.OBJ&amp;quot;);&lt;br /&gt;
using (var assetLoader = new AssetLoader()) {&lt;br /&gt;
	var assetLoaderOptions = AssetLoaderOptions.CreateInstance();&lt;br /&gt;
	var myGameObject = assetLoader.LoadFromMemory(modelData, &amp;quot;MY_FILE.OBJ&amp;quot;, assetLoaderOptions, null, &amp;quot;PATH_TO&amp;quot;, &lt;br /&gt;
	delegate(string path, int fileId, ref int fileSize) { //External data reading callback&lt;br /&gt;
		var resourceData = File.ReadAllBytes(path); //Reads all external file data&lt;br /&gt;
		fileSize = resourceData.Length; //Retrieves the external file size&lt;br /&gt;
		return resourceData; //Returns the external file data&lt;br /&gt;
	},&lt;br /&gt;
	delegate(string path, int fileId) { //External data checking callback&lt;br /&gt;
		return File.Exists(path); //Returns true when the external file exists&lt;br /&gt;
	},&lt;br /&gt;
	delegate (string path, string basePath) { //External texture data reading callback&lt;br /&gt;
		var finalPath = Path.Combine(basePath, path); //Combines the model base path with the texture path&lt;br /&gt;
		if (File.Exists(finalPath)) { //Checks if there is a file on the combined path&lt;br /&gt;
			return File.ReadAllBytes(finalPath); //Returns the file data&lt;br /&gt;
		}&lt;br /&gt;
		return null; //Returns null when the given file could not be found&lt;br /&gt;
	},&lt;br /&gt;
	delegate (float progress) { //Progress handling callback&lt;br /&gt;
		Debug.Log(&amp;quot;Loaded:&amp;quot; + progress); //Writes the model loading progress to the console&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TriLib 2 uses different approaches to load models from custom data sources:&lt;br /&gt;
&lt;br /&gt;
* First, it doesn't work with byte arrays, specifically anymore. TriLib 2 works with Stream data reading.  &lt;br /&gt;
* Second, any external resource the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] class. &lt;br /&gt;
* Third, any external texture the model uses has to be loaded using a class inheriting the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] class.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The example below loads a model from a custom Stream and handles its external resources with custom [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_external_data_mapper.html ExternalDataMapper] and [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_mappers_1_1_texture_mapper.html TextureMapper] classes.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
assetLoaderOptions.ExternalDataMapper = ScriptableObject.CreateInstance&amp;lt;ExternalDataMapperSample&amp;gt;();&lt;br /&gt;
assetLoaderOptions.TextureMapper = ScriptableObject.CreateInstance&amp;lt;TextureMapperSample&amp;gt;();&lt;br /&gt;
var modelPath = &amp;quot;PATH_TO_MY_MODEL.FBX&amp;quot;;&lt;br /&gt;
AssetLoader.LoadModelFromStream(File.OpenRead(modelPath), modelPath, null, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here are the [https://ricardoreis.net/trilib/trilib2/docs/namespace_tri_lib_core_1_1_mappers.html Mappers] used on the code above. One creates Steams from external resource files and the other creates [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_texture_loading_context.html TextureLoadingContexts] from files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class ExternalDataMapperSample : ExternalDataMapper&lt;br /&gt;
{&lt;br /&gt;
	public override Stream Map(AssetLoaderContext assetLoaderContext, string originalFilename, out string finalPath)&lt;br /&gt;
	{&lt;br /&gt;
		finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(originalFilename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			Debug.Log($&amp;quot;Found external file at: {finalPath}&amp;quot;);&lt;br /&gt;
			return File.OpenRead(finalPath);&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;File {originalFilename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// TriLib 2 Code&lt;br /&gt;
// --------------------&lt;br /&gt;
public class TextureMapperSample : TextureMapper&lt;br /&gt;
{&lt;br /&gt;
	public override TextureLoadingContext Map(AssetLoaderContext assetLoaderContext, ITexture texture)&lt;br /&gt;
	{&lt;br /&gt;
		var finalPath = $&amp;quot;{assetLoaderContext.BasePath}/{FileUtils.GetFilename(texture.Filename)}&amp;quot;;&lt;br /&gt;
		if (File.Exists(finalPath))&lt;br /&gt;
		{&lt;br /&gt;
			var textureLoadingContext = new TextureLoadingContext&lt;br /&gt;
			{&lt;br /&gt;
				Context = assetLoaderContext,&lt;br /&gt;
				Stream = File.OpenRead(finalPath),&lt;br /&gt;
				Texture = texture&lt;br /&gt;
			};&lt;br /&gt;
			Debug.Log($&amp;quot;Found texture at: {finalPath}&amp;quot;);&lt;br /&gt;
			return textureLoadingContext;&lt;br /&gt;
		}&lt;br /&gt;
		throw new Exception($&amp;quot;Texture {texture.Filename} not found.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=102</id>
		<title>Basic Usage</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Basic_Usage&amp;diff=102"/>
		<updated>2024-04-30T16:11:57Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are three main methods to load models and their dependencies in TriLib:&lt;br /&gt;
&lt;br /&gt;
* Local File-System Loading&lt;br /&gt;
* URL Loading&lt;br /&gt;
* Custom Source Loading&lt;br /&gt;
&lt;br /&gt;
The user can adapt other loading mechanisms as the core loading methods accept Streams as data input and Scriptable Objects called [https://ricardoreis.net/trilib/trilib2/docs/namespace_tri_lib_core_1_1_mappers.html Mappers], used to load Textures and external data from custom data Streams.&lt;br /&gt;
&lt;br /&gt;
==Local File-System Loading==&lt;br /&gt;
&lt;br /&gt;
=== Using File Picker ===&lt;br /&gt;
Loading models from the local file-system is simplified by using the StandaloneFileBrowser classes that come with TriLib.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the AssetLoaderFilePicker instance.&lt;br /&gt;
			// AssetLoaderFilePicker is a class that allows users to select models from the local file system.&lt;br /&gt;
			var assetLoaderFilePicker = AssetLoaderFilePicker.Create();&lt;br /&gt;
&lt;br /&gt;
			// Shows the model selection file-picker.&lt;br /&gt;
			assetLoaderFilePicker.LoadModelFromFilePickerAsync(&amp;quot;Select a File&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnBeginLoad, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Using the Model Filename ===&lt;br /&gt;
You can also load your Models, passing the Model Filename to the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_loader.html AssetLoader] methods.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from File&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Loads the model from the &amp;quot;PATH_TO_MY_FILE.FBX&amp;quot; path&lt;br /&gt;
			AssetLoader.LoadModelFromFile(&amp;quot;PATH_TO_MY_FILE.FBX&amp;quot;, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model is about to be loaded.&lt;br /&gt;
	// You can use this event to do some loading preparation, like showing a loading screen in platforms without threading support.&lt;br /&gt;
	// This event receives a Boolean indicating if any file has been selected on the file-picker dialog.&lt;br /&gt;
	private void OnBeginLoad(bool anyModelSelected)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== URL Loading ==&lt;br /&gt;
&lt;br /&gt;
You can use the [https://ricardoreis.net/trilib/trilib2/docs/class_tri_lib_core_1_1_asset_downloader.html AssetDownloader] class to load models from URLs (network). The usage is relatively simple and similar to the local file-system loading.&lt;br /&gt;
&lt;br /&gt;
Let's create an empty Unity project in this example and import the TriLib Unity package. Make sure you include the StandaloneFileBrowser folder when extracting.&lt;br /&gt;
&lt;br /&gt;
Create a new Script. You can call it &amp;quot;TestLoader.cs&amp;quot; then assign this script to the &amp;quot;Main Camera&amp;quot; on your scene.&lt;br /&gt;
&lt;br /&gt;
Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from the &amp;quot;AssetDownloader.LoadModelFromUri&amp;quot; call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Use the following code in your &amp;quot;TestLoader.cs&amp;quot; and hit the play button to test it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using TriLibCore;&lt;br /&gt;
using TriLibCore.General;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
public class TestLoader : MonoBehaviour&lt;br /&gt;
{&lt;br /&gt;
	// Lets the user load a new model by clicking a GUI button.&lt;br /&gt;
	private void OnGUI()&lt;br /&gt;
	{&lt;br /&gt;
		// Displays a button to begin the model loading process.&lt;br /&gt;
		if (GUILayout.Button(&amp;quot;Load Model from URL&amp;quot;))&lt;br /&gt;
		{&lt;br /&gt;
			// Creates an AssetLoaderOptions instance.&lt;br /&gt;
			// AssetLoaderOptions is a class used to configure many aspects of the loading process.&lt;br /&gt;
			// We won't change the default settings this time, so we can use the instance as it is.&lt;br /&gt;
			var assetLoaderOptions = AssetLoader.CreateDefaultLoaderOptions();&lt;br /&gt;
&lt;br /&gt;
			// Creates the web-request.&lt;br /&gt;
			// The web-request contains information on how to download the model.&lt;br /&gt;
			// Let's download a model from the TriLib website.&lt;br /&gt;
			var webRequest = AssetDownloader.CreateWebRequest(&amp;quot;https://ricardoreis.net/trilib/demos/avatars/003/003_visemes.zip&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Important: If you're downloading models from files that are not Zipped, you must pass the model extension as the last parameter from this call (Eg: &amp;quot;fbx&amp;quot;)&lt;br /&gt;
			// Begins the model downloading.&lt;br /&gt;
			AssetDownloader.LoadModelFromUri(webRequest, OnLoad, OnMaterialsLoad, OnProgress, OnError, null, assetLoaderOptions, null, null);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when the model loading progress changes.&lt;br /&gt;
	// You can use this event to update a loading progress-bar, for instance.&lt;br /&gt;
	// The &amp;quot;progress&amp;quot; value comes as a normalized float (goes from 0 to 1).&lt;br /&gt;
	// Platforms like UWP and WebGL don't call this method at this moment, since they don't use threads.&lt;br /&gt;
	private void OnProgress(AssetLoaderContext assetLoaderContext, float progress)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when there is any critical error loading your model.&lt;br /&gt;
	// You can use this to show a message to the user.&lt;br /&gt;
	private void OnError(IContextualizedError contextualizedError)&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called when all model GameObjects and Meshes have been loaded.&lt;br /&gt;
	// There may still Materials and Textures processing at this stage.&lt;br /&gt;
	private void OnLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// If you want to make sure the GameObject will be visible only when all Materials and Textures have been loaded, you can disable it at this step.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(false);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// This event is called after OnLoad when all Materials and Textures have been loaded.&lt;br /&gt;
	// This event is also called after a critical loading error, so you can clean up any resource you want to.&lt;br /&gt;
	private void OnMaterialsLoad(AssetLoaderContext assetLoaderContext)&lt;br /&gt;
	{&lt;br /&gt;
		// The root loaded GameObject is assigned to the &amp;quot;assetLoaderContext.RootGameObject&amp;quot; field.&lt;br /&gt;
		// You can make the GameObject visible again at this step if you prefer to.&lt;br /&gt;
		var myLoadedGameObject = assetLoaderContext.RootGameObject;&lt;br /&gt;
		myLoadedGameObject.SetActive(true);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=101</id>
		<title>Known Issues/Limitations</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Known_Issues/Limitations&amp;diff=101"/>
		<updated>2024-04-30T16:06:14Z</updated>

		<summary type="html">&lt;p&gt;Trilib: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;TriLib is not a Model exporter.&lt;br /&gt;
&lt;br /&gt;
The FBX Importer does not import multiple texture layers yet.  &lt;br /&gt;
&lt;br /&gt;
Some FBX files may present incompatibilities.&lt;br /&gt;
&lt;br /&gt;
3MF Beam Lattice format is not supported yet.&lt;br /&gt;
&lt;br /&gt;
3MF PBR Specular materials are not supported yet.&lt;br /&gt;
&lt;br /&gt;
Blend-shape normals and tangents are not imported yet.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=100</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=100"/>
		<updated>2023-01-05T09:13:55Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Inconsistencies]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
&lt;br /&gt;
[[Loading models from URI]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Loading_models_from_URI&amp;diff=99</id>
		<title>Loading models from URI</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Loading_models_from_URI&amp;diff=99"/>
		<updated>2023-01-05T09:13:36Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Criou página com 'A recurrent issue when loading models from URI is caused by a Cross-Origin Resource Sharing restrictions, resulting in the error message: &amp;quot;TriLib is unable to load the given f...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A recurrent issue when loading models from URI is caused by a Cross-Origin Resource Sharing restrictions, resulting in the error message: &amp;quot;TriLib is unable to load the given file&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Web-servers can use these restrictions, for instance, to avoid unauthorized websites from making requests to the server.&lt;br /&gt;
&lt;br /&gt;
This issue will generally not happen when loading models using TriLib from a desktop, or a mobile application.&lt;br /&gt;
&lt;br /&gt;
To get more information on Cross-Origin Resource Sharing, please refer to:&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=98</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=98"/>
		<updated>2022-11-23T20:51:09Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Inconsistencies]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Changes&amp;diff=97</id>
		<title>Material Color Changes</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Changes&amp;diff=97"/>
		<updated>2022-11-23T20:50:48Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Trilib moveu Material Color Changes para Material Color Inconsistencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECIONAMENTO [[Material Color Inconsistencies]]&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Inconsistencies&amp;diff=96</id>
		<title>Material Color Inconsistencies</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Material_Color_Inconsistencies&amp;diff=96"/>
		<updated>2022-11-23T20:50:48Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Trilib moveu Material Color Changes para Material Color Inconsistencies&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes when loading model materials, the color might differ from what other viewers are showing.&lt;br /&gt;
&lt;br /&gt;
By default, TriLib will convert material color values and texture colors to the gamma (sRGB) representation.&lt;br /&gt;
&lt;br /&gt;
If you don't want this to happen, you can disable these behaviors by disabling your '''AssetLoaderOptions'''&amp;lt;nowiki/&amp;gt;'s &amp;quot;'''ApplyGammaCurveToMaterialColors'''&amp;quot; and &amp;quot;'''LoadTexturesAsSRGB'''&amp;quot; fields.&lt;br /&gt;
&lt;br /&gt;
Another reason for colors to differ happens when TriLib does not applies ambient color to FBX materials.&lt;br /&gt;
&lt;br /&gt;
You can enable the &amp;quot;'''FBXReader.ApplyAmbientColo'''r&amp;quot; static field, so TriLib will apply ambient color to FBX materials.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=95</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=95"/>
		<updated>2022-11-23T20:27:38Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Missing Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Changes]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials&amp;diff=94</id>
		<title>Missing Materials</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Missing_Materials&amp;diff=94"/>
		<updated>2022-11-23T20:27:22Z</updated>

		<summary type="html">&lt;p&gt;Trilib: Criou página com 'Sometimes your model may not be loaded with the original colors or textures.  There are a few reasons this might happen:  -If your model uses textures, these textures must be...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes your model may not be loaded with the original colors or textures.&lt;br /&gt;
&lt;br /&gt;
There are a few reasons this might happen:&lt;br /&gt;
&lt;br /&gt;
-If your model uses textures, these textures must be located at the same folder as the model, or inside the model Zip file in case you're loading your model from Zip files.&lt;br /&gt;
&lt;br /&gt;
Model textures can be embedded in the model itself depending on your exporting options. glTF2 and FBX files accepts this feature.&lt;br /&gt;
&lt;br /&gt;
-If your model doesn't use textures, make sure the resource files your model uses are located at the same folder as the model, or inside the model Zip file in case you're loading your model from Zip files.&lt;br /&gt;
&lt;br /&gt;
glTF2 files sometimes comes with &amp;quot;.bin&amp;quot; resource files, and OBJ (Wavefront) files sometimes comes with &amp;quot;.mtl&amp;quot; (material library) files.&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
	<entry>
		<id>https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=93</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ricardoreis.net/trilibwiki/index.php?title=Main_Page&amp;diff=93"/>
		<updated>2022-11-23T17:41:13Z</updated>

		<summary type="html">&lt;p&gt;Trilib: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Main page}}&lt;br /&gt;
&lt;br /&gt;
==Getting started==&lt;br /&gt;
[[Basic Usage]]&lt;br /&gt;
&lt;br /&gt;
[[Avatar Importing]]&lt;br /&gt;
&lt;br /&gt;
[[Migrating from TriLib 1 to TriLib 2]]&lt;br /&gt;
&lt;br /&gt;
[[Video Tutorials]]&lt;br /&gt;
==Troubleshooting==&lt;br /&gt;
[[Missing Materials (Pink color)]]&lt;br /&gt;
&lt;br /&gt;
[[Material Color Changes]]&lt;br /&gt;
&lt;br /&gt;
[[Transparent Materials]]&lt;br /&gt;
&lt;br /&gt;
[[Measurement Units]]&lt;br /&gt;
&lt;br /&gt;
[[Scripted Importers Conflict]]&lt;br /&gt;
&lt;br /&gt;
[[StandaloneFileBrowser can't be found]]&lt;br /&gt;
&lt;br /&gt;
[[SharpZipLib conflicts]]&lt;br /&gt;
==Info==&lt;br /&gt;
[[Supported File Formats‎]]&lt;br /&gt;
&lt;br /&gt;
[[Known Issues/Limitations]]&lt;br /&gt;
&lt;br /&gt;
[[File Format specific Options]]&lt;br /&gt;
&lt;br /&gt;
[[How to track loaded resources]]&lt;br /&gt;
&lt;br /&gt;
[[Running TriLib in Headless Mode]]&lt;br /&gt;
==API Docs==&lt;br /&gt;
https://ricardoreis.net/trilib/trilib2/docs/&lt;/div&gt;</summary>
		<author><name>Trilib</name></author>
	</entry>
</feed>