1
+ using GeometryGraph . Runtime . Graph ;
2
+ using Newtonsoft . Json . Linq ;
3
+ using UnityEditor . Experimental . GraphView ;
4
+ using UnityEngine . UIElements ;
5
+
6
+ namespace GeometryGraph . Editor {
7
+ [ Title ( "Curve" , "Recalculate Directions" ) ]
8
+ public class RecalculateCurveDirectionsNode : AbstractNode < GeometryGraph . Runtime . Graph . RecalculateCurveDirectionsNode > {
9
+ protected override string Title => "Recalculate Directions" ;
10
+ protected override NodeCategory Category => NodeCategory . Curve ;
11
+
12
+ private GraphFrameworkPort curvePort ;
13
+ private GraphFrameworkPort resultPort ;
14
+
15
+ private bool flipTangents ;
16
+ private bool flipNormals ;
17
+ private bool flipBinormals ;
18
+
19
+ private BooleanToggle flipTangentsToggle ;
20
+ private BooleanToggle flipNormalsToggle ;
21
+ private BooleanToggle flipBinormalsToggle ;
22
+
23
+ protected override void CreateNode ( ) {
24
+ curvePort = GraphFrameworkPort . Create ( "Curve" , Direction . Input , Port . Capacity . Single , PortType . Curve , this ) ;
25
+ resultPort = GraphFrameworkPort . Create ( "Curve" , Direction . Output , Port . Capacity . Multi , PortType . Curve , this ) ;
26
+
27
+ flipTangentsToggle = new BooleanToggle ( false , "Flip Tangents (Yes)" , "Flip Tangents (No)" ) ;
28
+ flipNormalsToggle = new BooleanToggle ( false , "Flip Normals (Yes)" , "Flip Normals (No)" ) ;
29
+ flipBinormalsToggle = new BooleanToggle ( false , "Flip Binormals (Yes)" , "Flip Binormals (No)" ) ;
30
+
31
+ flipTangentsToggle . RegisterValueChangedCallback ( evt => {
32
+ if ( evt . newValue == flipTangents ) return ;
33
+
34
+ Owner . EditorView . GraphObject . RegisterCompleteObjectUndo ( "Change Flip Tangents" ) ;
35
+ flipTangents = evt . newValue ;
36
+ RuntimeNode . UpdateFlipTangents ( flipTangents ) ;
37
+ } ) ;
38
+
39
+ flipNormalsToggle . RegisterValueChangedCallback ( evt => {
40
+ if ( evt . newValue == flipNormals ) return ;
41
+
42
+ Owner . EditorView . GraphObject . RegisterCompleteObjectUndo ( "Change Flip Normals" ) ;
43
+ flipNormals = evt . newValue ;
44
+ RuntimeNode . UpdateFlipNormals ( flipNormals ) ;
45
+ } ) ;
46
+
47
+ flipBinormalsToggle . RegisterValueChangedCallback ( evt => {
48
+ if ( evt . newValue == flipBinormals ) return ;
49
+
50
+ Owner . EditorView . GraphObject . RegisterCompleteObjectUndo ( "Change Flip Binormals" ) ;
51
+ flipBinormals = evt . newValue ;
52
+ RuntimeNode . UpdateFlipBinormals ( flipBinormals ) ;
53
+ } ) ;
54
+
55
+ inputContainer . Add ( flipTangentsToggle ) ;
56
+ inputContainer . Add ( flipNormalsToggle ) ;
57
+ inputContainer . Add ( flipBinormalsToggle ) ;
58
+ AddPort ( curvePort ) ;
59
+ AddPort ( resultPort ) ;
60
+ }
61
+
62
+ protected override void BindPorts ( ) {
63
+ BindPort ( curvePort , RuntimeNode . CurvePort ) ;
64
+ BindPort ( resultPort , RuntimeNode . ResultPort ) ;
65
+ }
66
+
67
+ protected internal override JObject Serialize ( ) {
68
+ JObject root = base . Serialize ( ) ;
69
+ JArray data = new ( ) {
70
+ flipTangents ? 1 : 0 ,
71
+ flipNormals ? 1 : 0 ,
72
+ flipBinormals ? 1 : 0
73
+ } ;
74
+
75
+ root [ "d" ] = data ;
76
+ return root ;
77
+ }
78
+
79
+ protected internal override void Deserialize ( JObject data ) {
80
+ JArray array = data [ "d" ] as JArray ;
81
+
82
+ flipTangents = array ! . Value < int > ( 0 ) == 1 ;
83
+ flipNormals = array . Value < int > ( 1 ) == 1 ;
84
+ flipBinormals = array . Value < int > ( 2 ) == 1 ;
85
+
86
+ flipTangentsToggle . SetValueWithoutNotify ( flipTangents ) ;
87
+ flipNormalsToggle . SetValueWithoutNotify ( flipNormals ) ;
88
+ flipBinormalsToggle . SetValueWithoutNotify ( flipBinormals ) ;
89
+
90
+ RuntimeNode . UpdateFlipTangents ( flipTangents ) ;
91
+ RuntimeNode . UpdateFlipNormals ( flipNormals ) ;
92
+ RuntimeNode . UpdateFlipBinormals ( flipBinormals ) ;
93
+
94
+ base . Deserialize ( data ) ;
95
+ }
96
+ }
97
+ }
0 commit comments