diff --git a/Source/AssetRipper.Processing/Editor/EditorFormatConverter.cs b/Source/AssetRipper.Processing/Editor/EditorFormatConverter.cs index 718ec0f15..33ae49ed3 100644 --- a/Source/AssetRipper.Processing/Editor/EditorFormatConverter.cs +++ b/Source/AssetRipper.Processing/Editor/EditorFormatConverter.cs @@ -1,25 +1,9 @@ -using AssetRipper.Assets; -using AssetRipper.Numerics; -using AssetRipper.SourceGenerated.Classes.ClassID_25; -using AssetRipper.SourceGenerated.Classes.ClassID_4; -using AssetRipper.SourceGenerated.Enums; +using AssetRipper.SourceGenerated.Classes.ClassID_25; +using AssetRipper.SourceGenerated.Enums; using AssetRipper.SourceGenerated.Extensions; -using System.Numerics; namespace AssetRipper.Processing.Editor; -/// -/// -/// -/// -/// Rules for the methods in this class: -/// -/// All methods must be static. -/// All public methods must return void and be named Convert. -/// Each public method must only take one parameter, and that parameter's type must inherit from . -/// They must not resolve any PPtrs. -/// -/// internal static class EditorFormatConverter { public static void Convert(IRenderer renderer) @@ -35,22 +19,19 @@ internal static class EditorFormatConverter renderer.AutoUVMaxDistance_C25 = 0.5f; renderer.AutoUVMaxAngle_C25 = 89.0f; renderer.LightmapParameters_C25P = null; - } - - public static void Convert(ITransform transform) - { - if (transform.Has_RootOrder_C4()) + if (renderer.Has_StaticBatchInfo_C25()) { - transform.RootOrder_C4 = transform.CalculateRootOrder(); + if (!renderer.StaticBatchInfo_C25.IsDefault()) + { + renderer.MarkGameObjectAsStatic(); + } } - if (transform.Has_LocalEulerAnglesHint_C4()) + else if (renderer.Has_SubsetIndices_C25()) { - Vector3 eulerHints = new Quaternion( - transform.LocalRotation_C4.X, - transform.LocalRotation_C4.Y, - transform.LocalRotation_C4.Z, - transform.LocalRotation_C4.W).ToEulerAngle(true); - transform.LocalEulerAnglesHint_C4.SetValues(eulerHints.X, eulerHints.Y, eulerHints.Z); + if (renderer.SubsetIndices_C25.Count != 0) + { + renderer.MarkGameObjectAsStatic(); + } } } } diff --git a/Source/AssetRipper.Processing/Editor/EditorFormatConverterAsync.cs b/Source/AssetRipper.Processing/Editor/EditorFormatConverterAsync.cs new file mode 100644 index 000000000..8cbe70dab --- /dev/null +++ b/Source/AssetRipper.Processing/Editor/EditorFormatConverterAsync.cs @@ -0,0 +1,39 @@ +using AssetRipper.Assets; +using AssetRipper.Numerics; +using AssetRipper.SourceGenerated.Classes.ClassID_4; +using AssetRipper.SourceGenerated.Extensions; +using System.Numerics; + +namespace AssetRipper.Processing.Editor; + +/// +/// +/// +/// +/// Rules for the methods in this class: +/// +/// All methods must be static. +/// All public methods must return void and be named Convert. +/// Each public method must only take one parameter, and that parameter's type must inherit from . +/// They must not resolve any PPtrs. +/// +/// +internal static class EditorFormatConverterAsync +{ + public static void Convert(ITransform transform) + { + if (transform.Has_RootOrder_C4()) + { + transform.RootOrder_C4 = transform.CalculateRootOrder(); + } + if (transform.Has_LocalEulerAnglesHint_C4()) + { + Vector3 eulerHints = new Quaternion( + transform.LocalRotation_C4.X, + transform.LocalRotation_C4.Y, + transform.LocalRotation_C4.Z, + transform.LocalRotation_C4.W).ToEulerAngle(true); + transform.LocalEulerAnglesHint_C4.SetValues(eulerHints.X, eulerHints.Y, eulerHints.Z); + } + } +} diff --git a/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs b/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs index 74b81603a..01c9d2204 100644 --- a/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs +++ b/Source/AssetRipper.Processing/Editor/EditorFormatProcessor.cs @@ -100,6 +100,9 @@ namespace AssetRipper.Processing.Editor case IGameObject gameObject: gameObject.ConvertToEditorFormat(tagManager); break; + case IRenderer renderer: + EditorFormatConverter.Convert(renderer); + break; case ISpriteAtlas spriteAtlas: spriteAtlas.ConvertToEditorFormat(); break; @@ -124,10 +127,7 @@ namespace AssetRipper.Processing.Editor { //ordered by approximate frequency case ITransform transform: - EditorFormatConverter.Convert(transform); - break; - case IRenderer renderer: - EditorFormatConverter.Convert(renderer); + EditorFormatConverterAsync.Convert(transform); break; case IMesh mesh: mesh.SetMeshOptimizationFlags(MeshOptimizationFlags.Everything); diff --git a/Source/AssetRipper.Processing/StaticMeshes/StaticMeshProcessor.cs b/Source/AssetRipper.Processing/StaticMeshes/StaticMeshProcessor.cs index 3d3a8fa5e..d888582c8 100644 --- a/Source/AssetRipper.Processing/StaticMeshes/StaticMeshProcessor.cs +++ b/Source/AssetRipper.Processing/StaticMeshes/StaticMeshProcessor.cs @@ -317,7 +317,7 @@ namespace AssetRipper.Processing.StaticMeshes { meshFilter.Mesh_C33P = mesh; renderer.ClearStaticBatchInfo(); - renderer.SetStaticEditorFlagsOnGameObject(); + renderer.MarkGameObjectAsStatic(); } private static IMesh MakeMeshFromData(string cleanName, MeshData instanceMeshData, ProcessedAssetCollection processedCollection) diff --git a/Source/AssetRipper.Processing/StaticMeshes/StaticMeshSeparationExtensions.cs b/Source/AssetRipper.Processing/StaticMeshes/StaticMeshSeparationExtensions.cs index 3c4ff819b..c081210a6 100644 --- a/Source/AssetRipper.Processing/StaticMeshes/StaticMeshSeparationExtensions.cs +++ b/Source/AssetRipper.Processing/StaticMeshes/StaticMeshSeparationExtensions.cs @@ -3,6 +3,7 @@ using AssetRipper.SourceGenerated.Classes.ClassID_1; using AssetRipper.SourceGenerated.Classes.ClassID_137; using AssetRipper.SourceGenerated.Classes.ClassID_23; using AssetRipper.SourceGenerated.Classes.ClassID_25; +using AssetRipper.SourceGenerated.Extensions; using System.Collections; namespace AssetRipper.Processing.StaticMeshes @@ -11,13 +12,13 @@ namespace AssetRipper.Processing.StaticMeshes { public static bool IsStaticMeshRenderer(this IUnityObjectBase asset, [NotNullWhen(true)] out IRenderer? renderer) { - renderer = (IRenderer?)(asset as IMeshRenderer) ?? (asset as ISkinnedMeshRenderer); + renderer = asset as IRenderer; return renderer is not null && !renderer.ReferencesDynamicMesh(); } private static bool ReferencesDynamicMesh(this IRenderer renderer) { - return renderer.Has_StaticBatchInfo_C25() && renderer.StaticBatchInfo_C25.SubMeshCount == 0 + return renderer.Has_StaticBatchInfo_C25() && renderer.StaticBatchInfo_C25.IsDefault() || renderer.Has_SubsetIndices_C25() && renderer.SubsetIndices_C25.Count == 0; } @@ -28,26 +29,11 @@ namespace AssetRipper.Processing.StaticMeshes : renderer.SubsetIndices_C25; } - public static void SetStaticEditorFlagsOnGameObject(this IRenderer renderer) - { - //https://github.com/AssetRipper/AssetRipper/issues/702 - IGameObject? gameObject = renderer.GameObject_C25P; - if (gameObject is not null) - { - //When enabling Everything, Unity sets all bits even though it only uses the first 7 bits. - //In the yaml, this appropriately uint.MaxValue - //If ContributeGI is disabled, it does not set the reserved bits and displays 126 in the yaml. - gameObject.StaticEditorFlags_C1 = uint.MaxValue; - } - //Should this be done even if the static meshes aren't separated? - } - public static void ClearStaticBatchInfo(this IRenderer renderer) { if (renderer.Has_StaticBatchInfo_C25()) { - renderer.StaticBatchInfo_C25.FirstSubMesh = 0; - renderer.StaticBatchInfo_C25.SubMeshCount = 0; + renderer.StaticBatchInfo_C25.Reset(); } else if (renderer.Has_SubsetIndices_C25()) { diff --git a/Source/AssetRipper.SourceGenerated.Extensions/RendererExtensions.cs b/Source/AssetRipper.SourceGenerated.Extensions/RendererExtensions.cs index e196e2e71..195e439cf 100644 --- a/Source/AssetRipper.SourceGenerated.Extensions/RendererExtensions.cs +++ b/Source/AssetRipper.SourceGenerated.Extensions/RendererExtensions.cs @@ -1,4 +1,5 @@ -using AssetRipper.SourceGenerated.Classes.ClassID_21; +using AssetRipper.SourceGenerated.Classes.ClassID_1; +using AssetRipper.SourceGenerated.Classes.ClassID_21; using AssetRipper.SourceGenerated.Classes.ClassID_25; using AssetRipper.SourceGenerated.Enums; using System.Diagnostics; @@ -20,6 +21,23 @@ namespace AssetRipper.SourceGenerated.Extensions return null; } + /// + /// Set on to indicate that the object is static. + /// + /// The renderer attached to a static gameobject. + public static void MarkGameObjectAsStatic(this IRenderer renderer) + { + //https://github.com/AssetRipper/AssetRipper/issues/702 + IGameObject? gameObject = renderer.GameObject_C25P; + if (gameObject is not null) + { + //When enabling Everything, Unity sets all bits even though it only uses the first 7 bits. + //In the yaml, this appropriately uint.MaxValue + //If ContributeGI is disabled, it does not set the reserved bits and displays 126 in the yaml. + gameObject.StaticEditorFlags_C1 = uint.MaxValue; + } + } + public static ShadowCastingMode GetShadowCastingMode(this IRenderer renderer) { return renderer.Has_CastShadows_C25_Byte() diff --git a/Source/AssetRipper.SourceGenerated.Extensions/StaticBatchInfoExtensions.cs b/Source/AssetRipper.SourceGenerated.Extensions/StaticBatchInfoExtensions.cs index aa05cf45d..ac02dabb1 100644 --- a/Source/AssetRipper.SourceGenerated.Extensions/StaticBatchInfoExtensions.cs +++ b/Source/AssetRipper.SourceGenerated.Extensions/StaticBatchInfoExtensions.cs @@ -24,5 +24,10 @@ namespace AssetRipper.SourceGenerated.Extensions } } } + + public static bool IsDefault(this IStaticBatchInfo staticBatchInfo) + { + return staticBatchInfo.FirstSubMesh == 0 && staticBatchInfo.SubMeshCount == 0; + } } }