diff options
Diffstat (limited to 'Thronefall_1_57/Thronefall/NGS.MeshFusionPro/CombineSource.cs')
| -rw-r--r-- | Thronefall_1_57/Thronefall/NGS.MeshFusionPro/CombineSource.cs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Thronefall_1_57/Thronefall/NGS.MeshFusionPro/CombineSource.cs b/Thronefall_1_57/Thronefall/NGS.MeshFusionPro/CombineSource.cs new file mode 100644 index 0000000..f010062 --- /dev/null +++ b/Thronefall_1_57/Thronefall/NGS.MeshFusionPro/CombineSource.cs @@ -0,0 +1,92 @@ +using System; +using UnityEngine; + +namespace NGS.MeshFusionPro; + +public class CombineSource : ICombineSource<CombinedObject, CombinedObjectPart>, 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<ICombinedObject, ICombinedObjectPart> onCombined; + + public event Action<ICombinedObject, string> onCombineError; + + public event Action<ICombinedObject> onCombineFailed; + + public event Action<CombinedObject, CombinedObjectPart> onCombinedTyped; + + public event Action<CombinedObject, string> onCombineErrorTyped; + + public event Action<CombinedObject> onCombineFailedTyped; + + public CombineSource(GameObject go, int submeshIndex = 0) + : this(go.GetComponent<MeshFilter>().mesh, go.GetComponent<MeshRenderer>(), 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); + } +} |
