Skip to content

Commit 72b1b40

Browse files
manaporkunCopilot
andcommitted
fix: publish release in branch-triggered run
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent b252591 commit 72b1b40

4 files changed

Lines changed: 224 additions & 10 deletions

File tree

.github/workflows/release.yml

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,45 @@ jobs:
6767
exit 1
6868
}
6969
70-
release:
71-
name: Create Release
70+
release-default-branch:
71+
name: Create Release (Default Branch)
72+
if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
73+
needs: tag-default-branch
74+
runs-on: ubuntu-latest
75+
steps:
76+
- name: Checkout
77+
uses: actions/checkout@v4
78+
79+
- name: Read version from package.json
80+
run: |
81+
PKG_VERSION=$(jq -r '.version' package.json)
82+
echo "VERSION=$PKG_VERSION" >> "$GITHUB_ENV"
83+
84+
- name: Extract changelog for this version
85+
run: |
86+
VERSION="$VERSION"
87+
CHANGELOG=$(awk -v ver="$VERSION" '
88+
$0 ~ "^## \\[" ver "\\]" { found=1; next }
89+
found && /^## \[/ { exit }
90+
found { print }
91+
' CHANGELOG.md)
92+
93+
if [ -z "$CHANGELOG" ]; then
94+
echo "::error::No changelog section found for version $VERSION."
95+
exit 1
96+
fi
97+
98+
echo "$CHANGELOG" > release_notes.md
99+
100+
- name: Create GitHub Release
101+
uses: softprops/action-gh-release@v2
102+
with:
103+
tag_name: "v${{ env.VERSION }}"
104+
name: "v${{ env.VERSION }}"
105+
body_path: release_notes.md
106+
107+
release-tag-push:
108+
name: Create Release (Tag Push)
72109
if: startsWith(github.ref, 'refs/tags/v')
73110
runs-on: ubuntu-latest
74111
steps:

Editor/AutoLODWindow.cs

Lines changed: 73 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,8 @@ private void DrawObjectSelection()
330330
else
331331
{
332332
var stats = LODGeneratorCore.GetMeshStatistics(_selectedObjects[0]);
333-
var rendererTypeStr = stats.type == MeshRendererType.SkinnedMeshRenderer
334-
? " (Skinned)"
333+
var rendererTypeStr = stats.type == MeshRendererType.SkinnedMeshRenderer ? " (Skinned)"
334+
: stats.type == MeshRendererType.Composite ? " (Composite)"
335335
: " (Static)";
336336
EditorGUILayout.LabelField($"Mesh{rendererTypeStr}: {stats.vertices:N0} vertices, {stats.triangles:N0} triangles");
337337
}
@@ -415,7 +415,6 @@ private void DrawLODSettings()
415415

416416
private void DrawAdvancedSettings()
417417
{
418-
419418
EditorGUILayout.LabelField("Quality Factors", EditorStyles.boldLabel);
420419
for (var i = 1; i < _settings.lodLevelCount; i++)
421420
{
@@ -452,6 +451,59 @@ private void DrawAdvancedSettings()
452451
_selectedPreset = LODPreset.Custom;
453452
}
454453
}
454+
455+
EditorGUILayout.Space(10);
456+
DrawSimplificationOptions();
457+
}
458+
459+
private void DrawSimplificationOptions()
460+
{
461+
EditorGUILayout.LabelField("Mesh Simplification Options", EditorStyles.boldLabel);
462+
463+
EditorGUI.BeginChangeCheck();
464+
_settings.enableSmartLink = EditorGUILayout.Toggle(
465+
new GUIContent("Enable Smart Link", "Prevents holes in simplified meshes by linking close vertices"),
466+
_settings.enableSmartLink);
467+
if (EditorGUI.EndChangeCheck()) _selectedPreset = LODPreset.Custom;
468+
469+
if (_settings.enableSmartLink)
470+
{
471+
EditorGUI.indentLevel++;
472+
EditorGUI.BeginChangeCheck();
473+
var vertexLinkDistanceFloat = (float)_settings.vertexLinkDistance;
474+
vertexLinkDistanceFloat = EditorGUILayout.Slider(
475+
new GUIContent("Vertex Link Distance", "Max distance for vertex linking (increase for large meshes)"),
476+
vertexLinkDistanceFloat, 0f, 0.001f);
477+
_settings.vertexLinkDistance = vertexLinkDistanceFloat;
478+
if (EditorGUI.EndChangeCheck()) _selectedPreset = LODPreset.Custom;
479+
EditorGUI.indentLevel--;
480+
}
481+
482+
EditorGUILayout.Space(5);
483+
484+
EditorGUI.BeginChangeCheck();
485+
_settings.preserveBorders = EditorGUILayout.Toggle(
486+
new GUIContent("Preserve Borders", "Preserves mesh edge boundaries (good for architectural meshes)"),
487+
_settings.preserveBorders);
488+
if (EditorGUI.EndChangeCheck()) _selectedPreset = LODPreset.Custom;
489+
490+
EditorGUI.BeginChangeCheck();
491+
_settings.preserveSeams = EditorGUILayout.Toggle(
492+
new GUIContent("Preserve UV Seams", "Prevents UV stretching at texture seams"),
493+
_settings.preserveSeams);
494+
if (EditorGUI.EndChangeCheck()) _selectedPreset = LODPreset.Custom;
495+
496+
EditorGUI.BeginChangeCheck();
497+
_settings.preserveFoldovers = EditorGUILayout.Toggle(
498+
new GUIContent("Preserve UV Foldovers", "Prevents distortion on overlapping UVs"),
499+
_settings.preserveFoldovers);
500+
if (EditorGUI.EndChangeCheck()) _selectedPreset = LODPreset.Custom;
501+
502+
EditorGUILayout.Space(5);
503+
EditorGUILayout.HelpBox(
504+
"Tip: Enable 'Preserve Borders' and 'Preserve UV Seams' for best visual quality. " +
505+
"Disable them for maximum polygon reduction.",
506+
MessageType.Info);
455507
}
456508

457509
private void DrawSaveOptions(ref bool showSaveOptions)
@@ -655,8 +707,8 @@ private void DrawSimplifyTab()
655707
else
656708
{
657709
var stats = LODGeneratorCore.GetMeshStatistics(_singleObject);
658-
var rendererTypeStr = stats.type == MeshRendererType.SkinnedMeshRenderer
659-
? " (Skinned)"
710+
var rendererTypeStr = stats.type == MeshRendererType.SkinnedMeshRenderer ? " (Skinned)"
711+
: stats.type == MeshRendererType.Composite ? " (Composite)"
660712
: " (Static)";
661713
EditorGUILayout.LabelField($"Original{rendererTypeStr}: {stats.vertices:N0} vertices, {stats.triangles:N0} triangles");
662714
}
@@ -695,6 +747,17 @@ private void DrawSimplifyTab()
695747

696748
EditorGUILayout.Space(10);
697749

750+
// Simplification options
751+
_showAdvancedSettings = EditorGUILayout.Foldout(_showAdvancedSettings, "Simplification Options", true);
752+
if (_showAdvancedSettings)
753+
{
754+
EditorGUI.indentLevel++;
755+
DrawSimplificationOptions();
756+
EditorGUI.indentLevel--;
757+
}
758+
759+
EditorGUILayout.Space(10);
760+
698761
// Save options
699762
DrawSaveOptions(ref _showSaveOptionsSimplify);
700763

@@ -710,7 +773,8 @@ private void DrawSimplifyTab()
710773
_simplifyQuality,
711774
"_Simplified",
712775
_saveMeshesToAssets,
713-
_meshSavePath);
776+
_meshSavePath,
777+
_settings);
714778
_lastResult = result;
715779

716780
if (result.Success)
@@ -801,7 +865,9 @@ private void DrawBatchTab()
801865

802866
// Show mesh type
803867
var type = LODGeneratorCore.GetMeshRendererType(_selectedObjects[i]);
804-
var typeLabel = type == MeshRendererType.SkinnedMeshRenderer ? "S" : "M";
868+
var typeLabel = type == MeshRendererType.SkinnedMeshRenderer ? "S"
869+
: type == MeshRendererType.Composite ? "C"
870+
: "M";
805871
GUILayout.Label(typeLabel, GUILayout.Width(20));
806872

807873
if (GUILayout.Button("X", GUILayout.Width(25)))

Editor/LODGeneratorSettings.cs

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using UnityEngine;
44
using UnityEditor;
5+
using UnityMeshSimplifier;
56

67
namespace 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
}

README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,23 @@ The quality factor determines how much the mesh is simplified:
155155
| 0.25 | ~75% | LOD3 - Far distance |
156156
| 0.1 | ~90% | LOD4 - Very far distance |
157157
158+
### Mesh Simplification Options
159+
160+
Advanced options to control the mesh simplification algorithm:
161+
162+
| Option | Description | Recommended Use |
163+
|--------|-------------|-----------------|
164+
| **Enable Smart Link** | Links close vertices to prevent holes in simplified meshes | Always enabled (default) |
165+
| **Vertex Link Distance** | Max distance for vertex linking | Increase for very large meshes |
166+
| **Preserve Borders** | Preserves mesh edge boundaries | Architectural meshes, terrain |
167+
| **Preserve UV Seams** | Prevents UV stretching at texture seams | Characters with seam-based UVs |
168+
| **Preserve UV Foldovers** | Prevents distortion on overlapping UVs | Complex UV layouts |
169+
170+
**Preset Defaults:**
171+
- **Performance**: Minimal preservation for maximum reduction
172+
- **Quality/VR**: Borders and seams preserved for best visuals
173+
- **Balanced**: Smart linking only
174+
158175
### Custom Presets
159176
160177
You can save your own custom presets:

0 commit comments

Comments
 (0)