mirror of
https://github.com/AssetRipper/AssetRipper.git
synced 2025-12-11 20:15:29 +01:00
Improve lighting data export
This commit is contained in:
parent
a59cf55442
commit
02001248e5
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user