91 lines
3.1 KiB
C#
91 lines
3.1 KiB
C#
|
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();
|
||
|
}
|
||
|
}
|
||
|
}
|