22using System . IO ;
33using UnityEngine ;
44using UnityEditor ;
5+ using UnityMeshSimplifier ;
56
67namespace Plugins . AutoLODGenerator . Editor
78{
@@ -43,6 +44,40 @@ public class LODGeneratorSettings
4344 /// </summary>
4445 public float culledTransitionHeight = 0.01f ;
4546
47+ #region Simplification Options
48+
49+ /// <summary>
50+ /// Enable smart linking to prevent holes in simplified meshes.
51+ /// </summary>
52+ [ Tooltip ( "Enables smart vertex linking to prevent holes in the simplified mesh" ) ]
53+ public bool enableSmartLink = true ;
54+
55+ /// <summary>
56+ /// Maximum distance between vertices for smart linking.
57+ /// </summary>
58+ [ Tooltip ( "Maximum distance between vertices for smart linking (higher values for large meshes)" ) ]
59+ public double vertexLinkDistance = double . Epsilon ;
60+
61+ /// <summary>
62+ /// Preserve border edges during simplification.
63+ /// </summary>
64+ [ Tooltip ( "Preserve border edges (limits simplification but prevents mesh edge deformation)" ) ]
65+ public bool preserveBorders = false ;
66+
67+ /// <summary>
68+ /// Preserve UV seam edges during simplification.
69+ /// </summary>
70+ [ Tooltip ( "Preserve UV seam edges (prevents UV stretching at seams)" ) ]
71+ public bool preserveSeams = false ;
72+
73+ /// <summary>
74+ /// Preserve UV foldover edges during simplification.
75+ /// </summary>
76+ [ Tooltip ( "Preserve UV foldover edges (prevents UV distortion on overlapping UVs)" ) ]
77+ public bool preserveFoldovers = false ;
78+
79+ #endregion
80+
4681 public const int MinLODLevels = 2 ;
4782 public const int MaxLODLevels = 6 ;
4883
@@ -83,6 +118,11 @@ public void ApplyPreset(LODPreset preset)
83118 screenTransitionHeights = new [ ] { 0.5f , 0.2f , 0.05f , 0.02f , 0.01f , 0.005f } ;
84119 includeCulledLevel = true ;
85120 culledTransitionHeight = 0.01f ;
121+ // Performance: minimal preservation for maximum simplification
122+ enableSmartLink = true ;
123+ preserveBorders = false ;
124+ preserveSeams = false ;
125+ preserveFoldovers = false ;
86126 break ;
87127
88128 case LODPreset . Balanced :
@@ -92,6 +132,11 @@ public void ApplyPreset(LODPreset preset)
92132 screenTransitionHeights = new [ ] { 0.5f , 0.3f , 0.15f , 0.05f , 0.02f , 0.01f } ;
93133 includeCulledLevel = true ;
94134 culledTransitionHeight = 0.01f ;
135+ // Balanced: smart linking enabled, moderate preservation
136+ enableSmartLink = true ;
137+ preserveBorders = false ;
138+ preserveSeams = false ;
139+ preserveFoldovers = false ;
95140 break ;
96141
97142 case LODPreset . Quality :
@@ -101,6 +146,11 @@ public void ApplyPreset(LODPreset preset)
101146 screenTransitionHeights = new [ ] { 0.6f , 0.4f , 0.25f , 0.12f , 0.05f , 0.02f } ;
102147 includeCulledLevel = true ;
103148 culledTransitionHeight = 0.005f ;
149+ // Quality: preserve more for better visual fidelity
150+ enableSmartLink = true ;
151+ preserveBorders = true ;
152+ preserveSeams = true ;
153+ preserveFoldovers = false ;
104154 break ;
105155
106156 case LODPreset . MobileLowEnd :
@@ -110,6 +160,11 @@ public void ApplyPreset(LODPreset preset)
110160 screenTransitionHeights = new [ ] { 0.4f , 0.1f , 0.05f , 0.02f , 0.01f , 0.005f } ;
111161 includeCulledLevel = true ;
112162 culledTransitionHeight = 0.02f ;
163+ // Mobile Low: aggressive simplification
164+ enableSmartLink = true ;
165+ preserveBorders = false ;
166+ preserveSeams = false ;
167+ preserveFoldovers = false ;
113168 break ;
114169
115170 case LODPreset . MobileHighEnd :
@@ -119,6 +174,11 @@ public void ApplyPreset(LODPreset preset)
119174 screenTransitionHeights = new [ ] { 0.5f , 0.25f , 0.08f , 0.03f , 0.01f , 0.005f } ;
120175 includeCulledLevel = true ;
121176 culledTransitionHeight = 0.015f ;
177+ // Mobile High: balanced for modern mobile
178+ enableSmartLink = true ;
179+ preserveBorders = false ;
180+ preserveSeams = false ;
181+ preserveFoldovers = false ;
122182 break ;
123183
124184 case LODPreset . VR :
@@ -128,6 +188,11 @@ public void ApplyPreset(LODPreset preset)
128188 screenTransitionHeights = new [ ] { 0.7f , 0.5f , 0.3f , 0.15f , 0.08f , 0.03f } ;
129189 includeCulledLevel = false ;
130190 culledTransitionHeight = 0.01f ;
191+ // VR: preserve borders to avoid artifacts at edges
192+ enableSmartLink = true ;
193+ preserveBorders = true ;
194+ preserveSeams = true ;
195+ preserveFoldovers = false ;
131196 break ;
132197
133198 case LODPreset . Custom :
@@ -176,6 +241,31 @@ public void Validate()
176241 }
177242
178243 culledTransitionHeight = Mathf . Clamp01 ( culledTransitionHeight ) ;
244+
245+ // Ensure vertex link distance is non-negative
246+ if ( vertexLinkDistance < 0 )
247+ vertexLinkDistance = 0 ;
248+ }
249+
250+ /// <summary>
251+ /// Creates SimplificationOptions for use with MeshSimplifier.
252+ /// </summary>
253+ /// <returns>Configured SimplificationOptions.</returns>
254+ public SimplificationOptions CreateSimplificationOptions ( )
255+ {
256+ return new SimplificationOptions
257+ {
258+ EnableSmartLink = enableSmartLink ,
259+ VertexLinkDistance = vertexLinkDistance ,
260+ PreserveBorderEdges = preserveBorders ,
261+ PreserveUVSeamEdges = preserveSeams ,
262+ PreserveUVFoldoverEdges = preserveFoldovers ,
263+ MaxIterationCount = 100 ,
264+ Agressiveness = 7.0 ,
265+ PreserveSurfaceCurvature = false ,
266+ ManualUVComponentCount = false ,
267+ UVComponentCount = 2
268+ } ;
179269 }
180270
181271 #region Preset Save/Load
@@ -496,6 +586,10 @@ public enum MeshRendererType
496586 {
497587 None ,
498588 MeshRenderer ,
499- SkinnedMeshRenderer
589+ SkinnedMeshRenderer ,
590+ /// <summary>
591+ /// Root has no direct renderer, but has descendant GameObjects with valid renderers.
592+ /// </summary>
593+ Composite
500594 }
501595}
0 commit comments