using System.IO;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace Luneraria.EditorTools
{
///
/// Rendering setup of the project (URP asset and renderer, linear colour space), idempotent.
/// Unity -batchmode -projectPath . -executeMethod Luneraria.EditorTools.LuneProjectSetup.ConfigureRendering
///
public static class LuneProjectSetup
{
public const string SettingsFolder = "Assets/Luneraria/Settings/Rendering";
public const string PipelinePath = SettingsFolder + "/Luneraria_URP.asset";
public const string RendererPath = SettingsFolder + "/Luneraria_URP_Renderer.asset";
public static void ConfigureRendering()
{
int code = 0;
try
{
Configure();
}
catch (System.Exception error)
{
Debug.LogError("LUNE_SETUP failed: " + error);
code = 1;
}
EditorApplication.Exit(code);
}
public static UniversalRenderPipelineAsset Configure()
{
Directory.CreateDirectory(SettingsFolder);
AssetDatabase.Refresh();
var asset = AssetDatabase.LoadAssetAtPath(PipelinePath);
if (asset == null)
{
var renderer = ScriptableObject.CreateInstance();
AssetDatabase.CreateAsset(renderer, RendererPath);
ResourceReloader.ReloadAllNullIn(renderer, UniversalRenderPipelineAsset.packagePath);
asset = UniversalRenderPipelineAsset.Create(renderer);
AssetDatabase.CreateAsset(asset, PipelinePath);
}
// The Godot sun reaches 190 m with four splits (scripts/luneraria/view/lune_world.gd).
asset.shadowDistance = 190f;
asset.shadowCascadeCount = 4;
asset.supportsHDR = true;
asset.msaaSampleCount = 4;
asset.useSRPBatcher = true;
EditorUtility.SetDirty(asset);
GraphicsSettings.defaultRenderPipeline = asset;
int current = QualitySettings.GetQualityLevel();
for (int level = 0; level < QualitySettings.names.Length; level++)
{
QualitySettings.SetQualityLevel(level, false);
QualitySettings.renderPipeline = asset;
}
QualitySettings.SetQualityLevel(current, false);
PlayerSettings.colorSpace = ColorSpace.Linear;
MoveInto("Assets/UniversalRenderPipelineGlobalSettings.asset", SettingsFolder + "/UniversalRenderPipelineGlobalSettings.asset");
MoveInto("Assets/DefaultVolumeProfile.asset", SettingsFolder + "/DefaultVolumeProfile.asset");
AssetDatabase.SaveAssets();
Debug.Log("LUNE_SETUP rendering: " + PipelinePath + ", colour space " + PlayerSettings.colorSpace);
return asset;
}
static void MoveInto(string from, string to)
{
if (File.Exists(from) && !File.Exists(to))
{
string error = AssetDatabase.MoveAsset(from, to);
if (!string.IsNullOrEmpty(error))
Debug.LogWarning("LUNE_SETUP move " + from + ": " + error);
}
}
}
}