diff --git a/.gitignore b/.gitignore index ea6abd8e83..b87c6d2c07 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,6 @@ Source/Generated/**/* Packages/SampleGame/**/* -Data/Models/Testbed/**/* Data/Models/Sponza/**/* Data/Models/NewSponza/**/* Data/Models/lostempire/**/* diff --git a/Config/EngineConfig.json b/Config/EngineConfig.json index bc373dbf7d..8498e7ce1e 100644 --- a/Config/EngineConfig.json +++ b/Config/EngineConfig.json @@ -4,8 +4,8 @@ "Enabled": false }, "HBAO": { - "Radius": 1.500000, - "Power": 2.500000, + "Radius": 1.5, + "Power": 2.5, "UseTemporalBlending": false, "Enabled": true }, @@ -19,16 +19,17 @@ "RayTracedGI": false, "RayTracingEnabled": true, "IndirectRendering": true, + "DepthPrepass": true, "ParallelCollection": true, "SSR": { "Enabled": true, "Quality": 2, "RoughnessScattering": false, "ConeTracing": true, - "RayStep": 1.500000, + "RayStep": 1.5, "NumIterations": 64, - "EyeFade": [0.990000, 0.995000], - "ScreenEdgeFade": [0.990000, 0.995000], + "EyeFade": [0.99, 0.995], + "ScreenEdgeFade": [0.99, 0.995], "ResolutionScale": 1 }, "EnvGrid": { @@ -49,10 +50,11 @@ "AO": false }, "Vulkan": { - "DebugLayers": true + "DebugLayers": false, + "TimelineSemaphores": true }, "RayTracing": { - "Enabled": false, + "Enabled": true, "Reflections": { "Enabled": false }, @@ -66,10 +68,13 @@ }, "Editor": { "Camera": { - "MoveSensitivity": 1, - "LookSensitivity": 1 + "MovementSpeed": 10, + "LookSensitivity": 50 } }, + "Threads": { + "NumForegroundWorkers": 3 + }, "System": { "SelectedGpu": { "Index": 1 @@ -80,4 +85,4 @@ "NumSamples": 1, "MaxTexelsPerFrame": 262144 } -} \ No newline at end of file +} diff --git a/Config/GlobalConfig.json b/Config/GlobalConfig.json index 4e55867789..5681ff5574 100644 --- a/Config/GlobalConfig.json +++ b/Config/GlobalConfig.json @@ -1,7 +1,7 @@ { "App": { "Name": "DefaultGame", - "Args": "-ResX=1920 -ResY=1080 -Profile=true -TraceURL=http://localhost:8000/trace", + "Args": "-ResX=1920 -ResY=1080 -Profile=false -HighDPI=true -TraceURL=http://localhost:8000/trace", "Cache": { "BaseDirectory": "Cache", "PageSize": 268435456 @@ -10,4 +10,4 @@ "Logging": { "Verbose": false } -} \ No newline at end of file +} diff --git a/Data/Models/testbed/carpet1-ue/carpet1-Height.png b/Data/Models/testbed/carpet1-ue/carpet1-Height.png new file mode 100644 index 0000000000..d6eb3afccf Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-Height.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-Metallic.png b/Data/Models/testbed/carpet1-ue/carpet1-Metallic.png new file mode 100644 index 0000000000..e37199d8da Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-Metallic.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-Normal-dx.png b/Data/Models/testbed/carpet1-ue/carpet1-Normal-dx.png new file mode 100644 index 0000000000..b3e05a9b81 Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-Normal-dx.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-Roughness.png b/Data/Models/testbed/carpet1-ue/carpet1-Roughness.png new file mode 100644 index 0000000000..88549ed5ff Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-Roughness.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-albedo.png b/Data/Models/testbed/carpet1-ue/carpet1-albedo.png new file mode 100644 index 0000000000..8a77cdd42b Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-albedo.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-ao.png b/Data/Models/testbed/carpet1-ue/carpet1-ao.png new file mode 100644 index 0000000000..9ca8c7688d Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-ao.png differ diff --git a/Data/Models/testbed/carpet1-ue/carpet1-preview.jpg b/Data/Models/testbed/carpet1-ue/carpet1-preview.jpg new file mode 100644 index 0000000000..8cd142a0dc Binary files /dev/null and b/Data/Models/testbed/carpet1-ue/carpet1-preview.jpg differ diff --git a/Data/Models/testbed/testbed.mtl b/Data/Models/testbed/testbed.mtl new file mode 100644 index 0000000000..796ca07b75 --- /dev/null +++ b/Data/Models/testbed/testbed.mtl @@ -0,0 +1,258 @@ +# Blender MTL File: 'testbed.blend' +# Material Count: 25 + +newmtl white +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.002 +Ns 506.250000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.003 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.004 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.750000 0.750000 0.750000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.005 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.006 +Ns 43.642096 +Ka 1.000000 1.000000 1.000000 +Kd 0.839168 1.000000 0.793228 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl blue +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 0.022015 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.009 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.000000 0.360966 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.010 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.023105 0.800000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.011 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.000000 0.001264 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.012 +Ns 21.026737 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.013 +Ns 21.026737 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.014 +Ns 21.026737 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.015 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.016 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.250000 0.000000 1.000000 +Ks 0.750000 0.750000 0.750000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.017 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 0.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.018 +Ns 506.250000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 1.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.019 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.024 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 3 + +newmtl Material.025 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.026 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.027 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.028 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.029 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 + +map_kD mahogfloor_basecolor.png +map_bump mahogfloor_normal.png +map_nS mahogfloor_roughness.png +map_ao mahogfloor_AO.png +map_height mahogfloor_Height.png +Ni 1.450000 +d 1.000000 +illum 2 + +newmtl Material.030 +Ns 225.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 0.022015 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 diff --git a/Data/Models/testbed/testbed.obj b/Data/Models/testbed/testbed.obj new file mode 100644 index 0000000000..51fc037839 --- /dev/null +++ b/Data/Models/testbed/testbed.obj @@ -0,0 +1,5183 @@ +# Blender v3.0.1 OBJ File: 'testbed.blend' +# www.blender.org +mtllib testbed.mtl +o Plane +v -10.000000 0.000000 10.000000 +v 10.000000 0.000000 10.000000 +v -10.000000 0.000000 -10.000000 +v 10.000000 0.000000 -10.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vn 0.0000 1.0000 0.0000 +usemtl Material.006 +s off +f 2/1/1 3/2/1 1/3/1 +f 2/1/1 4/4/1 3/2/1 +o Cube_Cube.001 +v -10.500000 0.000000 10.000000 +v -10.500000 10.000000 10.000000 +v -10.500000 0.000000 -10.000000 +v -10.500000 10.000000 -10.000000 +v -9.500000 0.000000 10.000000 +v -9.500000 10.000000 10.000000 +v -9.500000 0.000000 -10.000000 +v -9.500000 10.000000 -10.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.012 +s off +f 6/5/2 7/6/2 5/7/2 +f 8/8/3 11/9/3 7/6/3 +f 12/10/4 9/11/4 11/9/4 +f 10/12/5 5/13/5 9/11/5 +f 11/9/6 5/14/6 7/15/6 +f 8/16/7 10/12/7 12/10/7 +f 6/5/2 8/8/2 7/6/2 +f 8/8/3 12/10/3 11/9/3 +f 12/10/4 10/12/4 9/11/4 +f 10/12/5 6/17/5 5/13/5 +f 11/9/6 9/11/6 5/14/6 +f 8/16/7 6/18/7 10/12/7 +o Cube.001_Cube.002 +v -9.500000 0.000000 10.000000 +v -9.500000 0.500000 10.000000 +v -9.500000 0.000000 6.000000 +v -9.500000 0.500000 6.000000 +v -3.500000 0.000000 10.000000 +v -3.500000 0.500000 10.000000 +v -3.500000 0.000000 6.000000 +v -3.500000 0.500000 6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl white +s off +f 14/19/8 15/20/8 13/21/8 +f 16/22/9 19/23/9 15/20/9 +f 20/24/10 17/25/10 19/23/10 +f 18/26/11 13/27/11 17/25/11 +f 19/23/12 13/28/12 15/29/12 +f 16/30/13 18/26/13 20/24/13 +f 14/19/8 16/22/8 15/20/8 +f 16/22/9 20/24/9 19/23/9 +f 20/24/10 18/26/10 17/25/10 +f 18/26/11 14/31/11 13/27/11 +f 19/23/12 17/25/12 13/28/12 +f 16/30/13 14/32/13 18/26/13 +o Cube.002_Cube.003 +v -9.500000 0.000000 6.000000 +v -9.500000 0.500000 6.000000 +v -9.500000 0.000000 2.000000 +v -9.500000 0.500000 2.000000 +v -3.500000 0.000000 6.000000 +v -3.500000 0.500000 6.000000 +v -3.500000 0.000000 2.000000 +v -3.500000 0.500000 2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.002 +s off +f 22/33/14 23/34/14 21/35/14 +f 24/36/15 27/37/15 23/34/15 +f 28/38/16 25/39/16 27/37/16 +f 26/40/17 21/41/17 25/39/17 +f 27/37/18 21/42/18 23/43/18 +f 24/44/19 26/40/19 28/38/19 +f 22/33/14 24/36/14 23/34/14 +f 24/36/15 28/38/15 27/37/15 +f 28/38/16 26/40/16 25/39/16 +f 26/40/17 22/45/17 21/41/17 +f 27/37/18 25/39/18 21/42/18 +f 24/44/19 22/46/19 26/40/19 +o Cube.003_Cube.004 +v -9.500000 0.000000 2.000000 +v -9.500000 0.500000 2.000000 +v -9.500000 0.000000 -2.000000 +v -9.500000 0.500000 -2.000000 +v -3.500000 0.000000 2.000000 +v -3.500000 0.500000 2.000000 +v -3.500000 0.000000 -2.000000 +v -3.500000 0.500000 -2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.003 +s off +f 30/47/20 31/48/20 29/49/20 +f 32/50/21 35/51/21 31/48/21 +f 36/52/22 33/53/22 35/51/22 +f 34/54/23 29/55/23 33/53/23 +f 35/51/24 29/56/24 31/57/24 +f 32/58/25 34/54/25 36/52/25 +f 30/47/20 32/50/20 31/48/20 +f 32/50/21 36/52/21 35/51/21 +f 36/52/22 34/54/22 33/53/22 +f 34/54/23 30/59/23 29/55/23 +f 35/51/24 33/53/24 29/56/24 +f 32/58/25 30/60/25 34/54/25 +o Cube.004_Cube.005 +v -9.500000 0.000000 -2.000000 +v -9.500000 0.500000 -2.000000 +v -9.500000 0.000000 -6.000000 +v -9.500000 0.500000 -6.000000 +v -3.500000 0.000000 -2.000000 +v -3.500000 0.500000 -2.000000 +v -3.500000 0.000000 -6.000000 +v -3.500000 0.500000 -6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.004 +s off +f 38/61/26 39/62/26 37/63/26 +f 40/64/27 43/65/27 39/62/27 +f 44/66/28 41/67/28 43/65/28 +f 42/68/29 37/69/29 41/67/29 +f 43/65/30 37/70/30 39/71/30 +f 40/72/31 42/68/31 44/66/31 +f 38/61/26 40/64/26 39/62/26 +f 40/64/27 44/66/27 43/65/27 +f 44/66/28 42/68/28 41/67/28 +f 42/68/29 38/73/29 37/69/29 +f 43/65/30 41/67/30 37/70/30 +f 40/72/31 38/74/31 42/68/31 +o Cube.005_Cube.006 +v -9.500000 0.000000 -6.000000 +v -9.500000 0.500000 -6.000000 +v -9.500000 0.000000 -10.000000 +v -9.500000 0.500000 -10.000000 +v -3.500000 0.000000 -6.000000 +v -3.500000 0.500000 -6.000000 +v -3.500000 0.000000 -10.000000 +v -3.500000 0.500000 -10.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.005 +s off +f 46/75/32 47/76/32 45/77/32 +f 48/78/33 51/79/33 47/76/33 +f 52/80/34 49/81/34 51/79/34 +f 50/82/35 45/83/35 49/81/35 +f 51/79/36 45/84/36 47/85/36 +f 48/86/37 50/82/37 52/80/37 +f 46/75/32 48/78/32 47/76/32 +f 48/78/33 52/80/33 51/79/33 +f 52/80/34 50/82/34 49/81/34 +f 50/82/35 46/87/35 45/83/35 +f 51/79/36 49/81/36 45/84/36 +f 48/86/37 46/88/37 50/82/37 +o Cube.007_Cube.008 +v -6.807407 0.514815 8.307407 +v -6.807407 0.692593 8.485186 +v -6.985185 0.692593 8.307407 +v -6.807407 1.307407 8.485186 +v -6.807407 1.485185 8.307407 +v -6.985185 1.307407 8.307407 +v -6.807407 0.514815 7.692593 +v -6.985185 0.692593 7.692593 +v -6.807407 0.692593 7.514815 +v -6.807407 1.485185 7.692593 +v -6.807407 1.307407 7.514815 +v -6.985185 1.307407 7.692593 +v -6.192593 0.514815 8.307407 +v -6.014815 0.692593 8.307407 +v -6.192593 0.692593 8.485186 +v -6.192593 1.485185 8.307407 +v -6.192593 1.307407 8.485186 +v -6.014815 1.307407 8.307407 +v -6.192593 0.514815 7.692593 +v -6.192593 0.692593 7.514815 +v -6.014815 0.692593 7.692593 +v -6.192593 1.485185 7.692593 +v -6.014815 1.307407 7.692593 +v -6.192593 1.307407 7.514815 +v -6.976924 0.599204 8.306655 +v -6.953125 0.546875 8.306250 +v -6.900796 0.523076 8.306655 +v -6.806655 0.523076 8.400796 +v -6.806250 0.546875 8.453125 +v -6.806655 0.599204 8.476924 +v -6.900796 0.693345 8.476924 +v -6.953125 0.693750 8.453125 +v -6.976924 0.693345 8.400796 +v -6.976924 1.306655 8.400796 +v -6.953125 1.306250 8.453125 +v -6.900796 1.306655 8.476924 +v -6.806655 1.400796 8.476924 +v -6.806250 1.453125 8.453125 +v -6.806655 1.476924 8.400796 +v -6.900796 1.476924 8.306655 +v -6.953125 1.453125 8.306250 +v -6.976924 1.400796 8.306655 +v -6.806655 0.599204 7.523076 +v -6.806250 0.546875 7.546875 +v -6.806655 0.523076 7.599204 +v -6.900796 0.523076 7.693345 +v -6.953125 0.546875 7.693750 +v -6.976924 0.599204 7.693345 +v -6.976924 0.693345 7.599204 +v -6.953125 0.693750 7.546875 +v -6.900796 0.693345 7.523076 +v -6.976924 1.400796 7.693345 +v -6.953125 1.453125 7.693750 +v -6.900796 1.476924 7.693345 +v -6.806655 1.476924 7.599204 +v -6.806250 1.453125 7.546875 +v -6.806655 1.400796 7.523076 +v -6.900796 1.306655 7.523076 +v -6.953125 1.306250 7.546875 +v -6.976924 1.306655 7.599204 +v -6.193345 0.599204 8.476924 +v -6.193750 0.546875 8.453125 +v -6.193345 0.523076 8.400796 +v -6.099204 0.523076 8.306655 +v -6.046875 0.546875 8.306250 +v -6.023076 0.599204 8.306655 +v -6.023076 0.693345 8.400796 +v -6.046875 0.693750 8.453125 +v -6.099204 0.693345 8.476924 +v -6.023076 1.400796 8.306655 +v -6.046875 1.453125 8.306250 +v -6.099204 1.476924 8.306655 +v -6.193345 1.476924 8.400796 +v -6.193750 1.453125 8.453125 +v -6.193345 1.400796 8.476924 +v -6.099204 1.306655 8.476924 +v -6.046875 1.306250 8.453125 +v -6.023076 1.306655 8.400796 +v -6.023076 0.599204 7.693345 +v -6.046875 0.546875 7.693750 +v -6.099204 0.523076 7.693345 +v -6.193345 0.523076 7.599204 +v -6.193750 0.546875 7.546875 +v -6.193345 0.599204 7.523076 +v -6.099204 0.693345 7.523076 +v -6.046875 0.693750 7.546875 +v -6.023076 0.693345 7.599204 +v -6.193345 1.400796 7.523076 +v -6.193750 1.453125 7.546875 +v -6.193345 1.476924 7.599204 +v -6.099204 1.476924 7.693345 +v -6.046875 1.453125 7.693750 +v -6.023076 1.400796 7.693345 +v -6.023076 1.306655 7.599204 +v -6.046875 1.306250 7.546875 +v -6.099204 1.306655 7.523076 +v -6.807928 0.511169 7.832928 +v -6.808102 0.509954 8.000000 +v -6.807928 0.511169 8.167071 +v -6.988831 0.692072 8.167071 +v -6.990047 0.691898 8.000000 +v -6.988831 0.692072 7.832928 +v -6.807928 0.832928 8.488832 +v -6.808102 1.000000 8.490047 +v -6.807928 1.167072 8.488832 +v -6.988831 1.167072 8.307928 +v -6.990047 1.000000 8.308102 +v -6.988831 0.832928 8.307928 +v -6.807928 1.488831 8.167071 +v -6.808102 1.490046 8.000000 +v -6.807928 1.488831 7.832928 +v -6.988831 1.307928 7.832928 +v -6.990047 1.308102 8.000000 +v -6.988831 1.307928 8.167071 +v -6.807928 1.167072 7.511169 +v -6.808102 1.000000 7.509953 +v -6.807928 0.832928 7.511169 +v -6.988831 0.832928 7.692072 +v -6.990047 1.000000 7.691898 +v -6.988831 1.167072 7.692072 +v -6.332928 0.511169 7.692072 +v -6.500000 0.509954 7.691898 +v -6.667072 0.511169 7.692072 +v -6.667072 0.692072 7.511169 +v -6.500000 0.691898 7.509953 +v -6.332928 0.692072 7.511169 +v -6.667072 1.488831 7.692072 +v -6.500000 1.490046 7.691898 +v -6.332928 1.488831 7.692072 +v -6.332928 1.307928 7.511169 +v -6.500000 1.308102 7.509953 +v -6.667072 1.307928 7.511169 +v -6.011169 1.167072 7.692072 +v -6.009953 1.000000 7.691898 +v -6.011169 0.832928 7.692072 +v -6.192072 0.832928 7.511169 +v -6.191898 1.000000 7.509953 +v -6.192072 1.167072 7.511169 +v -6.192072 0.511169 8.167071 +v -6.191898 0.509954 8.000000 +v -6.192072 0.511169 7.832928 +v -6.011169 0.692072 7.832928 +v -6.009953 0.691898 8.000000 +v -6.011169 0.692072 8.167071 +v -6.192072 1.488831 7.832928 +v -6.191898 1.490046 8.000000 +v -6.192072 1.488831 8.167071 +v -6.011169 1.307928 8.167071 +v -6.009953 1.308102 8.000000 +v -6.011169 1.307928 7.832928 +v -6.192072 1.167072 8.488832 +v -6.191898 1.000000 8.490047 +v -6.192072 0.832928 8.488831 +v -6.011169 0.832928 8.307928 +v -6.009953 1.000000 8.308102 +v -6.011169 1.167072 8.307928 +v -6.667072 0.511169 8.307928 +v -6.500000 0.509954 8.308102 +v -6.332928 0.511169 8.307928 +v -6.332928 0.692072 8.488832 +v -6.500000 0.691898 8.490047 +v -6.667072 0.692072 8.488832 +v -6.332928 1.488831 8.307928 +v -6.500000 1.490046 8.308102 +v -6.667072 1.488831 8.307928 +v -6.667072 1.307928 8.488832 +v -6.500000 1.308102 8.490047 +v -6.332928 1.307928 8.488831 +v -6.332716 0.832717 8.493063 +v -6.332646 1.000000 8.494473 +v -6.332716 1.167283 8.493063 +v -6.500000 0.832646 8.494473 +v -6.500000 1.000000 8.495949 +v -6.500000 1.167354 8.494473 +v -6.667284 0.832717 8.493063 +v -6.667354 1.000000 8.494473 +v -6.667284 1.167283 8.493063 +v -6.006937 0.832717 7.832716 +v -6.005527 1.000000 7.832646 +v -6.006937 1.167283 7.832716 +v -6.005527 0.832646 8.000000 +v -6.004051 1.000000 8.000000 +v -6.005527 1.167354 8.000000 +v -6.006937 0.832717 8.167283 +v -6.005527 1.000000 8.167354 +v -6.006937 1.167283 8.167283 +v -6.332716 1.493063 7.832716 +v -6.500000 1.494473 7.832646 +v -6.667284 1.493063 7.832716 +v -6.332646 1.494473 8.000000 +v -6.500000 1.495949 8.000000 +v -6.667354 1.494473 8.000000 +v -6.332716 1.493063 8.167283 +v -6.500000 1.494473 8.167354 +v -6.667284 1.493063 8.167283 +v -6.993063 0.832717 8.167283 +v -6.994473 1.000000 8.167354 +v -6.993063 1.167283 8.167283 +v -6.994473 0.832646 8.000000 +v -6.995949 1.000000 8.000000 +v -6.994473 1.167354 8.000000 +v -6.993063 0.832717 7.832716 +v -6.994473 1.000000 7.832646 +v -6.993063 1.167283 7.832716 +v -6.667284 0.832717 7.506937 +v -6.667354 1.000000 7.505527 +v -6.667284 1.167283 7.506937 +v -6.500000 0.832646 7.505527 +v -6.500000 1.000000 7.504051 +v -6.500000 1.167354 7.505527 +v -6.332716 0.832717 7.506937 +v -6.332646 1.000000 7.505527 +v -6.332716 1.167283 7.506937 +v -6.938542 0.561458 8.438541 +v -6.898997 0.529764 8.398996 +v -6.897217 0.551213 8.448788 +v -6.898997 0.601003 8.470236 +v -6.948788 0.602783 8.448788 +v -6.970236 0.601003 8.398996 +v -6.948787 0.551213 8.397217 +v -6.938541 1.438542 8.438541 +v -6.898997 1.398997 8.470236 +v -6.897217 1.448787 8.448788 +v -6.898997 1.470236 8.398996 +v -6.948788 1.448787 8.397217 +v -6.970236 1.398997 8.398996 +v -6.948787 1.397217 8.448788 +v -6.938542 0.561458 7.561458 +v -6.898997 0.529764 7.601003 +v -6.948788 0.551213 7.602783 +v -6.970236 0.601003 7.601003 +v -6.948788 0.602783 7.551212 +v -6.898997 0.601003 7.529764 +v -6.897217 0.551213 7.551213 +v -6.938541 1.438542 7.561458 +v -6.898997 1.470236 7.601003 +v -6.897217 1.448787 7.551212 +v -6.898997 1.398997 7.529764 +v -6.948788 1.397217 7.551213 +v -6.970236 1.398997 7.601003 +v -6.948788 1.448787 7.602783 +v -6.061458 0.561458 8.438541 +v -6.101003 0.529764 8.398996 +v -6.051212 0.551213 8.397217 +v -6.029764 0.601003 8.398996 +v -6.051212 0.602783 8.448788 +v -6.101003 0.601003 8.470236 +v -6.102783 0.551213 8.448788 +v -6.061459 1.438542 8.438541 +v -6.101003 1.470236 8.398996 +v -6.102783 1.448787 8.448788 +v -6.101003 1.398997 8.470236 +v -6.051212 1.397217 8.448788 +v -6.029764 1.398997 8.398996 +v -6.051212 1.448787 8.397217 +v -6.061458 0.561458 7.561458 +v -6.101003 0.529764 7.601003 +v -6.102783 0.551213 7.551212 +v -6.101003 0.601003 7.529764 +v -6.051212 0.602783 7.551212 +v -6.029764 0.601003 7.601003 +v -6.051213 0.551213 7.602783 +v -6.061458 1.438542 7.561459 +v -6.101003 1.470236 7.601003 +v -6.051212 1.448787 7.602783 +v -6.029764 1.398997 7.601003 +v -6.051213 1.397217 7.551212 +v -6.101003 1.398997 7.529764 +v -6.102783 1.448787 7.551212 +v -6.901813 0.520350 7.833234 +v -6.902152 0.519441 8.000000 +v -6.901813 0.520350 8.166766 +v -6.954883 0.545117 7.833398 +v -6.955469 0.544531 8.000000 +v -6.954883 0.545117 8.166601 +v -6.979650 0.598187 7.833234 +v -6.980559 0.597848 8.000000 +v -6.979650 0.598187 8.166766 +v -6.901813 0.833234 8.479650 +v -6.902152 1.000000 8.480559 +v -6.901813 1.166766 8.479650 +v -6.954883 0.833398 8.454883 +v -6.955469 1.000000 8.455469 +v -6.954883 1.166602 8.454883 +v -6.979650 0.833234 8.401813 +v -6.980559 1.000000 8.402152 +v -6.979650 1.166766 8.401813 +v -6.901813 1.479650 8.166766 +v -6.902152 1.480559 8.000000 +v -6.901813 1.479650 7.833234 +v -6.954883 1.454883 8.166601 +v -6.955469 1.455469 8.000000 +v -6.954883 1.454883 7.833398 +v -6.979650 1.401813 8.166766 +v -6.980559 1.402152 8.000000 +v -6.979650 1.401813 7.833234 +v -6.901813 1.166766 7.520350 +v -6.902152 1.000000 7.519441 +v -6.901813 0.833234 7.520350 +v -6.954883 1.166602 7.545117 +v -6.955469 1.000000 7.544531 +v -6.954883 0.833398 7.545117 +v -6.979650 1.166766 7.598187 +v -6.980559 1.000000 7.597848 +v -6.979650 0.833234 7.598187 +v -6.333234 0.520350 7.598187 +v -6.500000 0.519441 7.597848 +v -6.666766 0.520350 7.598187 +v -6.333398 0.545117 7.545117 +v -6.500000 0.544531 7.544531 +v -6.666602 0.545117 7.545117 +v -6.333234 0.598187 7.520350 +v -6.500000 0.597848 7.519441 +v -6.666766 0.598187 7.520350 +v -6.666766 1.479650 7.598187 +v -6.500000 1.480559 7.597848 +v -6.333234 1.479650 7.598187 +v -6.666602 1.454883 7.545117 +v -6.500000 1.455469 7.544531 +v -6.333398 1.454883 7.545117 +v -6.666766 1.401813 7.520350 +v -6.500000 1.402152 7.519441 +v -6.333234 1.401813 7.520350 +v -6.020350 1.166766 7.598187 +v -6.019441 1.000000 7.597848 +v -6.020350 0.833234 7.598187 +v -6.045117 1.166602 7.545117 +v -6.044531 1.000000 7.544531 +v -6.045117 0.833398 7.545117 +v -6.098187 1.166766 7.520350 +v -6.097848 1.000000 7.519441 +v -6.098187 0.833234 7.520350 +v -6.098187 0.520350 8.166766 +v -6.097848 0.519441 8.000000 +v -6.098187 0.520350 7.833234 +v -6.045117 0.545117 8.166601 +v -6.044531 0.544531 8.000000 +v -6.045117 0.545117 7.833398 +v -6.020350 0.598187 8.166766 +v -6.019441 0.597848 8.000000 +v -6.020350 0.598187 7.833234 +v -6.098187 1.479650 7.833234 +v -6.097848 1.480559 8.000000 +v -6.098187 1.479650 8.166766 +v -6.045117 1.454883 7.833398 +v -6.044531 1.455469 8.000000 +v -6.045117 1.454883 8.166601 +v -6.020350 1.401813 7.833234 +v -6.019441 1.402152 8.000000 +v -6.020350 1.401813 8.166766 +v -6.098187 1.166766 8.479650 +v -6.097848 1.000000 8.480559 +v -6.098187 0.833234 8.479650 +v -6.045117 1.166602 8.454883 +v -6.044531 1.000000 8.455469 +v -6.045117 0.833398 8.454883 +v -6.020350 1.166766 8.401813 +v -6.019441 1.000000 8.402152 +v -6.020350 0.833234 8.401813 +v -6.666766 0.520350 8.401813 +v -6.500000 0.519441 8.402152 +v -6.333234 0.520350 8.401813 +v -6.666602 0.545117 8.454883 +v -6.500000 0.544531 8.455469 +v -6.333398 0.545117 8.454883 +v -6.666766 0.598187 8.479650 +v -6.500000 0.597848 8.480559 +v -6.333234 0.598187 8.479650 +v -6.333234 1.479650 8.401813 +v -6.500000 1.480559 8.402152 +v -6.666766 1.479650 8.401813 +v -6.333398 1.454883 8.454883 +v -6.500000 1.455469 8.455469 +v -6.666602 1.454883 8.454883 +v -6.333234 1.401813 8.479650 +v -6.500000 1.402152 8.480559 +v -6.666766 1.401813 8.479650 +v -6.667284 0.506937 7.832716 +v -6.500000 0.505527 7.832646 +v -6.332716 0.506937 7.832716 +v -6.667354 0.505527 8.000000 +v -6.500000 0.504051 8.000000 +v -6.332646 0.505527 8.000000 +v -6.667284 0.506937 8.167283 +v -6.500000 0.505527 8.167354 +v -6.332716 0.506937 8.167283 +vt 0.443485 0.825977 +vt 0.497049 0.877778 +vt 0.443381 0.876910 +vt 0.548376 0.826149 +vt 0.497879 0.828820 +vt 0.443496 0.931489 +vt 0.548568 0.931300 +vt 0.497971 0.931597 +vt 0.387500 0.762500 +vt 0.387500 0.818750 +vt 0.443658 0.785417 +vt 0.554036 0.785460 +vt 0.499262 0.790278 +vt 0.612500 0.762500 +vt 0.588103 0.820739 +vt 0.545549 0.876903 +vt 0.588065 0.929084 +vt 0.612500 0.987500 +vt 0.556250 0.987500 +vt 0.500000 0.987500 +vt 0.443750 0.987500 +vt 0.387500 0.987500 +vt 0.387500 0.931250 +vt 0.387500 0.875000 +vt 0.450911 0.575911 +vt 0.500000 0.625000 +vt 0.453472 0.625000 +vt 0.549089 0.575911 +vt 0.500000 0.578472 +vt 0.450911 0.674089 +vt 0.549089 0.674089 +vt 0.500000 0.671528 +vt 0.387500 0.512500 +vt 0.410460 0.570747 +vt 0.445747 0.535460 +vt 0.554254 0.535460 +vt 0.500000 0.540278 +vt 0.612500 0.512500 +vt 0.589540 0.570747 +vt 0.546528 0.625000 +vt 0.589540 0.679254 +vt 0.612500 0.737500 +vt 0.554253 0.714540 +vt 0.500000 0.709722 +vt 0.445747 0.714540 +vt 0.387500 0.737500 +vt 0.410460 0.679254 +vt 0.415278 0.625000 +vt 0.700977 0.568750 +vt 0.752778 0.625000 +vt 0.703820 0.625000 +vt 0.806489 0.568750 +vt 0.751910 0.568750 +vt 0.700977 0.681250 +vt 0.806489 0.681250 +vt 0.751910 0.681250 +vt 0.637500 0.512500 +vt 0.660417 0.568750 +vt 0.693750 0.512500 +vt 0.806250 0.512500 +vt 0.750000 0.512500 +vt 0.862500 0.512500 +vt 0.862500 0.568750 +vt 0.806597 0.625000 +vt 0.862500 0.681250 +vt 0.862500 0.737500 +vt 0.806250 0.737500 +vt 0.750000 0.737500 +vt 0.693750 0.737500 +vt 0.637500 0.737500 +vt 0.660417 0.681250 +vt 0.665278 0.625000 +vt 0.443485 0.076190 +vt 0.497049 0.125174 +vt 0.443381 0.125119 +vt 0.548376 0.076375 +vt 0.497879 0.079102 +vt 0.443485 0.174277 +vt 0.548376 0.174104 +vt 0.497879 0.171549 +vt 0.387500 0.012500 +vt 0.387500 0.068750 +vt 0.443658 0.036849 +vt 0.554036 0.036895 +vt 0.499262 0.042014 +vt 0.612500 0.012500 +vt 0.588105 0.070877 +vt 0.545551 0.125125 +vt 0.588105 0.179259 +vt 0.612500 0.237500 +vt 0.554036 0.214540 +vt 0.499262 0.209722 +vt 0.443658 0.214583 +vt 0.387500 0.237500 +vt 0.387500 0.181250 +vt 0.387500 0.125000 +vt 0.443485 0.325738 +vt 0.497049 0.375000 +vt 0.443381 0.375000 +vt 0.548376 0.325911 +vt 0.497879 0.328472 +vt 0.443485 0.424262 +vt 0.548376 0.424089 +vt 0.497879 0.421528 +vt 0.387500 0.262500 +vt 0.387500 0.318750 +vt 0.443658 0.285417 +vt 0.554036 0.285460 +vt 0.499262 0.290278 +vt 0.612500 0.262500 +vt 0.588105 0.320747 +vt 0.545551 0.375000 +vt 0.588105 0.429254 +vt 0.612500 0.487500 +vt 0.554036 0.464540 +vt 0.499262 0.459722 +vt 0.443658 0.464583 +vt 0.387500 0.487500 +vt 0.387500 0.431250 +vt 0.387500 0.375000 +vt 0.149935 0.725065 +vt 0.139046 0.735954 +vt 0.137343 0.726538 +vt 0.143034 0.743781 +vt 0.148463 0.737657 +vt 0.131219 0.731966 +vt 0.134988 0.740012 +vt 0.173148 0.701852 +vt 0.149754 0.702036 +vt 0.172964 0.725246 +vt 0.136343 0.704543 +vt 0.137500 0.750000 +vt 0.162540 0.745544 +vt 0.134375 0.746875 +vt 0.170457 0.738657 +vt 0.125000 0.737500 +vt 0.128125 0.740625 +vt 0.129456 0.712460 +vt 0.131250 0.743750 +vt 0.614785 0.982251 +vt 0.616580 0.987153 +vt 0.614821 0.990232 +vt 0.619570 0.982251 +vt 0.617254 0.978752 +vt 0.615109 0.994261 +vt 0.617522 0.990232 +vt 0.612500 0.990625 +vt 0.613071 0.962786 +vt 0.612500 0.993750 +vt 0.625000 0.987500 +vt 0.621009 0.962833 +vt 0.621875 0.990625 +vt 0.617376 0.957523 +vt 0.612500 1.000000 +vt 0.615625 0.996875 +vt 0.612500 0.996875 +vt 0.618750 0.993750 +vt 0.149935 0.524935 +vt 0.139046 0.514046 +vt 0.148463 0.512343 +vt 0.131219 0.518034 +vt 0.137343 0.523463 +vt 0.143034 0.506219 +vt 0.134988 0.509988 +vt 0.173148 0.548148 +vt 0.172964 0.524754 +vt 0.149754 0.547964 +vt 0.170457 0.511343 +vt 0.125000 0.512500 +vt 0.129456 0.537540 +vt 0.128125 0.509375 +vt 0.136343 0.545457 +vt 0.137500 0.500000 +vt 0.134375 0.503125 +vt 0.162540 0.504456 +vt 0.131250 0.506250 +vt 0.622381 0.259881 +vt 0.620833 0.258333 +vt 0.619933 0.257433 +vt 0.622382 0.259881 +vt 0.622635 0.260135 +vt 0.617737 0.255237 +vt 0.619933 0.257433 +vt 0.625000 0.262500 +vt 0.621875 0.259375 +vt 0.625000 0.262500 +vt 0.618750 0.256250 +vt 0.625000 0.262500 +vt 0.625000 0.262500 +vt 0.621875 0.259375 +vt 0.625000 0.262500 +vt 0.612500 0.250000 +vt 0.615625 0.253125 +vt 0.615625 0.253125 +vt 0.618750 0.256250 +vt 0.357251 0.739785 +vt 0.362153 0.741580 +vt 0.353752 0.742254 +vt 0.369261 0.740109 +vt 0.365232 0.739821 +vt 0.357251 0.744570 +vt 0.365232 0.742522 +vt 0.362500 0.737500 +vt 0.337742 0.738071 +vt 0.365625 0.737500 +vt 0.332523 0.742376 +vt 0.375000 0.737500 +vt 0.371875 0.737500 +vt 0.371875 0.740625 +vt 0.368750 0.737500 +vt 0.362500 0.750000 +vt 0.365625 0.746875 +vt 0.337833 0.746009 +vt 0.368750 0.743750 +vt 0.622381 0.759881 +vt 0.620833 0.758333 +vt 0.619933 0.757433 +vt 0.622382 0.759881 +vt 0.622635 0.760135 +vt 0.617737 0.755237 +vt 0.619933 0.757433 +vt 0.625000 0.762500 +vt 0.621875 0.759375 +vt 0.625000 0.762500 +vt 0.618750 0.756250 +vt 0.625000 0.762500 +vt 0.625000 0.762500 +vt 0.621875 0.759375 +vt 0.625000 0.762500 +vt 0.612500 0.750000 +vt 0.615625 0.753125 +vt 0.615625 0.753125 +vt 0.618750 0.756250 +vt 0.357251 0.510215 +vt 0.362153 0.508420 +vt 0.365232 0.510179 +vt 0.357251 0.505430 +vt 0.353752 0.507746 +vt 0.369261 0.509891 +vt 0.365232 0.507478 +vt 0.362500 0.512500 +vt 0.365625 0.512500 +vt 0.337742 0.511930 +vt 0.368750 0.512500 +vt 0.362500 0.500000 +vt 0.337833 0.503991 +vt 0.365625 0.503125 +vt 0.332523 0.507624 +vt 0.375000 0.512500 +vt 0.371875 0.509375 +vt 0.371875 0.512500 +vt 0.368750 0.506250 +vt 0.622381 0.509881 +vt 0.620833 0.508333 +vt 0.619933 0.507433 +vt 0.622382 0.509881 +vt 0.622635 0.510135 +vt 0.617737 0.505237 +vt 0.619933 0.507433 +vt 0.625000 0.512500 +vt 0.621875 0.509375 +vt 0.625000 0.512500 +vt 0.618750 0.506250 +vt 0.625000 0.512500 +vt 0.625000 0.512500 +vt 0.621875 0.509375 +vt 0.625000 0.512500 +vt 0.612500 0.500000 +vt 0.615625 0.503125 +vt 0.615625 0.503125 +vt 0.618750 0.506250 +vt 0.149420 0.625000 +vt 0.135914 0.581309 +vt 0.149501 0.583053 +vt 0.135914 0.668691 +vt 0.135800 0.625000 +vt 0.128759 0.625000 +vt 0.128865 0.576559 +vt 0.173018 0.583232 +vt 0.172975 0.625000 +vt 0.149501 0.666947 +vt 0.173018 0.666768 +vt 0.128865 0.673441 +vt 0.125000 0.681250 +vt 0.125000 0.625000 +vt 0.125000 0.568750 +vt 0.500000 0.003494 +vt 0.443750 0.008279 +vt 0.443750 0.003379 +vt 0.556250 0.008279 +vt 0.500000 0.009201 +vt 0.499908 0.020074 +vt 0.443738 0.017053 +vt 0.443750 0.000000 +vt 0.387500 0.003125 +vt 0.387500 0.000000 +vt 0.500000 0.000000 +vt 0.556250 0.003379 +vt 0.556250 0.000000 +vt 0.612500 0.003125 +vt 0.612500 0.006250 +vt 0.556054 0.017053 +vt 0.612500 0.009375 +vt 0.387500 0.009375 +vt 0.387500 0.006250 +vt 0.621506 0.125000 +vt 0.616721 0.068750 +vt 0.621621 0.068750 +vt 0.616721 0.181250 +vt 0.615799 0.125000 +vt 0.604926 0.125005 +vt 0.607947 0.068935 +vt 0.625000 0.068750 +vt 0.621875 0.012500 +vt 0.625000 0.012500 +vt 0.625000 0.125000 +vt 0.621621 0.181250 +vt 0.625000 0.181250 +vt 0.621875 0.237500 +vt 0.618750 0.237500 +vt 0.607947 0.181077 +vt 0.615625 0.237500 +vt 0.582986 0.125043 +vt 0.615625 0.012500 +vt 0.618750 0.012500 +vt 0.499908 0.265972 +vt 0.556250 0.250000 +vt 0.556054 0.263238 +vt 0.443750 0.250000 +vt 0.500000 0.250000 +vt 0.499908 0.234028 +vt 0.556054 0.236762 +vt 0.612500 0.256250 +vt 0.443738 0.263238 +vt 0.387500 0.256250 +vt 0.387500 0.250000 +vt 0.443738 0.236762 +vt 0.387500 0.243750 +vt 0.612500 0.243750 +vt 0.612500 0.250000 +vt 0.252137 0.522289 +vt 0.295825 0.508688 +vt 0.298602 0.517662 +vt 0.206401 0.510821 +vt 0.250741 0.510059 +vt 0.250093 0.503666 +vt 0.298708 0.503587 +vt 0.302470 0.537354 +vt 0.253009 0.545009 +vt 0.208321 0.524235 +vt 0.208608 0.547647 +vt 0.201571 0.503854 +vt 0.193750 0.500000 +vt 0.250000 0.500000 +vt 0.306250 0.500000 +vt 0.621506 0.375000 +vt 0.616721 0.318750 +vt 0.621621 0.318750 +vt 0.616721 0.431250 +vt 0.615799 0.375000 +vt 0.604926 0.375000 +vt 0.607947 0.318924 +vt 0.625000 0.318750 +vt 0.621875 0.262500 +vt 0.625000 0.375000 +vt 0.621621 0.431250 +vt 0.625000 0.431250 +vt 0.621875 0.487500 +vt 0.618750 0.487500 +vt 0.607947 0.431076 +vt 0.615625 0.487500 +vt 0.582986 0.375000 +vt 0.615625 0.262500 +vt 0.618750 0.262500 +vt 0.500000 0.515972 +vt 0.556250 0.500000 +vt 0.556076 0.513238 +vt 0.443750 0.500000 +vt 0.500000 0.500000 +vt 0.499908 0.484028 +vt 0.556054 0.486762 +vt 0.612500 0.506250 +vt 0.443924 0.513238 +vt 0.387500 0.506250 +vt 0.387500 0.500000 +vt 0.443738 0.486762 +vt 0.387500 0.493750 +vt 0.612500 0.493750 +vt 0.612500 0.500000 +vt 0.359028 0.625000 +vt 0.375000 0.681250 +vt 0.361762 0.681066 +vt 0.375000 0.568750 +vt 0.375000 0.625000 +vt 0.390972 0.625000 +vt 0.388238 0.681076 +vt 0.339493 0.679128 +vt 0.368750 0.737500 +vt 0.334722 0.625000 +vt 0.361762 0.568934 +vt 0.339493 0.570872 +vt 0.368750 0.512500 +vt 0.375000 0.512500 +vt 0.388238 0.568924 +vt 0.381250 0.512500 +vt 0.381250 0.737500 +vt 0.375000 0.737500 +vt 0.640972 0.625000 +vt 0.625000 0.568750 +vt 0.638238 0.568750 +vt 0.625000 0.681250 +vt 0.625000 0.625000 +vt 0.609028 0.625000 +vt 0.611762 0.568924 +vt 0.631250 0.512500 +vt 0.638238 0.681250 +vt 0.631250 0.737500 +vt 0.625000 0.737500 +vt 0.611762 0.681076 +vt 0.618750 0.737500 +vt 0.584722 0.625000 +vt 0.618750 0.512500 +vt 0.499908 0.765972 +vt 0.556250 0.750000 +vt 0.556054 0.763238 +vt 0.443750 0.750000 +vt 0.500000 0.750000 +vt 0.500000 0.734028 +vt 0.556076 0.736762 +vt 0.612500 0.756250 +vt 0.443738 0.763238 +vt 0.387500 0.756250 +vt 0.387500 0.750000 +vt 0.443924 0.736762 +vt 0.387500 0.743750 +vt 0.612500 0.743750 +vt 0.612500 0.750000 +vt 0.252137 0.727711 +vt 0.206401 0.739179 +vt 0.208321 0.725765 +vt 0.295825 0.741312 +vt 0.250741 0.739941 +vt 0.250093 0.746334 +vt 0.201571 0.746146 +vt 0.208608 0.702353 +vt 0.253009 0.704991 +vt 0.298602 0.732338 +vt 0.302470 0.712646 +vt 0.298708 0.746413 +vt 0.306250 0.750000 +vt 0.250000 0.750000 +vt 0.193750 0.750000 +vt 0.621466 0.872931 +vt 0.616714 0.818374 +vt 0.621616 0.818491 +vt 0.616412 0.920356 +vt 0.615741 0.871991 +vt 0.604885 0.872924 +vt 0.607942 0.818664 +vt 0.625000 0.818750 +vt 0.621875 0.762500 +vt 0.625000 0.875000 +vt 0.621430 0.923438 +vt 0.625000 0.931250 +vt 0.607610 0.923249 +vt 0.582972 0.874942 +vt 0.615625 0.762500 +vt 0.618750 0.762500 +vt 0.208473 0.582924 +vt 0.251657 0.625000 +vt 0.208369 0.625000 +vt 0.299194 0.576618 +vt 0.252349 0.581123 +vt 0.208473 0.667076 +vt 0.299194 0.673382 +vt 0.252349 0.668878 +vt 0.296735 0.625000 +vt 0.862500 0.625000 +vt 0.612500 0.000000 +vt 0.625000 0.237500 +vt 0.625000 0.487500 +vn 0.0188 -0.0188 0.9996 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.0198 0.9998 +vn 0.0188 0.0188 0.9996 +vn 0.0198 0.0000 0.9998 +vn -0.0188 -0.0188 0.9996 +vn -0.0188 0.0188 0.9996 +vn -0.0198 0.0000 0.9998 +vn 0.0559 -0.0559 0.9969 +vn 0.0159 -0.0631 0.9979 +vn 0.0631 -0.0159 0.9979 +vn 0.0631 0.0159 0.9979 +vn 0.0654 0.0000 0.9978 +vn 0.0559 0.0559 0.9969 +vn 0.0159 0.0631 0.9979 +vn 0.0000 0.0198 0.9998 +vn -0.0159 0.0631 0.9979 +vn -0.0559 0.0559 0.9969 +vn -0.0631 0.0159 0.9979 +vn -0.0654 0.0000 0.9978 +vn -0.0631 -0.0159 0.9979 +vn -0.0559 -0.0559 0.9969 +vn -0.0159 -0.0631 0.9979 +vn 0.0000 -0.0654 0.9978 +vn 0.9996 -0.0188 -0.0188 +vn 1.0000 0.0000 0.0000 +vn 0.9998 -0.0198 0.0000 +vn 0.9996 0.0188 -0.0188 +vn 0.9998 0.0000 -0.0198 +vn 0.9996 -0.0188 0.0188 +vn 0.9996 0.0188 0.0188 +vn 0.9998 0.0000 0.0198 +vn 0.9969 -0.0559 -0.0559 +vn 0.9979 -0.0631 -0.0159 +vn 0.9979 -0.0159 -0.0631 +vn 0.9979 0.0159 -0.0631 +vn 0.9978 0.0000 -0.0654 +vn 0.9969 0.0559 -0.0559 +vn 0.9979 0.0631 -0.0159 +vn 0.9998 0.0198 0.0000 +vn 0.9979 0.0631 0.0159 +vn 0.9969 0.0559 0.0559 +vn 0.9979 0.0159 0.0631 +vn 0.9978 0.0000 0.0654 +vn 0.9979 -0.0159 0.0631 +vn 0.9969 -0.0559 0.0559 +vn 0.9979 -0.0631 0.0159 +vn 0.9978 -0.0654 0.0000 +vn 0.0188 0.9996 -0.0188 +vn 0.0000 1.0000 0.0000 +vn 0.0198 0.9998 0.0000 +vn -0.0188 0.9996 -0.0188 +vn 0.0000 0.9998 -0.0198 +vn 0.0188 0.9996 0.0188 +vn -0.0188 0.9996 0.0188 +vn 0.0000 0.9998 0.0198 +vn 0.0559 0.9969 -0.0559 +vn 0.0631 0.9979 -0.0159 +vn 0.0159 0.9979 -0.0631 +vn -0.0159 0.9979 -0.0631 +vn 0.0000 0.9978 -0.0654 +vn -0.0559 0.9969 -0.0559 +vn -0.0631 0.9979 -0.0159 +vn -0.0198 0.9998 0.0000 +vn -0.0631 0.9979 0.0159 +vn -0.0559 0.9969 0.0559 +vn -0.0159 0.9979 0.0631 +vn 0.0000 0.9978 0.0654 +vn 0.0159 0.9979 0.0631 +vn 0.0559 0.9969 0.0559 +vn 0.0631 0.9979 0.0159 +vn 0.0654 0.9978 0.0000 +vn -0.9996 -0.0188 0.0188 +vn -1.0000 0.0000 0.0000 +vn -0.9998 -0.0198 0.0000 +vn -0.9996 0.0188 0.0188 +vn -0.9998 0.0000 0.0198 +vn -0.9996 -0.0188 -0.0188 +vn -0.9996 0.0188 -0.0188 +vn -0.9998 0.0000 -0.0198 +vn -0.9969 -0.0559 0.0559 +vn -0.9979 -0.0631 0.0159 +vn -0.9979 -0.0159 0.0631 +vn -0.9979 0.0159 0.0631 +vn -0.9978 0.0000 0.0654 +vn -0.9969 0.0559 0.0559 +vn -0.9979 0.0631 0.0159 +vn -0.9998 0.0198 0.0000 +vn -0.9979 0.0631 -0.0159 +vn -0.9969 0.0559 -0.0559 +vn -0.9979 0.0159 -0.0631 +vn -0.9978 0.0000 -0.0654 +vn -0.9979 -0.0159 -0.0631 +vn -0.9969 -0.0559 -0.0559 +vn -0.9979 -0.0631 -0.0159 +vn -0.9978 -0.0654 0.0000 +vn -0.0188 -0.0188 -0.9996 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0198 -0.9998 +vn -0.0188 0.0188 -0.9996 +vn -0.0198 0.0000 -0.9998 +vn 0.0188 -0.0188 -0.9996 +vn 0.0188 0.0188 -0.9996 +vn 0.0198 0.0000 -0.9998 +vn -0.0559 -0.0559 -0.9969 +vn -0.0159 -0.0631 -0.9979 +vn -0.0631 -0.0159 -0.9979 +vn -0.0631 0.0159 -0.9979 +vn -0.0654 0.0000 -0.9978 +vn -0.0559 0.0559 -0.9969 +vn -0.0159 0.0631 -0.9979 +vn 0.0000 0.0198 -0.9998 +vn 0.0159 0.0631 -0.9979 +vn 0.0559 0.0559 -0.9969 +vn 0.0631 0.0159 -0.9979 +vn 0.0654 0.0000 -0.9978 +vn 0.0631 -0.0159 -0.9979 +vn 0.0559 -0.0559 -0.9969 +vn 0.0159 -0.0631 -0.9979 +vn 0.0000 -0.0654 -0.9978 +vn -0.2277 -0.9467 0.2277 +vn -0.5773 -0.5773 0.5773 +vn -0.6933 -0.6933 0.1963 +vn -0.2277 -0.2277 0.9467 +vn -0.1963 -0.6933 0.6933 +vn -0.9467 -0.2277 0.2277 +vn -0.6933 -0.1963 0.6933 +vn -0.0559 -0.9969 0.0559 +vn -0.2540 -0.9660 0.0468 +vn -0.0468 -0.9660 0.2540 +vn -0.7064 -0.7064 0.0438 +vn -0.0468 -0.2540 0.9660 +vn -0.2540 -0.0468 0.9660 +vn -0.0438 -0.7064 0.7064 +vn -0.9660 -0.0468 0.2540 +vn -0.9660 -0.2540 0.0468 +vn -0.7064 -0.0438 0.7064 +vn -0.2277 0.2277 0.9467 +vn -0.5773 0.5773 0.5773 +vn -0.6933 0.1963 0.6933 +vn -0.2277 0.9467 0.2277 +vn -0.1963 0.6933 0.6933 +vn -0.9467 0.2277 0.2277 +vn -0.6933 0.6933 0.1963 +vn -0.2540 0.0468 0.9660 +vn -0.0468 0.2540 0.9660 +vn -0.7064 0.0438 0.7064 +vn -0.0468 0.9660 0.2540 +vn -0.2540 0.9660 0.0468 +vn -0.0438 0.7064 0.7064 +vn -0.9660 0.2540 0.0468 +vn -0.9660 0.0468 0.2540 +vn -0.7064 0.7064 0.0438 +vn -0.2277 -0.9467 -0.2277 +vn -0.5773 -0.5773 -0.5773 +vn -0.1963 -0.6933 -0.6933 +vn -0.9467 -0.2277 -0.2277 +vn -0.6933 -0.6933 -0.1963 +vn -0.2277 -0.2277 -0.9467 +vn -0.6933 -0.1963 -0.6934 +vn -0.0559 -0.9969 -0.0559 +vn -0.0468 -0.9660 -0.2540 +vn -0.2540 -0.9660 -0.0468 +vn -0.0438 -0.7064 -0.7064 +vn -0.9660 -0.2540 -0.0468 +vn -0.9660 -0.0468 -0.2540 +vn -0.7064 -0.7064 -0.0438 +vn -0.2540 -0.0468 -0.9661 +vn -0.0468 -0.2540 -0.9660 +vn -0.7064 -0.0438 -0.7064 +vn -0.2277 0.9467 -0.2277 +vn -0.5773 0.5773 -0.5773 +vn -0.6933 0.6933 -0.1963 +vn -0.2277 0.2277 -0.9467 +vn -0.1963 0.6933 -0.6933 +vn -0.9467 0.2277 -0.2277 +vn -0.6934 0.1963 -0.6933 +vn -0.2540 0.9661 -0.0468 +vn -0.0468 0.9660 -0.2540 +vn -0.7064 0.7064 -0.0438 +vn -0.0468 0.2540 -0.9661 +vn -0.2540 0.0468 -0.9660 +vn -0.0438 0.7064 -0.7064 +vn -0.9661 0.0468 -0.2540 +vn -0.9660 0.2540 -0.0468 +vn -0.7064 0.0438 -0.7064 +vn 0.2277 -0.9467 0.2277 +vn 0.5773 -0.5773 0.5773 +vn 0.1963 -0.6933 0.6933 +vn 0.9467 -0.2277 0.2277 +vn 0.6933 -0.6933 0.1963 +vn 0.2277 -0.2277 0.9467 +vn 0.6933 -0.1963 0.6934 +vn 0.0559 -0.9969 0.0559 +vn 0.0468 -0.9660 0.2540 +vn 0.2540 -0.9660 0.0468 +vn 0.0438 -0.7064 0.7064 +vn 0.9660 -0.2540 0.0468 +vn 0.9660 -0.0468 0.2540 +vn 0.7064 -0.7064 0.0438 +vn 0.2540 -0.0468 0.9661 +vn 0.0468 -0.2540 0.9660 +vn 0.7064 -0.0438 0.7064 +vn 0.2277 0.9467 0.2277 +vn 0.5773 0.5773 0.5773 +vn 0.6933 0.6933 0.1963 +vn 0.2277 0.2277 0.9467 +vn 0.1963 0.6933 0.6933 +vn 0.9467 0.2277 0.2277 +vn 0.6933 0.1963 0.6933 +vn 0.2540 0.9660 0.0468 +vn 0.0468 0.9660 0.2540 +vn 0.7064 0.7064 0.0438 +vn 0.0468 0.2540 0.9661 +vn 0.2540 0.0468 0.9660 +vn 0.0438 0.7064 0.7064 +vn 0.9660 0.0468 0.2540 +vn 0.9660 0.2540 0.0468 +vn 0.7064 0.0438 0.7064 +vn 0.2277 -0.9467 -0.2277 +vn 0.5773 -0.5773 -0.5773 +vn 0.6933 -0.6933 -0.1963 +vn 0.2277 -0.2277 -0.9467 +vn 0.1963 -0.6933 -0.6933 +vn 0.9467 -0.2277 -0.2277 +vn 0.6933 -0.1963 -0.6933 +vn 0.0559 -0.9969 -0.0559 +vn 0.2540 -0.9660 -0.0468 +vn 0.0468 -0.9660 -0.2540 +vn 0.7064 -0.7064 -0.0438 +vn 0.0468 -0.2540 -0.9660 +vn 0.2540 -0.0468 -0.9660 +vn 0.0438 -0.7064 -0.7064 +vn 0.9660 -0.0468 -0.2540 +vn 0.9660 -0.2540 -0.0468 +vn 0.7064 -0.0438 -0.7064 +vn 0.2277 0.9467 -0.2277 +vn 0.5773 0.5773 -0.5773 +vn 0.1963 0.6933 -0.6933 +vn 0.9467 0.2277 -0.2277 +vn 0.6933 0.6933 -0.1963 +vn 0.2277 0.2277 -0.9467 +vn 0.6933 0.1963 -0.6933 +vn 0.0468 0.9660 -0.2540 +vn 0.2540 0.9661 -0.0468 +vn 0.0438 0.7064 -0.7064 +vn 0.9660 0.2540 -0.0468 +vn 0.9660 0.0468 -0.2540 +vn 0.7064 0.7064 -0.0438 +vn 0.2540 0.0468 -0.9660 +vn 0.0468 0.2540 -0.9661 +vn 0.7064 0.0438 -0.7064 +vn -0.2666 -0.9638 0.0000 +vn -0.7071 -0.7071 -0.0118 +vn -0.2636 -0.9645 -0.0128 +vn -0.7071 -0.7071 0.0118 +vn -0.7071 -0.7071 0.0000 +vn -0.9638 -0.2666 0.0000 +vn -0.9645 -0.2636 -0.0128 +vn -0.0631 -0.9979 -0.0159 +vn -0.0654 -0.9978 0.0000 +vn -0.2636 -0.9645 0.0128 +vn -0.0631 -0.9979 0.0159 +vn -0.9645 -0.2636 0.0128 +vn -0.2666 0.0000 0.9638 +vn -0.7071 -0.0118 0.7071 +vn -0.2636 -0.0128 0.9645 +vn -0.7071 0.0118 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.9638 0.0000 0.2666 +vn -0.9645 -0.0128 0.2636 +vn -0.2636 0.0128 0.9645 +vn -0.9645 0.0128 0.2636 +vn -0.2666 0.9638 0.0000 +vn -0.7071 0.7071 0.0118 +vn -0.2636 0.9645 0.0128 +vn -0.7071 0.7071 -0.0118 +vn -0.7071 0.7071 0.0000 +vn -0.9638 0.2666 0.0000 +vn -0.9645 0.2636 0.0128 +vn -0.0654 0.9978 0.0000 +vn -0.2636 0.9645 -0.0128 +vn -0.9645 0.2636 -0.0128 +vn -0.9978 0.0654 0.0000 +vn -0.2666 0.0000 -0.9638 +vn -0.7071 0.0118 -0.7071 +vn -0.2636 0.0128 -0.9645 +vn -0.7071 -0.0118 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.9638 0.0000 -0.2666 +vn -0.9645 0.0128 -0.2636 +vn -0.2636 -0.0128 -0.9645 +vn -0.9645 -0.0128 -0.2636 +vn 0.0000 -0.9638 -0.2666 +vn 0.0118 -0.7071 -0.7071 +vn 0.0128 -0.9645 -0.2636 +vn -0.0118 -0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.2666 -0.9638 +vn 0.0128 -0.2636 -0.9645 +vn 0.0159 -0.9979 -0.0631 +vn 0.0000 -0.9978 -0.0654 +vn -0.0128 -0.9645 -0.2636 +vn -0.0159 -0.9979 -0.0631 +vn -0.0128 -0.2636 -0.9645 +vn 0.0000 0.9638 -0.2666 +vn -0.0118 0.7071 -0.7071 +vn -0.0128 0.9645 -0.2636 +vn 0.0118 0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.2666 -0.9638 +vn -0.0128 0.2636 -0.9645 +vn 0.0128 0.9645 -0.2636 +vn 0.0128 0.2636 -0.9645 +vn 0.0000 0.0654 -0.9978 +vn 0.9638 0.0000 -0.2666 +vn 0.7071 0.0118 -0.7071 +vn 0.9645 0.0128 -0.2636 +vn 0.7071 -0.0118 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.2666 0.0000 -0.9638 +vn 0.2636 0.0128 -0.9645 +vn 0.9645 -0.0128 -0.2636 +vn 0.2636 -0.0128 -0.9645 +vn 0.2666 -0.9638 0.0000 +vn 0.7071 -0.7071 0.0118 +vn 0.2636 -0.9645 0.0128 +vn 0.7071 -0.7071 -0.0118 +vn 0.7071 -0.7071 0.0000 +vn 0.9638 -0.2666 0.0000 +vn 0.9645 -0.2636 0.0128 +vn 0.0631 -0.9979 0.0159 +vn 0.0654 -0.9978 0.0000 +vn 0.2636 -0.9645 -0.0128 +vn 0.0631 -0.9979 -0.0159 +vn 0.9645 -0.2636 -0.0128 +vn 0.2666 0.9638 0.0000 +vn 0.7071 0.7071 -0.0118 +vn 0.2636 0.9645 -0.0128 +vn 0.7071 0.7071 0.0118 +vn 0.7071 0.7071 0.0000 +vn 0.9638 0.2666 0.0000 +vn 0.9645 0.2636 -0.0128 +vn 0.2636 0.9645 0.0128 +vn 0.9645 0.2636 0.0128 +vn 0.9978 0.0654 0.0000 +vn 0.2666 0.0000 0.9638 +vn 0.7071 0.0118 0.7071 +vn 0.2636 0.0128 0.9645 +vn 0.7071 -0.0118 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.9638 0.0000 0.2666 +vn 0.9645 0.0128 0.2636 +vn 0.2636 -0.0128 0.9645 +vn 0.9645 -0.0128 0.2636 +vn 0.0000 -0.9638 0.2666 +vn -0.0118 -0.7071 0.7071 +vn -0.0128 -0.9645 0.2636 +vn 0.0118 -0.7071 0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.2666 0.9638 +vn -0.0128 -0.2636 0.9645 +vn -0.0159 -0.9979 0.0631 +vn 0.0000 -0.9978 0.0654 +vn 0.0128 -0.9645 0.2636 +vn 0.0159 -0.9979 0.0631 +vn 0.0128 -0.2636 0.9645 +vn 0.0000 0.9638 0.2666 +vn 0.0118 0.7071 0.7071 +vn 0.0128 0.9645 0.2636 +vn -0.0118 0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.2666 0.9638 +vn 0.0128 0.2636 0.9645 +vn -0.0128 0.9645 0.2636 +vn -0.0128 0.2636 0.9645 +vn 0.0000 0.0654 0.9978 +vn -0.0188 -0.9996 -0.0188 +vn 0.0000 -1.0000 0.0000 +vn -0.0198 -0.9998 0.0000 +vn 0.0188 -0.9996 -0.0188 +vn 0.0000 -0.9998 -0.0198 +vn -0.0188 -0.9996 0.0188 +vn 0.0188 -0.9996 0.0188 +vn 0.0000 -0.9998 0.0198 +vn 0.0198 -0.9998 0.0000 +usemtl blue +s 1 +f 221/89/38 225/90/39 224/91/40 +f 223/92/41 225/90/39 222/93/42 +f 225/90/39 227/94/43 224/91/40 +f 225/90/39 229/95/44 228/96/45 +f 67/97/46 221/89/38 212/98/47 +f 205/99/48 222/93/42 221/89/38 +f 203/100/49 222/93/42 204/101/50 +f 69/102/51 223/92/41 203/100/49 +f 220/103/52 226/104/53 223/92/41 +f 226/104/53 218/105/54 229/95/44 +f 229/95/44 56/106/55 157/107/56 +f 228/96/45 157/107/56 156/108/57 +f 228/96/45 155/109/58 227/94/43 +f 227/94/43 54/110/59 214/111/60 +f 224/91/40 214/111/60 213/112/61 +f 212/98/47 224/91/40 213/112/61 +f 230/113/62 234/114/63 233/115/64 +f 232/116/65 234/114/63 231/117/66 +f 234/114/63 236/118/67 233/115/64 +f 234/114/63 238/119/68 237/120/69 +f 73/121/70 230/113/62 194/122/71 +f 187/123/72 231/117/66 230/113/62 +f 185/124/73 231/117/66 186/125/74 +f 75/126/75 232/116/65 185/124/73 +f 202/127/76 235/128/77 232/116/65 +f 235/128/77 200/129/78 238/119/68 +f 238/119/68 70/130/79 208/131/80 +f 237/120/69 208/131/80 207/132/81 +f 237/120/69 206/133/82 236/118/67 +f 236/118/67 66/134/83 196/135/84 +f 233/115/64 196/135/84 195/136/85 +f 194/122/71 233/115/64 195/136/85 +f 239/137/86 243/138/87 242/139/88 +f 241/140/89 243/138/87 240/141/90 +f 243/138/87 245/142/91 242/139/88 +f 243/138/87 247/143/92 246/144/93 +f 74/145/94 239/137/86 197/146/95 +f 181/147/96 240/141/90 239/137/86 +f 179/148/97 240/141/90 180/149/98 +f 62/150/99 241/140/89 179/148/97 +f 163/151/100 244/152/101 241/140/89 +f 244/152/101 161/153/102 247/143/92 +f 247/143/92 57/154/103 217/155/104 +f 246/144/93 217/155/104 216/156/105 +f 246/144/93 215/157/106 245/142/91 +f 245/142/91 68/158/107 199/159/108 +f 242/139/88 199/159/108 198/160/109 +f 197/146/95 242/139/88 198/160/109 +f 248/161/110 252/162/111 251/163/112 +f 250/164/113 252/162/111 249/165/114 +f 252/162/111 254/166/115 251/163/112 +f 252/162/111 256/167/116 255/168/117 +f 55/169/118 248/161/110 152/170/119 +f 160/171/120 249/165/114 248/161/110 +f 158/172/121 249/165/114 159/173/122 +f 58/174/123 250/164/113 158/172/121 +f 166/175/124 253/176/125 250/164/113 +f 253/176/125 164/177/126 256/167/116 +f 256/167/116 64/178/127 172/179/128 +f 255/168/117 172/179/128 171/180/129 +f 255/168/117 170/181/130 254/166/115 +f 254/166/115 60/182/131 154/183/132 +f 251/163/112 154/183/132 153/184/133 +f 152/170/119 251/163/112 153/184/133 +f 257/185/134 261/186/135 260/187/136 +f 259/188/137 261/186/135 258/189/138 +f 261/186/135 263/190/139 260/187/136 +f 261/186/135 265/191/140 264/192/141 +f 61/193/142 257/185/134 176/194/143 +f 169/195/144 258/189/138 257/185/134 +f 167/196/145 258/189/138 168/197/146 +f 63/198/147 259/188/137 167/196/145 +f 184/199/148 262/200/149 259/188/137 +f 262/200/149 182/201/150 265/191/140 +f 265/191/140 76/202/151 190/203/152 +f 264/192/141 190/203/152 189/204/153 +f 264/192/141 188/205/154 263/190/139 +f 263/190/139 72/206/155 178/207/156 +f 260/187/136 178/207/156 177/208/157 +f 176/194/143 260/187/136 177/208/157 +f 267/209/158 266/210/159 272/211/160 +f 269/212/161 266/210/159 268/213/162 +f 271/214/163 266/210/159 270/215/164 +f 53/216/165 267/209/158 79/217/166 +f 80/218/167 268/213/162 267/209/158 +f 79/217/166 272/211/160 78/219/168 +f 54/220/59 269/212/161 82/221/169 +f 83/222/170 270/215/164 269/212/161 +f 82/221/169 268/213/162 81/223/171 +f 55/224/118 271/214/163 85/225/172 +f 77/226/173 272/211/160 271/214/163 +f 85/225/172 270/215/164 84/227/174 +f 274/228/175 273/229/176 279/230/177 +f 276/231/178 273/229/176 275/232/179 +f 278/233/180 273/229/176 277/234/181 +f 56/106/55 274/228/175 88/235/182 +f 89/236/183 275/232/179 274/228/175 +f 88/235/182 279/230/177 87/237/184 +f 57/238/103 276/231/178 91/239/185 +f 92/240/186 277/234/181 276/231/178 +f 91/239/185 275/232/179 90/241/187 +f 58/242/123 278/233/180 94/243/188 +f 86/244/189 279/230/177 278/233/180 +f 94/243/188 277/234/181 93/245/190 +f 281/246/191 280/247/192 286/248/193 +f 283/249/194 280/247/192 282/250/195 +f 285/251/196 280/247/192 284/252/197 +f 59/253/198 281/246/191 97/254/199 +f 98/255/200 282/250/195 281/246/191 +f 97/254/199 286/248/193 96/256/201 +f 60/257/131 283/249/194 100/258/202 +f 101/259/203 284/252/197 283/249/194 +f 100/258/202 282/250/195 99/260/204 +f 61/261/142 285/251/196 103/262/205 +f 95/263/206 286/248/193 285/251/196 +f 103/262/205 284/252/197 102/264/207 +f 288/265/208 287/266/209 293/267/210 +f 290/268/211 287/266/209 289/269/212 +f 292/270/213 287/266/209 291/271/214 +f 62/272/99 288/265/208 106/273/215 +f 107/274/216 289/269/212 288/265/208 +f 106/273/215 293/267/210 105/275/217 +f 63/276/147 290/268/211 109/277/218 +f 110/278/219 291/271/214 290/268/211 +f 109/277/218 289/269/212 108/279/220 +f 64/280/127 292/270/213 112/281/221 +f 104/282/222 293/267/210 292/270/213 +f 112/281/221 291/271/214 111/283/223 +f 295/284/224 294/285/225 300/286/226 +f 297/287/227 294/285/225 296/288/228 +f 299/289/229 294/285/225 298/290/230 +f 65/291/231 295/284/224 115/292/232 +f 116/293/233 296/288/228 295/284/224 +f 115/292/232 300/286/226 114/294/234 +f 66/295/83 297/287/227 118/296/235 +f 119/297/236 298/290/230 297/287/227 +f 118/296/235 296/288/228 117/298/237 +f 67/299/46 299/289/229 121/300/238 +f 113/301/239 300/286/226 299/289/229 +f 121/300/238 298/290/230 120/302/240 +f 302/303/241 301/304/242 307/305/243 +f 304/306/244 301/304/242 303/307/245 +f 306/308/246 301/304/242 305/309/247 +f 68/310/107 302/303/241 124/311/248 +f 125/312/249 303/307/245 302/303/241 +f 124/311/248 307/305/243 123/313/250 +f 69/314/51 304/306/244 127/315/251 +f 128/316/252 305/309/247 304/306/244 +f 127/315/251 303/307/245 126/317/253 +f 70/318/79 306/308/246 130/319/254 +f 122/320/255 307/305/243 306/308/246 +f 130/319/254 305/309/247 129/321/256 +f 309/322/257 308/323/258 314/324/259 +f 311/325/260 308/323/258 310/326/261 +f 313/327/262 308/323/258 312/328/263 +f 71/329/264 309/322/257 133/330/265 +f 134/331/266 310/326/261 309/322/257 +f 133/330/265 314/324/259 132/332/267 +f 72/333/155 311/325/260 136/334/268 +f 137/335/269 312/328/263 311/325/260 +f 136/334/268 310/326/261 135/336/270 +f 73/337/70 313/327/262 139/338/271 +f 131/339/272 314/324/259 313/327/262 +f 139/338/271 312/328/263 138/340/273 +f 316/341/274 315/342/275 321/343/276 +f 318/344/277 315/342/275 317/345/278 +f 320/346/279 315/342/275 319/347/280 +f 74/348/94 316/341/274 142/349/281 +f 143/350/282 317/345/278 316/341/274 +f 142/349/281 321/343/276 141/351/283 +f 75/352/75 318/344/277 145/353/284 +f 146/354/285 319/347/280 318/344/277 +f 145/353/284 317/345/278 144/355/286 +f 76/356/151 320/346/279 148/357/287 +f 140/358/288 321/343/276 320/346/279 +f 148/357/287 319/347/280 147/359/289 +f 323/360/290 325/361/291 322/362/292 +f 323/360/290 327/363/293 326/364/294 +f 325/361/291 329/365/295 328/366/296 +f 327/363/293 329/365/295 326/364/294 +f 149/367/297 98/255/200 59/253/198 +f 150/368/298 322/362/292 149/367/297 +f 150/368/298 324/369/299 323/360/290 +f 151/370/300 79/217/166 324/369/299 +f 324/369/299 78/219/168 327/363/293 +f 78/219/168 330/371/301 327/363/293 +f 77/226/173 152/372/119 330/371/301 +f 330/371/301 153/373/133 329/365/295 +f 328/366/296 153/373/133 154/374/132 +f 100/258/202 154/374/132 60/257/131 +f 99/260/204 328/366/296 100/258/202 +f 322/362/292 99/260/204 98/255/200 +f 332/375/302 334/376/303 331/377/304 +f 332/375/302 336/378/305 335/379/306 +f 334/376/303 338/380/307 337/381/308 +f 336/378/305 338/380/307 335/379/306 +f 155/382/58 83/383/170 54/384/59 +f 156/385/57 331/377/304 155/382/58 +f 156/385/57 333/386/309 332/375/302 +f 157/387/56 88/388/182 333/386/309 +f 333/386/309 87/389/184 336/378/305 +f 87/389/184 339/390/310 336/378/305 +f 86/391/189 158/172/121 339/390/310 +f 339/390/310 159/173/122 338/380/307 +f 337/381/308 159/173/122 160/171/120 +f 85/392/172 160/171/120 55/169/118 +f 84/393/174 337/381/308 85/392/172 +f 331/377/304 84/393/174 83/383/170 +f 341/394/311 343/395/312 340/396/313 +f 341/394/311 345/397/314 344/398/315 +f 343/395/312 347/399/316 346/400/317 +f 345/397/314 347/399/316 344/398/315 +f 161/401/102 92/402/186 57/403/103 +f 162/404/318 340/396/313 161/401/102 +f 162/404/318 342/405/319 341/394/311 +f 163/406/100 106/407/215 342/405/319 +f 342/405/319 105/408/217 345/397/314 +f 105/408/217 348/409/320 345/397/314 +f 104/410/222 164/177/126 348/409/320 +f 348/409/320 165/411/321 347/399/316 +f 346/400/317 165/411/321 166/175/124 +f 94/412/188 166/175/124 58/174/123 +f 93/413/190 346/400/317 94/412/188 +f 340/396/313 93/413/190 92/402/186 +f 350/414/322 352/415/323 349/416/324 +f 350/414/322 354/417/325 353/418/326 +f 352/415/323 356/419/327 355/420/328 +f 354/417/325 356/419/327 353/418/326 +f 167/196/145 110/421/219 63/198/147 +f 168/197/146 349/416/324 167/196/145 +f 168/197/146 351/422/329 350/414/322 +f 169/195/144 103/423/205 351/422/329 +f 351/422/329 102/424/207 354/417/325 +f 102/424/207 357/425/330 354/417/325 +f 101/426/203 170/181/130 357/425/330 +f 357/425/330 171/180/129 356/419/327 +f 355/420/328 171/180/129 172/179/128 +f 112/427/221 172/179/128 64/178/127 +f 111/428/223 355/420/328 112/427/221 +f 349/416/324 111/428/223 110/421/219 +f 359/429/331 361/430/332 358/431/333 +f 359/429/331 363/432/334 362/433/335 +f 361/430/332 365/434/336 364/435/337 +f 363/432/334 365/434/336 362/433/335 +f 173/436/338 134/331/266 71/329/264 +f 174/437/339 358/431/333 173/436/338 +f 174/437/339 360/438/340 359/429/331 +f 175/439/341 97/254/199 360/438/340 +f 360/438/340 96/256/201 363/432/334 +f 96/256/201 366/440/342 363/432/334 +f 95/263/206 176/441/143 366/440/342 +f 366/440/342 177/442/157 365/434/336 +f 364/435/337 177/442/157 178/443/156 +f 136/334/268 178/443/156 72/333/155 +f 135/336/270 364/435/337 136/334/268 +f 358/431/333 135/336/270 134/331/266 +f 368/444/343 370/445/344 367/446/345 +f 368/444/343 372/447/346 371/448/347 +f 370/445/344 374/449/348 373/450/349 +f 372/447/346 374/449/348 371/448/347 +f 179/451/97 107/452/216 62/272/99 +f 180/453/98 367/446/345 179/451/97 +f 180/453/98 369/454/350 368/444/343 +f 181/455/96 142/456/281 369/454/350 +f 369/454/350 141/457/283 372/447/346 +f 141/457/283 375/458/351 372/447/346 +f 140/459/288 182/201/150 375/458/351 +f 375/458/351 183/460/352 374/449/348 +f 373/450/349 183/460/352 184/199/148 +f 109/461/218 184/199/148 63/198/147 +f 108/462/220 373/450/349 109/461/218 +f 367/446/345 108/462/220 107/452/216 +f 377/463/353 379/464/354 376/465/355 +f 377/463/353 381/466/356 380/467/357 +f 379/464/354 383/468/358 382/469/359 +f 381/466/356 383/468/358 380/467/357 +f 185/124/73 146/470/285 75/126/75 +f 186/125/74 376/465/355 185/124/73 +f 186/125/74 378/471/360 377/463/353 +f 187/123/72 139/472/271 378/471/360 +f 378/471/360 138/473/273 381/466/356 +f 138/473/273 384/474/361 381/466/356 +f 137/475/269 188/205/154 384/474/361 +f 384/474/361 189/204/153 383/468/358 +f 382/469/359 189/204/153 190/203/152 +f 148/476/287 190/203/152 76/202/151 +f 147/477/289 382/469/359 148/476/287 +f 376/465/355 147/477/289 146/470/285 +f 386/478/362 388/479/363 385/480/364 +f 386/478/362 390/481/365 389/482/366 +f 388/479/363 392/483/367 391/484/368 +f 390/481/365 392/483/367 389/482/366 +f 191/485/369 116/486/233 65/291/231 +f 192/487/370 385/480/364 191/485/369 +f 192/487/370 387/488/371 386/478/362 +f 193/489/372 133/490/265 387/488/371 +f 387/488/371 132/491/267 390/481/365 +f 132/491/267 393/492/373 390/481/365 +f 131/493/272 194/122/71 393/492/373 +f 393/492/373 195/136/85 392/483/367 +f 391/484/368 195/136/85 196/135/84 +f 118/494/235 196/135/84 66/134/83 +f 117/495/237 391/484/368 118/494/235 +f 385/480/364 117/495/237 116/486/233 +f 395/496/374 397/497/375 394/498/376 +f 395/496/374 399/499/377 398/500/378 +f 397/497/375 401/501/379 400/502/380 +f 399/499/377 401/501/379 398/500/378 +f 197/146/95 143/503/282 74/145/94 +f 198/160/109 394/498/376 197/146/95 +f 198/160/109 396/504/381 395/496/374 +f 199/159/108 124/505/248 396/504/381 +f 396/504/381 123/506/250 399/499/377 +f 123/506/250 402/507/382 399/499/377 +f 122/508/255 200/129/78 402/507/382 +f 402/507/382 201/509/383 401/501/379 +f 400/502/380 201/509/383 202/127/76 +f 145/510/284 202/127/76 75/126/75 +f 144/355/286 400/502/380 145/510/284 +f 394/498/376 144/355/286 143/503/282 +f 404/511/384 406/512/385 403/513/386 +f 404/511/384 408/514/387 407/515/388 +f 406/512/385 410/516/389 409/517/390 +f 408/514/387 410/516/389 407/515/388 +f 203/100/49 128/518/252 69/102/51 +f 204/101/50 403/513/386 203/100/49 +f 204/101/50 405/519/391 404/511/384 +f 205/99/48 121/520/238 405/519/391 +f 405/519/391 120/521/240 408/514/387 +f 120/521/240 411/522/392 408/514/387 +f 119/523/236 206/133/82 411/522/392 +f 411/522/392 207/132/81 410/516/389 +f 409/517/390 207/132/81 208/131/80 +f 130/524/254 208/131/80 70/130/79 +f 129/525/256 409/517/390 130/524/254 +f 403/513/386 129/525/256 128/518/252 +f 413/526/393 415/527/394 412/528/395 +f 413/526/393 417/529/396 416/530/397 +f 415/527/394 419/531/398 418/532/399 +f 417/529/396 419/531/398 416/530/397 +f 209/533/400 80/218/167 53/216/165 +f 210/534/401 412/528/395 209/533/400 +f 210/534/401 414/535/402 413/526/393 +f 211/536/403 115/292/232 414/535/402 +f 414/535/402 114/294/234 417/529/396 +f 114/294/234 420/537/404 417/529/396 +f 113/301/239 212/538/47 420/537/404 +f 420/537/404 213/539/61 419/531/398 +f 418/532/399 213/539/61 214/540/60 +f 82/221/169 214/540/60 54/220/59 +f 81/223/171 418/532/399 82/221/169 +f 412/528/395 81/223/171 80/218/167 +f 422/541/405 424/542/406 421/543/407 +f 422/541/405 426/544/408 425/545/409 +f 424/542/406 428/546/410 427/547/411 +f 426/544/408 428/546/410 425/545/409 +f 215/548/106 125/549/249 68/310/107 +f 216/550/105 421/543/407 215/548/106 +f 216/550/105 423/551/412 422/541/405 +f 217/552/104 91/239/185 423/551/412 +f 423/551/412 90/241/187 426/544/408 +f 90/241/187 429/553/413 426/544/408 +f 89/236/183 218/105/54 429/553/413 +f 429/553/413 219/554/414 428/546/410 +f 427/547/411 219/554/414 220/103/52 +f 127/555/251 220/103/52 69/102/51 +f 126/556/253 427/547/411 127/555/251 +f 421/543/407 126/556/253 125/549/249 +f 430/557/415 434/558/416 433/559/417 +f 432/560/418 434/558/416 431/561/419 +f 434/558/416 436/562/420 433/559/417 +f 434/558/416 438/563/421 437/564/422 +f 59/253/198 430/557/415 149/367/297 +f 175/439/341 431/561/419 430/557/415 +f 173/436/338 431/561/419 174/437/339 +f 71/329/264 432/560/418 173/436/338 +f 193/489/372 435/565/423 432/560/418 +f 435/565/423 191/485/369 438/563/421 +f 438/563/421 65/291/231 211/536/403 +f 437/564/422 211/536/403 210/534/401 +f 437/564/422 209/533/400 436/562/420 +f 436/562/420 53/216/165 151/370/300 +f 433/559/417 151/370/300 150/368/298 +f 149/367/297 433/559/417 150/368/298 +f 221/89/38 222/93/42 225/90/39 +f 223/92/41 226/104/53 225/90/39 +f 225/90/39 228/96/45 227/94/43 +f 225/90/39 226/104/53 229/95/44 +f 67/97/46 205/99/48 221/89/38 +f 205/99/48 204/101/50 222/93/42 +f 203/100/49 223/92/41 222/93/42 +f 69/102/51 220/103/52 223/92/41 +f 220/103/52 219/554/414 226/104/53 +f 226/104/53 219/554/414 218/105/54 +f 229/95/44 218/105/54 56/106/55 +f 228/96/45 229/95/44 157/107/56 +f 228/96/45 156/108/57 155/109/58 +f 227/94/43 155/109/58 54/110/59 +f 224/91/40 227/94/43 214/111/60 +f 212/98/47 221/89/38 224/91/40 +f 230/113/62 231/117/66 234/114/63 +f 232/116/65 235/128/77 234/114/63 +f 234/114/63 237/120/69 236/118/67 +f 234/114/63 235/128/77 238/119/68 +f 73/121/70 187/123/72 230/113/62 +f 187/123/72 186/125/74 231/117/66 +f 185/124/73 232/116/65 231/117/66 +f 75/126/75 202/127/76 232/116/65 +f 202/127/76 201/509/383 235/128/77 +f 235/128/77 201/509/383 200/129/78 +f 238/119/68 200/129/78 70/130/79 +f 237/120/69 238/119/68 208/131/80 +f 237/120/69 207/132/81 206/133/82 +f 236/118/67 206/133/82 66/134/83 +f 233/115/64 236/118/67 196/135/84 +f 194/122/71 230/113/62 233/115/64 +f 239/137/86 240/141/90 243/138/87 +f 241/140/89 244/152/101 243/138/87 +f 243/138/87 246/144/93 245/142/91 +f 243/138/87 244/152/101 247/143/92 +f 74/145/94 181/147/96 239/137/86 +f 181/147/96 180/149/98 240/141/90 +f 179/148/97 241/140/89 240/141/90 +f 62/150/99 163/151/100 241/140/89 +f 163/151/100 162/566/318 244/152/101 +f 244/152/101 162/566/318 161/153/102 +f 247/143/92 161/153/102 57/154/103 +f 246/144/93 247/143/92 217/155/104 +f 246/144/93 216/156/105 215/157/106 +f 245/142/91 215/157/106 68/158/107 +f 242/139/88 245/142/91 199/159/108 +f 197/146/95 239/137/86 242/139/88 +f 248/161/110 249/165/114 252/162/111 +f 250/164/113 253/176/125 252/162/111 +f 252/162/111 255/168/117 254/166/115 +f 252/162/111 253/176/125 256/167/116 +f 55/169/118 160/171/120 248/161/110 +f 160/171/120 159/173/122 249/165/114 +f 158/172/121 250/164/113 249/165/114 +f 58/174/123 166/175/124 250/164/113 +f 166/175/124 165/411/321 253/176/125 +f 253/176/125 165/411/321 164/177/126 +f 256/167/116 164/177/126 64/178/127 +f 255/168/117 256/167/116 172/179/128 +f 255/168/117 171/180/129 170/181/130 +f 254/166/115 170/181/130 60/182/131 +f 251/163/112 254/166/115 154/183/132 +f 152/170/119 248/161/110 251/163/112 +f 257/185/134 258/189/138 261/186/135 +f 259/188/137 262/200/149 261/186/135 +f 261/186/135 264/192/141 263/190/139 +f 261/186/135 262/200/149 265/191/140 +f 61/193/142 169/195/144 257/185/134 +f 169/195/144 168/197/146 258/189/138 +f 167/196/145 259/188/137 258/189/138 +f 63/198/147 184/199/148 259/188/137 +f 184/199/148 183/460/352 262/200/149 +f 262/200/149 183/460/352 182/201/150 +f 265/191/140 182/201/150 76/202/151 +f 264/192/141 265/191/140 190/203/152 +f 264/192/141 189/204/153 188/205/154 +f 263/190/139 188/205/154 72/206/155 +f 260/187/136 263/190/139 178/207/156 +f 176/194/143 257/185/134 260/187/136 +f 267/209/158 268/213/162 266/210/159 +f 269/212/161 270/215/164 266/210/159 +f 271/214/163 272/211/160 266/210/159 +f 53/216/165 80/218/167 267/209/158 +f 80/218/167 81/223/171 268/213/162 +f 79/217/166 267/209/158 272/211/160 +f 54/220/59 83/222/170 269/212/161 +f 83/222/170 84/227/174 270/215/164 +f 82/221/169 269/212/161 268/213/162 +f 55/224/118 77/226/173 271/214/163 +f 77/226/173 78/219/168 272/211/160 +f 85/225/172 271/214/163 270/215/164 +f 274/228/175 275/232/179 273/229/176 +f 276/231/178 277/234/181 273/229/176 +f 278/233/180 279/230/177 273/229/176 +f 56/106/55 89/236/183 274/228/175 +f 89/236/183 90/241/187 275/232/179 +f 88/235/182 274/228/175 279/230/177 +f 57/238/103 92/240/186 276/231/178 +f 92/240/186 93/245/190 277/234/181 +f 91/239/185 276/231/178 275/232/179 +f 58/242/123 86/244/189 278/233/180 +f 86/244/189 87/237/184 279/230/177 +f 94/243/188 278/233/180 277/234/181 +f 281/246/191 282/250/195 280/247/192 +f 283/249/194 284/252/197 280/247/192 +f 285/251/196 286/248/193 280/247/192 +f 59/253/198 98/255/200 281/246/191 +f 98/255/200 99/260/204 282/250/195 +f 97/254/199 281/246/191 286/248/193 +f 60/257/131 101/259/203 283/249/194 +f 101/259/203 102/264/207 284/252/197 +f 100/258/202 283/249/194 282/250/195 +f 61/261/142 95/263/206 285/251/196 +f 95/263/206 96/256/201 286/248/193 +f 103/262/205 285/251/196 284/252/197 +f 288/265/208 289/269/212 287/266/209 +f 290/268/211 291/271/214 287/266/209 +f 292/270/213 293/267/210 287/266/209 +f 62/272/99 107/274/216 288/265/208 +f 107/274/216 108/279/220 289/269/212 +f 106/273/215 288/265/208 293/267/210 +f 63/276/147 110/278/219 290/268/211 +f 110/278/219 111/283/223 291/271/214 +f 109/277/218 290/268/211 289/269/212 +f 64/280/127 104/282/222 292/270/213 +f 104/282/222 105/275/217 293/267/210 +f 112/281/221 292/270/213 291/271/214 +f 295/284/224 296/288/228 294/285/225 +f 297/287/227 298/290/230 294/285/225 +f 299/289/229 300/286/226 294/285/225 +f 65/291/231 116/293/233 295/284/224 +f 116/293/233 117/298/237 296/288/228 +f 115/292/232 295/284/224 300/286/226 +f 66/295/83 119/297/236 297/287/227 +f 119/297/236 120/302/240 298/290/230 +f 118/296/235 297/287/227 296/288/228 +f 67/299/46 113/301/239 299/289/229 +f 113/301/239 114/294/234 300/286/226 +f 121/300/238 299/289/229 298/290/230 +f 302/303/241 303/307/245 301/304/242 +f 304/306/244 305/309/247 301/304/242 +f 306/308/246 307/305/243 301/304/242 +f 68/310/107 125/312/249 302/303/241 +f 125/312/249 126/317/253 303/307/245 +f 124/311/248 302/303/241 307/305/243 +f 69/314/51 128/316/252 304/306/244 +f 128/316/252 129/321/256 305/309/247 +f 127/315/251 304/306/244 303/307/245 +f 70/318/79 122/320/255 306/308/246 +f 122/320/255 123/313/250 307/305/243 +f 130/319/254 306/308/246 305/309/247 +f 309/322/257 310/326/261 308/323/258 +f 311/325/260 312/328/263 308/323/258 +f 313/327/262 314/324/259 308/323/258 +f 71/329/264 134/331/266 309/322/257 +f 134/331/266 135/336/270 310/326/261 +f 133/330/265 309/322/257 314/324/259 +f 72/333/155 137/335/269 311/325/260 +f 137/335/269 138/340/273 312/328/263 +f 136/334/268 311/325/260 310/326/261 +f 73/337/70 131/339/272 313/327/262 +f 131/339/272 132/332/267 314/324/259 +f 139/338/271 313/327/262 312/328/263 +f 316/341/274 317/345/278 315/342/275 +f 318/344/277 319/347/280 315/342/275 +f 320/346/279 321/343/276 315/342/275 +f 74/348/94 143/350/282 316/341/274 +f 143/350/282 144/355/286 317/345/278 +f 142/349/281 316/341/274 321/343/276 +f 75/352/75 146/354/285 318/344/277 +f 146/354/285 147/359/289 319/347/280 +f 145/353/284 318/344/277 317/345/278 +f 76/356/151 140/358/288 320/346/279 +f 140/358/288 141/351/283 321/343/276 +f 148/357/287 320/346/279 319/347/280 +f 323/360/290 326/364/294 325/361/291 +f 323/360/290 324/369/299 327/363/293 +f 325/361/291 326/364/294 329/365/295 +f 327/363/293 330/371/301 329/365/295 +f 149/367/297 322/362/292 98/255/200 +f 150/368/298 323/360/290 322/362/292 +f 150/368/298 151/370/300 324/369/299 +f 151/370/300 53/216/165 79/217/166 +f 324/369/299 79/217/166 78/219/168 +f 78/219/168 77/226/173 330/371/301 +f 77/226/173 55/224/118 152/372/119 +f 330/371/301 152/372/119 153/373/133 +f 328/366/296 329/365/295 153/373/133 +f 100/258/202 328/366/296 154/374/132 +f 99/260/204 325/361/291 328/366/296 +f 322/362/292 325/361/291 99/260/204 +f 332/375/302 335/379/306 334/376/303 +f 332/375/302 333/386/309 336/378/305 +f 334/376/303 335/379/306 338/380/307 +f 336/378/305 339/390/310 338/380/307 +f 155/382/58 331/377/304 83/383/170 +f 156/385/57 332/375/302 331/377/304 +f 156/385/57 157/387/56 333/386/309 +f 157/387/56 56/567/55 88/388/182 +f 333/386/309 88/388/182 87/389/184 +f 87/389/184 86/391/189 339/390/310 +f 86/391/189 58/174/123 158/172/121 +f 339/390/310 158/172/121 159/173/122 +f 337/381/308 338/380/307 159/173/122 +f 85/392/172 337/381/308 160/171/120 +f 84/393/174 334/376/303 337/381/308 +f 331/377/304 334/376/303 84/393/174 +f 341/394/311 344/398/315 343/395/312 +f 341/394/311 342/405/319 345/397/314 +f 343/395/312 344/398/315 347/399/316 +f 345/397/314 348/409/320 347/399/316 +f 161/401/102 340/396/313 92/402/186 +f 162/404/318 341/394/311 340/396/313 +f 162/404/318 163/406/100 342/405/319 +f 163/406/100 62/568/99 106/407/215 +f 342/405/319 106/407/215 105/408/217 +f 105/408/217 104/410/222 348/409/320 +f 104/410/222 64/178/127 164/177/126 +f 348/409/320 164/177/126 165/411/321 +f 346/400/317 347/399/316 165/411/321 +f 94/412/188 346/400/317 166/175/124 +f 93/413/190 343/395/312 346/400/317 +f 340/396/313 343/395/312 93/413/190 +f 350/414/322 353/418/326 352/415/323 +f 350/414/322 351/422/329 354/417/325 +f 352/415/323 353/418/326 356/419/327 +f 354/417/325 357/425/330 356/419/327 +f 167/196/145 349/416/324 110/421/219 +f 168/197/146 350/414/322 349/416/324 +f 168/197/146 169/195/144 351/422/329 +f 169/195/144 61/193/142 103/423/205 +f 351/422/329 103/423/205 102/424/207 +f 102/424/207 101/426/203 357/425/330 +f 101/426/203 60/182/131 170/181/130 +f 357/425/330 170/181/130 171/180/129 +f 355/420/328 356/419/327 171/180/129 +f 112/427/221 355/420/328 172/179/128 +f 111/428/223 352/415/323 355/420/328 +f 349/416/324 352/415/323 111/428/223 +f 359/429/331 362/433/335 361/430/332 +f 359/429/331 360/438/340 363/432/334 +f 361/430/332 362/433/335 365/434/336 +f 363/432/334 366/440/342 365/434/336 +f 173/436/338 358/431/333 134/331/266 +f 174/437/339 359/429/331 358/431/333 +f 174/437/339 175/439/341 360/438/340 +f 175/439/341 59/253/198 97/254/199 +f 360/438/340 97/254/199 96/256/201 +f 96/256/201 95/263/206 366/440/342 +f 95/263/206 61/261/142 176/441/143 +f 366/440/342 176/441/143 177/442/157 +f 364/435/337 365/434/336 177/442/157 +f 136/334/268 364/435/337 178/443/156 +f 135/336/270 361/430/332 364/435/337 +f 358/431/333 361/430/332 135/336/270 +f 368/444/343 371/448/347 370/445/344 +f 368/444/343 369/454/350 372/447/346 +f 370/445/344 371/448/347 374/449/348 +f 372/447/346 375/458/351 374/449/348 +f 179/451/97 367/446/345 107/452/216 +f 180/453/98 368/444/343 367/446/345 +f 180/453/98 181/455/96 369/454/350 +f 181/455/96 74/569/94 142/456/281 +f 369/454/350 142/456/281 141/457/283 +f 141/457/283 140/459/288 375/458/351 +f 140/459/288 76/202/151 182/201/150 +f 375/458/351 182/201/150 183/460/352 +f 373/450/349 374/449/348 183/460/352 +f 109/461/218 373/450/349 184/199/148 +f 108/462/220 370/445/344 373/450/349 +f 367/446/345 370/445/344 108/462/220 +f 377/463/353 380/467/357 379/464/354 +f 377/463/353 378/471/360 381/466/356 +f 379/464/354 380/467/357 383/468/358 +f 381/466/356 384/474/361 383/468/358 +f 185/124/73 376/465/355 146/470/285 +f 186/125/74 377/463/353 376/465/355 +f 186/125/74 187/123/72 378/471/360 +f 187/123/72 73/121/70 139/472/271 +f 378/471/360 139/472/271 138/473/273 +f 138/473/273 137/475/269 384/474/361 +f 137/475/269 72/206/155 188/205/154 +f 384/474/361 188/205/154 189/204/153 +f 382/469/359 383/468/358 189/204/153 +f 148/476/287 382/469/359 190/203/152 +f 147/477/289 379/464/354 382/469/359 +f 376/465/355 379/464/354 147/477/289 +f 386/478/362 389/482/366 388/479/363 +f 386/478/362 387/488/371 390/481/365 +f 388/479/363 389/482/366 392/483/367 +f 390/481/365 393/492/373 392/483/367 +f 191/485/369 385/480/364 116/486/233 +f 192/487/370 386/478/362 385/480/364 +f 192/487/370 193/489/372 387/488/371 +f 193/489/372 71/329/264 133/490/265 +f 387/488/371 133/490/265 132/491/267 +f 132/491/267 131/493/272 393/492/373 +f 131/493/272 73/121/70 194/122/71 +f 393/492/373 194/122/71 195/136/85 +f 391/484/368 392/483/367 195/136/85 +f 118/494/235 391/484/368 196/135/84 +f 117/495/237 388/479/363 391/484/368 +f 385/480/364 388/479/363 117/495/237 +f 395/496/374 398/500/378 397/497/375 +f 395/496/374 396/504/381 399/499/377 +f 397/497/375 398/500/378 401/501/379 +f 399/499/377 402/507/382 401/501/379 +f 197/146/95 394/498/376 143/503/282 +f 198/160/109 395/496/374 394/498/376 +f 198/160/109 199/159/108 396/504/381 +f 199/159/108 68/158/107 124/505/248 +f 396/504/381 124/505/248 123/506/250 +f 123/506/250 122/508/255 402/507/382 +f 122/508/255 70/130/79 200/129/78 +f 402/507/382 200/129/78 201/509/383 +f 400/502/380 401/501/379 201/509/383 +f 145/510/284 400/502/380 202/127/76 +f 144/355/286 397/497/375 400/502/380 +f 394/498/376 397/497/375 144/355/286 +f 404/511/384 407/515/388 406/512/385 +f 404/511/384 405/519/391 408/514/387 +f 406/512/385 407/515/388 410/516/389 +f 408/514/387 411/522/392 410/516/389 +f 203/100/49 403/513/386 128/518/252 +f 204/101/50 404/511/384 403/513/386 +f 204/101/50 205/99/48 405/519/391 +f 205/99/48 67/97/46 121/520/238 +f 405/519/391 121/520/238 120/521/240 +f 120/521/240 119/523/236 411/522/392 +f 119/523/236 66/134/83 206/133/82 +f 411/522/392 206/133/82 207/132/81 +f 409/517/390 410/516/389 207/132/81 +f 130/524/254 409/517/390 208/131/80 +f 129/525/256 406/512/385 409/517/390 +f 403/513/386 406/512/385 129/525/256 +f 413/526/393 416/530/397 415/527/394 +f 413/526/393 414/535/402 417/529/396 +f 415/527/394 416/530/397 419/531/398 +f 417/529/396 420/537/404 419/531/398 +f 209/533/400 412/528/395 80/218/167 +f 210/534/401 413/526/393 412/528/395 +f 210/534/401 211/536/403 414/535/402 +f 211/536/403 65/291/231 115/292/232 +f 414/535/402 115/292/232 114/294/234 +f 114/294/234 113/301/239 420/537/404 +f 113/301/239 67/299/46 212/538/47 +f 420/537/404 212/538/47 213/539/61 +f 418/532/399 419/531/398 213/539/61 +f 82/221/169 418/532/399 214/540/60 +f 81/223/171 415/527/394 418/532/399 +f 412/528/395 415/527/394 81/223/171 +f 422/541/405 425/545/409 424/542/406 +f 422/541/405 423/551/412 426/544/408 +f 424/542/406 425/545/409 428/546/410 +f 426/544/408 429/553/413 428/546/410 +f 215/548/106 421/543/407 125/549/249 +f 216/550/105 422/541/405 421/543/407 +f 216/550/105 217/552/104 423/551/412 +f 217/552/104 57/238/103 91/239/185 +f 423/551/412 91/239/185 90/241/187 +f 90/241/187 89/236/183 429/553/413 +f 89/236/183 56/106/55 218/105/54 +f 429/553/413 218/105/54 219/554/414 +f 427/547/411 428/546/410 219/554/414 +f 127/555/251 427/547/411 220/103/52 +f 126/556/253 424/542/406 427/547/411 +f 421/543/407 424/542/406 126/556/253 +f 430/557/415 431/561/419 434/558/416 +f 432/560/418 435/565/423 434/558/416 +f 434/558/416 437/564/422 436/562/420 +f 434/558/416 435/565/423 438/563/421 +f 59/253/198 175/439/341 430/557/415 +f 175/439/341 174/437/339 431/561/419 +f 173/436/338 432/560/418 431/561/419 +f 71/329/264 193/489/372 432/560/418 +f 193/489/372 192/487/370 435/565/423 +f 435/565/423 192/487/370 191/485/369 +f 438/563/421 191/485/369 65/291/231 +f 437/564/422 438/563/421 211/536/403 +f 437/564/422 210/534/401 209/533/400 +f 436/562/420 209/533/400 53/216/165 +f 433/559/417 436/562/420 151/370/300 +f 149/367/297 430/557/415 433/559/417 +o Cube.008_Cube.009 +v -7.000000 0.500000 0.500000 +v -7.000000 3.000000 0.500000 +v -7.000000 0.500000 -0.500000 +v -7.000000 3.000000 -0.500000 +v -6.000000 0.500000 0.500000 +v -6.000000 3.000000 0.500000 +v -6.000000 0.500000 -0.500000 +v -6.000000 3.000000 -0.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.009 +s off +f 440/570/424 441/571/424 439/572/424 +f 442/573/425 445/574/425 441/571/425 +f 446/575/426 443/576/426 445/574/426 +f 444/577/427 439/578/427 443/576/427 +f 445/574/428 439/579/428 441/580/428 +f 442/581/429 444/577/429 446/575/429 +f 440/570/424 442/573/424 441/571/424 +f 442/573/425 446/575/425 445/574/425 +f 446/575/426 444/577/426 443/576/426 +f 444/577/427 440/582/427 439/578/427 +f 445/574/428 443/576/428 439/579/428 +f 442/581/429 440/583/429 444/577/429 +o Cube.009_Cube.010 +v -7.000000 0.500000 -3.500000 +v -7.000000 5.500000 -3.500000 +v -7.000000 0.500000 -4.500000 +v -7.000000 5.500000 -4.500000 +v -6.000000 0.500000 -3.500000 +v -6.000000 5.500000 -3.500000 +v -6.000000 0.500000 -4.500000 +v -6.000000 5.500000 -4.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.010 +s off +f 448/584/430 449/585/430 447/586/430 +f 450/587/431 453/588/431 449/585/431 +f 454/589/432 451/590/432 453/588/432 +f 452/591/433 447/592/433 451/590/433 +f 453/588/434 447/593/434 449/594/434 +f 450/595/435 452/591/435 454/589/435 +f 448/584/430 450/587/430 449/585/430 +f 450/587/431 454/589/431 453/588/431 +f 454/589/432 452/591/432 451/590/432 +f 452/591/433 448/596/433 447/592/433 +f 453/588/434 451/590/434 447/593/434 +f 450/595/435 448/597/435 452/591/435 +o Cube.010_Cube.011 +v -7.000000 0.500000 -7.500000 +v -7.000000 10.500000 -7.500000 +v -7.000000 0.500000 -8.500000 +v -7.000000 10.500000 -8.500000 +v -6.000000 0.500000 -7.500000 +v -6.000000 10.500000 -7.500000 +v -6.000000 0.500000 -8.500000 +v -6.000000 10.500000 -8.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.011 +s off +f 456/598/436 457/599/436 455/600/436 +f 458/601/437 461/602/437 457/599/437 +f 462/603/438 459/604/438 461/602/438 +f 460/605/439 455/606/439 459/604/439 +f 461/602/440 455/607/440 457/608/440 +f 458/609/441 460/605/441 462/603/441 +f 456/598/436 458/601/436 457/599/436 +f 458/601/437 462/603/437 461/602/437 +f 462/603/438 460/605/438 459/604/438 +f 460/605/439 456/610/439 455/606/439 +f 461/602/440 459/604/440 455/607/440 +f 458/609/441 456/611/441 460/605/441 +o Cube.011_Cube.012 +v 10.000000 0.000000 11.000000 +v 10.000000 10.000000 11.000000 +v -10.000000 0.000000 11.000000 +v -10.000000 10.000000 11.000000 +v 10.000000 0.000000 10.000000 +v 10.000000 10.000000 10.000000 +v -10.000000 0.000000 10.000000 +v -10.000000 10.000000 10.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.013 +s off +f 464/612/442 465/613/442 463/614/442 +f 466/615/443 469/616/443 465/613/443 +f 470/617/444 467/618/444 469/616/444 +f 468/619/445 463/620/445 467/618/445 +f 469/616/446 463/621/446 465/622/446 +f 466/623/447 468/619/447 470/617/447 +f 464/612/442 466/615/442 465/613/442 +f 466/615/443 470/617/443 469/616/443 +f 470/617/444 468/619/444 467/618/444 +f 468/619/445 464/624/445 463/620/445 +f 469/616/446 467/618/446 463/621/446 +f 466/623/447 464/625/447 468/619/447 +o Cube.012_Cube.013 +v 10.000000 0.000000 -10.000000 +v 10.000000 10.000000 -10.000000 +v -10.000000 0.000000 -10.000000 +v -10.000000 10.000000 -10.000000 +v 10.000000 0.000000 -11.000000 +v 10.000000 10.000000 -11.000000 +v -10.000000 0.000000 -11.000000 +v -10.000000 10.000000 -11.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.014 +s off +f 472/626/448 473/627/448 471/628/448 +f 474/629/449 477/630/449 473/627/449 +f 478/631/450 475/632/450 477/630/450 +f 476/633/451 471/634/451 475/632/451 +f 477/630/452 471/635/452 473/636/452 +f 474/637/453 476/633/453 478/631/453 +f 472/626/448 474/629/448 473/627/448 +f 474/629/449 478/631/449 477/630/449 +f 478/631/450 476/633/450 475/632/450 +f 476/633/451 472/638/451 471/634/451 +f 477/630/452 475/632/452 471/635/452 +f 474/637/453 472/639/453 476/633/453 +o Cube.017_Cube.018 +v -3.500000 0.000000 10.000000 +v -3.500000 0.500000 10.000000 +v -3.500000 0.000000 6.000000 +v -3.500000 0.500000 6.000000 +v 2.500000 0.000000 10.000000 +v 2.500000 0.500000 10.000000 +v 2.500000 0.000000 6.000000 +v 2.500000 0.500000 6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.019 +s off +f 480/640/454 481/641/454 479/642/454 +f 482/643/455 485/644/455 481/641/455 +f 486/645/456 483/646/456 485/644/456 +f 484/647/457 479/648/457 483/646/457 +f 485/644/458 479/649/458 481/650/458 +f 482/651/459 484/647/459 486/645/459 +f 480/640/454 482/643/454 481/641/454 +f 482/643/455 486/645/455 485/644/455 +f 486/645/456 484/647/456 483/646/456 +f 484/647/457 480/652/457 479/648/457 +f 485/644/458 483/646/458 479/649/458 +f 482/651/459 480/653/459 484/647/459 +o Cube.016_Cube.017 +v -3.500000 0.000000 6.000000 +v -3.500000 0.500000 6.000000 +v -3.500000 0.000000 2.000000 +v -3.500000 0.500000 2.000000 +v 2.500000 0.000000 6.000000 +v 2.500000 0.500000 6.000000 +v 2.500000 0.000000 2.000000 +v 2.500000 0.500000 2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.018 +s off +f 488/654/460 489/655/460 487/656/460 +f 490/657/461 493/658/461 489/655/461 +f 494/659/462 491/660/462 493/658/462 +f 492/661/463 487/662/463 491/660/463 +f 493/658/464 487/663/464 489/664/464 +f 490/665/465 492/661/465 494/659/465 +f 488/654/460 490/657/460 489/655/460 +f 490/657/461 494/659/461 493/658/461 +f 494/659/462 492/661/462 491/660/462 +f 492/661/463 488/666/463 487/662/463 +f 493/658/464 491/660/464 487/663/464 +f 490/665/465 488/667/465 492/661/465 +o Cube.015_Cube.016 +v -3.500000 0.000000 2.000000 +v -3.500000 0.500000 2.000000 +v -3.500000 0.000000 -2.000000 +v -3.500000 0.500000 -2.000000 +v 2.500000 0.000000 2.000000 +v 2.500000 0.500000 2.000000 +v 2.500000 0.000000 -2.000000 +v 2.500000 0.500000 -2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.017 +s off +f 496/668/466 497/669/466 495/670/466 +f 498/671/467 501/672/467 497/669/467 +f 502/673/468 499/674/468 501/672/468 +f 500/675/469 495/676/469 499/674/469 +f 501/672/470 495/677/470 497/678/470 +f 498/679/471 500/675/471 502/673/471 +f 496/668/466 498/671/466 497/669/466 +f 498/671/467 502/673/467 501/672/467 +f 502/673/468 500/675/468 499/674/468 +f 500/675/469 496/680/469 495/676/469 +f 501/672/470 499/674/470 495/677/470 +f 498/679/471 496/681/471 500/675/471 +o Cube.014_Cube.015 +v -3.500000 0.000000 -2.000000 +v -3.500000 0.500000 -2.000000 +v -3.500000 0.000000 -6.000000 +v -3.500000 0.500000 -6.000000 +v 2.500000 0.000000 -2.000000 +v 2.500000 0.500000 -2.000000 +v 2.500000 0.000000 -6.000000 +v 2.500000 0.500000 -6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.016 +s off +f 504/682/472 505/683/472 503/684/472 +f 506/685/473 509/686/473 505/683/473 +f 510/687/474 507/688/474 509/686/474 +f 508/689/475 503/690/475 507/688/475 +f 509/686/476 503/691/476 505/692/476 +f 506/693/477 508/689/477 510/687/477 +f 504/682/472 506/685/472 505/683/472 +f 506/685/473 510/687/473 509/686/473 +f 510/687/474 508/689/474 507/688/474 +f 508/689/475 504/694/475 503/690/475 +f 509/686/476 507/688/476 503/691/476 +f 506/693/477 504/695/477 508/689/477 +o Cube.013_Cube.014 +v -3.500000 0.000000 -6.000000 +v -3.500000 0.500000 -6.000000 +v -3.500000 0.000000 -10.000000 +v -3.500000 0.500000 -10.000000 +v 2.500000 0.000000 -6.000000 +v 2.500000 0.500000 -6.000000 +v 2.500000 0.000000 -10.000000 +v 2.500000 0.500000 -10.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.015 +s off +f 512/696/478 513/697/478 511/698/478 +f 514/699/479 517/700/479 513/697/479 +f 518/701/480 515/702/480 517/700/480 +f 516/703/481 511/704/481 515/702/481 +f 517/700/482 511/705/482 513/706/482 +f 514/707/483 516/703/483 518/701/483 +f 512/696/478 514/699/478 513/697/478 +f 514/699/479 518/701/479 517/700/479 +f 518/701/480 516/703/480 515/702/480 +f 516/703/481 512/708/481 511/704/481 +f 517/700/482 515/702/482 511/705/482 +f 514/707/483 512/709/483 516/703/483 +o Cube.018_Cube.019 +v -1.000000 0.500000 -3.500000 +v -1.000000 5.500000 -3.500000 +v -1.000000 0.500000 -4.500000 +v -1.000000 5.500000 -4.500000 +v 0.000000 0.500000 -3.500000 +v 0.000000 5.500000 -3.500000 +v 0.000000 0.500000 -4.500000 +v 0.000000 5.500000 -4.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.024 +s off +f 520/710/484 521/711/484 519/712/484 +f 522/713/485 525/714/485 521/711/485 +f 526/715/486 523/716/486 525/714/486 +f 524/717/487 519/718/487 523/716/487 +f 525/714/488 519/719/488 521/720/488 +f 522/721/489 524/717/489 526/715/489 +f 520/710/484 522/713/484 521/711/484 +f 522/713/485 526/715/485 525/714/485 +f 526/715/486 524/717/486 523/716/486 +f 524/717/487 520/722/487 519/718/487 +f 525/714/488 523/716/488 519/719/488 +f 522/721/489 520/723/489 524/717/489 +o Cube.019_Cube.020 +v -1.000000 0.500000 -7.500000 +v -1.000000 5.500000 -7.500000 +v -1.000000 0.500000 -8.500000 +v -1.000000 5.500000 -8.500000 +v 0.000000 0.500000 -7.500000 +v 0.000000 5.500000 -7.500000 +v 0.000000 0.500000 -8.500000 +v 0.000000 5.500000 -8.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.024 +s off +f 528/724/490 529/725/490 527/726/490 +f 530/727/491 533/728/491 529/725/491 +f 534/729/492 531/730/492 533/728/492 +f 532/731/493 527/732/493 531/730/493 +f 533/728/494 527/733/494 529/734/494 +f 530/735/495 532/731/495 534/729/495 +f 528/724/490 530/727/490 529/725/490 +f 530/727/491 534/729/491 533/728/491 +f 534/729/492 532/731/492 531/730/492 +f 532/731/493 528/736/493 527/732/493 +f 533/728/494 531/730/494 527/733/494 +f 530/735/495 528/737/495 532/731/495 +o Cube.020_Cube.021 +v -1.000000 0.500000 0.500000 +v -1.000000 5.500000 0.500000 +v -1.000000 0.500000 -0.500000 +v -1.000000 5.500000 -0.500000 +v 0.000000 0.500000 0.500000 +v 0.000000 5.500000 0.500000 +v 0.000000 0.500000 -0.500000 +v 0.000000 5.500000 -0.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.024 +s off +f 536/738/496 537/739/496 535/740/496 +f 538/741/497 541/742/497 537/739/497 +f 542/743/498 539/744/498 541/742/498 +f 540/745/499 535/746/499 539/744/499 +f 541/742/500 535/747/500 537/748/500 +f 538/749/501 540/745/501 542/743/501 +f 536/738/496 538/741/496 537/739/496 +f 538/741/497 542/743/497 541/742/497 +f 542/743/498 540/745/498 539/744/498 +f 540/745/499 536/750/499 535/746/499 +f 541/742/500 539/744/500 535/747/500 +f 538/749/501 536/751/501 540/745/501 +o Cube.021_Cube.022 +v -1.000000 0.500000 4.500000 +v -1.000000 5.500000 4.500000 +v -1.000000 0.500000 3.500000 +v -1.000000 5.500000 3.500000 +v 0.000000 0.500000 4.500000 +v 0.000000 5.500000 4.500000 +v 0.000000 0.500000 3.500000 +v 0.000000 5.500000 3.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.001 +s off +f 544/752/502 545/753/502 543/754/502 +f 546/755/503 549/756/503 545/753/503 +f 550/757/504 547/758/504 549/756/504 +f 548/759/505 543/760/505 547/758/505 +f 549/756/506 543/761/506 545/762/506 +f 546/763/507 548/759/507 550/757/507 +f 544/752/502 546/755/502 545/753/502 +f 546/755/503 550/757/503 549/756/503 +f 550/757/504 548/759/504 547/758/504 +f 548/759/505 544/764/505 543/760/505 +f 549/756/506 547/758/506 543/761/506 +f 546/763/507 544/765/507 548/759/507 +o Cube.022_Cube.023 +v -1.000000 0.500000 8.500000 +v -1.000000 5.500000 8.500000 +v -1.000000 0.500000 7.500000 +v -1.000000 5.500000 7.500000 +v 0.000000 0.500000 8.500000 +v 0.000000 5.500000 8.500000 +v 0.000000 0.500000 7.500000 +v 0.000000 5.500000 7.500000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.024 +s off +f 552/766/508 553/767/508 551/768/508 +f 554/769/509 557/770/509 553/767/509 +f 558/771/510 555/772/510 557/770/510 +f 556/773/511 551/774/511 555/772/511 +f 557/770/512 551/775/512 553/776/512 +f 554/777/513 556/773/513 558/771/513 +f 552/766/508 554/769/508 553/767/508 +f 554/769/509 558/771/509 557/770/509 +f 558/771/510 556/773/510 555/772/510 +f 556/773/511 552/778/511 551/774/511 +f 557/770/512 555/772/512 551/775/512 +f 554/777/513 552/779/513 556/773/513 +o Cube.023_Cube.024 +v 2.500000 0.000000 -6.000000 +v 2.500000 0.500000 -6.000000 +v 2.500000 0.000000 -10.000000 +v 2.500000 0.500000 -10.000000 +v 8.500000 0.000000 -6.000000 +v 8.500000 0.500000 -6.000000 +v 8.500000 0.000000 -10.000000 +v 8.500000 0.500000 -10.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.025 +s off +f 560/780/514 561/781/514 559/782/514 +f 562/783/515 565/784/515 561/781/515 +f 566/785/516 563/786/516 565/784/516 +f 564/787/517 559/788/517 563/786/517 +f 565/784/518 559/789/518 561/790/518 +f 562/791/519 564/787/519 566/785/519 +f 560/780/514 562/783/514 561/781/514 +f 562/783/515 566/785/515 565/784/515 +f 566/785/516 564/787/516 563/786/516 +f 564/787/517 560/792/517 559/788/517 +f 565/784/518 563/786/518 559/789/518 +f 562/791/519 560/793/519 564/787/519 +o Cube.024_Cube.025 +v 2.500000 0.000000 -2.000000 +v 2.500000 0.500000 -2.000000 +v 2.500000 0.000000 -6.000000 +v 2.500000 0.500000 -6.000000 +v 8.500000 0.000000 -2.000000 +v 8.500000 0.500000 -2.000000 +v 8.500000 0.000000 -6.000000 +v 8.500000 0.500000 -6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.026 +s off +f 568/794/520 569/795/520 567/796/520 +f 570/797/521 573/798/521 569/795/521 +f 574/799/522 571/800/522 573/798/522 +f 572/801/523 567/802/523 571/800/523 +f 573/798/524 567/803/524 569/804/524 +f 570/805/525 572/801/525 574/799/525 +f 568/794/520 570/797/520 569/795/520 +f 570/797/521 574/799/521 573/798/521 +f 574/799/522 572/801/522 571/800/522 +f 572/801/523 568/806/523 567/802/523 +f 573/798/524 571/800/524 567/803/524 +f 570/805/525 568/807/525 572/801/525 +o Cube.025_Cube.026 +v 2.500000 0.000000 2.000000 +v 2.500000 0.500000 2.000000 +v 2.500000 0.000000 -2.000000 +v 2.500000 0.500000 -2.000000 +v 8.500000 0.000000 2.000000 +v 8.500000 0.500000 2.000000 +v 8.500000 0.000000 -2.000000 +v 8.500000 0.500000 -2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.027 +s off +f 576/808/526 577/809/526 575/810/526 +f 578/811/527 581/812/527 577/809/527 +f 582/813/528 579/814/528 581/812/528 +f 580/815/529 575/816/529 579/814/529 +f 581/812/530 575/817/530 577/818/530 +f 578/819/531 580/815/531 582/813/531 +f 576/808/526 578/811/526 577/809/526 +f 578/811/527 582/813/527 581/812/527 +f 582/813/528 580/815/528 579/814/528 +f 580/815/529 576/820/529 575/816/529 +f 581/812/530 579/814/530 575/817/530 +f 578/819/531 576/821/531 580/815/531 +o Cube.026_Cube.027 +v 2.500000 0.000000 6.000000 +v 2.500000 0.500000 6.000000 +v 2.500000 0.000000 2.000000 +v 2.500000 0.500000 2.000000 +v 8.500000 0.000000 6.000000 +v 8.500000 0.500000 6.000000 +v 8.500000 0.000000 2.000000 +v 8.500000 0.500000 2.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.028 +s off +f 584/822/532 585/823/532 583/824/532 +f 586/825/533 589/826/533 585/823/533 +f 590/827/534 587/828/534 589/826/534 +f 588/829/535 583/830/535 587/828/535 +f 589/826/536 583/831/536 585/832/536 +f 586/833/537 588/829/537 590/827/537 +f 584/822/532 586/825/532 585/823/532 +f 586/825/533 590/827/533 589/826/533 +f 590/827/534 588/829/534 587/828/534 +f 588/829/535 584/834/535 583/830/535 +f 589/826/536 587/828/536 583/831/536 +f 586/833/537 584/835/537 588/829/537 +o Cube.027_Cube.028 +v 2.500000 0.000000 10.000000 +v 2.500000 0.500000 10.000000 +v 2.500000 0.000000 6.000000 +v 2.500000 0.500000 6.000000 +v 8.500000 0.000000 10.000000 +v 8.500000 0.500000 10.000000 +v 8.500000 0.000000 6.000000 +v 8.500000 0.500000 6.000000 +vt 0.625000 0.000000 +vt 0.375000 0.250000 +vt 0.375000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.500000 +vt 0.625000 0.500000 +vt 0.375000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 0.625000 1.000000 +vt 0.875000 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.029 +s off +f 592/836/538 593/837/538 591/838/538 +f 594/839/539 597/840/539 593/837/539 +f 598/841/540 595/842/540 597/840/540 +f 596/843/541 591/844/541 595/842/541 +f 597/840/542 591/845/542 593/846/542 +f 594/847/543 596/843/543 598/841/543 +f 592/836/538 594/839/538 593/837/538 +f 594/839/539 598/841/539 597/840/539 +f 598/841/540 596/843/540 595/842/540 +f 596/843/541 592/848/541 591/844/541 +f 597/840/542 595/842/542 591/845/542 +f 594/847/543 592/849/543 596/843/543 +o Cube.028_Cube.029 +v -6.807407 0.514815 4.307407 +v -6.807407 0.692593 4.485185 +v -6.985185 0.692593 4.307407 +v -6.807407 1.307407 4.485185 +v -6.807407 1.485185 4.307407 +v -6.985185 1.307407 4.307407 +v -6.807407 0.514815 3.692593 +v -6.985185 0.692593 3.692593 +v -6.807407 0.692593 3.514815 +v -6.807407 1.485185 3.692593 +v -6.807407 1.307407 3.514815 +v -6.985185 1.307407 3.692593 +v -6.192593 0.514815 4.307407 +v -6.014815 0.692593 4.307407 +v -6.192593 0.692593 4.485185 +v -6.192593 1.485185 4.307407 +v -6.192593 1.307407 4.485185 +v -6.014815 1.307407 4.307407 +v -6.192593 0.514815 3.692593 +v -6.192593 0.692593 3.514815 +v -6.014815 0.692593 3.692593 +v -6.192593 1.485185 3.692593 +v -6.014815 1.307407 3.692593 +v -6.192593 1.307407 3.514815 +v -6.976924 0.599204 4.306655 +v -6.953125 0.546875 4.306250 +v -6.900796 0.523076 4.306655 +v -6.806655 0.523076 4.400796 +v -6.806250 0.546875 4.453125 +v -6.806655 0.599204 4.476924 +v -6.900796 0.693345 4.476924 +v -6.953125 0.693750 4.453125 +v -6.976924 0.693345 4.400796 +v -6.976924 1.306655 4.400796 +v -6.953125 1.306250 4.453125 +v -6.900796 1.306655 4.476924 +v -6.806655 1.400796 4.476924 +v -6.806250 1.453125 4.453125 +v -6.806655 1.476924 4.400796 +v -6.900796 1.476924 4.306655 +v -6.953125 1.453125 4.306250 +v -6.976924 1.400796 4.306655 +v -6.806655 0.599204 3.523076 +v -6.806250 0.546875 3.546875 +v -6.806655 0.523076 3.599204 +v -6.900796 0.523076 3.693345 +v -6.953125 0.546875 3.693750 +v -6.976924 0.599204 3.693345 +v -6.976924 0.693345 3.599204 +v -6.953125 0.693750 3.546875 +v -6.900796 0.693345 3.523076 +v -6.976924 1.400796 3.693345 +v -6.953125 1.453125 3.693750 +v -6.900796 1.476924 3.693345 +v -6.806655 1.476924 3.599204 +v -6.806250 1.453125 3.546875 +v -6.806655 1.400796 3.523076 +v -6.900796 1.306655 3.523076 +v -6.953125 1.306250 3.546875 +v -6.976924 1.306655 3.599204 +v -6.193345 0.599204 4.476924 +v -6.193750 0.546875 4.453125 +v -6.193345 0.523076 4.400796 +v -6.099204 0.523076 4.306655 +v -6.046875 0.546875 4.306250 +v -6.023076 0.599204 4.306655 +v -6.023076 0.693345 4.400796 +v -6.046875 0.693750 4.453125 +v -6.099204 0.693345 4.476924 +v -6.023076 1.400796 4.306655 +v -6.046875 1.453125 4.306250 +v -6.099204 1.476924 4.306655 +v -6.193345 1.476924 4.400796 +v -6.193750 1.453125 4.453125 +v -6.193345 1.400796 4.476924 +v -6.099204 1.306655 4.476924 +v -6.046875 1.306250 4.453125 +v -6.023076 1.306655 4.400796 +v -6.023076 0.599204 3.693345 +v -6.046875 0.546875 3.693750 +v -6.099204 0.523076 3.693345 +v -6.193345 0.523076 3.599204 +v -6.193750 0.546875 3.546875 +v -6.193345 0.599204 3.523076 +v -6.099204 0.693345 3.523076 +v -6.046875 0.693750 3.546875 +v -6.023076 0.693345 3.599204 +v -6.193345 1.400796 3.523076 +v -6.193750 1.453125 3.546875 +v -6.193345 1.476924 3.599204 +v -6.099204 1.476924 3.693345 +v -6.046875 1.453125 3.693750 +v -6.023076 1.400796 3.693345 +v -6.023076 1.306655 3.599204 +v -6.046875 1.306250 3.546875 +v -6.099204 1.306655 3.523076 +v -6.807928 0.511169 3.832928 +v -6.808102 0.509954 4.000000 +v -6.807928 0.511169 4.167072 +v -6.988831 0.692072 4.167072 +v -6.990047 0.691898 4.000000 +v -6.988831 0.692072 3.832928 +v -6.807928 0.832928 4.488831 +v -6.808102 1.000000 4.490047 +v -6.807928 1.167072 4.488831 +v -6.988831 1.167072 4.307928 +v -6.990047 1.000000 4.308102 +v -6.988831 0.832928 4.307928 +v -6.807928 1.488831 4.167072 +v -6.808102 1.490046 4.000000 +v -6.807928 1.488831 3.832928 +v -6.988831 1.307928 3.832928 +v -6.990047 1.308102 4.000000 +v -6.988831 1.307928 4.167072 +v -6.807928 1.167072 3.511169 +v -6.808102 1.000000 3.509954 +v -6.807928 0.832928 3.511169 +v -6.988831 0.832928 3.692072 +v -6.990047 1.000000 3.691898 +v -6.988831 1.167072 3.692072 +v -6.332928 0.511169 3.692072 +v -6.500000 0.509954 3.691898 +v -6.667072 0.511169 3.692072 +v -6.667072 0.692072 3.511169 +v -6.500000 0.691898 3.509954 +v -6.332928 0.692072 3.511169 +v -6.667072 1.488831 3.692072 +v -6.500000 1.490046 3.691898 +v -6.332928 1.488831 3.692072 +v -6.332928 1.307928 3.511169 +v -6.500000 1.308102 3.509954 +v -6.667072 1.307928 3.511169 +v -6.011169 1.167072 3.692072 +v -6.009953 1.000000 3.691898 +v -6.011169 0.832928 3.692072 +v -6.192072 0.832928 3.511169 +v -6.191898 1.000000 3.509954 +v -6.192072 1.167072 3.511169 +v -6.192072 0.511169 4.167072 +v -6.191898 0.509954 4.000000 +v -6.192072 0.511169 3.832928 +v -6.011169 0.692072 3.832928 +v -6.009953 0.691898 4.000000 +v -6.011169 0.692072 4.167072 +v -6.192072 1.488831 3.832928 +v -6.191898 1.490046 4.000000 +v -6.192072 1.488831 4.167072 +v -6.011169 1.307928 4.167072 +v -6.009953 1.308102 4.000000 +v -6.011169 1.307928 3.832928 +v -6.192072 1.167072 4.488831 +v -6.191898 1.000000 4.490047 +v -6.192072 0.832928 4.488831 +v -6.011169 0.832928 4.307928 +v -6.009953 1.000000 4.308102 +v -6.011169 1.167072 4.307928 +v -6.667072 0.511169 4.307928 +v -6.500000 0.509954 4.308102 +v -6.332928 0.511169 4.307928 +v -6.332928 0.692072 4.488831 +v -6.500000 0.691898 4.490047 +v -6.667072 0.692072 4.488831 +v -6.332928 1.488831 4.307928 +v -6.500000 1.490046 4.308102 +v -6.667072 1.488831 4.307928 +v -6.667072 1.307928 4.488831 +v -6.500000 1.308102 4.490047 +v -6.332928 1.307928 4.488831 +v -6.332716 0.832717 4.493063 +v -6.332646 1.000000 4.494473 +v -6.332716 1.167283 4.493063 +v -6.500000 0.832646 4.494473 +v -6.500000 1.000000 4.495949 +v -6.500000 1.167354 4.494473 +v -6.667284 0.832717 4.493063 +v -6.667354 1.000000 4.494473 +v -6.667284 1.167283 4.493063 +v -6.006937 0.832717 3.832717 +v -6.005527 1.000000 3.832646 +v -6.006937 1.167283 3.832717 +v -6.005527 0.832646 4.000000 +v -6.004051 1.000000 4.000000 +v -6.005527 1.167354 4.000000 +v -6.006937 0.832717 4.167284 +v -6.005527 1.000000 4.167354 +v -6.006937 1.167283 4.167284 +v -6.332716 1.493063 3.832717 +v -6.500000 1.494473 3.832646 +v -6.667284 1.493063 3.832717 +v -6.332646 1.494473 4.000000 +v -6.500000 1.495949 4.000000 +v -6.667354 1.494473 4.000000 +v -6.332716 1.493063 4.167284 +v -6.500000 1.494473 4.167354 +v -6.667284 1.493063 4.167284 +v -6.993063 0.832717 4.167284 +v -6.994473 1.000000 4.167354 +v -6.993063 1.167283 4.167284 +v -6.994473 0.832646 4.000000 +v -6.995949 1.000000 4.000000 +v -6.994473 1.167354 4.000000 +v -6.993063 0.832717 3.832717 +v -6.994473 1.000000 3.832646 +v -6.993063 1.167283 3.832717 +v -6.667284 0.832717 3.506937 +v -6.667354 1.000000 3.505527 +v -6.667284 1.167283 3.506937 +v -6.500000 0.832646 3.505527 +v -6.500000 1.000000 3.504051 +v -6.500000 1.167354 3.505527 +v -6.332716 0.832717 3.506937 +v -6.332646 1.000000 3.505527 +v -6.332716 1.167283 3.506937 +v -6.938542 0.561458 4.438542 +v -6.898997 0.529764 4.398997 +v -6.897217 0.551213 4.448788 +v -6.898997 0.601003 4.470236 +v -6.948788 0.602783 4.448788 +v -6.970236 0.601003 4.398997 +v -6.948787 0.551213 4.397217 +v -6.938541 1.438542 4.438542 +v -6.898997 1.398997 4.470236 +v -6.897217 1.448787 4.448788 +v -6.898997 1.470236 4.398997 +v -6.948788 1.448787 4.397217 +v -6.970236 1.398997 4.398997 +v -6.948787 1.397217 4.448788 +v -6.938542 0.561458 3.561458 +v -6.898997 0.529764 3.601003 +v -6.948788 0.551213 3.602783 +v -6.970236 0.601003 3.601003 +v -6.948788 0.602783 3.551213 +v -6.898997 0.601003 3.529764 +v -6.897217 0.551213 3.551213 +v -6.938541 1.438542 3.561458 +v -6.898997 1.470236 3.601003 +v -6.897217 1.448787 3.551213 +v -6.898997 1.398997 3.529764 +v -6.948788 1.397217 3.551213 +v -6.970236 1.398997 3.601003 +v -6.948788 1.448787 3.602783 +v -6.061458 0.561458 4.438542 +v -6.101003 0.529764 4.398997 +v -6.051212 0.551213 4.397217 +v -6.029764 0.601003 4.398997 +v -6.051212 0.602783 4.448788 +v -6.101003 0.601003 4.470236 +v -6.102783 0.551213 4.448787 +v -6.061459 1.438542 4.438542 +v -6.101003 1.470236 4.398997 +v -6.102783 1.448787 4.448788 +v -6.101003 1.398997 4.470236 +v -6.051212 1.397217 4.448787 +v -6.029764 1.398997 4.398997 +v -6.051212 1.448787 4.397217 +v -6.061458 0.561458 3.561458 +v -6.101003 0.529764 3.601003 +v -6.102783 0.551213 3.551213 +v -6.101003 0.601003 3.529764 +v -6.051212 0.602783 3.551213 +v -6.029764 0.601003 3.601003 +v -6.051213 0.551213 3.602783 +v -6.061458 1.438542 3.561458 +v -6.101003 1.470236 3.601003 +v -6.051212 1.448787 3.602783 +v -6.029764 1.398997 3.601003 +v -6.051213 1.397217 3.551213 +v -6.101003 1.398997 3.529764 +v -6.102783 1.448787 3.551213 +v -6.901813 0.520350 3.833234 +v -6.902152 0.519441 4.000000 +v -6.901813 0.520350 4.166766 +v -6.954883 0.545117 3.833398 +v -6.955469 0.544531 4.000000 +v -6.954883 0.545117 4.166602 +v -6.979650 0.598187 3.833234 +v -6.980559 0.597848 4.000000 +v -6.979650 0.598187 4.166766 +v -6.901813 0.833234 4.479650 +v -6.902152 1.000000 4.480559 +v -6.901813 1.166766 4.479650 +v -6.954883 0.833398 4.454883 +v -6.955469 1.000000 4.455469 +v -6.954883 1.166602 4.454883 +v -6.979650 0.833234 4.401813 +v -6.980559 1.000000 4.402152 +v -6.979650 1.166766 4.401813 +v -6.901813 1.479650 4.166766 +v -6.902152 1.480559 4.000000 +v -6.901813 1.479650 3.833234 +v -6.954883 1.454883 4.166602 +v -6.955469 1.455469 4.000000 +v -6.954883 1.454883 3.833398 +v -6.979650 1.401813 4.166766 +v -6.980559 1.402152 4.000000 +v -6.979650 1.401813 3.833234 +v -6.901813 1.166766 3.520350 +v -6.902152 1.000000 3.519441 +v -6.901813 0.833234 3.520350 +v -6.954883 1.166602 3.545117 +v -6.955469 1.000000 3.544531 +v -6.954883 0.833398 3.545117 +v -6.979650 1.166766 3.598187 +v -6.980559 1.000000 3.597848 +v -6.979650 0.833234 3.598187 +v -6.333234 0.520350 3.598187 +v -6.500000 0.519441 3.597848 +v -6.666766 0.520350 3.598187 +v -6.333398 0.545117 3.545117 +v -6.500000 0.544531 3.544531 +v -6.666602 0.545117 3.545117 +v -6.333234 0.598187 3.520350 +v -6.500000 0.597848 3.519441 +v -6.666766 0.598187 3.520350 +v -6.666766 1.479650 3.598187 +v -6.500000 1.480559 3.597848 +v -6.333234 1.479650 3.598187 +v -6.666602 1.454883 3.545117 +v -6.500000 1.455469 3.544531 +v -6.333398 1.454883 3.545117 +v -6.666766 1.401813 3.520350 +v -6.500000 1.402152 3.519441 +v -6.333234 1.401813 3.520350 +v -6.020350 1.166766 3.598187 +v -6.019441 1.000000 3.597848 +v -6.020350 0.833234 3.598187 +v -6.045117 1.166602 3.545117 +v -6.044531 1.000000 3.544531 +v -6.045117 0.833398 3.545117 +v -6.098187 1.166766 3.520350 +v -6.097848 1.000000 3.519441 +v -6.098187 0.833234 3.520350 +v -6.098187 0.520350 4.166766 +v -6.097848 0.519441 4.000000 +v -6.098187 0.520350 3.833234 +v -6.045117 0.545117 4.166602 +v -6.044531 0.544531 4.000000 +v -6.045117 0.545117 3.833398 +v -6.020350 0.598187 4.166766 +v -6.019441 0.597848 4.000000 +v -6.020350 0.598187 3.833234 +v -6.098187 1.479650 3.833234 +v -6.097848 1.480559 4.000000 +v -6.098187 1.479650 4.166766 +v -6.045117 1.454883 3.833398 +v -6.044531 1.455469 4.000000 +v -6.045117 1.454883 4.166602 +v -6.020350 1.401813 3.833234 +v -6.019441 1.402152 4.000000 +v -6.020350 1.401813 4.166766 +v -6.098187 1.166766 4.479650 +v -6.097848 1.000000 4.480559 +v -6.098187 0.833234 4.479650 +v -6.045117 1.166602 4.454883 +v -6.044531 1.000000 4.455469 +v -6.045117 0.833398 4.454883 +v -6.020350 1.166766 4.401813 +v -6.019441 1.000000 4.402152 +v -6.020350 0.833234 4.401813 +v -6.666766 0.520350 4.401813 +v -6.500000 0.519441 4.402152 +v -6.333234 0.520350 4.401813 +v -6.666602 0.545117 4.454883 +v -6.500000 0.544531 4.455469 +v -6.333398 0.545117 4.454883 +v -6.666766 0.598187 4.479650 +v -6.500000 0.597848 4.480559 +v -6.333234 0.598187 4.479650 +v -6.333234 1.479650 4.401813 +v -6.500000 1.480559 4.402152 +v -6.666766 1.479650 4.401813 +v -6.333398 1.454883 4.454883 +v -6.500000 1.455469 4.455469 +v -6.666602 1.454883 4.454883 +v -6.333234 1.401813 4.479650 +v -6.500000 1.402152 4.480559 +v -6.666766 1.401813 4.479650 +v -6.667284 0.506937 3.832717 +v -6.500000 0.505527 3.832646 +v -6.332716 0.506937 3.832717 +v -6.667354 0.505527 4.000000 +v -6.500000 0.504051 4.000000 +v -6.332646 0.505527 4.000000 +v -6.667284 0.506937 4.167284 +v -6.500000 0.505527 4.167354 +v -6.332716 0.506937 4.167284 +vt 0.443485 0.825977 +vt 0.497049 0.877778 +vt 0.443381 0.876910 +vt 0.548376 0.826149 +vt 0.497879 0.828820 +vt 0.443496 0.931489 +vt 0.548568 0.931300 +vt 0.497971 0.931597 +vt 0.387500 0.762500 +vt 0.387500 0.818750 +vt 0.443658 0.785417 +vt 0.554036 0.785460 +vt 0.499262 0.790278 +vt 0.612500 0.762500 +vt 0.588103 0.820739 +vt 0.545549 0.876903 +vt 0.588065 0.929084 +vt 0.612500 0.987500 +vt 0.556250 0.987500 +vt 0.500000 0.987500 +vt 0.443750 0.987500 +vt 0.387500 0.987500 +vt 0.387500 0.931250 +vt 0.387500 0.875000 +vt 0.450911 0.575911 +vt 0.500000 0.625000 +vt 0.453472 0.625000 +vt 0.549089 0.575911 +vt 0.500000 0.578472 +vt 0.450911 0.674089 +vt 0.549089 0.674089 +vt 0.500000 0.671528 +vt 0.387500 0.512500 +vt 0.410460 0.570747 +vt 0.445747 0.535460 +vt 0.554254 0.535460 +vt 0.500000 0.540278 +vt 0.612500 0.512500 +vt 0.589540 0.570747 +vt 0.546528 0.625000 +vt 0.589540 0.679254 +vt 0.612500 0.737500 +vt 0.554253 0.714540 +vt 0.500000 0.709722 +vt 0.445747 0.714540 +vt 0.387500 0.737500 +vt 0.410460 0.679254 +vt 0.415278 0.625000 +vt 0.700977 0.568750 +vt 0.752778 0.625000 +vt 0.703820 0.625000 +vt 0.806489 0.568750 +vt 0.751910 0.568750 +vt 0.700977 0.681250 +vt 0.806489 0.681250 +vt 0.751910 0.681250 +vt 0.637500 0.512500 +vt 0.660417 0.568750 +vt 0.693750 0.512500 +vt 0.806250 0.512500 +vt 0.750000 0.512500 +vt 0.862500 0.512500 +vt 0.862500 0.568750 +vt 0.806597 0.625000 +vt 0.862500 0.681250 +vt 0.862500 0.737500 +vt 0.806250 0.737500 +vt 0.750000 0.737500 +vt 0.693750 0.737500 +vt 0.637500 0.737500 +vt 0.660417 0.681250 +vt 0.665278 0.625000 +vt 0.443485 0.076190 +vt 0.497049 0.125174 +vt 0.443381 0.125119 +vt 0.548376 0.076375 +vt 0.497879 0.079102 +vt 0.443485 0.174277 +vt 0.548376 0.174104 +vt 0.497879 0.171549 +vt 0.387500 0.012500 +vt 0.387500 0.068750 +vt 0.443658 0.036849 +vt 0.554036 0.036895 +vt 0.499262 0.042014 +vt 0.612500 0.012500 +vt 0.588105 0.070877 +vt 0.545551 0.125125 +vt 0.588105 0.179259 +vt 0.612500 0.237500 +vt 0.554036 0.214540 +vt 0.499262 0.209722 +vt 0.443658 0.214583 +vt 0.387500 0.237500 +vt 0.387500 0.181250 +vt 0.387500 0.125000 +vt 0.443485 0.325738 +vt 0.497049 0.375000 +vt 0.443381 0.375000 +vt 0.548376 0.325911 +vt 0.497879 0.328472 +vt 0.443485 0.424262 +vt 0.548376 0.424089 +vt 0.497879 0.421528 +vt 0.387500 0.262500 +vt 0.387500 0.318750 +vt 0.443658 0.285417 +vt 0.554036 0.285460 +vt 0.499262 0.290278 +vt 0.612500 0.262500 +vt 0.588105 0.320747 +vt 0.545551 0.375000 +vt 0.588105 0.429254 +vt 0.612500 0.487500 +vt 0.554036 0.464540 +vt 0.499262 0.459722 +vt 0.443658 0.464583 +vt 0.387500 0.487500 +vt 0.387500 0.431250 +vt 0.387500 0.375000 +vt 0.149935 0.725065 +vt 0.139046 0.735954 +vt 0.137343 0.726538 +vt 0.143034 0.743781 +vt 0.148463 0.737657 +vt 0.131219 0.731966 +vt 0.134988 0.740012 +vt 0.173148 0.701852 +vt 0.149754 0.702036 +vt 0.172964 0.725246 +vt 0.136343 0.704543 +vt 0.137500 0.750000 +vt 0.162540 0.745544 +vt 0.134375 0.746875 +vt 0.170457 0.738657 +vt 0.125000 0.737500 +vt 0.128125 0.740625 +vt 0.129456 0.712460 +vt 0.131250 0.743750 +vt 0.614785 0.982251 +vt 0.616580 0.987153 +vt 0.614821 0.990232 +vt 0.619570 0.982251 +vt 0.617254 0.978752 +vt 0.615109 0.994261 +vt 0.617522 0.990232 +vt 0.612500 0.990625 +vt 0.613071 0.962786 +vt 0.612500 0.993750 +vt 0.625000 0.987500 +vt 0.621009 0.962833 +vt 0.621875 0.990625 +vt 0.617376 0.957523 +vt 0.612500 1.000000 +vt 0.615625 0.996875 +vt 0.612500 0.996875 +vt 0.618750 0.993750 +vt 0.149935 0.524935 +vt 0.139046 0.514046 +vt 0.148463 0.512343 +vt 0.131219 0.518034 +vt 0.137343 0.523463 +vt 0.143034 0.506219 +vt 0.134988 0.509988 +vt 0.173148 0.548148 +vt 0.172964 0.524754 +vt 0.149754 0.547964 +vt 0.170457 0.511343 +vt 0.125000 0.512500 +vt 0.129456 0.537540 +vt 0.128125 0.509375 +vt 0.136343 0.545457 +vt 0.137500 0.500000 +vt 0.134375 0.503125 +vt 0.162540 0.504456 +vt 0.131250 0.506250 +vt 0.622381 0.259881 +vt 0.620833 0.258333 +vt 0.619933 0.257433 +vt 0.622382 0.259881 +vt 0.622635 0.260135 +vt 0.617737 0.255237 +vt 0.619933 0.257433 +vt 0.625000 0.262500 +vt 0.621875 0.259375 +vt 0.625000 0.262500 +vt 0.618750 0.256250 +vt 0.625000 0.262500 +vt 0.625000 0.262500 +vt 0.621875 0.259375 +vt 0.625000 0.262500 +vt 0.612500 0.250000 +vt 0.615625 0.253125 +vt 0.615625 0.253125 +vt 0.618750 0.256250 +vt 0.357251 0.739785 +vt 0.362153 0.741580 +vt 0.353752 0.742254 +vt 0.369261 0.740109 +vt 0.365232 0.739821 +vt 0.357251 0.744570 +vt 0.365232 0.742522 +vt 0.362500 0.737500 +vt 0.337742 0.738071 +vt 0.365625 0.737500 +vt 0.332523 0.742376 +vt 0.375000 0.737500 +vt 0.371875 0.737500 +vt 0.371875 0.740625 +vt 0.368750 0.737500 +vt 0.362500 0.750000 +vt 0.365625 0.746875 +vt 0.337833 0.746009 +vt 0.368750 0.743750 +vt 0.622381 0.759881 +vt 0.620833 0.758333 +vt 0.619933 0.757433 +vt 0.622382 0.759881 +vt 0.622635 0.760135 +vt 0.617737 0.755237 +vt 0.619933 0.757433 +vt 0.625000 0.762500 +vt 0.621875 0.759375 +vt 0.625000 0.762500 +vt 0.618750 0.756250 +vt 0.625000 0.762500 +vt 0.625000 0.762500 +vt 0.621875 0.759375 +vt 0.625000 0.762500 +vt 0.612500 0.750000 +vt 0.615625 0.753125 +vt 0.615625 0.753125 +vt 0.618750 0.756250 +vt 0.357251 0.510215 +vt 0.362153 0.508420 +vt 0.365232 0.510179 +vt 0.357251 0.505430 +vt 0.353752 0.507746 +vt 0.369261 0.509891 +vt 0.365232 0.507478 +vt 0.362500 0.512500 +vt 0.365625 0.512500 +vt 0.337742 0.511930 +vt 0.368750 0.512500 +vt 0.362500 0.500000 +vt 0.337833 0.503991 +vt 0.365625 0.503125 +vt 0.332523 0.507624 +vt 0.375000 0.512500 +vt 0.371875 0.509375 +vt 0.371875 0.512500 +vt 0.368750 0.506250 +vt 0.622381 0.509881 +vt 0.620833 0.508333 +vt 0.619933 0.507433 +vt 0.622382 0.509881 +vt 0.622635 0.510135 +vt 0.617737 0.505237 +vt 0.619933 0.507433 +vt 0.625000 0.512500 +vt 0.621875 0.509375 +vt 0.625000 0.512500 +vt 0.618750 0.506250 +vt 0.625000 0.512500 +vt 0.625000 0.512500 +vt 0.621875 0.509375 +vt 0.625000 0.512500 +vt 0.612500 0.500000 +vt 0.615625 0.503125 +vt 0.615625 0.503125 +vt 0.618750 0.506250 +vt 0.149420 0.625000 +vt 0.135914 0.581309 +vt 0.149501 0.583053 +vt 0.135914 0.668691 +vt 0.135800 0.625000 +vt 0.128759 0.625000 +vt 0.128865 0.576559 +vt 0.173018 0.583232 +vt 0.172975 0.625000 +vt 0.149501 0.666947 +vt 0.173018 0.666768 +vt 0.128865 0.673441 +vt 0.125000 0.681250 +vt 0.125000 0.625000 +vt 0.125000 0.568750 +vt 0.500000 0.003494 +vt 0.443750 0.008279 +vt 0.443750 0.003379 +vt 0.556250 0.008279 +vt 0.500000 0.009201 +vt 0.499908 0.020074 +vt 0.443738 0.017053 +vt 0.443750 0.000000 +vt 0.387500 0.003125 +vt 0.387500 0.000000 +vt 0.500000 0.000000 +vt 0.556250 0.003379 +vt 0.556250 0.000000 +vt 0.612500 0.003125 +vt 0.612500 0.006250 +vt 0.556054 0.017053 +vt 0.612500 0.009375 +vt 0.387500 0.009375 +vt 0.387500 0.006250 +vt 0.621506 0.125000 +vt 0.616721 0.068750 +vt 0.621621 0.068750 +vt 0.616721 0.181250 +vt 0.615799 0.125000 +vt 0.604926 0.125005 +vt 0.607947 0.068935 +vt 0.625000 0.068750 +vt 0.621875 0.012500 +vt 0.625000 0.012500 +vt 0.625000 0.125000 +vt 0.621621 0.181250 +vt 0.625000 0.181250 +vt 0.621875 0.237500 +vt 0.618750 0.237500 +vt 0.607947 0.181077 +vt 0.615625 0.237500 +vt 0.582986 0.125043 +vt 0.615625 0.012500 +vt 0.618750 0.012500 +vt 0.499908 0.265972 +vt 0.556250 0.250000 +vt 0.556054 0.263238 +vt 0.443750 0.250000 +vt 0.500000 0.250000 +vt 0.499908 0.234028 +vt 0.556054 0.236762 +vt 0.612500 0.256250 +vt 0.443738 0.263238 +vt 0.387500 0.256250 +vt 0.387500 0.250000 +vt 0.443738 0.236762 +vt 0.387500 0.243750 +vt 0.612500 0.243750 +vt 0.612500 0.250000 +vt 0.252137 0.522289 +vt 0.295825 0.508688 +vt 0.298602 0.517662 +vt 0.206401 0.510821 +vt 0.250741 0.510059 +vt 0.250093 0.503666 +vt 0.298708 0.503587 +vt 0.302470 0.537354 +vt 0.253009 0.545009 +vt 0.208321 0.524235 +vt 0.208608 0.547647 +vt 0.201571 0.503854 +vt 0.193750 0.500000 +vt 0.250000 0.500000 +vt 0.306250 0.500000 +vt 0.621506 0.375000 +vt 0.616721 0.318750 +vt 0.621621 0.318750 +vt 0.616721 0.431250 +vt 0.615799 0.375000 +vt 0.604926 0.375000 +vt 0.607947 0.318924 +vt 0.625000 0.318750 +vt 0.621875 0.262500 +vt 0.625000 0.375000 +vt 0.621621 0.431250 +vt 0.625000 0.431250 +vt 0.621875 0.487500 +vt 0.618750 0.487500 +vt 0.607947 0.431076 +vt 0.615625 0.487500 +vt 0.582986 0.375000 +vt 0.615625 0.262500 +vt 0.618750 0.262500 +vt 0.500000 0.515972 +vt 0.556250 0.500000 +vt 0.556076 0.513238 +vt 0.443750 0.500000 +vt 0.500000 0.500000 +vt 0.499908 0.484028 +vt 0.556054 0.486762 +vt 0.612500 0.506250 +vt 0.443924 0.513238 +vt 0.387500 0.506250 +vt 0.387500 0.500000 +vt 0.443738 0.486762 +vt 0.387500 0.493750 +vt 0.612500 0.493750 +vt 0.612500 0.500000 +vt 0.359028 0.625000 +vt 0.375000 0.681250 +vt 0.361762 0.681066 +vt 0.375000 0.568750 +vt 0.375000 0.625000 +vt 0.390972 0.625000 +vt 0.388238 0.681076 +vt 0.339493 0.679128 +vt 0.368750 0.737500 +vt 0.334722 0.625000 +vt 0.361762 0.568934 +vt 0.339493 0.570872 +vt 0.368750 0.512500 +vt 0.375000 0.512500 +vt 0.388238 0.568924 +vt 0.381250 0.512500 +vt 0.381250 0.737500 +vt 0.375000 0.737500 +vt 0.640972 0.625000 +vt 0.625000 0.568750 +vt 0.638238 0.568750 +vt 0.625000 0.681250 +vt 0.625000 0.625000 +vt 0.609028 0.625000 +vt 0.611762 0.568924 +vt 0.631250 0.512500 +vt 0.638238 0.681250 +vt 0.631250 0.737500 +vt 0.625000 0.737500 +vt 0.611762 0.681076 +vt 0.618750 0.737500 +vt 0.584722 0.625000 +vt 0.618750 0.512500 +vt 0.499908 0.765972 +vt 0.556250 0.750000 +vt 0.556054 0.763238 +vt 0.443750 0.750000 +vt 0.500000 0.750000 +vt 0.500000 0.734028 +vt 0.556076 0.736762 +vt 0.612500 0.756250 +vt 0.443738 0.763238 +vt 0.387500 0.756250 +vt 0.387500 0.750000 +vt 0.443924 0.736762 +vt 0.387500 0.743750 +vt 0.612500 0.743750 +vt 0.612500 0.750000 +vt 0.252137 0.727711 +vt 0.206401 0.739179 +vt 0.208321 0.725765 +vt 0.295825 0.741312 +vt 0.250741 0.739941 +vt 0.250093 0.746334 +vt 0.201571 0.746146 +vt 0.208608 0.702353 +vt 0.253009 0.704991 +vt 0.298602 0.732338 +vt 0.302470 0.712646 +vt 0.298708 0.746413 +vt 0.306250 0.750000 +vt 0.250000 0.750000 +vt 0.193750 0.750000 +vt 0.621466 0.872931 +vt 0.616714 0.818374 +vt 0.621616 0.818491 +vt 0.616412 0.920356 +vt 0.615741 0.871991 +vt 0.604885 0.872924 +vt 0.607942 0.818664 +vt 0.625000 0.818750 +vt 0.621875 0.762500 +vt 0.625000 0.875000 +vt 0.621430 0.923438 +vt 0.625000 0.931250 +vt 0.607610 0.923249 +vt 0.582972 0.874942 +vt 0.615625 0.762500 +vt 0.618750 0.762500 +vt 0.208473 0.582924 +vt 0.251657 0.625000 +vt 0.208369 0.625000 +vt 0.299194 0.576618 +vt 0.252349 0.581123 +vt 0.208473 0.667076 +vt 0.299194 0.673382 +vt 0.252349 0.668878 +vt 0.296735 0.625000 +vt 0.862500 0.625000 +vt 0.612500 0.000000 +vt 0.625000 0.237500 +vt 0.625000 0.487500 +vn 0.0188 -0.0188 0.9996 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.0198 0.9998 +vn 0.0188 0.0188 0.9996 +vn 0.0198 0.0000 0.9998 +vn -0.0188 -0.0188 0.9996 +vn -0.0188 0.0188 0.9996 +vn -0.0198 0.0000 0.9998 +vn 0.0559 -0.0559 0.9969 +vn 0.0159 -0.0631 0.9979 +vn 0.0631 -0.0159 0.9979 +vn 0.0631 0.0159 0.9979 +vn 0.0654 0.0000 0.9978 +vn 0.0559 0.0559 0.9969 +vn 0.0159 0.0631 0.9979 +vn 0.0000 0.0198 0.9998 +vn -0.0159 0.0631 0.9979 +vn -0.0559 0.0559 0.9969 +vn -0.0631 0.0159 0.9979 +vn -0.0654 0.0000 0.9978 +vn -0.0631 -0.0159 0.9979 +vn -0.0559 -0.0559 0.9969 +vn -0.0159 -0.0631 0.9979 +vn 0.0000 -0.0654 0.9978 +vn 0.9996 -0.0188 -0.0188 +vn 1.0000 0.0000 0.0000 +vn 0.9998 -0.0198 0.0000 +vn 0.9996 0.0188 -0.0188 +vn 0.9998 0.0000 -0.0198 +vn 0.9996 -0.0188 0.0188 +vn 0.9996 0.0188 0.0188 +vn 0.9998 0.0000 0.0198 +vn 0.9969 -0.0559 -0.0559 +vn 0.9979 -0.0631 -0.0159 +vn 0.9979 -0.0159 -0.0631 +vn 0.9979 0.0159 -0.0631 +vn 0.9978 0.0000 -0.0654 +vn 0.9969 0.0559 -0.0559 +vn 0.9979 0.0631 -0.0159 +vn 0.9998 0.0198 0.0000 +vn 0.9979 0.0631 0.0159 +vn 0.9969 0.0559 0.0559 +vn 0.9979 0.0159 0.0631 +vn 0.9978 0.0000 0.0654 +vn 0.9979 -0.0159 0.0631 +vn 0.9969 -0.0559 0.0559 +vn 0.9979 -0.0631 0.0159 +vn 0.9978 -0.0654 0.0000 +vn 0.0188 0.9996 -0.0188 +vn 0.0000 1.0000 0.0000 +vn 0.0198 0.9998 0.0000 +vn -0.0188 0.9996 -0.0188 +vn 0.0000 0.9998 -0.0198 +vn 0.0188 0.9996 0.0188 +vn -0.0188 0.9996 0.0188 +vn 0.0000 0.9998 0.0198 +vn 0.0559 0.9969 -0.0559 +vn 0.0631 0.9979 -0.0159 +vn 0.0159 0.9979 -0.0631 +vn -0.0159 0.9979 -0.0631 +vn 0.0000 0.9978 -0.0654 +vn -0.0559 0.9969 -0.0559 +vn -0.0631 0.9979 -0.0159 +vn -0.0198 0.9998 0.0000 +vn -0.0631 0.9979 0.0159 +vn -0.0559 0.9969 0.0559 +vn -0.0159 0.9979 0.0631 +vn 0.0000 0.9978 0.0654 +vn 0.0159 0.9979 0.0631 +vn 0.0559 0.9969 0.0559 +vn 0.0631 0.9979 0.0159 +vn 0.0654 0.9978 0.0000 +vn -0.9996 -0.0188 0.0188 +vn -1.0000 0.0000 0.0000 +vn -0.9998 -0.0198 0.0000 +vn -0.9996 0.0188 0.0188 +vn -0.9998 0.0000 0.0198 +vn -0.9996 -0.0188 -0.0188 +vn -0.9996 0.0188 -0.0188 +vn -0.9998 0.0000 -0.0198 +vn -0.9969 -0.0559 0.0559 +vn -0.9979 -0.0631 0.0159 +vn -0.9979 -0.0159 0.0631 +vn -0.9979 0.0159 0.0631 +vn -0.9978 0.0000 0.0654 +vn -0.9969 0.0559 0.0559 +vn -0.9979 0.0631 0.0159 +vn -0.9998 0.0198 0.0000 +vn -0.9979 0.0631 -0.0159 +vn -0.9969 0.0559 -0.0559 +vn -0.9979 0.0159 -0.0631 +vn -0.9978 0.0000 -0.0654 +vn -0.9979 -0.0159 -0.0631 +vn -0.9969 -0.0559 -0.0559 +vn -0.9979 -0.0631 -0.0159 +vn -0.9978 -0.0654 0.0000 +vn -0.0188 -0.0188 -0.9996 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -0.0198 -0.9998 +vn -0.0188 0.0188 -0.9996 +vn -0.0198 0.0000 -0.9998 +vn 0.0188 -0.0188 -0.9996 +vn 0.0188 0.0188 -0.9996 +vn 0.0198 0.0000 -0.9998 +vn -0.0559 -0.0559 -0.9969 +vn -0.0159 -0.0631 -0.9979 +vn -0.0631 -0.0159 -0.9979 +vn -0.0631 0.0159 -0.9979 +vn -0.0654 0.0000 -0.9978 +vn -0.0559 0.0559 -0.9969 +vn -0.0159 0.0631 -0.9979 +vn 0.0000 0.0198 -0.9998 +vn 0.0159 0.0631 -0.9979 +vn 0.0559 0.0559 -0.9969 +vn 0.0631 0.0159 -0.9979 +vn 0.0654 0.0000 -0.9978 +vn 0.0631 -0.0159 -0.9979 +vn 0.0559 -0.0559 -0.9969 +vn 0.0159 -0.0631 -0.9979 +vn 0.0000 -0.0654 -0.9978 +vn -0.2277 -0.9467 0.2277 +vn -0.5773 -0.5773 0.5773 +vn -0.6933 -0.6934 0.1963 +vn -0.2277 -0.2277 0.9467 +vn -0.1963 -0.6933 0.6933 +vn -0.9467 -0.2277 0.2277 +vn -0.6933 -0.1963 0.6933 +vn -0.0559 -0.9969 0.0559 +vn -0.2540 -0.9660 0.0468 +vn -0.0468 -0.9660 0.2540 +vn -0.7064 -0.7064 0.0438 +vn -0.0468 -0.2540 0.9660 +vn -0.2540 -0.0468 0.9660 +vn -0.0438 -0.7064 0.7064 +vn -0.9660 -0.0468 0.2540 +vn -0.9660 -0.2540 0.0468 +vn -0.7064 -0.0438 0.7064 +vn -0.2277 0.2277 0.9467 +vn -0.5773 0.5773 0.5773 +vn -0.6933 0.1963 0.6933 +vn -0.2277 0.9467 0.2277 +vn -0.1963 0.6933 0.6933 +vn -0.9467 0.2277 0.2277 +vn -0.6933 0.6933 0.1963 +vn -0.2540 0.0468 0.9660 +vn -0.0468 0.2540 0.9661 +vn -0.7064 0.0438 0.7064 +vn -0.0468 0.9660 0.2540 +vn -0.2540 0.9660 0.0468 +vn -0.0438 0.7064 0.7064 +vn -0.9660 0.2540 0.0468 +vn -0.9661 0.0468 0.2540 +vn -0.7064 0.7064 0.0438 +vn -0.2277 -0.9467 -0.2277 +vn -0.5773 -0.5773 -0.5773 +vn -0.1963 -0.6933 -0.6933 +vn -0.9467 -0.2277 -0.2277 +vn -0.6933 -0.6933 -0.1963 +vn -0.2277 -0.2277 -0.9467 +vn -0.6933 -0.1963 -0.6933 +vn -0.0559 -0.9969 -0.0559 +vn -0.0468 -0.9660 -0.2540 +vn -0.2540 -0.9660 -0.0468 +vn -0.0438 -0.7064 -0.7064 +vn -0.9660 -0.2540 -0.0468 +vn -0.9661 -0.0468 -0.2540 +vn -0.7064 -0.7064 -0.0438 +vn -0.2540 -0.0468 -0.9660 +vn -0.0468 -0.2540 -0.9660 +vn -0.7064 -0.0438 -0.7064 +vn -0.2277 0.9467 -0.2277 +vn -0.5773 0.5773 -0.5773 +vn -0.6933 0.6933 -0.1963 +vn -0.2277 0.2277 -0.9467 +vn -0.1963 0.6933 -0.6933 +vn -0.9467 0.2277 -0.2277 +vn -0.6933 0.1963 -0.6933 +vn -0.2540 0.9660 -0.0468 +vn -0.0468 0.9660 -0.2540 +vn -0.7064 0.7064 -0.0438 +vn -0.0468 0.2540 -0.9661 +vn -0.2540 0.0468 -0.9661 +vn -0.0438 0.7064 -0.7064 +vn -0.9660 0.0468 -0.2540 +vn -0.9660 0.2540 -0.0468 +vn -0.7064 0.0438 -0.7064 +vn 0.2277 -0.9467 0.2277 +vn 0.5773 -0.5773 0.5773 +vn 0.1963 -0.6933 0.6933 +vn 0.9467 -0.2277 0.2277 +vn 0.6933 -0.6933 0.1963 +vn 0.2277 -0.2277 0.9467 +vn 0.6933 -0.1963 0.6933 +vn 0.0559 -0.9969 0.0559 +vn 0.0468 -0.9660 0.2540 +vn 0.2540 -0.9660 0.0468 +vn 0.0438 -0.7064 0.7064 +vn 0.9660 -0.2540 0.0468 +vn 0.9661 -0.0468 0.2540 +vn 0.7064 -0.7064 0.0438 +vn 0.2540 -0.0468 0.9660 +vn 0.0468 -0.2540 0.9660 +vn 0.7064 -0.0438 0.7064 +vn 0.2277 0.9467 0.2277 +vn 0.5773 0.5773 0.5773 +vn 0.6933 0.6933 0.1963 +vn 0.2277 0.2277 0.9467 +vn 0.1963 0.6933 0.6933 +vn 0.9467 0.2277 0.2277 +vn 0.6933 0.1963 0.6933 +vn 0.2540 0.9660 0.0468 +vn 0.0468 0.9660 0.2540 +vn 0.7064 0.7064 0.0438 +vn 0.0468 0.2540 0.9661 +vn 0.2540 0.0468 0.9660 +vn 0.0438 0.7064 0.7064 +vn 0.9661 0.0468 0.2540 +vn 0.9660 0.2540 0.0468 +vn 0.7064 0.0438 0.7064 +vn 0.2277 -0.9467 -0.2277 +vn 0.5773 -0.5773 -0.5773 +vn 0.6933 -0.6933 -0.1963 +vn 0.2277 -0.2277 -0.9467 +vn 0.1963 -0.6933 -0.6933 +vn 0.9467 -0.2277 -0.2277 +vn 0.6933 -0.1963 -0.6933 +vn 0.0559 -0.9969 -0.0559 +vn 0.2540 -0.9660 -0.0468 +vn 0.0468 -0.9660 -0.2540 +vn 0.7064 -0.7064 -0.0438 +vn 0.0468 -0.2540 -0.9660 +vn 0.2540 -0.0468 -0.9661 +vn 0.0438 -0.7064 -0.7064 +vn 0.9661 -0.0468 -0.2540 +vn 0.9660 -0.2540 -0.0468 +vn 0.7064 -0.0438 -0.7064 +vn 0.2277 0.9467 -0.2277 +vn 0.5773 0.5773 -0.5773 +vn 0.1963 0.6933 -0.6933 +vn 0.9467 0.2277 -0.2277 +vn 0.6933 0.6933 -0.1963 +vn 0.2277 0.2277 -0.9467 +vn 0.6933 0.1963 -0.6933 +vn 0.0468 0.9660 -0.2540 +vn 0.2540 0.9660 -0.0468 +vn 0.0438 0.7064 -0.7064 +vn 0.9660 0.2540 -0.0468 +vn 0.9660 0.0468 -0.2540 +vn 0.7064 0.7064 -0.0438 +vn 0.2540 0.0468 -0.9661 +vn 0.0468 0.2540 -0.9661 +vn 0.7064 0.0438 -0.7064 +vn -0.2666 -0.9638 0.0000 +vn -0.7071 -0.7071 -0.0118 +vn -0.2636 -0.9645 -0.0128 +vn -0.7071 -0.7071 0.0118 +vn -0.7071 -0.7071 0.0000 +vn -0.9638 -0.2666 0.0000 +vn -0.9645 -0.2636 -0.0128 +vn -0.0631 -0.9979 -0.0159 +vn -0.0654 -0.9978 0.0000 +vn -0.2636 -0.9645 0.0128 +vn -0.0631 -0.9979 0.0159 +vn -0.9645 -0.2636 0.0128 +vn -0.2666 0.0000 0.9638 +vn -0.7071 -0.0118 0.7071 +vn -0.2636 -0.0128 0.9645 +vn -0.7071 0.0118 0.7071 +vn -0.7071 0.0000 0.7071 +vn -0.9638 0.0000 0.2666 +vn -0.9645 -0.0128 0.2636 +vn -0.2636 0.0128 0.9645 +vn -0.9645 0.0128 0.2636 +vn -0.2666 0.9638 0.0000 +vn -0.7071 0.7071 0.0118 +vn -0.2636 0.9645 0.0128 +vn -0.7071 0.7071 -0.0118 +vn -0.7071 0.7071 0.0000 +vn -0.9638 0.2666 0.0000 +vn -0.9645 0.2636 0.0128 +vn -0.0654 0.9978 0.0000 +vn -0.2636 0.9645 -0.0128 +vn -0.9645 0.2636 -0.0128 +vn -0.9978 0.0654 0.0000 +vn -0.2666 0.0000 -0.9638 +vn -0.7071 0.0118 -0.7071 +vn -0.2636 0.0128 -0.9645 +vn -0.7071 -0.0118 -0.7071 +vn -0.7071 0.0000 -0.7071 +vn -0.9638 0.0000 -0.2666 +vn -0.9645 0.0128 -0.2636 +vn -0.2636 -0.0128 -0.9645 +vn -0.9645 -0.0128 -0.2636 +vn 0.0000 -0.9638 -0.2666 +vn 0.0118 -0.7071 -0.7071 +vn 0.0128 -0.9645 -0.2636 +vn -0.0118 -0.7071 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 -0.2666 -0.9638 +vn 0.0128 -0.2636 -0.9645 +vn 0.0159 -0.9979 -0.0631 +vn 0.0000 -0.9978 -0.0654 +vn -0.0128 -0.9645 -0.2636 +vn -0.0159 -0.9979 -0.0631 +vn -0.0128 -0.2636 -0.9645 +vn 0.0000 0.9638 -0.2666 +vn -0.0118 0.7071 -0.7071 +vn -0.0128 0.9645 -0.2636 +vn 0.0118 0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 0.2666 -0.9638 +vn -0.0128 0.2636 -0.9645 +vn 0.0128 0.9645 -0.2636 +vn 0.0128 0.2636 -0.9645 +vn 0.0000 0.0654 -0.9978 +vn 0.9638 0.0000 -0.2666 +vn 0.7071 0.0118 -0.7071 +vn 0.9645 0.0128 -0.2636 +vn 0.7071 -0.0118 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.2666 0.0000 -0.9638 +vn 0.2636 0.0128 -0.9645 +vn 0.9645 -0.0128 -0.2636 +vn 0.2636 -0.0128 -0.9645 +vn 0.2666 -0.9638 0.0000 +vn 0.7071 -0.7071 0.0118 +vn 0.2636 -0.9645 0.0128 +vn 0.7071 -0.7071 -0.0118 +vn 0.7071 -0.7071 0.0000 +vn 0.9638 -0.2666 0.0000 +vn 0.9645 -0.2636 0.0128 +vn 0.0631 -0.9979 0.0159 +vn 0.0654 -0.9978 0.0000 +vn 0.2636 -0.9645 -0.0128 +vn 0.0631 -0.9979 -0.0159 +vn 0.9645 -0.2636 -0.0128 +vn 0.2666 0.9638 0.0000 +vn 0.7071 0.7071 -0.0118 +vn 0.2636 0.9645 -0.0128 +vn 0.7071 0.7071 0.0118 +vn 0.7071 0.7071 0.0000 +vn 0.9638 0.2666 0.0000 +vn 0.9645 0.2636 -0.0128 +vn 0.2636 0.9645 0.0128 +vn 0.9645 0.2636 0.0128 +vn 0.9978 0.0654 0.0000 +vn 0.2666 0.0000 0.9638 +vn 0.7071 0.0118 0.7071 +vn 0.2636 0.0128 0.9645 +vn 0.7071 -0.0118 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.9638 0.0000 0.2666 +vn 0.9645 0.0128 0.2636 +vn 0.2636 -0.0128 0.9645 +vn 0.9645 -0.0128 0.2636 +vn 0.0000 -0.9638 0.2666 +vn -0.0118 -0.7071 0.7071 +vn -0.0128 -0.9645 0.2636 +vn 0.0118 -0.7071 0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 -0.2666 0.9638 +vn -0.0128 -0.2636 0.9645 +vn -0.0159 -0.9979 0.0631 +vn 0.0000 -0.9978 0.0654 +vn 0.0128 -0.9645 0.2636 +vn 0.0159 -0.9979 0.0631 +vn 0.0128 -0.2636 0.9645 +vn 0.0000 0.9638 0.2666 +vn 0.0118 0.7071 0.7071 +vn 0.0128 0.9645 0.2636 +vn -0.0118 0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.2666 0.9638 +vn 0.0128 0.2636 0.9645 +vn -0.0128 0.9645 0.2636 +vn -0.0128 0.2636 0.9645 +vn 0.0000 0.0654 0.9978 +vn -0.0188 -0.9996 -0.0188 +vn 0.0000 -1.0000 0.0000 +vn -0.0198 -0.9998 0.0000 +vn 0.0188 -0.9996 -0.0188 +vn 0.0000 -0.9998 -0.0198 +vn -0.0188 -0.9996 0.0188 +vn 0.0188 -0.9996 0.0188 +vn 0.0000 -0.9998 0.0198 +vn 0.0198 -0.9998 0.0000 +usemtl Material.030 +s 1 +f 767/850/544 771/851/545 770/852/546 +f 769/853/547 771/851/545 768/854/548 +f 771/851/545 773/855/549 770/852/546 +f 771/851/545 775/856/550 774/857/551 +f 613/858/552 767/850/544 758/859/553 +f 751/860/554 768/854/548 767/850/544 +f 749/861/555 768/854/548 750/862/556 +f 615/863/557 769/853/547 749/861/555 +f 766/864/558 772/865/559 769/853/547 +f 772/865/559 764/866/560 775/856/550 +f 775/856/550 602/867/561 703/868/562 +f 774/857/551 703/868/562 702/869/563 +f 774/857/551 701/870/564 773/855/549 +f 773/855/549 600/871/565 760/872/566 +f 770/852/546 760/872/566 759/873/567 +f 758/859/553 770/852/546 759/873/567 +f 776/874/568 780/875/569 779/876/570 +f 778/877/571 780/875/569 777/878/572 +f 780/875/569 782/879/573 779/876/570 +f 780/875/569 784/880/574 783/881/575 +f 619/882/576 776/874/568 740/883/577 +f 733/884/578 777/878/572 776/874/568 +f 731/885/579 777/878/572 732/886/580 +f 621/887/581 778/877/571 731/885/579 +f 748/888/582 781/889/583 778/877/571 +f 781/889/583 746/890/584 784/880/574 +f 784/880/574 616/891/585 754/892/586 +f 783/881/575 754/892/586 753/893/587 +f 783/881/575 752/894/588 782/879/573 +f 782/879/573 612/895/589 742/896/590 +f 779/876/570 742/896/590 741/897/591 +f 740/883/577 779/876/570 741/897/591 +f 785/898/592 789/899/593 788/900/594 +f 787/901/595 789/899/593 786/902/596 +f 789/899/593 791/903/597 788/900/594 +f 789/899/593 793/904/598 792/905/599 +f 620/906/600 785/898/592 743/907/601 +f 727/908/602 786/902/596 785/898/592 +f 725/909/603 786/902/596 726/910/604 +f 608/911/605 787/901/595 725/909/603 +f 709/912/606 790/913/607 787/901/595 +f 790/913/607 707/914/608 793/904/598 +f 793/904/598 603/915/609 763/916/610 +f 792/905/599 763/916/610 762/917/611 +f 792/905/599 761/918/612 791/903/597 +f 791/903/597 614/919/613 745/920/614 +f 788/900/594 745/920/614 744/921/615 +f 743/907/601 788/900/594 744/921/615 +f 794/922/616 798/923/617 797/924/618 +f 796/925/619 798/923/617 795/926/620 +f 798/923/617 800/927/621 797/924/618 +f 798/923/617 802/928/622 801/929/623 +f 601/930/624 794/922/616 698/931/625 +f 706/932/626 795/926/620 794/922/616 +f 704/933/627 795/926/620 705/934/628 +f 604/935/629 796/925/619 704/933/627 +f 712/936/630 799/937/631 796/925/619 +f 799/937/631 710/938/632 802/928/622 +f 802/928/622 610/939/633 718/940/634 +f 801/929/623 718/940/634 717/941/635 +f 801/929/623 716/942/636 800/927/621 +f 800/927/621 606/943/637 700/944/638 +f 797/924/618 700/944/638 699/945/639 +f 698/931/625 797/924/618 699/945/639 +f 803/946/640 807/947/641 806/948/642 +f 805/949/643 807/947/641 804/950/644 +f 807/947/641 809/951/645 806/948/642 +f 807/947/641 811/952/646 810/953/647 +f 607/954/648 803/946/640 722/955/649 +f 715/956/650 804/950/644 803/946/640 +f 713/957/651 804/950/644 714/958/652 +f 609/959/653 805/949/643 713/957/651 +f 730/960/654 808/961/655 805/949/643 +f 808/961/655 728/962/656 811/952/646 +f 811/952/646 622/963/657 736/964/658 +f 810/953/647 736/964/658 735/965/659 +f 810/953/647 734/966/660 809/951/645 +f 809/951/645 618/967/661 724/968/662 +f 806/948/642 724/968/662 723/969/663 +f 722/955/649 806/948/642 723/969/663 +f 813/970/664 812/971/665 818/972/666 +f 815/973/667 812/971/665 814/974/668 +f 817/975/669 812/971/665 816/976/670 +f 599/977/671 813/970/664 625/978/672 +f 626/979/673 814/974/668 813/970/664 +f 625/978/672 818/972/666 624/980/674 +f 600/981/565 815/973/667 628/982/675 +f 629/983/676 816/976/670 815/973/667 +f 628/982/675 814/974/668 627/984/677 +f 601/985/624 817/975/669 631/986/678 +f 623/987/679 818/972/666 817/975/669 +f 631/986/678 816/976/670 630/988/680 +f 820/989/681 819/990/682 825/991/683 +f 822/992/684 819/990/682 821/993/685 +f 824/994/686 819/990/682 823/995/687 +f 602/867/561 820/989/681 634/996/688 +f 635/997/689 821/993/685 820/989/681 +f 634/996/688 825/991/683 633/998/690 +f 603/999/609 822/992/684 637/1000/691 +f 638/1001/692 823/995/687 822/992/684 +f 637/1000/691 821/993/685 636/1002/693 +f 604/1003/629 824/994/686 640/1004/694 +f 632/1005/695 825/991/683 824/994/686 +f 640/1004/694 823/995/687 639/1006/696 +f 827/1007/697 826/1008/698 832/1009/699 +f 829/1010/700 826/1008/698 828/1011/701 +f 831/1012/702 826/1008/698 830/1013/703 +f 605/1014/704 827/1007/697 643/1015/705 +f 644/1016/706 828/1011/701 827/1007/697 +f 643/1015/705 832/1009/699 642/1017/707 +f 606/1018/637 829/1010/700 646/1019/708 +f 647/1020/709 830/1013/703 829/1010/700 +f 646/1019/708 828/1011/701 645/1021/710 +f 607/1022/648 831/1012/702 649/1023/711 +f 641/1024/712 832/1009/699 831/1012/702 +f 649/1023/711 830/1013/703 648/1025/713 +f 834/1026/714 833/1027/715 839/1028/716 +f 836/1029/717 833/1027/715 835/1030/718 +f 838/1031/719 833/1027/715 837/1032/720 +f 608/1033/605 834/1026/714 652/1034/721 +f 653/1035/722 835/1030/718 834/1026/714 +f 652/1034/721 839/1028/716 651/1036/723 +f 609/1037/653 836/1029/717 655/1038/724 +f 656/1039/725 837/1032/720 836/1029/717 +f 655/1038/724 835/1030/718 654/1040/726 +f 610/1041/633 838/1031/719 658/1042/727 +f 650/1043/728 839/1028/716 838/1031/719 +f 658/1042/727 837/1032/720 657/1044/729 +f 841/1045/730 840/1046/731 846/1047/732 +f 843/1048/733 840/1046/731 842/1049/734 +f 845/1050/735 840/1046/731 844/1051/736 +f 611/1052/737 841/1045/730 661/1053/738 +f 662/1054/739 842/1049/734 841/1045/730 +f 661/1053/738 846/1047/732 660/1055/740 +f 612/1056/589 843/1048/733 664/1057/741 +f 665/1058/742 844/1051/736 843/1048/733 +f 664/1057/741 842/1049/734 663/1059/743 +f 613/1060/552 845/1050/735 667/1061/744 +f 659/1062/745 846/1047/732 845/1050/735 +f 667/1061/744 844/1051/736 666/1063/746 +f 848/1064/747 847/1065/748 853/1066/749 +f 850/1067/750 847/1065/748 849/1068/751 +f 852/1069/752 847/1065/748 851/1070/753 +f 614/1071/613 848/1064/747 670/1072/754 +f 671/1073/755 849/1068/751 848/1064/747 +f 670/1072/754 853/1066/749 669/1074/756 +f 615/1075/557 850/1067/750 673/1076/757 +f 674/1077/758 851/1070/753 850/1067/750 +f 673/1076/757 849/1068/751 672/1078/759 +f 616/1079/585 852/1069/752 676/1080/760 +f 668/1081/761 853/1066/749 852/1069/752 +f 676/1080/760 851/1070/753 675/1082/762 +f 855/1083/763 854/1084/764 860/1085/765 +f 857/1086/766 854/1084/764 856/1087/767 +f 859/1088/768 854/1084/764 858/1089/769 +f 617/1090/770 855/1083/763 679/1091/771 +f 680/1092/772 856/1087/767 855/1083/763 +f 679/1091/771 860/1085/765 678/1093/773 +f 618/1094/661 857/1086/766 682/1095/774 +f 683/1096/775 858/1089/769 857/1086/766 +f 682/1095/774 856/1087/767 681/1097/776 +f 619/1098/576 859/1088/768 685/1099/777 +f 677/1100/778 860/1085/765 859/1088/768 +f 685/1099/777 858/1089/769 684/1101/779 +f 862/1102/780 861/1103/781 867/1104/782 +f 864/1105/783 861/1103/781 863/1106/784 +f 866/1107/785 861/1103/781 865/1108/786 +f 620/1109/600 862/1102/780 688/1110/787 +f 689/1111/788 863/1106/784 862/1102/780 +f 688/1110/787 867/1104/782 687/1112/789 +f 621/1113/581 864/1105/783 691/1114/790 +f 692/1115/791 865/1108/786 864/1105/783 +f 691/1114/790 863/1106/784 690/1116/792 +f 622/1117/657 866/1107/785 694/1118/793 +f 686/1119/794 867/1104/782 866/1107/785 +f 694/1118/793 865/1108/786 693/1120/795 +f 869/1121/796 871/1122/797 868/1123/798 +f 869/1121/796 873/1124/799 872/1125/800 +f 871/1122/797 875/1126/801 874/1127/802 +f 873/1124/799 875/1126/801 872/1125/800 +f 695/1128/803 644/1016/706 605/1014/704 +f 696/1129/804 868/1123/798 695/1128/803 +f 696/1129/804 870/1130/805 869/1121/796 +f 697/1131/806 625/978/672 870/1130/805 +f 870/1130/805 624/980/674 873/1124/799 +f 624/980/674 876/1132/807 873/1124/799 +f 623/987/679 698/1133/625 876/1132/807 +f 876/1132/807 699/1134/639 875/1126/801 +f 874/1127/802 699/1134/639 700/1135/638 +f 646/1019/708 700/1135/638 606/1018/637 +f 645/1021/710 874/1127/802 646/1019/708 +f 868/1123/798 645/1021/710 644/1016/706 +f 878/1136/808 880/1137/809 877/1138/810 +f 878/1136/808 882/1139/811 881/1140/812 +f 880/1137/809 884/1141/813 883/1142/814 +f 882/1139/811 884/1141/813 881/1140/812 +f 701/1143/564 629/1144/676 600/1145/565 +f 702/1146/563 877/1138/810 701/1143/564 +f 702/1146/563 879/1147/815 878/1136/808 +f 703/1148/562 634/1149/688 879/1147/815 +f 879/1147/815 633/1150/690 882/1139/811 +f 633/1150/690 885/1151/816 882/1139/811 +f 632/1152/695 704/933/627 885/1151/816 +f 885/1151/816 705/934/628 884/1141/813 +f 883/1142/814 705/934/628 706/932/626 +f 631/1153/678 706/932/626 601/930/624 +f 630/1154/680 883/1142/814 631/1153/678 +f 877/1138/810 630/1154/680 629/1144/676 +f 887/1155/817 889/1156/818 886/1157/819 +f 887/1155/817 891/1158/820 890/1159/821 +f 889/1156/818 893/1160/822 892/1161/823 +f 891/1158/820 893/1160/822 890/1159/821 +f 707/1162/608 638/1163/692 603/1164/609 +f 708/1165/824 886/1157/819 707/1162/608 +f 708/1165/824 888/1166/825 887/1155/817 +f 709/1167/606 652/1168/721 888/1166/825 +f 888/1166/825 651/1169/723 891/1158/820 +f 651/1169/723 894/1170/826 891/1158/820 +f 650/1171/728 710/938/632 894/1170/826 +f 894/1170/826 711/1172/827 893/1160/822 +f 892/1161/823 711/1172/827 712/936/630 +f 640/1173/694 712/936/630 604/935/629 +f 639/1174/696 892/1161/823 640/1173/694 +f 886/1157/819 639/1174/696 638/1163/692 +f 896/1175/828 898/1176/829 895/1177/830 +f 896/1175/828 900/1178/831 899/1179/832 +f 898/1176/829 902/1180/833 901/1181/834 +f 900/1178/831 902/1180/833 899/1179/832 +f 713/957/651 656/1182/725 609/959/653 +f 714/958/652 895/1177/830 713/957/651 +f 714/958/652 897/1183/835 896/1175/828 +f 715/956/650 649/1184/711 897/1183/835 +f 897/1183/835 648/1185/713 900/1178/831 +f 648/1185/713 903/1186/836 900/1178/831 +f 647/1187/709 716/942/636 903/1186/836 +f 903/1186/836 717/941/635 902/1180/833 +f 901/1181/834 717/941/635 718/940/634 +f 658/1188/727 718/940/634 610/939/633 +f 657/1189/729 901/1181/834 658/1188/727 +f 895/1177/830 657/1189/729 656/1182/725 +f 905/1190/837 907/1191/838 904/1192/839 +f 905/1190/837 909/1193/840 908/1194/841 +f 907/1191/838 911/1195/842 910/1196/843 +f 909/1193/840 911/1195/842 908/1194/841 +f 719/1197/844 680/1092/772 617/1090/770 +f 720/1198/845 904/1192/839 719/1197/844 +f 720/1198/845 906/1199/846 905/1190/837 +f 721/1200/847 643/1015/705 906/1199/846 +f 906/1199/846 642/1017/707 909/1193/840 +f 642/1017/707 912/1201/848 909/1193/840 +f 641/1024/712 722/1202/649 912/1201/848 +f 912/1201/848 723/1203/663 911/1195/842 +f 910/1196/843 723/1203/663 724/1204/662 +f 682/1095/774 724/1204/662 618/1094/661 +f 681/1097/776 910/1196/843 682/1095/774 +f 904/1192/839 681/1097/776 680/1092/772 +f 914/1205/849 916/1206/850 913/1207/851 +f 914/1205/849 918/1208/852 917/1209/853 +f 916/1206/850 920/1210/854 919/1211/855 +f 918/1208/852 920/1210/854 917/1209/853 +f 725/1212/603 653/1213/722 608/1033/605 +f 726/1214/604 913/1207/851 725/1212/603 +f 726/1214/604 915/1215/856 914/1205/849 +f 727/1216/602 688/1217/787 915/1215/856 +f 915/1215/856 687/1218/789 918/1208/852 +f 687/1218/789 921/1219/857 918/1208/852 +f 686/1220/794 728/962/656 921/1219/857 +f 921/1219/857 729/1221/858 920/1210/854 +f 919/1211/855 729/1221/858 730/960/654 +f 655/1222/724 730/960/654 609/959/653 +f 654/1223/726 919/1211/855 655/1222/724 +f 913/1207/851 654/1223/726 653/1213/722 +f 923/1224/859 925/1225/860 922/1226/861 +f 923/1224/859 927/1227/862 926/1228/863 +f 925/1225/860 929/1229/864 928/1230/865 +f 927/1227/862 929/1229/864 926/1228/863 +f 731/885/579 692/1231/791 621/887/581 +f 732/886/580 922/1226/861 731/885/579 +f 732/886/580 924/1232/866 923/1224/859 +f 733/884/578 685/1233/777 924/1232/866 +f 924/1232/866 684/1234/779 927/1227/862 +f 684/1234/779 930/1235/867 927/1227/862 +f 683/1236/775 734/966/660 930/1235/867 +f 930/1235/867 735/965/659 929/1229/864 +f 928/1230/865 735/965/659 736/964/658 +f 694/1237/793 736/964/658 622/963/657 +f 693/1238/795 928/1230/865 694/1237/793 +f 922/1226/861 693/1238/795 692/1231/791 +f 932/1239/868 934/1240/869 931/1241/870 +f 932/1239/868 936/1242/871 935/1243/872 +f 934/1240/869 938/1244/873 937/1245/874 +f 936/1242/871 938/1244/873 935/1243/872 +f 737/1246/875 662/1247/739 611/1052/737 +f 738/1248/876 931/1241/870 737/1246/875 +f 738/1248/876 933/1249/877 932/1239/868 +f 739/1250/878 679/1251/771 933/1249/877 +f 933/1249/877 678/1252/773 936/1242/871 +f 678/1252/773 939/1253/879 936/1242/871 +f 677/1254/778 740/883/577 939/1253/879 +f 939/1253/879 741/897/591 938/1244/873 +f 937/1245/874 741/897/591 742/896/590 +f 664/1255/741 742/896/590 612/895/589 +f 663/1256/743 937/1245/874 664/1255/741 +f 931/1241/870 663/1256/743 662/1247/739 +f 941/1257/880 943/1258/881 940/1259/882 +f 941/1257/880 945/1260/883 944/1261/884 +f 943/1258/881 947/1262/885 946/1263/886 +f 945/1260/883 947/1262/885 944/1261/884 +f 743/907/601 689/1264/788 620/906/600 +f 744/921/615 940/1259/882 743/907/601 +f 744/921/615 942/1265/887 941/1257/880 +f 745/920/614 670/1266/754 942/1265/887 +f 942/1265/887 669/1267/756 945/1260/883 +f 669/1267/756 948/1268/888 945/1260/883 +f 668/1269/761 746/890/584 948/1268/888 +f 948/1268/888 747/1270/889 947/1262/885 +f 946/1263/886 747/1270/889 748/888/582 +f 691/1271/790 748/888/582 621/887/581 +f 690/1116/792 946/1263/886 691/1271/790 +f 940/1259/882 690/1116/792 689/1264/788 +f 950/1272/890 952/1273/891 949/1274/892 +f 950/1272/890 954/1275/893 953/1276/894 +f 952/1273/891 956/1277/895 955/1278/896 +f 954/1275/893 956/1277/895 953/1276/894 +f 749/861/555 674/1279/758 615/863/557 +f 750/862/556 949/1274/892 749/861/555 +f 750/862/556 951/1280/897 950/1272/890 +f 751/860/554 667/1281/744 951/1280/897 +f 951/1280/897 666/1282/746 954/1275/893 +f 666/1282/746 957/1283/898 954/1275/893 +f 665/1284/742 752/894/588 957/1283/898 +f 957/1283/898 753/893/587 956/1277/895 +f 955/1278/896 753/893/587 754/892/586 +f 676/1285/760 754/892/586 616/891/585 +f 675/1286/762 955/1278/896 676/1285/760 +f 949/1274/892 675/1286/762 674/1279/758 +f 959/1287/899 961/1288/900 958/1289/901 +f 959/1287/899 963/1290/902 962/1291/903 +f 961/1288/900 965/1292/904 964/1293/905 +f 963/1290/902 965/1292/904 962/1291/903 +f 755/1294/906 626/979/673 599/977/671 +f 756/1295/907 958/1289/901 755/1294/906 +f 756/1295/907 960/1296/908 959/1287/899 +f 757/1297/909 661/1053/738 960/1296/908 +f 960/1296/908 660/1055/740 963/1290/902 +f 660/1055/740 966/1298/910 963/1290/902 +f 659/1062/745 758/1299/553 966/1298/910 +f 966/1298/910 759/1300/567 965/1292/904 +f 964/1293/905 759/1300/567 760/1301/566 +f 628/982/675 760/1301/566 600/981/565 +f 627/984/677 964/1293/905 628/982/675 +f 958/1289/901 627/984/677 626/979/673 +f 968/1302/911 970/1303/912 967/1304/913 +f 968/1302/911 972/1305/914 971/1306/915 +f 970/1303/912 974/1307/916 973/1308/917 +f 972/1305/914 974/1307/916 971/1306/915 +f 761/1309/612 671/1310/755 614/1071/613 +f 762/1311/611 967/1304/913 761/1309/612 +f 762/1311/611 969/1312/918 968/1302/911 +f 763/1313/610 637/1000/691 969/1312/918 +f 969/1312/918 636/1002/693 972/1305/914 +f 636/1002/693 975/1314/919 972/1305/914 +f 635/997/689 764/866/560 975/1314/919 +f 975/1314/919 765/1315/920 974/1307/916 +f 973/1308/917 765/1315/920 766/864/558 +f 673/1316/757 766/864/558 615/863/557 +f 672/1317/759 973/1308/917 673/1316/757 +f 967/1304/913 672/1317/759 671/1310/755 +f 976/1318/921 980/1319/922 979/1320/923 +f 978/1321/924 980/1319/922 977/1322/925 +f 980/1319/922 982/1323/926 979/1320/923 +f 980/1319/922 984/1324/927 983/1325/928 +f 605/1014/704 976/1318/921 695/1128/803 +f 721/1200/847 977/1322/925 976/1318/921 +f 719/1197/844 977/1322/925 720/1198/845 +f 617/1090/770 978/1321/924 719/1197/844 +f 739/1250/878 981/1326/929 978/1321/924 +f 981/1326/929 737/1246/875 984/1324/927 +f 984/1324/927 611/1052/737 757/1297/909 +f 983/1325/928 757/1297/909 756/1295/907 +f 983/1325/928 755/1294/906 982/1323/926 +f 982/1323/926 599/977/671 697/1131/806 +f 979/1320/923 697/1131/806 696/1129/804 +f 695/1128/803 979/1320/923 696/1129/804 +f 767/850/544 768/854/548 771/851/545 +f 769/853/547 772/865/559 771/851/545 +f 771/851/545 774/857/551 773/855/549 +f 771/851/545 772/865/559 775/856/550 +f 613/858/552 751/860/554 767/850/544 +f 751/860/554 750/862/556 768/854/548 +f 749/861/555 769/853/547 768/854/548 +f 615/863/557 766/864/558 769/853/547 +f 766/864/558 765/1315/920 772/865/559 +f 772/865/559 765/1315/920 764/866/560 +f 775/856/550 764/866/560 602/867/561 +f 774/857/551 775/856/550 703/868/562 +f 774/857/551 702/869/563 701/870/564 +f 773/855/549 701/870/564 600/871/565 +f 770/852/546 773/855/549 760/872/566 +f 758/859/553 767/850/544 770/852/546 +f 776/874/568 777/878/572 780/875/569 +f 778/877/571 781/889/583 780/875/569 +f 780/875/569 783/881/575 782/879/573 +f 780/875/569 781/889/583 784/880/574 +f 619/882/576 733/884/578 776/874/568 +f 733/884/578 732/886/580 777/878/572 +f 731/885/579 778/877/571 777/878/572 +f 621/887/581 748/888/582 778/877/571 +f 748/888/582 747/1270/889 781/889/583 +f 781/889/583 747/1270/889 746/890/584 +f 784/880/574 746/890/584 616/891/585 +f 783/881/575 784/880/574 754/892/586 +f 783/881/575 753/893/587 752/894/588 +f 782/879/573 752/894/588 612/895/589 +f 779/876/570 782/879/573 742/896/590 +f 740/883/577 776/874/568 779/876/570 +f 785/898/592 786/902/596 789/899/593 +f 787/901/595 790/913/607 789/899/593 +f 789/899/593 792/905/599 791/903/597 +f 789/899/593 790/913/607 793/904/598 +f 620/906/600 727/908/602 785/898/592 +f 727/908/602 726/910/604 786/902/596 +f 725/909/603 787/901/595 786/902/596 +f 608/911/605 709/912/606 787/901/595 +f 709/912/606 708/1327/824 790/913/607 +f 790/913/607 708/1327/824 707/914/608 +f 793/904/598 707/914/608 603/915/609 +f 792/905/599 793/904/598 763/916/610 +f 792/905/599 762/917/611 761/918/612 +f 791/903/597 761/918/612 614/919/613 +f 788/900/594 791/903/597 745/920/614 +f 743/907/601 785/898/592 788/900/594 +f 794/922/616 795/926/620 798/923/617 +f 796/925/619 799/937/631 798/923/617 +f 798/923/617 801/929/623 800/927/621 +f 798/923/617 799/937/631 802/928/622 +f 601/930/624 706/932/626 794/922/616 +f 706/932/626 705/934/628 795/926/620 +f 704/933/627 796/925/619 795/926/620 +f 604/935/629 712/936/630 796/925/619 +f 712/936/630 711/1172/827 799/937/631 +f 799/937/631 711/1172/827 710/938/632 +f 802/928/622 710/938/632 610/939/633 +f 801/929/623 802/928/622 718/940/634 +f 801/929/623 717/941/635 716/942/636 +f 800/927/621 716/942/636 606/943/637 +f 797/924/618 800/927/621 700/944/638 +f 698/931/625 794/922/616 797/924/618 +f 803/946/640 804/950/644 807/947/641 +f 805/949/643 808/961/655 807/947/641 +f 807/947/641 810/953/647 809/951/645 +f 807/947/641 808/961/655 811/952/646 +f 607/954/648 715/956/650 803/946/640 +f 715/956/650 714/958/652 804/950/644 +f 713/957/651 805/949/643 804/950/644 +f 609/959/653 730/960/654 805/949/643 +f 730/960/654 729/1221/858 808/961/655 +f 808/961/655 729/1221/858 728/962/656 +f 811/952/646 728/962/656 622/963/657 +f 810/953/647 811/952/646 736/964/658 +f 810/953/647 735/965/659 734/966/660 +f 809/951/645 734/966/660 618/967/661 +f 806/948/642 809/951/645 724/968/662 +f 722/955/649 803/946/640 806/948/642 +f 813/970/664 814/974/668 812/971/665 +f 815/973/667 816/976/670 812/971/665 +f 817/975/669 818/972/666 812/971/665 +f 599/977/671 626/979/673 813/970/664 +f 626/979/673 627/984/677 814/974/668 +f 625/978/672 813/970/664 818/972/666 +f 600/981/565 629/983/676 815/973/667 +f 629/983/676 630/988/680 816/976/670 +f 628/982/675 815/973/667 814/974/668 +f 601/985/624 623/987/679 817/975/669 +f 623/987/679 624/980/674 818/972/666 +f 631/986/678 817/975/669 816/976/670 +f 820/989/681 821/993/685 819/990/682 +f 822/992/684 823/995/687 819/990/682 +f 824/994/686 825/991/683 819/990/682 +f 602/867/561 635/997/689 820/989/681 +f 635/997/689 636/1002/693 821/993/685 +f 634/996/688 820/989/681 825/991/683 +f 603/999/609 638/1001/692 822/992/684 +f 638/1001/692 639/1006/696 823/995/687 +f 637/1000/691 822/992/684 821/993/685 +f 604/1003/629 632/1005/695 824/994/686 +f 632/1005/695 633/998/690 825/991/683 +f 640/1004/694 824/994/686 823/995/687 +f 827/1007/697 828/1011/701 826/1008/698 +f 829/1010/700 830/1013/703 826/1008/698 +f 831/1012/702 832/1009/699 826/1008/698 +f 605/1014/704 644/1016/706 827/1007/697 +f 644/1016/706 645/1021/710 828/1011/701 +f 643/1015/705 827/1007/697 832/1009/699 +f 606/1018/637 647/1020/709 829/1010/700 +f 647/1020/709 648/1025/713 830/1013/703 +f 646/1019/708 829/1010/700 828/1011/701 +f 607/1022/648 641/1024/712 831/1012/702 +f 641/1024/712 642/1017/707 832/1009/699 +f 649/1023/711 831/1012/702 830/1013/703 +f 834/1026/714 835/1030/718 833/1027/715 +f 836/1029/717 837/1032/720 833/1027/715 +f 838/1031/719 839/1028/716 833/1027/715 +f 608/1033/605 653/1035/722 834/1026/714 +f 653/1035/722 654/1040/726 835/1030/718 +f 652/1034/721 834/1026/714 839/1028/716 +f 609/1037/653 656/1039/725 836/1029/717 +f 656/1039/725 657/1044/729 837/1032/720 +f 655/1038/724 836/1029/717 835/1030/718 +f 610/1041/633 650/1043/728 838/1031/719 +f 650/1043/728 651/1036/723 839/1028/716 +f 658/1042/727 838/1031/719 837/1032/720 +f 841/1045/730 842/1049/734 840/1046/731 +f 843/1048/733 844/1051/736 840/1046/731 +f 845/1050/735 846/1047/732 840/1046/731 +f 611/1052/737 662/1054/739 841/1045/730 +f 662/1054/739 663/1059/743 842/1049/734 +f 661/1053/738 841/1045/730 846/1047/732 +f 612/1056/589 665/1058/742 843/1048/733 +f 665/1058/742 666/1063/746 844/1051/736 +f 664/1057/741 843/1048/733 842/1049/734 +f 613/1060/552 659/1062/745 845/1050/735 +f 659/1062/745 660/1055/740 846/1047/732 +f 667/1061/744 845/1050/735 844/1051/736 +f 848/1064/747 849/1068/751 847/1065/748 +f 850/1067/750 851/1070/753 847/1065/748 +f 852/1069/752 853/1066/749 847/1065/748 +f 614/1071/613 671/1073/755 848/1064/747 +f 671/1073/755 672/1078/759 849/1068/751 +f 670/1072/754 848/1064/747 853/1066/749 +f 615/1075/557 674/1077/758 850/1067/750 +f 674/1077/758 675/1082/762 851/1070/753 +f 673/1076/757 850/1067/750 849/1068/751 +f 616/1079/585 668/1081/761 852/1069/752 +f 668/1081/761 669/1074/756 853/1066/749 +f 676/1080/760 852/1069/752 851/1070/753 +f 855/1083/763 856/1087/767 854/1084/764 +f 857/1086/766 858/1089/769 854/1084/764 +f 859/1088/768 860/1085/765 854/1084/764 +f 617/1090/770 680/1092/772 855/1083/763 +f 680/1092/772 681/1097/776 856/1087/767 +f 679/1091/771 855/1083/763 860/1085/765 +f 618/1094/661 683/1096/775 857/1086/766 +f 683/1096/775 684/1101/779 858/1089/769 +f 682/1095/774 857/1086/766 856/1087/767 +f 619/1098/576 677/1100/778 859/1088/768 +f 677/1100/778 678/1093/773 860/1085/765 +f 685/1099/777 859/1088/768 858/1089/769 +f 862/1102/780 863/1106/784 861/1103/781 +f 864/1105/783 865/1108/786 861/1103/781 +f 866/1107/785 867/1104/782 861/1103/781 +f 620/1109/600 689/1111/788 862/1102/780 +f 689/1111/788 690/1116/792 863/1106/784 +f 688/1110/787 862/1102/780 867/1104/782 +f 621/1113/581 692/1115/791 864/1105/783 +f 692/1115/791 693/1120/795 865/1108/786 +f 691/1114/790 864/1105/783 863/1106/784 +f 622/1117/657 686/1119/794 866/1107/785 +f 686/1119/794 687/1112/789 867/1104/782 +f 694/1118/793 866/1107/785 865/1108/786 +f 869/1121/796 872/1125/800 871/1122/797 +f 869/1121/796 870/1130/805 873/1124/799 +f 871/1122/797 872/1125/800 875/1126/801 +f 873/1124/799 876/1132/807 875/1126/801 +f 695/1128/803 868/1123/798 644/1016/706 +f 696/1129/804 869/1121/796 868/1123/798 +f 696/1129/804 697/1131/806 870/1130/805 +f 697/1131/806 599/977/671 625/978/672 +f 870/1130/805 625/978/672 624/980/674 +f 624/980/674 623/987/679 876/1132/807 +f 623/987/679 601/985/624 698/1133/625 +f 876/1132/807 698/1133/625 699/1134/639 +f 874/1127/802 875/1126/801 699/1134/639 +f 646/1019/708 874/1127/802 700/1135/638 +f 645/1021/710 871/1122/797 874/1127/802 +f 868/1123/798 871/1122/797 645/1021/710 +f 878/1136/808 881/1140/812 880/1137/809 +f 878/1136/808 879/1147/815 882/1139/811 +f 880/1137/809 881/1140/812 884/1141/813 +f 882/1139/811 885/1151/816 884/1141/813 +f 701/1143/564 877/1138/810 629/1144/676 +f 702/1146/563 878/1136/808 877/1138/810 +f 702/1146/563 703/1148/562 879/1147/815 +f 703/1148/562 602/1328/561 634/1149/688 +f 879/1147/815 634/1149/688 633/1150/690 +f 633/1150/690 632/1152/695 885/1151/816 +f 632/1152/695 604/935/629 704/933/627 +f 885/1151/816 704/933/627 705/934/628 +f 883/1142/814 884/1141/813 705/934/628 +f 631/1153/678 883/1142/814 706/932/626 +f 630/1154/680 880/1137/809 883/1142/814 +f 877/1138/810 880/1137/809 630/1154/680 +f 887/1155/817 890/1159/821 889/1156/818 +f 887/1155/817 888/1166/825 891/1158/820 +f 889/1156/818 890/1159/821 893/1160/822 +f 891/1158/820 894/1170/826 893/1160/822 +f 707/1162/608 886/1157/819 638/1163/692 +f 708/1165/824 887/1155/817 886/1157/819 +f 708/1165/824 709/1167/606 888/1166/825 +f 709/1167/606 608/1329/605 652/1168/721 +f 888/1166/825 652/1168/721 651/1169/723 +f 651/1169/723 650/1171/728 894/1170/826 +f 650/1171/728 610/939/633 710/938/632 +f 894/1170/826 710/938/632 711/1172/827 +f 892/1161/823 893/1160/822 711/1172/827 +f 640/1173/694 892/1161/823 712/936/630 +f 639/1174/696 889/1156/818 892/1161/823 +f 886/1157/819 889/1156/818 639/1174/696 +f 896/1175/828 899/1179/832 898/1176/829 +f 896/1175/828 897/1183/835 900/1178/831 +f 898/1176/829 899/1179/832 902/1180/833 +f 900/1178/831 903/1186/836 902/1180/833 +f 713/957/651 895/1177/830 656/1182/725 +f 714/958/652 896/1175/828 895/1177/830 +f 714/958/652 715/956/650 897/1183/835 +f 715/956/650 607/954/648 649/1184/711 +f 897/1183/835 649/1184/711 648/1185/713 +f 648/1185/713 647/1187/709 903/1186/836 +f 647/1187/709 606/943/637 716/942/636 +f 903/1186/836 716/942/636 717/941/635 +f 901/1181/834 902/1180/833 717/941/635 +f 658/1188/727 901/1181/834 718/940/634 +f 657/1189/729 898/1176/829 901/1181/834 +f 895/1177/830 898/1176/829 657/1189/729 +f 905/1190/837 908/1194/841 907/1191/838 +f 905/1190/837 906/1199/846 909/1193/840 +f 907/1191/838 908/1194/841 911/1195/842 +f 909/1193/840 912/1201/848 911/1195/842 +f 719/1197/844 904/1192/839 680/1092/772 +f 720/1198/845 905/1190/837 904/1192/839 +f 720/1198/845 721/1200/847 906/1199/846 +f 721/1200/847 605/1014/704 643/1015/705 +f 906/1199/846 643/1015/705 642/1017/707 +f 642/1017/707 641/1024/712 912/1201/848 +f 641/1024/712 607/1022/648 722/1202/649 +f 912/1201/848 722/1202/649 723/1203/663 +f 910/1196/843 911/1195/842 723/1203/663 +f 682/1095/774 910/1196/843 724/1204/662 +f 681/1097/776 907/1191/838 910/1196/843 +f 904/1192/839 907/1191/838 681/1097/776 +f 914/1205/849 917/1209/853 916/1206/850 +f 914/1205/849 915/1215/856 918/1208/852 +f 916/1206/850 917/1209/853 920/1210/854 +f 918/1208/852 921/1219/857 920/1210/854 +f 725/1212/603 913/1207/851 653/1213/722 +f 726/1214/604 914/1205/849 913/1207/851 +f 726/1214/604 727/1216/602 915/1215/856 +f 727/1216/602 620/1330/600 688/1217/787 +f 915/1215/856 688/1217/787 687/1218/789 +f 687/1218/789 686/1220/794 921/1219/857 +f 686/1220/794 622/963/657 728/962/656 +f 921/1219/857 728/962/656 729/1221/858 +f 919/1211/855 920/1210/854 729/1221/858 +f 655/1222/724 919/1211/855 730/960/654 +f 654/1223/726 916/1206/850 919/1211/855 +f 913/1207/851 916/1206/850 654/1223/726 +f 923/1224/859 926/1228/863 925/1225/860 +f 923/1224/859 924/1232/866 927/1227/862 +f 925/1225/860 926/1228/863 929/1229/864 +f 927/1227/862 930/1235/867 929/1229/864 +f 731/885/579 922/1226/861 692/1231/791 +f 732/886/580 923/1224/859 922/1226/861 +f 732/886/580 733/884/578 924/1232/866 +f 733/884/578 619/882/576 685/1233/777 +f 924/1232/866 685/1233/777 684/1234/779 +f 684/1234/779 683/1236/775 930/1235/867 +f 683/1236/775 618/967/661 734/966/660 +f 930/1235/867 734/966/660 735/965/659 +f 928/1230/865 929/1229/864 735/965/659 +f 694/1237/793 928/1230/865 736/964/658 +f 693/1238/795 925/1225/860 928/1230/865 +f 922/1226/861 925/1225/860 693/1238/795 +f 932/1239/868 935/1243/872 934/1240/869 +f 932/1239/868 933/1249/877 936/1242/871 +f 934/1240/869 935/1243/872 938/1244/873 +f 936/1242/871 939/1253/879 938/1244/873 +f 737/1246/875 931/1241/870 662/1247/739 +f 738/1248/876 932/1239/868 931/1241/870 +f 738/1248/876 739/1250/878 933/1249/877 +f 739/1250/878 617/1090/770 679/1251/771 +f 933/1249/877 679/1251/771 678/1252/773 +f 678/1252/773 677/1254/778 939/1253/879 +f 677/1254/778 619/882/576 740/883/577 +f 939/1253/879 740/883/577 741/897/591 +f 937/1245/874 938/1244/873 741/897/591 +f 664/1255/741 937/1245/874 742/896/590 +f 663/1256/743 934/1240/869 937/1245/874 +f 931/1241/870 934/1240/869 663/1256/743 +f 941/1257/880 944/1261/884 943/1258/881 +f 941/1257/880 942/1265/887 945/1260/883 +f 943/1258/881 944/1261/884 947/1262/885 +f 945/1260/883 948/1268/888 947/1262/885 +f 743/907/601 940/1259/882 689/1264/788 +f 744/921/615 941/1257/880 940/1259/882 +f 744/921/615 745/920/614 942/1265/887 +f 745/920/614 614/919/613 670/1266/754 +f 942/1265/887 670/1266/754 669/1267/756 +f 669/1267/756 668/1269/761 948/1268/888 +f 668/1269/761 616/891/585 746/890/584 +f 948/1268/888 746/890/584 747/1270/889 +f 946/1263/886 947/1262/885 747/1270/889 +f 691/1271/790 946/1263/886 748/888/582 +f 690/1116/792 943/1258/881 946/1263/886 +f 940/1259/882 943/1258/881 690/1116/792 +f 950/1272/890 953/1276/894 952/1273/891 +f 950/1272/890 951/1280/897 954/1275/893 +f 952/1273/891 953/1276/894 956/1277/895 +f 954/1275/893 957/1283/898 956/1277/895 +f 749/861/555 949/1274/892 674/1279/758 +f 750/862/556 950/1272/890 949/1274/892 +f 750/862/556 751/860/554 951/1280/897 +f 751/860/554 613/858/552 667/1281/744 +f 951/1280/897 667/1281/744 666/1282/746 +f 666/1282/746 665/1284/742 957/1283/898 +f 665/1284/742 612/895/589 752/894/588 +f 957/1283/898 752/894/588 753/893/587 +f 955/1278/896 956/1277/895 753/893/587 +f 676/1285/760 955/1278/896 754/892/586 +f 675/1286/762 952/1273/891 955/1278/896 +f 949/1274/892 952/1273/891 675/1286/762 +f 959/1287/899 962/1291/903 961/1288/900 +f 959/1287/899 960/1296/908 963/1290/902 +f 961/1288/900 962/1291/903 965/1292/904 +f 963/1290/902 966/1298/910 965/1292/904 +f 755/1294/906 958/1289/901 626/979/673 +f 756/1295/907 959/1287/899 958/1289/901 +f 756/1295/907 757/1297/909 960/1296/908 +f 757/1297/909 611/1052/737 661/1053/738 +f 960/1296/908 661/1053/738 660/1055/740 +f 660/1055/740 659/1062/745 966/1298/910 +f 659/1062/745 613/1060/552 758/1299/553 +f 966/1298/910 758/1299/553 759/1300/567 +f 964/1293/905 965/1292/904 759/1300/567 +f 628/982/675 964/1293/905 760/1301/566 +f 627/984/677 961/1288/900 964/1293/905 +f 958/1289/901 961/1288/900 627/984/677 +f 968/1302/911 971/1306/915 970/1303/912 +f 968/1302/911 969/1312/918 972/1305/914 +f 970/1303/912 971/1306/915 974/1307/916 +f 972/1305/914 975/1314/919 974/1307/916 +f 761/1309/612 967/1304/913 671/1310/755 +f 762/1311/611 968/1302/911 967/1304/913 +f 762/1311/611 763/1313/610 969/1312/918 +f 763/1313/610 603/999/609 637/1000/691 +f 969/1312/918 637/1000/691 636/1002/693 +f 636/1002/693 635/997/689 975/1314/919 +f 635/997/689 602/867/561 764/866/560 +f 975/1314/919 764/866/560 765/1315/920 +f 973/1308/917 974/1307/916 765/1315/920 +f 673/1316/757 973/1308/917 766/864/558 +f 672/1317/759 970/1303/912 973/1308/917 +f 967/1304/913 970/1303/912 672/1317/759 +f 976/1318/921 977/1322/925 980/1319/922 +f 978/1321/924 981/1326/929 980/1319/922 +f 980/1319/922 983/1325/928 982/1323/926 +f 980/1319/922 981/1326/929 984/1324/927 +f 605/1014/704 721/1200/847 976/1318/921 +f 721/1200/847 720/1198/845 977/1322/925 +f 719/1197/844 978/1321/924 977/1322/925 +f 617/1090/770 739/1250/878 978/1321/924 +f 739/1250/878 738/1248/876 981/1326/929 +f 981/1326/929 738/1248/876 737/1246/875 +f 984/1324/927 737/1246/875 611/1052/737 +f 983/1325/928 984/1324/927 757/1297/909 +f 983/1325/928 756/1295/907 755/1294/906 +f 982/1323/926 755/1294/906 599/977/671 +f 979/1320/923 982/1323/926 697/1131/806 +f 695/1128/803 976/1318/921 979/1320/923 diff --git a/Data/Models/testbed/testbed2.mtl b/Data/Models/testbed/testbed2.mtl new file mode 100644 index 0000000000..a932308ee9 --- /dev/null +++ b/Data/Models/testbed/testbed2.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'None' +# Material Count: 1 + +newmtl Material.001 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.175798 0.101535 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 diff --git a/Data/Models/testbed/testbed2.obj b/Data/Models/testbed/testbed2.obj new file mode 100644 index 0000000000..f69db1d29f --- /dev/null +++ b/Data/Models/testbed/testbed2.obj @@ -0,0 +1,338 @@ +# Blender v3.0.1 OBJ File: '' +# www.blender.org +mtllib testbed2.mtl +o Cube_Cube.001 +v -50.000000 -0.100000 50.000000 +v -50.000000 0.100000 50.000000 +v -50.000000 -0.100000 -50.000000 +v -50.000000 0.100000 -50.000000 +v 50.000000 -0.100000 50.000000 +v 50.000000 0.100000 50.000000 +v 50.000000 -0.100000 -50.000000 +v 50.000000 0.100000 -50.000000 +v -50.999992 0.000000 49.999992 +v -50.999992 49.999996 49.999992 +v -50.999992 0.000000 -49.999992 +v -50.999992 49.999996 -49.999992 +v -48.999996 0.000000 49.999992 +v -48.999996 49.999996 49.999992 +v -48.999996 0.000000 -49.999992 +v -48.999996 49.999996 -49.999992 +v 48.999996 0.000000 49.999992 +v 48.999996 49.999996 49.999992 +v 48.999996 0.000000 -49.999992 +v 48.999996 49.999996 -49.999992 +v 50.999992 0.000000 49.999992 +v 50.999992 49.999996 49.999992 +v 50.999992 0.000000 -49.999992 +v 50.999992 49.999996 -49.999992 +v 49.999992 0.000000 -48.999996 +v 49.999992 49.999996 -48.999996 +v -49.999992 0.000000 -48.999992 +v -49.999992 49.999996 -48.999992 +v 49.999992 0.000000 -51.000000 +v 49.999992 49.999996 -51.000000 +v -49.999992 0.000000 -50.999992 +v -49.999992 49.999996 -50.999992 +v 49.999992 0.000000 50.999992 +v 49.999992 49.999996 50.999992 +v -49.999992 0.000000 51.000000 +v -49.999992 49.999996 51.000000 +v 49.999992 0.000000 48.999992 +v 49.999992 49.999996 48.999992 +v -49.999992 0.000000 48.999996 +v -49.999992 49.999996 48.999996 +v -49.999992 49.899998 49.999992 +v -49.999992 50.099998 49.999992 +v -49.999992 49.899998 -49.999992 +v -49.999992 50.099998 -49.999992 +v 49.999992 49.899998 49.999992 +v 49.999992 50.099998 49.999992 +v 49.999992 49.899998 -49.999992 +v 49.999992 50.099998 -49.999992 +v 48.999996 2.099869 9.294191 +v 50.999992 2.099869 9.294191 +v 48.999996 29.647097 9.294194 +v 48.999996 32.622261 9.294191 +v 50.999992 32.622261 9.294191 +v 50.999992 20.352901 9.294194 +v 48.999996 32.622261 -9.294191 +v 50.999992 32.622261 -9.294191 +v 48.999996 2.099869 -9.294191 +v 50.999992 2.099869 -9.294191 +vt 0.563501 0.278779 +vt 0.623999 0.332332 +vt 0.623999 0.278779 +vt 0.501001 0.278779 +vt 0.561499 0.332332 +vt 0.561499 0.278779 +vt 0.563501 0.223223 +vt 0.623999 0.276777 +vt 0.623999 0.223223 +vt 0.501001 0.223223 +vt 0.561499 0.276777 +vt 0.561499 0.223223 +vt 0.563501 0.167668 +vt 0.623999 0.221221 +vt 0.623999 0.167668 +vt 0.501001 0.167668 +vt 0.561499 0.221221 +vt 0.561499 0.167668 +vt 0.061499 0.001001 +vt 0.001001 0.887888 +vt 0.061499 0.887888 +vt 0.998999 0.985110 +vt 0.001001 0.973223 +vt 0.001001 0.985110 +vt 0.186499 0.001001 +vt 0.126001 0.887888 +vt 0.186499 0.887888 +vt 0.998999 0.957332 +vt 0.001001 0.945445 +vt 0.001001 0.957332 +vt 0.516626 0.389890 +vt 0.530249 0.443443 +vt 0.530249 0.389890 +vt 0.501001 0.389890 +vt 0.514624 0.443443 +vt 0.514624 0.389890 +vt 0.311499 0.887888 +vt 0.286873 0.850641 +vt 0.251001 0.887888 +vt 0.998999 0.929555 +vt 0.001001 0.917668 +vt 0.001001 0.929555 +vt 0.436499 0.887888 +vt 0.400627 0.850641 +vt 0.376001 0.887888 +vt 0.998999 0.901777 +vt 0.001001 0.889890 +vt 0.001001 0.901777 +vt 0.547876 0.389890 +vt 0.561499 0.443443 +vt 0.561499 0.389890 +vt 0.532251 0.389890 +vt 0.545874 0.443443 +vt 0.545874 0.389890 +vt 0.498999 0.001001 +vt 0.438501 0.887888 +vt 0.498999 0.887888 +vt 0.998999 0.915666 +vt 0.001001 0.903779 +vt 0.001001 0.915666 +vt 0.373999 0.001001 +vt 0.313501 0.887888 +vt 0.373999 0.887888 +vt 0.998999 0.943443 +vt 0.001001 0.931557 +vt 0.001001 0.943443 +vt 0.516626 0.334334 +vt 0.530249 0.387888 +vt 0.530249 0.334334 +vt 0.501001 0.334334 +vt 0.514624 0.387888 +vt 0.514624 0.334334 +vt 0.248999 0.001001 +vt 0.188501 0.887888 +vt 0.248999 0.887888 +vt 0.998999 0.971221 +vt 0.001001 0.959334 +vt 0.001001 0.971221 +vt 0.123999 0.001001 +vt 0.063501 0.887888 +vt 0.123999 0.887888 +vt 0.998999 0.998999 +vt 0.001001 0.987112 +vt 0.001001 0.998999 +vt 0.547876 0.334334 +vt 0.561499 0.387888 +vt 0.561499 0.334334 +vt 0.532251 0.334334 +vt 0.545874 0.387888 +vt 0.545874 0.334334 +vt 0.563501 0.112112 +vt 0.623999 0.165666 +vt 0.623999 0.112112 +vt 0.501001 0.112112 +vt 0.561499 0.165666 +vt 0.561499 0.112112 +vt 0.563501 0.056557 +vt 0.623999 0.110110 +vt 0.623999 0.056557 +vt 0.501001 0.056557 +vt 0.561499 0.110110 +vt 0.561499 0.056557 +vt 0.563501 0.001001 +vt 0.623999 0.054555 +vt 0.623999 0.001001 +vt 0.501001 0.001001 +vt 0.561499 0.054555 +vt 0.561499 0.001001 +vt 0.275627 0.309243 +vt 0.286873 0.309243 +vt 0.311499 0.001001 +vt 0.524505 0.375697 +vt 0.375000 0.351311 +vt 0.600631 0.351311 +vt 0.400627 0.309243 +vt 0.436499 0.001001 +vt 0.376001 0.001001 +vt 0.250697 0.500000 +vt 0.226311 0.750000 +vt 0.226311 0.500000 +vt 0.625000 0.898689 +vt 0.375000 0.874303 +vt 0.625000 0.874303 +vt 0.773689 0.500000 +vt 0.749303 0.750000 +vt 0.749303 0.500000 +vt 0.563501 0.332332 +vt 0.501001 0.332332 +vt 0.563501 0.276777 +vt 0.501001 0.276777 +vt 0.563501 0.221221 +vt 0.501001 0.221221 +vt 0.001001 0.001001 +vt 0.998999 0.973223 +vt 0.126001 0.001001 +vt 0.998999 0.945445 +vt 0.516626 0.443443 +vt 0.501001 0.443443 +vt 0.286873 0.362015 +vt 0.275627 0.850641 +vt 0.998999 0.917668 +vt 0.411873 0.309243 +vt 0.411873 0.850641 +vt 0.400627 0.526873 +vt 0.998999 0.889890 +vt 0.547876 0.443443 +vt 0.532251 0.443443 +vt 0.438501 0.001001 +vt 0.998999 0.903779 +vt 0.313501 0.001001 +vt 0.998999 0.931557 +vt 0.516626 0.387888 +vt 0.501001 0.387888 +vt 0.188501 0.001001 +vt 0.998999 0.959334 +vt 0.063501 0.001001 +vt 0.998999 0.987112 +vt 0.547876 0.387888 +vt 0.532251 0.387888 +vt 0.563501 0.165666 +vt 0.501001 0.165666 +vt 0.563501 0.110110 +vt 0.501001 0.110110 +vt 0.563501 0.054555 +vt 0.501001 0.054555 +vt 0.251001 0.001001 +vt 0.625000 0.351311 +vt 0.625000 0.375697 +vt 0.375000 0.375697 +vt 0.250697 0.750000 +vt 0.375000 0.898689 +vt 0.773689 0.750000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl Material.001 +s off +f 2/1/1 3/2/1 1/3/1 +f 4/4/2 7/5/2 3/6/2 +f 8/7/3 5/8/3 7/9/3 +f 6/10/4 1/11/4 5/12/4 +f 7/13/5 1/14/5 3/15/5 +f 4/16/6 6/17/6 8/18/6 +f 10/19/1 11/20/1 9/21/1 +f 12/22/2 15/23/2 11/24/2 +f 16/25/3 13/26/3 15/27/3 +f 14/28/4 9/29/4 13/30/4 +f 15/31/5 9/32/5 11/33/5 +f 12/34/6 14/35/6 16/36/6 +f 17/37/1 49/38/1 19/39/1 +f 20/40/2 23/41/2 19/42/2 +f 23/43/3 50/44/3 21/45/3 +f 22/46/4 17/47/4 21/48/4 +f 23/49/5 17/50/5 19/51/5 +f 20/52/6 22/53/6 24/54/6 +f 26/55/4 27/56/4 25/57/4 +f 28/58/1 31/59/1 27/60/1 +f 32/61/2 29/62/2 31/63/2 +f 30/64/3 25/65/3 29/66/3 +f 31/67/5 25/68/5 27/69/5 +f 28/70/6 30/71/6 32/72/6 +f 34/73/4 35/74/4 33/75/4 +f 36/76/1 39/77/1 35/78/1 +f 40/79/2 37/80/2 39/81/2 +f 38/82/3 33/83/3 37/84/3 +f 39/85/5 33/86/5 35/87/5 +f 36/88/6 38/89/6 40/90/6 +f 42/91/1 43/92/1 41/93/1 +f 44/94/2 47/95/2 43/96/2 +f 48/97/3 45/98/3 47/99/3 +f 46/100/4 41/101/4 45/102/4 +f 47/103/5 41/104/5 43/105/5 +f 44/106/6 46/107/6 48/108/6 +f 55/109/1 52/110/1 18/111/1 +f 54/112/2 49/113/2 51/114/2 +f 53/115/3 24/116/3 22/117/3 +f 50/118/6 57/119/6 49/120/6 +f 55/121/4 58/122/4 56/123/4 +f 52/124/5 56/125/5 53/126/5 +f 2/1/1 4/127/1 3/2/1 +f 4/4/2 8/128/2 7/5/2 +f 8/7/3 6/129/3 5/8/3 +f 6/10/4 2/130/4 1/11/4 +f 7/13/5 5/131/5 1/14/5 +f 4/16/6 2/132/6 6/17/6 +f 10/19/1 12/133/1 11/20/1 +f 12/22/2 16/134/2 15/23/2 +f 16/25/3 14/135/3 13/26/3 +f 14/28/4 10/136/4 9/29/4 +f 15/31/5 13/137/5 9/32/5 +f 12/34/6 10/138/6 14/35/6 +f 17/37/1 18/111/1 51/139/1 +f 49/38/1 57/140/1 19/39/1 +f 17/37/1 51/139/1 49/38/1 +f 20/40/2 24/141/2 23/41/2 +f 23/43/3 24/116/3 56/142/3 +f 23/43/3 56/142/3 58/143/3 +f 50/44/3 54/144/3 21/45/3 +f 23/43/3 58/143/3 50/44/3 +f 22/46/4 18/145/4 17/47/4 +f 23/49/5 21/146/5 17/50/5 +f 20/52/6 18/147/6 22/53/6 +f 26/55/4 28/148/4 27/56/4 +f 28/58/1 32/149/1 31/59/1 +f 32/61/2 30/150/2 29/62/2 +f 30/64/3 26/151/3 25/65/3 +f 31/67/5 29/152/5 25/68/5 +f 28/70/6 26/153/6 30/71/6 +f 34/73/4 36/154/4 35/74/4 +f 36/76/1 40/155/1 39/77/1 +f 40/79/2 38/156/2 37/80/2 +f 38/82/3 34/157/3 33/83/3 +f 39/85/5 37/158/5 33/86/5 +f 36/88/6 34/159/6 38/89/6 +f 42/91/1 44/160/1 43/92/1 +f 44/94/2 48/161/2 47/95/2 +f 48/97/3 46/162/3 45/98/3 +f 46/100/4 42/163/4 41/101/4 +f 47/103/5 45/164/5 41/104/5 +f 44/106/6 42/165/6 46/107/6 +f 20/166/1 19/39/1 55/109/1 +f 19/39/1 57/140/1 55/109/1 +f 52/110/1 51/139/1 18/111/1 +f 20/166/1 55/109/1 18/111/1 +f 51/114/2 52/167/2 53/168/2 +f 54/112/2 50/169/2 49/113/2 +f 51/114/2 53/168/2 54/112/2 +f 22/117/3 21/45/3 54/144/3 +f 53/115/3 56/142/3 24/116/3 +f 22/117/3 54/144/3 53/115/3 +f 50/118/6 58/170/6 57/119/6 +f 55/121/4 57/171/4 58/122/4 +f 52/124/5 55/172/5 56/125/5 diff --git a/Data/Scripts/Lib.hyp b/Data/Scripts/Lib.hyp index 8f2f691941..05be4b568b 100644 --- a/Data/Scripts/Lib.hyp +++ b/Data/Scripts/Lib.hyp @@ -15,639 +15,781 @@ const DBL_MAX : double = 1.7976931348623157e+308 const DBL_MIN : double = 2.2250738585072014e-308 const DBL_EPSILON : double = 2.2204460492503131e-16 -extern class EditorCommandBase - GetText() -> string - GetArguments() -> Array - SetArguments(args : Array) -> void - NumArguments() -> int - GetArgument(index : int) -> string +extern struct OctantId end -extern class EditorTaskBase - GetTitle() -> string - GetDescription() -> string - SetDescription(description : string) -> void - GetProgress() -> float - SetProgress(progress : float) -> void - IsCancellationRequested() -> bool - IsCommitted() -> bool - Start() -> void - Cancel() -> void - IsCompleted() -> bool - Commit() -> bool - OnComplete : any - OnCancel : any - OnDescriptionChange : any +extern class OverlayBase + GetUIObject() -> UIObject + GetPlacement() -> int + Update(delta : float) -> void + CreateUIObject(spawnParent : UIObject) -> UIObject + IsEnabled() -> bool + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int + Update_Impl(delta : float) -> void + IsEnabled_Impl() -> bool end -extern class TickableEditorTask : EditorTaskBase - IsForegroundTask() -> bool - SetIsForegroundTask(isForeground : bool) -> void - Start() -> void - Cancel() -> void - IsCompleted() -> bool - Commit() -> bool - Tick() -> void - Start_Impl() -> void - Cancel_Impl() -> void - IsCompleted_Impl() -> bool - Tick_Impl() -> void +extern class NullOverlay : OverlayBase end -extern class LongRunningEditorTask : EditorTaskBase - Start() -> void - Cancel() -> void - IsCompleted() -> bool - Process() -> void - Commit() -> bool - Start_Impl() -> void - Cancel_Impl() -> void - IsCompleted_Impl() -> bool - Process_Impl() -> void +extern class TextureOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int end -extern class EditorActionBase - GetText() -> string - Execute(editorSubsystem : EditorSubsystem, project : EditorProject) -> void - Revert(editorSubsystem : EditorSubsystem, project : EditorProject) -> void +extern class TextOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject end -extern class FunctionalEditorAction : EditorActionBase - GetText() -> string - Execute(editorSubsystem : EditorSubsystem, project : EditorProject) -> void - Revert(editorSubsystem : EditorSubsystem, project : EditorProject) -> void +extern class StatsOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int + Update_Impl(delta : float) -> void + IsEnabled_Impl() -> bool end -extern class EditorProject - GetName() -> Name - SetName(name : Name) -> void - GetWorld() -> World - GetGame() -> Game - SetGame(gameInstance : Game) -> void - GetLastSavedTime() -> Time - GetFilePath() -> string - AddScene(scene : Scene) -> void - RemoveScene(scene : Scene) -> void - GetProjectsDirectory() -> string - IsSaved() -> bool - Save() -> Result - SaveAs(filepath : string) -> Result - GetActionStack() -> EditorActionStack - Close() -> void - OnProjectSaved : any - Name : Name - LastSavedTime : Time - Filepath : string - GameInstance : Game - ActionStack : EditorActionStack +extern class DeviceDetailsOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int + Update_Impl(delta : float) -> void + IsEnabled_Impl() -> bool end -extern class EditorState - static GetInstance() -> EditorState - GetCurrentProject() -> EditorProject - SetCurrentProject(project : EditorProject) -> void - AddTask(task : EditorTaskBase) -> void - OnCurrentProjectChanged : any - OnTaskStarted : any - OnTaskEnded : any - OnTaskProgressUpdated : any +extern class ConsoleOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int + Update_Impl(delta : float) -> void + IsEnabled_Impl() -> bool end -extern class EditorViewport - GetCamera() -> Camera - GetView() -> View - GetWindow() -> ApplicationWindow - CreateViewportWindow(options : WindowOptions) -> ApplicationWindow +extern class BaseStatsOverlay : OverlayBase + CreateUIObject_Impl(spawnParent : UIObject) -> UIObject + GetPlacement_Impl() -> int + Update_Impl(delta : float) -> void + IsEnabled_Impl() -> bool end -extern enum EditorActionStackState : uint32 - NONE = 0x0, - CAN_UNDO = 0x1, - CAN_REDO = 0x2 +extern struct GlyphMetrics + Width : uint16 + Height : uint16 + BearingX : int16 + BearingY : int16 + Advance : uint32 + ImagePosition : Vec2i end -extern class EditorActionStack - PushAction(action : EditorActionBase) -> bool - CanUndo() -> bool - CanRedo() -> bool - Undo() -> void - Redo() -> void - GetUndoAction() -> EditorActionBase - GetRedoAction() -> EditorActionBase - OnBeforeActionPush : any - OnBeforeActionPop : any - OnAfterActionPush : any - OnAfterActionPop : any - OnStateChange : any +extern enum ScrollAxis : uint8 + SA_NONE = 0x0, + SA_HORIZONTAL = 0x1, + SA_VERTICAL = 0x2, + SA_ALL = (SA_HORIZONTAL | SA_VERTICAL) end -extern class CommandletBase - static GetArgumentDefinitions() -> CommandLineArgumentDefinitions - Run(args : CommandLineArguments) -> Result - Run_Impl(args : CommandLineArguments) -> Result +extern enum UIObjectFocusState : uint32 + NONE = 0x0, + HOVER = 0x1, + PRESSED = 0x2, + TOGGLED = 0x4, + FOCUSED = 0x8 end -extern class EngineDriver - static GetInstance() -> EngineDriver - GetCurrentWorld() -> World - SetCurrentWorld(world : World) -> void - GetDefaultWorld() -> World - SetDefaultWorld(defaultWorld : World) -> void - SetGameInstance(gameInstance : Game) -> void - GetGameInstance() -> Game +extern enum UIObjectUpdateType : uint32 + NONE = 0x0, + UPDATE_SIZE = 0x1, + UPDATE_POSITION = 0x2, + UPDATE_MATERIAL = 0x4, + UPDATE_MESH_DATA = 0x8, + UPDATE_COMPUTED_VISIBILITY = 0x10, + UPDATE_CLAMPED_SIZE = 0x20, + UPDATE_CUSTOM = 0x40, + UPDATE_ALL = UINT16_MAX, + UPDATE_CHILDREN_SIZE = (UPDATE_SIZE << 16), + UPDATE_CHILDREN_POSITION = (UPDATE_POSITION << 16), + UPDATE_CHILDREN_MATERIAL = (UPDATE_MATERIAL << 16), + UPDATE_CHILDREN_MESH_DATA = (UPDATE_MESH_DATA << 16), + UPDATE_CHILDREN_COMPUTED_VISIBILITY = (UPDATE_COMPUTED_VISIBILITY << 16), + UPDATE_CHILDREN_CLAMPED_SIZE = (UPDATE_CLAMPED_SIZE << 16), + UPDATE_CHILDREN_CUSTOM = (UPDATE_CUSTOM << 16), + UPDATE_CHILDREN_ALL = (UPDATE_ALL << 16) end -extern class EngineStats - static GetInstance() -> EngineStats - GetFps() -> double - GetMsPerFrame() -> double - QueryStatValue(path : string, valueIfNotFound : double) -> double +extern enum UIObjectBorderFlags : uint32 + NONE = 0x0, + TOP = 0x1, + LEFT = 0x2, + BOTTOM = 0x4, + RIGHT = 0x8, + ALL = (((TOP | LEFT) | BOTTOM) | RIGHT) end -extern enum EnginePoolName : int - EPN_INVALID = -1, - EPN_CORE = 0, - EPN_RENDER, - EPN_SCENE, - EPN_MAX +extern struct UIEventHandlerResult end -extern enum GpuType : uint8 - Unknown = 0, - Integrated, - Dedicated +extern enum UIObjectAlignment : uint32 + TOP_LEFT = 0, + TOP_RIGHT = 1, + CENTER = 2, + BOTTOM_LEFT = 3, + BOTTOM_RIGHT = 4 end -extern class DeviceDetails - GetGpuType() -> GpuType - GetGpuVendor() -> GpuVendor - GetGpuModel() -> string - GetGpuVendorName() -> string - GetDriverVersion() -> string - IsDiscreteGpu() -> bool - SupportsRayTracing() -> bool - SupportsRayQueries() -> bool - SupportsVariableRateShading() -> bool - SupportsSamplerFeedback() -> bool - SupportsBindless() -> bool +extern enum UIObjectUpdateSizeFlags : uint32 + NONE = 0x0, + MAX_SIZE = 0x1, + INNER_SIZE = 0x2, + OUTER_SIZE = 0x4, + DEFAULT = ((MAX_SIZE | INNER_SIZE) | OUTER_SIZE) end -extern enum GpuVendor : uint8 - Unknown = 0, - Nvidia, - Amd, - Intel, - Qualcomm, - Apple, - Microsoft +extern struct UIObjectAspectRatio + X : float + Y : float end -extern class Game - GetAssetRegistry() -> AssetRegistry - SetAssetRegistry(assetRegistry : AssetRegistry) -> void - GetWorld() -> World - SetWorld(world : World) -> void - GetGameState() -> GameState - OnLaunch() -> void - OnUpdate(delta : float) -> void - Initialize() -> void - Shutdown() -> void - SetToEditMode() -> void - IsLaunched() -> bool - StartSimulating() -> void - StopSimulating() -> void - PauseSimulation() -> void - OnLaunched : any - OnGameStateChange : any - OnLaunch_Impl() -> void - OnUpdate_Impl(delta : float) -> void - World : World - GameState : GameState -end -extern enum GameStateMode : uint32 - STOPPED = 0, - SIMULATING, - PAUSED, - EDIT_MODE -end -extern struct GameState - Mode : GameStateMode - DeltaTime : float - GameTime : float - IsStopped() -> bool - IsSimulating() -> bool - IsPaused() -> bool - IsEditMode() -> bool -end -extern struct WGLayerDesc - ClassName : Name - LayerName : Name - Info : WorldGridLayerInfo - Objects : Array -end -extern struct WGObject - Coords : Vec2i - Path : AssetPath -end -extern class WorldGrid - GetWorld() -> World - AddLayer(layer : WorldGridLayer) -> void - RemoveLayer(layer : WorldGridLayer) -> bool - GetLayers() -> Array +extern struct UIObjectSize + Flags : uint64 + Value : Vec2i end -extern class WorldGridLayer +extern class UIObject + GetEntity() -> Entity + GetStage() -> UIStage + SetStage(stage : UIStage) -> void GetName() -> Name SetName(name : Name) -> void - GetLayerInfo() -> WorldGridLayerInfo - OnAdded(worldGrid : WorldGrid) -> void - OnRemoved(worldGrid : WorldGrid) -> void - CreateStreamingCell(cellInfo : StreamingCellInfo) -> StreamingCell - AddStreamingObject(assetObject : AssetObject, coord : Vec2i) -> void - RemoveStreamingObject(assetObject : AssetObject) -> void + GetPosition() -> Vec2i + SetPosition(position : Vec2i) -> void + GetOffsetPosition() -> Vec2f + GetAbsolutePosition() -> Vec2f + IsPositionAbsolute() -> bool + SetIsPositionAbsolute(isPositionAbsolute : bool) -> void + GetSize() -> UIObjectSize + SetSize(size : UIObjectSize) -> void + GetInnerSize() -> UIObjectSize + SetInnerSize(size : UIObjectSize) -> void + GetMaxSize() -> UIObjectSize + SetMaxSize(size : UIObjectSize) -> void + GetActualSize() -> Vec2i + GetActualSizeClamped() -> Vec2i + GetActualInnerSize() -> Vec2i + GetScrollOffset() -> Vec2f + SetScrollOffset(scrollOffset : Vec2f, smooth : bool) -> void + ScrollToChild(child : UIObject) -> void + GetVerticalScrollbarSize() -> int + GetHorizontalScrollbarSize() -> int + CanScrollOnAxis(axis : ScrollAxis) -> bool + GetComputedDepth() -> int + GetDepth() -> int + SetDepth(depth : int) -> void + AcceptsFocus() -> bool + SetAcceptsFocus(acceptsFocus : bool) -> void + NeedsUpdate() -> bool + Focus() -> void + Blur(blurChildren : bool) -> void + SetAffectsParentSize(affectsParentSize : bool) -> void + AffectsParentSize() -> bool + GetBorderRadius() -> uint32 + SetBorderRadius(borderRadius : uint32) -> void + GetBorderFlags() -> UIObjectBorderFlags + SetBorderFlags(borderFlags : UIObjectBorderFlags) -> void + GetAspectRatio() -> UIObjectAspectRatio + SetAspectRatio(aspectRatio : UIObjectAspectRatio) -> void + GetPadding() -> Vec2i + SetPadding(padding : Vec2i) -> void + GetBackgroundColor() -> Color + SetBackgroundColor(backgroundColor : Color) -> void + GetTextColor() -> Color + SetTextColor(textColor : Color) -> void + GetText() -> string + SetText(text : string) -> void + GetTextSize() -> float + SetTextSize(textSize : float) -> void + IsVisible() -> bool + SetIsVisible(isVisible : bool) -> void + IsEnabled() -> bool + SetIsEnabled(isEnabled : bool) -> void + GetParentUIObject() -> UIObject + AddChildUIObject(uiObject : UIObject) -> void + RemoveChildUIObject(uiObject : UIObject) -> bool + ClearDeep() -> void + RemoveFromParent() -> bool + DetachFromParent() -> UIObject + HasChildUIObjects() -> bool + GetChildUIObject(index : int) -> UIObject + NumChildUIObjects(deep : bool) -> uint32 + GetNode() -> Node + GetWorld() -> World + GetAABB() -> BoundingBox + GetAABBClamped() -> BoundingBox + GetDataSource() -> UIDataSourceBase + SetDataSource(dataSource : UIDataSourceBase) -> void + OnInit : any + OnAttached : any + OnRemoved : any + OnChildAttached : any + OnChildRemoved : any + OnMouseDown : any + OnMouseUp : any + OnMouseDrag : any + OnMouseHover : any + OnMouseLeave : any + OnMouseMove : any + OnGainFocus : any + OnLoseFocus : any + OnScroll : any + OnClick : any + OnRightClick : any + OnKeyDown : any + OnKeyUp : any + OnTextChange : any + OnSizeChange : any + OnComputedVisibilityChange : any + OnEnabled : any + OnDisabled : any + OnValueChange : any Init() -> void - OnAdded_Impl(worldGrid : WorldGrid) -> void - OnRemoved_Impl(worldGrid : WorldGrid) -> void - CreateStreamingCell_Impl(cellInfo : StreamingCellInfo) -> StreamingCell - Init_Impl() -> void end -extern struct WorldGridLayerInfo - GridSize : Vec2u - CellSize : Vec3u - Offset : Vec3f - Scale : Vec3f - MaxDistance : float +extern class UIConsole : UIObject end -extern class TerrainWorldGridLayer : WorldGridLayer +extern class UIText : UIObject + GetCharacterOffset(characterIndex : int) -> Vec2f +end +extern class UIStage : UIObject + GetSurfaceSize() -> Vec2i + SetSurfaceSize(surfaceSize : Vec2i) -> void GetScene() -> Scene - Init() -> void - OnAdded_Impl(worldGrid : WorldGrid) -> void - OnRemoved_Impl(worldGrid : WorldGrid) -> void - CreateStreamingCell_Impl(cellInfo : StreamingCellInfo) -> StreamingCell + SetScene(scene : Scene) -> void + GetCamera() -> Camera end -extern struct RigidBodyComponent - PhysicsMaterial : PhysicsMaterial - Shape : PhysicsShape - RigidBody : RigidBody +extern class UISpacer : UIObject end -extern struct AudioPlaybackState - Status : AudioPlaybackStatus - LoopMode : AudioLoopMode - Speed : float - CurrentTime : float +extern class UIPanel : UIObject + IsHorizontalScrollEnabled() -> bool + IsVerticalScrollEnabled() -> bool + SetIsScrollEnabled(axis : ScrollAxis, isScrollEnabled : bool) -> void end -extern enum AudioPlaybackStatus : uint8 - APS_STOPPED, - APS_PAUSED, - APS_PLAYING +extern class UIWindow : UIPanel end -extern enum AudioComponentFlags : uint8 - NONE = 0x0, - INIT = 0x1 +extern class UITextbox : UIPanel + GetPlaceholder() -> string + SetPlaceholder(placeholder : string) -> void + GetPlaceholderTextColor() -> Color + ClearOnSubmit : bool end -extern struct AudioComponent - AudioSource : AudioSource - PlaybackState : AudioPlaybackState - Flags : AudioComponentFlags - LastPosition : Vec3f - Timer : float +extern class UITabView : UIPanel end -extern enum AudioLoopMode : uint8 - ALM_ONCE, - ALM_REPEAT +extern class UITab : UIObject end -extern enum AnimationPlaybackStatus : uint8 - STOPPED = 0, - PAUSED, - PLAYING +extern class UIMenuBar : UIPanel + GetDropDirection() -> UIMenuBarDropDirection + SetDropDirection(dropDirection : UIMenuBarDropDirection) -> void + SetSelectedMenuItemIndex(index : uint32) -> void + AddMenuItem(name : Name, text : string) -> UIMenuItem + GetMenuItem(name : Name) -> UIMenuItem + GetMenuItemIndex(name : Name) -> uint32 + RemoveMenuItem(name : Name) -> bool end -extern enum AnimationLoopMode : uint8 - ONCE = 0, - REPEAT +extern class UIMenuItem : UIObject end -extern struct AnimationPlaybackState - AnimationIndex : uint32 - Status : AnimationPlaybackStatus - LoopMode : AnimationLoopMode - Speed : float - CurrentTime : float +extern enum UIMenuBarDropDirection : uint32 + DOWN, + UP end -extern struct AnimationComponent - PlaybackState : AnimationPlaybackState +extern enum UIListViewOrientation : uint8 + VERTICAL = 0, + HORIZONTAL end -extern struct CharacterControllerComponent - Shape : PhysicsShape - InputHandler : InputHandlerBase - PhysicsHandle : void - ViewDirection : Vec3f - Translation : Vec3f - MoveSpeed : float - StepHeight : float - MaxSlopeAngle : float - JumpSpeed : float - FallSpeed : float - IsOnGround : bool +extern class UIListView : UIPanel + SetSelectedItem(listViewItem : UIListViewItem) -> void + GetSelectedItemIndex() -> int + SetSelectedItemIndex(index : int) -> void + GetOrientation() -> UIListViewOrientation + SetOrientation(orientation : UIListViewOrientation) -> void end -extern struct UIComponent - UiObject : any -end -extern enum ScriptComponentFlags : uint32 - NONE = 0x0, - INITIALIZED = 0x1, - RELOADING = 0x2, - INITIALIZATION_STARTED = 0x4, - BEFORE_ADDED_CALLED = 0x10, - ON_ADDED_CALLED = 0x20 +extern class UIListViewItem : UIObject end -extern struct TransformComponent - Translation : Vec3f - Rotation : Quat4f - Scale : Vec3f +extern class UIGrid : UIPanel + GetNumColumns() -> int + SetNumColumns(numColumns : int) -> void + GetNumRows() -> uint32 + SetNumRows(numRows : uint32) -> void end -extern struct BoundingBoxComponent - WorldAabb : BoundingBox +extern class UIGridRow : UIPanel end -extern struct VisibilityStateComponent - Flags : VisibilityStateFlags - OctantId : OctantId - VisibilityState : VisibilityState +extern class UIGridColumn : UIPanel + GetColumnSize() -> int + SetColumnSize(columnSize : int) -> void end -extern enum VisibilityStateFlags : uint32 - NONE = 0x0, - ALWAYS_VISIBLE = 0x1, - INVALIDATED = 0x2 +extern class UIDockableContainer : UIPanel end -extern struct MeshComponent - Mesh : Mesh - Material : MaterialInstance - Skeleton : Skeleton - EnableAutoInstancing : bool - NumInstances : uint32 - PreviousModelMatrix : Mat4f +extern class UIDockableItem : UIPanel end -extern struct Keyframe - Time : float - Transform : Transform - Blend(to : Keyframe, blend : float) -> Keyframe +extern class EditorPropertyPanelBase : UIPanel + Build(boxed : any, property : any) -> void end -extern class EntityManager - GetWorld() -> World - GetScene() -> Scene - AddExistingEntity(entity : Entity) -> void - AddTypedEntity(cls : Class) -> Entity - AddBasicEntity() -> Entity +extern class UIImage : UIObject end -extern struct BVHNode +extern class UIButton : UIObject end -extern enum ViewFlags : uint32 - NONE = 0x0, - GBUFFER = 0x1, - ALL_WORLD_SCENES = 0x2, - COLLECT_STATIC_ENTITIES = 0x4, - COLLECT_DYNAMIC_ENTITIES = 0x8, - COLLECT_ALL_ENTITIES = (COLLECT_STATIC_ENTITIES | COLLECT_DYNAMIC_ENTITIES), - NO_FRUSTUM_CULLING = 0x10, - SKIP_ENV_PROBES = 0x20, - SKIP_ENV_GRIDS = 0x40, - SKIP_LIGHTS = 0x80, - SKIP_LIGHTMAP_VOLUMES = 0x100, - SKIP_PARTICLE_VOLUMES = 0x200, - SKIP_FOG_VOLUMES = 0x400, - SKIP_CAMERAS = 0x800, - SKIP_SPRITES = 0x1000, - NOT_MULTI_BUFFERED = 0x2000, - NO_DRAW_CALLS = 0x4000, - RAY_TRACING = 0x100000, - MATCH_CAMERA_DIMENSIONS = 0x200000, - SHADOW_VIEW = 0x400000, - BAKER_VIEW = 0x800000, - UI_VIEW = 0x1000000, - EXTERNAL_RENDERTARGET = 0x10000000, - DEFAULT = (ALL_WORLD_SCENES | COLLECT_ALL_ENTITIES) +extern class UIDataSourceBase + Size() -> int + Clear() -> void end -extern class View - GetScenes() -> Array - AddScene(scene : Scene) -> void - RemoveScene(scene : Scene) -> void - GetCamera() -> Camera - GetPriority() -> int - SetPriority(priority : int) -> void +extern class UIDataSource : UIDataSourceBase + Size() -> int + Clear() -> void end -extern class Subsystem +extern class UIElementFactoryBase + GetElementTypeId() -> TypeId + CreateUIObject(parent : UIObject, value : any, context : any) -> UIObject + UpdateUIObject(uiObject : UIObject, value : any, context : any) -> void end -extern enum SubsystemUpdatePhase : uint8 - BeforeVis, - AfterVis +extern class ApplicationWindow + GetInputManager() -> InputManager + GetHWND() -> any + GetSize() -> Vec2i + SetMousePosition(position : Vec2i) -> void + GetMousePosition() -> Vec2i + SetIsMouseLocked(locked : bool) -> void + IsMouseLocked() -> bool + HasMouseFocus() -> bool + IsHighDPI() -> bool + GetContentScaleFactor() -> float + GetRenderTargetScale() -> float + GetRenderSize() -> Vec2i + GetDimensions() -> Vec2i + Close() -> void + OnWindowSizeChanged : any + OnClose : any end -extern class EditorGizmoBase - GetNode() -> Node - IsDragging() -> bool - GetManipulationMode() -> EditorManipulationMode - GetPriority() -> int - GetMenuText() -> string +extern class AndroidApplicationWindow : ApplicationWindow + SetMousePosition(position : Vec2i) -> void + GetMousePosition() -> Vec2i + GetDimensions() -> Vec2i + SetIsMouseLocked(locked : bool) -> void + IsMouseLocked() -> bool + HasMouseFocus() -> bool + Close() -> void end -extern class NullEditorGizmo : EditorGizmoBase +extern class CocoaApplicationWindow : ApplicationWindow + SetMousePosition(position : Vec2i) -> void + GetMousePosition() -> Vec2i + GetDimensions() -> Vec2i + SetIsMouseLocked(locked : bool) -> void + IsMouseLocked() -> bool + HasMouseFocus() -> bool + IsHighDPI() -> bool + GetContentScaleFactor() -> float + GetRenderTargetScale() -> float + GetNSWindow() -> any + GetNSView() -> any + Close() -> void end -extern class TranslateEditorGizmo : EditorGizmoBase +extern class Win32ApplicationWindow : ApplicationWindow + SetMousePosition(position : Vec2i) -> void + GetMousePosition() -> Vec2i + GetDimensions() -> Vec2i + SetIsMouseLocked(locked : bool) -> void + IsMouseLocked() -> bool + HasMouseFocus() -> bool + Close() -> void end -extern class RotateEditorGizmo : EditorGizmoBase +extern struct WindowOptions end -extern class VolumeEditorGizmo : EditorGizmoBase +extern enum WindowFlags : uint32 + NONE = 0x0, + HEADLESS = 0x1, + NO_GFX = 0x2, + HIGH_DPI = 0x4, + EVENTS_POLLING = 0x8 end -extern class GenerateLightmapsEditorTask : TickableEditorTask - GetWorld() -> World - SetWorld(world : World) -> void - GetScene() -> Scene - SetScene(scene : Scene) -> void - Start() -> void - Cancel() -> void - IsCompleted() -> bool - Tick() -> void +extern class AppContextBase + static GetInstance() -> AppContextBase + GetAppName() -> string + GetMainWindow() -> ApplicationWindow + SetMainWindow(window : ApplicationWindow) -> void + GetWindows() -> Array + CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow + RemoveWindow(window : ApplicationWindow) -> void + RunCommandlet(commandletName : string, args : CommandLineArguments) -> Result + OnCurrentWindowChanged : any end -extern enum EditorManipulationMode - NONE = 0, - TRANSLATE, - ROTATE, - SCALE, - VOLUME_EDIT +extern class Win32AppContext : AppContextBase + CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow end -extern class EditorSubsystem : Subsystem - GetCurrentProject() -> EditorProject - GetActiveViewport() -> EditorViewport - SetActiveViewport(viewport : EditorViewport) -> void - AddViewport(viewport : EditorViewport) -> void - RemoveViewport(viewport : EditorViewport) -> void - GetEditorScene() -> Scene - ExecuteCommand(command : EditorCommandBase) -> bool - ExecuteCommandByName(name : Name, arguments : string) -> bool - NewProject() -> void - OpenProject(project : EditorProject) -> void - CloseProject() -> void - ShowImportContentDialog() -> void - SetFocusedNode(focusedNode : Node, shouldSelectInOutline : bool) -> void - GetFocusedNode() -> Node - GetActiveScene() -> Scene - SetActiveScene(scene : Scene) -> void - GetSelectedManipulationMode() -> EditorManipulationMode - SetSelectedManipulationMode(mode : EditorManipulationMode) -> void - GetSelectedGizmo() -> EditorGizmoBase - GetGizmo(mode : EditorManipulationMode) -> EditorGizmoBase - SetSelectedBucket(bucketIndex : uint32) -> void - CalculateSceneInsertionPoint(desiredDistance : float, offsetFromSurface : float) -> Vec3f - OnFocusedNodeChanged : any - OnProjectClosing : any - OnProjectOpened : any - OnActiveSceneChanged : any - OnSelectedGizmoChanged : any - OnSelectedBucketChanged : any - OnActiveViewportChanged : any - StartSimulation() -> void - StopSimulation() -> void - PauseSimulation() -> void +extern class CocoaAppContext : AppContextBase + CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow end -extern class BakerSubsystem : Subsystem +extern class AndroidAppContext : AppContextBase + CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow end -extern struct ComponentInfo - TypeId : TypeId - Access : ComponentAccess - ReceivesEvents : bool +extern class StreamingVolumeBase + GetShape() -> StreamingVolumeShape + GetBoundingBox(outAabb : BoundingBox) -> bool + GetBoundingSphere(outSphere : BoundingSphere) -> bool + ContainsPoint(point : Vec3f) -> bool + GetShape_Impl() -> StreamingVolumeShape + GetBoundingBox_Impl(outAabb : BoundingBox) -> bool + GetBoundingSphere_Impl(outSphere : BoundingSphere) -> bool + ContainsPoint_Impl(point : Vec3f) -> bool + NotifyUpdate() -> void end -extern enum ComponentAccess : uint32 - NONE = 0, - READ = 0x1, - WRITE = 0x2, - READ_WRITE = (READ | WRITE) +extern enum StreamingVolumeShape : uint32 + SPHERE = 0, + BOX, + MAX, + INVALID = ~0u end -extern class SystemBase +extern class StreamingManager + AddStreamingVolume(volume : StreamingVolumeBase) -> void + RemoveStreamingVolume(volume : StreamingVolumeBase) -> void end -extern class ScriptableSystem : SystemBase - AllowParallelExecution() -> bool - RequiresSimThread() -> bool - AllowUpdate() -> bool - OnEntityAdded(entity : Entity) -> void - OnEntityRemoved(entity : Entity) -> void - Init() -> void - Shutdown() -> void - ProcessScene(scene : Scene, delta : float) -> void - GetComponentInfos() -> Array - AllowParallelExecution_Impl() -> bool - RequiresSimThread_Impl() -> bool - AllowUpdate_Impl() -> bool - OnEntityAdded_Impl(entity : Entity) -> void - OnEntityRemoved_Impl(entity : Entity) -> void - Init_Impl() -> void - Shutdown_Impl() -> void +extern class StreamableBase + GetBoundingBox() -> BoundingBox + OnStreamStart() -> void + OnLoaded() -> void + OnRemoved() -> void + GetBoundingBox_Impl() -> BoundingBox + OnStreamStart_Impl() -> void + OnLoaded_Impl() -> void + OnRemoved_Impl() -> void end -extern class DynamicSkySystem : SystemBase +extern enum StreamingCellState : uint32 + INVALID = ~0u, + UNLOADED = 0, + UNLOADING, + WAITING, + LOADING, + LOADED, + MAX end -extern struct TagComponentBase - Value : EntityTag +extern class StreamingCell : StreamableBase + GetPatchInfo() -> StreamingCellInfo + Update(delta : float) -> void + GetBoundingBox_Impl() -> BoundingBox + Update_Impl(delta : float) -> void end -extern struct EntityTag - Value : uint64 +extern struct StreamingCellInfo + Coord : Vec2i + Extent : Vec3u + Scale : Vec3f + Bounds : BoundingBox end -extern struct VisibilityStateSnapshot +extern struct StreamingCellNeighbor + Coord : Vec2i end -extern struct VisibilityState +extern class TerrainStreamingCell : StreamingCell + OnStreamStart_Impl() -> void + OnLoaded_Impl() -> void + OnRemoved_Impl() -> void end -extern class RigidBody +extern enum ScriptLanguage : uint32 + Invalid = ~0u, + Native = 0, + HypScript = 1, + CSharp = 2 end -extern struct PhysicsMaterial - Mass : float +extern enum ScriptCompileStatus : uint32 + Uninitialized = 0x0, + Compiled = 0x1, + Dirty = 0x2, + Processing = 0x4, + Errored = 0x8 end -extern class PhysicsWorldBase +extern struct ScriptDesc + Uuid : UUID + Language : ScriptLanguage + Path : Array + AssemblyPath : Array + ClassName : Array + CompileStatus : uint32 + HotReloadVersion : int32 + LastModifiedTimestamp : uint64 end -extern enum VulkanDeviceQueueType : uint8 - INVALID = 0, - GRAPHICS, - COMPUTE, - TRANSFER, - PRESENT, - MAX +extern struct PropertyHandle end -extern struct ShadowMapAtlasElement +extern struct FieldHandle end -extern struct ShadowMapAtlas - AtlasIndex : uint32 +extern struct MethodHandle end -extern enum ShadowMapFilter : uint32 - SMF_STANDARD = 0, - SMF_PCF, - SMF_CONTACT_HARDENED, - SMF_VSM, - SMF_MAX +extern class Reflection + static GetClassByName(name : Name) -> Class + static GetFields(classRef : Class) -> Array + static GetFieldHandle(classRef : Class, fieldName : Name) -> FieldHandle + static GetFieldValue(field : FieldHandle, target : any) -> any + static SetFieldValue(field : FieldHandle, target : any, value : any) -> void + static GetFieldName(field : FieldHandle) -> Name + static GetMethods(classRef : Class) -> Array + static GetMethodHandle(classRef : Class, methodName : Name) -> MethodHandle + static InvokeMethod(method : MethodHandle, args : Array) -> any + static GetMethodName(method : MethodHandle) -> Name + static GetProperties(classRef : Class) -> Array + static GetPropertyHandle(classRef : Class, propertyName : Name) -> PropertyHandle + static GetPropertyValue(property : PropertyHandle, target : any) -> any + static SetPropertyValue(property : PropertyHandle, target : any, value : any) -> void + static GetPropertyName(property : PropertyHandle) -> Name end -extern enum ShadowMapType : uint32 - SMT_DIRECTIONAL, - SMT_SPOT, - SMT_OMNI +extern class Debugger + static Breakpoint() -> void + static AssertTrue(condition : bool) -> void + static AssertFalse(condition : bool) -> void end -extern struct MeshRayTracingData +extern class WorldGridLayer + GetName() -> Name + SetName(name : Name) -> void + GetLayerInfo() -> WorldGridLayerInfo + OnAdded(worldGrid : WorldGrid) -> void + OnRemoved(worldGrid : WorldGrid) -> void + CreateStreamingCell(cellInfo : StreamingCellInfo) -> StreamingCell + AddStreamingObject(assetObject : AssetObject, coord : Vec2i) -> void + RemoveStreamingObject(assetObject : AssetObject) -> void + Init() -> void + OnAdded_Impl(worldGrid : WorldGrid) -> void + OnRemoved_Impl(worldGrid : WorldGrid) -> void + CreateStreamingCell_Impl(cellInfo : StreamingCellInfo) -> StreamingCell + Init_Impl() -> void end -extern struct DescriptorSetLayoutElement - Type : ShaderInputType - Binding : uint32 - Count : uint32 +extern struct WorldGridLayerInfo + GridSize : Vec2u + CellSize : Vec3u + Offset : Vec3f + Scale : Vec3f + MaxDistance : float end -extern enum GpuImageFlags : uint32 - NONE = 0x0 +extern class TerrainWorldGridLayer : WorldGridLayer + GetScene() -> Scene + Init() -> void + OnAdded_Impl(worldGrid : WorldGrid) -> void + OnRemoved_Impl(worldGrid : WorldGrid) -> void + CreateStreamingCell_Impl(cellInfo : StreamingCellInfo) -> StreamingCell end -extern struct MeshAttributes - InputLayout : VertexInputLayoutDesc - Topology : Topology - IndexBufferElemType : GpuElemType +extern struct WGLayerDesc + ClassName : Name + LayerName : Name + Info : WorldGridLayerInfo + Objects : Array end -extern struct MaterialAttributes - ShaderName : Name - ShaderProperties : ShaderPropertySet - Bucket : RenderBucket - FillMode : FillMode - BlendFunction : BlendFunction - CullFaces : FaceCullMode - Flags : MaterialAttributeFlags - StencilFunction : StencilFunction - StencilReference : uint8 - DepthBias : int32 - DepthBiasSlope : float +extern struct WGObject + Coords : Vec2i + Path : AssetPath end -extern enum MaterialAttributeFlags : uint8 - MAF_NONE = 0x0, - MAF_DEPTH_WRITE = 0x1, - MAF_DEPTH_TEST = 0x2, - MAF_DEPTH_BIAS = 0x4, - MAF_DEPTH_CLAMP = 0x8, - MAF_STENCIL_TEST = 0x10, - MAF_ALPHA_DISCARD = 0x20 +extern class WorldGrid + GetWorld() -> World + AddLayer(layer : WorldGridLayer) -> void + RemoveLayer(layer : WorldGridLayer) -> bool + GetLayers() -> Array end -extern struct RayTracingReflectionsConfig - Extent : Vec2u +extern struct VisibilityStateComponent + Flags : VisibilityStateFlags + OctantId : OctantId + VisibilityState : VisibilityState end -extern enum GBufferTargetName : uint32 - GTN_ALBEDO = 0, - GTN_NORMALS, - GTN_MATERIAL, - GTN_VELOCITY, - GTN_DEPTH, - GTN_MAX +extern enum VisibilityStateFlags : uint32 + NONE = 0x0, + ALWAYS_VISIBLE = 0x1, + INVALIDATED = 0x2 end -extern struct MaterialTextures - Values : Array +extern struct UIComponent + UiObject : any end -extern struct MaterialParameters - Albedo : Vec4f - Metalness : float - Roughness : float - AlphaThreshold : float - ParallaxHeightScale : float - Transmission : float - Ior : float - EmissiveColor : Color - EmissiveIntensity : float - UserParams : Vec4f +extern struct TransformComponent + Translation : Vec3f + Rotation : Quat4f + Scale : Vec3f end -extern enum MaterialTextureKey : uint64 - NONE = 0, - Diffuse = 0x1, - Normals = 0x2, - Parallax = 0x4, - Metalness = 0x8, - Roughness = 0x10, - AmbientOcclusion = 0x20 +extern enum ScriptComponentFlags : uint32 + NONE = 0x0, + INITIALIZED = 0x1, + RELOADING = 0x2, + INITIALIZATION_STARTED = 0x4, + BEFORE_ADDED_CALLED = 0x10, + ON_ADDED_CALLED = 0x20 end -extern enum GlobalRendererType : uint32 - GRT_NONE = ~0u, - GRT_MAIN = 0, - GRT_UI, - GRT_ENV_PROBE, - GRT_ENV_GRID, - GRT_SHADOW_MAP, - GRT_PARTICLE_VOLUME, - GRT_SPRITE, - GRT_SSAO, - GRT_MAX +extern struct RigidBodyComponent + PhysicsMaterial : PhysicsMaterial + Shape : PhysicsShape + RigidBody : RigidBody end -extern enum VertexType : uint8 +extern struct MeshComponent + Mesh : Mesh + Material : MaterialInstance + Skeleton : Skeleton + EnableAutoInstancing : bool + NumInstances : uint32 + PreviousModelMatrix : Mat4f +end +extern struct CharacterControllerComponent + Shape : PhysicsShape + InputHandler : InputHandlerBase + PhysicsHandle : void + ViewDirection : Vec3f + Translation : Vec3f + MoveSpeed : float + StepHeight : float + MaxSlopeAngle : float + JumpSpeed : float + FallSpeed : float + IsOnGround : bool +end +extern struct BoundingBoxComponent + WorldAabb : BoundingBox +end +extern struct AudioPlaybackState + Status : AudioPlaybackStatus + LoopMode : AudioLoopMode + Speed : float + CurrentTime : float +end +extern enum AudioPlaybackStatus : uint8 + APS_STOPPED, + APS_PAUSED, + APS_PLAYING +end +extern enum AudioComponentFlags : uint8 + NONE = 0x0, + INIT = 0x1 +end +extern struct AudioComponent + AudioSource : AudioSource + PlaybackState : AudioPlaybackState + Flags : AudioComponentFlags + LastPosition : Vec3f + Timer : float +end +extern enum AudioLoopMode : uint8 + ALM_ONCE, + ALM_REPEAT +end +extern enum AnimationPlaybackStatus : uint8 + STOPPED = 0, + PAUSED, + PLAYING +end +extern enum AnimationLoopMode : uint8 + ONCE = 0, + REPEAT +end +extern struct AnimationPlaybackState + AnimationIndex : uint32 + Status : AnimationPlaybackStatus + LoopMode : AnimationLoopMode + Speed : float + CurrentTime : float +end +extern struct AnimationComponent + PlaybackState : AnimationPlaybackState +end +extern struct Keyframe + Time : float + Transform : Transform + Blend(to : Keyframe, blend : float) -> Keyframe +end +extern struct VisibilityStateSnapshot +end +extern struct VisibilityState +end +extern enum ViewFlags : uint32 + NONE = 0x0, + GBUFFER = 0x1, + ALL_WORLD_SCENES = 0x2, + COLLECT_STATIC_ENTITIES = 0x4, + COLLECT_DYNAMIC_ENTITIES = 0x8, + COLLECT_ALL_ENTITIES = (COLLECT_STATIC_ENTITIES | COLLECT_DYNAMIC_ENTITIES), + NO_FRUSTUM_CULLING = 0x10, + SKIP_ENV_PROBES = 0x20, + SKIP_ENV_GRIDS = 0x40, + SKIP_LIGHTS = 0x80, + SKIP_LIGHTMAP_VOLUMES = 0x100, + SKIP_PARTICLE_VOLUMES = 0x200, + SKIP_FOG_VOLUMES = 0x400, + SKIP_CAMERAS = 0x800, + SKIP_SPRITES = 0x1000, + NOT_MULTI_BUFFERED = 0x2000, + NO_DRAW_CALLS = 0x4000, + RAY_TRACING = 0x100000, + MATCH_CAMERA_DIMENSIONS = 0x200000, + SHADOW_VIEW = 0x400000, + BAKER_VIEW = 0x800000, + UI_VIEW = 0x1000000, + EXTERNAL_RENDERTARGET = 0x10000000, + DEFAULT = (ALL_WORLD_SCENES | COLLECT_ALL_ENTITIES) +end +extern class View + GetScenes() -> Array + AddScene(scene : Scene) -> void + RemoveScene(scene : Scene) -> void + GetCamera() -> Camera + GetPriority() -> int + SetPriority(priority : int) -> void +end +extern class SystemBase +end +extern class ScriptableSystem : SystemBase + AllowParallelExecution() -> bool + RequiresSimThread() -> bool + AllowUpdate() -> bool + OnEntityAdded(entity : Entity) -> void + OnEntityRemoved(entity : Entity) -> void + Init() -> void + Shutdown() -> void + ProcessScene(scene : Scene, delta : float) -> void + GetComponentInfos() -> Array + AllowParallelExecution_Impl() -> bool + RequiresSimThread_Impl() -> bool + AllowUpdate_Impl() -> bool + OnEntityAdded_Impl(entity : Entity) -> void + OnEntityRemoved_Impl(entity : Entity) -> void + Init_Impl() -> void + Shutdown_Impl() -> void +end +extern class DynamicSkySystem : SystemBase +end +extern class Subsystem +end +extern enum SubsystemUpdatePhase : uint8 + BeforeVis, + AfterVis +end +extern class BakerSubsystem : Subsystem +end +extern struct TagComponentBase + Value : EntityTag +end +extern struct EntityTag + Value : uint64 +end +extern class EntityManager + GetWorld() -> World + GetScene() -> Scene + AddExistingEntity(entity : Entity) -> void + AddTypedEntity(cls : Class) -> Entity + AddBasicEntity() -> Entity +end +extern struct ComponentInfo + TypeId : TypeId + Access : ComponentAccess + ReceivesEvents : bool +end +extern enum ComponentAccess : uint32 + NONE = 0, + READ = 0x1, + WRITE = 0x2, + READ_WRITE = (READ | WRITE) +end +extern struct BVHNode +end +extern enum VulkanSemaphoreType : uint8 + BINARY = 0, + TIMELINE = 1 +end +extern enum VulkanDeviceQueueType : uint8 + INVALID = 0, + GRAPHICS, + COMPUTE, + TRANSFER, + PRESENT, + MAX +end +extern struct ShadowMapAtlasElement +end +extern struct ShadowMapAtlas + AtlasIndex : uint32 +end +extern enum ShadowMapFilter : uint32 + SMF_STANDARD = 0, + SMF_PCF, + SMF_CONTACT_HARDENED, + SMF_VSM, + SMF_MAX +end +extern enum ShadowMapType : uint32 + SMT_DIRECTIONAL, + SMT_SPOT, + SMT_OMNI +end +extern enum VertexType : uint8 VT_Invalid = 0x0, VT_Position = 0x1, VT_Normal = 0x2, @@ -825,6 +967,16 @@ extern enum StoreOperation : uint8 NONE, STORE end +extern enum DepthCompareOp : uint8 + DCO_LESS, + DCO_LESS_OR_EQUAL, + DCO_GREATER, + DCO_GREATER_OR_EQUAL, + DCO_EQUAL, + DCO_NOT_EQUAL, + DCO_ALWAYS, + DCO_NEVER +end extern enum TextureBaseFormat : uint8 Red, RG, @@ -964,9 +1116,19 @@ extern enum Topology : uint8 end extern struct BlendFunction end -extern enum AccelerationStructureType : uint8 - BOTTOM_LEVEL, - TOP_LEVEL +extern struct MeshRayTracingData +end +extern enum GlobalRendererType : uint32 + GRT_NONE = ~0u, + GRT_DEFERRED = 0, + GRT_UI, + GRT_ENV_PROBE, + GRT_ENV_GRID, + GRT_SHADOW_MAP, + GRT_PARTICLE_VOLUME, + GRT_SPRITE, + GRT_SSAO, + GRT_MAX end extern enum RenderBucket : uint8 Opaque, @@ -975,231 +1137,89 @@ extern enum RenderBucket : uint8 Sky, Debug end -extern class UISubsystem : Subsystem - AddDebugOverlay(debugOverlay : OverlayBase) -> void - RemoveDebugOverlay(debugOverlay : OverlayBase) -> bool +extern struct MeshAttributes + InputLayout : VertexInputLayoutDesc + Topology : Topology + IndexBufferElemType : GpuElemType end -extern struct DescriptorSetLayoutElement - Type : ShaderInputType - Binding : uint32 - Count : uint32 - Category : ShaderResourceCategory +extern struct MaterialAttributes + ShaderName : Name + ShaderProperties : ShaderPropertySet + Bucket : RenderBucket + FillMode : FillMode + BlendFunction : BlendFunction + CullFaces : FaceCullMode + Flags : MaterialAttributeFlags + StencilFunction : StencilFunction + DepthCompareOp : DepthCompareOp + StencilReference : uint8 + DepthBias : int32 + DepthBiasSlope : float end -extern struct DebugDrawerConfig - Enabled : bool +extern enum MaterialAttributeFlags : uint8 + MAF_NONE = 0x0, + MAF_DEPTH_WRITE = 0x1, + MAF_DEPTH_TEST = 0x2, + MAF_DEPTH_BIAS = 0x4, + MAF_DEPTH_CLAMP = 0x8, + MAF_STENCIL_TEST = 0x10, + MAF_ALPHA_DISCARD = 0x20 end -extern class AudioManager +extern struct RayTracingReflectionsConfig + Extent : Vec2u end -extern enum AudioSourceState : uint32 - UNDEFINED, - STOPPED, - PLAYING, - PAUSED +extern struct MaterialTextures + Values : Array end -extern enum AudioSourceFormat : uint32 - MONO8, - MONO16, - STEREO8, - STEREO16 -end -extern class AudioSource - GetFormat() -> AudioSourceFormat - SetFormat(format : AudioSourceFormat) -> void - GetFreq() -> uint64 - SetFreq(freq : uint64) -> void - GetData() -> ByteBuffer - SetData(data : ByteBuffer) -> void - GetSampleLength() -> uint32 - SetSampleLength(sampleLength : uint32) -> void - GetDuration() -> double - SetDuration(duration : double) -> void -end -extern class ApplicationWindow - GetInputManager() -> InputManager - GetHWND() -> any - GetSize() -> Vec2i - SetMousePosition(position : Vec2i) -> void - GetMousePosition() -> Vec2i - SetIsMouseLocked(locked : bool) -> void - IsMouseLocked() -> bool - HasMouseFocus() -> bool - IsHighDPI() -> bool - GetDimensions() -> Vec2i - Close() -> void - OnWindowSizeChanged : any - OnClose : any -end -extern class AndroidApplicationWindow : ApplicationWindow - SetMousePosition(position : Vec2i) -> void - GetMousePosition() -> Vec2i - GetDimensions() -> Vec2i - SetIsMouseLocked(locked : bool) -> void - IsMouseLocked() -> bool - HasMouseFocus() -> bool - Close() -> void -end -extern class SDLApplicationWindow : ApplicationWindow - SetMousePosition(position : Vec2i) -> void - GetMousePosition() -> Vec2i - GetDimensions() -> Vec2i - SetIsMouseLocked(locked : bool) -> void - IsMouseLocked() -> bool - HasMouseFocus() -> bool - IsHighDPI() -> bool - Close() -> void -end -extern class CocoaApplicationWindow : ApplicationWindow - SetMousePosition(position : Vec2i) -> void - GetMousePosition() -> Vec2i - GetDimensions() -> Vec2i - SetIsMouseLocked(locked : bool) -> void - IsMouseLocked() -> bool - HasMouseFocus() -> bool - IsHighDPI() -> bool - GetNSWindow() -> any - GetNSView() -> any - Close() -> void -end -extern class Win32ApplicationWindow : ApplicationWindow - SetMousePosition(position : Vec2i) -> void - GetMousePosition() -> Vec2i - GetDimensions() -> Vec2i - SetIsMouseLocked(locked : bool) -> void - IsMouseLocked() -> bool - HasMouseFocus() -> bool - Close() -> void -end -extern class AppContextBase - static GetInstance() -> AppContextBase - GetAppName() -> string - GetMainWindow() -> ApplicationWindow - SetMainWindow(window : ApplicationWindow) -> void - GetWindows() -> Array - CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow - RemoveWindow(window : ApplicationWindow) -> void - RunCommandlet(commandletName : string, args : CommandLineArguments) -> Result - OnCurrentWindowChanged : any -end -extern class Win32AppContext : AppContextBase - CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow -end -extern class AndroidAppContext : AppContextBase - CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow -end -extern class SDLAppContext : AppContextBase - CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow -end -extern class CocoaAppContext : AppContextBase - CreateSystemWindow(windowOptions : WindowOptions) -> ApplicationWindow -end -extern struct WindowOptions -end -extern enum WindowFlags : uint32 - NONE = 0x0, - HEADLESS = 0x1, - NO_GFX = 0x2, - HIGH_DPI = 0x4, - EVENTS_POLLING = 0x8 -end -extern class StreamingVolumeBase - GetShape() -> StreamingVolumeShape - GetBoundingBox(outAabb : BoundingBox) -> bool - GetBoundingSphere(outSphere : BoundingSphere) -> bool - ContainsPoint(point : Vec3f) -> bool - GetShape_Impl() -> StreamingVolumeShape - GetBoundingBox_Impl(outAabb : BoundingBox) -> bool - GetBoundingSphere_Impl(outSphere : BoundingSphere) -> bool - ContainsPoint_Impl(point : Vec3f) -> bool - NotifyUpdate() -> void -end -extern enum StreamingVolumeShape : uint32 - SPHERE = 0, - BOX, - MAX, - INVALID = ~0u -end -extern class StreamingManager - AddStreamingVolume(volume : StreamingVolumeBase) -> void - RemoveStreamingVolume(volume : StreamingVolumeBase) -> void -end -extern class StreamableBase - GetBoundingBox() -> BoundingBox - OnStreamStart() -> void - OnLoaded() -> void - OnRemoved() -> void - GetBoundingBox_Impl() -> BoundingBox - OnStreamStart_Impl() -> void - OnLoaded_Impl() -> void - OnRemoved_Impl() -> void -end -extern enum StreamingCellState : uint32 - INVALID = ~0u, - UNLOADED = 0, - UNLOADING, - WAITING, - LOADING, - LOADED, - MAX -end -extern class StreamingCell : StreamableBase - GetPatchInfo() -> StreamingCellInfo - Update(delta : float) -> void - GetBoundingBox_Impl() -> BoundingBox - Update_Impl(delta : float) -> void +extern struct MaterialParameters + Albedo : Vec4f + Metalness : float + Roughness : float + AlphaThreshold : float + ParallaxHeightScale : float + Transmission : float + Ior : float + EmissiveColor : Color + EmissiveIntensity : float + UserParams : Vec4f end -extern struct StreamingCellInfo - Coord : Vec2i - Extent : Vec3u - Scale : Vec3f - Bounds : BoundingBox +extern enum MaterialTextureKey : uint64 + NONE = 0, + Diffuse = 0x1, + Normals = 0x2, + Parallax = 0x4, + Metalness = 0x8, + Roughness = 0x10, + AmbientOcclusion = 0x20 end -extern struct StreamingCellNeighbor - Coord : Vec2i +extern enum GpuImageFlags : uint32 + NONE = 0x0 end -extern class TerrainStreamingCell : StreamingCell - OnStreamStart_Impl() -> void - OnLoaded_Impl() -> void - OnRemoved_Impl() -> void +extern enum GBufferTargetName : uint32 + GTN_ALBEDO = 0, + GTN_NORMALS, + GTN_MATERIAL, + GTN_VELOCITY, + GTN_DEPTH, + GTN_MAX end -extern class BakerBase +extern class UISubsystem : Subsystem + AddDebugOverlay(debugOverlay : OverlayBase) -> void + RemoveDebugOverlay(debugOverlay : OverlayBase) -> bool end -extern enum LightmapShadingType : uint32 - IRRADIANCE = 0, - RADIANCE, - FULL, - SHADOW, - MAX +extern struct DebugDrawerConfig + Enabled : bool end -extern struct BakerConfig - NumSamples : uint32 - MaxTexelsPerFrame : uint32 - OnlyGenerateUVs : bool +extern enum AccelerationStructureType : uint8 + BOTTOM_LEVEL, + TOP_LEVEL end -extern class InputHandlerBase - OnKeyDown(evt : KeyboardEvent) -> bool - OnKeyUp(evt : KeyboardEvent) -> bool - OnMouseDown(evt : MouseEvent) -> bool - OnMouseUp(evt : MouseEvent) -> bool - OnMouseMove(evt : MouseEvent) -> bool - OnMouseDrag(evt : MouseEvent) -> bool - OnMouseLeave(evt : MouseEvent) -> bool - OnClick(evt : MouseEvent) -> bool - OnGainFocus(evt : MouseEvent) -> bool - OnLoseFocus(evt : MouseEvent) -> bool - OnKeyDown_Impl(evt : KeyboardEvent) -> bool - OnKeyUp_Impl(evt : KeyboardEvent) -> bool - OnMouseDown_Impl(evt : MouseEvent) -> bool - OnMouseUp_Impl(evt : MouseEvent) -> bool - OnMouseMove_Impl(evt : MouseEvent) -> bool - OnMouseDrag_Impl(evt : MouseEvent) -> bool - OnMouseLeave_Impl(evt : MouseEvent) -> bool - OnClick_Impl(evt : MouseEvent) -> bool - OnGainFocus_Impl(evt : MouseEvent) -> bool - OnLoseFocus_Impl(evt : MouseEvent) -> bool +extern class RigidBody end -extern class NullInputHandler : InputHandlerBase +extern class PhysicsWorldBase end -extern class CharacterControllerInputHandler : InputHandlerBase +extern struct PhysicsMaterial + Mass : float end extern enum MouseButtonKey : uint32 MBK_INVALID = ~0u, @@ -1223,24 +1243,6 @@ extern enum MouseButtonState : uint32 MIDDLE = 0x2, RIGHT = 0x4 end -extern class InputManager - IsMouseLocked() -> bool - PushMouseLockState(mouseLocked : bool, syncToVirtualPosition : bool) -> void - PopMouseLockState() -> void - GetMousePosition() -> Vec2i - GetVirtualMousePosition() -> Vec2i - GetPreviousVirtualMousePosition() -> Vec2i - GetWindowSize() -> Vec2i - IsKeyDown(key : KeyCode) -> bool - IsKeyUp(key : KeyCode) -> bool - IsShiftDown() -> bool - IsAltDown() -> bool - IsCtrlDown() -> bool - IsButtonDown(btn : MouseButtonKey) -> bool - GetButtonStates() -> MouseButtonState - IsButtonUp(btn : MouseButtonKey) -> bool - GetWindow() -> ApplicationWindow -end extern struct KeyboardEvent InputManager : InputManager KeyCode : KeyCode @@ -1316,6 +1318,30 @@ extern enum KeyCode : uint16 KEY_UP = 82, KEY_ESCAPE = 27 end +extern class InputManager + IsMouseLocked() -> bool + PushMouseLockState(mouseLocked : bool, syncToVirtualPosition : bool) -> void + PopMouseLockState() -> void + GetMousePosition() -> Vec2i + GetVirtualMousePosition() -> Vec2i + GetPreviousVirtualMousePosition() -> Vec2i + GetWindowSize() -> Vec2i + IsKeyDown(key : KeyCode) -> bool + IsKeyUp(key : KeyCode) -> bool + IsShiftDown() -> bool + IsAltDown() -> bool + IsCtrlDown() -> bool + IsButtonDown(btn : MouseButtonKey) -> bool + GetButtonStates() -> MouseButtonState + IsButtonUp(btn : MouseButtonKey) -> bool + GetWindow() -> ApplicationWindow +end +extern class InputHandlerBase +end +extern class NullInputHandler : InputHandlerBase +end +extern class CharacterControllerInputHandler : InputHandlerBase +end extern enum EventType : uint32 INVALID = ~0u, WINDOW_EVENT = 0x0200, @@ -1338,522 +1364,463 @@ extern enum EventFlags : uint8 NONE = 0x0, RELATIVE_MOUSE = 0x1 end -extern struct OctantId -end -extern struct AssetBucket -end -extern class AssetCollector - GetBasePath() -> string - SetBasePath(basePath : string) -> void - NotifyAssetChanged(path : string, changeType : AssetChangeType) -> void - IsWatching() -> bool - StartWatching() -> void - StopWatching() -> void - OnAssetChanged(path : string, changeType : AssetChangeType) -> void +extern class CommandletBase + static GetArgumentDefinitions() -> CommandLineArgumentDefinitions + Run(args : CommandLineArguments) -> Result + Run_Impl(args : CommandLineArguments) -> Result end -extern class AssetManager - static GetInstance() -> AssetManager - GetBasePath() -> string - SetBasePath(basePath : string) -> void - GetBaseAssetCollector() -> AssetCollector - AddAssetCollector(assetCollector : AssetCollector) -> void - RemoveAssetCollector(assetCollector : AssetCollector) -> void +extern enum GameStateMode : uint32 + STOPPED = 0, + SIMULATING, + PAUSED, + EDIT_MODE +end +extern struct GameState + Mode : GameStateMode + DeltaTime : float + GameTime : float + IsStopped() -> bool + IsSimulating() -> bool + IsPaused() -> bool + IsEditMode() -> bool +end +extern class Game GetAssetRegistry() -> AssetRegistry + SetAssetRegistry(assetRegistry : AssetRegistry) -> void + GetWorld() -> World + SetWorld(world : World) -> void + GetGameState() -> GameState + OnLaunch() -> void + OnUpdate(delta : float) -> void + Initialize() -> void + Shutdown() -> void + SetToEditMode() -> void + IsLaunched() -> bool + StartSimulating() -> void + StopSimulating() -> void + PauseSimulation() -> void + OnLaunched : any + OnGameStateChange : any + OnLaunch_Impl() -> void + OnUpdate_Impl(delta : float) -> void + World : World + GameState : GameState end -extern struct AssetLoaderDefinition +extern class EngineStats + static GetInstance() -> EngineStats + GetFps() -> double + GetMsPerFrame() -> double + QueryStatValue(path : string, valueIfNotFound : double) -> double end -extern enum AssetChangeType : uint32 - CHANGED = 0, - CREATED = 1, - DELETED = 2, - RENAMED = 3, - MAX +extern enum EnginePoolName : int + EPN_INVALID = -1, + EPN_CORE = 0, + EPN_RENDER, + EPN_SCENE, + EPN_MAX end -extern enum AddAssetConflictMode : uint8 - FailOnConflict = 0, - GenerateNewName, - ReplaceExisting, - Default +extern class EngineDriver + static GetInstance() -> EngineDriver + GetCurrentWorld() -> World + SetCurrentWorld(world : World) -> void + SetGameInstance(gameInstance : Game) -> void + GetGameInstance() -> Game end -extern struct AssetDesc - Name : Name - Index : uint32 +extern enum GpuType : uint8 + Unknown = 0, + Integrated, + Dedicated end -extern enum AssetObjectFlags : uint8 - None = 0x0, - Persistent = 0x1, - Transient = 0x2 +extern class DeviceDetails + GetGpuType() -> GpuType + GetGpuVendor() -> GpuVendor + GetGpuModel() -> string + GetGpuVendorName() -> string + GetDriverVersion() -> string + IsDiscreteGpu() -> bool + SupportsRayTracing() -> bool + SupportsRayQueries() -> bool + SupportsVariableRateShading() -> bool + SupportsSamplerFeedback() -> bool + SupportsBindless() -> bool end -extern enum AssetPackageFlags : uint32 - None = 0x0, - Transient = 0x1, - Hidden = 0x2, - SaveOnChanged = 0x4 +extern enum GpuVendor : uint8 + Unknown = 0, + Nvidia, + Amd, + Intel, + Qualcomm, + Apple, + Microsoft end -extern struct AssetPath - IsValid() -> bool - GetBucket() -> AssetBucket - GetName() -> Name - ToString() -> string +extern class EditorViewport + GetCamera() -> Camera + GetView() -> View + GetWindow() -> ApplicationWindow + CreateViewportWindow(options : WindowOptions) -> ApplicationWindow end -extern enum AssetRegistryId : uint32 - Game = 0, - Engine, - Editor +extern class EditorTaskBase + GetTitle() -> string + GetDescription() -> string + SetDescription(description : string) -> void + GetProgress() -> float + SetProgress(progress : float) -> void + IsCancellationRequested() -> bool + IsCommitted() -> bool + Start() -> void + Cancel() -> void + IsCompleted() -> bool + Commit() -> bool + OnComplete : any + OnCancel : any + OnDescriptionChange : any end -extern class AssetObject - GetName() -> Name - SetName(name : Name) -> void - Rename(name : Name) -> Result - MarkDirty() -> void - GetFriendlyName() -> Name - SetFriendlyName(friendlyName : Name) -> void - GetAssetIndex() -> uint32 - IsRegistered() -> bool - GetPath() -> AssetPath - GetAssetFlags() -> AssetObjectFlags - SetAssetFlags(flags : AssetObjectFlags) -> void - SetPersistentRequested(persistentlyLoaded : bool, setFlag : bool, markDirty : bool) -> void - IsTransient() -> bool - SetIsTransient(isTransient : bool) -> void - IsSaved() -> bool - Save() -> Result - SaveAs(manifestPath : string) -> Result - Name : Name - FriendlyName : Name - Flags : AssetObjectFlags - AssetIndex : uint32 - AssetPath : AssetPath +extern class TickableEditorTask : EditorTaskBase + IsForegroundTask() -> bool + SetIsForegroundTask(isForeground : bool) -> void + Start() -> void + Cancel() -> void + IsCompleted() -> bool + Commit() -> bool + Tick() -> void + Start_Impl() -> void + Cancel_Impl() -> void + IsCompleted_Impl() -> bool + Tick_Impl() -> void end -extern class Skeleton : AssetObject - GetRootBone() -> Bone - SetRootBone(bone : Bone) -> void - GetAnimation(index : uint32) -> Animation - RootBone : Bone - Animations : Array +extern class LongRunningEditorTask : EditorTaskBase + Start() -> void + Cancel() -> void + IsCompleted() -> bool + Process() -> void + Commit() -> bool + Start_Impl() -> void + Cancel_Impl() -> void + IsCompleted_Impl() -> bool + Process_Impl() -> void end -extern class Animation : AssetObject - GetLength() -> float - AddTrack(track : AnimationTrack) -> void - GetTracks() -> Array - SetTracks(tracks : Array) -> void - GetTrack(index : uint32) -> AnimationTrack - NumTracks() -> uint32 - Apply(skeleton : Skeleton, time : float) -> void - ApplyBlended(skeleton : Skeleton, time : float, blend : float) -> void - Tracks : Array +extern class EditorGizmoBase + GetNode() -> Node + IsDragging() -> bool + GetManipulationMode() -> EditorManipulationMode + GetPriority() -> int + GetMenuText() -> string end -extern class AnimationTrack : AssetObject - GetBoneName() -> Name - SetBoneName(boneName : Name) -> void - GetLength() -> float - GetKeyframe(time : float) -> Keyframe - BoneName : Name - KeyframeData : BlobDataReference +extern class NullEditorGizmo : EditorGizmoBase end -extern enum SceneFlags : uint32 - NONE = 0x0, - FOREGROUND = 0x1, - BACKDROP = 0x2, - DETACHED = 0x4, - UI = 0x8, - EDITOR = 0x10, - STREAMED = 0x20, - HAS_OCTREE = 0x40, - AUDIO_LISTENER = 0x80, - DEFAULT = ((FOREGROUND | STREAMED) | HAS_OCTREE) +extern class TranslateEditorGizmo : EditorGizmoBase end -extern class Scene : AssetObject - GetPrimaryCamera() -> Camera - GetSceneFlags() -> SceneFlags - SetSceneFlags(flags : SceneFlags) -> void - FindNodeByName(name : any) -> Node - GetRoot() -> Node - SetRoot(root : Node) -> void - GetEntityManager() -> EntityManager - IsAttachedToWorld() -> bool +extern class RotateEditorGizmo : EditorGizmoBase +end +extern class VolumeEditorGizmo : EditorGizmoBase +end +extern class GenerateLightmapsEditorTask : TickableEditorTask GetWorld() -> World SetWorld(world : World) -> void - IsForegroundScene() -> bool - IsBackgroundScene() -> bool - GetIsAudioListener() -> bool - SetIsAudioListener(isAudioListener : bool) -> void - GetStreamingCentroid() -> Vec2i - SetStreamingCenroid(streamingCentroid : Vec2i) -> void - AddToWorld(world : World) -> bool - RemoveFromWorld() -> bool - GetUniqueNodeName(baseName : string) -> Name - OnRootNodeChanged : any - SceneFlags : SceneFlags - Root : Node - OwnerThreadId : any - World : World - EntityManager : EntityManager - PreviousDelta : float - StreamingCentroid : Vec2i -end -extern class Node : AssetObject - HasName() -> bool - GetNodeFlags() -> NodeFlags - SetNodeFlags(flags : NodeFlags) -> void - GetParent() -> Node - IsOrHasParent(node : Node) -> bool - FindParentWithName(name : string) -> Node - IsRoot() -> bool GetScene() -> Scene SetScene(scene : Scene) -> void - GetWorld() -> World - GetLocalBounds() -> BoundingBox - SetLocalBounds(aabb : BoundingBox) -> void - AddChild(node : Node) -> Node - RemoveAt(index : uint32) -> bool - Remove() -> bool - RemoveAllChildren() -> void - NumChildren() -> uint32 - GetChild(index : uint32) -> Node - Select(selector : string) -> Node - SetLocalTransform(transform : Transform, changeType : TransformChangeType) -> void - GetLocalTransform() -> Transform - GetLocalTranslation() -> Vec3f - SetLocalTranslation(translation : Vec3f, changeType : TransformChangeType) -> void - Translate(translation : Vec3f) -> void - GetLocalScale() -> Vec3f - SetLocalScale(scale : Vec3f, changeType : TransformChangeType) -> void - Scale(scale : Vec3f) -> void - GetLocalRotation() -> Quat4f - SetLocalRotation(rotation : Quat4f, changeType : TransformChangeType) -> void - Rotate(rotation : Quat4f) -> void - GetWorldMatrix() -> Mat4f - GetWorldTranslation() -> Vec3f - SetWorldTranslation(translation : Vec3f, changeType : TransformChangeType) -> void - GetWorldScale() -> Vec3f - SetWorldScale(scale : Vec3f, changeType : TransformChangeType) -> void - GetWorldRotation() -> Quat4f - SetWorldRotation(rotation : Quat4f, changeType : TransformChangeType) -> void - IsTransformLocked() -> bool - GetLocalBoundsWithChildren() -> BoundingBox - GetWorldBounds() -> BoundingBox - UpdateWorldTransform(updateChildTransforms : bool) -> void - CalculateDepth() -> uint32 - FindSelfIndex() -> uint32 - FindChildByName(name : any) -> Node - MarkDirty() -> void - OnChildAdded : any - OnChildRemoved : any - NodeFlags : NodeFlags - ParentNode : Node - ChildNodes : any - LocalTransform : Transform - WorldMatrix : Mat4f - LocalBounds : BoundingBox - Scene : Scene - Tags : NodeTagSet -end -extern struct NodeTag - Name : Name - Data : any -end -extern struct NodeTagSet -end -extern enum TransformChangeType : uint8 - Default = 0, - Simulation = 1 -end -extern enum NodeFlags : uint32 - None = 0x0, - IgnoreParentTranslation = 0x1, - IgnoreParentScale = 0x2, - IgnoreParentRotation = 0x4, - IgnoreParentTransform = ((IgnoreParentTranslation | IgnoreParentScale) | IgnoreParentRotation), - ExcludeFromParentBounds = 0x8, - HideInSceneOutline = 0x1000, - Mobility = 0xE000, - MobilityStatic = 0x2000, - MobilityStaticByProxy = 0x4000, - MobilityDynamic = (Mobility & ~(MobilityStatic | MobilityStaticByProxy)), - Default = MobilityStatic + Start() -> void + Cancel() -> void + IsCompleted() -> bool + Tick() -> void end -extern class Bone : Node - Skeleton : Skeleton - BoneName : Name - BoneMatrix : Mat4f - Keyframe : Keyframe - BindingTransform : Transform - PoseTransform : Transform - WorldBoneTranslation : Vec3f - WorldBoneRotation : Quat4f - InvBindingRotation : Quat4f +extern enum EditorManipulationMode + NONE = 0, + TRANSLATE, + ROTATE, + SCALE, + VOLUME_EDIT end -extern class Entity : Node - GetEntityManager() -> EntityManager - ReceivesUpdate() -> bool - SetReceivesUpdate(receivesUpdate : bool) -> void +extern class EditorSubsystem : Subsystem + GetCurrentProject() -> EditorProject + GetActiveViewport() -> EditorViewport + SetActiveViewport(viewport : EditorViewport) -> void + AddViewport(viewport : EditorViewport) -> void + RemoveViewport(viewport : EditorViewport) -> void + GetEditorScene() -> Scene + ExecuteCommand(command : EditorCommandBase) -> bool + ExecuteCommandByName(name : Name, arguments : string) -> bool + NewProject() -> void + OpenProject(project : EditorProject) -> void + CloseProject() -> void + ShowImportContentDialog() -> void + SetFocusedNode(focusedNode : Node, shouldSelectInOutline : bool) -> void + GetFocusedNode() -> Node + GetActiveScene() -> Scene + SetActiveScene(scene : Scene) -> void + GetSelectedManipulationMode() -> EditorManipulationMode + SetSelectedManipulationMode(mode : EditorManipulationMode) -> void + GetSelectedGizmo() -> EditorGizmoBase + GetGizmo(mode : EditorManipulationMode) -> EditorGizmoBase + SetSelectedBucket(bucketIndex : uint32) -> void + CalculateSceneInsertionPoint(desiredDistance : float, offsetFromSurface : float) -> Vec3f + OnFocusedNodeChanged : any + OnProjectClosing : any + OnProjectOpened : any + OnActiveSceneChanged : any + OnSelectedGizmoChanged : any + OnSelectedBucketChanged : any + OnActiveViewportChanged : any + StartSimulation() -> void + StopSimulation() -> void + PauseSimulation() -> void end -extern class Camera : Entity - GetCameraFlags() -> CameraFlags - SetCameraFlags(flags : CameraFlags) -> void - SetWindow(window : ApplicationWindow) -> void - GetCameraControllers() -> Array - GetCameraController() -> CameraController - HasActiveCameraController() -> bool - AddCameraController(cameraController : CameraController, index : int) -> void - RemoveCameraController(cameraController : CameraController) -> bool - GetDimensions() -> Vec2i - SetDimensions(dimensions : Vec2i) -> void - GetNearClip() -> float - SetNearClip(_near : float) -> void - GetFarClip() -> float - SetFarClip(_far : float) -> void - GetFOV() -> float - SetFOV(fov : float) -> void - GetDirection() -> Vec3f - SetDirection(direction : Vec3f) -> void - GetUpVector() -> Vec3f - SetUpVector(up : Vec3f) -> void - GetOrthoRect() -> CameraOrthoRect - SetOrthoRect(orthoRect : CameraOrthoRect) -> void - GetSideVector() -> Vec3f - GetTarget() -> Vec3f - SetTarget(target : Vec3f) -> void - Rotate(axis : Vec3f, radians : float) -> void - GetFrustum() -> Frustum - SetFrustum(frustum : Frustum) -> void - GetViewMatrix() -> Mat4f - SetViewMatrix(viewMat : Mat4f) -> void - GetProjectionMatrix() -> Mat4f - SetProjectionMatrix(projMat : Mat4f) -> void - GetViewProjectionMatrix() -> Mat4f - SetViewProjectionMatrix(viewMat : Mat4f, projMat : Mat4f) -> void - GetPreviousViewProjectionMatrix() -> Mat4f - TransformScreenToNDC(screen : Vec2f) -> Vec3f - TransformNDCToWorld(ndc : Vec3f) -> Vec4f - TransformWorldToNDC(world : Vec3f) -> Vec3f - TransformWorldToScreen(world : Vec3f) -> Vec2f - TransformNDCToScreen(ndc : Vec3f) -> Vec2f - TransformScreenToWorld(screen : Vec2f) -> Vec4f - GetPixelSize() -> Vec2f - MatchWindowSizeRatio : float - CameraControllers : Array - Fov : float - OrthoRect : CameraOrthoRect - SetCameraControllers(cameraControllers : Array) -> void +extern class EditorState + static GetInstance() -> EditorState + GetCurrentProject() -> EditorProject + SetCurrentProject(project : EditorProject) -> void + AddTask(task : EditorTaskBase) -> void + OnCurrentProjectChanged : any + OnTaskStarted : any + OnTaskEnded : any + OnTaskProgressUpdated : any end -extern class CameraController - GetInputHandler() -> InputHandlerBase - SetInputHandler(inputHandler : InputHandlerBase) -> void - GetCamera() -> Camera - GetProjectionMode() -> CameraProjectionMode - IsMouseLockAllowed() -> bool - IsMouseLockRequested() -> bool - SetTranslation(translation : Vec3f) -> void - SetNextTranslation(translation : Vec3f) -> void - SetDirection(direction : Vec3f) -> void - SetUpVector(up : Vec3f) -> void - Camera : Camera - InputHandler : InputHandlerBase - ProjectionMode : CameraProjectionMode +extern class EditorProject + GetName() -> Name + SetName(name : Name) -> void + GetWorld() -> World + GetGame() -> Game + SetGame(gameInstance : Game) -> void + GetLastSavedTime() -> Time + GetFilePath() -> string + AddScene(scene : Scene) -> void + RemoveScene(scene : Scene) -> void + GetProjectsDirectory() -> string + IsSaved() -> bool + Save() -> Result + SaveAs(filepath : string) -> Result + GetActionStack() -> EditorActionStack + Close() -> void + OnProjectSaved : any + Name : Name + LastSavedTime : Time + Filepath : string + GameInstance : Game + ActionStack : EditorActionStack end -extern class NullCameraController : CameraController +extern class EditorCommandBase + GetText() -> string + GetArguments() -> Array + SetArguments(args : Array) -> void + NumArguments() -> int + GetArgument(index : int) -> string end -extern enum CameraFlags : uint32 +extern enum EditorActionStackState : uint32 NONE = 0x0, - MATCH_WINDOW_SIZE = 0x1 -end -extern struct CameraOrthoRect - Left : float - Right : float - Bottom : float - Top : float -end -extern enum CameraProjectionMode : uint32 - NONE = 0, - PERSPECTIVE = 1, - ORTHOGRAPHIC = 2 -end -extern class OrthoCameraController : CameraController -end -extern class UICameraController : OrthoCameraController + CAN_UNDO = 0x1, + CAN_REDO = 0x2 end -extern class PerspectiveCameraController : CameraController +extern class EditorActionStack + PushAction(action : EditorActionBase) -> bool + CanUndo() -> bool + CanRedo() -> bool + Undo() -> void + Redo() -> void + GetUndoAction() -> EditorActionBase + GetRedoAction() -> EditorActionBase + OnBeforeActionPush : any + OnBeforeActionPop : any + OnAfterActionPush : any + OnAfterActionPop : any + OnStateChange : any end -extern class FollowCameraController : PerspectiveCameraController +extern class EditorActionBase + GetText() -> string + Execute(editorSubsystem : EditorSubsystem, project : EditorProject) -> void + Revert(editorSubsystem : EditorSubsystem, project : EditorProject) -> void end -extern class FirstPersonCameraController : PerspectiveCameraController - GetMode() -> FirstPersonCameraControllerMode - SetMode(mode : FirstPersonCameraControllerMode) -> void - IsMouseLockAllowed() -> bool +extern class FunctionalEditorAction : EditorActionBase + GetText() -> string + Execute(editorSubsystem : EditorSubsystem, project : EditorProject) -> void + Revert(editorSubsystem : EditorSubsystem, project : EditorProject) -> void end -extern enum FirstPersonCameraControllerMode : uint32 - MOUSE_LOCKED = 0, - MOUSE_FREE = 1 +extern class BakerBase end -extern class FirstPersonCameraInputHandler : InputHandlerBase +extern enum LightmapShadingType : uint32 + IRRADIANCE = 0, + RADIANCE, + FULL, + SHADOW, + MAX end -extern class EditorCameraController : FirstPersonCameraController +extern struct BakerConfig + NumSamples : uint32 + MaxTexelsPerFrame : uint32 + OnlyGenerateUVs : bool end -extern enum EditorCameraControllerMode : uint32 - INACTIVE = 0, - FOCUSED = 1, - MOUSE_LOCKED = 2 +extern enum AudioSourceState : uint32 + UNDEFINED, + STOPPED, + PLAYING, + PAUSED end -extern class EditorCameraInputHandler : InputHandlerBase +extern enum AudioSourceFormat : uint32 + MONO8, + MONO16, + STEREO8, + STEREO16 end -extern class CameraTrackController : PerspectiveCameraController +extern class AudioSource + GetFormat() -> AudioSourceFormat + SetFormat(format : AudioSourceFormat) -> void + GetFreq() -> uint64 + SetFreq(freq : uint64) -> void + GetData() -> ByteBuffer + SetData(data : ByteBuffer) -> void + GetSampleLength() -> uint32 + SetSampleLength(sampleLength : uint32) -> void + GetDuration() -> double + SetDuration(duration : double) -> void end -extern class EnvGrid : Entity +extern class AudioManager end -extern class Light : Entity - GetLightType() -> LightType - GetLightFlags() -> LightFlags - SetLightFlags(flags : LightFlags) -> void - GetNormal() -> Vec3f - SetNormal(normal : Vec3f) -> void - GetAreaSize() -> Vec2f - SetAreaSize(areaSize : Vec2f) -> void - GetColor() -> Color - SetColor(color : Color) -> void - GetIntensity() -> float - SetIntensity(intensity : float) -> void - GetRadius() -> float - SetRadius(radius : float) -> void - GetFalloff() -> float - SetFalloff(falloff : float) -> void - GetSpotAngles() -> Vec2f - SetSpotAngles(spotAngles : Vec2f) -> void - GetMaterial() -> MaterialInstance - SetMaterial(material : MaterialInstance) -> void - GetShadowMapDimensions() -> Vec2u - SetShadowMapDimensions(shadowMapDimensions : Vec2u) -> void - GetNumShadowMapCascades() -> uint32 - SetNumShadowMapCascades(numShadowMapCascades : uint32) -> void - GetBakedShadowMap() -> Texture - SetBakedShadowMap(shadowMap : Texture) -> void - GetShadowMapFilter() -> ShadowMapFilter - SetShadowMapFilter(shadowMapFilter : ShadowMapFilter) -> void - BakeStaticShadows() -> void - RemoveBakedShadows() -> void - CanBakeStaticShadows() -> bool - Type : LightType - LightFlags : LightFlags - ShadowMapDimensions : Vec2u - NumShadowMapCascades : uint32 +extern struct BlobDataReference + Key : Name + Size : uint64 + Raw : any + ReadOnly : bool end -extern class PointLight : Light +extern class BlobStorage + BaseDirectory : string + PageSize : uint64 + FreeRanges : Array + PageData : Array end -extern class SpotLight : Light +extern struct BlobPageData + Cursor : uint64 end -extern class AreaRectLight : Light +extern struct BlobMappingRange + Start : uint32 + End : uint32 end -extern class DirectionalLight : Light - GetDirection() -> Vec3f - SetDirection(direction : Vec3f) -> void +extern enum AddAssetConflictMode : uint8 + FailOnConflict = 0, + GenerateNewName, + ReplaceExisting, + Default end -extern enum LightType : uint32 - Directional = 0, - Point, - Spot, - AreaRect, - Max +extern struct AssetDesc + Name : Name + Index : uint32 end -extern enum LightFlags : uint32 +extern enum AssetObjectFlags : uint8 None = 0x0, - ShadowCaster = 0x1, - ShadowPCF = 0x2, - ShadowContactHardening = 0x4, - ShadowVariance = 0x8, - ShadowFilterMask = ((ShadowPCF | ShadowContactHardening) | ShadowVariance), - CacheStaticShadowMaps = 0x10, - BakeStaticShadows = 0x20, - Default = (ShadowCaster | ShadowPCF) + Persistent = 0x1, + Transient = 0x2 end -extern class Sprite : Entity +extern enum AssetPackageFlags : uint32 + None = 0x0, + Transient = 0x1, + Hidden = 0x2, + SaveOnChanged = 0x4 end -extern enum SpriteType : uint32 - None = 0, - Point2D, - Spot3D, - Crosshair, - EnvProbe, - LightmapVolume, - Camera, - Text, - Max +extern class AssetCollector + GetBasePath() -> string + SetBasePath(basePath : string) -> void + NotifyAssetChanged(path : string, changeType : AssetChangeType) -> void + IsWatching() -> bool + StartWatching() -> void + StopWatching() -> void + OnAssetChanged(path : string, changeType : AssetChangeType) -> void end -extern class TextSprite : Sprite +extern class AssetManager + static GetInstance() -> AssetManager + GetBasePath() -> string + SetBasePath(basePath : string) -> void + GetBaseAssetCollector() -> AssetCollector + AddAssetCollector(assetCollector : AssetCollector) -> void + RemoveAssetCollector(assetCollector : AssetCollector) -> void + GetAssetRegistry() -> AssetRegistry end -extern class VolumeBase : Entity +extern struct AssetLoaderDefinition end -extern struct ParticleVolumeParams - Texture : Texture - MaxParticles : uint32 - Origin : Vec3f - StartSize : float - Radius : float - Randomness : float - Lifespan : float - HasPhysics : bool +extern enum AssetChangeType : uint32 + CHANGED = 0, + CREATED = 1, + DELETED = 2, + RENAMED = 3, + MAX end -extern class ParticleVolume : VolumeBase - GetParams() -> ParticleVolumeParams - SetParams(newParams : ParticleVolumeParams) -> void - Params : ParticleVolumeParams +extern class AssetRegistry + GetRootPath() -> string + SetRootPath(rootPath : string) -> void end -extern class FogVolume : VolumeBase - GetVolumeTexture() -> Texture - SetTextures(volumeTexture : Texture, noiseTexture : Texture) -> void - Rebake() -> void - VolumeTexture : Texture - NoiseTexture : Texture +extern struct AssetReference + GetAssetPath() -> AssetPath + SetAssetPath(assetPath : AssetPath) -> void end -extern class LightmapVolume : VolumeBase - Rebake() -> void - RadianceAtlasTextures : Array - IrradianceAtlasTextures : Array - Atlases : Array +extern struct AssetPath + IsValid() -> bool + GetBucket() -> AssetBucket + GetName() -> Name + ToString() -> string end -extern struct LightmapVolumeAtlas +extern enum AssetRegistryId : uint32 + Game = 0, + Engine, + Editor end -extern struct EnvProbeSphericalHarmonics +extern class AssetObject + GetName() -> Name + SetName(name : Name) -> void + Rename(name : Name) -> Result + MarkDirty() -> void + GetFriendlyName() -> Name + SetFriendlyName(friendlyName : Name) -> void + GetAssetIndex() -> uint32 + IsRegistered() -> bool + GetPath() -> AssetPath + GetAssetFlags() -> AssetObjectFlags + SetAssetFlags(flags : AssetObjectFlags) -> void + SetPersistentRequested(persistentlyLoaded : bool, setFlag : bool, markDirty : bool) -> void + IsTransient() -> bool + SetIsTransient(isTransient : bool) -> void + IsSaved() -> bool + Save() -> Result + SaveAs(manifestPath : string) -> Result + Name : Name + FriendlyName : Name + Flags : AssetObjectFlags + AssetIndex : uint32 + AssetPath : AssetPath end -extern class EnvProbe : VolumeBase - GetEnvProbeType() -> EnvProbeType - GetEnvProbeFlags() -> EnvProbeFlags - SetEnvProbeFlags(envProbeFlags : EnvProbeFlags) -> void - IsReflectionProbe() -> bool - IsSkyProbe() -> bool - IsAmbientProbe() -> bool - IsBaked() -> bool - SetIsBaked(isBaked : bool) -> void - IsRealtime() -> bool - GetOrigin() -> Vec3f - SetOrigin(origin : Vec3f) -> void - GetCamera() -> Camera - GetBakedTexture() -> Texture - SetBakedTexture(texture : Texture) -> void - Dimensions : Vec2u - EnvProbeType : EnvProbeType - EnvProbeFlags : EnvProbeFlags - ShData : EnvProbeSphericalHarmonics +extern struct FontAtlasTextureSet + MainAtlas : Texture + Atlases : Array end -extern class SkyProbe : EnvProbe - GetSkyboxCubemap() -> Texture +extern class FontAtlas : AssetObject + AtlasTextures : FontAtlasTextureSet + CellDimensions : Vec2i + GlyphMetrics : Array + SymbolList : Array end -extern class ReflectionProbe : EnvProbe - BakeCubemap() -> void +extern class ScriptAsset : AssetObject end -extern enum EnvProbeType : uint32 - EPT_INVALID = ~0u, - EPT_SKY = 0, - EPT_REFLECTION, - EPT_AMBIENT, - EPT_MAX +extern class Skeleton : AssetObject + GetRootBone() -> Bone + SetRootBone(bone : Bone) -> void + GetAnimation(index : uint32) -> Animation + RootBone : Bone + Animations : Array end -extern enum EnvProbeFlags : uint32 - EPF_NONE = 0x0, - EPF_PARALLAX_CORRECTED = 0x1, - EPF_BAKED = 0x2 +extern class Animation : AssetObject + GetLength() -> float + AddTrack(track : AnimationTrack) -> void + GetTracks() -> Array + SetTracks(tracks : Array) -> void + GetTrack(index : uint32) -> AnimationTrack + NumTracks() -> uint32 + Apply(skeleton : Skeleton, time : float) -> void + ApplyBlended(skeleton : Skeleton, time : float, blend : float) -> void + Tracks : Array end -extern class InstancedMeshProxy : Node +extern class AnimationTrack : AssetObject + GetBoneName() -> Name + SetBoneName(boneName : Name) -> void + GetLength() -> float + GetKeyframe(time : float) -> Keyframe + BoneName : Name + KeyframeData : BlobDataReference end extern struct CSMState PlayerCenter : Vec3f @@ -1872,608 +1839,619 @@ extern enum WorldFlags : uint32 ALL_STREAMING_LAYER_FLAGS = HAS_SCENE_STREAMING_LAYER, DEFAULT = ((HAS_PHYSICS | HAS_STREAMING) | ALL_STREAMING_LAYER_FLAGS) end -extern struct CSMParams - NumCascades : uint32 -end -extern class World : AssetObject - GetGame() -> Game - GetWorldFlags() -> WorldFlags - SetWorldFlags(flags : WorldFlags) -> void - GetFogParams() -> FogParams - SetFogParams(fogParams : FogParams) -> void - GetCSMParams() -> CSMParams - SetCSMParams(csmParams : CSMParams) -> void - GetCSMState() -> CSMState - SetCSMState(csmState : CSMState) -> void - GetPhysicsWorld() -> PhysicsWorldBase - TryAddSubsystem(subsystem : Subsystem) -> bool - GetSubsystemByName(name : any) -> Subsystem - RemoveSubsystem(subsystem : Subsystem) -> bool - GetWorldGrid() -> WorldGrid - GetGameState() -> GameState - AddScene(scene : Scene, addToStreamingLayer : bool) -> void - RemoveScene(scene : Scene, removeFromStreamingLayer : bool) -> bool - HasScene(sceneId : any) -> bool - GetSceneByName(nameHash : any) -> Scene - GetScenes() -> Array - AddView(view : View) -> void - RemoveView(view : View) -> void - AddSystem(system : SystemBase) -> SystemBase - RemoveSystem(system : SystemBase) -> bool - OnSceneAdded : any - OnSceneRemoved : any - DeserializeNonStreamingScenes(scenes : Array) -> void - SerializeNonStreamingScenes() -> Array - DeserializeStreamingLayers(streamingLayers : Array) -> void - SerializeStreamingLayers() -> Array - DeserializeSystems(systems : Array) -> void - SerializeSystems() -> Array - GameInstance : Game - WorldFlags : WorldFlags - Scenes : Array - FogParams : FogParams - CsmParams : CSMParams - CsmState : CSMState - Systems : Array -end -extern class PhysicsShape : AssetObject -end -extern class PlanePhysicsShape : PhysicsShape - Plane : Vec4f -end -extern class BoxPhysicsShape : PhysicsShape - Aabb : BoundingBox -end -extern class ConvexHullPhysicsShape : PhysicsShape -end -extern class SpherePhysicsShape : PhysicsShape - Sphere : BoundingSphere -end -extern class CapsulePhysicsShape : PhysicsShape - Radius : float - Height : float -end -extern enum PhysicsShapeType : uint8 - BOX, - SPHERE, - PLANE, - CONVEX_HULL, - CAPSULE -end -extern struct ShaderInputGroup - Elements : Array -end -extern enum ProcessShaderSourcePhase : uint32 - BEFORE_PREPROCESS, - AFTER_PREPROCESS -end -extern struct ShaderInput - Slot : ShaderRegister - Type : ShaderInputType - Name : Name - Count : uint32 - Size : uint32 - IsDynamic : bool - StructInfo : ShaderStruct - Category : ShaderResourceCategory - Index : uint32 -end -extern enum ShaderInputSetFlags : uint8 - None = 0x0, - Reference = 0x1, - Template = 0x2 -end -extern struct ShaderInputSet - SetIndex : uint32 - Name : Name - Slots : Array> - Flags : ShaderInputSetFlags +extern struct CSMParams + NumCascades : uint32 end -extern enum ShaderLanguage : uint32 - GLSL, - HLSL +extern class World : AssetObject + GetGame() -> Game + GetWorldFlags() -> WorldFlags + SetWorldFlags(flags : WorldFlags) -> void + GetFogParams() -> FogParams + SetFogParams(fogParams : FogParams) -> void + GetCSMParams() -> CSMParams + SetCSMParams(csmParams : CSMParams) -> void + GetCSMState() -> CSMState + SetCSMState(csmState : CSMState) -> void + GetPhysicsWorld() -> PhysicsWorldBase + TryAddSubsystem(subsystem : Subsystem) -> bool + GetSubsystemByName(name : any) -> Subsystem + RemoveSubsystem(subsystem : Subsystem) -> bool + GetWorldGrid() -> WorldGrid + GetGameState() -> GameState + AddScene(scene : Scene, addToStreamingLayer : bool) -> void + RemoveScene(scene : Scene, removeFromStreamingLayer : bool) -> bool + HasScene(sceneId : any) -> bool + GetSceneByName(nameHash : any) -> Scene + GetScenes() -> Array + AddView(view : View) -> void + RemoveView(view : View) -> void + AddSystem(system : SystemBase) -> SystemBase + RemoveSystem(system : SystemBase) -> bool + OnSceneAdded : any + OnSceneRemoved : any + DeserializeNonStreamingScenes(scenes : Array) -> void + SerializeNonStreamingScenes() -> Array + DeserializeStreamingLayers(streamingLayers : Array) -> void + SerializeStreamingLayers() -> Array + DeserializeSystems(systems : Array) -> void + SerializeSystems() -> Array + GameInstance : Game + WorldFlags : WorldFlags + Scenes : Array + FogParams : FogParams + CsmParams : CSMParams + CsmState : CSMState + Systems : Array end -extern struct ShaderStruct - Name : Name - Size : uint32 - FieldNames : Array - FieldTypes : Array +extern enum SceneFlags : uint32 + NONE = 0x0, + FOREGROUND = 0x1, + BACKDROP = 0x2, + DETACHED = 0x4, + UI = 0x8, + EDITOR = 0x10, + STREAMED = 0x20, + HAS_OCTREE = 0x40, + AUDIO_LISTENER = 0x80, + DEFAULT = ((FOREGROUND | STREAMED) | HAS_OCTREE) end -extern enum ShaderRegister : uint8 - NONE = 0, - SRV, - UAV, - BUFFER, - SAMPLER, - MAX +extern class Scene : AssetObject + GetPrimaryCamera() -> Camera + GetSceneFlags() -> SceneFlags + SetSceneFlags(flags : SceneFlags) -> void + FindNodeByName(name : any) -> Node + GetRoot() -> Node + SetRoot(root : Node) -> void + GetEntityManager() -> EntityManager + IsAttachedToWorld() -> bool + GetWorld() -> World + SetWorld(world : World) -> void + IsForegroundScene() -> bool + IsBackgroundScene() -> bool + GetIsAudioListener() -> bool + SetIsAudioListener(isAudioListener : bool) -> void + GetStreamingCentroid() -> Vec2i + SetStreamingCenroid(streamingCentroid : Vec2i) -> void + AddToWorld(world : World) -> bool + RemoveFromWorld() -> bool + GetUniqueNodeName(baseName : string) -> Name + OnRootNodeChanged : any + SceneFlags : SceneFlags + Root : Node + OwnerThreadId : any + World : World + EntityManager : EntityManager + PreviousDelta : float + StreamingCentroid : Vec2i end -extern class ShaderBundle : AssetObject - CompiledShaders : Array - ErrorMessages : Array +extern class Node : AssetObject + HasName() -> bool + GetNodeFlags() -> NodeFlags + SetNodeFlags(flags : NodeFlags) -> void + GetParent() -> Node + IsOrHasParent(node : Node) -> bool + FindParentWithName(name : string) -> Node + IsRoot() -> bool + GetScene() -> Scene + SetScene(scene : Scene) -> void + GetWorld() -> World + GetLocalBounds() -> BoundingBox + SetLocalBounds(aabb : BoundingBox) -> void + AddChild(node : Node) -> Node + RemoveAt(index : uint32) -> bool + Remove() -> bool + RemoveAllChildren() -> void + NumChildren() -> uint32 + GetChild(index : uint32) -> Node + Select(selector : string) -> Node + SetLocalTransform(transform : Transform, changeType : TransformChangeType) -> void + GetLocalTransform() -> Transform + GetLocalTranslation() -> Vec3f + SetLocalTranslation(translation : Vec3f, changeType : TransformChangeType) -> void + Translate(translation : Vec3f) -> void + GetLocalScale() -> Vec3f + SetLocalScale(scale : Vec3f, changeType : TransformChangeType) -> void + Scale(scale : Vec3f) -> void + GetLocalRotation() -> Quat4f + SetLocalRotation(rotation : Quat4f, changeType : TransformChangeType) -> void + Rotate(rotation : Quat4f) -> void + GetWorldMatrix() -> Mat4f + GetWorldTranslation() -> Vec3f + SetWorldTranslation(translation : Vec3f, changeType : TransformChangeType) -> void + GetWorldScale() -> Vec3f + SetWorldScale(scale : Vec3f, changeType : TransformChangeType) -> void + GetWorldRotation() -> Quat4f + SetWorldRotation(rotation : Quat4f, changeType : TransformChangeType) -> void + IsTransformLocked() -> bool + GetLocalBoundsWithChildren() -> BoundingBox + GetWorldBounds() -> BoundingBox + UpdateWorldTransform(updateChildTransforms : bool) -> void + CalculateDepth() -> uint32 + FindSelfIndex() -> uint32 + FindChildByName(name : any) -> Node + MarkDirty() -> void + OnChildAdded : any + OnChildRemoved : any + NodeFlags : NodeFlags + ParentNode : Node + ChildNodes : any + LocalTransform : Transform + WorldMatrix : Mat4f + LocalBounds : BoundingBox + Scene : Scene + Tags : NodeTagSet end -extern enum MeshFlags : uint32 - None = 0x0, - ViewIndependent = 0x1 +extern struct NodeTag + Name : Name + Data : any end -extern struct MeshDesc - MeshAttributes : MeshAttributes - NumVertices : uint32 - NumIndices : uint32 +extern struct NodeTagSet end -extern class Mesh : AssetObject - GetFlags() -> MeshFlags - SetFlags(flags : MeshFlags) -> void - Rename(name : Name) -> Result - NumIndices() -> uint32 - GetAABB() -> BoundingBox - SetAABB(aabb : BoundingBox) -> void - MeshDesc : MeshDesc - VertexData : BlobDataReference - IndexData : BlobDataReference - BvhData : BlobDataReference - Aabb : BoundingBox - Bvh : BVHNode - Flags : MeshFlags +extern enum TransformChangeType : uint8 + Default = 0, + Simulation = 1 end -extern class Shader : AssetObject - BaseName : Name - InputLayout : VertexInputLayoutDesc - InputGroup : ShaderInputGroup - ModuleTypes : Array - ModuleNames : Array - EntryPointNames : Array - ShaderBlobs : Array - PropertySetHashCode : HashCode - LastCompiledTimestamp : Time - Properties : ShaderPropertySet - SerializeProperties() -> Array - DeserializeProperties(properties : Array) -> void +extern enum NodeFlags : uint32 + None = 0x0, + IgnoreParentTranslation = 0x1, + IgnoreParentScale = 0x2, + IgnoreParentRotation = 0x4, + IgnoreParentTransform = ((IgnoreParentTranslation | IgnoreParentScale) | IgnoreParentRotation), + ExcludeFromParentBounds = 0x8, + HideInSceneOutline = 0x1000, + Mobility = 0xE000, + MobilityStatic = 0x2000, + MobilityStaticByProxy = 0x4000, + MobilityDynamic = (Mobility & ~(MobilityStatic | MobilityStaticByProxy)), + Default = MobilityStatic end -extern class Texture : AssetObject - Rename(name : Name) -> Result - TextureDesc : TextureDesc - ImageData : BlobDataReference - GpuImage : any +extern class Bone : Node + Skeleton : Skeleton + BoneName : Name + BoneMatrix : Mat4f + Keyframe : Keyframe + BindingTransform : Transform + PoseTransform : Transform + WorldBoneTranslation : Vec3f + WorldBoneRotation : Quat4f + InvBindingRotation : Quat4f end -extern class MaterialInstance : AssetObject - IsStatic() -> bool - GetIsDynamic() -> bool - SetIsDynamic(isDynamic : bool) -> void - Clone() -> MaterialInstance - Definition : MaterialDefinition - Parameters : MaterialParameters - Textures : MaterialTextures - IsDynamic : bool +extern class InstancedMeshProxy : Node end -extern class InstancedMeshData : AssetObject - Buffers : Array - BufferStructSizes : Array - BufferStructAlignments : Array +extern class Entity : Node + GetEntityManager() -> EntityManager + ReceivesUpdate() -> bool + SetReceivesUpdate(receivesUpdate : bool) -> void end -extern class MaterialDefinition : AssetObject - Attributes : MaterialAttributes - DefaultParameters : MaterialParameters - DefaultTextures : MaterialTextures +extern class Camera : Entity + GetCameraFlags() -> CameraFlags + SetCameraFlags(flags : CameraFlags) -> void + GetCameraControllers() -> Array + GetCameraController() -> CameraController + HasActiveCameraController() -> bool + AddCameraController(cameraController : CameraController, index : int) -> void + RemoveCameraController(cameraController : CameraController) -> bool + GetDimensions() -> Vec2i + SetDimensions(dimensions : Vec2i) -> void + GetNearClip() -> float + SetNearClip(_near : float) -> void + GetFarClip() -> float + SetFarClip(_far : float) -> void + GetFOV() -> float + SetFOV(fov : float) -> void + GetDirection() -> Vec3f + SetDirection(direction : Vec3f) -> void + GetUpVector() -> Vec3f + SetUpVector(up : Vec3f) -> void + GetOrthoRect() -> CameraOrthoRect + SetOrthoRect(orthoRect : CameraOrthoRect) -> void + GetSideVector() -> Vec3f + GetTarget() -> Vec3f + SetTarget(target : Vec3f) -> void + Rotate(axis : Vec3f, radians : float) -> void + GetFrustum() -> Frustum + SetFrustum(frustum : Frustum) -> void + GetViewMatrix() -> Mat4f + SetViewMatrix(viewMat : Mat4f) -> void + GetProjectionMatrix() -> Mat4f + SetProjectionMatrix(projMat : Mat4f) -> void + GetViewProjectionMatrix() -> Mat4f + SetViewProjectionMatrix(viewMat : Mat4f, projMat : Mat4f) -> void + GetPreviousViewProjectionMatrix() -> Mat4f + TransformScreenToNDC(screen : Vec2f) -> Vec3f + TransformNDCToWorld(ndc : Vec3f) -> Vec4f + TransformWorldToNDC(world : Vec3f) -> Vec3f + TransformWorldToScreen(world : Vec3f) -> Vec2f + TransformNDCToScreen(ndc : Vec3f) -> Vec2f + TransformScreenToWorld(screen : Vec2f) -> Vec4f + GetPixelSize() -> Vec2f + MatchWindowSizeRatio : float + CameraControllers : Array + Fov : float + OrthoRect : CameraOrthoRect + SetCameraControllers(cameraControllers : Array) -> void end -extern class ScriptAsset : AssetObject +extern class CameraController + GetInputHandler() -> InputHandlerBase + SetInputHandler(inputHandler : InputHandlerBase) -> void + GetCamera() -> Camera + GetProjectionMode() -> CameraProjectionMode + IsMouseLockAllowed() -> bool + IsMouseLockRequested() -> bool + SetTranslation(translation : Vec3f) -> void + SetNextTranslation(translation : Vec3f) -> void + SetDirection(direction : Vec3f) -> void + SetUpVector(up : Vec3f) -> void + Camera : Camera + InputHandler : InputHandlerBase + ProjectionMode : CameraProjectionMode end -extern struct FontAtlasTextureSet - MainAtlas : Texture - Atlases : Array +extern class NullCameraController : CameraController end -extern class FontAtlas : AssetObject - AtlasTextures : FontAtlasTextureSet - CellDimensions : Vec2i - GlyphMetrics : Array - SymbolList : Array +extern enum CameraFlags : uint32 + NONE = 0x0, + MATCH_WINDOW_SIZE = 0x1 end -extern struct AssetReference - GetAssetPath() -> AssetPath - SetAssetPath(assetPath : AssetPath) -> void +extern struct CameraOrthoRect + Left : float + Right : float + Bottom : float + Top : float end -extern class AssetRegistry - GetRootPath() -> string - SetRootPath(rootPath : string) -> void +extern enum CameraProjectionMode : uint32 + NONE = 0, + PERSPECTIVE = 1, + ORTHOGRAPHIC = 2 end -extern struct BlobDataReference - Key : Name - Size : uint64 - Raw : any - ReadOnly : bool +extern class PerspectiveCameraController : CameraController end -extern class BlobStorage - BaseDirectory : string - PageSize : uint64 - FreeRanges : Array - PageData : Array +extern class FollowCameraController : PerspectiveCameraController end -extern struct BlobPageData - Cursor : uint64 +extern class FirstPersonCameraController : PerspectiveCameraController + GetMode() -> FirstPersonCameraControllerMode + SetMode(mode : FirstPersonCameraControllerMode) -> void + IsMouseLockAllowed() -> bool end -extern struct BlobMappingRange - Start : uint32 - End : uint32 +extern enum FirstPersonCameraControllerMode : uint32 + MOUSE_LOCKED = 0, + MOUSE_FREE = 1 end -extern class AssetLoaderBase +extern class FirstPersonCameraInputHandler : InputHandlerBase end -extern struct ScriptDesc - Uuid : UUID - Language : ScriptLanguage - Path : Array - AssemblyPath : Array - ClassName : Array - CompileStatus : uint32 - HotReloadVersion : int32 - LastModifiedTimestamp : uint64 +extern class EditorCameraController : FirstPersonCameraController end -extern struct PropertyHandle +extern enum EditorCameraControllerMode : uint32 + INACTIVE = 0, + FOCUSED = 1, + MOUSE_LOCKED = 2 end -extern struct FieldHandle +extern class EditorCameraInputHandler : InputHandlerBase end -extern struct MethodHandle +extern class CameraTrackController : PerspectiveCameraController end -extern class Reflection - static GetClassByName(name : Name) -> Class - static GetFields(classRef : Class) -> Array - static GetFieldHandle(classRef : Class, fieldName : Name) -> FieldHandle - static GetFieldValue(field : FieldHandle, target : any) -> any - static SetFieldValue(field : FieldHandle, target : any, value : any) -> void - static GetFieldName(field : FieldHandle) -> Name - static GetMethods(classRef : Class) -> Array - static GetMethodHandle(classRef : Class, methodName : Name) -> MethodHandle - static InvokeMethod(method : MethodHandle, args : Array) -> any - static GetMethodName(method : MethodHandle) -> Name - static GetProperties(classRef : Class) -> Array - static GetPropertyHandle(classRef : Class, propertyName : Name) -> PropertyHandle - static GetPropertyValue(property : PropertyHandle, target : any) -> any - static SetPropertyValue(property : PropertyHandle, target : any, value : any) -> void - static GetPropertyName(property : PropertyHandle) -> Name +extern class OrthoCameraController : CameraController end -extern class Debugger - static Breakpoint() -> void - static AssertTrue(condition : bool) -> void - static AssertFalse(condition : bool) -> void +extern class UICameraController : OrthoCameraController end -extern enum ScriptLanguage : uint32 - Invalid = ~0u, - Native = 0, - HypScript = 1, - CSharp = 2 +extern class VolumeBase : Entity end -extern enum ScriptCompileStatus : uint32 - Uninitialized = 0x0, - Compiled = 0x1, - Dirty = 0x2, - Processing = 0x4, - Errored = 0x8 +extern struct ParticleVolumeParams + Texture : Texture + MaxParticles : uint32 + Origin : Vec3f + StartSize : float + Radius : float + Randomness : float + Lifespan : float + HasPhysics : bool end -extern struct GlyphMetrics - Width : uint16 - Height : uint16 - BearingX : int16 - BearingY : int16 - Advance : uint32 - ImagePosition : Vec2i +extern class ParticleVolume : VolumeBase + GetParams() -> ParticleVolumeParams + SetParams(newParams : ParticleVolumeParams) -> void + Params : ParticleVolumeParams end -extern class OverlayBase - GetUIObject() -> UIObject - GetPlacement() -> int - Update(delta : float) -> void - CreateUIObject(spawnParent : UIObject) -> UIObject - IsEnabled() -> bool - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int - Update_Impl(delta : float) -> void - IsEnabled_Impl() -> bool +extern class LightmapVolume : VolumeBase + Rebake() -> void + RadianceAtlasTextures : Array + IrradianceAtlasTextures : Array + Atlases : Array end -extern class NullOverlay : OverlayBase +extern struct LightmapVolumeAtlas end -extern class TextureOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int +extern class FogVolume : VolumeBase + GetVolumeTexture() -> Texture + SetTextures(volumeTexture : Texture, noiseTexture : Texture) -> void + Rebake() -> void + VolumeTexture : Texture + NoiseTexture : Texture end -extern class TextOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject +extern struct EnvProbeSphericalHarmonics end -extern class ConsoleOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int - Update_Impl(delta : float) -> void - IsEnabled_Impl() -> bool +extern class EnvProbe : VolumeBase + GetEnvProbeType() -> EnvProbeType + GetEnvProbeFlags() -> EnvProbeFlags + SetEnvProbeFlags(envProbeFlags : EnvProbeFlags) -> void + IsReflectionProbe() -> bool + IsSkyProbe() -> bool + IsAmbientProbe() -> bool + IsBaked() -> bool + SetIsBaked(isBaked : bool) -> void + IsRealtime() -> bool + GetOrigin() -> Vec3f + SetOrigin(origin : Vec3f) -> void + GetCamera() -> Camera + GetBakedTexture() -> Texture + SetBakedTexture(texture : Texture) -> void + Dimensions : Vec2u + EnvProbeType : EnvProbeType + EnvProbeFlags : EnvProbeFlags + ShData : EnvProbeSphericalHarmonics end -extern class BaseStatsOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int - Update_Impl(delta : float) -> void - IsEnabled_Impl() -> bool +extern class SkyProbe : EnvProbe + GetSkyboxCubemap() -> Texture end -extern class DeviceDetailsOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int - Update_Impl(delta : float) -> void - IsEnabled_Impl() -> bool +extern class ReflectionProbe : EnvProbe + BakeCubemap() -> void end -extern class StatsOverlay : OverlayBase - CreateUIObject_Impl(spawnParent : UIObject) -> UIObject - GetPlacement_Impl() -> int - Update_Impl(delta : float) -> void - IsEnabled_Impl() -> bool +extern enum EnvProbeType : uint32 + EPT_INVALID = ~0u, + EPT_SKY = 0, + EPT_REFLECTION, + EPT_AMBIENT, + EPT_MAX end -extern enum ScrollAxis : uint8 - SA_NONE = 0x0, - SA_HORIZONTAL = 0x1, - SA_VERTICAL = 0x2, - SA_ALL = (SA_HORIZONTAL | SA_VERTICAL) +extern enum EnvProbeFlags : uint32 + EPF_NONE = 0x0, + EPF_PARALLAX_CORRECTED = 0x1, + EPF_BAKED = 0x2 end -extern enum UIObjectFocusState : uint32 - NONE = 0x0, - HOVER = 0x1, - PRESSED = 0x2, - TOGGLED = 0x4, - FOCUSED = 0x8 +extern class Sprite : Entity end -extern enum UIObjectUpdateType : uint32 - NONE = 0x0, - UPDATE_SIZE = 0x1, - UPDATE_POSITION = 0x2, - UPDATE_MATERIAL = 0x4, - UPDATE_MESH_DATA = 0x8, - UPDATE_COMPUTED_VISIBILITY = 0x10, - UPDATE_CLAMPED_SIZE = 0x20, - UPDATE_CUSTOM = 0x40, - UPDATE_ALL = UINT16_MAX, - UPDATE_CHILDREN_SIZE = (UPDATE_SIZE << 16), - UPDATE_CHILDREN_POSITION = (UPDATE_POSITION << 16), - UPDATE_CHILDREN_MATERIAL = (UPDATE_MATERIAL << 16), - UPDATE_CHILDREN_MESH_DATA = (UPDATE_MESH_DATA << 16), - UPDATE_CHILDREN_COMPUTED_VISIBILITY = (UPDATE_COMPUTED_VISIBILITY << 16), - UPDATE_CHILDREN_CLAMPED_SIZE = (UPDATE_CLAMPED_SIZE << 16), - UPDATE_CHILDREN_CUSTOM = (UPDATE_CUSTOM << 16), - UPDATE_CHILDREN_ALL = (UPDATE_ALL << 16) +extern enum SpriteType : uint32 + None = 0, + Point2D, + Spot3D, + Crosshair, + EnvProbe, + LightmapVolume, + Camera, + Text, + Max end -extern enum UIObjectBorderFlags : uint32 - NONE = 0x0, - TOP = 0x1, - LEFT = 0x2, - BOTTOM = 0x4, - RIGHT = 0x8, - ALL = (((TOP | LEFT) | BOTTOM) | RIGHT) +extern class TextSprite : Sprite end -extern struct UIEventHandlerResult +extern class Light : Entity + GetLightType() -> LightType + GetLightFlags() -> LightFlags + SetLightFlags(flags : LightFlags) -> void + GetNormal() -> Vec3f + SetNormal(normal : Vec3f) -> void + GetAreaSize() -> Vec2f + SetAreaSize(areaSize : Vec2f) -> void + GetColor() -> Color + SetColor(color : Color) -> void + GetIntensity() -> float + SetIntensity(intensity : float) -> void + GetRadius() -> float + SetRadius(radius : float) -> void + GetFalloff() -> float + SetFalloff(falloff : float) -> void + GetSpotAngles() -> Vec2f + SetSpotAngles(spotAngles : Vec2f) -> void + GetMaterial() -> MaterialInstance + SetMaterial(material : MaterialInstance) -> void + GetShadowMapDimensions() -> Vec2u + SetShadowMapDimensions(shadowMapDimensions : Vec2u) -> void + GetNumShadowMapCascades() -> uint32 + SetNumShadowMapCascades(numShadowMapCascades : uint32) -> void + GetBakedShadowMap() -> Texture + SetBakedShadowMap(shadowMap : Texture) -> void + GetShadowMapFilter() -> ShadowMapFilter + SetShadowMapFilter(shadowMapFilter : ShadowMapFilter) -> void + BakeStaticShadows() -> void + RemoveBakedShadows() -> void + CanBakeStaticShadows() -> bool + Type : LightType + LightFlags : LightFlags + ShadowMapDimensions : Vec2u + NumShadowMapCascades : uint32 end -extern enum UIObjectAlignment : uint32 - TOP_LEFT = 0, - TOP_RIGHT = 1, - CENTER = 2, - BOTTOM_LEFT = 3, - BOTTOM_RIGHT = 4 +extern class PointLight : Light end -extern enum UIObjectUpdateSizeFlags : uint32 - NONE = 0x0, - MAX_SIZE = 0x1, - INNER_SIZE = 0x2, - OUTER_SIZE = 0x4, - DEFAULT = ((MAX_SIZE | INNER_SIZE) | OUTER_SIZE) +extern class SpotLight : Light end -extern struct UIObjectAspectRatio - X : float - Y : float +extern class AreaRectLight : Light end -extern struct UIObjectSize - Flags : uint64 - Value : Vec2i +extern class DirectionalLight : Light + GetDirection() -> Vec3f + SetDirection(direction : Vec3f) -> void end -extern class UIObject - GetEntity() -> Entity - GetStage() -> UIStage - SetStage(stage : UIStage) -> void - GetName() -> Name - SetName(name : Name) -> void - GetPosition() -> Vec2i - SetPosition(position : Vec2i) -> void - GetOffsetPosition() -> Vec2f - GetAbsolutePosition() -> Vec2f - IsPositionAbsolute() -> bool - SetIsPositionAbsolute(isPositionAbsolute : bool) -> void - GetSize() -> UIObjectSize - SetSize(size : UIObjectSize) -> void - GetInnerSize() -> UIObjectSize - SetInnerSize(size : UIObjectSize) -> void - GetMaxSize() -> UIObjectSize - SetMaxSize(size : UIObjectSize) -> void - GetActualSize() -> Vec2i - GetActualSizeClamped() -> Vec2i - GetActualInnerSize() -> Vec2i - GetScrollOffset() -> Vec2f - SetScrollOffset(scrollOffset : Vec2f, smooth : bool) -> void - ScrollToChild(child : UIObject) -> void - GetVerticalScrollbarSize() -> int - GetHorizontalScrollbarSize() -> int - CanScrollOnAxis(axis : ScrollAxis) -> bool - GetComputedDepth() -> int - GetDepth() -> int - SetDepth(depth : int) -> void - AcceptsFocus() -> bool - SetAcceptsFocus(acceptsFocus : bool) -> void - NeedsUpdate() -> bool - Focus() -> void - Blur(blurChildren : bool) -> void - SetAffectsParentSize(affectsParentSize : bool) -> void - AffectsParentSize() -> bool - GetBorderRadius() -> uint32 - SetBorderRadius(borderRadius : uint32) -> void - GetBorderFlags() -> UIObjectBorderFlags - SetBorderFlags(borderFlags : UIObjectBorderFlags) -> void - GetAspectRatio() -> UIObjectAspectRatio - SetAspectRatio(aspectRatio : UIObjectAspectRatio) -> void - GetPadding() -> Vec2i - SetPadding(padding : Vec2i) -> void - GetBackgroundColor() -> Color - SetBackgroundColor(backgroundColor : Color) -> void - GetTextColor() -> Color - SetTextColor(textColor : Color) -> void - GetText() -> string - SetText(text : string) -> void - GetTextSize() -> float - SetTextSize(textSize : float) -> void - IsVisible() -> bool - SetIsVisible(isVisible : bool) -> void - IsEnabled() -> bool - SetIsEnabled(isEnabled : bool) -> void - GetParentUIObject() -> UIObject - AddChildUIObject(uiObject : UIObject) -> void - RemoveChildUIObject(uiObject : UIObject) -> bool - ClearDeep() -> void - RemoveFromParent() -> bool - DetachFromParent() -> UIObject - HasChildUIObjects() -> bool - GetChildUIObject(index : int) -> UIObject - NumChildUIObjects(deep : bool) -> uint32 - GetNode() -> Node - GetWorld() -> World - GetAABB() -> BoundingBox - GetAABBClamped() -> BoundingBox - GetDataSource() -> UIDataSourceBase - SetDataSource(dataSource : UIDataSourceBase) -> void - OnInit : any - OnAttached : any - OnRemoved : any - OnChildAttached : any - OnChildRemoved : any - OnMouseDown : any - OnMouseUp : any - OnMouseDrag : any - OnMouseHover : any - OnMouseLeave : any - OnMouseMove : any - OnGainFocus : any - OnLoseFocus : any - OnScroll : any - OnClick : any - OnRightClick : any - OnKeyDown : any - OnKeyUp : any - OnTextChange : any - OnSizeChange : any - OnComputedVisibilityChange : any - OnEnabled : any - OnDisabled : any - OnValueChange : any - Init() -> void +extern enum LightType : uint32 + Directional = 0, + Point, + Spot, + AreaRect, + Max end -extern class UIConsole : UIObject +extern enum LightFlags : uint32 + None = 0x0, + ShadowCaster = 0x1, + ShadowPCF = 0x2, + ShadowContactHardening = 0x4, + ShadowVariance = 0x8, + ShadowFilterMask = ((ShadowPCF | ShadowContactHardening) | ShadowVariance), + CacheStaticShadowMaps = 0x10, + BakeStaticShadows = 0x20, + Default = (ShadowCaster | ShadowPCF) end -extern class UIButton : UIObject +extern class EnvGrid : Entity end -extern class UIText : UIObject - GetCharacterOffset(characterIndex : int) -> Vec2f +extern struct ShaderInputGroup + Elements : Array end -extern class UIImage : UIObject +extern enum ProcessShaderSourcePhase : uint32 + BEFORE_PREPROCESS, + AFTER_PREPROCESS end -extern class UIStage : UIObject - GetSurfaceSize() -> Vec2i - SetSurfaceSize(surfaceSize : Vec2i) -> void - GetScene() -> Scene - SetScene(scene : Scene) -> void - GetCamera() -> Camera +extern struct ShaderInput + Slot : ShaderRegister + Type : ShaderInputType + Name : Name + Count : uint32 + Size : uint32 + IsDynamic : bool + BufferType : GpuBufferType + StructInfo : ShaderStruct + Category : ShaderResourceCategory + Index : uint32 end -extern class UIPanel : UIObject - IsHorizontalScrollEnabled() -> bool - IsVerticalScrollEnabled() -> bool - SetIsScrollEnabled(axis : ScrollAxis, isScrollEnabled : bool) -> void +extern enum ShaderCompileTargetPlatform : uint32 + None = 0x00000000, + Windows = 0x00000001, + Mac = 0x00000002, + Linux = 0x00000004, + Android = 0x00000008, + iOS = 0x00000010, + AllPlatforms = ((((Windows | Mac) | Linux) | Android) | iOS) +end +extern enum ShaderCompileTargetBackend : uint32 + None = 0x00000000, + Vulkan = 0x00000100, + DX12 = 0x00000200, + AllBackends = (Vulkan | DX12) end -extern class EditorPropertyPanelBase : UIPanel - Build(boxed : any, property : any) -> void +extern enum ShaderInputSetFlags : uint8 + None = 0x0, + Reference = 0x1, + Template = 0x2 end -extern class UITextbox : UIPanel - GetPlaceholder() -> string - SetPlaceholder(placeholder : string) -> void - GetPlaceholderTextColor() -> Color - ClearOnSubmit : bool +extern struct ShaderInputSet + SetIndex : uint32 + Name : Name + Slots : Array> + Flags : ShaderInputSetFlags end -extern enum UIListViewOrientation : uint8 - VERTICAL = 0, - HORIZONTAL +extern enum ShaderLanguage : uint32 + GLSL, + HLSL end -extern class UIListView : UIPanel - SetSelectedItem(listViewItem : UIListViewItem) -> void - GetSelectedItemIndex() -> int - SetSelectedItemIndex(index : int) -> void - GetOrientation() -> UIListViewOrientation - SetOrientation(orientation : UIListViewOrientation) -> void +extern struct ShaderStruct + Name : Name + Size : uint32 + FieldNames : Array + FieldTypes : Array end -extern class UIListViewItem : UIObject +extern enum ShaderRegister : uint8 + NONE = 0, + SRV, + UAV, + BUFFER, + SAMPLER, + MAX end -extern class UITabView : UIPanel +extern class ShaderBundle : AssetObject + CompiledShaders : Array + ErrorMessages : Array end -extern class UITab : UIObject +extern class Texture : AssetObject + Rename(name : Name) -> Result + TextureDesc : TextureDesc + ImageData : BlobDataReference + GpuImage : any end -extern class UIWindow : UIPanel +extern class Shader : AssetObject + BaseName : Name + InputLayout : VertexInputLayoutDesc + InputGroup : ShaderInputGroup + ModuleTypes : Array + ModuleNames : Array + EntryPointNames : Array + ShaderBlobs : Array + PropertySetHashCode : HashCode + LastCompiledTimestamp : Time + Properties : ShaderPropertySet + SerializeProperties() -> Array + DeserializeProperties(properties : Array) -> void end -extern class UIDockableContainer : UIPanel +extern enum MeshFlags : uint32 + None = 0x0, + ViewIndependent = 0x1 end -extern class UIDockableItem : UIPanel +extern struct MeshDesc + MeshAttributes : MeshAttributes + NumVertices : uint32 + NumIndices : uint32 end -extern class UIMenuBar : UIPanel - GetDropDirection() -> UIMenuBarDropDirection - SetDropDirection(dropDirection : UIMenuBarDropDirection) -> void - SetSelectedMenuItemIndex(index : uint32) -> void - AddMenuItem(name : Name, text : string) -> UIMenuItem - GetMenuItem(name : Name) -> UIMenuItem - GetMenuItemIndex(name : Name) -> uint32 - RemoveMenuItem(name : Name) -> bool +extern class Mesh : AssetObject + GetFlags() -> MeshFlags + SetFlags(flags : MeshFlags) -> void + Rename(name : Name) -> Result + NumIndices() -> uint32 + GetAABB() -> BoundingBox + SetAABB(aabb : BoundingBox) -> void + MeshDesc : MeshDesc + VertexData : BlobDataReference + IndexData : BlobDataReference + BvhData : BlobDataReference + Aabb : BoundingBox + Bvh : BVHNode + Flags : MeshFlags end -extern class UIMenuItem : UIObject +extern class MaterialInstance : AssetObject + IsStatic() -> bool + GetIsDynamic() -> bool + SetIsDynamic(isDynamic : bool) -> void + Clone() -> MaterialInstance + Definition : MaterialDefinition + Parameters : MaterialParameters + Textures : MaterialTextures + IsDynamic : bool end -extern enum UIMenuBarDropDirection : uint32 - DOWN, - UP +extern class MaterialDefinition : AssetObject + Attributes : MaterialAttributes + DefaultParameters : MaterialParameters + DefaultTextures : MaterialTextures end -extern class UIGrid : UIPanel - GetNumColumns() -> int - SetNumColumns(numColumns : int) -> void - GetNumRows() -> uint32 - SetNumRows(numRows : uint32) -> void +extern class InstancedMeshData : AssetObject + Buffers : Array + BufferStructSizes : Array + BufferStructAlignments : Array end -extern class UIGridRow : UIPanel +extern class PhysicsShape : AssetObject end -extern class UIGridColumn : UIPanel - GetColumnSize() -> int - SetColumnSize(columnSize : int) -> void +extern class PlanePhysicsShape : PhysicsShape + Plane : Vec4f end -extern class UISpacer : UIObject +extern class BoxPhysicsShape : PhysicsShape + Aabb : BoundingBox end -extern class UIDataSourceBase - Size() -> int - Clear() -> void +extern class ConvexHullPhysicsShape : PhysicsShape end -extern class UIDataSource : UIDataSourceBase - Size() -> int - Clear() -> void +extern class SpherePhysicsShape : PhysicsShape + Sphere : BoundingSphere end -extern class UIElementFactoryBase - GetElementTypeId() -> TypeId - CreateUIObject(parent : UIObject, value : any, context : any) -> UIObject - UpdateUIObject(uiObject : UIObject, value : any, context : any) -> void +extern class CapsulePhysicsShape : PhysicsShape + Radius : float + Height : float end -extern struct TypeId +extern enum PhysicsShapeType : uint8 + BOX, + SPHERE, + PLANE, + CONVEX_HULL, + CAPSULE end -extern enum LogLevel : uint8 - Fatal, - Error, - Warning, - Info, - Verbose, - Debug +extern class AssetLoaderBase end -extern struct LogChannel - Id : uint32 - Name : Name - ParentChannel : LogChannel +extern struct AssetBucket end -extern class Logger - static MakeScriptLogger() -> Logger - LogScript(channel : LogChannel, level : LogLevel, message : string) -> void +extern struct UUID + Data0 : uint64 + Data1 : uint64 + ToString() -> string +end +extern struct Time + Value : uint64 end extern struct Result HasValue() -> bool @@ -2482,13 +2460,25 @@ extern struct Result end extern struct Error end -extern struct UUID - Data0 : uint64 - Data1 : uint64 - ToString() -> string +extern struct TypeId end -extern struct Time - Value : uint64 +extern struct Triangle + Points : Array +end +extern struct Transform + Translation : Vec3f + Scale : Vec3f + Rotation : Quat4f +end +extern struct Ray + Position : Vec3f + Direction : Vec3f +end +extern enum RayTestFlags : uint32 + None = 0x0, + TestBVH = 0x1, + EditorPick = 0x2, + Max = 0xFFFFFFFF end extern struct Quat4f X : float @@ -2496,9 +2486,13 @@ extern struct Quat4f Z : float W : float end -extern struct BoundingBox - Min : Vec3f - Max : Vec3f +extern struct Mat4f +end +extern struct Mat3f +end +extern struct Frustum + Planes : Array + Corners : Array end extern struct Color GetRed() -> float @@ -2510,35 +2504,30 @@ extern struct Color GetAlpha() -> float SetAlpha(alpha : float) -> Color end -extern struct Frustum - Planes : Array - Corners : Array -end -extern struct Ray - Position : Vec3f - Direction : Vec3f -end -extern enum RayTestFlags : uint32 - None = 0x0, - TestBVH = 0x1, - EditorPick = 0x2, - Max = 0xFFFFFFFF -end extern struct BoundingSphere Center : Vec3f Radius : float end -extern struct Triangle - Points : Array +extern struct BoundingBox + Min : Vec3f + Max : Vec3f end -extern struct Mat4f +extern enum LogLevel : uint8 + Fatal, + Error, + Warning, + Info, + Verbose, + Debug end -extern struct Transform - Translation : Vec3f - Scale : Vec3f - Rotation : Quat4f +extern struct LogChannel + Id : uint32 + Name : Name + ParentChannel : LogChannel end -extern struct Mat3f +extern class Logger + static MakeScriptLogger() -> Logger + LogScript(channel : LogChannel, level : LogLevel, message : string) -> void end extern enum CommandLineArgumentType : uint8 STRING, diff --git a/Documentation/Console.md b/Documentation/Console.md index 2785b4e92d..4d70b3d87c 100644 --- a/Documentation/Console.md +++ b/Documentation/Console.md @@ -2,7 +2,7 @@ *Commandlets* - are isolated tasks that can be run: - from within the editor's console window by typing the name of the commandlet and pressing enter (args can be provided after the name of the commandlet, separated by spaces), -- by invoking them via cli by running the engine's executable with the `-Commandlet` argument followed by the name of the commandlet you want to run and any args you want to provide (e.g. `HyperionEngine.exe -Commandlet MyCommandlet arg1 arg2`). +- by invoking them via cli by running the engine's executable with the `--exec` argument followed by the name of the commandlet you want to run and any args you want to provide (e.g. `HyperionEngine.exe --exec MyCommandlet arg1 arg2`). - or as a specifically compiled executable, as long as `add_commandlet_target()` is used in the Source/Commandlets/CMakeLists.txt. For example, `PrecompileShaders` is one of these, and can be run by executing `PrecompileShaders.exe` directly from the command line. > To find all commandlets, do a project-wide search for `: public CommandletBase`. That will show you all defined console command classes. @@ -14,4 +14,4 @@ This allows commandlets to perform a wide variety of tasks within an engine cont From within the editor, you can use the console window to set a CVar by name. The name you pass is case-insensitive and can be either the full name of the CVar (e.g. `Rendering.SSGI`) or just the last part of the name (e.g. `SSGI`), followed by the value you want to set it to (e.g. `true`/`1` or `false`/`0` for bool CVars, a number for int or float CVars, etc.). For example, you can type `ssgi 1` in the console to enable SSGI at runtime. -> For a full list of available CVars, do a project-wide regex search for `^CVar<([A-Za-z_]+)>` to find all CVars defined in the codebase. \ No newline at end of file +> For a full list of available CVars, do a project-wide regex search for `^CVar<([A-Za-z_]+)>` to find all CVars defined in the codebase. diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 6fe9f7431a..ab29bffc17 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -7,11 +7,11 @@ if(POLICY CMP0114) endif() if(POLICY CMP0079) - cmake_policy(SET CMP0079 NEW) + cmake_policy(SET CMP0079 NEW) endif() if(NOT DEFINED CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type to use" FORCE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type to use" FORCE) endif() message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") @@ -20,19 +20,19 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) # set HYP_PLATFORM_NAME if(NOT DEFINED HYP_PLATFORM_NAME) - if(ANDROID) - set(HYP_PLATFORM_NAME "Android") - elseif(WIN32) - set(HYP_PLATFORM_NAME "Windows") - elseif(APPLE) - set(HYP_PLATFORM_NAME "Mac") - elseif(IOS) - set(HYP_PLATFORM_NAME "iOS") - elseif(UNIX) - set(HYP_PLATFORM_NAME "Linux") - else() - message(FATAL_ERROR "Unsupported platform") - endif() + if(ANDROID) + set(HYP_PLATFORM_NAME "Android") + elseif(WIN32) + set(HYP_PLATFORM_NAME "Windows") + elseif(APPLE) + set(HYP_PLATFORM_NAME "Mac") + elseif(IOS) + set(HYP_PLATFORM_NAME "iOS") + elseif(UNIX) + set(HYP_PLATFORM_NAME "Linux") + else() + message(FATAL_ERROR "Unsupported platform") + endif() endif() # use params passed in @@ -58,61 +58,61 @@ project(${BUILD_NAME} CXX) # platform and compiler definitions if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - add_definitions(-DHYP_MSVC=1) - set(HYP_MSVC 1) + add_definitions(-DHYP_MSVC=1) + set(HYP_MSVC 1) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_definitions(-DHYP_CLANG=1) - add_definitions(-DHYP_CLANG_OR_GCC=1) - set(HYP_CLANG 1) - set(HYP_CLANG_OR_GCC 1) + add_definitions(-DHYP_CLANG=1) + add_definitions(-DHYP_CLANG_OR_GCC=1) + set(HYP_CLANG 1) + set(HYP_CLANG_OR_GCC 1) elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_definitions(-DHYP_GCC=1) - add_definitions(-DHYP_CLANG_OR_GCC=1) - set(HYP_GCC 1) - set(HYP_CLANG_OR_GCC 1) + add_definitions(-DHYP_GCC=1) + add_definitions(-DHYP_CLANG_OR_GCC=1) + set(HYP_GCC 1) + set(HYP_CLANG_OR_GCC 1) endif() if(${HYP_PLATFORM_NAME} STREQUAL "Windows") - set(CSHARP_CONSTANTS "HYP_WINDOWS") - add_definitions(-DHYP_WINDOWS=1) + set(CSHARP_CONSTANTS "HYP_WINDOWS") + add_definitions(-DHYP_WINDOWS=1) - set(HYP_WINDOWS 1) + set(HYP_WINDOWS 1) elseif(${HYP_PLATFORM_NAME} STREQUAL "Mac") - set(CSHARP_CONSTANTS "HYP_MACOS;HYP_APPLE;HYP_UNIX") - add_definitions(-DHYP_APPLE=1) - add_definitions(-DHYP_UNIX=1) - add_definitions(-DHYP_MACOS=1) - - set(HYP_APPLE 1) - set(HYP_UNIX 1) - set(HYP_MACOS 1) + set(CSHARP_CONSTANTS "HYP_MACOS;HYP_APPLE;HYP_UNIX") + add_definitions(-DHYP_APPLE=1) + add_definitions(-DHYP_UNIX=1) + add_definitions(-DHYP_MACOS=1) + + set(HYP_APPLE 1) + set(HYP_UNIX 1) + set(HYP_MACOS 1) elseif(${HYP_PLATFORM_NAME} STREQUAL "iOS") - set(CSHARP_CONSTANTS "HYP_IOS;HYP_APPLE;HYP_UNIX") - add_definitions(-DHYP_APPLE=1) - add_definitions(-DHYP_UNIX=1) - add_definitions(-DHYP_IOS=1) - - set(HYP_APPLE 1) - set(HYP_UNIX 1) - set(HYP_IOS 1) + set(CSHARP_CONSTANTS "HYP_IOS;HYP_APPLE;HYP_UNIX") + add_definitions(-DHYP_APPLE=1) + add_definitions(-DHYP_UNIX=1) + add_definitions(-DHYP_IOS=1) + + set(HYP_APPLE 1) + set(HYP_UNIX 1) + set(HYP_IOS 1) elseif(${HYP_PLATFORM_NAME} STREQUAL "Android") - set(CSHARP_CONSTANTS "HYP_ANDROID;HYP_UNIX") - add_definitions(-DHYP_ANDROID=1) - add_definitions(-DHYP_UNIX=1) + set(CSHARP_CONSTANTS "HYP_ANDROID;HYP_UNIX") + add_definitions(-DHYP_ANDROID=1) + add_definitions(-DHYP_UNIX=1) - set(HYP_ANDROID 1) - set(HYP_UNIX 1) + set(HYP_ANDROID 1) + set(HYP_UNIX 1) elseif(${HYP_PLATFORM_NAME} STREQUAL "Linux") - set(CSHARP_CONSTANTS "HYP_LINUX;HYP_UNIX") - add_definitions(-DHYP_LINUX=1) - add_definitions(-DHYP_UNIX=1) - - set(HYP_LINUX 1) - set(HYP_UNIX 1) + set(CSHARP_CONSTANTS "HYP_LINUX;HYP_UNIX") + add_definitions(-DHYP_LINUX=1) + add_definitions(-DHYP_UNIX=1) + + set(HYP_LINUX 1) + set(HYP_UNIX 1) endif() if (HYP_CLANG AND HYP_WINDOWS) - set(HYP_CLANG_WINDOWS true) + set(HYP_CLANG_WINDOWS true) endif() message(STATUS "Building for platform: ${HYP_PLATFORM_NAME} with compiler: ${CMAKE_CXX_COMPILER_ID}") @@ -120,8 +120,8 @@ message(STATUS "Building for platform: ${HYP_PLATFORM_NAME} with compiler: ${CMA set(USE_MSBUILD_FOR_CSHARP_BUILD false) if (HYP_MSVC OR HYP_CLANG_WINDOWS) - set(USE_MSBUILD_FOR_CSHARP_BUILD true) - message(STATUS "Using MSBuild for C# projects") + set(USE_MSBUILD_FOR_CSHARP_BUILD true) + message(STATUS "Using MSBuild for C# projects") endif() string(TOLOWER ${HYP_PLATFORM_NAME} HYP_PLATFORM_NAME_LOWER) @@ -136,8 +136,8 @@ enable_language(CXX) enable_language(C) if(APPLE) - enable_language(OBJCXX) - enable_language(OBJC) + enable_language(OBJCXX) + enable_language(OBJC) endif() # Include ExternalProject for building submodules separately @@ -145,29 +145,29 @@ include(ExternalProject) function(RunCodeGen version_major version_minor) - if(CMAKE_HOST_WIN32) - set(HYP_CODEGEN_RUN_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/RunCodeGen.bat") - set(HYP_CODEGEN_BUILD_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/BuildCodeGen.bat") - else() - set(HYP_CODEGEN_RUN_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/RunCodeGen.sh") - set(HYP_CODEGEN_BUILD_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/BuildCodeGen.sh") - endif() + if(CMAKE_HOST_WIN32) + set(HYP_CODEGEN_RUN_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/RunCodeGen.bat") + set(HYP_CODEGEN_BUILD_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/BuildCodeGen.bat") + else() + set(HYP_CODEGEN_RUN_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/RunCodeGen.sh") + set(HYP_CODEGEN_BUILD_SCRIPT_PATH "${CMAKE_SOURCE_DIR}/../Tools/Scripts/BuildCodeGen.sh") + endif() - message(STATUS "Running CodeGen: ${HYP_CODEGEN_RUN_SCRIPT_PATH} with version ${version_major}.${version_minor}") + message(STATUS "Running CodeGen: ${HYP_CODEGEN_RUN_SCRIPT_PATH} with version ${version_major}.${version_minor}") - if(NOT EXISTS ${HYP_CODEGEN_RUN_SCRIPT_PATH}) - message(FATAL_ERROR "RunCodeGen script not found in ${CMAKE_SOURCE_DIR}/../Tools/Scripts! Expected path: ${HYP_CODEGEN_RUN_SCRIPT_PATH}") - endif() + if(NOT EXISTS ${HYP_CODEGEN_RUN_SCRIPT_PATH}) + message(FATAL_ERROR "RunCodeGen script not found in ${CMAKE_SOURCE_DIR}/../Tools/Scripts! Expected path: ${HYP_CODEGEN_RUN_SCRIPT_PATH}") + endif() - execute_process( + execute_process( COMMAND ${HYP_CODEGEN_RUN_SCRIPT_PATH} ${version_major} ${version_minor} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/../ RESULT_VARIABLE HYP_CODEGEN_RESULT ) - if(NOT HYP_CODEGEN_RESULT EQUAL 0) - message(FATAL_ERROR "CodeGen failed with exit code: ${HYP_CODEGEN_RESULT}") - endif() + if(NOT HYP_CODEGEN_RESULT EQUAL 0) + message(FATAL_ERROR "CodeGen failed with exit code: ${HYP_CODEGEN_RESULT}") + endif() endfunction() # Run CodeGen with version 0.9 @@ -175,8 +175,8 @@ RunCodeGen(0 9) # set HYP_DEBUG_MODE to 1 for debug builds, 0 for release builds # if(CMAKE_BUILD_TYPE STREQUAL "Debug") - add_definitions(-DHYP_DEBUG_MODE=1) - set(HYP_DEBUG_MODE 1) +add_definitions(-DHYP_DEBUG_MODE=1) +set(HYP_DEBUG_MODE 1) # endif() # set HYPERION_ENGINE to 1 (used to differentiate between engine and build tool or other executables using core lib) @@ -191,78 +191,78 @@ add_definitions(-DHYP_TESTS=1) add_definitions(-DHYP_TYPE_ID_COMPILE_TIME=1) if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") - set(NATIVE false CACHE BOOL "Is the build occuring on a native platform? (Access to native libraries, filesystem etc.)") + set(NATIVE false CACHE BOOL "Is the build occuring on a native platform? (Access to native libraries, filesystem etc.)") else() - set(NATIVE true CACHE BOOL "Is the build occuring on a native platform? (Access to native libraries, filesystem etc.)") + set(NATIVE true CACHE BOOL "Is the build occuring on a native platform? (Access to native libraries, filesystem etc.)") endif() if(HYP_MSVC) - message(STATUS "Building on MSVC, checking toolchain is set (should be set to `/scripts/buildsystems/vcpkg.cmake`)") + message(STATUS "Building on MSVC, checking toolchain is set (should be set to `/scripts/buildsystems/vcpkg.cmake`)") - if (DEFINED CMAKE_TOOLCHAIN_FILE) - message(STATUS "Using CMake toolchain file: ${CMAKE_TOOLCHAIN_FILE}") - else() - message(STATUS "CMake toolchain file not specified -- should be set to vcpkg cmake file! \ + if (DEFINED CMAKE_TOOLCHAIN_FILE) + message(STATUS "Using CMake toolchain file: ${CMAKE_TOOLCHAIN_FILE}") + else() + message(STATUS "CMake toolchain file not specified -- should be set to vcpkg cmake file! \ If you don't have vcpkg set up, download vcpkg from Microsoft and set the `-DCMAKE_TOOLCHAIN_FILE` CMake argument to \ `/scripts/buildsystems/vcpkg.cmake`.") - endif() + endif() - # disable specific warnings - add_definitions("/wd4251") - add_definitions("/wd4275") + # disable specific warnings + add_definitions("/wd4251") + add_definitions("/wd4275") - # add _CRT_SECURE_NO_WARNINGS - add_definitions("/D_CRT_SECURE_NO_WARNINGS") + # add _CRT_SECURE_NO_WARNINGS + add_definitions("/D_CRT_SECURE_NO_WARNINGS") - # no exceptions - add_definitions("/D_HAS_EXCEPTIONS=0") - add_definitions("/DNOMINMAX") + # no exceptions + add_definitions("/D_HAS_EXCEPTIONS=0") + add_definitions("/DNOMINMAX") - set(CMAKE_CXX_FLAGS "/Zc:preprocessor /Zc:__cplusplus /O2 /MD /Z7 /constexpr:depth1024 /bigobj /MP /arch:AVX2") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") - # if(HYP_DEBUG_MODE) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") - # endif() + set(CMAKE_CXX_FLAGS "/Zc:preprocessor /Zc:__cplusplus /O2 /MD /Z7 /constexpr:depth1024 /bigobj /MP /arch:AVX2") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") + # if(HYP_DEBUG_MODE) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG") + # endif() - # if(HYP_DEBUG_MODE) - # else() - # set(CMAKE_CXX_FLAGS "/Zc:preprocessor /Zc:__cplusplus /O2 /Oy /MD /constexpr:depth1024 /bigobj /MP") - # endif() + # if(HYP_DEBUG_MODE) + # else() + # set(CMAKE_CXX_FLAGS "/Zc:preprocessor /Zc:__cplusplus /O2 /Oy /MD /constexpr:depth1024 /bigobj /MP") + # endif() - # address sanitizer - # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") + # address sanitizer + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") else() - # for clang on windows - no min/max macros - if(${HYP_PLATFORM_NAME} STREQUAL "Windows") - add_definitions(-DNOMINMAX) - message(STATUS "Building with Clang on Windows, adding NOMINMAX definition to avoid min/max macro conflicts") - endif() + # for clang on windows - no min/max macros + if(${HYP_PLATFORM_NAME} STREQUAL "Windows") + add_definitions(-DNOMINMAX) + message(STATUS "Building with Clang on Windows, adding NOMINMAX definition to avoid min/max macro conflicts") + endif() - if(HYP_DEBUG_MODE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -Werror=return-type -Werror=address") #-Werror=non-virtual-dtor - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") - endif() + if(HYP_DEBUG_MODE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -g -Werror=return-type -Werror=address") #-Werror=non-virtual-dtor + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") + endif() - # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20") + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - # no exceptions - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20") - # for full template backtrace - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-backtrace-limit=0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer") + # no exceptions + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") - # # address sanitizer and other debugging utilities - # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined") + # for full template backtrace + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-backtrace-limit=0") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer") - # ClangCL on Windows uses link.exe, so it supports /DEBUG and /NATVIS - if(HYP_CLANG_WINDOWS) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") - endif() + # # address sanitizer and other debugging utilities + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=undefined") + + # ClangCL on Windows uses link.exe, so it supports /DEBUG and /NATVIS + if(HYP_CLANG_WINDOWS) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG /NATVIS:${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis") + endif() endif() set(HYP_VERSION_MAJOR 1) @@ -272,17 +272,17 @@ set(HYP_VERSION_PATCH 0) link_directories(${THIRD_PARTY_LIBRARY_DIR}) if(CMAKE_GENERATOR STREQUAL "Xcode") - set(CMAKE_XCODE_SCHEME_GENERATE ON) - set(CMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION FALSE) + set(CMAKE_XCODE_SCHEME_GENERATE ON) + set(CMAKE_XCODE_SCHEME_ENABLE_GPU_API_VALIDATION FALSE) - # disable xcode code signing - set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED") - set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO") + # disable xcode code signing + set(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES "CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED") + set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO") -# for VS solutions, we want to add some files as a custom solution item + # for VS solutions, we want to add some files as a custom solution item elseif(HYP_MSVC OR HYP_CLANG_WINDOWS) - set(SOLUTION_FILES "${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis" "${CMAKE_SOURCE_DIR}/../.clang-format" "${CMAKE_SOURCE_DIR}/../.clang-tidy") - add_custom_target(VSSolutionFiles SOURCES ${SOLUTION_FILES}) + set(SOLUTION_FILES "${CMAKE_SOURCE_DIR}/Engine/Hyperion.natvis" "${CMAKE_SOURCE_DIR}/../.clang-format" "${CMAKE_SOURCE_DIR}/../.clang-tidy") + add_custom_target(VSSolutionFiles SOURCES ${SOLUTION_FILES}) endif() # if(NOT IOS) @@ -298,18 +298,18 @@ find_package(Threads REQUIRED) find_package(Bullet) if(Bullet_FOUND) - message(STATUS "Bullet found") + message(STATUS "Bullet found") - add_definitions(-DHYP_BULLET=1) + add_definitions(-DHYP_BULLET=1) - include_directories(${BULLET_INCLUDE_DIRS}) + include_directories(${BULLET_INCLUDE_DIRS}) - set(COMMON_LIBRARIES + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${BULLET_LIBRARIES} ) else() - message(WARNING "Bullet not found, physics will be disabled!") + message(WARNING "Bullet not found, physics will be disabled!") endif() # PCHs @@ -331,22 +331,22 @@ set(CSHARP_PROJECTS_DIR "${CMAKE_SOURCE_DIR}/../Build/CSharpProjects") file(MAKE_DIRECTORY ${CSHARP_PROJECTS_DIR}) if(NOT HYP_ANDROID) - # TODO if not final release build check. - # for final release follow the android technique + # TODO if not final release build check. + # for final release follow the android technique - # we need to escape if on windows: - if(WIN32) - string(REPLACE "\\" "\\\\" HYP_ROOT_DIR_ESCAPED "${HYP_ROOT_DIR}") - else() - set(HYP_ROOT_DIR_ESCAPED "${HYP_ROOT_DIR}") - endif() + # we need to escape if on windows: + if(WIN32) + string(REPLACE "\\" "\\\\" HYP_ROOT_DIR_ESCAPED "${HYP_ROOT_DIR}") + else() + set(HYP_ROOT_DIR_ESCAPED "${HYP_ROOT_DIR}") + endif() - add_definitions(-DHYP_ROOT_DIR="${HYP_ROOT_DIR_ESCAPED}") - - set(HYP_EDITOR 1) - add_definitions(-DHYP_EDITOR=1) + add_definitions(-DHYP_ROOT_DIR="${HYP_ROOT_DIR_ESCAPED}") - add_definitions(-DHYP_ENABLE_SHADER_RELOAD=1) + set(HYP_EDITOR 1) + add_definitions(-DHYP_EDITOR=1) + + add_definitions(-DHYP_ENABLE_SHADER_RELOAD=1) endif() # enable HypScript @@ -357,36 +357,36 @@ set(HYP_GENERATE_CSHARP_LIBRARIES true) # if dotnet headers exist, set HYP_DOTNET to 1 # TODO: Get working on Android if(EXISTS "${THIRD_PARTY_INCLUDE_DIR}/dotnetcore/hostfxr.h" AND NOT HYP_ANDROID) - message(STATUS ".NET headers found") - set(HYP_DOTNET 1) + message(STATUS ".NET headers found") + set(HYP_DOTNET 1) - if(HYP_DOTNET) - if(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libnethost.a") - message(STATUS ".NET core found, setting HYP_DOTNET to 1") + if(HYP_DOTNET) + if(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libnethost.a") + message(STATUS ".NET core found, setting HYP_DOTNET to 1") - set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libnethost.a") + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libnethost.a") - set(HYP_DOTNET 1) + set(HYP_DOTNET 1) - add_definitions(-DHYP_DOTNET=1) - elseif(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.lib") - message(STATUS ".NET core found, setting HYP_DOTNET to 1") + add_definitions(-DHYP_DOTNET=1) + elseif(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.lib") + message(STATUS ".NET core found, setting HYP_DOTNET to 1") - set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.lib") + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.lib") - # copy the dll to the build directory - file(COPY "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.dll" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + # copy the dll to the build directory + file(COPY "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/nethost.dll" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - set(HYP_DOTNET 1) + set(HYP_DOTNET 1) - add_definitions(-DHYP_DOTNET=1) - else() - message(STATUS ".NET core not found, expected to find libnethost.a or nethost.lib in ${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}, setting HYP_DOTNET to 0") - set(HYP_DOTNET 0) - endif() + add_definitions(-DHYP_DOTNET=1) + else() + message(STATUS ".NET core not found, expected to find libnethost.a or nethost.lib in ${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}, setting HYP_DOTNET to 0") + set(HYP_DOTNET 0) endif() + endif() else() - message(STATUS ".NET headers not found, skipping .NET core runtime") + message(STATUS ".NET headers not found, skipping .NET core runtime") endif() set(RENDERING_BACKEND "Vulkan") @@ -394,258 +394,258 @@ set(RENDERING_BACKEND "Vulkan") # set(ENABLE_EXPERIMENTAL_DX12_RENDERING_BACKEND true) # TEMP - do not commit to dev branch with this set to true, only for testing the DX12 rendering backend before it's ready to be merged into dev if(ENABLE_EXPERIMENTAL_DX12_RENDERING_BACKEND AND WIN32) - set(RENDERING_BACKEND "DX12") + set(RENDERING_BACKEND "DX12") endif() if (NOT DEFINED RENDERING_BACKEND) - if (WIN32) - set(RENDERING_BACKEND "DX12") - elseif((APPLE) OR (UNIX)) - set(RENDERING_BACKEND "Vulkan") - else() - message(FATAL_ERROR "No rendering backend defined and unable to select default for platform!") - endif() + if (WIN32) + set(RENDERING_BACKEND "DX12") + elseif((APPLE) OR (UNIX)) + set(RENDERING_BACKEND "Vulkan") + else() + message(FATAL_ERROR "No rendering backend defined and unable to select default for platform!") + endif() endif() if (RENDERING_BACKEND STREQUAL "Vulkan") - if(HYP_ANDROID) - # On Android, Vulkan (API 24+) is provided by the platform — link against the - # system libvulkan.so directly. NDK sysroot includes the headers. - add_definitions(-DHYP_VULKAN=1) - set(HYP_VULKAN 1) - set(RENDERER_LIBRARIES ${RENDERER_LIBRARIES} vulkan) - find_package(Vulkan QUIET) - if(Vulkan_FOUND) - include_directories(BEFORE ${Vulkan_INCLUDE_DIRS}) - endif() - message(STATUS "Android: using platform-provided Vulkan (libvulkan.so)") - else() - find_package(Vulkan REQUIRED) - add_definitions(-DHYP_VULKAN=1) - set(HYP_VULKAN 1) - message(STATUS "Found Vulkan at: ${Vulkan_INCLUDE_DIRS} ${Vulkan_LIBRARIES}") - include_directories(BEFORE ${Vulkan_INCLUDE_DIRS}) + if(HYP_ANDROID) + # On Android, Vulkan (API 24+) is provided by the platform — link against the + # system libvulkan.so directly. NDK sysroot includes the headers. + add_definitions(-DHYP_VULKAN=1) + set(HYP_VULKAN 1) + set(RENDERER_LIBRARIES ${RENDERER_LIBRARIES} vulkan) + find_package(Vulkan QUIET) + if(Vulkan_FOUND) + include_directories(BEFORE ${Vulkan_INCLUDE_DIRS}) endif() + message(STATUS "Android: using platform-provided Vulkan (libvulkan.so)") + else() + find_package(Vulkan REQUIRED) + add_definitions(-DHYP_VULKAN=1) + set(HYP_VULKAN 1) + message(STATUS "Found Vulkan at: ${Vulkan_INCLUDE_DIRS} ${Vulkan_LIBRARIES}") + include_directories(BEFORE ${Vulkan_INCLUDE_DIRS}) + endif() elseif(RENDERING_BACKEND STREQUAL "DX12") - add_definitions(-DHYP_DX12=1) - set(HYP_DX12 1) + add_definitions(-DHYP_DX12=1) + set(HYP_DX12 1) - message(STATUS "Using DirectX 12 as rendering backend") + message(STATUS "Using DirectX 12 as rendering backend") - # check for D3D12MemoryAllocator ThirdParty module - if(EXISTS "${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator/CMakeLists.txt") - add_subdirectory(${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator ${CMAKE_BINARY_DIR}/ThirdParty/D3D12MemoryAllocator_build) + # check for D3D12MemoryAllocator ThirdParty module + if(EXISTS "${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator/CMakeLists.txt") + add_subdirectory(${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator ${CMAKE_BINARY_DIR}/ThirdParty/D3D12MemoryAllocator_build) - include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator/include) + include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/D3D12MemoryAllocator/include) - set(RENDERER_LIBRARIES + set(RENDERER_LIBRARIES ${RENDERER_LIBRARIES} D3D12MemoryAllocator) - endif() + endif() else() - message(FATAL_ERROR "No rendering backend found!") + message(FATAL_ERROR "No rendering backend found!") endif() # link glslang if vulkan rendering backend: if (RENDERING_BACKEND STREQUAL "Vulkan") - if (HYP_CLANG_WINDOWS) - message(STATUS "Building with Clang on Windows - not including glslang due to build issues with Clang on Windows. If you want to use glslang, build with MSVC or on another platform.") - endif() - - # if (${NATIVE} AND NOT HYP_IOS AND NOT HYP_ANDROID AND NOT HYP_CLANG_WINDOWS) - # # if glslang folder exists, link with it. - # if(EXISTS "${SUBMODULES_DIR}/glslang/glslang/CMakeLists.txt") - # set(HYP_GLSLANG 1) - - # add_definitions(-DHYP_GLSLANG=1) - # add_definitions(-DHYP_GLSLANG_MODIFICATIONS=1) - - # # Build glslang during CMake configuration time (not as part of the main build) - # # This keeps glslang completely separate from the VS solution / main project - # set(GLSLANG_BUILD_DIR "${CMAKE_BINARY_DIR}/glslang_build") - # set(GLSLANG_SOURCE_DIR "${SUBMODULES_DIR}/glslang") - - # # Check if glslang needs to be built (check for a marker file or key library) - # if(WIN32) - # set(GLSLANG_MARKER_LIB "${GLSLANG_BUILD_DIR}/glslang/Release/glslang.lib") - # else() - # set(GLSLANG_MARKER_LIB "${GLSLANG_BUILD_DIR}/glslang/libglslang.a") - # endif() - - # if(NOT EXISTS "${GLSLANG_MARKER_LIB}") - # message(STATUS "Building glslang...") - - # # Create the build directory if it doesn't exist - # file(MAKE_DIRECTORY ${GLSLANG_BUILD_DIR}) - - # # Configure glslang - # execute_process( - # COMMAND ${CMAKE_COMMAND} - # -S ${GLSLANG_SOURCE_DIR} - # -B ${GLSLANG_BUILD_DIR} - # -DCMAKE_BUILD_TYPE=Release - # -DGLSLANG_ENABLE_INSTALL=OFF - # -DGLSLANG_ENABLE_INSTALL_DEFAULT=OFF - # -DGLSLANG_TESTS=OFF - # -DENABLE_GLSLANG_BINARIES=OFF - # -DENABLE_OPT=OFF - # -DCMAKE_POSITION_INDEPENDENT_CODE=ON - # "-DCMAKE_CXX_FLAGS=-DHYP_GLSLANG_MODIFICATIONS=1" - # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - # RESULT_VARIABLE GLSLANG_CONFIGURE_RESULT - # ) - - # if(NOT GLSLANG_CONFIGURE_RESULT EQUAL 0) - # message(FATAL_ERROR "Failed to configure glslang (exit code: ${GLSLANG_CONFIGURE_RESULT})") - # endif() - - # # Build glslang - # execute_process( - # COMMAND ${CMAKE_COMMAND} --build ${GLSLANG_BUILD_DIR} --config Release --parallel - # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - # RESULT_VARIABLE GLSLANG_BUILD_RESULT - # ) - - # if(NOT GLSLANG_BUILD_RESULT EQUAL 0) - # message(FATAL_ERROR "Failed to build glslang (exit code: ${GLSLANG_BUILD_RESULT})") - # endif() - - # message(STATUS "glslang build completed successfully") - # else() - # message(STATUS "glslang already built, skipping rebuild") - # endif() - - # # Create imported targets for all the libraries we need - # add_library(glslang STATIC IMPORTED) - # add_library(SPIRV STATIC IMPORTED) - # add_library(glslang-default-resource-limits STATIC IMPORTED) - # # add_library(SPIRV-Tools STATIC IMPORTED) - # # add_library(SPIRV-Tools-opt STATIC IMPORTED) - # add_library(MachineIndependent STATIC IMPORTED) - # add_library(GenericCodeGen STATIC IMPORTED) - # add_library(OSDependent STATIC IMPORTED) - - # # Set the imported library locations - # if(WIN32) - # set_target_properties(glslang PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/glslang.lib - # ) - # set_target_properties(SPIRV PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/SPIRV/Release/SPIRV.lib - # ) - # set_target_properties(glslang-default-resource-limits PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/glslang-default-resource-limits.lib - # ) - # # set_target_properties(SPIRV-Tools PROPERTIES - # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/Release/SPIRV-Tools.lib - # # ) - # # set_target_properties(SPIRV-Tools-opt PROPERTIES - # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/opt/Release/SPIRV-Tools-opt.lib - # # ) - # set_target_properties(MachineIndependent PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/MachineIndependent.lib - # ) - # set_target_properties(GenericCodeGen PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/GenericCodeGen.lib - # ) - # set_target_properties(OSDependent PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/OSDependent/Windows/Release/OSDependent.lib - # ) - # else() - # set_target_properties(glslang PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libglslang.a - # ) - # set_target_properties(SPIRV PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/SPIRV/libSPIRV.a - # ) - # set_target_properties(glslang-default-resource-limits PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libglslang-default-resource-limits.a - # ) - # # set_target_properties(SPIRV-Tools PROPERTIES - # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/libSPIRV-Tools.a - # # ) - # # set_target_properties(SPIRV-Tools-opt PROPERTIES - # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/opt/libSPIRV-Tools-opt.a - # # ) - # set_target_properties(MachineIndependent PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libMachineIndependent.a - # ) - # set_target_properties(GenericCodeGen PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libGenericCodeGen.a - # ) - # set_target_properties(OSDependent PROPERTIES - # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/OSDependent/Unix/libOSDependent.a - # ) - # endif() - - # include_directories(BEFORE ${SUBMODULES_DIR}/glslang) - - # set(RENDERER_LIBRARIES - # ${RENDERER_LIBRARIES} - # glslang - # SPIRV - # glslang-default-resource-limits - # MachineIndependent - # GenericCodeGen - # OSDependent - # ) - # endif() - # endif() + if (HYP_CLANG_WINDOWS) + message(STATUS "Building with Clang on Windows - not including glslang due to build issues with Clang on Windows. If you want to use glslang, build with MSVC or on another platform.") + endif() + + # if (${NATIVE} AND NOT HYP_IOS AND NOT HYP_ANDROID AND NOT HYP_CLANG_WINDOWS) + # # if glslang folder exists, link with it. + # if(EXISTS "${SUBMODULES_DIR}/glslang/glslang/CMakeLists.txt") + # set(HYP_GLSLANG 1) + + # add_definitions(-DHYP_GLSLANG=1) + # add_definitions(-DHYP_GLSLANG_MODIFICATIONS=1) + + # # Build glslang during CMake configuration time (not as part of the main build) + # # This keeps glslang completely separate from the VS solution / main project + # set(GLSLANG_BUILD_DIR "${CMAKE_BINARY_DIR}/glslang_build") + # set(GLSLANG_SOURCE_DIR "${SUBMODULES_DIR}/glslang") + + # # Check if glslang needs to be built (check for a marker file or key library) + # if(WIN32) + # set(GLSLANG_MARKER_LIB "${GLSLANG_BUILD_DIR}/glslang/Release/glslang.lib") + # else() + # set(GLSLANG_MARKER_LIB "${GLSLANG_BUILD_DIR}/glslang/libglslang.a") + # endif() + + # if(NOT EXISTS "${GLSLANG_MARKER_LIB}") + # message(STATUS "Building glslang...") + + # # Create the build directory if it doesn't exist + # file(MAKE_DIRECTORY ${GLSLANG_BUILD_DIR}) + + # # Configure glslang + # execute_process( + # COMMAND ${CMAKE_COMMAND} + # -S ${GLSLANG_SOURCE_DIR} + # -B ${GLSLANG_BUILD_DIR} + # -DCMAKE_BUILD_TYPE=Release + # -DGLSLANG_ENABLE_INSTALL=OFF + # -DGLSLANG_ENABLE_INSTALL_DEFAULT=OFF + # -DGLSLANG_TESTS=OFF + # -DENABLE_GLSLANG_BINARIES=OFF + # -DENABLE_OPT=OFF + # -DCMAKE_POSITION_INDEPENDENT_CODE=ON + # "-DCMAKE_CXX_FLAGS=-DHYP_GLSLANG_MODIFICATIONS=1" + # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + # RESULT_VARIABLE GLSLANG_CONFIGURE_RESULT + # ) + + # if(NOT GLSLANG_CONFIGURE_RESULT EQUAL 0) + # message(FATAL_ERROR "Failed to configure glslang (exit code: ${GLSLANG_CONFIGURE_RESULT})") + # endif() + + # # Build glslang + # execute_process( + # COMMAND ${CMAKE_COMMAND} --build ${GLSLANG_BUILD_DIR} --config Release --parallel + # WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + # RESULT_VARIABLE GLSLANG_BUILD_RESULT + # ) + + # if(NOT GLSLANG_BUILD_RESULT EQUAL 0) + # message(FATAL_ERROR "Failed to build glslang (exit code: ${GLSLANG_BUILD_RESULT})") + # endif() + + # message(STATUS "glslang build completed successfully") + # else() + # message(STATUS "glslang already built, skipping rebuild") + # endif() + + # # Create imported targets for all the libraries we need + # add_library(glslang STATIC IMPORTED) + # add_library(SPIRV STATIC IMPORTED) + # add_library(glslang-default-resource-limits STATIC IMPORTED) + # # add_library(SPIRV-Tools STATIC IMPORTED) + # # add_library(SPIRV-Tools-opt STATIC IMPORTED) + # add_library(MachineIndependent STATIC IMPORTED) + # add_library(GenericCodeGen STATIC IMPORTED) + # add_library(OSDependent STATIC IMPORTED) + + # # Set the imported library locations + # if(WIN32) + # set_target_properties(glslang PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/glslang.lib + # ) + # set_target_properties(SPIRV PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/SPIRV/Release/SPIRV.lib + # ) + # set_target_properties(glslang-default-resource-limits PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/glslang-default-resource-limits.lib + # ) + # # set_target_properties(SPIRV-Tools PROPERTIES + # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/Release/SPIRV-Tools.lib + # # ) + # # set_target_properties(SPIRV-Tools-opt PROPERTIES + # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/opt/Release/SPIRV-Tools-opt.lib + # # ) + # set_target_properties(MachineIndependent PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/MachineIndependent.lib + # ) + # set_target_properties(GenericCodeGen PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/Release/GenericCodeGen.lib + # ) + # set_target_properties(OSDependent PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/OSDependent/Windows/Release/OSDependent.lib + # ) + # else() + # set_target_properties(glslang PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libglslang.a + # ) + # set_target_properties(SPIRV PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/SPIRV/libSPIRV.a + # ) + # set_target_properties(glslang-default-resource-limits PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libglslang-default-resource-limits.a + # ) + # # set_target_properties(SPIRV-Tools PROPERTIES + # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/libSPIRV-Tools.a + # # ) + # # set_target_properties(SPIRV-Tools-opt PROPERTIES + # # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/External/spirv-tools/source/opt/libSPIRV-Tools-opt.a + # # ) + # set_target_properties(MachineIndependent PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libMachineIndependent.a + # ) + # set_target_properties(GenericCodeGen PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/libGenericCodeGen.a + # ) + # set_target_properties(OSDependent PROPERTIES + # IMPORTED_LOCATION ${GLSLANG_BUILD_DIR}/glslang/OSDependent/Unix/libOSDependent.a + # ) + # endif() + + # include_directories(BEFORE ${SUBMODULES_DIR}/glslang) + + # set(RENDERER_LIBRARIES + # ${RENDERER_LIBRARIES} + # glslang + # SPIRV + # glslang-default-resource-limits + # MachineIndependent + # GenericCodeGen + # OSDependent + # ) + # endif() + # endif() elseif(RENDERING_BACKEND STREQUAL "DX12") - # add DirectX-Headers include dir if DX12 rendering backend - include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/DirectX-Headers) + # add DirectX-Headers include dir if DX12 rendering backend + include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/DirectX-Headers) endif() # setup DXC if found if(EXISTS "${THIRD_PARTY_INCLUDE_DIR}/dxc/dxcapi.h") - message(STATUS "DXC headers found, setting up DXC") + message(STATUS "DXC headers found, setting up DXC") - include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/dxc) + include_directories(BEFORE ${THIRD_PARTY_INCLUDE_DIR}/dxc) - if(WIN32) - set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/dxcompiler.lib") - set(DXC_DLL_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/dxcompiler.dll") - elseif(APPLE) - set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libdxcompiler.dylib") - else() - set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libdxcompiler.so") - endif() + if(WIN32) + set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/dxcompiler.lib") + set(DXC_DLL_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/dxcompiler.dll") + elseif(APPLE) + set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libdxcompiler.dylib") + else() + set(DXC_LIB_PATH "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/libdxcompiler.so") + endif() - if(EXISTS "${DXC_LIB_PATH}") - message(STATUS "DXC library found at ${DXC_LIB_PATH}, linking to it") + if(EXISTS "${DXC_LIB_PATH}") + message(STATUS "DXC library found at ${DXC_LIB_PATH}, linking to it") - set(RENDERER_LIBRARIES + set(RENDERER_LIBRARIES ${RENDERER_LIBRARIES} "${DXC_LIB_PATH}" ) - set(HYP_DXC 1) - add_definitions(-DHYP_DXC=1) + set(HYP_DXC 1) + add_definitions(-DHYP_DXC=1) - # copy the dll to the build directory if on Windows - if(WIN32) - file(COPY "${DXC_DLL_PATH}" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - endif() - else() - message(WARNING "DXC library not found at ${DXC_LIB_PATH}, skipping DXC setup") + # copy the dll to the build directory if on Windows + if(WIN32) + file(COPY "${DXC_DLL_PATH}" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) endif() + else() + message(WARNING "DXC library not found at ${DXC_LIB_PATH}, skipping DXC setup") + endif() else() - message(STATUS "DXC headers not found, skipping DXC setup") + message(STATUS "DXC headers not found, skipping DXC setup") endif() # if aftermath lib exists on windows, link to it if(WIN32) - if(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") - set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") - set(HYP_AFTERMATH 1) + if(EXISTS "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") + set(HYP_AFTERMATH 1) - # copy the dll to the build directory - file(COPY "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.dll" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) + # copy the dll to the build directory + file(COPY "${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.dll" DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) - message(STATUS "Aftermath found, linking to it") - else() - message(WARNING "Aftermath lib not found at ${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") - endif() + message(STATUS "Aftermath found, linking to it") + else() + message(WARNING "Aftermath lib not found at ${CMAKE_THIRD_PARTY_LIBRARY_DIRECTORY}/GFSDK_Aftermath_Lib.x64.lib") + endif() endif() add_subdirectory(${CMAKE_SOURCE_DIR}/Core ${CMAKE_BINARY_DIR}/Core) @@ -653,157 +653,157 @@ add_subdirectory(${CMAKE_SOURCE_DIR}/Lang ${CMAKE_BINARY_DIR}/Lang) function(collect_sources_and_modules dir out_sources out_headers out_modules) - set(local_sources "") - set(local_headers "") - set(local_modules "") - set(local_pchs "${HYP_PCH}") # start with global PCHs + set(local_sources "") + set(local_headers "") + set(local_modules "") + set(local_pchs "${HYP_PCH}") # start with global PCHs - # if the directory is system/platform/, skip it - if(${dir} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/.*" AND NOT ${dir} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/${HYP_PLATFORM_NAME_LOWER}") - message(STATUS "Skipping platform directory: ${dir}") - return() - endif() + # if the directory is system/platform/, skip it + if(${dir} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/.*" AND NOT ${dir} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/${HYP_PLATFORM_NAME_LOWER}") + message(STATUS "Skipping platform directory: ${dir}") + return() + endif() - file(GLOB current_sources RELATIVE ${CMAKE_SOURCE_DIR} + file(GLOB current_sources RELATIVE ${CMAKE_SOURCE_DIR} "${dir}/*.cpp" "${dir}/*.cxx" "${dir}/*.cc" "${dir}/*.c" "${dir}/*.mm" "${dir}/*.m") - list(APPEND local_sources ${current_sources}) - file(GLOB current_headers RELATIVE ${CMAKE_SOURCE_DIR} + list(APPEND local_sources ${current_sources}) + file(GLOB current_headers RELATIVE ${CMAKE_SOURCE_DIR} "${dir}/*.hpp" "${dir}/*.hxx" "${dir}/*.hh" "${dir}/*.h" "${dir}/*.inl" "${dir}/*.inc" "${dir}/*.hlsli") - list(APPEND local_headers ${current_headers}) + list(APPEND local_headers ${current_headers}) - # If this directory has a CMakeLists.txt, consider it a module - if(EXISTS "${dir}/CMakeLists.txt") - set(subdir_basename "") - set(sub_library_name "") - set(should_skip_module FALSE) - set(should_recurse TRUE) + # If this directory has a CMakeLists.txt, consider it a module + if(EXISTS "${dir}/CMakeLists.txt") + set(subdir_basename "") + set(sub_library_name "") + set(should_skip_module FALSE) + set(should_recurse TRUE) - string(REGEX MATCH "([^/]+)$" subdir_basename ${dir}) + string(REGEX MATCH "([^/]+)$" subdir_basename ${dir}) - if(${dir} MATCHES "CodeGen" OR ${dir} MATCHES "Sample") - return() - endif() + if(${dir} MATCHES "CodeGen" OR ${dir} MATCHES "Sample") + return() + endif() - # handle ThirdParty modules separately - if(dir MATCHES "ThirdParty") - return() - endif() + # handle ThirdParty modules separately + if(dir MATCHES "ThirdParty") + return() + endif() - if(dir MATCHES "editor" AND NOT HYP_EDITOR) - message(STATUS "Skipping editor module: ${dir}; HYP_EDITOR is not set") - set(should_skip_module TRUE) - endif() + if(dir MATCHES "editor" AND NOT HYP_EDITOR) + message(STATUS "Skipping editor module: ${dir}; HYP_EDITOR is not set") + set(should_skip_module TRUE) + endif() - if(dir MATCHES "dotnet/runtime") - set(sub_library_name "hyperion-dotnet-runtime") - elseif(dir MATCHES "dotnet/shared") - set(sub_library_name "hyperion-dotnet-shared") - elseif(dir MATCHES "dotnet/interop") - set(sub_library_name "hyperion-dotnet-interop") - elseif(dir MATCHES "dotnet/scripting") - set(sub_library_name "hyperion-dotnet-scripting") - elseif(dir MATCHES "rendering/vulkan" AND NOT RENDERING_BACKEND STREQUAL "Vulkan") - # Skip it - message(STATUS "Skipping Vulkan rendering module since Vulkan is not the selected rendering backend") - set(should_skip_module TRUE) - elseif(dir MATCHES "rendering/dx12" AND NOT RENDERING_BACKEND STREQUAL "DX12") - # Skip it - message(STATUS "Skipping DirectX 12 rendering module since DX12 is not the selected rendering backend") - set(should_skip_module TRUE) - else() - # the subfolder must contain a library with the name hyperion- - string(TOLOWER "${subdir_basename}" subdir_basename_lower) - set(sub_library_name "hyperion-${subdir_basename_lower}") - endif() + if(dir MATCHES "dotnet/runtime") + set(sub_library_name "hyperion-dotnet-runtime") + elseif(dir MATCHES "dotnet/shared") + set(sub_library_name "hyperion-dotnet-shared") + elseif(dir MATCHES "dotnet/interop") + set(sub_library_name "hyperion-dotnet-interop") + elseif(dir MATCHES "dotnet/scripting") + set(sub_library_name "hyperion-dotnet-scripting") + elseif(dir MATCHES "rendering/vulkan" AND NOT RENDERING_BACKEND STREQUAL "Vulkan") + # Skip it + message(STATUS "Skipping Vulkan rendering module since Vulkan is not the selected rendering backend") + set(should_skip_module TRUE) + elseif(dir MATCHES "rendering/dx12" AND NOT RENDERING_BACKEND STREQUAL "DX12") + # Skip it + message(STATUS "Skipping DirectX 12 rendering module since DX12 is not the selected rendering backend") + set(should_skip_module TRUE) + else() + # the subfolder must contain a library with the name hyperion- + string(TOLOWER "${subdir_basename}" subdir_basename_lower) + set(sub_library_name "hyperion-${subdir_basename_lower}") + endif() - # if should_skip_module was set, return early - if(should_skip_module) - return() - endif() + # if should_skip_module was set, return early + if(should_skip_module) + return() + endif() - list(APPEND local_modules ${sub_library_name}) + list(APPEND local_modules ${sub_library_name}) - # Find files ending with Pch.hpp to add to PCHs for this module - file(GLOB pch_files RELATIVE ${CMAKE_SOURCE_DIR} "${dir}/*Pch.hpp") + # Find files ending with Pch.hpp to add to PCHs for this module + file(GLOB pch_files RELATIVE ${CMAKE_SOURCE_DIR} "${dir}/*Pch.hpp") - if (pch_files) - message(STATUS "Found PCH files in ${dir}: ${pch_files}") - foreach(pch_file ${pch_files}) - list(APPEND local_pchs "${CMAKE_SOURCE_DIR}/${pch_file}") - endforeach() - endif() + if (pch_files) + message(STATUS "Found PCH files in ${dir}: ${pch_files}") + foreach(pch_file ${pch_files}) + list(APPEND local_pchs "${CMAKE_SOURCE_DIR}/${pch_file}") + endforeach() + endif() - # Recurse into children so nested modules with their own CMakeLists.txt get added - file(GLOB children LIST_DIRECTORIES true "${dir}/*") - foreach(child ${children}) - if(NOT child MATCHES "CodeGen" AND NOT child MATCHES "Sample") - if(IS_DIRECTORY "${child}") - collect_sources_and_modules("${child}" child_sources child_headers child_modules) - list(APPEND local_modules ${child_modules}) - - if(EXISTS "${child}/CMakeLists.txt") - # Treat child as its own module; do not pull its sources into this target - else() - list(APPEND local_sources ${child_sources}) - list(APPEND local_headers ${child_headers}) - endif() - endif() - endif() - endforeach() - - # Avoid double-adding targets if a nested CMakeLists already defined them - if(NOT TARGET ${sub_library_name}) - set("${sub_library_name}_SOURCES" ${local_sources}) - set("${sub_library_name}_HEADERS" ${local_headers}) - - # debugging android build intellisense errors: - if(NOT HYP_ANDROID) - set("${sub_library_name}_PCH" ${local_pchs}) - endif() - - message(STATUS "Adding subdirectory ${dir} as module ${sub_library_name}") - - add_subdirectory(${dir} ${CMAKE_BINARY_DIR}/${subdir_basename}) - else() - message(STATUS "Skipping add_subdirectory for ${dir} (target ${sub_library_name} already exists)") + # Recurse into children so nested modules with their own CMakeLists.txt get added + file(GLOB children LIST_DIRECTORIES true "${dir}/*") + foreach(child ${children}) + if(NOT child MATCHES "CodeGen" AND NOT child MATCHES "Sample") + if(IS_DIRECTORY "${child}") + collect_sources_and_modules("${child}" child_sources child_headers child_modules) + list(APPEND local_modules ${child_modules}) + + if(EXISTS "${child}/CMakeLists.txt") + # Treat child as its own module; do not pull its sources into this target + else() + list(APPEND local_sources ${child_sources}) + list(APPEND local_headers ${child_headers}) + endif() endif() + endif() + endforeach() + + # Avoid double-adding targets if a nested CMakeLists already defined them + if(NOT TARGET ${sub_library_name}) + set("${sub_library_name}_SOURCES" ${local_sources}) + set("${sub_library_name}_HEADERS" ${local_headers}) - set(${out_sources} "${local_sources}" PARENT_SCOPE) - set(${out_headers} "${local_headers}" PARENT_SCOPE) - set(${out_modules} "${local_modules}" PARENT_SCOPE) + # debugging android build intellisense errors: + if(NOT HYP_ANDROID) + set("${sub_library_name}_PCH" ${local_pchs}) + endif() - source_group("${sub_library_name} Library Code" FILES ${local_sources} ${local_headers}) + message(STATUS "Adding subdirectory ${dir} as module ${sub_library_name}") + + add_subdirectory(${dir} ${CMAKE_BINARY_DIR}/${subdir_basename}) else() - file(GLOB children LIST_DIRECTORIES true "${dir}/*") - foreach(child ${children}) - if(NOT child MATCHES "CodeGen" AND NOT child MATCHES "Sample") - if(IS_DIRECTORY "${child}") - if(EXISTS "${child}/CMakeLists.txt") - # Treat child as its own module; do not pull its sources into this target - collect_sources_and_modules("${child}" child_sources child_headers child_modules) - list(APPEND local_modules ${child_modules}) - - # Remove any files from this module directory that were already added - file(GLOB_RECURSE child_all_sources RELATIVE ${CMAKE_SOURCE_DIR} + message(STATUS "Skipping add_subdirectory for ${dir} (target ${sub_library_name} already exists)") + endif() + + set(${out_sources} "${local_sources}" PARENT_SCOPE) + set(${out_headers} "${local_headers}" PARENT_SCOPE) + set(${out_modules} "${local_modules}" PARENT_SCOPE) + + source_group("${sub_library_name} Library Code" FILES ${local_sources} ${local_headers}) + else() + file(GLOB children LIST_DIRECTORIES true "${dir}/*") + foreach(child ${children}) + if(NOT child MATCHES "CodeGen" AND NOT child MATCHES "Sample") + if(IS_DIRECTORY "${child}") + if(EXISTS "${child}/CMakeLists.txt") + # Treat child as its own module; do not pull its sources into this target + collect_sources_and_modules("${child}" child_sources child_headers child_modules) + list(APPEND local_modules ${child_modules}) + + # Remove any files from this module directory that were already added + file(GLOB_RECURSE child_all_sources RELATIVE ${CMAKE_SOURCE_DIR} "${child}/*.cpp" "${child}/*.cxx" "${child}/*.cc" "${child}/*.c" "${child}/*.mm" "${child}/*.m") - file(GLOB_RECURSE child_all_headers RELATIVE ${CMAKE_SOURCE_DIR} + file(GLOB_RECURSE child_all_headers RELATIVE ${CMAKE_SOURCE_DIR} "${child}/*.hpp" "${child}/*.hxx" "${child}/*.hh" "${child}/*.h" "${child}/*.inl" "${child}/*.inc" "${child}/*.hlsli") - list(REMOVE_ITEM local_sources ${child_all_sources}) - list(REMOVE_ITEM local_headers ${child_all_headers}) - else() - collect_sources_and_modules("${child}" child_sources child_headers child_modules) - list(APPEND local_sources ${child_sources}) - list(APPEND local_headers ${child_headers}) - list(APPEND local_modules ${child_modules}) - endif() - endif() - endif() - endforeach() - - set(${out_sources} "${local_sources}" PARENT_SCOPE) - set(${out_headers} "${local_headers}" PARENT_SCOPE) - set(${out_modules} "${local_modules}" PARENT_SCOPE) - endif() + list(REMOVE_ITEM local_sources ${child_all_sources}) + list(REMOVE_ITEM local_headers ${child_all_headers}) + else() + collect_sources_and_modules("${child}" child_sources child_headers child_modules) + list(APPEND local_sources ${child_sources}) + list(APPEND local_headers ${child_headers}) + list(APPEND local_modules ${child_modules}) + endif() + endif() + endif() + endforeach() + + set(${out_sources} "${local_sources}" PARENT_SCOPE) + set(${out_headers} "${local_headers}" PARENT_SCOPE) + set(${out_modules} "${local_modules}" PARENT_SCOPE) + endif() endfunction() set(SUB_LIBRARIES "") @@ -830,32 +830,32 @@ source_group(TREE ${THIRD_PARTY_INCLUDE_DIR} PREFIX "Third-Party Code" FILES ${T # platform specific system stuff file(GLOB_RECURSE PLATFORM_FILES "${CMAKE_SOURCE_DIR}/Engine/system/platform/**/*") foreach(PLATFORM_FILE ${PLATFORM_FILES}) - if(NOT ${PLATFORM_FILE} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/${HYP_PLATFORM_NAME_LOWER}") - list(REMOVE_ITEM SOURCES ${PLATFORM_FILE}) - list(REMOVE_ITEM HEADERS ${PLATFORM_FILE}) - endif() + if(NOT ${PLATFORM_FILE} MATCHES "${CMAKE_SOURCE_DIR}/Engine/system/platform/${HYP_PLATFORM_NAME_LOWER}") + list(REMOVE_ITEM SOURCES ${PLATFORM_FILE}) + list(REMOVE_ITEM HEADERS ${PLATFORM_FILE}) + endif() endforeach() # include shader files in the sln file(GLOB_RECURSE SHADER_FILES "${CMAKE_SOURCE_DIR}/Shaders/*") # we don't want to build shader files to be compiled by fxc but we want them in the solution foreach(SHADER_FILE ${SHADER_FILES}) - source_group("Shader Code" FILES ${SHADER_FILE}) + source_group("Shader Code" FILES ${SHADER_FILE}) - if(HYP_MSVC OR HYP_CLANG_WINDOWS) - set_property(SOURCE ${SHADER_FILE} PROPERTY VS_TOOL_OVERRIDE "None") - endif() + if(HYP_MSVC OR HYP_CLANG_WINDOWS) + set_property(SOURCE ${SHADER_FILE} PROPERTY VS_TOOL_OVERRIDE "None") + endif() - # add to sources so they appear in the solution - list(APPEND SOURCES ${SHADER_FILE}) + # add to sources so they appear in the solution + list(APPEND SOURCES ${SHADER_FILE}) - message(STATUS "Adding shader file to solution: ${SHADER_FILE}") + message(STATUS "Adding shader file to solution: ${SHADER_FILE}") endforeach() include_directories(${CMAKE_SOURCE_DIR}/Shaders) # so VS can find them for intellisense if (${HYP_PLATFORM_NAME} STREQUAL "Mac") - # link with libraries to allow NSAlert and NSString - set(COMMON_LIBRARIES + # link with libraries to allow NSAlert and NSString + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} "-framework Cocoa" "-framework Foundation" @@ -865,12 +865,12 @@ if (${HYP_PLATFORM_NAME} STREQUAL "Mac") endif() if (${NATIVE} AND NOT ${HYP_PLATFORM_NAME} STREQUAL "iOS" AND NOT HYP_ANDROID) - if(EXISTS "${SUBMODULES_DIR}/libdatachannel/CMakeLists.txt") - add_definitions(-DHYP_LIBDATACHANNEL=1) + if(EXISTS "${SUBMODULES_DIR}/libdatachannel/CMakeLists.txt") + add_definitions(-DHYP_LIBDATACHANNEL=1) - # Build libdatachannel as external project (only for VS and Xcode) - if(HYP_MSVC) # OR CMAKE_GENERATOR STREQUAL "Xcode" - ExternalProject_Add(libdatachannel_external + # Build libdatachannel as external project (only for VS and Xcode) + if(HYP_MSVC) # OR CMAKE_GENERATOR STREQUAL "Xcode" + ExternalProject_Add(libdatachannel_external SOURCE_DIR ${SUBMODULES_DIR}/libdatachannel CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} @@ -881,40 +881,40 @@ if (${NATIVE} AND NOT ${HYP_PLATFORM_NAME} STREQUAL "iOS" AND NOT HYP_ANDROID) EXCLUDE_FROM_ALL TRUE ) - # Create imported target - ExternalProject_Get_Property(libdatachannel_external BINARY_DIR) + # Create imported target + ExternalProject_Get_Property(libdatachannel_external BINARY_DIR) - add_library(datachannel-static STATIC IMPORTED) - add_dependencies(datachannel-static libdatachannel_external) + add_library(datachannel-static STATIC IMPORTED) + add_dependencies(datachannel-static libdatachannel_external) - if(WIN32) - set_target_properties(datachannel-static PROPERTIES + if(WIN32) + set_target_properties(datachannel-static PROPERTIES IMPORTED_LOCATION ${BINARY_DIR}/${CMAKE_BUILD_TYPE}/datachannel-static.lib ) - else() - set_target_properties(datachannel-static PROPERTIES + else() + set_target_properties(datachannel-static PROPERTIES IMPORTED_LOCATION ${BINARY_DIR}/libdatachannel-static.a ) - endif() + endif() - include_directories(${SUBMODULES_DIR}/libdatachannel/include) + include_directories(${SUBMODULES_DIR}/libdatachannel/include) - set(COMMON_LIBRARIES + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} datachannel-static ) - else() - # For other generators (Makefiles, Ninja, etc.), use add_subdirectory - add_subdirectory(${SUBMODULES_DIR}/libdatachannel EXCLUDE_FROM_ALL) + else() + # For other generators (Makefiles, Ninja, etc.), use add_subdirectory + add_subdirectory(${SUBMODULES_DIR}/libdatachannel EXCLUDE_FROM_ALL) - include_directories(${SUBMODULES_DIR}/libdatachannel/include) + include_directories(${SUBMODULES_DIR}/libdatachannel/include) - set(COMMON_LIBRARIES + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} datachannel-static ) - endif() endif() + endif() endif() # # if submodule 'oidn' exists , link with it @@ -932,30 +932,30 @@ endif() # if Win32, link with DbgHelp if(HYP_WINDOWS) - set(COMMON_LIBRARIES ${COMMON_LIBRARIES} DbgHelp dwmapi) + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} DbgHelp dwmapi) endif() if(HYP_ANDROID) - set(COMMON_LIBRARIES ${COMMON_LIBRARIES} android log) + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} android log) endif() if(NOT IOS) - # if(GST_FOUND) - # add_definitions(-DHYP_GSTREAMER=1) - # add_definitions(-DHYP_GSTREAMER_BIN_DIR="Z:/gstreamer/1.0/msvc_x86_64/bin") + # if(GST_FOUND) + # add_definitions(-DHYP_GSTREAMER=1) + # add_definitions(-DHYP_GSTREAMER_BIN_DIR="Z:/gstreamer/1.0/msvc_x86_64/bin") - # include_directories(${GST_INCLUDE_DIRS}) - # link_directories(${GST_LIBRARY_DIRS}) + # include_directories(${GST_INCLUDE_DIRS}) + # link_directories(${GST_LIBRARY_DIRS}) - # # target_link_libraries(${BUILD_NAME} PRIVATE ${GST_LIBRARIES}) + # # target_link_libraries(${BUILD_NAME} PRIVATE ${GST_LIBRARIES}) - # message(STATUS "GStreamer found, linking to it: ${GST_LIBRARIES}\nInclude directories: ${GST_INCLUDE_DIRS}") + # message(STATUS "GStreamer found, linking to it: ${GST_LIBRARIES}\nInclude directories: ${GST_INCLUDE_DIRS}") - # set(COMMON_LIBRARIES - # ${COMMON_LIBRARIES} - # ${GST_LIBRARIES} - # ) - # endif() + # set(COMMON_LIBRARIES + # ${COMMON_LIBRARIES} + # ${GST_LIBRARIES} + # ) + # endif() endif() # set to empty list @@ -970,7 +970,7 @@ include_directories( ) if(NOT HYP_WINDOWS AND NOT HYP_ANDROID) - include_directories(${SDL2_INCLUDE_DIRS}) + include_directories(${SDL2_INCLUDE_DIRS}) endif() # set HYP_BUILD_LIBRARY just for this library (so DLL exports are correct) @@ -981,10 +981,10 @@ message(STATUS "Reflection generated sources directory: ${HYP_GENERATED_DIR}") source_group(TREE ${HYP_GENERATED_DIR} PREFIX "Generated Code" FILES ${REFLECTION_GENERATED_SOURCES}) if(HYP_DEBUG_MODE) - # make sure generated sources are compiled without debug info - they are large and slow down debug builds - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") - set_source_files_properties(${REFLECTION_GENERATED_SOURCES} PROPERTIES COMPILE_FLAGS "-g0") - endif() + # make sure generated sources are compiled without debug info - they are large and slow down debug builds + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + set_source_files_properties(${REFLECTION_GENERATED_SOURCES} PROPERTIES COMPILE_FLAGS "-g0") + endif() endif() set(SOURCES ${SOURCES} ${REFLECTION_GENERATED_SOURCES}) @@ -1003,12 +1003,12 @@ add_library(${BUILD_NAME} SHARED ${SOURCES} ${HEADERS}) # PCHs # debugging android build intellisense errors: if(NOT HYP_ANDROID) - target_precompile_headers(${BUILD_NAME} PRIVATE ${HYP_PCH}) + target_precompile_headers(${BUILD_NAME} PRIVATE ${HYP_PCH}) endif() # if XCode: set the PCH file for the target if(APPLE AND CMAKE_GENERATOR STREQUAL "Xcode") - set_target_properties(${BUILD_NAME} PROPERTIES + set_target_properties(${BUILD_NAME} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES" XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_SOURCE_DIR}/Engine/HyperionPch.hpp" ) @@ -1021,7 +1021,7 @@ set(COMMON_LIBRARIES ) if(NOT HYP_WINDOWS AND NOT HYP_ANDROID) - set(COMMON_LIBRARIES + set(COMMON_LIBRARIES ${COMMON_LIBRARIES} ${SDL2_LIBRARIES} ) @@ -1035,40 +1035,40 @@ target_link_libraries(${BUILD_NAME} PUBLIC hyperion-script) #Lang # add sublibraries as dependencies so any changes get picked up. foreach(SUB_LIBRARY ${SUB_LIBRARIES}) - add_dependencies(${BUILD_NAME} ${SUB_LIBRARY}) + add_dependencies(${BUILD_NAME} ${SUB_LIBRARY}) endforeach() if(APPLE) - # needs to use -force_load on macOS for static libraries to re-export symbols correctly - # for the Hyperion.NET assemblies, since we define functions for P/Invoke there. - foreach(SUB_LIBRARY ${SUB_LIBRARIES}) - if (SUB_LIBRARY MATCHES "hyperion-dotnet-.*" OR SUB_LIBRARY MATCHES "hyperion-editor") - target_link_libraries(${BUILD_NAME} PRIVATE -force_load $) - else() - target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARY}) - endif() - endforeach() + # needs to use -force_load on macOS for static libraries to re-export symbols correctly + # for the Hyperion.NET assemblies, since we define functions for P/Invoke there. + foreach(SUB_LIBRARY ${SUB_LIBRARIES}) + if (SUB_LIBRARY MATCHES "hyperion-dotnet-.*" OR SUB_LIBRARY MATCHES "hyperion-editor") + target_link_libraries(${BUILD_NAME} PRIVATE -force_load $) + else() + target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARY}) + endif() + endforeach() elseif(HYP_MSVC OR HYP_CLANG_WINDOWS) - # needs to use /WHOLEARCHIVE on Windows for emulating the above behavior - foreach(SUB_LIBRARY ${SUB_LIBRARIES}) - if (SUB_LIBRARY MATCHES "hyperion-dotnet-.*" OR SUB_LIBRARY MATCHES "hyperion-editor") - target_link_options(${BUILD_NAME} PRIVATE "/WHOLEARCHIVE:$") - else() - target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARY}) - endif() - endforeach() + # needs to use /WHOLEARCHIVE on Windows for emulating the above behavior + foreach(SUB_LIBRARY ${SUB_LIBRARIES}) + if (SUB_LIBRARY MATCHES "hyperion-dotnet-.*" OR SUB_LIBRARY MATCHES "hyperion-editor") + target_link_options(${BUILD_NAME} PRIVATE "/WHOLEARCHIVE:$") + else() + target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARY}) + endif() + endforeach() else() - target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARIES}) + target_link_libraries(${BUILD_NAME} PRIVATE ${SUB_LIBRARIES}) endif() # Add dependencies on external projects to ensure they're built before the main library if(TARGET libdatachannel_external) - add_dependencies(${BUILD_NAME} libdatachannel_external) + add_dependencies(${BUILD_NAME} libdatachannel_external) endif() if(TARGET webgpu_external) - add_dependencies(${BUILD_NAME} webgpu_external) + add_dependencies(${BUILD_NAME} webgpu_external) endif() add_definitions(${GCC_COVERAGE_COMPILE_FLAGS}) @@ -1080,7 +1080,7 @@ add_subdirectory(Sample) # If editor build, add the commandlet targets. # otherwise, we don't want 'em if(HYP_EDITOR) - add_subdirectory(Commandlets) + add_subdirectory(Commandlets) endif() # # copy sample scripts to the output directory diff --git a/Source/Core/CMakeLists.txt b/Source/Core/CMakeLists.txt index dd5a89ee14..6b5e4a21ab 100644 --- a/Source/Core/CMakeLists.txt +++ b/Source/Core/CMakeLists.txt @@ -20,10 +20,17 @@ set(COMMON_LIBRARIES ) if(HYPERION_ENGINE) - message(STATUS "Building hyperion-core for the engine, setting HYPERION_ENGINE=1") + message(STATUS "Building hyperion-core for the engine, setting HYPERION_ENGINE=1 in Core.") add_definitions(-DHYPERION_ENGINE=1) endif() +message(STATUS "HYP_PLATFORM_NAME: ${HYP_PLATFORM_NAME}") + +if(HYP_PLATFORM_NAME STREQUAL "Android") + message(STATUS "Building for Android, setting HYP_ANDROID=1 in Core.") + add_definitions(-DHYP_ANDROID=1) +endif() + find_package(Threads REQUIRED) find_package(ZLIB) diff --git a/Source/Core/Constants.hpp b/Source/Core/Constants.hpp index e6c1f2c1bf..708ba49b64 100644 --- a/Source/Core/Constants.hpp +++ b/Source/Core/Constants.hpp @@ -40,7 +40,6 @@ constexpr uint32 NumFramesInFlight = 3; constexpr uint32 NumAsyncCommandBuffers = 4; constexpr uint32 NumRendererWorkerThreads = 2; -constexpr uint32 NumForegroundWorkerThreads = 3; constexpr uint32 MaxBackgroundWorkerThreads = 4; // Constants for types that have a global structured buffer. diff --git a/Source/Core/Core.cpp b/Source/Core/Core.cpp index 4e778d09d1..c378f82ff9 100644 --- a/Source/Core/Core.cpp +++ b/Source/Core/Core.cpp @@ -103,9 +103,10 @@ const CommandLineArgumentDefinitions& DefaultCommandLineArgumentDefinitions() definitions.Add("ResX", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::INTEGER); definitions.Add("ResY", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::INTEGER); definitions.Add("Headless", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::BOOLEAN, false); + definitions.Add("HighDPI", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::BOOLEAN, false); definitions.Add("Detached", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::BOOLEAN, false); definitions.Add("Editor", {}, {}, CommandLineArgumentFlags::NONE, CommandLineArgumentType::BOOLEAN, false); - definitions.Add("Commandlet", "c", "Execute the commandlet with the given name immediately following -Commandlet. The program will end immediately after running the commandlet and return 0 upon success or otherwise on failure", CommandLineArgumentFlags::NONE, CommandLineArgumentType::STRING); + definitions.Add("exec", "", "Execute the commandlet with the given name immediately following --exec. The program will end immediately after running the commandlet and return 0 upon success or otherwise on failure", CommandLineArgumentFlags::NONE, CommandLineArgumentType::STRING); definitions.Add("RenderOnMainThread", {}, @@ -145,7 +146,7 @@ bool Initialize(int argc, char** argv) CommandLineParser argParse { &DefaultCommandLineArgumentDefinitions() }; - TResult parseResult = argParse.Parse(argc, argv); + TResult parseResult = argParse.Parse(argc, argv, false); if (parseResult.HasError()) { @@ -161,11 +162,13 @@ bool Initialize(int argc, char** argv) s_commandLineArguments = CommandLineArguments::Merge(*argParse.GetDefinitions(), s_commandLineArguments, *parseResult); GlobalConfig config { "GlobalConfig" }; + config.Load(); config.LogErrors(stderr); if (JSON::Value configArgs = config.Get("App.Args")) { JSON::JString configArgsString = configArgs.ToString(); + Array configArgsStringSplit = Map( configArgsString.Split(' '), [](auto&& str) @@ -173,15 +176,17 @@ bool Initialize(int argc, char** argv) return str.ToUtf8(); }); - parseResult = argParse.Parse(s_commandLineArguments.GetCommand(), configArgsStringSplit); + parseResult = argParse.Parse(s_commandLineArguments.GetCommand(), configArgsStringSplit, false); if (!parseResult.HasError()) { - // merge argv last so that they may be override what's in the config. + // merge argv last so that they may override what's in the config. s_commandLineArguments = CommandLineArguments::Merge(*argParse.GetDefinitions(), *parseResult, s_commandLineArguments); } } + argParse.ApplyDefaults(s_commandLineArguments); + return true; } diff --git a/Source/Core/Types.hpp b/Source/Core/Types.hpp index aaa3e24502..5baa4d2131 100644 --- a/Source/Core/Types.hpp +++ b/Source/Core/Types.hpp @@ -2,7 +2,7 @@ * @author: The Hyperion Contributors * @date 2016-2026 * @licence MIT -*/ + */ #pragma once diff --git a/Source/Core/Util.hpp b/Source/Core/Util.hpp index d2916d7c0a..0317011ae0 100644 --- a/Source/Core/Util.hpp +++ b/Source/Core/Util.hpp @@ -336,6 +336,16 @@ struct NoOpFunction } }; +template <> +struct NoOpFunction +{ + template + HYP_FORCE_INLINE constexpr void operator()(Args&&...) const + { + // do nothing + } +}; + #pragma endregion Misc utilities /*! \brief Size of an array literal (Hyperion equivalent of std::size) */ diff --git a/Source/Core/cli/CommandLine.cpp b/Source/Core/cli/CommandLine.cpp index 33e1597c42..118f81dea3 100644 --- a/Source/Core/cli/CommandLine.cpp +++ b/Source/Core/cli/CommandLine.cpp @@ -123,8 +123,8 @@ TResult CommandLineArguments::ParseArgumentValue(const if (!parseResult.ok) { - // If string, allow unquoted on parse error - if (type == CommandLineArgumentType::STRING) + // If string or enum, allow unquoted on parse error + if (type == CommandLineArgumentType::STRING || type == CommandLineArgumentType::ENUM) { return JSON::Value(JSON::JString(str)); } @@ -174,8 +174,6 @@ TResult CommandLineArguments::ParseArgumentValue(const return JSON::Value(value.ToBool()); case CommandLineArgumentType::ENUM: { - JSON::JString stringValue = value.ToString(); - const Array* enumValues = definition.enumValues.TryGet(); if (!enumValues) @@ -183,16 +181,41 @@ TResult CommandLineArguments::ParseArgumentValue(const return HYP_MAKE_ERROR(Error, "Internal error parsing enum argument"); } - if (!enumValues->Contains(stringValue)) + // For ALLOW_MULTIPLE, the value should be a comma-separated list + if (definition.flags[CommandLineArgumentFlags::ALLOW_MULTIPLE]) { - return HYP_MAKE_ERROR(Error, "Not a valid value for argument"); + Array parts = value.ToString().Split(','); + JSON::JArray result; + + for (String& part : parts) + { + part = part.Trimmed(); + + if (!enumValues->Contains(part)) + { + return HYP_MAKE_ERROR(Error, "Not a valid value for argument: {}", part); + } + + result.PushBack(JSON::Value(part)); + } + + return JSON::Value(std::move(result)); } + else + { + JSON::JString stringValue = value.ToString(); + + if (!enumValues->Contains(stringValue)) + { + return HYP_MAKE_ERROR(Error, "Not a valid value for argument: {}", stringValue); + } - return JSON::Value(std::move(stringValue)); + return JSON::Value(std::move(stringValue)); + } } + default: + return HYP_MAKE_ERROR(Error, "Invalid argument: {}", value.ToString(/* representation */ true)); } - - return HYP_MAKE_ERROR(Error, "Invalid argument"); } #pragma endregion CommandLineArguments @@ -390,7 +413,7 @@ CommandLineArgumentDefinitions& CommandLineArgumentDefinitions::Add( #pragma region CommandLineParser -TResult CommandLineParser::Parse(const String& commandLine) const +TResult CommandLineParser::Parse(const String& commandLine, bool fillDefaults) const { ANSIString command; Array args; @@ -450,10 +473,10 @@ TResult CommandLineParser::Parse(const String& commandLine AddCurrentString(); - return Parse(command, args); + return Parse(command, args, fillDefaults); } -TResult CommandLineParser::Parse(int argc, char** argv) const +TResult CommandLineParser::Parse(int argc, char** argv, bool fillDefaults) const { if (argc < 1) { @@ -467,10 +490,10 @@ TResult CommandLineParser::Parse(int argc, char** argv) co args.PushBack(argv[i]); } - return Parse(argv[0], args); + return Parse(argv[0], args, fillDefaults); } -TResult CommandLineParser::Parse(ANSIStringView command, const Array& args) const +TResult CommandLineParser::Parse(ANSIStringView command, const Array& args, bool fillDefaults) const { if (!m_definitions) { @@ -498,7 +521,7 @@ TResult CommandLineParser::Parse(ANSIStringView command, c } else { - return HYP_MAKE_ERROR(Error, "Invalid argument"); + return HYP_MAKE_ERROR(Error, "Invalid argument: {}", arg); } auto it = m_definitions->Find(arg); @@ -549,29 +572,54 @@ TResult CommandLineParser::Parse(ANSIStringView command, c AppendCommandLineArgumentValue(result.m_values, arg, std::move(parsedValue.GetValue()), allowMultiple); } - for (const CommandLineArgumentDefinition& def : *m_definitions) + if (fillDefaults) { - const bool allowMultiple = def.flags[CommandLineArgumentFlags::ALLOW_MULTIPLE]; - - if (usedArguments.Contains(def.name)) + for (const CommandLineArgumentDefinition& def : *m_definitions) { - continue; + const bool allowMultiple = def.flags[CommandLineArgumentFlags::ALLOW_MULTIPLE]; + + if (usedArguments.Contains(def.name)) + { + continue; + } + + if (def.flags[CommandLineArgumentFlags::REQUIRED] && (!def.defaultValue.HasValue() || def.defaultValue->IsNullOrUndefined())) + { + return HYP_MAKE_ERROR(Error, "Missing value for required argument: {}", def.name); + } + + if (def.defaultValue.HasValue()) + { + AppendCommandLineArgumentValue(result.m_values, def.name, *def.defaultValue, allowMultiple); + + continue; + } } + } + + return result; +} + +void CommandLineParser::ApplyDefaults(CommandLineArguments& args) const +{ + if (!m_definitions) + { + return; + } - if (def.flags[CommandLineArgumentFlags::REQUIRED] && (!def.defaultValue.HasValue() || def.defaultValue->IsNullOrUndefined())) + for (const CommandLineArgumentDefinition& def : *m_definitions) + { + if (args.Contains(def.name)) { - return HYP_MAKE_ERROR(Error, "Missing value for required argument: {}", def.name); + continue; } if (def.defaultValue.HasValue()) { - AppendCommandLineArgumentValue(result.m_values, def.name, *def.defaultValue, allowMultiple); - - continue; + const bool allowMultiple = def.flags[CommandLineArgumentFlags::ALLOW_MULTIPLE]; + AppendCommandLineArgumentValue(args.m_values, def.name, *def.defaultValue, allowMultiple); } } - - return result; } #pragma endregion CommandLineParser diff --git a/Source/Core/cli/CommandLine.hpp b/Source/Core/cli/CommandLine.hpp index b84a05e0e4..a31087f0d2 100644 --- a/Source/Core/cli/CommandLine.hpp +++ b/Source/Core/cli/CommandLine.hpp @@ -236,9 +236,11 @@ class CommandLineParser return m_definitions; } - HYP_API TResult Parse(const String& commandLine) const; - HYP_API TResult Parse(int argc, char** argv) const; - HYP_API TResult Parse(ANSIStringView command, const Array& args) const; + HYP_API TResult Parse(const String& commandLine, bool fillDefaults = true) const; + HYP_API TResult Parse(int argc, char** argv, bool fillDefaults = true) const; + HYP_API TResult Parse(ANSIStringView command, const Array& args, bool fillDefaults = true) const; + + void ApplyDefaults(CommandLineArguments& args) const; private: const CommandLineArgumentDefinitions* m_definitions; diff --git a/Source/Core/config/Config.cpp b/Source/Core/config/Config.cpp index 329e848e52..dc4e841786 100644 --- a/Source/Core/config/Config.cpp +++ b/Source/Core/config/Config.cpp @@ -136,7 +136,8 @@ Result ConfigBase::Read(JSON::Value& outValue) const return HYP_MAKE_ERROR(Error, "Failed to open configuration file at {}", configPath); } - String configStr = String(stream.Read().ToByteView()); + ByteBuffer buffer = stream.Read(); + String configStr = String(buffer.ToByteView()); JSON::ParseResult parseResult = JSON::Parse(configStr); diff --git a/Source/Core/containers/Array.hpp b/Source/Core/containers/Array.hpp index 45d9f790f7..04a55b24df 100644 --- a/Source/Core/containers/Array.hpp +++ b/Source/Core/containers/Array.hpp @@ -83,51 +83,33 @@ class Array : public ContainerBase, size_t> template , typename = std::enable_if_t> Array() : m_size(0), - m_startOffset(0), - m_pAllocator(GetDefaultAllocatorInstance()) + m_startOffset(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); } Array(const Array& other); Array(Array&& other) noexcept; - explicit Array(AllocatorType* pAllocator, size_t size = 0) - : m_size(0), - m_startOffset(0), - m_pAllocator(pAllocator) - { - HYP_CORE_ASSERT(pAllocator != nullptr); - - m_allocation.SetToInitialState(); - - if (size != 0) - { - Resize(size); - } - } - template , typename = std::enable_if_t> explicit Array(size_t size) : Array() { Resize(size); } - + template , typename = std::enable_if_t> Array(Span span) : Array(span.Data(), span.Size()) { } - + template , typename = std::enable_if_t> Array(Span span) : Array(span.Data(), span.Size()) { } - + template , typename = std::enable_if_t> Array(T const (&items)[Sz]) : Array() @@ -141,7 +123,7 @@ class Array : public ContainerBase, size_t> Memory::Construct(storagePtr++, items[i]); } } - + template , typename = std::enable_if_t> Array(T (&&items)[Sz]) : Array() @@ -155,13 +137,13 @@ class Array : public ContainerBase, size_t> Memory::Construct(storagePtr++, std::move(items[i])); } } - + template , typename = std::enable_if_t> Array(const FixedArray& items) : Array(items.Begin(), items.End()) { } - + template , typename = std::enable_if_t> Array(FixedArray&& items) : Array() @@ -175,7 +157,7 @@ class Array : public ContainerBase, size_t> Memory::Construct(storagePtr++, std::move(items[i])); } } - + template , typename = std::enable_if_t> Array(T* ptr, size_t size) : Array() @@ -207,7 +189,7 @@ class Array : public ContainerBase, size_t> Memory::Construct(storagePtr++, *it); } } - + template , typename = std::enable_if_t> Array(ConstIterator first, ConstIterator last) : Array() @@ -222,13 +204,13 @@ class Array : public ContainerBase, size_t> Memory::Construct(storagePtr++, *it); } } - + template , typename = std::enable_if_t> Array(const T* ptr, size_t size) : Array(ptr, ptr + size) { } - + template , typename = std::enable_if_t> Array(std::initializer_list initializerList) : Array(initializerList.begin(), initializerList.end()) @@ -241,7 +223,7 @@ class Array : public ContainerBase, size_t> { m_size = other.Size(); - m_allocation.Allocate(m_pAllocator, m_size); + m_allocation.Allocate(GetAllocator(), m_size); m_allocation.InitFromRangeCopy(other.Begin(), other.End()); } @@ -737,30 +719,32 @@ class Array : public ContainerBase, size_t> protected: size_t m_startOffset; - AllocatorType* const m_pAllocator; + HYP_FORCE_INLINE static AllocatorType* GetAllocator() + { + return GetDefaultAllocatorInstance(); + } + Allocation m_allocation; }; template Array::Array(const Array& other) : m_size(other.m_size - other.m_startOffset), - m_startOffset(0), - m_pAllocator(other.m_pAllocator) + m_startOffset(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); + HYP_CORE_ASSERT(GetAllocator() != nullptr); m_allocation.SetToInitialState(); - m_allocation.Allocate(m_pAllocator, m_size); + m_allocation.Allocate(GetAllocator(), m_size); m_allocation.InitFromRangeCopy(other.Begin(), other.End()); } template Array::Array(Array&& other) noexcept : m_size(0), - m_startOffset(0), - m_pAllocator(other.m_pAllocator) + m_startOffset(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); + HYP_CORE_ASSERT(GetAllocator() != nullptr); m_allocation.SetToInitialState(); @@ -781,11 +765,11 @@ Array::Array(Array&& other) noexcept m_size = other.m_size - other.m_startOffset; m_startOffset = 0; - m_allocation.Allocate(m_pAllocator, m_size); + m_allocation.Allocate(GetAllocator(), m_size); m_allocation.InitFromRangeMove(other.Begin(), other.End()); other.m_allocation.DestructInRange(other.m_startOffset, other.m_size); - other.m_allocation.Free(other.m_pAllocator); + other.m_allocation.Free(other.GetAllocator()); other.m_size = 0; other.m_startOffset = 0; @@ -796,7 +780,7 @@ template Array::~Array() { m_allocation.DestructInRange(m_startOffset, m_size); - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); } template @@ -808,12 +792,12 @@ auto Array::operator=(const Array& other) -> Array& } m_allocation.DestructInRange(m_startOffset, m_size); - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); m_size = other.m_size - other.m_startOffset; m_startOffset = 0; - m_allocation.Allocate(m_pAllocator, m_size); + m_allocation.Allocate(GetAllocator(), m_size); m_allocation.InitFromRangeCopy(other.Begin(), other.End()); return *this; @@ -828,9 +812,9 @@ auto Array::operator=(Array&& other) noexcept -> Array& } m_allocation.DestructInRange(m_startOffset, m_size); - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); - if (other.m_allocation.IsDynamic() && m_pAllocator == other.m_pAllocator) + if (other.m_allocation.IsDynamic() && GetAllocator() == other.GetAllocator()) { m_size = other.m_size; m_startOffset = other.m_startOffset; @@ -847,11 +831,11 @@ auto Array::operator=(Array&& other) noexcept -> Array& m_size = other.m_size - other.m_startOffset; m_startOffset = 0; - m_allocation.Allocate(m_pAllocator, m_size); + m_allocation.Allocate(GetAllocator(), m_size); m_allocation.InitFromRangeMove(other.Begin(), other.End()); other.m_allocation.DestructInRange(other.m_startOffset, other.m_size); - other.m_allocation.Free(other.m_pAllocator); + other.m_allocation.Free(other.GetAllocator()); other.m_size = 0; other.m_startOffset = 0; @@ -914,12 +898,12 @@ void Array::SetCapacity(size_t capacity, size_t offset) if (capacity > 0) { - newAllocation.Allocate(m_pAllocator, capacity); + newAllocation.Allocate(GetAllocator(), capacity); newAllocation.InitFromRangeMove(Begin(), End(), offset); } m_allocation.DestructInRange(m_startOffset, m_size); - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); m_size -= m_startOffset; m_size += offset; diff --git a/Source/Core/containers/Bitset.hpp b/Source/Core/containers/Bitset.hpp index 770546424c..b141736766 100644 --- a/Source/Core/containers/Bitset.hpp +++ b/Source/Core/containers/Bitset.hpp @@ -50,6 +50,9 @@ class TBitset } private: + template + friend class TBitset; // to allow access to private members of other TBitset instantiations. + template struct IteratorBase { @@ -99,20 +102,13 @@ class TBitset } }; - template , typename = std::enable_if_t> TBitset() - : TBitset(GetDefaultAllocatorInstance(), 0) + : m_blocks() { } - explicit TBitset(AllocatorType* pAllocator, uint64 value = 0); - /*! \brief Constructs a bitset from a 64-bit unsigned integer. */ - template , typename = std::enable_if_t> - explicit TBitset(uint64 value) - : TBitset(GetDefaultAllocatorInstance(), value) - { - } + explicit TBitset(uint64 value); TBitset(const TBitset& other); TBitset& operator=(const TBitset& other); @@ -553,7 +549,11 @@ class TBitset } } - AllocatorType* const m_pAllocator; + HYP_FORCE_INLINE static AllocatorType* GetAllocator() + { + return GetDefaultAllocatorInstance(); + } + Blocks m_blocks; }; @@ -578,20 +578,17 @@ static inline Span::BlockType> CreateBlock } template -TBitset::TBitset(AllocatorType* pAllocator, uint64 value) - : m_pAllocator(pAllocator), - m_blocks(m_pAllocator) +TBitset::TBitset(const TBitset& other) + : m_blocks(other.m_blocks) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - - m_blocks.Concat(CreateBlocks_Internal(value).ToSpan()); } +/*! \brief Constructs a bitset from a 64-bit unsigned integer. */ template -TBitset::TBitset(const TBitset& other) - : m_pAllocator(other.m_pAllocator), - m_blocks(other.m_blocks) +TBitset::TBitset(uint64 value) + : m_blocks() { + m_blocks.Concat(CreateBlocks_Internal(value).ToSpan()); } template @@ -604,8 +601,7 @@ TBitset& TBitset::operator=(const TBitset& other) template TBitset::TBitset(TBitset&& other) noexcept - : m_pAllocator(other.m_pAllocator), - m_blocks(std::move(other.m_blocks)) + : m_blocks(std::move(other.m_blocks)) { other.m_blocks = CreateBlocks_Static_Internal(); } @@ -622,7 +618,7 @@ TBitset& TBitset::operator=(TBitset&& other) noexc template TBitset TBitset::operator~() const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.ResizeUninitialized(m_blocks.Size()); for (uint32 index = 0; index < result.m_blocks.Size(); index++) @@ -638,7 +634,7 @@ TBitset TBitset::operator~() const template TBitset TBitset::operator<<(uint32 pos) const { - TBitset result { m_pAllocator }; + TBitset result; const size_t totalBitSize = NumBits(); @@ -659,7 +655,7 @@ TBitset& TBitset::operator<<=(uint32 pos) template TBitset TBitset::operator&(uint64 value) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Min(m_blocks.Size(), uint32(2))); if (m_blocks.Size() > 0) @@ -689,7 +685,7 @@ template template TBitset TBitset::operator&(const TBitset& other) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Min(m_blocks.Size(), other.m_blocks.Size())); for (uint32 index = 0; index < result.m_blocks.Size(); index++) @@ -721,7 +717,7 @@ TBitset& TBitset::operator&=(const TBitset TBitset TBitset::operator|(uint64 value) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Max(m_blocks.Size(), uint32(2))); if (m_blocks.Size() > 0) @@ -759,7 +755,7 @@ template template TBitset TBitset::operator|(const TBitset& other) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Max(m_blocks.Size(), other.m_blocks.Size())); for (uint32 index = 0; index < result.m_blocks.Size(); index++) @@ -792,7 +788,7 @@ TBitset& TBitset::operator|=(const TBitset TBitset TBitset::operator^(uint64 value) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Max(m_blocks.Size(), uint32(2))); if (m_blocks.Size() > 0) @@ -830,7 +826,7 @@ template template TBitset TBitset::operator^(const TBitset& other) const { - TBitset result { m_pAllocator }; + TBitset result; result.m_blocks.Resize(MathUtil::Max(m_blocks.Size(), other.m_blocks.Size())); for (uint32 index = 0; index < result.m_blocks.Size(); index++) diff --git a/Source/Core/containers/LinkedList.hpp b/Source/Core/containers/LinkedList.hpp index a93c14af0a..fa5f731dd9 100644 --- a/Source/Core/containers/LinkedList.hpp +++ b/Source/Core/containers/LinkedList.hpp @@ -202,12 +202,10 @@ class LinkedList : public ContainerBase, size_t> template , typename = std::enable_if_t> LinkedList() - : m_pAllocator(GetDefaultAllocatorInstance()), - m_head(nullptr), + : m_head(nullptr), m_tail(nullptr), m_size(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); } LinkedList(const LinkedList& other); @@ -284,7 +282,7 @@ class LinkedList : public ContainerBase, size_t> template ValueType& EmplaceBack(Args&&... args) { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = m_tail; newNode->next = nullptr; newNode->value.Construct(std::forward(args)...); @@ -308,7 +306,7 @@ class LinkedList : public ContainerBase, size_t> template ValueType& EmplaceFront(Args&&... args) { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = nullptr; newNode->next = m_head; newNode->value.Construct(std::forward(args)...); @@ -414,7 +412,10 @@ class LinkedList : public ContainerBase, size_t> HYP_DEF_STL_BEGIN_END({ m_head }, { (Node*)nullptr }) private: - AllocatorType* const m_pAllocator; + HYP_FORCE_INLINE static AllocatorType* GetAllocator() + { + return GetDefaultAllocatorInstance(); + } Node* m_head; Node* m_tail; @@ -423,13 +424,10 @@ class LinkedList : public ContainerBase, size_t> template LinkedList::LinkedList(const LinkedList& other) - : m_pAllocator(other.m_pAllocator), - m_head(nullptr), + : m_head(nullptr), m_tail(nullptr), m_size(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - for (const auto& value : other) { PushBack(value); @@ -438,13 +436,10 @@ LinkedList::LinkedList(const LinkedList& oth template LinkedList::LinkedList(LinkedList&& other) noexcept - : m_pAllocator(other.m_pAllocator), - m_head(other.m_head), + : m_head(other.m_head), m_tail(other.m_tail), m_size(other.m_size) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - other.m_head = nullptr; other.m_tail = nullptr; other.m_size = 0; @@ -499,7 +494,7 @@ LinkedList::~LinkedList() Node* next = node->next; node->value.Destruct(); - m_pAllocator->Free(node); + GetAllocator()->Free(node); node = next; } @@ -508,7 +503,7 @@ LinkedList::~LinkedList() template auto LinkedList::PushBack(const ValueType& value) -> ValueType& { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = m_tail; newNode->next = nullptr; newNode->value.Construct(value); @@ -532,7 +527,7 @@ auto LinkedList::PushBack(const ValueType& value) -> ValueType template auto LinkedList::PushBack(ValueType&& value) -> ValueType& { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = m_tail; newNode->next = nullptr; newNode->value.Construct(std::move(value)); @@ -556,7 +551,7 @@ auto LinkedList::PushBack(ValueType&& value) -> ValueType& template auto LinkedList::PushFront(const ValueType& value) -> ValueType& { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = nullptr; newNode->next = m_head; newNode->value.Construct(value); @@ -581,7 +576,7 @@ auto LinkedList::PushFront(const ValueType& value) -> ValueTyp template auto LinkedList::PushFront(ValueType&& value) -> ValueType& { - Node* newNode = (Node*)m_pAllocator->Allocate(sizeof(Node), alignof(Node)); + Node* newNode = (Node*)GetAllocator()->Allocate(sizeof(Node), alignof(Node)); newNode->previous = nullptr; newNode->next = m_head; newNode->value.Construct(std::move(value)); @@ -613,7 +608,7 @@ auto LinkedList::PopBack() -> ValueType ValueType value = std::move(m_tail->value.Get()); m_tail->value.Destruct(); - m_pAllocator->Free(m_tail); + GetAllocator()->Free(m_tail); if (prev) { @@ -640,7 +635,7 @@ auto LinkedList::PopFront() -> ValueType ValueType value = std::move(m_head->value.Get()); m_head->value.Destruct(); - m_pAllocator->Free(m_head); + GetAllocator()->Free(m_head); if (next) { @@ -691,7 +686,7 @@ auto LinkedList::Erase(Iterator iter) -> Iterator } node->value.Destruct(); - m_pAllocator->Free(node); + GetAllocator()->Free(node); --m_size; @@ -732,7 +727,7 @@ auto LinkedList::Erase(ConstIterator iter) -> Iterator } node->value.Destruct(); - m_pAllocator->Free(node); + GetAllocator()->Free(node); --m_size; @@ -749,7 +744,7 @@ void LinkedList::Clear() Node* next = node->next; node->value.Destruct(); - m_pAllocator->Free(node); + GetAllocator()->Free(node); node = next; } diff --git a/Source/Core/containers/SparsePagedArray.hpp b/Source/Core/containers/SparsePagedArray.hpp index b93ac3cd00..bcf3d3fb9a 100644 --- a/Source/Core/containers/SparsePagedArray.hpp +++ b/Source/Core/containers/SparsePagedArray.hpp @@ -35,8 +35,8 @@ class SparsePagedArray : public ContainerBase storage; TBitset initializedBits; - explicit Page(AllocatorType* pAllocator) - : initializedBits(pAllocator) + Page() + : initializedBits() { } @@ -378,32 +378,19 @@ class SparsePagedArray : public ContainerBase, typename = std::enable_if_t> HYP_FORCE_INLINE SparsePagedArray() - : m_pAllocator(GetDefaultAllocatorInstance()), - m_pages(m_pAllocator), - m_validPages(m_pAllocator) + : m_pages(), + m_validPages() { - HYP_CORE_ASSERT(m_pAllocator != nullptr); } - explicit SparsePagedArray(AllocatorType* pAllocator) - : m_pAllocator(pAllocator), - m_pages(m_pAllocator), - m_validPages(m_pAllocator) - { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - } - template , typename = std::enable_if_t> SparsePagedArray(std::initializer_list> initializerList) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_pages(m_pAllocator), - m_validPages(m_pAllocator) + : m_pages(), + m_validPages() { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - for (const auto& item : initializerList) { Set(item.first, item.second); @@ -411,8 +398,7 @@ class SparsePagedArray : public ContainerBaseAllocate(sizeof(Page), alignof(Page)); - new (m_pages[bit]) Page(m_pAllocator); + m_pages[bit] = (Page*)GetAllocator()->Allocate(sizeof(Page), alignof(Page)); + new (m_pages[bit]) Page(); for (Bitset::BitIndex elem : other.m_pages[bit]->initializedBits) { @@ -443,22 +429,22 @@ class SparsePagedArray : public ContainerBase~Page(); - m_pAllocator->Free(m_pages[bit]); + GetAllocator()->Free(m_pages[bit]); m_pages[bit] = nullptr; } m_validPages = other.m_validPages; - m_pages = Array(m_pAllocator, 0); + m_pages = Array(0); m_pages.ResizeZeroed(other.m_pages.Size()); for (Bitset::BitIndex bit : other.m_validPages) { HYP_CORE_ASSERT(bit < other.m_pages.Size()); - m_pages[bit] = (Page*)m_pAllocator->Allocate(sizeof(Page), alignof(Page)); - new (m_pages[bit]) Page(m_pAllocator); + m_pages[bit] = (Page*)GetAllocator()->Allocate(sizeof(Page), alignof(Page)); + new (m_pages[bit]) Page(); for (Bitset::BitIndex elem : other.m_pages[bit]->initializedBits) { @@ -470,8 +456,7 @@ class SparsePagedArray : public ContainerBase~Page(); - m_pAllocator->Free(m_pages[bit]); + GetAllocator()->Free(m_pages[bit]); m_pages[bit] = nullptr; } @@ -506,7 +491,7 @@ class SparsePagedArray : public ContainerBase~Page(); - m_pAllocator->Free(m_pages[bit]); + GetAllocator()->Free(m_pages[bit]); m_pages[bit] = nullptr; } @@ -767,7 +752,7 @@ class SparsePagedArray : public ContainerBase~Page(); - m_pAllocator->Free(page); + GetAllocator()->Free(page); m_pages[pageIndex] = nullptr; } @@ -838,7 +823,7 @@ class SparsePagedArray : public ContainerBase~Page(); - m_pAllocator->Free(page); + GetAllocator()->Free(page); m_pages[bit] = nullptr; } @@ -891,8 +876,8 @@ class SparsePagedArray : public ContainerBaseAllocate(sizeof(Page), alignof(Page)); - new (m_pages[pageIndex]) Page(m_pAllocator); + m_pages[pageIndex] = (Page*)GetAllocator()->Allocate(sizeof(Page), alignof(Page)); + new (m_pages[pageIndex]) Page(); m_validPages.Set(pageIndex, true); } @@ -900,7 +885,11 @@ class SparsePagedArray : public ContainerBase(); + } + Array m_pages; TBitset m_validPages; }; diff --git a/Source/Core/io/ByteReader.cpp b/Source/Core/io/ByteReader.cpp index c000e51502..0e4f35cd24 100644 --- a/Source/Core/io/ByteReader.cpp +++ b/Source/Core/io/ByteReader.cpp @@ -543,4 +543,4 @@ ByteBuffer MemoryMappedByteReader::Read(size_t size) #pragma endregion MemoryMappedByteReader -} // namespace Hyperion \ No newline at end of file +} // namespace Hyperion diff --git a/Source/Core/json/JSON.cpp b/Source/Core/json/JSON.cpp index 4f013aa226..7663d40ccc 100644 --- a/Source/Core/json/JSON.cpp +++ b/Source/Core/json/JSON.cpp @@ -1242,9 +1242,12 @@ ParseResult Parse(BufferedReader& reader) ParseResult Parse(const String& jsonString) { - SourceFile sourceFile("", jsonString.Size()); + const size_t bufferLength = jsonString.Size(); + + SourceFile sourceFile("", bufferLength); + Assert(sourceFile.GetBuffer().Size() == bufferLength); - ByteBuffer temp(jsonString.Size(), jsonString.Data()); + ByteBuffer temp(bufferLength, jsonString.Data()); sourceFile.ReadIntoBuffer(temp); return Parse(sourceFile); diff --git a/Source/Core/json/parser/SourceFile.cpp b/Source/Core/json/parser/SourceFile.cpp index c830b2d120..c77ea06dfc 100644 --- a/Source/Core/json/parser/SourceFile.cpp +++ b/Source/Core/json/parser/SourceFile.cpp @@ -20,14 +20,14 @@ SourceFile::SourceFile() SourceFile::SourceFile(const String& filepath, size_t size) : m_filepath(filepath), + m_buffer(size), m_position(0) { - m_buffer.SetSize(size); } SourceFile::SourceFile(const SourceFile& other) : m_filepath(other.m_filepath), - m_buffer(other.m_buffer.Copy()), + m_buffer(other.m_buffer), m_position(other.m_position) { } @@ -39,7 +39,7 @@ SourceFile& SourceFile::operator=(const SourceFile& other) return *this; } - m_buffer = other.m_buffer.Copy(); + m_buffer = other.m_buffer; m_position = other.m_position; m_filepath = other.m_filepath; diff --git a/Source/Core/logging/LogChannels.cpp b/Source/Core/logging/LogChannels.cpp index 73aae84cf7..e6eeecd707 100644 --- a/Source/Core/logging/LogChannels.cpp +++ b/Source/Core/logging/LogChannels.cpp @@ -37,7 +37,6 @@ HYP_DEFINE_LOG_SUBCHANNEL(Perf, Engine); HYP_DEFINE_LOG_SUBCHANNEL(Rendering, Core); HYP_DEFINE_LOG_SUBCHANNEL(RenderingBackend, Rendering); -HYP_DEFINE_LOG_SUBCHANNEL(RenderCollection, Rendering); HYP_DEFINE_LOG_SUBCHANNEL(RenderCommands, Rendering); HYP_DEFINE_LOG_SUBCHANNEL(Shader, Rendering); HYP_DEFINE_LOG_SUBCHANNEL(Texture, Rendering); @@ -97,4 +96,4 @@ HYP_DEFINE_LOG_SUBCHANNEL(Serialization, Assets); #pragma endregion Assets -} // namespace Hyperion \ No newline at end of file +} // namespace Hyperion diff --git a/Source/Core/logging/LogChannels.hpp b/Source/Core/logging/LogChannels.hpp index d8e257dd55..c0aa08deaa 100644 --- a/Source/Core/logging/LogChannels.hpp +++ b/Source/Core/logging/LogChannels.hpp @@ -38,7 +38,6 @@ HYP_DECLARE_LOG_CHANNEL(Perf); HYP_DECLARE_LOG_CHANNEL(Rendering); HYP_DECLARE_LOG_CHANNEL(RenderingBackend); -HYP_DECLARE_LOG_CHANNEL(RenderCollection); HYP_DECLARE_LOG_CHANNEL(RenderCommands); HYP_DECLARE_LOG_CHANNEL(Shader); HYP_DECLARE_LOG_CHANNEL(Texture); diff --git a/Source/Core/math/Mat4f.cpp b/Source/Core/math/Mat4f.cpp index 4135a3d59b..973b457a33 100644 --- a/Source/Core/math/Mat4f.cpp +++ b/Source/Core/math/Mat4f.cpp @@ -28,12 +28,6 @@ #define HYP_MAT4F_USE_AVX 0 #endif -#if defined(HYPERION_ENGINE) && HYPERION_ENGINE && defined(HYP_VULKAN) -static constexpr float PerspectiveMat11Div = -1.0f; -#else -static constexpr float PerspectiveMat11Div = 1.0f; -#endif - namespace { #if HYP_MAT4F_USE_SSE @@ -118,14 +112,13 @@ Mat4f Mat4f::Perspective(float fov, int w, int h, float n, float f) float ar = (float)w / (float)h; float tanHalfFov = MathUtil::Tan(MathUtil::DegToRad(fov / 2.0f)); - float range = n - f; - mat[0][0] = 1.0f / (tanHalfFov * ar); + mat[0][0] = 1.0f / (ar * tanHalfFov); - mat[1][1] = (PerspectiveMat11Div / tanHalfFov); + mat[1][1] = 1.0f / tanHalfFov; - mat[2][2] = (-n - f) / range; - mat[2][3] = (2.0f * f * n) / range; + mat[2][2] = f / (f - n); + mat[2][3] = -(f * n) / (f - n); mat[3][2] = 1.0f; mat[3][3] = 0.0f; @@ -139,10 +132,13 @@ Mat4f Mat4f::Orthographic(float l, float r, float b, float t, float n, float f) float xOrth = 2.0f / (r - l); float yOrth = 2.0f / (t - b); - float zOrth = 1.0f / (n - f); - float tx = -((r + l) / (r - l)); - float ty = -((t + b) / (t - b)); - float tz = ((n) / (n - f)); + + float zOrth = 1.0f / (f - n); + + float tx = -(r + l) / (r - l); + float ty = -(t + b) / (t - b); + + float tz = -n / (f - n); mat[0][0] = xOrth; mat[0][1] = 0.0f; diff --git a/Source/Core/memory/ByteBuffer.hpp b/Source/Core/memory/ByteBuffer.hpp index 295cf459d7..f5192be377 100644 --- a/Source/Core/memory/ByteBuffer.hpp +++ b/Source/Core/memory/ByteBuffer.hpp @@ -6,14 +6,17 @@ #pragma once -#include -#include -#include - #include #include #include +#include + +#include +#include + +#include + namespace Hyperion { namespace memory { @@ -28,20 +31,8 @@ class TByteBuffer /*! \brief Constructs an empty ByteBuffer, no memory is allocated. */ TByteBuffer() - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(0) + : m_size(0) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - - m_allocation.SetToInitialState(); - } - - explicit TByteBuffer(AllocatorType* pAllocator) - : m_pAllocator(pAllocator), - m_size(0) - { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); } @@ -49,11 +40,8 @@ class TByteBuffer * \param count The size of the ByteBuffer in bytes. If count is zero, no memory is allocated and the ByteBuffer is set to an empty state. * \param zeroize If true, the memory is initialized to zero. */ explicit TByteBuffer(size_t count, bool zeroize = true) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(count) + : m_size(count) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -61,7 +49,7 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); if (zeroize) { @@ -71,11 +59,8 @@ class TByteBuffer /*! \brief Constructs a ByteBuffer with the given size and data, allocating memory on the heap if \p count != 0 and copies the data into the buffer. */ explicit TByteBuffer(size_t count, const void* data) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(count) + : m_size(count) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -83,18 +68,15 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(reinterpret_cast(data), reinterpret_cast(data) + m_size); } /*! \brief Constructs a ByteBuffer from \p view, allocating memory on the heap if the view is not empty and copies the data into the buffer. * \param view The ByteView to copy to the ByteBuffer. */ explicit TByteBuffer(const ByteView& view) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(view.Size()) + : m_size(view.Size()) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -102,18 +84,15 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(view.Begin(), view.End()); } /*! \brief Constructs a ByteBuffer from a \ref ConstByteView, allocating memory on the heap if the view is not empty and copies the data into the buffer. * \param view The ConstByteView to copy to the ByteBuffer. */ explicit TByteBuffer(const ConstByteView& view) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(view.Size()) + : m_size(view.Size()) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -121,16 +100,13 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(view.Begin(), view.End()); } TByteBuffer(const TByteBuffer& other) - : m_pAllocator(other.m_pAllocator), - m_size(other.m_size) + : m_size(other.m_size) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -138,17 +114,14 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(other.Data(), other.Data() + m_size); } template TByteBuffer(const TByteBuffer& other) - : m_pAllocator(GetDefaultAllocatorInstance()), - m_size(other.m_size) + : m_size(other.m_size) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (m_size == 0) @@ -156,7 +129,7 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(other.Data(), other.Data() + m_size); } @@ -167,14 +140,13 @@ class TByteBuffer return *this; } - const size_t previousSize = m_size; const size_t newSize = other.m_size; - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); if (newSize != 0) { - m_allocation.Allocate(m_pAllocator, newSize, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(newSize, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(other.Data(), other.Data() + newSize); } @@ -191,14 +163,13 @@ class TByteBuffer return *this; } - const size_t previousSize = m_size; const size_t newSize = other.m_size; - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); if (newSize != 0) { - m_allocation.Allocate(m_pAllocator, newSize, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(newSize, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(other.Data(), other.Data() + newSize); } @@ -208,11 +179,8 @@ class TByteBuffer } TByteBuffer(TByteBuffer&& other) noexcept - : m_pAllocator(other.m_pAllocator), - m_size(other.m_size) + : m_size(other.m_size) { - HYP_CORE_ASSERT(m_pAllocator != nullptr); - m_allocation.SetToInitialState(); if (other.m_allocation.IsDynamic()) @@ -225,11 +193,11 @@ class TByteBuffer { if (m_size != 0) { - m_allocation.Allocate(m_pAllocator, m_size, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(m_size, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeMove(other.Data(), other.Data() + m_size); } - other.m_allocation.Free(other.m_pAllocator); + other.m_allocation.Free(GetAllocator()); } other.m_size = 0; @@ -242,12 +210,11 @@ class TByteBuffer return *this; } - const size_t previousSize = m_size; const size_t newSize = other.m_size; - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); - if (other.m_allocation.IsDynamic() && m_pAllocator == other.m_pAllocator) + if (other.m_allocation.IsDynamic()) { m_allocation.TakeOwnership(other.Data(), other.Data() + newSize); @@ -257,11 +224,11 @@ class TByteBuffer { if (newSize != 0) { - m_allocation.Allocate(m_pAllocator, newSize, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(newSize, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeMove(other.Data(), other.Data() + newSize); } - other.m_allocation.Free(other.m_pAllocator); + other.m_allocation.Free(GetAllocator()); } m_size = newSize; @@ -273,7 +240,7 @@ class TByteBuffer ~TByteBuffer() { - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); } /*! \brief Writes \p count bytes of \p data to the ByteBuffer at the given \p offset. @@ -353,7 +320,7 @@ class TByteBuffer * \param data A pointer to the data to copy into the ByteBuffer. If count is zero, no memory is allocated and the ByteBuffer is set to an empty state. */ void SetData(size_t count, const void* data) { - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); m_size = count; @@ -362,7 +329,7 @@ class TByteBuffer return; } - m_allocation.Allocate(m_pAllocator, count, /* alignment */ BufferAlignment); + m_allocation.Allocate(GetAllocator(), ByteUtil::AlignAs(count, BufferAlignment), /* alignment */ BufferAlignment); m_allocation.InitFromRangeCopy(reinterpret_cast(data), reinterpret_cast(data) + count); } @@ -378,26 +345,28 @@ class TByteBuffer * The current data will be copied into the newly allocated memory if the size is changed. * \param newSize The new size of the ByteBuffer in bytes. * \param zeroize If true, the new bytes are zeroed out. */ - HYP_FORCE_INLINE void SetSize(size_t newSize, bool zeroize = true) + void SetSize(size_t newSize, bool zeroize = true) { if (newSize == m_size) { return; } + const size_t oldSize = m_size; + if (newSize > m_allocation.GetCapacity()) { // Extend the buffer's capacity to ensure we have room. SetCapacity(newSize); } - if (newSize > m_size && zeroize) + m_size = newSize; + + if (m_size > oldSize && zeroize) { // Zero out the new bytes - m_allocation.InitZeroed(newSize - m_size, m_size); + m_allocation.InitZeroed(m_size - oldSize, oldSize); } - - m_size = newSize; } /*! \brief Returns the current capacity of the ByteBuffer. The capacity is the amount of memory allocated for the ByteBuffer, which may be larger than the current size. @@ -409,7 +378,7 @@ class TByteBuffer /*! \brief Sets the capacity of the ByteBuffer to the given size. If the new capacity is larger than the current capacity, the buffer is extended and the current data is copied into the newly allocated memory. * If the new capacity is smaller than the current size, the excess bytes are freed and the size is adjusted accordingly. */ - HYP_FORCE_INLINE void SetCapacity(size_t newCapacity) + void SetCapacity(size_t newCapacity) { const size_t currentCapacity = m_allocation.GetCapacity(); @@ -423,22 +392,21 @@ class TByteBuffer if (newCapacity != 0) { - newAllocation.Allocate(m_pAllocator, newCapacity, /* alignment */ BufferAlignment); + newAllocation.Allocate(GetAllocator(), ByteUtil::AlignAs(newCapacity, BufferAlignment), /* alignment */ BufferAlignment); const size_t minCapacity = currentCapacity <= newCapacity ? currentCapacity : newCapacity; newAllocation.InitFromRangeMove(Data(), Data() + minCapacity); } - // Chop size off if it is larger than newCapacity. - if (newCapacity < m_size) - { - m_size = newCapacity; - } - - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); m_allocation = newAllocation; + + // Chop size off if it is larger than newCapacity. + m_size = newCapacity < m_size ? newCapacity : m_size; + + HYP_CORE_ASSERT(GetCapacity() >= newCapacity); } /*! \brief Reads a value from the ByteBuffer at the given offset. If the offset is out of bounds, the function returns false and does not modify the output. @@ -447,7 +415,7 @@ class TByteBuffer * \param count The number of bytes to read from the ByteBuffer. * \param outValues The output buffer to write the read values to. * \return Returns true if the read was successful, false if the offset is out of bounds. */ - HYP_FORCE_INLINE bool Read(size_t offset, size_t count, ubyte* outValues) const + bool Read(size_t offset, size_t count, ubyte* outValues) const { HYP_CORE_ASSERT(outValues != nullptr); @@ -473,7 +441,7 @@ class TByteBuffer * \param out The output buffer to write the read value to. * \return Returns true if the read was successful, false if the offset is out of bounds. */ template - HYP_FORCE_INLINE bool Read(size_t offset, T* out) const + bool Read(size_t offset, T* out) const { static_assert(is_pod_type_v, "Must be POD type"); @@ -569,7 +537,7 @@ class TByteBuffer * After calling this function, the ByteBuffer will be empty and no memory will be allocated. */ void Clear() { - m_allocation.Free(m_pAllocator); + m_allocation.Free(GetAllocator()); m_size = 0; } @@ -586,7 +554,11 @@ class TByteBuffer } private: - AllocatorType* const m_pAllocator; + HYP_FORCE_INLINE static AllocatorType* GetAllocator() + { + return GetDefaultAllocatorInstance(); + } + Allocation m_allocation; size_t m_size; }; diff --git a/Source/Core/memory/Memory.hpp b/Source/Core/memory/Memory.hpp index 5d3969ce29..817423a093 100644 --- a/Source/Core/memory/Memory.hpp +++ b/Source/Core/memory/Memory.hpp @@ -2,7 +2,7 @@ * @author: The Hyperion Contributors * @date 2016-2026 * @licence MIT -*/ + */ #pragma once @@ -27,38 +27,38 @@ class Memory { public: template && BitwiseComparable>> - HYP_FORCE_INLINE static int Compare(const T* a, const U* b, size_t count) + HYP_FORCE_INLINE static int Compare(const HYP_NOTNULL T* a, const HYP_NOTNULL U* b, size_t count) { return std::memcmp(a, b, count); } - + template && BitwiseCopyable>> - HYP_FORCE_INLINE static void* Copy(T* dest, const U* src, size_t count) + HYP_FORCE_INLINE static void* Copy(HYP_NOTNULL T* dest, const HYP_NOTNULL U* src, size_t count) { return std::memcpy(dest, src, count); } - -template && BitwiseCopyable>> - HYP_FORCE_INLINE static void* Move(T* dest, const U* src, size_t size) + + template && BitwiseCopyable>> + HYP_FORCE_INLINE static void* Move(HYP_NOTNULL T* dest, const U* src, size_t size) { return std::memmove(dest, src, size); } template - HYP_FORCE_INLINE static void* Fill(T* dest, ubyte ch, size_t size) + HYP_FORCE_INLINE static void* Fill(HYP_NOTNULL T* dest, ubyte ch, size_t size) { return std::memset(dest, ch, size); } template - HYP_FORCE_INLINE static void* Zero(T* dest, size_t size) + HYP_FORCE_INLINE static void* Zero(HYP_NOTNULL T* dest, size_t size) { return std::memset(dest, 0, size); } - HYP_FORCE_INLINE static void Garble(void* dest, size_t length) + HYP_FORCE_INLINE static void Garble(HYP_NOTNULL void* dest, size_t length) { - if (!dest || length == 0) + if (length == 0) { return; } @@ -66,7 +66,7 @@ template && Bi std::memset(dest, 0xDEAD, length); } - HYP_FORCE_INLINE static int StrCmp(const char* lhs, const char* rhs, size_t length = 0) + HYP_FORCE_INLINE static int StrCmp(const HYP_NOTNULL char* lhs, HYP_NOTNULL const char* rhs, size_t length = 0) { if (length) { @@ -77,7 +77,7 @@ template && Bi } template - static constexpr bool StrEqual(const T* lhs, const T* rhs, size_t length, size_t index = 0) + static constexpr bool StrEqual(const HYP_NOTNULL T* lhs, const HYP_NOTNULL T* rhs, size_t length, size_t index = 0) { if (HYP_CONSTEVAL_CONTEXT) { @@ -104,7 +104,7 @@ template && Bi } } - HYP_FORCE_INLINE static char* StrCpy(char* dest, const char* src, size_t length = 0) + HYP_FORCE_INLINE static char* StrCpy(HYP_NOTNULL char* dest, const HYP_NOTNULL char* src, size_t length = 0) { if (length) { @@ -133,22 +133,14 @@ template && Bi } template - static void Delete(void* ptr) + static void Delete(HYP_NOTNULL void* ptr) { delete static_cast(ptr); } template - static void Construct(void* where, Args&&... args) - { - new (where) T(std::forward(args)...); - } - - template - static void ConstructWithContext(void* where, Args&&... args) + static void Construct(HYP_NOTNULL void* where, Args&&... args) { - auto contextResult = Context(where); - new (where) T(std::forward(args)...); } @@ -177,34 +169,6 @@ template && Bi return static_cast(ptr); } - /*! \brief Allocates memory for an object of type T, constructs it in-place using the given arguments, and constructs a Context object, passing in the address of the allocated memory before the construction of T. - * \tparam T The type of the object to allocate and construct. - * \tparam Context The context type that will be constructed before T is constructed. Useful for setting data on the allocated memory before the object is constructed. (e.g. ObjectInitializerGuard). This is an internal feature and should not be used by users of the API. - * \tparam Args The types of the arguments to pass to the constructor of T. - * \returns A pointer to the newly allocated and constructed object of type T. */ - template - HYP_NODISCARD static T* AllocateAndConstructWithContext(Args&&... args) - { - void* ptr; - - if constexpr (alignof(T) <= alignof(std::max_align_t)) - { - // Use standard allocation if alignment is not greater than max alignment - ptr = Memory::Allocate(sizeof(T)); - } - else - { - // Use aligned allocation if alignment is greater than max alignment - ptr = HYP_ALLOC_ALIGNED(sizeof(T), alignof(T)); - } - - auto contextResult = Context(ptr); - - new (ptr) T(std::forward(args)...); - - return static_cast(ptr); - } - template static std::enable_if_t> Destruct(T&) { /* Do nothing */ @@ -321,7 +285,7 @@ template && Bi } template - HYP_FORCE_INLINE static T* Allocate(size_t count) + HYP_NODISCARD HYP_FORCE_INLINE static T* Allocate(size_t count) { if (count == 0) { @@ -340,13 +304,13 @@ template && Bi } } - HYP_FORCE_INLINE static void* AllocateAligned(size_t count, size_t alignment) + HYP_NODISCARD HYP_FORCE_INLINE static void* AllocateAligned(size_t count, size_t alignment) { return HYP_ALLOC_ALIGNED(count, alignment); } template - HYP_FORCE_INLINE static T* AllocateAligned(size_t count, size_t alignment) + HYP_NODISCARD HYP_FORCE_INLINE static T* AllocateAligned(size_t count, size_t alignment) { if (count == 0) { @@ -356,7 +320,7 @@ template && Bi return static_cast(HYP_ALLOC_ALIGNED(sizeof(T) * count, alignment)); } - HYP_FORCE_INLINE static void FreeAligned(void* ptr) + HYP_FORCE_INLINE static void FreeAligned(HYP_NOTNULL void* ptr) { HYP_FREE_ALIGNED(ptr); } diff --git a/Source/Core/memory/allocator/Allocator.hpp b/Source/Core/memory/allocator/Allocator.hpp index 165ece8d4f..ee3a402cde 100644 --- a/Source/Core/memory/allocator/Allocator.hpp +++ b/Source/Core/memory/allocator/Allocator.hpp @@ -237,26 +237,39 @@ struct Allocator struct DynamicAllocator : Allocator { - static constexpr uint32 maxAlign = ~0u; + static constexpr uint32 maxAlign = alignof(std::max_align_t); template struct Allocation : DynamicAllocationBase { }; - HYP_FORCE_INLINE void* Allocate(size_t size, size_t alignment) + HYP_FORCE_INLINE void* Allocate(size_t size, size_t /* alignment */) { HYP_CORE_ASSERT(size > 0); - HYP_CORE_ASSERT(alignment > 0); - return std::malloc(size); + void* ptr = malloc(size); + HYP_CORE_ASSERT(ptr != nullptr); + + return ptr; + +#if 0 + void* ptr = HYP_ALLOC_ALIGNED(size, alignment); + HYP_CORE_ASSERT(ptr != nullptr); + + return ptr; +#endif } HYP_FORCE_INLINE void Free(void* ptr) { HYP_CORE_ASSERT(ptr != nullptr); - std::free(ptr); + free(ptr); + +#if 0 + HYP_FREE_ALIGNED(ptr); +#endif } }; @@ -673,7 +686,7 @@ struct FixedAllocator : Allocator> // Fixed allocations should be handled by the Allocation struct itself HYP_NOT_IMPLEMENTED(); } -}; +}; /*! \brief Binds a pointer-to-pointer of a given AllocatorType, allowing the instance to be passed as an allocator to other structures. */ template @@ -710,11 +723,12 @@ struct AllocatorInstance : Allocator 0 && alignment > 0); - HYP_CORE_ASSERT(size > 0); - HYP_CORE_ASSERT(alignment > 0); + void* ptr = pAllocator->Allocate(size, alignment); + HYP_CORE_ASSERT(ptr != nullptr); - return pAllocator->Allocate(size, alignment); + return ptr; } HYP_FORCE_INLINE void Free(void* ptr) diff --git a/Source/Core/reflection/BoxedValue.hpp b/Source/Core/reflection/BoxedValue.hpp index dec3fac979..16997c0d20 100644 --- a/Source/Core/reflection/BoxedValue.hpp +++ b/Source/Core/reflection/BoxedValue.hpp @@ -2,7 +2,7 @@ * @author: The Hyperion Contributors * @date 2016-2026 * @licence MIT -*/ + */ #pragma once diff --git a/Source/Core/threading/TaskSystem.cpp b/Source/Core/threading/TaskSystem.cpp index f52edc938d..3ecf311d1a 100644 --- a/Source/Core/threading/TaskSystem.cpp +++ b/Source/Core/threading/TaskSystem.cpp @@ -18,8 +18,6 @@ namespace Hyperion { namespace threading { -extern const FlatMap (*)(void)> g_threadPoolFactories; - #pragma region TaskBatch bool TaskBatch::IsCompleted() const @@ -62,36 +60,6 @@ void TaskBatch::AwaitCompletion() #pragma endregion TaskBatch -#pragma region ForegroundWorkerPool - -class ForegroundWorkerPool final : public TaskThreadPool -{ -public: - ForegroundWorkerPool(uint32 numTaskThreads, ThreadPriorityValue priority) - : TaskThreadPool(TypeWrapper(), "ForegroundWorker", numTaskThreads) - { - } - - virtual ~ForegroundWorkerPool() override = default; -}; - -#pragma endregion ForegroundWorkerPool - -#pragma region RenderWorkerPool - -class RenderWorkerPool final : public TaskThreadPool -{ -public: - RenderWorkerPool(uint32 numTaskThreads, ThreadPriorityValue priority) - : TaskThreadPool(TypeWrapper(), "RenderWorker", numTaskThreads) - { - } - - virtual ~RenderWorkerPool() override = default; -}; - -#pragma endregion RenderWorkerPool - #pragma region TaskSystem TaskSystem& TaskSystem::GetInstance() @@ -103,21 +71,6 @@ TaskSystem& TaskSystem::GetInstance() TaskSystem::TaskSystem() { - m_pools.Reserve(THREAD_POOL_MAX); - - for (uint32 i = 0; i < THREAD_POOL_MAX; i++) - { - const TaskThreadPoolName poolName { i }; - - auto beginIt = g_threadPoolFactories.Begin(); - auto endIt = g_threadPoolFactories.End(); - - auto threadPoolFactoriesIt = g_threadPoolFactories.Find(poolName); - - AssertDebug(threadPoolFactoriesIt != endIt, "Invalid thread pool index {}", i); - - m_pools.PushBack(threadPoolFactoriesIt->second()); - } } void TaskSystem::Start() @@ -144,6 +97,20 @@ void TaskSystem::Stop() } } +void TaskSystem::RegisterPool(TaskThreadPoolName poolName, UniquePtr&& pool) +{ + AssertDebug(!IsRunning(), "TaskSystem::RegisterPool() must only be called before the TaskSystem is started!"); + + AssertDebug(pool != nullptr); + + if (m_pools.Size() <= size_t(poolName)) + { + m_pools.Resize(size_t(poolName) + 1); + } + + m_pools[size_t(poolName)] = std::move(pool); +} + TaskBatch* TaskSystem::EnqueueBatch(TaskBatch* batch) { AssertDebug(IsRunning(), "TaskSystem::Start() must be called before enqueuing tasks"); @@ -245,21 +212,5 @@ TaskThread* TaskSystem::GetNextTaskThread(TaskThreadPool& pool) #pragma endregion TaskSystem -const FlatMap (*)(void)> g_threadPoolFactories { - { TaskThreadPoolName::THREAD_POOL_GENERIC, +[]() -> UniquePtr - { - // we generally don't have more than 3 concurrent Systems running at once. - return MakeUnique(NumForegroundWorkerThreads, ThreadPriorityValue::HIGHEST); - } }, - { TaskThreadPoolName::THREAD_POOL_RENDER, +[]() -> UniquePtr - { - return MakeUnique(NumRendererWorkerThreads, ThreadPriorityValue::HIGHEST); - } }, - { TaskThreadPoolName::THREAD_POOL_BACKGROUND, +[]() -> UniquePtr - { - return MakeUnique("BackgroundWorker", MaxBackgroundWorkerThreads); - } } -}; - } // namespace threading } // namespace Hyperion diff --git a/Source/Core/threading/TaskSystem.hpp b/Source/Core/threading/TaskSystem.hpp index 9dcd316d81..21a1fea9ba 100644 --- a/Source/Core/threading/TaskSystem.hpp +++ b/Source/Core/threading/TaskSystem.hpp @@ -185,6 +185,8 @@ class TaskSystem HYP_API void Start(); HYP_API void Stop(); + void RegisterPool(TaskThreadPoolName poolName, UniquePtr&& pool); + HYP_FORCE_INLINE TaskThreadPool& GetPool(TaskThreadPoolName poolName) const { return *m_pools[uint32(poolName)]; diff --git a/Source/Core/threading/Thread.cpp b/Source/Core/threading/Thread.cpp index 0c903367db..5bdc522af0 100644 --- a/Source/Core/threading/Thread.cpp +++ b/Source/Core/threading/Thread.cpp @@ -91,6 +91,8 @@ void ThreadBase::OnExit() { cb(); } + + m_onExitCallbacks.Clear(); } #pragma endregion ThreadBase diff --git a/Source/Engine/HyperionEngine.cpp b/Source/Engine/HyperionEngine.cpp index 073c54ceb0..36517e3d18 100644 --- a/Source/Engine/HyperionEngine.cpp +++ b/Source/Engine/HyperionEngine.cpp @@ -58,6 +58,8 @@ #include +#include // For UIElementFactoryRegistry + #include