Improve lighting data export

This commit is contained in:
ds5678 2025-02-22 15:18:02 -08:00
parent a59cf55442
commit 02001248e5
4 changed files with 218 additions and 42 deletions

View File

@ -24,6 +24,7 @@ using AssetRipper.SourceGenerated.Classes.ClassID_47;
using AssetRipper.SourceGenerated.Classes.ClassID_687078895;
using AssetRipper.SourceGenerated.Classes.ClassID_74;
using AssetRipper.SourceGenerated.Classes.ClassID_78;
using AssetRipper.SourceGenerated.Classes.ClassID_850595691;
using AssetRipper.SourceGenerated.Enums;
using AssetRipper.SourceGenerated.Extensions;
@ -189,6 +190,9 @@ namespace AssetRipper.Processing.Editor
case ILightmapSettings lightmapSettings:
lightmapSettings.ConvertToEditorFormat();
break;
case ILightingSettings lightingSettings:
lightingSettings.ConvertToEditorFormat();
break;
}
}
}

View File

@ -4,7 +4,9 @@ using AssetRipper.Assets.Collections;
using AssetRipper.Assets.Generics;
using AssetRipper.Import.Logging;
using AssetRipper.SourceGenerated;
using AssetRipper.SourceGenerated.Classes.ClassID_0;
using AssetRipper.SourceGenerated.Classes.ClassID_1032;
using AssetRipper.SourceGenerated.Classes.ClassID_104;
using AssetRipper.SourceGenerated.Classes.ClassID_108;
using AssetRipper.SourceGenerated.Classes.ClassID_1120;
using AssetRipper.SourceGenerated.Classes.ClassID_157;
@ -13,6 +15,7 @@ using AssetRipper.SourceGenerated.Classes.ClassID_25;
using AssetRipper.SourceGenerated.Classes.ClassID_258;
using AssetRipper.SourceGenerated.Classes.ClassID_28;
using AssetRipper.SourceGenerated.Classes.ClassID_33;
using AssetRipper.SourceGenerated.Classes.ClassID_850595691;
using AssetRipper.SourceGenerated.Extensions;
using AssetRipper.SourceGenerated.Subclasses.LightmapData;
using AssetRipper.SourceGenerated.Subclasses.RendererData;
@ -34,6 +37,7 @@ namespace AssetRipper.Processing
Dictionary<ILightmapSettings, SceneDefinition> lightmapSettingsDictionary = new();
Dictionary<ILightProbes, SceneDefinition?> lightProbeDictionary = new();
Dictionary<ILightingSettings, SceneDefinition?> lightingSettingsDictionary = new();
foreach (SceneDefinition scene in gameData.GameBundle.Scenes)
{
@ -44,10 +48,25 @@ namespace AssetRipper.Processing
continue;
}
IRenderSettings? renderSettings = scene.Assets.OfType<IRenderSettings>().FirstOrDefault();
if (renderSettings is null)
{
// This should never happen. All scenes need a RenderSettings asset.
continue;
}
lightmapSettingsDictionary.Add(lightmapSettings, scene);
if (lightmapSettings.LightProbesP is { } lightProbes && !lightProbeDictionary.TryAdd(lightProbes, scene))
{
lightProbeDictionary[lightProbes] = null;//This set of light probes is shared between scenes.
//This set of light probes is shared between scenes.
lightProbeDictionary[lightProbes] = null;
}
if (lightmapSettings.LightingSettingsP is { } lightingSettings && !lightingSettingsDictionary.TryAdd(lightingSettings, scene))
{
//This LightingSettings is shared between scenes.
lightingSettingsDictionary[lightingSettings] = null;
}
if (!lightmapSettings.Has_LightingDataAsset() || !HasLightingData(lightmapSettings))
@ -62,8 +81,10 @@ namespace AssetRipper.Processing
PPtrConverter converter = new PPtrConverter(lightmapSettings, lightingDataAsset);
lightingDataAsset.LightmapsMode = lightmapSettings.LightmapsMode;
lightingDataAsset.EnlightenSceneMapping.CopyValues(lightmapSettings.EnlightenSceneMapping, converter);
SetEnlightenSceneMapping(lightingDataAsset, lightmapSettings, converter);
SetBakedAmbientProbes(lightingDataAsset, renderSettings);
AddSkyboxReflection(lightingDataAsset, renderSettings);
SetLightmaps(lightingDataAsset, lightmapSettings.Lightmaps, converter);
SetScene(lightingDataAsset, scene, processedCollection);
SetLightProbes(lightingDataAsset, lightmapSettings);
@ -93,7 +114,14 @@ namespace AssetRipper.Processing
{
lightProbes = null;//Shared light probes should not have their path set.
}
SetPathsAndMainAsset(lightmapSettings, lightProbes, scene);
ILightingSettings? lightingSettings = lightmapSettings.LightingSettingsP;
if (lightingSettings is not null && lightingSettingsDictionary[lightingSettings] is null)
{
lightingSettings = null;//Shared light settings should not have their path set.
}
SetPathsAndMainAsset(lightmapSettings, lightProbes, lightingSettings, scene);
}
}
@ -171,7 +199,54 @@ namespace AssetRipper.Processing
identifier.TargetObjectReference = light;
//Information about whether a light is baked or not
lightingDataAsset.LightBakingOutputs?.AddNew().CopyValues(light.BakingOutput);
if (light.Has_BakingOutput())
{
lightingDataAsset.LightBakingOutputs?.AddNew().CopyValues(light.BakingOutput);
}
}
private static void SetEnlightenSceneMapping(ILightingDataAsset lightingDataAsset, ILightmapSettings lightmapSettings, PPtrConverter converter)
{
lightingDataAsset.EnlightenSceneMapping.CopyValues(lightmapSettings.EnlightenSceneMapping, converter);
foreach (IObject? renderer in lightingDataAsset.EnlightenSceneMapping.Renderers.Select(r => r.Renderer.TryGetAsset(lightingDataAsset.Collection)))
{
lightingDataAsset.EnlightenSceneMappingRendererIDs.AddNew().TargetObjectReference = renderer;
}
}
private static void SetBakedAmbientProbes(ILightingDataAsset lightingDataAsset, IRenderSettings renderSettings)
{
if (renderSettings.Has_AmbientProbeInGamma())
{
if (lightingDataAsset.Has_BakedAmbientProbeInGamma())
{
lightingDataAsset.BakedAmbientProbeInGamma.CopyValues(renderSettings.AmbientProbeInGamma);
}
else if (lightingDataAsset.Has_BakedAmbientProbesInGamma())
{
lightingDataAsset.BakedAmbientProbesInGamma.AddNew().CopyValues(renderSettings.AmbientProbeInGamma);
}
}
if (renderSettings.Has_AmbientProbe())
{
if (lightingDataAsset.Has_BakedAmbientProbeInLinear())
{
lightingDataAsset.BakedAmbientProbeInLinear.CopyValues(renderSettings.AmbientProbe);
}
else if (lightingDataAsset.Has_BakedAmbientProbesInLinear())
{
lightingDataAsset.BakedAmbientProbesInLinear.AddNew().CopyValues(renderSettings.AmbientProbe);
}
}
}
private static void AddSkyboxReflection(ILightingDataAsset lightingDataAsset, IRenderSettings renderSettings)
{
if (renderSettings.GeneratedSkyboxReflectionP is { } skyboxReflection)
{
lightingDataAsset.BakedReflectionProbeCubemapsP.Add(skyboxReflection);
}
}
/// <summary>
@ -188,7 +263,7 @@ namespace AssetRipper.Processing
}
}
private static void SetPathsAndMainAsset(ILightmapSettings lightmapSettings, ILightProbes? lightProbes, SceneDefinition scene)
private static void SetPathsAndMainAsset(ILightmapSettings lightmapSettings, ILightProbes? lightProbes, ILightingSettings? lightingSettings, SceneDefinition scene)
{
//Several assets should all be exported in a subfolder beside the scene.
//Example:
@ -220,6 +295,14 @@ namespace AssetRipper.Processing
lightProbes.OriginalDirectory ??= scene.Path;
}
//Move the light settings to the scene subfolder if it exists and is not shared with other scenes.
//There's no requirement to place it there, but it helps with organization.
//This is particularly useful when many LightingSettings have the same name.
if (lightingSettings is not null)
{
lightingSettings.OriginalDirectory ??= scene.Path;
}
//Move the lightmap textures to the scene subfolder.
foreach (ILightmapData lightmapData in lightmapSettings.Lightmaps)
{
@ -259,7 +342,7 @@ namespace AssetRipper.Processing
/// <param name="lightmapSettings"></param>
private static void SetLightProbes(ILightingDataAsset lightingDataAsset, ILightmapSettings lightmapSettings)
{
lightingDataAsset.LightProbesP = lightmapSettings.LightProbesP as ILightProbes;
lightingDataAsset.LightProbesP = lightmapSettings.LightProbesP;
}
/// <summary>

View File

@ -1,5 +1,5 @@
using AssetRipper.SourceGenerated.Enums;
using AssetRipper.SourceGenerated.NativeEnums.Global;
using AssetRipper.SourceGenerated.Classes.ClassID_850595691;
using AssetRipper.SourceGenerated.Enums;
using AssetRipper.SourceGenerated.Subclasses.LightmapEditorSettings;
using FilterMode = AssetRipper.SourceGenerated.Enums.FilterMode_2;
using Lightmapper = AssetRipper.SourceGenerated.Enums.Lightmapper_0;
@ -12,52 +12,134 @@ namespace AssetRipper.SourceGenerated.Extensions
{
public static void SetToDefault(this ILightmapEditorSettings settings)
{
settings.Resolution = 2.0f;
settings.BakeResolution = 40.0f;
settings.TextureWidth = 1024;
settings.TextureHeight = 1024;
settings.AO = false;
settings.AOMaxDistance = 1.0f;
settings.CompAOExponent = 1.0f;
settings.CompAOExponentDirect = 0.0f;
settings.ExtractAmbientOcclusion = false;
settings.Padding = 2;
settings.LightmapsBakeMode = (int)LightmapsMode.CombinedDirectional;
settings.TextureCompression = true;
settings.FinalGather = false;
settings.FinalGatherFiltering = true;
settings.FinalGatherRayCount = 256;
settings.ReflectionCompression = (int)ReflectionCubemapCompression.Auto;
settings.MixedBakeMode = (int)MixedLightingMode.Shadowmask;
settings.AOAmount = 0;
settings.AOContrast = 1f;
settings.AOMaxDistance = 1f;
settings.AtlasSize = 1024;
settings.BakeBackend = (int)Lightmapper.Enlighten;
settings.PVRSampling = (int)Sampling.Fixed;
settings.PVRDirectSampleCount = 32;
settings.PVRSampleCount = 500;
settings.BakeResolution = 40f;
settings.BounceBoost = 1f;
settings.BounceIntensity = 1f;
settings.Bounces = 1;
settings.CompAOExponent = 1f;
settings.CompAOExponentDirect = 0f;
settings.DirectLightInLightProbes = true;
settings.ExportTrainingData = false;
settings.ExtractAmbientOcclusion = false;
settings.FinalGather = false;
settings.FinalGatherContrastThreshold = 0.05f;
settings.FinalGatherFiltering = true;
settings.FinalGatherGradientThreshold = 0f;
settings.FinalGatherInterpolationPoints = 15;
settings.FinalGatherRayCount = 256;
settings.FinalGatherRays = 1000;
settings.LastUsedResolution = 0f;
settings.LightmapsBakeMode = (int)LightmapsMode.CombinedDirectional;
settings.LightProbeSampleCountMultiplier = 4f;
settings.LockAtlas = false;
settings.LODSurfaceMappingDistance = 1f;
settings.MixedBakeMode = (int)MixedLightingMode.Shadowmask;
settings.Padding = 2;
settings.PVRBounces = 2;
settings.PVREnvironmentSampleCount = 256;
settings.PVREnvironmentReferencePointCount = 2048;
settings.PVRFilteringMode = (int)FilterMode.Auto;
settings.PVRCulling = true;
settings.PVRDenoiserTypeAO = (int)DenoiserType.Optix;
settings.PVRDenoiserTypeDirect = (int)DenoiserType.Optix;
settings.PVRDenoiserTypeIndirect = (int)DenoiserType.Optix;
settings.PVRDenoiserTypeAO = (int)DenoiserType.Optix;
settings.PVRFilterTypeDirect = (int)FilterType.Gaussian;
settings.PVRFilterTypeIndirect = (int)FilterType.Gaussian;
settings.PVRFilterTypeAO = (int)FilterType.Gaussian;
settings.PVRDirectSampleCount = 32;
settings.PVREnvironmentMIS = 1;
settings.PVRCulling = true;
settings.PVREnvironmentSampleCount = 256;
settings.PVREnvironmentReferencePointCount = 2048;
settings.PVRFiltering = 0;
settings.PVRFilteringAtrousColorSigma = 1f;
settings.PVRFilteringAtrousNormalSigma = 1f;
settings.PVRFilteringAtrousPositionSigma = 1f;
settings.PVRFilteringAtrousPositionSigmaAO = 1f;
settings.PVRFilteringAtrousPositionSigmaDirect = 0.5f;
settings.PVRFilteringAtrousPositionSigmaIndirect = 2f;
settings.PVRFilteringGaussRadiusAO = 2;
settings.PVRFilteringGaussRadiusDirect = 1;
settings.PVRFilteringGaussRadiusIndirect = 5;
settings.PVRFilteringGaussRadiusAO = 2;
settings.PVRFilteringAtrousPositionSigmaDirect = 0.5f;
settings.PVRFilteringAtrousPositionSigmaIndirect = 2.0f;
settings.PVRFilteringAtrousPositionSigmaAO = 1.0f;
settings.PVRFilteringMode = (int)FilterMode.Auto;
settings.PVRFilterTypeAO = (int)FilterType.Gaussian;
settings.PVRFilterTypeDirect = (int)FilterType.Gaussian;
settings.PVRFilterTypeIndirect = (int)FilterType.Gaussian;
settings.PVRSampleCount = 500;
settings.PVRSampling = (int)Sampling.Fixed;
settings.Quality = 0;
settings.ReflectionCompression = (int)ReflectionCubemapCompression.Auto;
settings.Resolution = 2f;
settings.ShowResolutionOverlay = true;
settings.ExportTrainingData = false;
settings.SkyLightColor?.SetValues(.86f, .93f, 1f, 1f);
settings.SkyLightIntensity = 0f;
settings.StationaryBakeMode = 1;
settings.TextureCompression = true;
settings.TextureHeight = 1024;
settings.TextureWidth = 1024;
if (settings.Has_TrainingDataDestination())
{
settings.TrainingDataDestination = "TrainingData";
}
settings.LightProbeSampleCountMultiplier = 4.0f;
}
public static void ConvertToEditorFormat(this ILightingSettings settings)
{
settings.AO = false;
settings.AOMaxDistance = 1f;
settings.BakeBackend = (int)Lightmapper.Enlighten;
settings.BakeResolution = 40f;
settings.CompAOExponent = 1f;
settings.CompAOExponentDirect = 0f;
settings.DisableWorkerProcessBaking = false;
settings.ExportTrainingData = false;
settings.ExtractAO = false;
settings.FilterMode = (int)FilterMode.Auto;
settings.FinalGather = false;
settings.FinalGatherFiltering = true;
settings.FinalGatherRayCount = 256;
settings.ForceUpdates = false;
settings.ForceWhiteAlbedo = false;
settings.LightmapCompressionE = LightmapCompression.HighQuality;
settings.LightmapMaxSize = 4096;
settings.LightmapsBakeMode = (int)LightmapsMode.CombinedDirectional;
settings.LightmapSizeFixed = false;
settings.LightProbeSampleCountMultiplier = 4f;
settings.MixedBakeMode = (int)MixedLightingMode.Shadowmask;
settings.NumRaysToShootPerTexel = -1;
settings.Padding = 2;
settings.PVRBounces = 2;
settings.PVRCulling = true;
settings.PVRDenoiserTypeAO = (int)DenoiserType.Optix;
settings.PVRDenoiserTypeDirect = (int)DenoiserType.Optix;
settings.PVRDenoiserTypeIndirect = (int)DenoiserType.Optix;
settings.PVRDirectSampleCount = 32;
settings.PVREnvironmentImportanceSampling = true;
settings.PVREnvironmentMIS = 1;
settings.PVREnvironmentReferencePointCount = 2048;
settings.PVREnvironmentSampleCount = 256;
settings.PVRFilteringAtrousPositionSigmaAO = 1f;
settings.PVRFilteringAtrousPositionSigmaDirect = 0.5f;
settings.PVRFilteringAtrousPositionSigmaIndirect = 2f;
settings.PVRFilteringGaussRadiusAO_Int32 = 2;
settings.PVRFilteringGaussRadiusAO_Single = 2f;
settings.PVRFilteringGaussRadiusDirect_Int32 = 1;
settings.PVRFilteringGaussRadiusDirect_Single = 1f;
settings.PVRFilteringGaussRadiusIndirect_Int32 = 5;
settings.PVRFilteringGaussRadiusIndirect_Single = 5f;
settings.PVRFilteringMode = (int)FilterMode.Auto;
settings.PVRFilterTypeAO = (int)FilterType.Gaussian;
settings.PVRFilterTypeDirect = (int)FilterType.Gaussian;
settings.PVRFilterTypeIndirect = (int)FilterType.Gaussian;
settings.PVRMinBounces = 2;
settings.PVRRussianRouletteStartBounce = 2;
settings.PVRSampleCount = 500;
settings.PVRSampling = (int)Sampling.Fixed;
settings.PVRTiledBaking = 0;
settings.RealtimeResolution = 2f;
settings.RespectSceneVisibilityWhenBakingGI = false;
settings.TextureCompression = true;
settings.TrainingDataDestination = "TrainingData";
settings.UseMipmapLimits = true;
}
public static LightmapsMode GetLightmapsBakeMode(this ILightmapEditorSettings settings)

View File

@ -7,8 +7,15 @@ namespace AssetRipper.SourceGenerated.Extensions
{
public static void ConvertToEditorFormat(this ILightmapSettings settings)
{
settings.GIWorkflowMode = (int)GIWorkflowMode.OnDemand;
settings.LightmapEditorSettings.SetToDefault();
if (settings.LightingSettingsP is { } lightingSettings)
{
settings.GIWorkflowMode = lightingSettings.GIWorkflowMode;
}
else
{
settings.GIWorkflowMode = (int)GIWorkflowMode.OnDemand;
}
}
public static GIWorkflowMode GetGIWorkflowMode(this ILightmapSettings settings)