using JetBrains.Annotations; using Linework.EdgeDetection; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using TMPro; using Unity.VectorGraphics; using Unity.VisualScripting; using UnityEngine; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; using UnityEngine.UI; namespace Plan2D { public class Plan2DHandler : MonoBehaviour { [Header("Plan2D Settings")] [SerializeField] float _offsetForIncrementalCut = 36f; public float OffsetForIncrementalCut { get { return _offsetForIncrementalCut * ViewScale; } } [SerializeField] float _offsetForIncrementalCutSides = 10.5f; // left / right public float OffsetForIncrementalCutSides { get { return _offsetForIncrementalCutSides * ViewScale; } } [SerializeField] float _offsetForIncrementalCutTopBottom = 12f; // top / bottom — smaller spacing public float OffsetForIncrementalCutTopBottom { get { return _offsetForIncrementalCutTopBottom * ViewScale; } } [SerializeField] bool _incrementalCut = true; public bool IsIncrementalCut { get { return _incrementalCut; } } [SerializeField] bool _displayMeasureCloseToWall = true; public bool DisplayMeasureCloseToWall { get { return _displayMeasureCloseToWall; } } public bool DebugCameraZoom { get { return _debugCameraZoom; } } [SerializeField] bool _debugCameraZoom = false; public float ZoomBuffer { get { return _zoomBuffer; } } [SerializeField] float _zoomBuffer = 4f; [SerializeField] float _viewZoomMultiplier = 0.75f; [SerializeField] float _islandViewPadding = 1.05f; [Header("Measure Settings")] [SerializeField] List _linesColors = new(12) { Color.black, // 0 Wall Color.black, // 1 IslandWall Color.red, // 2 FloorObject (BA) Color.blue, // 3 WallObject (WA) new Color(52,52,53), // 4 StructuralElements Color.red, // 5 IslandObject Color.black, // 6 Floor Color.gray, // 7 WallLines Color.black, // 8 WallThickness Color.black, // 9 CabOverlay Color.black, // 10 Debug new Color(0.145f, 0.702f, 0.020f), // 11 TallObject (TA) — #25B305 }; [SerializeField] ObjectTypes[] objectTypes = new[] { ObjectTypes.FloorObject, ObjectTypes.WallObject, ObjectTypes.TallObject, ObjectTypes.Null, ObjectTypes.StructuralElements, ObjectTypes.Wall, ObjectTypes.IslandObject, ObjectTypes.IslandWall, }; [SerializeField] float _distanceFromWallForObjects = 12f; // [SerializeField] float _distanceFromWallForCutBtn = 36f; [SerializeField] float _wallThickness = 12f; [SerializeField] float _lineThickness = 0.4f; [Header("Measure Filter")] [SerializeField] bool _showWallMeasure = true; [SerializeField] bool _showFloorObject = true; [SerializeField] bool _showWallObject = true; [SerializeField] bool _showHoleInWallObject = true; [SerializeField] bool _showIsland = true; [SerializeField] bool _showIslandWall = true; bool _showWallElevation; [Header("Object References")] [SerializeField] Canvas _mainCanvas; [SerializeField] Canvas _plan2DCanvas; [SerializeField] Canvas _worldButtonCanvas; [SerializeField] Button _islandButton; // object in scene includes cabinet, fridge etc [SerializeField] GameObject _scene; // include wall, ceiling, floor [SerializeField] GameObject _room; [SerializeField] GameObject _plan2DButtonOverlay; List _walls = new(); List _objectToActive = new(); Dictionary> _objectsInScene = new(Enum.GetValues(typeof(ObjectTypes)).Length - 1); List _wallLines = new(); List _islandLines = new(); HashSet _camsWithIslandContent = new(); float _islandSharedOrthoSize; // max orthoSize across all island cameras (shared scale) public ObjectPool _lineRendererPool; public ObjectPool _lineRendererForOverlayPool; public ObjectPool _textPool; Dictionary> _lineRenderers = new(Enum.GetValues(typeof(ObjectTypes)).Length - 1); Dictionary> _lineRenderersForOverlay = new(Enum.GetValues(typeof(ObjectTypes)).Length - 1); public float ViewScale => _camera != null ? _camera.orthographicSize / 150f : 1f; public float HalfLineThickness { get { return _lineThickness * 0.5f * ViewScale; } } Dictionary> _texts = new(Enum.GetValues(typeof(ObjectTypes)).Length - 1); Dictionary _wallCutsButtons = new(); List _wallElevationButtonObjects = new(); [Header("Camera References")] [SerializeField] Transform _cameraPos; [SerializeField] float _cameraDistance = 150f; [SerializeField] GameObject _lineRendererPrefab; [SerializeField] GameObject _lineRendererForOverlayPrefab; Dictionary _cameraSettings = new(); int cameraViews = Enum.GetValues(typeof(CameraViews)).Length - 1; bool _outlineEnabled = false; Camera _camera; public List LineColors { get { return _linesColors; } } CameraViews _currentCameraView; [Header("Islands References")] [SerializeField] Camera _front; public Camera FrontCamera { get { return _front; } } [SerializeField] Camera _back; public Camera BackCamera { get { return _back; } } [SerializeField] Camera _left; public Camera LeftCamera { get { return _left; } } [SerializeField] Camera _right; public Camera RightCamera { get { return _right; } } [SerializeField] RectTransform _islandCutPanel; Vector3 _islandCenterPosition; [Header("Text Settings")] [SerializeField] GameObject _textPrefab; [SerializeField] float _fontSize = 6f; [SerializeField] float _minFontSize = 4.5f; public float MinFontSize { get { return _minFontSize * ViewScale; } } public float FontSize { get { return _fontSize * ViewScale; } } [SerializeField] float _fontSizeElevation = 9f; [SerializeField] float _minFontSizeElevation = 4.5f; public float FontSizeElevation { get { return _fontSizeElevation * ViewScale; } } public float MinFontSizeElevation { get { return _minFontSizeElevation * ViewScale; } } [SerializeField] float _fontSizeIsland = 4.5f; [SerializeField] float _minFontSizeIsland = 4.5f; public float FontSizeIsland { get { return _fontSizeIsland * ViewScale; } } public float MinFontSizeIsland { get { return _minFontSizeIsland * ViewScale; } } [Header("Shader Settings")] [SerializeField] Shader _outlineShader; [Tooltip("Renderer features to DISABLE while Plan2D is active (drag the blue outline feature here).")] [SerializeField] List _featuresToDisableInPlan2D = new(); [SerializeField] EdgeDetectionSettings _edgeDetectionPlan2D; Material _plan2DMaterial; bool _active = false; private GameObject _selectedWallForElevation; int _savedQualitySettings; List