Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions Editor/Uv2AssetPostprocessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ namespace SashaRX.UnityMeshLab
{
public class Uv2AssetPostprocessor : AssetPostprocessor
{
const int MinReplayUvChannel = 1;
const int MaxReplayUvChannel = 7;

// Run well after Bakery and other postprocessors (default order = 0).
public override int GetPostprocessOrder() => 10000;

Expand Down Expand Up @@ -544,15 +547,16 @@ static bool ApplyEntryToMesh(Uv2DataAsset data, Mesh mesh, out ApplyStats stats)

bool didRemap;
int nearestFallback, nearestAnyReuse, unmatched;
int primaryTargetUvChannel = entry.targetUvChannel >= 0 ? entry.targetUvChannel : 1;
int primaryTargetUvChannel = ResolvePrimaryTargetUvChannel(entry.targetUvChannel, mesh.name);
string primaryLabel = $"channel {primaryTargetUvChannel}";
var uv2 = RemapUvSetIfNeeded(entry, entry.uv2, mesh, primaryLabel, out didRemap, out nearestFallback, out nearestAnyReuse, out unmatched);
stats.remapped = didRemap;
stats.nearestFallbackCount = nearestFallback;
stats.nearestAnyReuseCount = nearestAnyReuse;
stats.unmatchedVerts = unmatched;
mesh.SetUVs(primaryTargetUvChannel, uv2);
if (entry.auxiliaryUv != null && entry.auxiliaryTargetUvChannel >= 0)
if (entry.auxiliaryUv != null &&
IsValidReplayUvChannel(entry.auxiliaryTargetUvChannel, mesh.name, "auxiliary"))
{
bool auxDidRemap;
int auxNearestFallback, auxNearestAnyReuse, auxUnmatched;
Expand All @@ -575,7 +579,7 @@ static void ApplyStoredUvChannelsDirect(Mesh mesh, MeshUv2Entry entry)
{
if (mesh == null || entry?.uv2 == null) return;

int primaryTargetUvChannel = entry.targetUvChannel >= 0 ? entry.targetUvChannel : 1;
int primaryTargetUvChannel = ResolvePrimaryTargetUvChannel(entry.targetUvChannel, mesh.name);
if (entry.uv2.Length == mesh.vertexCount)
mesh.SetUVs(primaryTargetUvChannel, entry.uv2);

Expand All @@ -586,10 +590,30 @@ static void ApplyAuxiliaryUvChannel(Mesh mesh, MeshUv2Entry entry)
{
if (mesh == null || entry?.auxiliaryUv == null) return;
if (entry.auxiliaryTargetUvChannel < 0) return;
if (!IsValidReplayUvChannel(entry.auxiliaryTargetUvChannel, mesh.name, "auxiliary")) return;
if (entry.auxiliaryUv.Length != mesh.vertexCount) return;
mesh.SetUVs(entry.auxiliaryTargetUvChannel, entry.auxiliaryUv);
}

static int ResolvePrimaryTargetUvChannel(int channel, string meshName)
{
if (channel >= MinReplayUvChannel && channel <= MaxReplayUvChannel)
return channel;

UvtLog.Warn($"[UV2 Postprocess] '{meshName}': sidecar primary UV channel {channel} is invalid; " +
"using channel 1 (UV2) instead.");
return MinReplayUvChannel;
}

static bool IsValidReplayUvChannel(int channel, string meshName, string label)
{
if (channel >= MinReplayUvChannel && channel <= MaxReplayUvChannel)
return true;

UvtLog.Warn($"[UV2 Postprocess] '{meshName}': sidecar {label} UV channel {channel} is invalid; skipped.");
return false;
}

static bool ResolveSymmetrySplitStep(MeshUv2Entry entry)
{
if (entry == null) return false;
Expand Down
Loading