namespace NResUI.Rendering.Inspection; /// /// Состояние просмотра меша. State/LOD задаются только для конкретных pieces, /// потому что 0x01 хранит таблицу slot indices отдельно для каждого узла. /// public sealed class MeshRenderState { public bool UseStoredNormals { get; set; } = true; public bool ShowEmptyPieces { get; set; } = true; public int SelectedPieceId { get; set; } = -1; public int SelectedBatchIndex { get; set; } = -1; public bool IsolateSelectedPiece { get; set; } public bool IsolateSelectedBatch { get; set; } public HashSet HiddenPieceIds { get; } = []; public Dictionary PieceStateOverrides { get; } = []; public Dictionary PieceLodOverrides { get; } = []; public void ClearSelection() { SelectedPieceId = -1; SelectedBatchIndex = -1; IsolateSelectedPiece = false; IsolateSelectedBatch = false; } public int GetPieceState(int pieceId) { return PieceStateOverrides.GetValueOrDefault(pieceId, 0); } public int GetPieceLod(int pieceId) { return PieceLodOverrides.GetValueOrDefault(pieceId, 0); } public void SetPieceStateOverride(int pieceId, int state) { PieceStateOverrides[pieceId] = state; } public void SetPieceLodOverride(int pieceId, int lod) { PieceLodOverrides[pieceId] = lod; } public void ClearPieceOverrides(int pieceId) { PieceStateOverrides.Remove(pieceId); PieceLodOverrides.Remove(pieceId); } public void ClearAllPieceOverrides() { PieceStateOverrides.Clear(); PieceLodOverrides.Clear(); } public bool IsPieceVisible(int pieceId) { if (HiddenPieceIds.Contains(pieceId)) return false; return !IsolateSelectedPiece || SelectedPieceId < 0 || pieceId == SelectedPieceId; } public bool IsBatchVisible(int batchIndex) { return !IsolateSelectedBatch || SelectedBatchIndex < 0 || batchIndex == SelectedBatchIndex; } }