Files
sbox-public/engine/Sandbox.Engine/Resources/Material/Material.Load.cs
Sam Pavlovic 9066f38917 Added baking to EnvmapProbe
* Added ability to bake envmap textures
* Added Scene.Editor.GetSceneFolder() - allows saving baked resources for scene
* Envmaps are represented with a shiny sphere now instead of a handle
* Fixed Enum Dropdown being the wrong color
* Added [EnumButtonGroup]
* Added GroupButtonControlWidget
* Added Editor.EditorSystem (accessible via Application.Editor)
* Can place [Menu] attributes in game code (was previously in tools only)
* Added "Scene/Bake Envmaps" option
2026-01-19 08:09:13 +00:00

69 lines
2.1 KiB
C#

using NativeEngine;
using Sandbox.Mounting;
namespace Sandbox;
public partial class Material
{
/// <summary>
/// Load a material from disk. Has internal cache.
/// </summary>
/// <param name="filename">The filepath to load the material from.</param>
/// <returns>The loaded material, or null</returns>
public static Material Load( string filename )
{
ThreadSafe.AssertIsMainThread();
if ( filename.StartsWith( '/' ) || filename.StartsWith( '\\' ) )
filename = filename[1..];
if ( !string.IsNullOrWhiteSpace( filename ) && Directory.TryLoad( filename, ResourceType.Material, out object model ) && model is Material m )
return m;
return FromNative( NativeGlue.Resources.GetMaterial( filename ), filename );
}
/// <summary>
/// Load a material from disk. Has internal cache.
/// </summary>
/// <param name="filename">The filepath to load the material from.</param>
/// <returns>The loaded material, or null</returns>
public static async Task<Material> LoadAsync( string filename )
{
ThreadSafe.AssertIsMainThread();
if ( !string.IsNullOrWhiteSpace( filename ) && await Directory.TryLoadAsync( filename, ResourceType.Material ) is Material m )
return m;
using var manifest = AsyncResourceLoader.Load( filename );
if ( manifest is not null )
{
await manifest.WaitForLoad();
}
return FromNative( NativeGlue.Resources.GetMaterial( filename ) );
}
/// <summary>
/// Try to make it so only one Material class exists for each material
/// </summary>
internal static Material FromNative( IMaterial native, string name = null )
{
if ( native.IsNull || !native.IsStrongHandleValid() )
return null;
var instanceId = native.GetBindingPtr().ToInt64();
if ( NativeResourceCache.TryGetValue<Material>( instanceId, out var material ) )
{
// The already loaded Material has it's own strong handle, we need to destroy the one just given to us to prevent leak.
native.DestroyStrongHandle();
return material;
}
material = new Material( native, name ?? native.GetName() );
NativeResourceCache.Add( instanceId, material );
return material;
}
}