namespace Ghost.Shader.Concept;
///
/// Global keyword state manager. Singleton pattern for engine-wide keywords.
/// Keywords like platform settings, quality levels, etc.
///
public sealed class GlobalKeywordState
{
private static readonly Lazy _instance = new(() => new GlobalKeywordState());
public static GlobalKeywordState Instance => _instance.Value;
private KeywordSet _keywords;
private readonly object _lock = new();
private int _version = 0;
public int Version => _version;
private GlobalKeywordState()
{
_keywords = new KeywordSet();
}
public void EnableKeyword(ShaderKeyword keyword)
{
if (keyword.Scope != KeywordScope.Global)
throw new ArgumentException("Only global keywords can be set", nameof(keyword));
lock (_lock)
{
_keywords.Enable(keyword);
_version++;
}
}
public void DisableKeyword(ShaderKeyword keyword)
{
if (keyword.Scope != KeywordScope.Global)
throw new ArgumentException("Only global keywords can be set", nameof(keyword));
lock (_lock)
{
_keywords.Disable(keyword);
_version++;
}
}
public bool IsKeywordEnabled(ShaderKeyword keyword)
{
lock (_lock)
{
return _keywords.IsEnabled(keyword);
}
}
public KeywordSet GetKeywordSet()
{
lock (_lock)
{
return _keywords; // struct copy
}
}
public void Clear()
{
lock (_lock)
{
_keywords.Clear();
_version++;
}
}
}