summaryrefslogtreecommitdiffstats
path: root/Scripts/Fold/Editor/KeyframeNodeView.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Scripts/Fold/Editor/KeyframeNodeView.cs')
-rw-r--r--Scripts/Fold/Editor/KeyframeNodeView.cs120
1 files changed, 0 insertions, 120 deletions
diff --git a/Scripts/Fold/Editor/KeyframeNodeView.cs b/Scripts/Fold/Editor/KeyframeNodeView.cs
deleted file mode 100644
index 65d839b..0000000
--- a/Scripts/Fold/Editor/KeyframeNodeView.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-using GraphProcessor;
-using UnityEngine.UIElements;
-using UnityEngine;
-using System.Linq;
-using System.Collections.Generic;
-
-[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()
- {
- // Process the graph to propagate values through connections
- var processor = new ProcessGraphProcessor(nodeTarget.graph);
- processor.Run();
-
- var go = GetConnectedGameObject();
- if (go == null) return;
- var rend = go.GetComponent<MeshRenderer>();
- if (rend == null) return;
-
- var foldNode = GetConnectedFoldNode();
-
- // Accumulate nodes. We are going backwards from the output node
- // (KeyframeNode) to the root node.
- var foldNodes = new Stack<BaseFoldNode>();
- var cur = foldNode;
- while (cur != null) {
- foldNodes.Push(cur);
- cur = GetInputFoldNode(cur);
- }
-
- var mpb = new MaterialPropertyBlock();
- rend.GetPropertyBlock(mpb);
-
- // Set material properties for all 16 slots.
- const int kNumSlots = 16;
- for (int i = 0; i < kNumSlots; i++) {
- string slotPrefix = $"_Vertex_Deformation_Slot_{i}_";
- BaseFoldNode node = (foldNodes.Count > 0) ? foldNodes.Pop() : null;
- FoldNodeSerialized data = node?.Serialize();
-
- bool active = data != null;
- if (active) {
- Debug.Log($"Setting opcode {data.opcode}");
- }
- mpb.SetFloat(slotPrefix + "Enabled", active ? 1.0f : 0.0f);
- mpb.SetInt(slotPrefix + "Opcode", active ? data.opcode : 0);
-
- mpb.SetFloat(slotPrefix + "Float_0", active ? data.float0 : 0.0f);
- mpb.SetFloat(slotPrefix + "Float_1", active ? data.float1 : 0.0f);
- mpb.SetFloat(slotPrefix + "Float_2", active ? data.float2 : 0.0f);
- mpb.SetFloat(slotPrefix + "Float_3", active ? data.float3 : 0.0f);
-
- mpb.SetVector(slotPrefix + "Vector_0", active ? data.vec0 : Vector4.zero);
- if (active) {
- Debug.Log($"Setting vec0 {data.vec0}");
- }
- mpb.SetVector(slotPrefix + "Vector_1", active ? data.vec1 : Vector4.zero);
- mpb.SetVector(slotPrefix + "Vector_2", active ? data.vec2 : Vector4.zero);
- mpb.SetVector(slotPrefix + "Vector_3", active ? data.vec3 : Vector4.zero);
- }
-
- rend.SetPropertyBlock(mpb);
- }
-
- BaseFoldNode GetInputFoldNode(BaseFoldNode node)
- {
- // Traverse via edges in the graph model, as 'input' field might not be populated in Editor
- var port = node.GetPort(nameof(BaseFoldNode.input), null);
- if (port == null) return null;
-
- // Find the edge connected to this input port
- var edge = node.graph.edges.FirstOrDefault(e => e.inputPort == port);
- return edge?.outputNode as BaseFoldNode;
- }
-
- 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);
- }
-}