Grid/DungeonRPGProfile.cs
using Sandbox;
using static Sandbox.Tonemapping;
namespace SWB.Visuals.Profiles;
/// <summary>
/// Keskiaikainen dungeon / RPG -valaistus.
/// Lämmin, kontrastinen, varjoja korostava.
/// </summary>
public sealed class DungeonRPGProfile : CinematicProfile
{
// Filmimäinen mutta ei futuristinen
public override TonemappingMode Tonemap => TonemappingMode.ACES;
// Bloom vain soihtuihin / tuliefekteihin
public override bool EnableBloom => true;
public override float BloomThreshold => 0.85f;
protected override void ApplyLighting()
{
var cam = Scene.Camera;
if (cam == null)
return;
// ─────────────────────────────
// KEY – "soihtu / kynttilä"
// Lämmin päävalo sivusta
// ─────────────────────────────
var keyGO = GetOrCreateLight("KeyLight");
var key = keyGO.Components.GetOrCreate<DirectionalLight>();
key.LightColor = new Color(1.0f, 0.78f, 0.55f); // lämmin tuli
key.Shadows = true;
keyGO.Transform.Rotation =
Rotation.LookAt(new Vector3(-0.6f, -0.4f, -1.0f));
// ─────────────────────────────
// FILL – heikko hajavalo kiviseinistä
// ─────────────────────────────
var fillGO = GetOrCreateLight("FillLight");
var fill = fillGO.Components.GetOrCreate<PointLight>();
fill.LightColor = new Color(0.35f, 0.38f, 0.45f); // kylmä kivi
fill.Radius = 1200f;
fill.Shadows = false;
fillGO.Transform.Position =
cam.Transform.Position +
cam.Transform.Rotation.Right * 200f +
cam.Transform.Rotation.Up * 150f;
// ─────────────────────────────
// ACCENT – takavalo / soihtu takana
// Antaa siluetin ja "luolasyvyyden"
// ─────────────────────────────
var accentGO = GetOrCreateLight("AccentLight");
var accent = accentGO.Components.GetOrCreate<SpotLight>();
accent.LightColor = new Color(1.0f, 0.65f, 0.35f); // oranssi tuli
accent.Radius = 700f;
accent.ConeInner = 18f;
accent.ConeOuter = 30f;
accent.Shadows = false;
accentGO.Transform.Position =
cam.Transform.Position -
cam.Transform.Rotation.Forward * 250f +
cam.Transform.Rotation.Up * 120f;
accentGO.Transform.Rotation = cam.Transform.Rotation;
}
}