Introduces a new Ghost.Shader.Concept project implementing a modern, data-oriented material and shader system with: - Global/local keyword bitsets (fast O(1) ops, 64 bytes) - Multi-pass shader program and per-pass render state overrides - Thread-safe, 16-byte aligned material property blocks - Material pooling to reduce GC pressure - Batch renderer for efficient PSO grouping and async variant warmup - Full demo (Program.cs) and extensive documentation (ARCHITECTURE.md, README.md, PROJECT_SUMMARY.md) - Minor integration: new enums, doc updates, and keyword handling in existing code No breaking changes to the existing engine; all new code is isolated. This serves as a reference implementation for high-performance, extensible material/shader architectures.
72 lines
1.7 KiB
C#
72 lines
1.7 KiB
C#
namespace Ghost.Shader.Concept;
|
|
|
|
/// <summary>
|
|
/// Global keyword state manager. Singleton pattern for engine-wide keywords.
|
|
/// Keywords like platform settings, quality levels, etc.
|
|
/// </summary>
|
|
public sealed class GlobalKeywordState
|
|
{
|
|
private static readonly Lazy<GlobalKeywordState> _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++;
|
|
}
|
|
}
|
|
}
|