Editor/Prism/Core/PrismConstants.cs

Static class of editor-wide constants for the Prism editor. Declares product/version strings, file extensions, document schema values, clipboard/event ids, filesystem paths, cookie keys, backend ids, generated-code naming, resource limits and various timing/geometry tuning constants. SessionId is generated per process.

Native Interop
namespace Editor.Prism.Core;

/// <summary>
/// Well-known strings, paths, limits and tuning constants shared by every Prism subsystem.
/// Everything here is compile-time constant except <see cref="SessionId"/>, which is minted
/// once per editor process so two open windows never collide in the scratch workspace.
/// </summary>
public static class PrismConstants
{
	/// <summary>Product name, used in window titles, log scopes and generated file headers.</summary>
	public const string ProductName = "Prism";

	/// <summary>Version stamped into <c>meta.editorVersion</c> of every saved document.</summary>
	public const string EditorVersion = "0.1.0";

	// ---- file extensions -------------------------------------------------

	/// <summary>Shader graph document extension (no leading dot).</summary>
	public const string GraphExtension = "prism";

	/// <summary>Subgraph / shader function document extension (no leading dot).</summary>
	public const string SubgraphExtension = "prismfn";

	/// <summary>The VFX block file we always generate beside a saved graph.</summary>
	public const string ShaderExtension = "shader";

	/// <summary>The portable Slang module we optionally generate beside a saved graph.</summary>
	public const string SlangExtension = "slang";

	/// <summary>Raw HLSL files the code editor can open (never an asset type).</summary>
	public const string HlslExtension = "hlsl";

	// ---- document schema -------------------------------------------------

	/// <summary>Current document schema version written to <c>schema</c>.</summary>
	public const int DocumentSchemaVersion = 1;

	/// <summary>Value of <c>kind</c> for a full shader graph.</summary>
	public const string DocumentKindShader = "shader";

	/// <summary>Value of <c>kind</c> for a subgraph / shader function.</summary>
	public const string DocumentKindSubgraph = "subgraph";

	/// <summary>Indent width used when writing documents. Deterministic output is a hard requirement.</summary>
	public const int JsonIndentSize = 2;

	// ---- clipboard / events ----------------------------------------------

	/// <summary>
	/// Clipboard identifier for graph fragments. Must be unique across every node editor in the
	/// process — a shared ident makes a foreign paste throw during deserialization.
	/// </summary>
	public const string ClipboardIdent = "prism.graph";

	/// <summary>Editor event raised after a graph document is saved. Argument: project-relative path.</summary>
	public const string EventGraphSaved = "prism.graph.saved";

	/// <summary>Editor event raised when the compile service publishes a new result.</summary>
	public const string EventCompileFinished = "prism.compile.finished";

	// ---- filesystem ------------------------------------------------------

	/// <summary>
	/// Scratch root for generated shaders, relative to <c>Editor.FileSystem.Root</c>.
	/// This is a mounted game search path, so compiled output here is loadable by relative path.
	/// </summary>
	public const string TempRoot = ".source2/temp/prism";

	/// <summary>Autosave root, relative to the project directory.</summary>
	public const string AutosaveRoot = ".sbox/prism/autosave";

	/// <summary>Optional user theme override file, relative to the project directory.</summary>
	public const string ThemeFile = ".sbox/prism/theme.json";

	/// <summary>Recommended vendored location of the Slang toolchain, relative to the project directory.</summary>
	public const string SlangToolchainDir = "Tools/slang/bin";

	/// <summary>Sessions in <see cref="TempRoot"/> older than this many hours are garbage collected on startup.</summary>
	public const int TempSessionLifetimeHours = 24;

	/// <summary>Unique per editor process. Scratch artifacts live in <c>TempRoot/&lt;SessionId&gt;/</c>.</summary>
	public static readonly string SessionId = Guid.NewGuid().ToString( "N" )[..8];

	// ---- cookie keys -----------------------------------------------------

	/// <summary>Cached absolute path of the discovered <c>slangc</c> executable.</summary>
	public const string CookieSlangPath = "prism.slang.path";

	/// <summary>User-specified override for the <c>slangc</c> executable.</summary>
	public const string CookieSlangPathOverride = "prism.slang.pathOverride";

	/// <summary>Discovered <c>slangc</c> version string.</summary>
	public const string CookieSlangVersion = "prism.slang.version";

	/// <summary>Whether Prism handles <c>open.shader</c> and registers itself as the code editor.</summary>
	public const string CookieClaimShaderFiles = "prism.claimShaderFiles";

	/// <summary>Persisted connection routing style for the graph view.</summary>
	public const string CookieWireStyle = "prism.wireStyle";

	/// <summary>Persisted "draw node thumbnails" toggle.</summary>
	public const string CookieNodePreviews = "prism.nodePreviews";

	/// <summary>Dock layout state cookie name for the main window.</summary>
	public const string WindowStateCookie = "Prism";

	// ---- backends --------------------------------------------------------

	/// <summary>Backend id of the s&amp;box VFX/HLSL backend — the render path.</summary>
	public const string BackendHlsl = "sbox-hlsl";

	/// <summary>Backend id of the portable Slang backend — export and validation only.</summary>
	public const string BackendSlang = "slang";

	/// <summary>Slang language version we pin in every emitted module.</summary>
	public const string SlangLanguageVersion = "2026";

	/// <summary>Name of the emitted Slang prelude module.</summary>
	public const string SlangRuntimeModule = "prism.core";

	// ---- entry points ----------------------------------------------------

	/// <summary>Vertex entry point name. Fixed by the engine's VFX block format.</summary>
	public const string EntryPointVertex = "MainVs";

	/// <summary>Pixel entry point name. Fixed by the engine's VFX block format.</summary>
	public const string EntryPointPixel = "MainPs";

	/// <summary>Geometry entry point name.</summary>
	public const string EntryPointGeometry = "MainGs";

	/// <summary>Compute entry point name.</summary>
	public const string EntryPointCompute = "MainCs";

	// ---- generated-code conventions --------------------------------------

	/// <summary>Prefix of every symbol Prism introduces into generated shader code.</summary>
	public const string SymbolPrefix = "g_prism";

	/// <summary>Attribute that selects which node's value the preview shader outputs.</summary>
	public const string StageIdAttribute = "g_iPrismStageId";

	/// <summary>Attribute that selects the preview debug channel.</summary>
	public const string ChannelAttribute = "g_iPrismChannel";

	/// <summary>
	/// First TEXCOORD semantic index Prism may allocate. <c>common/pixelinput.hlsl</c> already
	/// consumes TEXCOORD0-7 and TEXCOORD11; 13 is documented as the next free slot.
	/// </summary>
	public const int FirstFreeTexcoord = 13;

	/// <summary>Number of float4 interpolator slots Prism will allocate before erroring.</summary>
	public const int MaxVaryingSlots = 12;

	/// <summary>Sampler budget beyond which the validator emits a resource-budget warning.</summary>
	public const int MaxSamplers = 16;

	// ---- timing ----------------------------------------------------------

	/// <summary>Debounce before a graph mutation triggers a preview compile.</summary>
	public const int CompileDebounceMs = 120;

	/// <summary>Debounce before a text edit triggers validation.</summary>
	public const int TextDebounceMs = 400;

	/// <summary>Target upper bound for a preview compile before the status chip turns amber.</summary>
	public const int CompileBudgetMs = 400;

	/// <summary>Autosave period while the document is dirty.</summary>
	public const int AutosaveIntervalSeconds = 120;

	/// <summary>How many autosave generations are retained per document.</summary>
	public const int AutosaveRetained = 10;

	/// <summary>Undo entries created within this window may coalesce into the previous entry.</summary>
	public const int UndoCoalesceMs = 500;

	// ---- geometry --------------------------------------------------------

	/// <summary>Graph canvas grid size in scene units. Node positions snap to this.</summary>
	public const float GridSize = 16f;

	/// <summary>Every Nth grid line is drawn as a major line.</summary>
	public const int GridMajorEvery = 8;
}