namespace Sandbox.Rendering;

[Flags]
internal enum SceneObjectFlags : ulong
{
	None = 0,
	IsOpaque = 0x0000000000000001,
	IsTranslucent = 0x0000000000000002,
	IsLight = 0x0000000000000004,
	IsSunLight = 0x0000000000000008,
	IsLightVolume = 0x0000000000000010,
	IsDecal = 0x0000000000000020,
	IsDynamicDecals = 0x0000000000000040,
	IsEnvMap = 0x0000000000000080,
	IsDirectLight = 0x0000000000000100,
	IsIndirectLight = 0x0000000000000200,

	//------------------------------------------------------------------------------
	// Rendering order: Logical layers we organize a scene into
	//------------------------------------------------------------------------------
	ViewModelLayer = 0x0000000000001000,   // Render only in viewmodel pass
	Skybox3DLayer = 0x0000000000002000,
	DisabledInLowQuality = 0x0000000000004000,
	IsHammerGeometry = 0x0000000000008000,
	EffectsBloomLayer = 0x0000000000010000,
	GameOverlayLayer = 0x0000000000020000,
	ExcludeGameLayer = 0x0000000000040000,
	UIOverlayLayer = 0x0000000000080000,

	//------------------------------------------------------------------------------
	// Hammer- / Tools-specific rendering order
	//------------------------------------------------------------------------------
	ToolsUnlitLayer = 0x0000000000100000,
	ToolSceneOverlayLayer = 0x0000000000200000,
	HammerPrefabStencilLayer = 0x0000000000400000,
	HammerSelectionStencilLayer = 0x0000000000800000,
	HammerEnabledStencilLayer = 0x0000000001000000,

	//------------------------------------------------------------------------------
	// Rendering properties of a scene object
	//------------------------------------------------------------------------------
	HasAOProxies = 0x0000000010000000,
	AlphaTestZPrepass = 0x0000000020000000,
	AddsDependentView = 0x0000000040000000, // Adds a dependent view, doesn't render itself (also safe to draw multiple times).  Hint to kick this work off early
	NeedsDynamicReflectionMap = 0x0000000080000000, // Meshes with this flag set will cause a dynamic reflection to launch and have it bound into the context
	Reflects = 0x0000000100000000,
	CastShadowsEnabled = 0x0000000200000000,
	DoesNotAcceptDecals = 0x0000000400000000,
	WantsFrameBufferCopyTexture = 0x0000000800000000,
	IssuesQueries = 0x0000001000000000,
	StaticObject = 0x0000002000000000, // Static, permanent part of the "world"
	EnvironmentMapped = 0x0000004000000000,
	MaterialSupportsShadows = 0x0000008000000000, // The material supports casting shadows, but the object will only cast shadows if MATERIAL_SUPPORTS_SHADOWS and CAST_SHADOWS_ENABLED are set
	NoZPrepass = 0x0000010000000000, // Opt out of z-prepass
	ForwardLayerOnly = 0x0000020000000000, // Render only in a forward layer  
	NoOcclusionCulling = 0x0000040000000000, // Don't occlusion cull this scene object 
	NoPVSCulling = 0x0000080000000000, // Don't pvs cull this scene object

	CastShadows = MaterialSupportsShadows | CastShadowsEnabled,

	/// <summary>
	/// Not rendered in cubemaps
	/// </summary>
	HideInCubemaps = 1LU << 52,
	ExecuteBefore = 1LU << 57,
	ExecuteAfter = 1LU << 58,

	NeedsLightProbe = 0x0000400000000000,


	IsLoaded = 0x2000000000000000
}
