diff --git a/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs b/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs index 48dcd07a4..a7729378f 100644 --- a/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs +++ b/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs @@ -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; } } } diff --git a/Source/AssetRipper.Processing/LightingDataProcessor.cs b/Source/AssetRipper.Processing/LightingDataProcessor.cs index 0ff8cb727..16e9fc2aa 100644 --- a/Source/AssetRipper.Processing/LightingDataProcessor.cs +++ b/Source/AssetRipper.Processing/LightingDataProcessor.cs @@ -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 lightmapSettingsDictionary = new(); Dictionary lightProbeDictionary = new(); + Dictionary lightingSettingsDictionary = new(); foreach (SceneDefinition scene in gameData.GameBundle.Scenes) { @@ -44,10 +48,25 @@ namespace AssetRipper.Processing continue; } + IRenderSettings? renderSettings = scene.Assets.OfType().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); + } } /// @@ -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 /// private static void SetLightProbes(ILightingDataAsset lightingDataAsset, ILightmapSettings lightmapSettings) { - lightingDataAsset.LightProbesP = lightmapSettings.LightProbesP as ILightProbes; + lightingDataAsset.LightProbesP = lightmapSettings.LightProbesP; } /// diff --git a/Source/AssetRipper.SourceGenerated.Extensions/LightmapEditorSettingsExtensions.cs b/Source/AssetRipper.SourceGenerated.Extensions/LightmapEditorSettingsExtensions.cs index 96e6d1dc4..d6c8e8f45 100644 --- a/Source/AssetRipper.SourceGenerated.Extensions/LightmapEditorSettingsExtensions.cs +++ b/Source/AssetRipper.SourceGenerated.Extensions/LightmapEditorSettingsExtensions.cs @@ -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) diff --git a/Source/AssetRipper.SourceGenerated.Extensions/LightmapSettingsExtensions.cs b/Source/AssetRipper.SourceGenerated.Extensions/LightmapSettingsExtensions.cs index c58be3249..fb773d02f 100644 --- a/Source/AssetRipper.SourceGenerated.Extensions/LightmapSettingsExtensions.cs +++ b/Source/AssetRipper.SourceGenerated.Extensions/LightmapSettingsExtensions.cs @@ -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)