using JetBrains.Annotations; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using TMPro; 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 = 12f; public float OffsetForIncrementalCut { get { return _offsetForIncrementalCut; } } [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; [Header("Measure Settings")] [SerializeField] List _linesColors = new(8) { Color.black, Color.black, Color.red, Color.blue, new Color(52,52,53), Color.red, Color.black, Color.gray }; [SerializeField] ObjectTypes[] objectTypes = new[] { ObjectTypes.FloorObject, ObjectTypes.WallObject, ObjectTypes.Null, ObjectTypes.StructuralElements, ObjectTypes.Wall, ObjectTypes.IslandObject, ObjectTypes.IslandWall, }; [SerializeField] float _distanceFromWallForObjects = 24f; [SerializeField] float _wallThickness = 6f; [SerializeField] float _lineThickness = 0.5f; [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(); 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 HalfLineThickness { get { return _lineThickness * 0.5f; } } Dictionary> _texts = new(Enum.GetValues(typeof(ObjectTypes)).Length - 1); Dictionary _wallCutsButtons = 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 = 4f; [SerializeField] float _minFontSize = 3f; public float MinFontSize { get { return _minFontSize; } } public float FontSize { get { return _fontSize; } } [Header("Shader Settings")] [SerializeField] Shader _outlineShader; Material _plan2DMaterial; bool _active = false; private GameObject _selectedWallForElevation; int _savedQualitySettings; List