using System; using System.Collections.Generic; using UnityEngine; namespace NGS.MeshFusionPro; public class DynamicMeshFusionSource : MeshFusionSource { [SerializeField] [HideInInspector] private MeshRenderer _renderer; [SerializeField] [HideInInspector] private MeshFilter _filter; [SerializeField] [HideInInspector] private Mesh _mesh; private DynamicCombineSource[] _sources; private DynamicCombinedObjectPart[] _parts; public override bool TryGetBounds(ref Bounds bounds) { if (_renderer != null) { bounds = _renderer.bounds; return true; } return false; } protected override void OnSourceCombinedInternal(ICombinedObject root, ICombinedObjectPart part) { for (int i = 0; i < _parts.Length; i++) { if (_parts[i] == null) { _parts[i] = (DynamicCombinedObjectPart)part; return; } } throw new Exception("Unexpected Behaviour"); } protected override bool CheckCompatibilityAndGetComponents(out string incompatibilityReason) { incompatibilityReason = ""; return CanCreateCombineSource(base.gameObject, ref incompatibilityReason, ref _renderer, ref _filter, ref _mesh); } protected override void CreateSources() { if (_sources == null) { _sources = new DynamicCombineSource[_mesh.subMeshCount]; } if (_parts == null) { _parts = new DynamicCombinedObjectPart[_mesh.subMeshCount]; } for (int i = 0; i < _sources.Length; i++) { _sources[i] = new DynamicCombineSource(_mesh, _renderer, i); } } protected override IEnumerable GetCombineSources() { if (_sources == null) { yield break; } for (int i = 0; i < _sources.Length; i++) { DynamicCombineSource dynamicCombineSource = _sources[i]; if (dynamicCombineSource == null) { break; } yield return dynamicCombineSource; } } protected override IEnumerable GetCombinedParts() { if (_parts == null) { yield break; } for (int i = 0; i < _parts.Length; i++) { DynamicCombinedObjectPart dynamicCombinedObjectPart = _parts[i]; if (dynamicCombinedObjectPart == null) { break; } yield return dynamicCombinedObjectPart; } } protected override void ClearSources() { if (_sources != null) { for (int i = 0; i < _sources.Length && _sources[i] != null; i++) { _sources[i] = null; } } } protected override void ClearParts() { if (_parts != null) { for (int i = 0; i < _parts.Length; i++) { _parts[i] = null; } } } protected override void ToggleComponents(bool enabled) { _renderer.enabled = enabled; } }