using System; using UnityEngine; namespace NGS.MeshFusionPro; public class CombineSource : ICombineSource, ICombineSource { public Vector3 Position { get; private set; } public Bounds Bounds { get; private set; } public MeshCombineInfo CombineInfo { get; private set; } public RendererSettings RendererSettings { get; private set; } public event Action onCombined; public event Action onCombineError; public event Action onCombineFailed; public event Action onCombinedTyped; public event Action onCombineErrorTyped; public event Action onCombineFailedTyped; public CombineSource(GameObject go, int submeshIndex = 0) : this(go.GetComponent().mesh, go.GetComponent(), submeshIndex) { } public CombineSource(Mesh mesh, MeshRenderer renderer, int submeshIndex = 0) { if (mesh == null) { throw new ArgumentException("Mesh is null"); } if (renderer == null) { throw new ArgumentException("Mesh Renderer is null"); } if (submeshIndex >= mesh.subMeshCount) { throw new ArgumentException("Submesh index is greater the submeshCount"); } MeshCombineInfo info = new MeshCombineInfo(mesh, renderer.localToWorldMatrix, renderer.lightmapScaleOffset, renderer.realtimeLightmapScaleOffset, submeshIndex); RendererSettings settings = new RendererSettings(renderer, submeshIndex); Construct(info, settings, renderer.bounds); } public CombineSource(MeshCombineInfo info, RendererSettings settings) : this(info, settings, info.mesh.bounds.Transform(info.transformMatrix)) { } public CombineSource(MeshCombineInfo info, RendererSettings settings, Bounds bounds) { Construct(info, settings, bounds); } private void Construct(MeshCombineInfo info, RendererSettings settings, Bounds bounds) { CombineInfo = info; RendererSettings = settings; Position = info.transformMatrix.GetTranslation(); Bounds = bounds; } public void Combined(CombinedObject root, CombinedObjectPart part) { this.onCombined?.Invoke(root, part); this.onCombinedTyped?.Invoke(root, part); } public void CombineError(CombinedObject root, string errorMessage) { if (this.onCombineError == null && this.onCombinedTyped == null) { Debug.Log("Error during combine " + root.name + ", reason :" + errorMessage); return; } this.onCombineError?.Invoke(root, errorMessage); this.onCombineErrorTyped?.Invoke(root, errorMessage); } public void CombineFailed(CombinedObject root) { this.onCombineFailed?.Invoke(root); this.onCombineFailedTyped?.Invoke(root); } }