using GraphProcessor; using UnityEngine.UIElements; using UnityEngine; using System.Linq; [NodeCustomEditor(typeof(KeyframeNode))] public class KeyframeNodeView : BaseNodeView { Button generateButton; const string ERROR_TYPE = "GameObject input has wrong type"; const string ERROR_REND = "GameObject must have a MeshRenderer component"; public override void Enable() { generateButton = new Button(OnGenerateClick) { text = "Generate Keyframe" }; controlsContainer.Add(generateButton); onPortConnected += _ => Validate(); onPortDisconnected += _ => Validate(); schedule.Execute(Validate).Every(200); Validate(); } void OnGenerateClick() { var go = GetConnectedGameObject(); if (go?.GetComponent() == null) return; var foldNode = GetConnectedFoldNode(); Debug.Log($"Generating Keyframe for '{go.name}' using Fold Data: {(foldNode?.name ?? "None")}"); } T GetConnectedNode(string fieldName) where T : class { var edge = GetFirstPortViewFromFieldName(fieldName)?.GetEdges().FirstOrDefault(); return (edge?.output.node as BaseNodeView)?.nodeTarget as T; } GameObject GetConnectedGameObject() => GetConnectedNode(nameof(KeyframeNode.targetObject))?.output; BaseFoldNode GetConnectedFoldNode() => GetConnectedNode(nameof(KeyframeNode.foldData)); void Validate() { var go = GetConnectedGameObject(); bool hasGoConn = GetFirstPortViewFromFieldName(nameof(KeyframeNode.targetObject))?.GetEdges().Any() ?? false; bool hasFoldConn = GetFirstPortViewFromFieldName(nameof(KeyframeNode.foldData))?.GetEdges().Any() ?? false; RemoveMessageView(ERROR_TYPE); RemoveMessageView(ERROR_REND); if (hasGoConn) { if (go == null) AddMessageView(ERROR_TYPE, NodeMessageType.Error); else if (go.GetComponent() == null) AddMessageView(ERROR_REND, NodeMessageType.Error); } generateButton.SetEnabled(hasGoConn && hasFoldConn && go?.GetComponent() != null); } }