Editor/ModelProSettings.cs

Editor settings holder for Model Pro. Stores user preferences for VMDL and FBX import/export (scale, units, alignment, collision, default material) and loads/saves them as JSON in the editor config folder.

File Access
using ModelPro.Vmdl;

namespace ModelPro.Editor;

/// <summary>
/// Remembers the last values used in Model Pro so the next time the app is
/// opened the controls are pre-filled. Persisted to the editor config folder.
/// </summary>
public class ModelProSettings
{
	const string Path = "modelpro/modelpro.json";

	// VMDL tab
	public string VmdlScale { get; set; } = "1.0";
	public ScaleUnit VmdlScaleUnit { get; set; } = ScaleUnit.Inches;
	public AlignOrigin VmdlAlignX { get; set; } = AlignOrigin.None;
	public AlignOrigin VmdlAlignY { get; set; } = AlignOrigin.None;
	public AlignOrigin VmdlAlignZ { get; set; } = AlignOrigin.None;
	public string VmdlDefaultMaterial { get; set; } = "";

	// FBX tab
	public CollisionMode FbxCollision { get; set; } = CollisionMode.Hull;
	public string FbxScale { get; set; } = "1.0";
	public ScaleUnit FbxScaleUnit { get; set; } = ScaleUnit.Inches;
	public AlignOrigin FbxAlignX { get; set; } = AlignOrigin.None;
	public AlignOrigin FbxAlignY { get; set; } = AlignOrigin.None;
	public AlignOrigin FbxAlignZ { get; set; } = AlignOrigin.None;

	private static readonly ModelProSettings _current = new();

	/// <summary>The single shared instance, loaded from disk on first access.</summary>
	public static ModelProSettings Current
	{
		get
		{
			if ( _loaded ) return _current;
			_loaded = true;

			try
			{
				global::Editor.FileSystem.Config.CreateDirectory( "modelpro" );
				var loaded = global::Editor.FileSystem.Config.ReadJsonOrDefault( Path, _current );
				if ( loaded is not null )
				{
					// Keep the path the same - only copy values over.
					_current.VmdlScale = loaded.VmdlScale;
					_current.VmdlScaleUnit = loaded.VmdlScaleUnit;
					_current.VmdlAlignX = loaded.VmdlAlignX;
					_current.VmdlAlignY = loaded.VmdlAlignY;
					_current.VmdlAlignZ = loaded.VmdlAlignZ;
					_current.VmdlDefaultMaterial = loaded.VmdlDefaultMaterial;

					_current.FbxCollision = loaded.FbxCollision;
					_current.FbxScale = loaded.FbxScale;
					_current.FbxScaleUnit = loaded.FbxScaleUnit;
					_current.FbxAlignX = loaded.FbxAlignX;
					_current.FbxAlignY = loaded.FbxAlignY;
					_current.FbxAlignZ = loaded.FbxAlignZ;
				}
			}
			catch ( System.Exception e )
			{
				Log.Warning( e, "Model Pro: failed to load settings" );
			}

			return _current;
		}
	}

	static bool _loaded;

	/// <summary>Save the current settings to the editor config folder.</summary>
	public void Save()
	{
		try
		{
			global::Editor.FileSystem.Config.CreateDirectory( "modelpro" );
			global::Editor.FileSystem.Config.WriteJson( Path, _current );
		}
		catch ( System.Exception e )
		{
			Log.Warning( e, "Model Pro: failed to save settings" );
		}
	}
}