using System.IO;
using System.Text.RegularExpressions;
namespace Editor;
static class NativeAssetProcessor
{
///
/// Determine what packages this material requires, and save the list to metadata so we know what to download in future
///
internal static void OnAssetChanged( Asset asset )
{
if ( asset.AssetType != AssetType.Material && asset.AssetType != AssetType.Model )
return;
if ( !File.Exists( asset.AbsoluteSourcePath ) )
return;
if ( asset.IsCloud )
return;
// scan from source file contents directly
// (not using asset dependency graph so it works even if compile failed)
string contents = File.ReadAllText( asset.AbsoluteSourcePath );
var strings = Regex.Matches( contents, @"""([^""\\]+\.[a-zA-Z0-9.]+)""" ); // stuff in quotes with .ext
HashSet packageReferences = new HashSet();
for ( int i = 0; i < strings.Count; i++ )
{
var path = strings[i].Groups[1].Value;
var assetRef = AssetSystem.FindByPath( path );
if ( assetRef is null ) continue;
var package = assetRef.Package;
if ( package is null && assetRef.IsTrivialChild )
{
// possibly a generated texture. work out if the input's from a package, because we'll need that
foreach ( var inputPath in assetRef.GetInputDependencies() )
{
var input = AssetSystem.FindByPath( inputPath );
if ( input is null ) continue;
if ( input.Package is not null )
{
package = input.Package;
break;
}
}
}
if ( package is null ) continue;
if ( package == asset.Package ) continue;
packageReferences.Add( package.GetIdent( false, true ) );
}
if ( !packageReferences.Any() && asset.Publishing.ProjectConfig.EditorReferences is null )
return; // no packages and no change, avoid writing empty metadata
asset.Publishing.ProjectConfig.EditorReferences = packageReferences.ToList();
asset.MetaData?.Set( "publish", asset.Publishing );
}
}