reworked mesh decimation yes

This commit is contained in:
2026-01-19 09:50:54 +09:00
parent b57d54d69c
commit 54d6a0a1a4
74 changed files with 15788 additions and 8308 deletions

View File

@@ -0,0 +1,156 @@
namespace LightlessSync.LightlessConfiguration.Configurations;
public static class ModelDecimationDefaults
{
public const bool EnableAutoDecimation = false;
public const int TriangleThreshold = 15_000;
public const double TargetRatio = 0.8;
public const bool NormalizeTangents = true;
public const bool AvoidBodyIntersection = true;
/// <summary>Default triangle threshold for batch decimation (0 = no threshold).</summary>
public const int BatchTriangleThreshold = 0;
/// <summary>Default target triangle ratio for batch decimation.</summary>
public const double BatchTargetRatio = 0.8;
/// <summary>Default tangent normalization toggle for batch decimation.</summary>
public const bool BatchNormalizeTangents = true;
/// <summary>Default body collision guard toggle for batch decimation.</summary>
public const bool BatchAvoidBodyIntersection = true;
/// <summary>Default display for the batch decimation warning overlay.</summary>
public const bool ShowBatchDecimationWarning = true;
public const bool KeepOriginalModelFiles = true;
public const bool SkipPreferredPairs = true;
public const bool AllowBody = false;
public const bool AllowFaceHead = false;
public const bool AllowTail = false;
public const bool AllowClothing = true;
public const bool AllowAccessories = true;
}
public sealed class ModelDecimationAdvancedSettings
{
/// <summary>Minimum triangles per connected component before skipping decimation.</summary>
public const int DefaultMinComponentTriangles = 6;
/// <summary>Average-edge multiplier used to cap collapses.</summary>
public const float DefaultMaxCollapseEdgeLengthFactor = 1.25f;
/// <summary>Maximum normal deviation (degrees) allowed for a collapse.</summary>
public const float DefaultNormalSimilarityThresholdDegrees = 60f;
/// <summary>Minimum bone-weight overlap required to allow a collapse.</summary>
public const float DefaultBoneWeightSimilarityThreshold = 0.85f;
/// <summary>UV similarity threshold to protect seams.</summary>
public const float DefaultUvSimilarityThreshold = 0.02f;
/// <summary>UV seam cosine threshold for blocking seam collapses.</summary>
public const float DefaultUvSeamAngleCos = 0.99f;
/// <summary>Whether to block UV seam vertices from collapsing.</summary>
public const bool DefaultBlockUvSeamVertices = true;
/// <summary>Whether to allow collapses on boundary edges.</summary>
public const bool DefaultAllowBoundaryCollapses = false;
/// <summary>Body collision distance factor for the primary pass.</summary>
public const float DefaultBodyCollisionDistanceFactor = 0.75f;
/// <summary>Body collision distance factor for the relaxed fallback pass.</summary>
public const float DefaultBodyCollisionNoOpDistanceFactor = 0.25f;
/// <summary>Relax multiplier applied when the mesh is close to the body.</summary>
public const float DefaultBodyCollisionAdaptiveRelaxFactor = 1.0f;
/// <summary>Ratio of near-body vertices required to trigger relaxation.</summary>
public const float DefaultBodyCollisionAdaptiveNearRatio = 0.4f;
/// <summary>UV threshold for relaxed body-collision mode.</summary>
public const float DefaultBodyCollisionAdaptiveUvThreshold = 0.08f;
/// <summary>UV seam cosine threshold for relaxed body-collision mode.</summary>
public const float DefaultBodyCollisionNoOpUvSeamAngleCos = 0.98f;
/// <summary>Expansion factor for protected vertices near the body.</summary>
public const float DefaultBodyCollisionProtectionFactor = 1.5f;
/// <summary>Minimum ratio used when decimating the body proxy.</summary>
public const float DefaultBodyProxyTargetRatioMin = 0.85f;
/// <summary>Inflation applied to body collision distances.</summary>
public const float DefaultBodyCollisionProxyInflate = 0.0005f;
/// <summary>Body collision penetration factor used during collapse checks.</summary>
public const float DefaultBodyCollisionPenetrationFactor = 0.75f;
/// <summary>Minimum body collision distance threshold.</summary>
public const float DefaultMinBodyCollisionDistance = 0.0001f;
/// <summary>Minimum cell size for body collision spatial hashing.</summary>
public const float DefaultMinBodyCollisionCellSize = 0.0001f;
/// <summary>Minimum triangles per connected component before skipping decimation.</summary>
public int MinComponentTriangles { get; set; } = DefaultMinComponentTriangles;
/// <summary>Average-edge multiplier used to cap collapses.</summary>
public float MaxCollapseEdgeLengthFactor { get; set; } = DefaultMaxCollapseEdgeLengthFactor;
/// <summary>Maximum normal deviation (degrees) allowed for a collapse.</summary>
public float NormalSimilarityThresholdDegrees { get; set; } = DefaultNormalSimilarityThresholdDegrees;
/// <summary>Minimum bone-weight overlap required to allow a collapse.</summary>
public float BoneWeightSimilarityThreshold { get; set; } = DefaultBoneWeightSimilarityThreshold;
/// <summary>UV similarity threshold to protect seams.</summary>
public float UvSimilarityThreshold { get; set; } = DefaultUvSimilarityThreshold;
/// <summary>UV seam cosine threshold for blocking seam collapses.</summary>
public float UvSeamAngleCos { get; set; } = DefaultUvSeamAngleCos;
/// <summary>Whether to block UV seam vertices from collapsing.</summary>
public bool BlockUvSeamVertices { get; set; } = DefaultBlockUvSeamVertices;
/// <summary>Whether to allow collapses on boundary edges.</summary>
public bool AllowBoundaryCollapses { get; set; } = DefaultAllowBoundaryCollapses;
/// <summary>Body collision distance factor for the primary pass.</summary>
public float BodyCollisionDistanceFactor { get; set; } = DefaultBodyCollisionDistanceFactor;
/// <summary>Body collision distance factor for the relaxed fallback pass.</summary>
public float BodyCollisionNoOpDistanceFactor { get; set; } = DefaultBodyCollisionNoOpDistanceFactor;
/// <summary>Relax multiplier applied when the mesh is close to the body.</summary>
public float BodyCollisionAdaptiveRelaxFactor { get; set; } = DefaultBodyCollisionAdaptiveRelaxFactor;
/// <summary>Ratio of near-body vertices required to trigger relaxation.</summary>
public float BodyCollisionAdaptiveNearRatio { get; set; } = DefaultBodyCollisionAdaptiveNearRatio;
/// <summary>UV threshold for relaxed body-collision mode.</summary>
public float BodyCollisionAdaptiveUvThreshold { get; set; } = DefaultBodyCollisionAdaptiveUvThreshold;
/// <summary>UV seam cosine threshold for relaxed body-collision mode.</summary>
public float BodyCollisionNoOpUvSeamAngleCos { get; set; } = DefaultBodyCollisionNoOpUvSeamAngleCos;
/// <summary>Expansion factor for protected vertices near the body.</summary>
public float BodyCollisionProtectionFactor { get; set; } = DefaultBodyCollisionProtectionFactor;
/// <summary>Minimum ratio used when decimating the body proxy.</summary>
public float BodyProxyTargetRatioMin { get; set; } = DefaultBodyProxyTargetRatioMin;
/// <summary>Inflation applied to body collision distances.</summary>
public float BodyCollisionProxyInflate { get; set; } = DefaultBodyCollisionProxyInflate;
/// <summary>Body collision penetration factor used during collapse checks.</summary>
public float BodyCollisionPenetrationFactor { get; set; } = DefaultBodyCollisionPenetrationFactor;
/// <summary>Minimum body collision distance threshold.</summary>
public float MinBodyCollisionDistance { get; set; } = DefaultMinBodyCollisionDistance;
/// <summary>Minimum cell size for body collision spatial hashing.</summary>
public float MinBodyCollisionCellSize { get; set; } = DefaultMinBodyCollisionCellSize;
}

View File

@@ -25,15 +25,22 @@ public class PlayerPerformanceConfig : ILightlessConfiguration
public bool SkipUncompressedTextureCompressionMipMaps { get; set; } = false;
public bool KeepOriginalTextureFiles { get; set; } = false;
public bool SkipTextureDownscaleForPreferredPairs { get; set; } = true;
public bool EnableModelDecimation { get; set; } = false;
public int ModelDecimationTriangleThreshold { get; set; } = 15_000;
public double ModelDecimationTargetRatio { get; set; } = 0.8;
public bool ModelDecimationNormalizeTangents { get; set; } = true;
public bool KeepOriginalModelFiles { get; set; } = true;
public bool SkipModelDecimationForPreferredPairs { get; set; } = true;
public bool ModelDecimationAllowBody { get; set; } = false;
public bool ModelDecimationAllowFaceHead { get; set; } = false;
public bool ModelDecimationAllowTail { get; set; } = false;
public bool ModelDecimationAllowClothing { get; set; } = true;
public bool ModelDecimationAllowAccessories { get; set; } = true;
public bool EnableModelDecimation { get; set; } = ModelDecimationDefaults.EnableAutoDecimation;
public int ModelDecimationTriangleThreshold { get; set; } = ModelDecimationDefaults.TriangleThreshold;
public double ModelDecimationTargetRatio { get; set; } = ModelDecimationDefaults.TargetRatio;
public bool ModelDecimationNormalizeTangents { get; set; } = ModelDecimationDefaults.NormalizeTangents;
public bool ModelDecimationAvoidBodyIntersection { get; set; } = ModelDecimationDefaults.AvoidBodyIntersection;
public ModelDecimationAdvancedSettings ModelDecimationAdvanced { get; set; } = new();
public int BatchModelDecimationTriangleThreshold { get; set; } = ModelDecimationDefaults.BatchTriangleThreshold;
public double BatchModelDecimationTargetRatio { get; set; } = ModelDecimationDefaults.BatchTargetRatio;
public bool BatchModelDecimationNormalizeTangents { get; set; } = ModelDecimationDefaults.BatchNormalizeTangents;
public bool BatchModelDecimationAvoidBodyIntersection { get; set; } = ModelDecimationDefaults.BatchAvoidBodyIntersection;
public bool ShowBatchModelDecimationWarning { get; set; } = ModelDecimationDefaults.ShowBatchDecimationWarning;
public bool KeepOriginalModelFiles { get; set; } = ModelDecimationDefaults.KeepOriginalModelFiles;
public bool SkipModelDecimationForPreferredPairs { get; set; } = ModelDecimationDefaults.SkipPreferredPairs;
public bool ModelDecimationAllowBody { get; set; } = ModelDecimationDefaults.AllowBody;
public bool ModelDecimationAllowFaceHead { get; set; } = ModelDecimationDefaults.AllowFaceHead;
public bool ModelDecimationAllowTail { get; set; } = ModelDecimationDefaults.AllowTail;
public bool ModelDecimationAllowClothing { get; set; } = ModelDecimationDefaults.AllowClothing;
public bool ModelDecimationAllowAccessories { get; set; } = ModelDecimationDefaults.AllowAccessories;
}