using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using Quadtree; using UnityEngine; namespace BITKit.OpenWorld { public class ChunkObject : MonoBehaviour, IWorldChunkObject { [SerializeField, ReadOnly] private int _lod = -1; [SerializeField, ReadOnly] private int id; public Bounds GetBounds() => _bounds; private Bounds _bounds; public Node ParentNode { get; set; } public void QuadTree_Root_Initialized(IQuadtreeRoot> root) { } public int Id { get => id; set => id = value; } public int Lod { get => _lod; set => OnLodChanged(_lod, _lod = value); } protected virtual void Start() { CalculateBounds(); UnityWorldChunkService.Singleton.Register(this); destroyCancellationToken.Register(Dispose); } private void Dispose() { UnityWorldChunkService.Singleton.Unregister(this); } protected virtual void OnLodChanged(int oldLod, int newLod) { } private void OnDrawGizmosSelected() { if (_bounds.size.magnitude is 0) CalculateBounds(); Gizmos.color = Color.red; Gizmos.DrawWireCube(_bounds.center, _bounds.size); } #if UNITY_EDITOR [BIT] #endif public void CalculateBounds() { if (TryGetComponent(out var _collider)) { _bounds = _collider.bounds; return; } _bounds = new Bounds(); var colliders = GetComponentsInChildren(); if (colliders.Length is 0) { Debug.LogWarning($"{gameObject.name}:No collider found"); return; } var reference = colliders.First(); _bounds = reference.bounds; foreach (var x in colliders) { _bounds.Encapsulate(x.bounds); if (x.bounds.size.sqrMagnitude > 64) { Debug.LogWarning( $"{x.gameObject.name}:Size is too large, please check the size of the collider"); } } #if UNITY_EDITOR UnityEditor.EditorUtility.SetDirty(this); #endif } } }