summaryrefslogtreecommitdiffstats
path: root/Scripts/Fold/Editor/KeyframeNodeView.cs
blob: fd90c7527acfc8ad8d5bd640926fb9869ba9d004 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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<MeshRenderer>() == null) return;

        var foldNode = GetConnectedFoldNode();
        Debug.Log($"Generating Keyframe for '{go.name}' using Fold Data: {(foldNode?.name ?? "None")}");
    }

    T GetConnectedNode<T>(string fieldName) where T : class
    {
        var edge = GetFirstPortViewFromFieldName(fieldName)?.GetEdges().FirstOrDefault();
        return (edge?.output.node as BaseNodeView)?.nodeTarget as T;
    }

    GameObject GetConnectedGameObject() => GetConnectedNode<GameObjectNode>(nameof(KeyframeNode.targetObject))?.output;

    BaseFoldNode GetConnectedFoldNode() => GetConnectedNode<BaseFoldNode>(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<MeshRenderer>() == null) AddMessageView(ERROR_REND, NodeMessageType.Error);
        }

        generateButton.SetEnabled(hasGoConn && hasFoldConn && go?.GetComponent<MeshRenderer>() != null);
    }
}