You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.1 KiB
90 lines
3.1 KiB
using System; |
|
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine; |
|
|
|
namespace UnityEditor.ShaderGraph |
|
{ |
|
[GenerationAPI] |
|
[Serializable] |
|
internal class IncludeCollection : IEnumerable<IncludeDescriptor> |
|
{ |
|
[SerializeField] |
|
List<IncludeDescriptor> includes; |
|
|
|
public IncludeCollection() |
|
{ |
|
includes = new List<IncludeDescriptor>(); |
|
} |
|
|
|
public IncludeCollection Add(IncludeCollection includes) |
|
{ |
|
if (includes != null) |
|
{ |
|
foreach (var include in includes) |
|
{ |
|
AddInternal(include.guid, include.path, include.location, include.fieldConditions); |
|
} |
|
} |
|
return this; |
|
} |
|
|
|
public IncludeCollection Add(string includePath, IncludeLocation location) |
|
{ |
|
var guid = AssetDatabase.AssetPathToGUID(includePath); |
|
return AddInternal(guid, includePath, location); |
|
} |
|
|
|
public IncludeCollection Add(string includePath, IncludeLocation location, FieldCondition fieldCondition) |
|
{ |
|
var guid = AssetDatabase.AssetPathToGUID(includePath); |
|
return AddInternal(guid, includePath, location, new FieldCondition[] { fieldCondition }); |
|
} |
|
|
|
public IncludeCollection Add(string includePath, IncludeLocation location, FieldCondition[] fieldConditions) |
|
{ |
|
var guid = AssetDatabase.AssetPathToGUID(includePath); |
|
return AddInternal(guid, includePath, location, fieldConditions); |
|
} |
|
|
|
public IncludeCollection AddInternal(string includeGUID, string includePath, IncludeLocation location, FieldCondition[] fieldConditions = null) |
|
{ |
|
if (string.IsNullOrEmpty(includeGUID)) |
|
{ |
|
// either the file doesn't exist, or this is a placeholder |
|
// de-duplicate by path |
|
int existing = includes.FindIndex(i => i.path == includePath); |
|
if (existing < 0) |
|
includes.Add(new IncludeDescriptor(null, includePath, location, fieldConditions)); |
|
return this; |
|
} |
|
else |
|
{ |
|
// de-duplicate by GUID |
|
int existing = includes.FindIndex(i => i.guid == includeGUID); |
|
if (existing < 0) |
|
{ |
|
// no duplicates, just add it |
|
includes.Add(new IncludeDescriptor(includeGUID, includePath, location, fieldConditions)); |
|
} |
|
else |
|
{ |
|
// duplicate file -- we could double check they are the same... |
|
// they might have different field conditions that require merging, for example. |
|
// But for now we'll just assume they are the same and drop the new one |
|
} |
|
} |
|
return this; |
|
} |
|
|
|
public IEnumerator<IncludeDescriptor> GetEnumerator() |
|
{ |
|
return includes.GetEnumerator(); |
|
} |
|
|
|
IEnumerator IEnumerable.GetEnumerator() |
|
{ |
|
return GetEnumerator(); |
|
} |
|
} |
|
}
|
|
|