1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
1
4
using Improbable . Gdk . CodeGeneration . CodeWriter ;
2
5
using Improbable . Gdk . CodeGeneration . CodeWriter . Scopes ;
6
+ using Improbable . Gdk . CodeGeneration . Model ;
3
7
using Improbable . Gdk . CodeGeneration . Model . Details ;
8
+ using Improbable . Gdk . CodeGeneration . Utils ;
9
+ using ValueType = Improbable . Gdk . CodeGeneration . Model . ValueType ;
4
10
5
11
namespace Improbable . Gdk . CodeGenerator
6
12
{
@@ -13,6 +19,7 @@ public static CodeWriter Generate(UnityComponentDetails details)
13
19
cgw . UsingDirectives (
14
20
"Unity.Entities" ,
15
21
"UnityEngine.UIElements" ,
22
+ "UnityEditor.UIElements" ,
16
23
"Improbable.Gdk.Debug.WorkerInspector.Codegen"
17
24
) ;
18
25
@@ -22,28 +29,184 @@ public static CodeWriter Generate(UnityComponentDetails details)
22
29
{
23
30
type . Line ( $ "public override ComponentType ComponentType {{ get; }} = ComponentType.ReadOnly<{ details . Name } .Component>();") ;
24
31
32
+ type . TextList ( details . FieldDetails . Select ( ToFieldDeclaration ) ) ;
33
+
25
34
GenerateConstructor ( type , details ) ;
26
35
GenerateUpdateMethod ( type , details ) ;
27
36
} ) ;
28
37
} ) ;
29
38
} ) ;
30
39
}
31
40
41
+ private static string ToFieldDeclaration ( UnityFieldDetails fieldDetails )
42
+ {
43
+ switch ( fieldDetails . FieldType )
44
+ {
45
+ case SingularFieldType singularFieldType :
46
+ var uiType = GetUiFieldType ( singularFieldType . ContainedType ) ;
47
+
48
+ if ( uiType == "" )
49
+ {
50
+ // TODO: Eliminate this case.
51
+ return "" ;
52
+ }
53
+
54
+ return $ "private readonly { uiType } { fieldDetails . CamelCaseName } Field;";
55
+ default :
56
+ // TODO: Lists, maps, and options
57
+ return "" ;
58
+ }
59
+ }
60
+
32
61
private static void GenerateConstructor ( TypeBlock typeBlock , UnityComponentDetails details )
33
62
{
34
63
typeBlock . Method ( $ "public { details . Name } Renderer() : base()", mb =>
35
64
{
36
65
mb . Line ( $ "ComponentFoldout.text = \" { details . Name } \" ;") ;
37
66
mb . Line ( $ "AuthoritativeToggle.SetEnabled(false);") ;
67
+
68
+ foreach ( var field in details . FieldDetails )
69
+ {
70
+ mb . TextList ( ToFieldInitialisation ( field ) ) ;
71
+ }
38
72
} ) ;
39
73
}
40
74
75
+ private static IEnumerable < string > ToFieldInitialisation ( UnityFieldDetails fieldDetails )
76
+ {
77
+ switch ( fieldDetails . FieldType )
78
+ {
79
+ case SingularFieldType singularFieldType :
80
+
81
+ var uiType = GetUiFieldType ( singularFieldType . ContainedType ) ;
82
+
83
+ if ( uiType == "" )
84
+ {
85
+ // TODO: Eliminate this case.
86
+ yield break ;
87
+ }
88
+
89
+ var humanReadableName = Formatting . SnakeCaseToHumanReadable ( fieldDetails . Name ) ;
90
+ yield return $ "{ fieldDetails . CamelCaseName } Field = new { uiType } (\" { humanReadableName } \" );";
91
+ yield return $ "{ fieldDetails . CamelCaseName } Field.SetEnabled(false);";
92
+
93
+ if ( singularFieldType . ContainedType . Category == ValueType . Enum )
94
+ {
95
+ yield return $ "{ fieldDetails . CamelCaseName } Field.Init(default({ fieldDetails . Type } ));";
96
+ }
97
+
98
+ yield return $ "ComponentFoldout.Add({ fieldDetails . CamelCaseName } Field);";
99
+ break ;
100
+ default :
101
+ // TODO: Lists, maps, and options
102
+ yield break ;
103
+ }
104
+ }
105
+
41
106
private static void GenerateUpdateMethod ( TypeBlock typeBlock , UnityComponentDetails details )
42
107
{
43
108
typeBlock . Method ( "public override void Update(EntityManager manager, Entity entity)" , mb =>
44
109
{
45
110
mb . Line ( $ "AuthoritativeToggle.value = manager.HasComponent<{ details . Name } .HasAuthority>(entity);") ;
111
+ mb . Line ( $ "var component = manager.GetComponentData<{ details . Name } .Component>(entity);") ;
112
+
113
+ mb . TextList ( TextList . New ( details . FieldDetails . Select ( ToUiFieldUpdate ) ) ) ;
46
114
} ) ;
47
115
}
116
+
117
+ private static string ToUiFieldUpdate ( UnityFieldDetails fieldDetails )
118
+ {
119
+ switch ( fieldDetails . FieldType )
120
+ {
121
+ case SingularFieldType singularFieldType :
122
+ switch ( singularFieldType . ContainedType . Category )
123
+ {
124
+ case ValueType . Enum :
125
+ return $ "{ fieldDetails . CamelCaseName } Field.value = component.{ fieldDetails . PascalCaseName } ;";
126
+ case ValueType . Primitive :
127
+ var primitiveType = singularFieldType . ContainedType . PrimitiveType . Value ;
128
+
129
+ switch ( primitiveType )
130
+ {
131
+ case PrimitiveType . Int32 :
132
+ case PrimitiveType . Int64 :
133
+ case PrimitiveType . Uint32 :
134
+ case PrimitiveType . Uint64 :
135
+ case PrimitiveType . Sint32 :
136
+ case PrimitiveType . Sint64 :
137
+ case PrimitiveType . Fixed32 :
138
+ case PrimitiveType . Fixed64 :
139
+ case PrimitiveType . Sfixed32 :
140
+ case PrimitiveType . Sfixed64 :
141
+ case PrimitiveType . Float :
142
+ case PrimitiveType . Double :
143
+ case PrimitiveType . String :
144
+ case PrimitiveType . EntityId :
145
+ return $ "{ fieldDetails . CamelCaseName } Field.value = component.{ fieldDetails . PascalCaseName } .ToString();";
146
+ case PrimitiveType . Bytes :
147
+ return $ "{ fieldDetails . CamelCaseName } Field.value = global::System.Text.Encoding.Default.GetString(component.{ fieldDetails . PascalCaseName } );";
148
+ case PrimitiveType . Bool :
149
+ return $ "{ fieldDetails . CamelCaseName } Field.value = component.{ fieldDetails . PascalCaseName } ;";
150
+ break ;
151
+ case PrimitiveType . Entity :
152
+ // TODO: Entity type.
153
+ return "" ;
154
+ case PrimitiveType . Invalid :
155
+ throw new ArgumentException ( "Unknown primitive type encountered" ) ;
156
+ default :
157
+ throw new ArgumentOutOfRangeException ( ) ;
158
+ }
159
+ case ValueType . Type :
160
+ // TODO: User defined types.
161
+ return "" ;
162
+ default :
163
+ throw new ArgumentOutOfRangeException ( ) ;
164
+ }
165
+ default :
166
+ // TODO: Lists, maps, and options
167
+ return "" ;
168
+ }
169
+ }
170
+
171
+ private static string GetUiFieldType ( ContainedType type )
172
+ {
173
+ switch ( type . Category )
174
+ {
175
+ case ValueType . Enum :
176
+ return "EnumField" ;
177
+ case ValueType . Primitive :
178
+ switch ( type . PrimitiveType . Value )
179
+ {
180
+ case PrimitiveType . Int32 :
181
+ case PrimitiveType . Int64 :
182
+ case PrimitiveType . Uint32 :
183
+ case PrimitiveType . Uint64 :
184
+ case PrimitiveType . Sint32 :
185
+ case PrimitiveType . Sint64 :
186
+ case PrimitiveType . Fixed32 :
187
+ case PrimitiveType . Fixed64 :
188
+ case PrimitiveType . Sfixed32 :
189
+ case PrimitiveType . Sfixed64 :
190
+ case PrimitiveType . Float :
191
+ case PrimitiveType . Double :
192
+ case PrimitiveType . String :
193
+ case PrimitiveType . EntityId :
194
+ case PrimitiveType . Bytes :
195
+ return "TextField" ;
196
+ case PrimitiveType . Bool :
197
+ return "Toggle" ;
198
+ case PrimitiveType . Entity :
199
+ return "" ;
200
+ case PrimitiveType . Invalid :
201
+ throw new ArgumentException ( "Unknown primitive type encountered." ) ;
202
+ default :
203
+ throw new ArgumentOutOfRangeException ( ) ;
204
+ }
205
+ case ValueType . Type :
206
+ return "" ;
207
+ default :
208
+ throw new ArgumentOutOfRangeException ( ) ;
209
+ }
210
+ }
48
211
}
49
212
}
0 commit comments