-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOpenEngine_UML.drawio
More file actions
419 lines (377 loc) · 37.6 KB
/
Copy pathOpenEngine_UML.drawio
File metadata and controls
419 lines (377 loc) · 37.6 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
<?xml version="1.0" encoding="UTF-8"?>
<mxfile host="app.diagrams.net" modified="2024-01-06T18:00:00.000Z" agent="Mozilla/5.0" etag="example" version="21.7.5" type="device">
<diagram name="OpenEngine UML" id="open-engine-uml">
<mxGraphModel dx="1200" dy="800" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<!-- ==================== MATH UTILS ==================== -->
<!-- Vector3 -->
<mxCell id="vector3" value="<b>Vector3</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
<mxGeometry x="40" y="40" width="200" height="170" as="geometry"/>
</mxCell>
<mxCell id="vector3-attr" value="+ x: float
+ y: float
+ z: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="vector3" vertex="1">
<mxGeometry y="26" width="200" height="54" as="geometry"/>
</mxCell>
<mxCell id="vector3-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="vector3" vertex="1">
<mxGeometry y="80" width="200" height="8" as="geometry"/>
</mxCell>
<mxCell id="vector3-meth" value="+ operator+(Vector3): Vector3
+ operator-(Vector3): Vector3
+ operator*(float): Vector3
+ normalized(): Vector3" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="vector3" vertex="1">
<mxGeometry y="88" width="200" height="82" as="geometry"/>
</mxCell>
<!-- Vector2 -->
<mxCell id="vector2" value="<b>Vector2</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
<mxGeometry x="260" y="40" width="160" height="90" as="geometry"/>
</mxCell>
<mxCell id="vector2-attr" value="+ x: float
+ y: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="vector2" vertex="1">
<mxGeometry y="26" width="160" height="34" as="geometry"/>
</mxCell>
<mxCell id="vector2-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="vector2" vertex="1">
<mxGeometry y="60" width="160" height="8" as="geometry"/>
</mxCell>
<mxCell id="vector2-meth" value="+ Vector2()
+ Vector2(x, y)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="vector2" vertex="1">
<mxGeometry y="68" width="160" height="22" as="geometry"/>
</mxCell>
<!-- Color -->
<mxCell id="color" value="<b>Color</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1">
<mxGeometry x="260" y="150" width="160" height="110" as="geometry"/>
</mxCell>
<mxCell id="color-attr" value="+ r: float
+ g: float
+ b: float
+ a: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="color" vertex="1">
<mxGeometry y="26" width="160" height="64" as="geometry"/>
</mxCell>
<mxCell id="color-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="color" vertex="1">
<mxGeometry y="90" width="160" height="8" as="geometry"/>
</mxCell>
<mxCell id="color-meth" value="" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="color" vertex="1">
<mxGeometry y="98" width="160" height="12" as="geometry"/>
</mxCell>
<!-- ==================== SHADER ==================== -->
<mxCell id="shader" value="<b>Shader</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="480" y="40" width="280" height="200" as="geometry"/>
</mxCell>
<mxCell id="shader-attr" value="+ ID: unsigned int" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="shader" vertex="1">
<mxGeometry y="26" width="280" height="24" as="geometry"/>
</mxCell>
<mxCell id="shader-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="shader" vertex="1">
<mxGeometry y="50" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="shader-meth" value="+ Shader(vertexPath, fragmentPath)
+ use(): void
+ setBool(name, value): void
+ setInt(name, value): void
+ setFloat(name, value): void
+ setVec3(name, x, y, z): void
+ setVec3(name, Vector3): void
+ setMat4(name, mat): void
- checkCompileErrors(shader, type): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="shader" vertex="1">
<mxGeometry y="58" width="280" height="142" as="geometry"/>
</mxCell>
<!-- ==================== MATERIAL ==================== -->
<mxCell id="material" value="<b>Material</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="480" y="280" width="280" height="120" as="geometry"/>
</mxCell>
<mxCell id="material-attr" value="+ textureID: unsigned int
+ shader: shared_ptr<Shader>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="material" vertex="1">
<mxGeometry y="26" width="280" height="44" as="geometry"/>
</mxCell>
<mxCell id="material-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="material" vertex="1">
<mxGeometry y="70" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="material-meth" value="+ Material(texID, shader)
+ bind(): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="material" vertex="1">
<mxGeometry y="78" width="280" height="42" as="geometry"/>
</mxCell>
<!-- ==================== MESH ==================== -->
<mxCell id="mesh" value="<b>Mesh</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="40" y="280" width="230" height="100" as="geometry"/>
</mxCell>
<mxCell id="mesh-attr" value="+ vertices: vector<float>
+ indices: vector<unsigned int>
+ material: shared_ptr<Material>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="mesh" vertex="1">
<mxGeometry y="26" width="230" height="54" as="geometry"/>
</mxCell>
<mxCell id="mesh-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="mesh" vertex="1">
<mxGeometry y="80" width="230" height="8" as="geometry"/>
</mxCell>
<mxCell id="mesh-meth" value="" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="mesh" vertex="1">
<mxGeometry y="88" width="230" height="12" as="geometry"/>
</mxCell>
<!-- ==================== MESH GENERATOR ==================== -->
<mxCell id="meshgen" value="<b>MeshGenerator</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="40" y="420" width="280" height="120" as="geometry"/>
</mxCell>
<mxCell id="meshgen-attr" value="«static»" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontStyle=2" parent="meshgen" vertex="1">
<mxGeometry y="26" width="280" height="20" as="geometry"/>
</mxCell>
<mxCell id="meshgen-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="meshgen" vertex="1">
<mxGeometry y="46" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="meshgen-meth" value="+ generateCube(position): Mesh
+ generateSphere(radius, sectors, stacks, pos): Mesh
+ generateQuadSphere(radius, subdiv, pos): Mesh
+ generatePlane(width, depth, pos): Mesh" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="meshgen" vertex="1">
<mxGeometry y="54" width="280" height="66" as="geometry"/>
</mxCell>
<!-- ==================== MESH LOADER ==================== -->
<mxCell id="meshloader" value="<b>MeshLoader</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="40" y="570" width="280" height="90" as="geometry"/>
</mxCell>
<mxCell id="meshloader-attr" value="«static»" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontStyle=2" parent="meshloader" vertex="1">
<mxGeometry y="26" width="280" height="20" as="geometry"/>
</mxCell>
<mxCell id="meshloader-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="meshloader" vertex="1">
<mxGeometry y="46" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="meshloader-meth" value="+ loadFromFile(path, position): Mesh" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="meshloader" vertex="1">
<mxGeometry y="54" width="280" height="36" as="geometry"/>
</mxCell>
<!-- ==================== CAMERA ==================== -->
<mxCell id="camera" value="<b>Camera</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="820" y="40" width="280" height="200" as="geometry"/>
</mxCell>
<mxCell id="camera-attr" value="+ Position: Vector3
+ Front: Vector3
+ Up: Vector3
+ Right: Vector3
+ WorldUp: Vector3
+ Yaw: float
+ Pitch: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="camera" vertex="1">
<mxGeometry y="26" width="280" height="94" as="geometry"/>
</mxCell>
<mxCell id="camera-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="camera" vertex="1">
<mxGeometry y="120" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="camera-meth" value="+ Camera(position, up, yaw, pitch)
+ GetViewMatrix(outView): void
+ ProcessKeyboard(direction, deltaTime): void
+ ProcessMouseMovement(xoffset, yoffset): void
- updateCameraVectors(): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="camera" vertex="1">
<mxGeometry y="128" width="280" height="72" as="geometry"/>
</mxCell>
<!-- ==================== SCENE OBJECT ==================== -->
<mxCell id="sceneobject" value="<b>SceneObject</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="820" y="280" width="280" height="350" as="geometry"/>
</mxCell>
<mxCell id="sceneobject-attr" value="+ name: string
+ type: ObjectType
+ position: Vector3
+ rotation: Vector3
+ scale: Vector3
+ mesh: Mesh
+ VAO, VBO, EBO: unsigned int
+ material: shared_ptr<Material>
+ isTransparent: bool
+ opacity: float
+ texturePath: string
+ normalMapPath: string
+ modelPath: string
+ subdivisions: int
+ isLoading: bool
+ lightColor: Vector3
+ intensity: float
+ constant, linear, quadratic: float" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="sceneobject" vertex="1">
<mxGeometry y="26" width="280" height="274" as="geometry"/>
</mxCell>
<mxCell id="sceneobject-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="sceneobject" vertex="1">
<mxGeometry y="300" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="sceneobject-meth" value="+ SceneObject()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="sceneobject" vertex="1">
<mxGeometry y="308" width="280" height="42" as="geometry"/>
</mxCell>
<!-- ==================== SKYBOX ==================== -->
<mxCell id="skybox" value="<b>Skybox</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#b1ddf0;strokeColor=#10739e;" parent="1" vertex="1">
<mxGeometry x="820" y="580" width="280" height="170" as="geometry"/>
</mxCell>
<mxCell id="skybox-attr" value="- VAO, VBO: unsigned int
- cubemapTexture: unsigned int
- cubemapTexture2: unsigned int
- skyboxShader: shared_ptr<Shader>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="skybox" vertex="1">
<mxGeometry y="26" width="280" height="64" as="geometry"/>
</mxCell>
<mxCell id="skybox-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="skybox" vertex="1">
<mxGeometry y="90" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="skybox-meth" value="+ Skybox()
+ ~Skybox()
+ init(crossPath): void
+ setSecondaryCubemap(crossPath): void
+ draw(projection, view, blendFactor): void
+ cleanup(): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="skybox" vertex="1">
<mxGeometry y="98" width="280" height="72" as="geometry"/>
</mxCell>
<!-- ==================== DIRECTIONAL LIGHT ==================== -->
<mxCell id="dirlight" value="<b>DirectionalLight</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="480" y="450" width="200" height="110" as="geometry"/>
</mxCell>
<mxCell id="dirlight-attr" value="+ direction: Vector3
+ color: Vector3
+ intensity: float
+ rotation: Vector3" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="dirlight" vertex="1">
<mxGeometry y="26" width="200" height="64" as="geometry"/>
</mxCell>
<mxCell id="dirlight-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="dirlight" vertex="1">
<mxGeometry y="90" width="200" height="8" as="geometry"/>
</mxCell>
<mxCell id="dirlight-meth" value="" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="dirlight" vertex="1">
<mxGeometry y="98" width="200" height="12" as="geometry"/>
</mxCell>
<!-- ==================== ENUMS ==================== -->
<!-- ObjectType -->
<mxCell id="objecttype" value="<b>«enum»<br>ObjectType</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="1160" y="280" width="140" height="140" as="geometry"/>
</mxCell>
<mxCell id="objecttype-val" value="Cube
Sphere
QuadSphere
Plane
Imported
PointLight" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="objecttype" vertex="1">
<mxGeometry y="40" width="140" height="100" as="geometry"/>
</mxCell>
<!-- Camera_Movement -->
<mxCell id="cameramovement" value="<b>«enum»<br>Camera_Movement</b>" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="1160" y="40" width="140" height="130" as="geometry"/>
</mxCell>
<mxCell id="cameramovement-val" value="FORWARD
BACKWARD
LEFT
RIGHT
UP
DOWN" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="cameramovement" vertex="1">
<mxGeometry y="40" width="140" height="90" as="geometry"/>
</mxCell>
<!-- ==================== RELATIONSHIPS ==================== -->
<!-- Material -> Shader (composition) -->
<mxCell id="rel1" value="" style="endArrow=diamondThin;endFill=1;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;entryX=0.5;entryY=1;" parent="1" source="material" target="shader" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="rel1-label" value="uses" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel1" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- SceneObject -> Mesh (composition) -->
<mxCell id="rel2" value="" style="endArrow=diamondThin;endFill=1;endSize=12;html=1;rounded=0;entryX=1;entryY=0.5;exitX=0;exitY=0.3;" parent="1" source="sceneobject" target="mesh" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="400" y="358"/>
<mxPoint x="400" y="330"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rel2-label" value="has" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel2" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- SceneObject -> Material -->
<mxCell id="rel3" value="" style="endArrow=diamondThin;endFill=0;endSize=12;html=1;rounded=0;entryX=1;entryY=0.5;exitX=0;exitY=0.6;" parent="1" source="sceneobject" target="material" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="780" y="436"/>
<mxPoint x="780" y="340"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rel3-label" value="has" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel3" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- SceneObject -> ObjectType -->
<mxCell id="rel4" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;dashed=1;exitX=1;exitY=0.2;entryX=0;entryY=0.5;" parent="1" source="sceneobject" target="objecttype" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="rel4-label" value="«uses»" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel4" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- Camera -> Camera_Movement -->
<mxCell id="rel5" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;dashed=1;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" parent="1" source="camera" target="cameramovement" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="rel5-label" value="«uses»" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel5" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- MeshGenerator -> Mesh (creates) -->
<mxCell id="rel6" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;dashed=1;exitX=0.5;exitY=0;entryX=0.5;entryY=1;" parent="1" source="meshgen" target="mesh" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="rel6-label" value="«creates»" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel6" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- MeshLoader -> Mesh (creates) -->
<mxCell id="rel7" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;dashed=1;exitX=1;exitY=0;entryX=0;entryY=1;" parent="1" source="meshloader" target="mesh" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="350" y="570"/>
<mxPoint x="350" y="380"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rel7-label" value="«creates»" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel7" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- Skybox -> Shader -->
<mxCell id="rel8" value="" style="endArrow=diamondThin;endFill=0;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;entryX=1;entryY=1;" parent="1" source="skybox" target="shader" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="960" y="260"/>
<mxPoint x="760" y="260"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="rel8-label" value="uses" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel8" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- Mesh -> Material -->
<mxCell id="rel9" value="" style="endArrow=diamondThin;endFill=0;endSize=12;html=1;rounded=0;exitX=1;exitY=0.5;entryX=0;entryY=0.5;" parent="1" source="mesh" target="material" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="rel9-label" value="has" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" parent="rel9" vertex="1" connectable="0">
<mxGeometry x="-0.2" y="1" relative="1" as="geometry">
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<!-- Package labels -->
<mxCell id="pkg-math" value="math_utils.h" style="text;html=1;strokeColor=#6c8ebf;fillColor=#dae8fc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="130" y="10" width="90" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-shader" value="shader.h" style="text;html=1;strokeColor=#82b366;fillColor=#d5e8d4;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="575" y="10" width="90" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-mesh" value="mesh.h" style="text;html=1;strokeColor=#9673a6;fillColor=#e1d5e7;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="110" y="250" width="90" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-camera" value="camera.h" style="text;html=1;strokeColor=#b85450;fillColor=#f8cecc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="915" y="10" width="90" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-scene" value="sceneObject.h" style="text;html=1;strokeColor=#d79b00;fillColor=#ffe6cc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="905" y="250" width="100" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-skybox" value="skybox.h" style="text;html=1;strokeColor=#10739e;fillColor=#b1ddf0;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="915" y="550" width="90" height="20" as="geometry"/>
</mxCell>
<mxCell id="pkg-main" value="main.cpp" style="text;html=1;strokeColor=#d6b656;fillColor=#fff2cc;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=1;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="530" y="420" width="100" height="20" as="geometry"/>
</mxCell>
<!-- ==================== NEW CLASSES (ADDED) ==================== -->
<!-- Scene -->
<mxCell id="scene" value="<b>Scene</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
<mxGeometry x="480" y="580" width="230" height="150" as="geometry"/>
</mxCell>
<mxCell id="scene-attr" value="+ objects: vector<SceneObject>
+ mainLight: DirectionalLight" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="scene" vertex="1">
<mxGeometry y="26" width="230" height="44" as="geometry"/>
</mxCell>
<mxCell id="scene-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="scene" vertex="1">
<mxGeometry y="70" width="230" height="8" as="geometry"/>
</mxCell>
<mxCell id="scene-meth" value="+ Scene()
+ clear(): void
+ addObject(obj): void
+ removeObject(index): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="scene" vertex="1">
<mxGeometry y="78" width="230" height="72" as="geometry"/>
</mxCell>
<!-- AsyncMeshLoader -->
<mxCell id="asyncloader" value="<b>AsyncMeshLoader</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1">
<mxGeometry x="40" y="680" width="350" height="160" as="geometry"/>
</mxCell>
<mxCell id="asyncloader-attr" value="- pendingLoads: vector<PendingMeshLoad>
- nextTaskId: atomic<size_t>" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="asyncloader" vertex="1">
<mxGeometry y="26" width="350" height="44" as="geometry"/>
</mxCell>
<mxCell id="asyncloader-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="asyncloader" vertex="1">
<mxGeometry y="70" width="350" height="8" as="geometry"/>
</mxCell>
<mxCell id="asyncloader-meth" value="+ loadMeshAsync(path, name, pos, ...): size_t
+ generateMeshAsync(type, name, pos, ...): size_t
+ pollCompletedLoads(): vector<AsyncMeshResult>
+ hasPendingLoads(): bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="asyncloader" vertex="1">
<mxGeometry y="78" width="350" height="82" as="geometry"/>
</mxCell>
<!-- EditorGUI -->
<mxCell id="editorgui" value="<b>EditorGUI</b>" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=0;marginBottom=0;fillColor=#f5f5f5;strokeColor=#666666;" parent="1" vertex="1">
<mxGeometry x="1350" y="40" width="230" height="230" as="geometry"/>
</mxCell>
<mxCell id="editorgui-attr" value="+ wireframe: bool
+ showGizmos: bool
+ selectedObjectIndex: int
- deps: Dependencies" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="editorgui" vertex="1">
<mxGeometry y="26" width="230" height="74" as="geometry"/>
</mxCell>
<mxCell id="editorgui-sep" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;points=[];portConstraint=eastwest;" parent="editorgui" vertex="1">
<mxGeometry y="100" width="230" height="8" as="geometry"/>
</mxCell>
<mxCell id="editorgui-meth" value="+ EditorGUI(deps)
+ render(deltaTime, drawCalls): void
+ refreshAssets(): void
- drawEngineControls(): void
- drawAssetBrowser(): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="editorgui" vertex="1">
<mxGeometry y="108" width="230" height="122" as="geometry"/>
</mxCell>
<!-- ==================== NEW RELATIONSHIPS ==================== -->
<!-- Scene -> SceneObject -->
<mxCell id="rel_scene_obj" value="" style="endArrow=diamondThin;endFill=1;endSize=12;html=1;rounded=0;exitX=1;exitY=0.5;entryX=0.5;entryY=1;" parent="1" source="scene" target="sceneobject" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="960" y="655"/>
</Array>
</mxGeometry>
</mxCell>
<!-- Scene -> DirectionalLight -->
<mxCell id="rel_scene_light" value="" style="endArrow=diamondThin;endFill=1;endSize=12;html=1;rounded=0;exitX=0.5;exitY=0;entryX=0.5;entryY=1;" parent="1" source="scene" target="dirlight" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- AsyncLoader -> MeshLoader (uses) -->
<mxCell id="rel_async_load" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;dashed=1;exitX=0.5;exitY=0;entryX=0.5;entryY=1;" parent="1" source="asyncloader" target="meshloader" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<!-- EditorGUI -> Scene (uses) -->
<mxCell id="rel_gui_scene" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;exitX=0;exitY=0.75;entryX=1;entryY=0.5;" parent="1" source="editorgui" target="scene" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="1300" y="212"/>
<mxPoint x="1300" y="655"/>
</Array>
</mxGeometry>
</mxCell>
<!-- EditorGUI -> Camera (uses) -->
<mxCell id="rel_gui_cam" value="" style="endArrow=open;endFill=0;endSize=12;html=1;rounded=0;exitX=0;exitY=0.25;entryX=1;entryY=0.5;" parent="1" source="editorgui" target="camera" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>