diff --git a/Cargo.toml b/Cargo.toml index 63081cd..7617649 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,11 +6,13 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -egui = "0.22.0" -glfw = "0.41.0" +egui = "0.23.0" +glfw = "0.53.0" gl = "0.14" copypasta-ext = "0.4.4" -egui_glfw = { branch = "v0.4.0-release", git = "https://github.com/ishbosamiya/egui_glfw.git" } +egui_glfw = { branch = "v0.6.0-release", git = "https://github.com/ishbosamiya/egui_glfw.git" } cgmath = "0.18.0" image = "0.24.6" impl_ops = "0.1.1" +obj-rs = "0.7.1" +tobj = "4.0.0" diff --git a/resources/objects/crash/back.png b/resources/objects/crash/back.png new file mode 100644 index 0000000..e69c1f1 Binary files /dev/null and b/resources/objects/crash/back.png differ diff --git a/resources/objects/crash/color_pallete.png b/resources/objects/crash/color_pallete.png new file mode 100644 index 0000000..c0d9dd3 Binary files /dev/null and b/resources/objects/crash/color_pallete.png differ diff --git a/resources/objects/crash/crashbandicoot.mtl b/resources/objects/crash/crashbandicoot.mtl new file mode 100644 index 0000000..c44e9e1 --- /dev/null +++ b/resources/objects/crash/crashbandicoot.mtl @@ -0,0 +1,44 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 06.05.2018 03:44:31 + +newmtl shoes + Ns 0.0000 + Ni 1.5000 + d 1.0000 + Tr 0.0000 + Tf 1.0000 1.0000 1.0000 + illum 2 + Ka 0.5880 0.5880 0.5880 + Kd 0.0000 0.0000 0.0000 + Ks 0.0000 0.0000 0.0000 + Ke 0.0000 0.0000 0.0000 + map_Ka shoes.png + map_Kd shoes.png + +newmtl back + Ns 10.0000 + Ni 1.5000 + d 1.0000 + Tr 0.0000 + Tf 1.0000 1.0000 1.0000 + illum 2 + Ka 0.5880 0.5880 0.5880 + Kd 0.5880 0.5880 0.5880 + Ks 0.0000 0.0000 0.0000 + Ke 0.0000 0.0000 0.0000 + map_Ka back.png + map_Kd back.png + +newmtl color_pallete + Ns 0.0000 + Ni 1.5000 + d 1.0000 + Tr 0.0000 + Tf 1.0000 1.0000 1.0000 + illum 2 + Ka 0.5880 0.5880 0.5880 + Kd 0.0000 0.0000 0.0000 + Ks 0.0000 0.0000 0.0000 + Ke 0.0000 0.0000 0.0000 + map_Ka color_pallete.png + map_Kd color_pallete.png diff --git a/resources/objects/crash/crashbandicoot.obj b/resources/objects/crash/crashbandicoot.obj new file mode 100644 index 0000000..21c6d84 --- /dev/null +++ b/resources/objects/crash/crashbandicoot.obj @@ -0,0 +1,2607 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 06.05.2018 03:44:31 + +mtllib crashbandicoot.mtl + +# +# object crash +# + +v -18.0000 21.0000 21.0000 +v -24.0000 24.0000 30.0000 +v -20.0000 20.0000 32.0000 +v -32.0000 24.0000 28.0000 +v -27.0000 21.0000 20.0000 +v -22.0000 20.0000 13.0000 +v -16.0000 20.0000 17.0000 +v 26.0000 21.0000 20.0000 +v 31.0000 24.0000 28.0000 +v 35.0000 20.0000 25.0000 +v 21.0000 20.0000 13.0000 +v 16.0000 32.0000 12.0000 +v 15.0000 20.0000 17.0000 +v 17.0000 21.0000 21.0000 +v 23.0000 24.0000 30.0000 +v 19.0000 20.0000 32.0000 +v -36.0000 20.0000 25.0000 +v -17.0000 32.0000 12.0000 +v 11.0000 13.0000 23.0000 +v -12.0000 13.0000 23.0000 +v 35.0000 13.0000 20.0000 +v -36.0000 13.0000 20.0000 +v 8.0000 13.0000 19.0000 +v -9.0000 13.0000 19.0000 +v 14.0000 32.0000 13.0000 +v -15.0000 32.0000 13.0000 +v 0.0000 120.0000 34.0000 +v 14.0000 125.0000 28.0000 +v 0.0000 119.0000 46.0000 +v 20.0000 137.0000 17.0000 +v 19.0000 142.0000 5.0000 +v 23.0000 141.0000 21.0000 +v 20.0000 134.0000 7.0000 +v 18.0000 134.0000 19.0000 +v 20.0000 131.0000 20.0000 +v 35.0000 159.0000 9.0000 +v 11.0000 149.0000 9.0000 +v 38.0000 63.0000 1.0000 +v 43.0000 70.0000 -3.0000 +v 36.0000 65.0000 3.0000 +v -14.0000 39.0000 4.0000 +v -16.0000 51.0000 9.0000 +v -9.0000 51.0000 7.0000 +v -7.0000 39.0000 17.0000 +v -41.0000 68.0000 -7.0000 +v -47.0000 69.0000 -7.0000 +v -41.0000 74.0000 -7.0000 +v -33.0000 96.0000 -0.0000 +v -31.0000 95.0000 -3.0000 +v -29.0000 99.0000 -3.0000 +v -51.0000 58.0000 -11.0000 +v -20.0000 39.0000 5.0000 +v -19.0000 51.0000 14.0000 +v -44.0000 70.0000 -2.0000 +v -43.0000 75.0000 -4.0000 +v -42.0000 50.0000 -7.0000 +v -41.0000 55.0000 -1.0000 +v -36.0000 53.0000 1.0000 +v -47.0000 57.0000 -8.0000 +v -52.0000 58.0000 -4.0000 +v -39.0000 73.0000 -6.0000 +v -46.0000 56.0000 3.0000 +v -51.0000 50.0000 -15.0000 +v -43.0000 40.0000 -11.0000 +v -46.0000 43.0000 -12.0000 +v -13.0000 93.0000 6.0000 +v -19.0000 115.0000 9.0000 +v -19.0000 111.0000 -3.0000 +v -12.0000 93.0000 -2.0000 +v 4.2000 137.0000 35.0000 +v 7.0000 133.0000 34.0000 +v 7.2000 136.0000 35.0000 +v 33.0000 59.0000 5.0000 +v 34.0000 62.0000 7.0000 +v -39.0000 73.0000 -3.0000 +v -32.0000 91.0000 -3.0000 +v -9.0000 92.0000 11.0000 +v -7.0000 105.0000 17.0000 +v -16.0000 120.0000 17.0000 +v 0.0000 92.0000 15.0000 +v 0.0000 104.0000 18.0000 +v 6.0000 62.0000 6.0000 +v -7.0000 62.0000 6.0000 +v 0.0000 72.0000 1.0000 +v -10.0000 107.0000 25.0000 +v -12.0000 101.0000 22.0000 +v 0.0000 62.0000 19.0000 +v -10.0000 108.0000 25.0000 +v -18.0000 129.0000 21.0000 +v -6.0000 77.0000 12.0000 +v -11.0000 47.0000 24.0000 +v -13.0000 40.0000 23.0000 +v 6.0000 62.0000 21.0000 +v 9.0000 52.0000 24.0000 +v 5.0000 77.0000 12.0000 +v 0.0000 79.0000 16.0000 +v 1.0000 77.0000 15.0000 +v -33.0000 45.0000 -5.0000 +v 18.0000 51.0000 14.0000 +v 15.0000 52.0000 24.0000 +v 16.0000 47.0000 24.0000 +v 6.0000 39.0000 17.0000 +v 5.0000 51.0000 14.0000 +v 8.0000 51.0000 7.0000 +v -9.0000 82.0000 5.0000 +v -31.0000 68.0000 1.0000 +v -7.0000 62.0000 21.0000 +v -10.0000 73.0000 10.0000 +v -13.0000 62.0000 16.0000 +v -16.0000 52.0000 24.0000 +v -4.0000 71.0000 17.0000 +v -32.0000 66.0000 -1.0000 +v -38.0000 63.0000 -0.0000 +v -25.0000 60.0000 6.0000 +v -32.0000 62.0000 5.0000 +v -31.0000 59.0000 3.0000 +v -4.0000 125.0000 52.0000 +v -15.0000 125.0000 28.0000 +v 3.0000 71.0000 17.0000 +v -29.0000 63.0000 1.0000 +v -42.0000 74.0000 -3.0000 +v -4.2000 137.0000 35.0000 +v -8.2000 139.0000 35.0000 +v -7.2000 136.0000 35.0000 +v 10.0000 47.0000 24.0000 +v 32.0000 96.0000 -0.0000 +v 18.0000 115.0000 9.0000 +v 28.0000 99.0000 -3.0000 +v -1.0000 159.0000 24.0000 +v 1.0000 150.0000 23.0000 +v -1.0000 157.0000 21.0000 +v -41.0000 73.0000 -2.0000 +v 41.0000 50.0000 -7.0000 +v 48.0000 50.0000 -17.0000 +v 46.0000 44.0000 -16.0000 +v 9.0000 73.0000 10.0000 +v 0.0000 156.0000 26.0000 +v -2.0000 150.0000 23.0000 +v 0.0000 157.0000 30.0000 +v -2.0000 150.0000 14.0000 +v -3.0000 158.0000 6.0000 +v -1.0000 152.0000 9.0000 +v -12.0000 132.0000 34.0000 +v -9.0000 9.0000 19.0000 +v -8.0000 13.0000 13.0000 +v -35.0000 91.0000 -7.0000 +v -40.0000 92.0000 -7.0000 +v -38.0000 97.0000 -8.0000 +v 0.0000 135.0000 34.0000 +v 0.0000 131.0000 44.0000 +v 0.0000 150.0000 14.0000 +v 1.0000 150.0000 1.0000 +v -3.0000 158.0000 24.0000 +v -8.0000 171.0000 22.0000 +v -22.0000 152.0000 19.0000 +v -36.0000 159.0000 9.0000 +v -18.0000 140.0000 21.0000 +v -2.0000 143.0000 35.0000 +v -7.0000 145.0000 34.0000 +v -6.2000 141.0000 35.0000 +v -35.0000 41.0000 -9.0000 +v -12.0000 141.0000 33.0000 +v 11.0000 101.0000 22.0000 +v 9.0000 107.0000 25.0000 +v -1.0000 103.0000 27.0000 +v 12.0000 62.0000 16.0000 +v -35.0000 65.0000 3.0000 +v 2.0000 162.0000 14.0000 +v -14.0000 42.0000 10.0000 +v -12.0000 44.0000 16.0000 +v -13.0000 32.0000 12.0000 +v -1.0000 155.0000 11.0000 +v -10.0000 52.0000 24.0000 +v -6.0000 51.0000 14.0000 +v 0.0000 74.0000 16.0000 +v 6.0000 73.0000 5.0000 +v 13.0000 62.0000 10.0000 +v -33.0000 96.0000 -8.0000 +v -19.0000 134.0000 19.0000 +v -8.0000 133.0000 34.0000 +v -2.0000 77.0000 15.0000 +v -14.0000 62.0000 10.0000 +v -15.0000 32.0000 9.0000 +v -18.0000 32.0000 10.0000 +v 2.0000 157.0000 30.0000 +v -17.0000 47.0000 24.0000 +v 47.0000 56.0000 1.0000 +v 37.0000 53.0000 2.0000 +v -4.2000 139.0000 35.0000 +v -13.0000 135.0000 33.0000 +v 5.0000 165.0000 39.0000 +v -1.0000 107.0000 28.0000 +v 30.0000 63.0000 4.0000 +v 33.0000 66.0000 1.0000 +v 0.0000 108.0000 26.0000 +v 15.0000 120.0000 17.0000 +v 15.0000 51.0000 9.0000 +v 42.0000 74.0000 -3.0000 +v 40.0000 73.0000 -2.0000 +v 32.0000 68.0000 3.0000 +v 6.0000 105.0000 17.0000 +v 8.0000 92.0000 11.0000 +v -7.0000 73.0000 5.0000 +v 39.0000 92.0000 -7.0000 +v 37.0000 97.0000 -8.0000 +v 39.0000 98.0000 -3.0000 +v 34.0000 91.0000 -7.0000 +v 32.0000 96.0000 -8.0000 +v 33.0000 41.0000 -7.0000 +v 38.0000 43.0000 -8.0000 +v 0.0000 148.0000 29.0000 +v -7.0000 147.0000 31.0000 +v -21.0000 131.0000 20.0000 +v 11.0000 141.0000 33.0000 +v 6.0000 145.0000 34.0000 +v 6.2000 141.0000 35.0000 +v 43.0000 43.0000 -13.0000 +v -40.0000 98.0000 -3.0000 +v -21.0000 137.0000 17.0000 +v -24.0000 141.0000 21.0000 +v -20.0000 142.0000 5.0000 +v -21.0000 134.0000 7.0000 +v -40.0000 43.0000 -9.0000 +v -49.0000 44.0000 -14.0000 +v 9.0000 108.0000 25.0000 +v 13.0000 39.0000 4.0000 +v 39.0000 68.0000 -7.0000 +v 40.0000 74.0000 -7.0000 +v 45.0000 69.0000 -8.0000 +v 30.0000 95.0000 -3.0000 +v 48.0000 58.0000 -13.0000 +v 45.0000 57.0000 -9.0000 +v 19.0000 39.0000 5.0000 +v 42.0000 75.0000 -5.0000 +v 41.0000 55.0000 -2.0000 +v 51.0000 58.0000 -7.0000 +v 38.0000 73.0000 -6.0000 +v 40.0000 40.0000 -11.0000 +v 18.0000 111.0000 -3.0000 +v 12.0000 93.0000 6.0000 +v 31.0000 91.0000 -3.0000 +v 8.0000 82.0000 5.0000 +v 11.0000 93.0000 -2.0000 +v 38.0000 73.0000 -3.0000 +v -18.0000 42.0000 12.0000 +v -18.0000 44.0000 16.0000 +v 33.0000 45.0000 -3.0000 +v 9.0000 123.0000 28.0000 +v 17.0000 129.0000 21.0000 +v 11.0000 132.0000 34.0000 +v 1.0000 143.0000 35.0000 +v 4.2000 139.0000 35.0000 +v 12.0000 40.0000 23.0000 +v 0.0000 122.0000 30.0000 +v 28.0000 60.0000 9.0000 +v -17.0000 9.0000 35.0000 +v -17.0000 13.0000 35.0000 +v -38.0000 13.0000 40.0000 +v -38.0000 9.0000 40.0000 +v -28.0000 9.0000 44.0000 +v 12.0000 135.0000 33.0000 +v 8.2000 139.0000 35.0000 +v 3.0000 125.0000 52.0000 +v -15.0000 44.0000 18.0000 +v -12.0000 149.0000 9.0000 +v 6.0000 147.0000 31.0000 +v 37.0000 13.0000 26.0000 +v 7.0000 13.0000 13.0000 +v 9.0000 13.0000 7.0000 +v 9.0000 9.0000 7.0000 +v 27.0000 9.0000 44.0000 +v 37.0000 13.0000 40.0000 +v 26.0000 13.0000 44.0000 +v 12.0000 32.0000 12.0000 +v 33.0000 21.0000 39.0000 +v 14.0000 44.0000 18.0000 +v 12.0000 9.0000 23.0000 +v 16.0000 9.0000 35.0000 +v 35.0000 9.0000 20.0000 +v 37.0000 9.0000 25.0000 +v 19.0000 9.0000 5.0000 +v 13.0000 13.0000 5.0000 +v 19.0000 13.0000 5.0000 +v 14.0000 32.0000 9.0000 +v 16.0000 13.0000 35.0000 +v 13.0000 9.0000 5.0000 +v 8.0000 9.0000 19.0000 +v 11.0000 44.0000 16.0000 +v 17.0000 32.0000 10.0000 +v -20.0000 13.0000 5.0000 +v 37.0000 9.0000 40.0000 +v 13.0000 42.0000 10.0000 +v 17.0000 44.0000 16.0000 +v 17.0000 42.0000 12.0000 +v -38.0000 13.0000 26.0000 +v -10.0000 9.0000 7.0000 +v -10.0000 13.0000 7.0000 +v -27.0000 13.0000 44.0000 +v -34.0000 21.0000 39.0000 +v -13.0000 9.0000 23.0000 +v -36.0000 9.0000 20.0000 +v -38.0000 9.0000 25.0000 +v -20.0000 9.0000 5.0000 +v -14.0000 13.0000 5.0000 +v -14.0000 9.0000 5.0000 +v -10.0000 123.0000 28.0000 +v 0.0000 121.0000 29.0000 +v 18.0000 153.0000 13.0000 +v 16.0000 133.0000 -4.0000 +v 0.0000 138.0000 -1.0000 +v 17.0000 140.0000 21.0000 +v 10.0000 149.0000 23.0000 +v 16.0000 144.0000 23.0000 +v 21.0000 152.0000 19.0000 +v 18.0000 148.0000 33.0000 +v -8.0000 82.0000 -0.0000 +v 8.0000 77.0000 10.0000 +v -30.0000 66.0000 4.0000 +v -45.0000 46.0000 -2.0000 +v -32.0000 100.0000 -8.0000 +v -19.0000 120.0000 -8.0000 +v -35.0000 102.0000 -8.0000 +v -38.0000 97.0000 -0.0000 +v -9.0000 77.0000 10.0000 +v -20.0000 129.0000 15.0000 +v -42.0000 93.0000 -3.0000 +v -11.0000 149.0000 23.0000 +v 31.0000 100.0000 -8.0000 +v -5.0000 149.0000 34.0000 +v 41.0000 93.0000 -3.0000 +v 0.0000 122.0000 53.0000 +v 1.0000 156.0000 32.0000 +v -25.0000 63.0000 7.0000 +v -17.0000 145.0000 33.0000 +v -19.0000 148.0000 33.0000 +v -22.0000 122.0000 11.0000 +v 7.0000 82.0000 -0.0000 +v 4.0000 149.0000 34.0000 +v 45.0000 46.0000 -3.0000 +v 20.0000 139.0000 34.0000 +v -21.0000 139.0000 34.0000 +v 16.0000 145.0000 33.0000 +v 0.0000 127.0000 53.0000 +v 21.0000 122.0000 11.0000 +v -19.0000 153.0000 13.0000 +v -17.0000 144.0000 23.0000 +v -17.0000 133.0000 -4.0000 +v 31.0000 66.0000 6.0000 +v 34.0000 102.0000 -8.0000 +v 37.0000 97.0000 -0.0000 +v 18.0000 120.0000 -8.0000 +v 19.0000 129.0000 15.0000 +v 28.0000 63.0000 10.0000 +v -21.0000 121.0000 -4.0000 +v 20.0000 121.0000 -4.0000 +v 25.0000 124.0000 -1.0000 +v -26.0000 124.0000 -1.0000 +v -9.0000 114.0000 27.0000 +v 0.0000 114.0000 27.0000 +v -8.8474 114.8597 28.0000 +v -0.0397 114.8597 28.0000 +v 7.8872 114.8597 28.0000 +v 0.0000 129.0000 62.0000 +v 0.0000 119.0000 62.0000 +v 8.0000 114.0000 27.0000 +v 0.0000 88.0000 -3.0000 +v 0.0000 130.0000 -8.0000 +v 0.0000 113.0000 -10.0000 +v -38.0000 103.0000 -3.0000 +v 37.0000 103.0000 -3.0000 +v -24.0000 39.0000 15.0000 +v 23.0000 39.0000 15.0000 +v 26.0000 125.0000 5.0000 +v -27.0000 125.0000 5.0000 +v -6.0000 126.0000 64.0000 +v 5.0000 126.0000 64.0000 +v 0.0000 125.0000 70.0000 +v -20.0000 39.0000 22.0000 +v 19.0000 39.0000 22.0000 +# 379 vertices + +vn 0.4551 0.8904 0.0064 +vn 0.2893 0.9383 0.1896 +vn 0.6191 0.6500 0.4407 +vn -0.3376 0.9342 -0.1155 +vn -0.2675 0.8579 -0.4387 +vn -0.6953 0.6773 -0.2407 +vn 0.1596 0.7368 0.6570 +vn 0.2675 0.8579 -0.4387 +vn 0.3376 0.9342 -0.1155 +vn 0.7537 0.5658 -0.3344 +vn 0.6953 0.6773 -0.2407 +vn 0.7149 0.0380 0.6981 +vn -0.1596 0.7368 0.6570 +vn -0.4551 0.8904 0.0064 +vn -0.2893 0.9383 0.1896 +vn -0.6191 0.6500 0.4407 +vn -0.7537 0.5658 -0.3344 +vn -0.7149 0.0380 0.6981 +vn -0.7022 0.6345 0.3230 +vn 0.7022 0.6345 0.3230 +vn 0.6858 0.4664 -0.5587 +vn -0.6858 0.4664 -0.5587 +vn -0.5738 0.6968 0.4304 +vn 0.5738 0.6968 0.4304 +vn 0.4240 0.3180 0.8480 +vn -0.4240 0.3180 0.8480 +vn 0.0084 -0.9755 -0.2197 +vn 0.7774 -0.6182 0.1162 +vn 0.0347 -0.9622 0.2702 +vn 0.9069 -0.3327 0.2584 +vn 0.6285 0.2105 -0.7488 +vn 0.5955 -0.1965 0.7790 +vn 0.9612 0.2670 -0.0688 +vn 0.9021 -0.0176 0.4312 +vn 0.9926 0.1211 0.0023 +vn 0.7823 0.5866 -0.2095 +vn -0.1191 0.8738 -0.4715 +vn -0.3873 -0.0932 0.9172 +vn 0.7188 0.3102 0.6222 +vn 0.4995 0.2832 0.8187 +vn 0.2727 0.1594 -0.9488 +vn -0.5944 0.2801 -0.7538 +vn 0.4598 -0.0887 -0.8836 +vn 0.9754 -0.1730 0.1368 +vn 0.4085 -0.0914 -0.9082 +vn -0.6890 0.5492 -0.4729 +vn -0.0674 0.3020 -0.9509 +vn 0.3712 -0.3655 0.8536 +vn 0.9338 -0.3521 0.0640 +vn 0.7980 -0.5940 -0.1015 +vn -0.4055 0.2640 -0.8752 +vn -0.5707 0.3993 -0.7176 +vn -0.9217 0.3799 -0.0781 +vn -0.5319 0.3745 0.7594 +vn -0.7572 0.6365 0.1468 +vn 0.5603 0.4321 -0.7067 +vn 0.5907 0.5687 -0.5724 +vn 0.8361 0.0564 0.5457 +vn -0.5153 0.3798 -0.7682 +vn 0.6551 0.3742 -0.6563 +vn -0.8598 0.4044 0.3117 +vn 0.6263 0.1881 -0.7565 +vn -0.2048 0.2982 0.9323 +vn 0.6069 -0.2628 -0.7501 +vn -0.4778 -0.0858 -0.8743 +vn 0.1451 -0.8692 -0.4727 +vn 0.0016 -0.6928 -0.7212 +vn -0.9076 -0.3443 0.2404 +vn -0.5448 -0.4757 0.6906 +vn -0.3712 -0.6090 -0.7009 +vn -0.6722 -0.3648 -0.6442 +vn -0.1573 -0.1645 0.9738 +vn 0.0969 -0.3170 0.9435 +vn 0.1673 -0.2589 0.9513 +vn 0.2196 -0.9608 -0.1695 +vn 0.7066 0.1857 0.6828 +vn 0.7352 -0.0886 0.6720 +vn 0.7733 -0.3340 0.5390 +vn 0.9545 -0.2925 0.0574 +vn -0.6480 -0.2570 0.7170 +vn -0.4802 -0.8097 0.3373 +vn -0.8668 -0.3169 0.3849 +vn 0.0260 -0.1763 0.9840 +vn 0.0248 -0.8302 0.5569 +vn 0.0617 -0.3837 -0.9214 +vn -0.0653 -0.3633 -0.9294 +vn 0.0340 -0.2294 -0.9727 +vn -0.5544 -0.1285 0.8223 +vn -0.5800 -0.8135 0.0430 +vn -0.0532 -0.2282 0.9722 +vn -0.3950 0.0514 0.9173 +vn -0.6405 -0.7440 0.1904 +vn -0.6188 0.2206 0.7539 +vn 0.4780 -0.1221 0.8698 +vn 0.2409 -0.2044 0.9488 +vn 0.0948 0.4257 0.8999 +vn -0.4629 -0.0428 0.8854 +vn 0.6409 0.2094 0.7385 +vn 0.0536 -0.0553 0.9970 +vn 0.4099 -0.0324 0.9116 +vn 0.9819 -0.1611 0.1000 +vn 0.9217 0.3799 -0.0781 +vn 0.5642 0.2964 0.7706 +vn 0.5244 0.0605 0.8493 +vn -0.9754 -0.1730 0.1368 +vn -0.9654 -0.2515 -0.0689 +vn -0.4694 -0.0788 -0.8795 +vn -0.9751 -0.2172 0.0450 +vn 0.4913 0.8602 0.1364 +vn -0.1163 0.4301 0.8953 +vn -0.8959 0.4443 -0.0039 +vn -0.7566 0.5084 0.4112 +vn -0.5642 0.2964 0.7706 +vn -0.2657 0.4041 0.8753 +vn 0.5644 0.0726 -0.8223 +vn 0.6233 -0.1805 0.7609 +vn 0.9458 -0.1291 0.2979 +vn 0.3678 -0.3897 -0.8443 +vn 0.7206 -0.6343 0.2798 +vn -0.5272 -0.2127 0.8227 +vn -0.1739 -0.9789 -0.1072 +vn -0.9695 0.0614 0.2372 +vn -0.7741 -0.6215 0.1203 +vn 0.2651 0.3990 0.8778 +vn 0.6007 -0.0274 -0.7990 +vn 0.4056 0.8709 0.2775 +vn -0.3637 0.3044 0.8804 +vn 0.0000 0.0000 1.0000 +vn -0.4780 -0.1221 0.8698 +vn -0.3712 -0.3655 0.8536 +vn 0.5448 -0.4757 0.6906 +vn -0.7980 -0.5940 -0.1015 +vn 0.8945 0.4455 0.0388 +vn 0.7434 0.6611 0.1011 +vn -0.0648 0.6646 -0.7444 +vn -0.2123 -0.7787 -0.5903 +vn -0.7271 0.4022 -0.5564 +vn 0.2783 -0.0137 -0.9604 +vn 0.1467 -0.6126 -0.7767 +vn 0.8959 0.4443 -0.0039 +vn 0.2309 0.9730 -0.0040 +vn -0.7066 0.6843 0.1801 +vn -0.9350 0.3249 0.1423 +vn -0.6921 0.7041 -0.1589 +vn -0.2194 0.7078 -0.6715 +vn -0.0330 0.5100 -0.8596 +vn -0.7012 0.2653 0.6618 +vn 0.9194 0.0000 0.3934 +vn 0.9193 -0.1131 0.3769 +vn 0.9714 -0.2245 -0.0777 +vn 0.4398 -0.2046 -0.8745 +vn -0.5669 0.0703 -0.8208 +vn -0.5173 0.1649 -0.8398 +vn 0.2384 0.8132 0.5309 +vn 0.0140 0.8775 0.4793 +vn 0.0318 0.8932 0.4485 +vn 0.7722 0.5757 -0.2688 +vn 0.1880 0.5320 -0.8256 +vn -0.9325 -0.2443 0.2660 +vn -0.4376 0.8932 -0.1032 +vn -0.0247 0.5625 0.8264 +vn -0.7823 0.5866 -0.2095 +vn -0.7343 -0.0899 0.6728 +vn 0.0127 0.0558 0.9984 +vn -0.2241 0.1939 0.9551 +vn -0.1772 0.1673 0.9698 +vn 0.5233 -0.6996 -0.4866 +vn -0.3814 0.1454 0.9129 +vn 0.5833 -0.8108 0.0482 +vn 0.5405 -0.1329 0.8308 +vn -0.0089 -0.7687 0.6396 +vn 0.7566 0.5084 0.4112 +vn -0.2933 0.3584 0.8863 +vn 0.2333 0.9220 -0.3091 +vn 0.5012 0.1197 -0.8570 +vn 0.8413 -0.2327 0.4878 +vn 0.9773 0.1296 0.1678 +vn 0.2895 0.9349 -0.2052 +vn 0.4532 -0.0493 0.8901 +vn 0.9543 -0.2916 -0.0661 +vn 0.0380 0.3880 0.9209 +vn -0.3026 0.4630 0.8331 +vn 0.6540 0.0438 -0.7553 +vn 0.8599 0.2885 -0.4212 +vn 0.5029 -0.2336 -0.8322 +vn -0.9021 -0.0176 0.4312 +vn -0.2240 0.8160 0.5329 +vn -0.4540 0.0202 0.8908 +vn -0.8599 0.2885 -0.4212 +vn 0.2980 0.2013 -0.9331 +vn -0.8680 0.2319 -0.4391 +vn 0.9860 -0.0512 -0.1586 +vn -0.5244 0.0605 0.8493 +vn 0.4716 0.2947 0.8311 +vn -0.8147 -0.1501 0.5601 +vn 0.1203 -0.0394 0.9919 +vn -0.0037 -0.1726 0.9850 +vn -0.3570 -0.0701 0.9315 +vn -0.3484 0.1287 0.9285 +vn 0.3139 0.4392 0.8417 +vn 0.1552 -0.1741 0.9724 +vn -0.1111 -0.2497 0.9619 +vn -0.1257 -0.2779 0.9523 +vn 0.3166 0.6444 0.6961 +vn -0.0168 0.3550 0.9347 +vn -0.7764 -0.0704 -0.6263 +vn -0.6634 -0.2021 -0.7205 +vn 0.0166 0.8910 0.4538 +vn 0.8668 -0.3169 0.3849 +vn 0.5944 0.2801 -0.7538 +vn 0.8442 0.2317 0.4834 +vn -0.0633 0.7545 0.6533 +vn -0.5368 0.7496 0.3871 +vn 0.4952 -0.8028 0.3321 +vn 0.6620 -0.2547 0.7049 +vn -0.6271 0.0419 -0.7778 +vn 0.5614 0.0779 -0.8238 +vn 0.5173 0.1649 -0.8398 +vn 0.9217 0.3793 0.0813 +vn -0.4398 -0.2046 -0.8745 +vn -0.5029 -0.2336 -0.8322 +vn -0.6755 -0.6703 -0.3073 +vn -0.3510 -0.6334 -0.6896 +vn 0.1028 0.4930 0.8640 +vn -0.0014 0.8084 0.5887 +vn -0.1394 0.9807 0.1370 +vn -0.9926 0.1211 0.0023 +vn 0.4532 0.1975 0.8693 +vn 0.2179 0.2469 0.9442 +vn 0.2148 0.2100 0.9538 +vn -0.2487 -0.6507 -0.7174 +vn -0.9217 0.3793 0.0813 +vn -0.9069 -0.3327 0.2584 +vn -0.5955 -0.1965 0.7790 +vn -0.6271 0.2105 -0.7500 +vn -0.9612 0.2670 -0.0688 +vn -0.4265 -0.8853 -0.1851 +vn -0.5209 0.0254 0.8532 +vn 0.5804 -0.1655 -0.7973 +vn 0.1868 -0.5813 -0.7920 +vn -0.3917 -0.6003 -0.6973 +vn 0.3863 0.0420 0.9214 +vn -0.2727 0.1594 -0.9488 +vn -0.6133 -0.0748 -0.7863 +vn -0.0115 0.3076 -0.9515 +vn 0.5973 0.5564 -0.5776 +vn -0.9338 -0.3521 0.0640 +vn 0.1604 0.2510 -0.9546 +vn -0.7524 -0.3042 -0.5843 +vn 0.5707 0.3993 -0.7176 +vn 0.8417 0.4843 -0.2389 +vn -0.6686 -0.0302 0.7430 +vn -0.7769 0.4452 -0.4452 +vn -0.8130 0.3269 -0.4818 +vn 0.1689 0.4506 -0.8766 +vn 0.8948 0.4409 0.0702 +vn -0.7122 0.1806 -0.6784 +vn -0.3337 -0.8493 -0.4091 +vn 0.3712 -0.6090 -0.7009 +vn 0.9076 -0.3443 0.2404 +vn -0.9545 -0.2925 0.0574 +vn 0.9751 -0.2172 0.0450 +vn 0.6779 -0.3641 -0.6387 +vn -0.7733 -0.3340 0.5390 +vn -0.9079 0.0822 -0.4110 +vn -0.7430 -0.2456 0.6226 +vn -0.9132 -0.1172 0.3904 +vn 0.2870 -0.7229 0.6285 +vn 0.6405 -0.7441 0.1900 +vn 0.7012 0.2653 0.6618 +vn -0.0169 0.0496 0.9986 +vn -0.1049 -0.0450 0.9935 +vn -0.2409 -0.2044 0.9488 +vn 0.0097 -0.9921 0.1252 +vn -0.7686 -0.1658 -0.6179 +vn -0.6412 -0.3594 -0.6780 +vn -0.6081 -0.6688 0.4277 +vn 0.8169 -0.0381 0.5756 +vn 0.8437 -0.1459 0.5166 +vn 0.8160 0.0000 0.5781 +vn -0.8260 0.0117 0.5635 +vn -0.8281 0.0000 0.5606 +vn 0.0875 -0.0339 0.9956 +vn 0.4162 -0.1097 0.9026 +vn 0.4247 0.1485 0.8931 +vn 0.4993 -0.8393 -0.2151 +vn -0.4809 0.8474 0.2252 +vn 0.9759 0.0718 0.2062 +vn 0.0000 -0.3653 0.9309 +vn 0.1343 -0.1189 0.9838 +vn 0.8148 0.3326 0.4749 +vn 0.1202 0.8728 -0.4731 +vn -0.0999 0.4785 0.8724 +vn 0.3204 0.8774 0.3572 +vn 0.9573 0.2538 -0.1381 +vn -0.9714 -0.2245 -0.0777 +vn -0.7555 0.0000 -0.6552 +vn -0.7802 -0.0746 -0.6210 +vn -0.0875 -0.0339 0.9956 +vn 0.8260 0.0117 0.5635 +vn -0.2445 -0.0431 0.9687 +vn -0.9773 0.1296 0.1678 +vn -0.8148 0.3326 0.4749 +vn -0.1343 -0.1189 0.9838 +vn 0.3773 0.7323 0.5669 +vn -0.2120 0.5837 0.7838 +vn 0.7589 0.4024 0.5120 +vn -0.0000 -0.3653 0.9309 +vn -0.8407 -0.2102 0.4990 +vn -0.8169 -0.0381 0.5756 +vn -0.8437 -0.1459 0.5166 +vn 0.8362 0.0172 -0.5482 +vn 0.9884 0.0231 -0.1500 +vn 0.9747 0.0542 -0.2169 +vn 0.3677 0.0000 -0.9299 +vn -0.2298 0.0000 -0.9732 +vn -0.2249 0.2121 -0.9510 +vn -0.2980 0.2013 -0.9331 +vn 0.4274 0.3431 -0.8364 +vn 0.8421 0.0000 -0.5394 +vn -0.6946 0.5136 0.5037 +vn -0.7379 0.2363 -0.6322 +vn -0.9658 0.2507 -0.0658 +vn -0.9193 -0.1131 0.3769 +vn -0.8413 -0.2327 0.4878 +vn 0.8680 0.2319 -0.4391 +vn -0.8160 0.0000 0.5781 +vn -0.4274 0.3431 -0.8364 +vn 0.8281 0.0000 0.5606 +vn -0.9194 0.0000 0.3934 +vn -0.5012 0.1197 -0.8570 +vn 0.7430 -0.2456 0.6226 +vn 0.9079 0.0822 -0.4110 +vn -0.9573 0.2538 -0.1381 +vn 0.7802 -0.0746 -0.6210 +vn 0.7555 0.0000 -0.6552 +vn 0.2445 -0.0431 0.9687 +vn -0.3773 0.7323 0.5669 +vn -0.7589 0.4024 0.5120 +vn 0.2120 0.5837 0.7838 +vn 0.8407 -0.2102 0.4990 +vn -0.8362 0.0172 -0.5482 +vn -0.9747 0.0542 -0.2169 +vn -0.9884 0.0231 -0.1500 +vn -0.3677 0.0000 -0.9299 +vn 0.2298 0.0000 -0.9732 +vn 0.2249 0.2121 -0.9510 +vn -0.8421 0.0000 -0.5394 +vn 0.6946 0.5136 0.5037 +vn 0.7379 0.2363 -0.6322 +vn 0.9658 0.2507 -0.0658 +vn -0.2719 -0.6873 0.6735 +vn 0.0107 -0.7071 0.7071 +vn -0.4792 0.8656 0.1452 +vn 0.4338 0.5063 -0.7453 +vn 0.0014 0.6759 -0.7370 +vn 0.7343 -0.0899 0.6728 +vn 0.3963 0.8912 0.2206 +vn 0.6984 0.4147 0.5833 +vn 0.8182 0.0210 0.5746 +vn 0.0247 0.5625 0.8264 +vn -0.8327 -0.2225 0.5070 +vn 0.9030 0.4285 0.0309 +vn -0.7418 0.4112 -0.5298 +vn 0.7568 0.4308 0.4917 +vn -0.8030 -0.2653 -0.5336 +vn -0.6373 -0.3419 -0.6906 +vn 0.8211 -0.2553 -0.5105 +vn 0.8659 0.2995 0.4007 +vn 0.9327 0.3036 0.1947 +vn 0.3005 0.8356 0.4598 +vn 0.8903 0.4553 0.0068 +vn -0.3969 -0.6468 0.6512 +vn -0.9068 -0.3153 0.2798 +vn -0.4548 -0.4343 0.7775 +vn 0.4094 -0.1500 -0.8999 +vn -0.5804 0.0094 -0.8142 +vn -0.3878 0.2859 -0.8763 +vn -0.0903 -0.1315 0.9872 +vn -0.4993 0.0382 0.8656 +vn -0.6934 0.0267 0.7201 +vn -0.8659 0.2995 0.4007 +vn -0.8824 -0.0992 0.4598 +vn -0.9844 0.0464 0.1695 +vn -0.9662 0.1745 0.1895 +vn -0.1700 -0.0648 -0.9833 +vn 0.7953 -0.2922 -0.5311 +vn -0.3966 0.8906 0.2227 +vn -0.7568 0.4308 0.4917 +vn -0.3794 -0.0141 0.9251 +vn -0.4094 -0.1500 -0.8999 +vn 0.1868 0.9488 0.2546 +vn 0.9491 0.1269 -0.2883 +vn 0.9636 0.1587 0.2150 +vn 0.0831 -0.9965 -0.0124 +vn -0.0776 -0.4553 0.8869 +vn 0.7079 0.3433 0.6172 +vn -0.9327 0.3036 0.1947 +vn -0.9996 0.0212 -0.0208 +vn -0.9030 0.4285 0.0309 +vn 0.1597 0.8214 0.5476 +vn -0.6884 -0.1782 0.7032 +vn 0.0326 -0.4129 -0.9102 +vn 0.6482 -0.3371 -0.6828 +vn -0.8182 0.0210 0.5746 +vn -0.1868 0.9488 0.2546 +vn 0.5407 -0.6338 0.5531 +vn 0.7995 -0.5904 0.1103 +vn -0.7995 -0.5904 0.1103 +vn 0.9996 0.0212 -0.0208 +vn 0.0693 0.9961 0.0540 +vn 0.6884 -0.1782 0.7032 +vn 0.4792 0.8656 0.1452 +vn 0.9711 -0.2331 0.0521 +vn -0.6984 0.4147 0.5833 +vn -0.4307 0.5062 -0.7471 +vn 0.5873 0.4577 0.6675 +vn -0.2990 0.8822 0.3636 +vn -0.8571 0.4286 0.2857 +vn -0.7807 0.6079 0.1450 +vn 0.6512 -0.3905 0.6507 +vn 0.3878 0.2859 -0.8763 +vn 0.0086 -0.1334 0.9910 +vn 0.5008 0.0354 0.8648 +vn 0.7645 0.0828 0.6393 +vn 0.5830 0.0095 -0.8124 +vn 0.8824 -0.0992 0.4598 +vn 0.0848 -0.0660 -0.9942 +vn -0.7953 -0.2922 -0.5311 +vn -0.5632 0.3142 0.7642 +vn -0.5691 0.1678 -0.8050 +vn 0.5691 0.1678 -0.8050 +vn 0.6754 0.4754 -0.5637 +vn -0.6754 0.4754 -0.5637 +vn -0.4369 -0.1935 0.8784 +vn 0.0040 -0.2202 0.9755 +vn 0.0000 -0.1644 0.9864 +vn -0.2358 -0.0785 0.9686 +vn -0.5084 -0.0720 0.8581 +vn -0.6923 -0.1085 0.7134 +vn 0.0050 -0.0922 0.9957 +vn 0.0000 -0.1607 0.9870 +vn 0.2390 -0.0818 0.9676 +vn 0.0000 -1.0000 -0.0000 +vn -0.3126 -0.2531 0.9155 +vn 0.0392 0.9969 0.0684 +vn 0.0438 -0.9889 0.1419 +vn 0.4383 -0.1908 0.8784 +vn 0.3197 -0.2512 0.9136 +vn 0.6916 -0.1063 0.7145 +vn 0.4585 -0.6477 0.6085 +vn 0.4982 -0.6289 0.5969 +vn 0.0000 -0.7583 0.6519 +vn -0.4875 -0.6239 0.6108 +vn -0.4625 -0.6362 0.6175 +vn 0.5124 -0.0700 0.8559 +vn 0.0098 -0.2541 -0.9671 +vn 0.0032 0.4043 -0.9146 +vn 0.0051 -0.1188 -0.9929 +vn -0.9209 0.3866 -0.0507 +vn 0.9209 0.3866 -0.0507 +vn -0.9373 0.3463 0.0396 +vn 0.9373 0.3463 0.0396 +vn 0.8891 0.4019 0.2190 +vn -0.8891 0.4019 0.2190 +vn -0.9319 0.1986 0.3035 +vn 0.9376 0.2103 0.2770 +vn 0.0340 0.0251 0.9991 +vn -0.6553 0.0786 0.7512 +vn 0.6553 0.0786 0.7512 +# 470 vertex normals + +vt 0.5935 0.5683 0.0000 +vt 0.6011 0.2550 0.0000 +vt 0.7771 0.2073 0.0000 +vt 0.3922 0.2449 0.0000 +vt 0.4094 0.4628 0.0000 +vt 0.3974 0.7061 0.0000 +vt 0.6003 0.7001 0.0000 +vt 0.4119 0.4635 0.0000 +vt 0.3947 0.2456 0.0000 +vt 0.3364 0.2555 0.0000 +vt 0.3998 0.7068 0.0000 +vt 0.4573 0.8559 0.0000 +vt 0.6027 0.7009 0.0000 +vt 0.5959 0.5691 0.0000 +vt 0.6035 0.2557 0.0000 +vt 0.7795 0.2080 0.0000 +vt 0.3339 0.2548 0.0000 +vt 0.4548 0.8552 0.0000 +vt 0.8243 0.5472 0.0000 +vt 0.8219 0.5465 0.0000 +vt 0.1718 0.3402 0.0000 +vt 0.1694 0.3394 0.0000 +vt 0.8533 0.7300 0.0000 +vt 0.8508 0.7292 0.0000 +vt 0.5463 0.8578 0.0000 +vt 0.5438 0.8571 0.0000 +vt 0.6912 0.6867 0.0000 +vt 0.7473 0.7434 0.0000 +vt 0.6912 0.5733 0.0000 +vt 0.3358 0.9427 0.0000 +vt 0.3347 0.9512 0.0000 +vt 0.3392 0.9495 0.0000 +vt 0.2104 0.9407 0.0000 +vt 0.2093 0.9539 0.0000 +vt 0.2104 0.9457 0.0000 +vt 0.6155 0.7434 0.0000 +vt 0.6040 0.6794 0.0000 +vt 0.6212 0.7221 0.0000 +vt 0.3525 0.9800 0.0000 +vt 0.2262 0.9819 0.0000 +vt 0.2009 0.9654 0.0000 +vt 0.6732 0.8940 0.0000 +vt 0.7078 0.9803 0.0000 +vt 0.6594 0.9187 0.0000 +vt 0.0737 0.0251 0.0000 +vt 0.0610 0.2197 0.0000 +vt 0.1055 0.2197 0.0000 +vt 0.1182 0.0251 0.0000 +vt 0.5595 0.9049 0.0000 +vt 0.5905 0.9164 0.0000 +vt 0.5595 0.9739 0.0000 +vt 0.1544 0.8781 0.0000 +vt 0.1565 0.8765 0.0000 +vt 0.1586 0.8831 0.0000 +vt 0.6112 0.7899 0.0000 +vt 0.0355 0.0251 0.0000 +vt 0.0419 0.2197 0.0000 +vt 0.5750 0.9279 0.0000 +vt 0.5699 0.9854 0.0000 +vt 0.2666 0.7954 0.0000 +vt 0.2678 0.8039 0.0000 +vt 0.2733 0.8005 0.0000 +vt 0.2566 0.8089 0.0000 +vt 0.2611 0.8072 0.0000 +vt 0.6164 0.7899 0.0000 +vt 0.5492 0.9624 0.0000 +vt 0.5854 0.7669 0.0000 +vt 0.5905 0.7784 0.0000 +vt 0.1354 0.8156 0.0000 +vt 0.1449 0.8024 0.0000 +vt 0.1354 0.8024 0.0000 +vt 0.1438 0.7859 0.0000 +vt 0.1407 0.7909 0.0000 +vt 0.2990 0.8682 0.0000 +vt 0.2923 0.9055 0.0000 +vt 0.2923 0.8987 0.0000 +vt 0.1692 0.9094 0.0000 +vt 0.1692 0.9028 0.0000 +vt 0.1766 0.8732 0.0000 +vt 0.1755 0.8732 0.0000 +vt 0.8181 0.3399 0.0000 +vt 0.8002 0.2625 0.0000 +vt 0.7912 0.3205 0.0000 +vt 0.2241 0.8172 0.0000 +vt 0.2273 0.8271 0.0000 +vt 0.2252 0.8221 0.0000 +vt 0.1481 0.8403 0.0000 +vt 0.1555 0.8699 0.0000 +vt 0.7814 0.8613 0.0000 +vt 0.7889 0.9209 0.0000 +vt 0.7551 0.9897 0.0000 +vt 0.2812 0.8784 0.0000 +vt 0.8822 0.9878 0.0000 +vt 0.9427 0.7649 0.0000 +vt 0.9427 0.9706 0.0000 +vt 0.0818 0.3780 0.0000 +vt 0.0418 0.3780 0.0000 +vt 0.0633 0.4779 0.0000 +vt 0.5354 0.5515 0.0000 +vt 0.5182 0.6439 0.0000 +vt 0.5297 0.5088 0.0000 +vt 0.2762 0.4853 0.0000 +vt 0.3172 0.4853 0.0000 +vt 0.2644 0.2703 0.0000 +vt 0.6549 0.5088 0.0000 +vt 0.6549 0.5195 0.0000 +vt 0.6281 0.7434 0.0000 +vt 0.7927 0.7924 0.0000 +vt 0.8152 0.8613 0.0000 +vt 0.0928 0.1548 0.0000 +vt 0.0800 0.0413 0.0000 +vt 0.3524 0.4853 0.0000 +vt 0.3700 0.2898 0.0000 +vt 0.8339 0.7924 0.0000 +vt 0.8152 0.8016 0.0000 +vt 0.8189 0.7924 0.0000 +vt 0.1512 0.8073 0.0000 +vt 0.1544 0.7941 0.0000 +vt 0.0418 0.2197 0.0000 +vt 0.0609 0.2359 0.0000 +vt 0.0546 0.1548 0.0000 +vt 0.2223 0.0103 0.0000 +vt 0.2450 0.2232 0.0000 +vt 0.1767 0.2232 0.0000 +vt 0.1798 0.8551 0.0000 +vt 0.0991 0.2359 0.0000 +vt 0.5078 0.9049 0.0000 +vt 0.0325 0.4879 0.0000 +vt 0.0233 0.3780 0.0000 +vt 0.0141 0.2782 0.0000 +vt 0.0510 0.4679 0.0000 +vt 0.6369 0.9326 0.0000 +vt 0.6783 0.8956 0.0000 +vt 0.6991 0.9573 0.0000 +vt 0.6645 0.7724 0.0000 +vt 0.6991 0.7971 0.0000 +vt 0.1629 0.8189 0.0000 +vt 0.1555 0.8221 0.0000 +vt 0.1565 0.8172 0.0000 +vt 0.6751 0.5166 0.0000 +vt 0.6310 0.7434 0.0000 +vt 0.0633 0.3780 0.0000 +vt 0.0726 0.4679 0.0000 +vt 0.1586 0.8238 0.0000 +vt 0.5130 0.8819 0.0000 +vt 0.5647 0.9739 0.0000 +vt 0.1764 0.4873 0.0000 +vt 0.1659 0.3923 0.0000 +vt 0.1904 0.3923 0.0000 +vt 0.8681 0.0587 0.0000 +vt 0.7561 0.1476 0.0000 +vt 0.7841 0.0142 0.0000 +vt 0.1311 0.1522 0.0000 +vt 0.1539 0.2409 0.0000 +vt 0.7336 0.8094 0.0000 +vt 0.7198 0.9819 0.0000 +vt 0.2231 0.8781 0.0000 +vt 0.2083 0.9094 0.0000 +vt 0.2188 0.8831 0.0000 +vt 0.3024 0.6051 0.0000 +vt 0.2576 0.6106 0.0000 +vt 0.2924 0.6216 0.0000 +vt 0.5595 0.9624 0.0000 +vt 0.2326 0.8024 0.0000 +vt 0.2400 0.8024 0.0000 +vt 0.2379 0.7925 0.0000 +vt 0.3465 0.2703 0.0000 +vt 0.0911 0.4879 0.0000 +vt 0.2875 0.5941 0.0000 +vt 0.2924 0.5720 0.0000 +vt 0.2576 0.6601 0.0000 +vt 0.2974 0.7041 0.0000 +vt 0.2675 0.6876 0.0000 +vt 0.5211 0.6794 0.0000 +vt 0.5525 0.6794 0.0000 +vt 0.5297 0.7292 0.0000 +vt 0.7617 0.4834 0.0000 +vt 0.7617 0.2664 0.0000 +vt 0.7581 0.4834 0.0000 +vt 0.1523 0.8699 0.0000 +vt 0.1470 0.8716 0.0000 +vt 0.1491 0.8798 0.0000 +vt 0.1967 0.9391 0.0000 +vt 0.1893 0.9424 0.0000 +vt 0.1893 0.9358 0.0000 +vt 0.2576 0.7317 0.0000 +vt 0.2974 0.6051 0.0000 +vt 0.3622 0.6161 0.0000 +vt 0.9034 0.1557 0.0000 +vt 0.8812 0.2370 0.0000 +vt 0.9097 0.0161 0.0000 +vt 0.8540 0.4564 0.0000 +vt 0.8093 0.4951 0.0000 +vt 0.8003 0.4177 0.0000 +vt 0.1523 0.7876 0.0000 +vt 0.7406 0.8217 0.0000 +vt 0.7645 0.4177 0.0000 +vt 0.5955 0.5088 0.0000 +vt 0.5897 0.5515 0.0000 +vt 0.5611 0.5230 0.0000 +vt 0.1003 0.3780 0.0000 +vt 0.5285 0.8704 0.0000 +vt 0.3173 0.6601 0.0000 +vt 0.0048 0.2682 0.0000 +vt 0.1096 0.2782 0.0000 +vt 0.1188 0.2682 0.0000 +vt 0.2979 0.7818 0.0000 +vt 0.3001 0.7852 0.0000 +vt 0.2990 0.7649 0.0000 +vt 0.2825 0.6766 0.0000 +vt 0.1541 0.2409 0.0000 +vt 0.1313 0.1522 0.0000 +vt 0.2452 0.2232 0.0000 +vt 0.8152 0.7787 0.0000 +vt 0.8002 0.7649 0.0000 +vt 0.0818 0.4879 0.0000 +vt 0.1034 0.3780 0.0000 +vt 0.2224 0.0103 0.0000 +vt 0.1769 0.2232 0.0000 +vt 0.2767 0.8733 0.0000 +vt 0.2745 0.8648 0.0000 +vt 0.2711 0.8750 0.0000 +vt 0.5096 0.7434 0.0000 +vt 0.1808 0.9391 0.0000 +vt 0.8077 0.7924 0.0000 +vt 0.0911 0.2782 0.0000 +vt 0.0141 0.2682 0.0000 +vt 0.0202 0.3780 0.0000 +vt 0.1734 0.7727 0.0000 +vt 0.1703 0.7727 0.0000 +vt 0.1745 0.7892 0.0000 +vt 0.6576 0.9203 0.0000 +vt 0.0610 0.2359 0.0000 +vt 0.7354 0.8078 0.0000 +vt 0.6663 0.7708 0.0000 +vt 0.3641 0.2703 0.0000 +vt 0.8182 0.3790 0.0000 +vt 0.8719 0.3016 0.0000 +vt 0.7556 0.3016 0.0000 +vt 0.7824 0.3790 0.0000 +vt 0.0325 0.2782 0.0000 +vt 0.8264 0.7649 0.0000 +vt 0.8182 0.3403 0.0000 +vt 0.7914 0.3210 0.0000 +vt 0.8003 0.2629 0.0000 +vt 0.3323 0.5225 0.0000 +vt 0.5611 0.5515 0.0000 +vt 0.2210 0.8238 0.0000 +vt 0.2241 0.8287 0.0000 +vt 0.7810 0.5175 0.0000 +vt 0.8111 0.5069 0.0000 +vt 0.8145 0.5175 0.0000 +vt 0.6069 0.6439 0.0000 +vt 0.1096 0.2682 0.0000 +vt 0.5717 0.9743 0.0000 +vt 0.5614 0.9628 0.0000 +vt 0.5201 0.9053 0.0000 +vt 0.8377 0.9209 0.0000 +vt 0.8452 0.8613 0.0000 +vt 0.8714 0.9897 0.0000 +vt 0.0418 0.4879 0.0000 +vt 0.2305 0.8716 0.0000 +vt 0.2284 0.8798 0.0000 +vt 0.2305 0.8814 0.0000 +vt 0.3514 0.8648 0.0000 +vt 0.3492 0.8733 0.0000 +vt 0.3548 0.8750 0.0000 +vt 0.2241 0.7876 0.0000 +vt 0.2294 0.7909 0.0000 +vt 0.1872 0.9556 0.0000 +vt 0.1893 0.9638 0.0000 +vt 0.1819 0.9621 0.0000 +vt 0.5039 0.7221 0.0000 +vt 0.7644 0.4173 0.0000 +vt 0.8091 0.4946 0.0000 +vt 0.8002 0.4173 0.0000 +vt 0.2347 0.7909 0.0000 +vt 0.5125 0.7078 0.0000 +vt 0.1470 0.8814 0.0000 +vt 0.8681 0.1476 0.0000 +vt 0.8121 0.2366 0.0000 +vt 0.2901 0.9427 0.0000 +vt 0.2867 0.9495 0.0000 +vt 0.2912 0.9512 0.0000 +vt 0.1671 0.9407 0.0000 +vt 0.1671 0.9457 0.0000 +vt 0.1681 0.9539 0.0000 +vt 0.1639 0.9523 0.0000 +vt 0.1703 0.9506 0.0000 +vt 0.1491 0.8238 0.0000 +vt 0.1523 0.8271 0.0000 +vt 0.1555 0.8287 0.0000 +vt 0.1470 0.7909 0.0000 +vt 0.1375 0.7925 0.0000 +vt 0.8446 0.5175 0.0000 +vt 0.0609 0.2197 0.0000 +vt 0.5562 0.9053 0.0000 +vt 0.5614 0.9743 0.0000 +vt 0.5873 0.9168 0.0000 +vt 0.2210 0.8765 0.0000 +vt 0.6028 0.7903 0.0000 +vt 0.5873 0.7788 0.0000 +vt 0.5717 0.9858 0.0000 +vt 0.5769 0.9283 0.0000 +vt 0.3548 0.8005 0.0000 +vt 0.3592 0.8039 0.0000 +vt 0.3592 0.7954 0.0000 +vt 0.3637 0.8072 0.0000 +vt 0.3670 0.8089 0.0000 +vt 0.6183 0.7903 0.0000 +vt 0.5511 0.9628 0.0000 +vt 0.2252 0.8699 0.0000 +vt 0.5976 0.7673 0.0000 +vt 0.2400 0.8156 0.0000 +vt 0.2315 0.7859 0.0000 +vt 0.3336 0.8987 0.0000 +vt 0.3336 0.9055 0.0000 +vt 0.3269 0.8682 0.0000 +vt 0.2220 0.8699 0.0000 +vt 0.2019 0.8732 0.0000 +vt 0.1977 0.8551 0.0000 +vt 0.2009 0.8732 0.0000 +vt 0.2294 0.8403 0.0000 +vt 0.9946 0.9878 0.0000 +vt 0.3447 0.8784 0.0000 +vt 0.3602 0.4580 0.0000 +vt 0.3187 0.2957 0.0000 +vt 0.2703 0.4580 0.0000 +vt 0.2114 0.3923 0.0000 +vt 0.2429 0.2762 0.0000 +vt 0.2184 0.2762 0.0000 +vt 0.1810 0.8772 0.0000 +vt 0.1810 0.8607 0.0000 +vt 0.1810 0.8805 0.0000 +vt 0.2009 0.4873 0.0000 +vt 0.2241 0.7941 0.0000 +vt 0.2284 0.8073 0.0000 +vt 0.5897 0.6652 0.0000 +vt 0.6126 0.7078 0.0000 +vt 0.2083 0.9028 0.0000 +vt 0.5955 0.7292 0.0000 +vt 0.8538 0.4560 0.0000 +vt 0.8181 0.3786 0.0000 +vt 0.1589 0.2762 0.0000 +vt 0.1344 0.2762 0.0000 +vt 0.7453 0.7434 0.0000 +vt 0.6781 0.5147 0.0000 +vt 0.7213 0.7434 0.0000 +vt 0.6386 0.9310 0.0000 +vt 0.6801 0.9556 0.0000 +vt 0.6939 0.7954 0.0000 +vt 0.2188 0.8189 0.0000 +vt 0.7906 0.2664 0.0000 +vt 0.7725 0.4834 0.0000 +vt 0.7906 0.4834 0.0000 +vt 0.8665 0.4834 0.0000 +vt 0.8665 0.2664 0.0000 +vt 0.8303 0.2664 0.0000 +vt 0.5252 0.8823 0.0000 +vt 0.7845 0.0146 0.0000 +vt 0.8685 0.1481 0.0000 +vt 0.8685 0.0591 0.0000 +vt 0.7554 0.3012 0.0000 +vt 0.7823 0.3786 0.0000 +vt 0.1713 0.7727 0.0000 +vt 0.1703 0.7925 0.0000 +vt 0.2294 0.8238 0.0000 +vt 0.2586 0.2898 0.0000 +vt 0.7565 0.1481 0.0000 +vt 0.8125 0.2370 0.0000 +vt 0.2820 0.2703 0.0000 +vt 0.2733 0.9800 0.0000 +vt 0.5726 0.6794 0.0000 +vt 0.1734 0.7925 0.0000 +vt 0.1703 0.7892 0.0000 +vt 0.7032 0.5166 0.0000 +vt 0.5915 0.9409 0.0000 +vt 0.5878 0.9174 0.0000 +vt 0.6136 0.9057 0.0000 +vt 0.7216 0.8201 0.0000 +vt 0.5407 0.8708 0.0000 +vt 0.1512 0.9819 0.0000 +vt 0.1766 0.9654 0.0000 +vt 0.1903 0.9556 0.0000 +vt 0.1956 0.9621 0.0000 +vt 0.5143 0.8998 0.0000 +vt 0.5143 0.8705 0.0000 +vt 0.5069 0.8646 0.0000 +vt 0.7654 0.4834 0.0000 +vt 0.7654 0.2664 0.0000 +vt 0.8304 0.2664 0.0000 +vt 0.8666 0.4834 0.0000 +vt 0.8268 0.4834 0.0000 +vt 0.5989 0.9467 0.0000 +vt 0.5216 0.7884 0.0000 +vt 0.5474 0.7591 0.0000 +vt 0.5069 0.7825 0.0000 +vt 0.2041 0.7925 0.0000 +vt 0.2041 0.7727 0.0000 +vt 0.2062 0.7727 0.0000 +vt 0.7762 0.2664 0.0000 +vt 0.7907 0.2664 0.0000 +vt 0.7726 0.4834 0.0000 +vt 0.8593 0.2664 0.0000 +vt 0.8666 0.2664 0.0000 +vt 0.8015 0.2664 0.0000 +vt 0.7798 0.4834 0.0000 +vt 0.8015 0.4834 0.0000 +vt 0.5952 0.9878 0.0000 +vt 0.5915 0.9643 0.0000 +vt 0.5731 0.9878 0.0000 +vt 0.1755 0.7727 0.0000 +vt 0.8593 0.4834 0.0000 +vt 0.5731 0.8294 0.0000 +vt 0.5842 0.8118 0.0000 +vt 0.6026 0.8822 0.0000 +vt 0.7798 0.2664 0.0000 +vt 0.6099 0.9760 0.0000 +vt 0.6173 0.9409 0.0000 +vt 0.7618 0.2664 0.0000 +vt 0.3291 0.7852 0.0000 +vt 0.3258 0.7852 0.0000 +vt 0.3269 0.7649 0.0000 +vt 0.5805 0.9584 0.0000 +vt 0.2019 0.7727 0.0000 +vt 0.7907 0.4834 0.0000 +vt 0.5142 0.8998 0.0000 +vt 0.5657 0.9409 0.0000 +vt 0.5879 0.9174 0.0000 +vt 0.7618 0.4834 0.0000 +vt 0.3280 0.7818 0.0000 +vt 0.2030 0.7892 0.0000 +vt 0.2072 0.7727 0.0000 +vt 0.2968 0.7852 0.0000 +vt 0.2072 0.7925 0.0000 +vt 0.2072 0.7892 0.0000 +vt 0.5658 0.9409 0.0000 +vt 0.5842 0.9467 0.0000 +vt 0.5804 0.9584 0.0000 +vt 0.5142 0.8705 0.0000 +vt 0.7653 0.2664 0.0000 +vt 0.7653 0.4834 0.0000 +vt 0.8267 0.4834 0.0000 +vt 0.5988 0.9467 0.0000 +vt 0.5473 0.7591 0.0000 +vt 0.7761 0.2664 0.0000 +vt 0.8014 0.2664 0.0000 +vt 0.8014 0.4834 0.0000 +vt 0.5841 0.9467 0.0000 +vt 0.5841 0.8118 0.0000 +vt 0.6025 0.8822 0.0000 +vt 0.6172 0.9409 0.0000 +vt 0.5640 0.6581 0.0000 +vt 0.5354 0.6652 0.0000 +vt 0.6781 0.6290 0.0000 +vt 0.6300 0.7434 0.0000 +vt 0.7185 0.5195 0.0000 +vt 0.7185 0.5088 0.0000 +vt 0.6850 0.5088 0.0000 +vt 0.5290 0.8529 0.0000 +vt 0.5584 0.8412 0.0000 +vt 0.5289 0.8529 0.0000 +vt 0.0716 0.9666 0.0000 +vt 0.0783 0.9735 0.0000 +vt 0.0946 0.9839 0.0000 +vt 0.0764 0.9390 0.0000 +vt 0.0793 0.9545 0.0000 +vt 0.0803 0.9407 0.0000 +vt 0.0611 0.9476 0.0000 +vt 0.0831 0.9528 0.0000 +vt 0.0774 0.9511 0.0000 +vt 0.0803 0.9459 0.0000 +vt 0.0611 0.9683 0.0000 +vt 0.0707 0.9666 0.0000 +vt 0.0764 0.9580 0.0000 +vt 0.0726 0.9425 0.0000 +vt 0.5874 0.7669 0.0000 +vt 0.5960 0.7780 0.0000 +vt 0.6134 0.9780 0.0000 +vt 0.0812 0.9718 0.0000 +vt 0.4580 0.4028 0.0000 +vt 0.4906 0.4662 0.0000 +vt 0.4580 0.4451 0.0000 +vt 0.9936 0.2370 0.0000 +vt 0.9715 0.1557 0.0000 +vt 0.9651 0.0161 0.0000 +vt 0.0783 0.9407 0.0000 +vt 0.0716 0.9528 0.0000 +vt 0.0544 0.8355 0.0000 +vt 0.0525 0.8510 0.0000 +vt 0.0534 0.8510 0.0000 +vt 0.0668 0.8355 0.0000 +vt 0.0688 0.8424 0.0000 +vt 0.0697 0.8355 0.0000 +vt 0.0275 0.8217 0.0000 +vt 0.0323 0.8234 0.0000 +vt 0.0314 0.8269 0.0000 +vt 0.0180 0.7890 0.0000 +vt 0.0295 0.7872 0.0000 +vt 0.0266 0.8010 0.0000 +vt 0.0113 0.8097 0.0000 +vt 0.0122 0.7959 0.0000 +vt 0.0170 0.8062 0.0000 +vt 0.0247 0.8769 0.0000 +vt 0.0304 0.8821 0.0000 +vt 0.0295 0.8752 0.0000 +vt 0.0122 0.8097 0.0000 +vt 0.0429 0.9011 0.0000 +vt 0.0429 0.9166 0.0000 +vt 0.0496 0.8700 0.0000 +vt 0.0333 0.8804 0.0000 +vt 0.0314 0.8735 0.0000 +vt 0.0228 0.8786 0.0000 +vt 0.0275 0.8855 0.0000 +vt 0.0218 0.8355 0.0000 +vt 0.0237 0.8355 0.0000 +vt 0.0208 0.8372 0.0000 +vt 0.0553 0.8424 0.0000 +vt 0.0525 0.8424 0.0000 +vt 0.0525 0.8683 0.0000 +vt 0.0486 0.8700 0.0000 +vt 0.8374 0.5564 0.0000 +vt 0.8125 0.5385 0.0000 +vt 0.8161 0.5474 0.0000 +vt 0.0410 0.9459 0.0000 +vt 0.0419 0.9321 0.0000 +vt 0.0429 0.9407 0.0000 +vt 0.0458 0.9166 0.0000 +vt 0.0199 0.8390 0.0000 +vt 0.0228 0.8683 0.0000 +vt 0.0208 0.8700 0.0000 +vt 0.0410 0.9407 0.0000 +vt 0.9230 0.2664 0.0000 +vt 0.9839 0.2664 0.0000 +vt 0.9230 0.4834 0.0000 +vt 0.3113 0.9529 0.0000 +vt 0.3146 0.9529 0.0000 +vt 0.3135 0.9613 0.0000 +vt 0.0218 0.8372 0.0000 +vt 0.0275 0.8666 0.0000 +vt 0.0304 0.8666 0.0000 +vt 0.0668 0.9632 0.0000 +vt 0.0429 0.9080 0.0000 +vt 0.0199 0.7786 0.0000 +vt 0.0170 0.7838 0.0000 +vt 0.0228 0.7838 0.0000 +vt 0.0304 0.8234 0.0000 +vt 1.0000 1.0000 0.0000 +vt 0.1958 0.5990 0.0000 +vt 0.1716 0.6042 0.0000 +vt 0.1898 0.5885 0.0000 +vt 0.0544 0.9632 0.0000 +vt 0.0505 0.9666 0.0000 +vt 0.0496 0.9528 0.0000 +vt 0.5333 0.3098 0.0000 +vt 0.5469 0.4005 0.0000 +vt 0.5469 0.4458 0.0000 +vt 0.0879 0.8804 0.0000 +vt 0.0908 0.8821 0.0000 +vt 0.0898 0.8735 0.0000 +vt 0.1988 0.5990 0.0000 +vt 0.4363 0.3606 0.0000 +vt 0.4281 0.4873 0.0000 +vt 0.4227 0.4028 0.0000 +vt 0.0620 0.9683 0.0000 +vt 0.1013 0.8390 0.0000 +vt 0.0985 0.8683 0.0000 +vt 0.1004 0.8700 0.0000 +vt 0.2079 0.6513 0.0000 +vt 0.1716 0.6513 0.0000 +vt 0.1958 0.6931 0.0000 +vt 0.1867 0.6670 0.0000 +vt 0.1354 0.7297 0.0000 +vt 0.1716 0.7192 0.0000 +vt 0.8161 0.6818 0.0000 +vt 0.8161 0.7087 0.0000 +vt 0.8018 0.7356 0.0000 +vt 0.8850 0.2664 0.0000 +vt 0.9002 0.2664 0.0000 +vt 0.9002 0.4834 0.0000 +vt 0.0573 0.9252 0.0000 +vt 0.0611 0.9356 0.0000 +vt 0.0534 0.9390 0.0000 +vt 0.0659 0.8424 0.0000 +vt 0.1898 0.5571 0.0000 +vt 0.1656 0.5728 0.0000 +vt 0.1928 0.5676 0.0000 +vt 0.0371 0.8183 0.0000 +vt 0.0371 0.8131 0.0000 +vt 0.0333 0.8183 0.0000 +vt 0.0515 0.8355 0.0000 +vt 0.5197 0.4005 0.0000 +vt 0.5142 0.4685 0.0000 +vt 0.2170 0.5205 0.0000 +vt 0.4227 0.4451 0.0000 +vt 0.3901 0.4662 0.0000 +vt 0.0573 0.8321 0.0000 +vt 0.2351 0.6094 0.0000 +vt 0.8552 0.5205 0.0000 +vt 0.0640 0.8321 0.0000 +vt 0.0400 0.9200 0.0000 +vt 0.0611 0.8338 0.0000 +vt 0.0678 0.8510 0.0000 +vt 0.0486 0.9425 0.0000 +vt 0.0438 0.9511 0.0000 +vt 0.5686 0.3551 0.0000 +vt 0.5767 0.4912 0.0000 +vt 0.5822 0.4458 0.0000 +vt 0.7733 0.5205 0.0000 +vt 0.7911 0.5564 0.0000 +vt 0.0965 0.8769 0.0000 +vt 0.0918 0.8752 0.0000 +vt 0.0592 0.9683 0.0000 +vt 0.0927 0.7803 0.0000 +vt 0.0975 0.7838 0.0000 +vt 0.1042 0.7890 0.0000 +vt 0.6094 0.4005 0.0000 +vt 0.6148 0.4685 0.0000 +vt 0.5822 0.4005 0.0000 +vt 0.7626 0.7356 0.0000 +vt 0.8161 0.6908 0.0000 +vt 0.8695 0.6908 0.0000 +vt 0.0640 0.9252 0.0000 +vt 0.0611 0.9287 0.0000 +vt 0.5368 0.7669 0.0000 +vt 0.5108 0.9780 0.0000 +vt 0.5281 0.7780 0.0000 +vt 0.0812 0.9200 0.0000 +vt 0.0755 0.9166 0.0000 +vt 0.0783 0.9080 0.0000 +vt 0.0496 0.9666 0.0000 +vt 0.0266 0.9839 0.0000 +vt 0.0429 0.9735 0.0000 +vt 0.0400 0.9718 0.0000 +vt 0.1100 0.8097 0.0000 +vt 0.1052 0.7855 0.0000 +vt 0.1071 0.7959 0.0000 +vt 0.3896 0.5401 0.0000 +vt 0.4863 0.5401 0.0000 +vt 0.4541 0.7238 0.0000 +vt 0.5088 0.2644 0.0000 +vt 0.0611 0.9649 0.0000 +vt 0.0448 0.9580 0.0000 +vt 0.6202 0.2644 0.0000 +vt 0.3847 0.2762 0.0000 +vt 0.3955 0.4028 0.0000 +vt 0.7591 0.6908 0.0000 +vt 0.0448 0.9390 0.0000 +vt 0.0419 0.9545 0.0000 +vt 0.0898 0.8183 0.0000 +vt 0.0908 0.8234 0.0000 +vt 0.0927 0.8234 0.0000 +vt 0.5604 0.3551 0.0000 +vt 0.5523 0.4912 0.0000 +vt 0.8267 0.7356 0.0000 +vt 0.3866 0.9839 0.0000 +vt 0.4576 0.7727 0.0000 +vt 0.4931 0.9839 0.0000 +vt 0.3135 0.9393 0.0000 +vt 0.0937 0.8166 0.0000 +vt 0.0956 0.8217 0.0000 +vt 0.0304 0.8166 0.0000 +vt 0.0275 0.7803 0.0000 +vt 0.0141 0.7855 0.0000 +vt 0.0688 0.8510 0.0000 +vt 0.0918 0.8269 0.0000 +vt 0.0965 0.8010 0.0000 +vt 0.0927 0.7872 0.0000 +vt 0.1061 0.8062 0.0000 +vt 0.1071 0.8097 0.0000 +vt 0.0937 0.8666 0.0000 +vt 0.0908 0.8666 0.0000 +vt 0.0937 0.8855 0.0000 +vt 0.0985 0.8786 0.0000 +vt 0.0994 0.8355 0.0000 +vt 0.0975 0.8355 0.0000 +vt 0.0496 0.9373 0.0000 +vt 0.0716 0.8700 0.0000 +vt 0.0688 0.8683 0.0000 +vt 0.0726 0.8700 0.0000 +vt 0.0783 0.9011 0.0000 +vt 0.1013 0.8372 0.0000 +vt 0.0783 0.9166 0.0000 +vt 0.0793 0.9321 0.0000 +vt 0.8659 0.7356 0.0000 +vt 0.0994 0.8372 0.0000 +vt 0.8812 0.2664 0.0000 +vt 0.8926 0.4834 0.0000 +vt 0.8964 0.2664 0.0000 +vt 0.5166 0.7884 0.0000 +vt 0.6134 0.9109 0.0000 +vt 0.6134 0.9721 0.0000 +vt 0.0994 0.7786 0.0000 +vt 0.1023 0.7838 0.0000 +vt 0.5958 0.3098 0.0000 +vt 0.4444 0.3606 0.0000 +vt 0.4526 0.4873 0.0000 +vt 0.0716 0.9373 0.0000 +vt 0.4961 0.2762 0.0000 +vt 0.4852 0.4028 0.0000 +vt 0.0879 0.8183 0.0000 +vt 0.0879 0.8131 0.0000 +vt 0.0678 0.9390 0.0000 +vt 0.9119 0.2664 0.0000 +vt 0.9537 0.2664 0.0000 +vt 0.9499 0.4834 0.0000 +vt 0.9233 0.4834 0.0000 +vt 0.9841 0.4834 0.0000 +vt 0.9841 0.2664 0.0000 +vt 0.9119 0.4834 0.0000 +vt 0.8853 0.4834 0.0000 +vt 0.9005 0.4834 0.0000 +vt 0.8853 0.2664 0.0000 +vt 0.9917 0.2664 0.0000 +vt 0.9917 0.4834 0.0000 +vt 0.8815 0.2664 0.0000 +vt 0.8929 0.4834 0.0000 +vt 0.8815 0.4834 0.0000 +vt 0.9233 0.2664 0.0000 +vt 0.9005 0.2664 0.0000 +vt 0.8967 0.2664 0.0000 +vt 0.9116 0.2664 0.0000 +vt 0.9496 0.4834 0.0000 +vt 0.9534 0.2664 0.0000 +vt 0.9839 0.4834 0.0000 +vt 0.9116 0.4834 0.0000 +vt 0.8850 0.4834 0.0000 +vt 0.9915 0.2664 0.0000 +vt 0.9915 0.4834 0.0000 +vt 0.8812 0.4834 0.0000 +vt 0.0410 0.9183 0.0000 +vt 0.0803 0.9183 0.0000 +vt 0.0850 0.9235 0.0000 +vt 0.0362 0.9235 0.0000 +vt 0.9087 0.5765 0.0000 +vt 0.9391 0.5088 0.0000 +vt 0.9391 0.5765 0.0000 +vt 0.9053 0.5765 0.0000 +vt 0.9053 0.6780 0.0000 +vt 0.8783 0.7457 0.0000 +vt 0.9391 0.6554 0.0000 +vt 0.9695 0.5765 0.0000 +vt 0.9895 0.1198 0.0000 +vt 0.9542 0.0181 0.0000 +vt 0.9895 0.0395 0.0000 +vt 0.9053 0.5088 0.0000 +vt 0.9012 0.1305 0.0000 +vt 0.9825 0.1466 0.0000 +vt 0.9260 0.2269 0.0000 +vt 0.9618 0.2137 0.0000 +vt 0.9649 0.2312 0.0000 +vt 0.9527 0.2312 0.0000 +vt 0.0662 0.7285 0.0000 +vt 0.0250 0.7414 0.0000 +vt 0.0662 0.6122 0.0000 +vt 0.8871 0.1519 0.0000 +vt 0.9048 0.2269 0.0000 +vt 0.8906 0.2161 0.0000 +vt 0.9192 0.2195 0.0000 +vt 0.9192 0.2312 0.0000 +vt 0.9071 0.2312 0.0000 +vt 0.9662 0.5765 0.0000 +vt 0.9695 0.5088 0.0000 +vt 0.9966 0.7457 0.0000 +vt 0.0972 0.7414 0.0000 +vt 0.9419 0.6874 0.0000 +vt 0.9096 0.7392 0.0000 +vt 0.9096 0.7133 0.0000 +vt 0.9687 0.7133 0.0000 +vt 0.9687 0.7392 0.0000 +vt 0.9827 0.1470 0.0000 +vt 0.9544 0.0185 0.0000 +vt 0.9156 0.0667 0.0000 +vt 0.9014 0.1309 0.0000 +vt 0.9050 0.2273 0.0000 +vt 0.8873 0.1523 0.0000 +vt 0.8908 0.2166 0.0000 +vt 0.9897 0.1202 0.0000 +vt 0.9262 0.2273 0.0000 +vt 0.9897 0.0399 0.0000 +vt 0.9154 0.0663 0.0000 +vt 0.9618 0.0854 0.0000 +vt 0.9892 0.1729 0.0000 +vt 0.9649 0.0854 0.0000 +vt 0.9375 0.0854 0.0000 +vt 0.9071 0.0854 0.0000 +vt 0.9101 0.0854 0.0000 +vt 0.8827 0.1729 0.0000 +vt 0.9695 0.6780 0.0000 +vt 0.0042 0.0013 0.9087 +vt 0.0057 0.3105 0.7270 +vt 0.5135 0.2427 0.6362 +vt 0.5135 0.0005 0.9995 +vt 0.0076 0.9962 0.5454 +vt 0.5135 0.9995 0.8179 +vt 0.5135 0.8784 0.1821 +vt 0.5135 0.6211 0.0005 +vt 0.9995 0.7270 0.1821 +vt 0.9943 0.3105 0.7270 +vt 0.0005 0.7270 0.1821 +vt 0.9997 0.0072 0.9087 +vt 0.9885 0.9942 0.5454 +vt 0.0247 0.8873 0.0000 +vt 0.0965 0.8873 0.0000 +vt 0.0100 0.0251 0.0000 +vt 0.0860 0.9252 0.0000 +vt 0.0352 0.9252 0.0000 +vt 0.0044 0.5864 0.0000 +vt 0.1178 0.5864 0.0000 +vt 0.0662 0.5088 0.0000 +# 810 texture coords + +g crash +usemtl shoes +s 1 +f 1/1/1 2/2/2 3/3/3 +f 4/4/4 2/2/2 5/5/5 +f 6/6/6 1/1/1 7/7/7 +f 8/8/8 9/9/9 10/10/10 +f 11/11/11 12/12/12 13/13/13 +f 13/13/13 14/14/14 11/11/11 +f 8/8/8 15/15/15 9/9/9 +f 16/16/16 15/15/15 14/14/14 +f 17/17/17 4/4/4 5/5/5 +f 7/7/7 18/18/18 6/6/6 +f 16/16/16 14/14/14 19/19/19 +f 19/19/19 14/14/14 13/13/13 +f 7/7/7 1/1/1 20/20/20 +f 20/20/20 1/1/1 3/3/3 +f 21/21/21 8/8/8 10/10/10 +f 11/11/11 8/8/8 21/21/21 +f 22/22/22 5/5/5 6/6/6 +f 17/17/17 5/5/5 22/22/22 +f 19/19/19 13/13/13 23/23/23 +f 24/24/24 7/7/7 20/20/20 +f 13/13/13 12/12/12 25/25/25 +f 26/26/26 18/18/18 7/7/7 +usemtl color_pallete +f 27/27/27 28/28/28 29/29/29 +f 30/30/30 31/31/31 32/32/32 +f 33/33/33 31/34/31 30/35/30 +f 34/36/34 28/37/28 35/38/35 +f 31/31/31 36/39/36 32/32/32 +f 36/40/36 31/34/31 37/41/37 +s 2 +f 38/42/38 39/43/39 40/44/40 +f 41/45/41 42/46/42 43/47/43 +f 44/48/44 41/45/41 43/47/43 +f 45/49/45 46/50/46 47/51/47 +s 1 +f 48/52/48 49/53/49 50/54/50 +s 2 +f 51/55/51 46/50/46 45/49/45 +f 42/46/42 52/56/52 53/57/53 +f 46/50/46 54/58/54 55/59/55 +s 1 +f 56/60/56 57/61/57 58/62/58 +f 56/60/56 51/63/59 59/64/60 +s 2 +f 51/55/51 60/65/61 46/50/46 +f 61/66/62 45/49/45 47/51/47 +f 60/65/61 62/67/63 54/58/54 +f 45/49/45 59/68/64 51/55/51 +s 1 +f 51/69/59 56/70/56 63/71/65 +s 2 +f 60/65/61 54/58/54 46/50/46 +s 1 +f 64/72/66 65/73/67 56/70/56 +s 2 +f 47/51/47 46/50/46 55/59/55 +s 1 +f 66/74/68 67/75/69 68/76/70 +f 50/54/50 67/77/69 48/52/48 +f 68/78/70 69/79/71 66/80/68 +s 2 +f 70/81/72 71/82/73 72/83/74 +s 1 +f 73/84/75 40/85/76 74/86/77 +f 75/87/78 76/88/79 48/52/48 +f 77/89/80 78/90/81 79/91/82 +f 68/76/70 67/75/69 50/92/50 +f 78/93/81 80/94/83 81/95/84 +s 2 +f 82/96/85 83/97/86 84/98/87 +s 1 +f 85/99/88 79/100/82 86/101/89 +s 2 +f 83/102/86 87/103/90 43/104/43 +s 1 +f 85/105/88 88/106/91 89/107/92 +f 77/89/80 90/108/93 80/109/83 +s 2 +f 91/110/94 92/111/95 44/48/44 +f 93/112/96 87/103/90 94/113/97 +s 1 +f 95/114/98 96/115/99 97/116/100 +f 58/117/58 98/118/101 56/70/56 +s 2 +f 99/119/102 100/120/103 101/121/104 +f 102/122/105 103/123/106 104/124/107 +s 1 +f 69/79/71 105/125/108 66/80/68 +s 2 +f 100/120/103 94/126/97 101/121/104 +f 61/66/62 106/127/109 45/49/45 +s 1 +f 48/52/48 76/88/79 49/53/49 +s 2 +f 107/97/110 108/128/111 109/129/112 +f 107/97/110 109/129/112 110/130/113 +f 108/128/111 107/97/110 111/131/114 +f 112/132/115 113/133/116 45/134/45 +f 58/135/117 57/136/118 45/134/45 +s 1 +f 114/137/119 115/138/120 116/139/121 +f 117/140/122 118/141/123 29/29/29 +s 2 +f 87/142/90 119/143/124 111/131/114 +s 1 +f 114/137/119 116/139/121 120/144/125 +s 2 +f 106/127/109 112/145/115 45/49/45 +f 106/127/109 61/66/62 75/66/126 +f 54/58/54 121/146/127 55/59/55 +f 111/147/114 107/148/110 87/149/90 +s 1 +f 122/150/128 123/151/128 124/152/128 +s 2 +f 125/153/129 94/154/97 103/123/106 +f 62/155/63 113/133/116 54/156/54 +s 1 +f 126/157/130 127/158/131 128/159/132 +f 129/160/133 130/161/134 131/162/135 +s 2 +f 106/127/109 75/66/126 132/163/136 +s 1 +f 133/164/137 134/165/138 135/166/139 +s 2 +f 103/167/106 94/113/97 87/103/90 +f 93/96/96 136/168/140 119/143/124 +s 1 +f 137/169/141 138/161/142 139/170/143 +f 140/171/144 141/172/145 142/173/146 +f 118/174/123 117/175/122 143/176/147 +s 2 +f 24/177/148 144/178/149 145/179/150 +s 1 +f 146/180/151 147/181/152 148/182/153 +f 71/183/154 149/184/155 150/185/156 +f 142/173/146 151/171/157 152/186/158 +f 153/187/159 154/188/160 131/162/135 +f 155/189/161 156/190/162 157/191/163 +s 2 +f 158/192/164 159/193/165 160/194/166 +s 1 +f 57/61/57 56/60/56 59/64/60 +f 98/118/101 161/195/167 56/70/56 +s 2 +f 57/136/118 59/196/64 45/134/45 +f 45/134/45 113/133/116 58/135/117 +f 160/194/166 159/193/165 162/197/168 +s 1 +f 90/108/93 96/115/99 80/109/83 +f 163/198/169 164/199/170 165/200/171 +s 2 +f 136/168/140 93/96/96 166/201/172 +f 167/202/173 106/127/109 54/58/54 +s 1 +f 168/203/174 138/161/142 131/162/135 +s 2 +f 109/129/112 53/204/53 110/130/113 +f 100/205/103 99/206/102 166/201/172 +s 1 +f 131/162/135 130/161/134 168/203/174 +f 169/207/175 170/208/176 171/209/177 +s 2 +f 121/146/127 54/58/54 106/127/109 +s 1 +f 140/171/144 168/203/174 172/210/178 +f 152/186/158 140/171/144 142/173/146 +s 2 +f 173/211/179 91/212/94 174/213/180 +s 1 +f 168/203/174 151/171/157 172/210/178 +f 175/214/181 90/108/93 111/215/182 +s 2 +f 82/96/85 176/216/183 177/217/184 +f 44/218/44 43/219/43 174/213/180 +s 1 +f 178/220/185 146/221/151 148/222/153 +f 179/223/186 118/174/123 143/176/147 +f 180/224/187 150/185/156 149/184/155 +f 90/108/93 175/214/181 181/225/188 +f 154/188/160 129/160/133 131/162/135 +f 138/161/142 153/187/159 131/162/135 +s 2 +f 93/96/96 94/226/97 100/205/103 +f 42/227/42 182/228/189 83/97/86 +s 1 +f 183/229/190 184/230/191 169/231/175 +f 90/108/93 181/225/188 96/115/99 +s 2 +f 113/133/116 167/232/173 54/156/54 +s 1 +f 185/170/192 130/161/134 137/169/141 +s 2 +f 110/233/113 53/57/53 186/121/193 +f 187/234/194 38/42/38 188/235/195 +f 104/236/107 103/167/106 87/103/90 +f 110/233/113 186/121/193 173/126/179 +f 189/237/196 149/238/197 158/192/164 +f 190/239/198 123/240/199 162/197/168 +f 110/130/113 173/241/179 107/97/110 +s 1 +f 111/215/182 119/242/200 175/214/181 +f 29/29/29 118/141/123 27/27/27 +s 2 +f 122/243/201 124/244/202 180/245/203 +s 1 +f 86/101/89 165/200/171 85/99/88 +s 2 +f 87/103/90 82/112/85 104/236/107 +s 1 +f 191/246/204 185/170/192 137/169/141 +f 78/90/81 77/89/80 80/109/83 +s 2 +f 160/194/166 189/237/196 158/192/164 +s 1 +f 95/114/98 97/116/100 175/214/181 +s 2 +f 180/245/203 124/244/202 190/239/198 +f 162/197/168 123/240/199 160/194/166 +s 1 +f 85/99/88 165/200/171 192/247/205 +f 193/248/206 194/249/207 73/84/75 +f 88/250/91 192/251/205 195/252/208 +f 34/36/34 35/38/35 196/253/209 +s 2 +f 197/254/210 177/217/184 99/206/102 +f 198/255/211 199/256/212 200/257/213 +s 1 +f 201/258/214 202/259/215 196/260/209 +s 2 +f 83/97/86 203/261/216 84/98/87 +s 1 +f 204/262/217 205/263/218 206/264/219 +f 207/265/220 208/266/221 205/267/218 +f 209/268/222 133/164/137 210/269/223 +f 141/172/145 151/171/157 142/173/146 +f 158/270/224 211/271/225 212/272/226 +f 119/242/200 95/114/98 175/214/181 +f 179/223/186 213/273/227 118/174/123 +s 2 +f 214/274/228 215/275/229 216/276/230 +s 1 +f 217/277/231 133/164/137 135/166/139 +s 2 +f 190/239/198 124/244/202 123/240/199 +s 1 +f 191/246/204 137/169/141 139/170/143 +f 49/53/49 146/180/151 178/52/185 +f 79/100/82 85/99/88 89/278/92 +f 164/199/170 192/247/205 165/200/171 +f 218/279/232 148/182/153 147/181/152 +s 2 +f 180/245/203 149/238/197 122/243/201 +f 173/126/179 186/121/193 91/110/94 +s 1 +f 189/280/128 160/281/128 123/151/128 +f 219/282/233 220/283/234 221/284/235 +f 222/285/236 219/286/233 221/287/235 +s 2 +f 113/133/116 62/155/63 58/135/117 +s 1 +f 220/288/234 219/286/233 157/289/163 +s 2 +f 42/227/42 53/204/53 182/228/189 +f 197/254/210 82/96/85 177/217/184 +f 83/97/86 182/228/189 203/261/216 +s 1 +f 113/290/237 116/139/121 167/291/238 +f 120/144/125 116/139/121 112/292/239 +f 116/139/121 115/138/120 167/291/238 +f 112/292/239 116/139/121 113/290/237 +f 161/195/167 223/293/240 56/70/56 +f 56/70/56 224/294/241 63/71/65 +f 65/73/67 224/294/241 56/70/56 +f 223/293/240 64/72/66 56/70/56 +f 225/295/242 195/252/208 192/251/205 +s 2 +f 226/45/243 104/47/107 197/296/210 +f 102/48/105 104/47/107 226/45/243 +f 227/297/244 228/298/245 229/299/246 +s 1 +f 128/159/132 230/300/247 126/157/130 +s 2 +f 231/301/248 232/302/249 227/297/244 +f 197/296/210 99/119/102 233/56/250 +f 229/299/246 234/303/251 39/304/39 +s 1 +f 188/305/252 235/306/253 133/307/137 +f 133/307/137 232/308/254 231/309/255 +s 2 +f 231/301/248 229/299/246 236/310/256 +f 237/311/257 228/298/245 227/297/244 +s 1 +f 204/262/217 207/312/220 205/263/218 +s 2 +f 236/310/256 39/304/39 187/313/194 +f 227/297/244 229/299/246 231/301/248 +s 1 +f 231/314/255 134/165/138 133/164/137 +s 2 +f 236/310/256 229/299/246 39/304/39 +s 1 +f 238/315/258 133/164/137 217/277/231 +s 2 +f 228/298/245 234/303/251 229/299/246 +s 1 +f 239/316/259 127/317/131 240/318/260 +f 241/319/261 126/157/130 230/300/247 +f 240/320/260 242/321/262 243/322/263 +f 244/323/264 126/157/130 241/319/261 +f 202/259/215 201/258/214 80/109/83 +f 80/94/83 201/324/214 81/95/84 +f 128/325/132 127/317/131 239/316/259 +f 164/199/170 163/198/169 196/253/209 +s 2 +f 82/326/85 87/327/90 83/328/86 +f 82/329/85 197/330/210 104/331/107 +s 1 +f 245/332/265 184/333/191 246/334/266 +f 202/259/215 80/109/83 95/114/98 +s 2 +f 103/123/106 102/122/105 125/153/129 +f 87/149/90 93/329/96 119/335/124 +s 1 +f 133/164/137 247/336/267 188/337/252 +f 28/37/28 248/338/268 249/339/269 +s 2 +f 94/126/97 125/110/129 101/121/104 +s 1 +f 240/320/260 243/322/263 239/340/259 +s 2 +f 182/228/189 108/128/111 203/261/216 +s 1 +f 250/341/270 28/37/28 34/36/34 +s 2 +f 237/311/257 227/297/244 200/257/213 +f 84/98/87 176/216/183 82/96/85 +f 216/276/230 251/342/271 252/343/272 +f 43/344/43 42/345/42 83/148/86 +f 102/48/105 253/111/273 125/110/129 +s 1 +f 28/346/28 254/347/274 248/348/268 +s 2 +f 194/349/275 227/350/244 38/42/38 +f 227/350/244 235/351/276 188/235/195 +s 1 +f 255/352/277 73/84/75 74/86/77 +s 2 +f 256/353/278 20/354/279 257/355/280 +f 258/356/281 259/357/282 260/358/283 +s 1 +f 255/352/277 193/248/206 73/84/75 +f 230/300/247 208/157/221 207/312/220 +s 2 +f 200/257/213 227/297/244 194/359/275 +f 198/255/211 200/257/213 39/304/39 +s 1 +f 72/360/128 252/361/128 70/362/128 +f 249/339/269 164/199/170 196/253/209 +s 2 +f 261/363/284 262/364/285 72/83/74 +f 39/304/39 234/303/251 198/255/211 +f 187/234/194 39/43/39 38/42/38 +s 1 +f 184/230/191 18/365/18 246/366/266 +f 194/249/207 38/367/286 73/84/75 +s 2 +f 177/217/184 176/216/183 136/168/140 +f 200/257/213 199/256/212 244/311/287 +f 173/368/179 87/103/90 107/102/110 +s 1 +f 262/369/128 216/370/128 252/361/128 +f 38/367/286 40/85/76 73/84/75 +s 2 +f 43/104/43 87/103/90 174/371/180 +s 1 +f 221/284/235 220/283/234 156/372/162 +s 2 +f 71/82/73 261/363/284 72/83/74 +s 1 +f 210/269/223 133/164/137 238/315/258 +f 28/37/28 250/341/270 263/373/288 +f 18/365/18 264/374/289 246/366/266 +f 184/230/191 245/375/265 169/231/175 +f 29/29/29 28/28/28 263/376/288 +s 2 +f 252/343/272 251/342/271 149/238/197 +f 251/342/271 216/276/230 215/275/229 +f 71/82/73 70/81/72 149/238/197 +s 1 +f 26/377/290 7/378/7 24/379/291 +f 235/306/253 232/308/254 133/307/137 +s 2 +f 173/368/179 174/371/180 87/103/90 +s 1 +f 247/336/267 133/164/137 209/268/222 +s 2 +f 235/351/276 227/350/244 232/380/249 +f 188/235/195 38/42/38 227/350/244 +f 216/276/230 262/364/285 214/274/228 +s 1 +f 95/114/98 80/109/83 96/115/99 +s 2 +f 100/205/103 166/201/172 93/96/96 +f 261/363/284 214/274/228 262/364/285 +f 40/381/40 39/304/39 200/257/213 +s 1 +f 156/382/162 265/383/292 221/287/235 +f 251/384/293 266/385/294 211/271/225 +f 21/386/21 10/387/10 267/388/295 +s 2 +f 268/179/296 269/389/297 270/390/298 +f 271/391/299 272/392/300 273/393/301 +s 1 +f 274/394/302 23/379/303 25/377/304 +f 275/395/305 273/396/306 272/397/307 +f 276/398/308 25/399/304 12/400/12 +s 2 +f 277/401/309 278/402/310 19/403/311 +f 279/404/312 267/392/313 280/405/314 +f 281/406/315 282/407/316 283/408/315 +s 1 +f 282/409/317 284/410/318 283/411/319 +f 171/412/177 183/229/190 169/231/175 +s 2 +f 279/404/312 21/413/320 267/392/313 +s 1 +f 273/396/306 16/414/16 285/415/321 +f 285/415/321 16/414/16 19/416/19 +s 2 +f 286/417/316 282/407/316 281/406/315 +s 1 +f 10/387/10 272/397/307 267/388/295 +f 269/418/322 274/394/302 284/410/318 +f 268/419/323 274/394/302 269/418/322 +f 284/410/318 282/409/317 269/418/322 +f 23/379/303 274/394/302 268/419/323 +s 2 +f 287/420/324 268/179/296 270/390/298 +s 1 +f 276/421/308 288/422/325 274/423/302 +f 283/411/319 284/410/318 289/424/326 +f 274/425/302 25/399/304 276/398/308 +s 2 +f 278/402/310 285/426/327 19/403/311 +s 1 +f 22/427/22 6/428/6 290/411/328 +s 2 +f 272/392/300 271/391/299 291/405/329 +s 1 +f 25/377/304 23/379/303 13/429/13 +s 2 +f 23/430/330 268/179/296 287/420/324 +s 1 +f 274/423/302 288/422/325 292/431/331 +f 284/399/318 292/432/331 289/433/326 +f 171/209/177 170/208/176 264/434/289 +f 12/400/12 293/435/332 276/398/308 +f 289/433/326 292/432/331 294/436/333 +f 289/433/326 293/435/332 12/400/12 +f 292/432/331 284/399/318 274/425/302 +f 283/411/319 11/437/11 21/386/21 +f 11/437/11 283/411/319 289/424/326 +f 289/424/326 12/438/12 11/437/11 +f 6/428/6 184/439/191 290/411/328 +f 22/427/22 295/388/334 17/440/17 +s 2 +f 145/179/150 296/441/335 297/442/336 +f 260/358/283 298/443/337 258/356/281 +s 1 +f 171/444/177 26/377/290 24/379/291 +f 299/395/338 258/397/339 298/445/340 +f 264/374/289 18/365/18 26/229/290 +s 2 +f 300/446/341 20/354/279 256/353/278 +f 301/404/342 302/357/343 295/356/344 +f 303/447/345 290/448/345 304/407/346 +s 1 +f 304/409/347 290/411/328 183/410/190 +f 184/439/191 6/428/6 18/449/18 +s 2 +f 301/404/342 295/356/344 22/413/348 +s 1 +f 298/445/340 257/450/349 3/414/3 +f 257/450/349 20/451/20 3/414/3 +s 2 +f 305/417/346 303/447/345 304/407/346 +s 1 +f 17/440/17 295/388/334 258/397/339 +f 297/418/350 183/410/190 171/444/177 +f 145/452/351 297/418/350 171/444/177 +f 183/410/190 297/418/350 304/409/347 +f 24/379/291 145/452/351 171/444/177 +s 2 +f 144/178/149 296/441/335 145/179/150 +s 1 +f 264/374/289 26/229/290 171/412/177 +f 290/411/328 184/439/191 183/410/190 +s 2 +f 174/213/180 91/212/94 44/218/44 +s 1 +f 254/453/274 118/174/123 306/454/352 +f 306/454/352 118/174/123 89/278/92 +f 248/348/268 254/347/274 307/455/353 +f 306/456/352 307/455/353 254/347/274 +f 179/223/186 79/100/82 213/273/227 +f 225/457/242 164/458/170 249/346/269 +f 192/459/205 164/458/170 225/457/242 +f 192/459/205 88/106/91 85/105/88 +f 28/37/28 249/339/269 35/38/35 +f 35/38/35 249/339/269 196/253/209 +f 79/100/82 89/278/92 213/273/227 +f 213/273/227 89/278/92 118/174/123 +f 299/395/338 298/445/340 3/414/3 +f 275/395/305 16/414/16 273/396/306 +f 275/395/305 9/460/9 15/461/15 +f 10/387/10 275/395/305 272/397/307 +f 17/440/17 258/397/339 299/395/338 +f 299/395/338 2/461/2 4/462/4 +f 17/440/17 299/395/338 4/462/4 +f 10/387/10 9/460/9 275/395/305 +f 3/414/3 2/461/2 299/395/338 +f 16/414/16 275/395/305 15/461/15 +f 37/463/37 308/464/354 36/465/36 +f 309/466/355 31/467/31 33/468/33 +f 310/469/356 37/463/37 31/467/31 +f 32/470/32 311/471/357 30/472/30 +f 151/473/157 312/474/358 37/463/37 +f 311/471/357 313/475/359 261/476/360 +f 311/477/357 32/478/32 36/479/36 +f 309/466/355 310/469/356 31/467/31 +f 36/465/36 308/464/354 314/480/361 +f 37/463/37 310/469/356 151/473/157 +f 215/481/362 315/482/363 266/483/364 +f 36/484/36 314/485/361 311/486/357 +f 261/476/360 34/487/34 311/471/357 +f 214/488/365 261/476/360 313/475/359 +f 203/489/366 105/490/108 316/491/367 +f 176/492/368 317/493/369 136/494/370 +f 167/495/238 318/496/371 106/497/372 +f 319/498/373 98/499/101 58/500/58 +f 319/498/373 60/501/374 63/502/65 +f 58/500/58 62/503/375 319/498/373 +f 319/498/373 62/503/375 60/501/374 +f 148/504/153 320/505/376 178/506/185 +f 60/501/374 51/507/59 63/502/65 +f 68/508/70 321/509/377 69/510/71 +f 50/511/50 49/512/49 320/505/376 +f 218/513/232 322/514/378 148/504/153 +f 132/515/379 75/516/78 48/506/48 +f 323/504/380 121/517/381 132/515/379 +f 316/491/367 105/490/108 69/510/71 +f 90/518/93 105/490/108 324/519/382 +f 132/515/379 48/506/48 323/504/380 +f 105/490/108 77/520/80 66/521/68 +f 203/489/366 324/519/382 105/490/108 +f 77/520/80 105/490/108 90/518/93 +f 201/522/214 165/523/171 81/524/84 +f 219/525/233 325/526/383 179/527/186 +f 77/520/80 79/528/82 66/521/68 +f 323/504/380 55/529/384 121/517/381 +f 147/530/152 326/531/385 218/513/232 +f 222/532/236 325/526/383 219/525/233 +s 2 +f 303/533/345 301/534/342 290/535/345 +s 1 +f 158/536/224 251/537/293 211/538/225 +f 320/505/376 49/512/49 178/506/185 +f 47/539/386 146/540/151 61/516/387 +f 76/541/79 75/516/78 61/516/387 +f 214/488/365 312/474/358 266/542/294 +f 61/516/387 146/540/151 76/541/79 +f 323/504/380 48/506/48 67/543/69 +f 64/544/66 319/498/373 65/545/67 +f 64/544/66 223/546/240 319/498/373 +f 318/496/371 112/547/239 106/497/372 +s 2 +f 106/548/109 132/548/136 121/548/127 +s 1 +f 153/549/159 138/550/142 137/551/141 +f 212/552/226 327/553/388 162/554/389 +f 162/555/389 159/556/390 212/557/226 +f 128/558/132 328/559/391 230/560/247 +f 137/551/141 130/550/134 129/561/133 +f 158/562/224 329/563/392 159/564/390 +f 130/565/134 312/474/358 151/473/157 +f 234/566/393 204/567/217 330/568/394 +f 168/569/174 140/570/144 138/550/142 +f 141/571/145 172/572/178 151/570/157 +f 151/570/157 310/573/356 152/574/158 +f 29/575/29 331/576/395 117/577/122 +f 76/541/79 146/540/151 49/512/49 +s 2 +f 296/578/335 305/579/346 304/580/346 +s 1 +f 117/581/122 150/582/156 180/583/187 +f 317/493/369 95/584/98 136/494/370 +f 332/585/396 211/586/225 185/587/192 +f 310/573/356 140/570/144 152/574/158 +f 333/588/397 114/589/119 120/590/125 +f 203/489/366 108/591/398 324/519/382 +f 151/570/157 168/569/174 130/550/134 +f 212/557/226 334/592/399 335/593/400 +f 147/530/152 55/529/384 326/531/385 +f 324/519/382 108/591/398 90/518/93 +f 191/594/204 139/587/143 332/585/396 +f 159/564/401 212/595/401 335/596/400 +f 108/591/398 111/597/182 90/518/93 +f 154/598/160 137/551/141 129/561/133 +f 154/598/160 153/549/159 137/551/141 +f 163/599/169 165/523/171 201/522/214 +f 136/494/370 95/584/98 119/600/200 +f 336/601/402 67/543/69 79/528/82 +f 84/602/403 337/603/404 176/492/368 +f 190/604/405 157/605/163 179/527/186 +f 251/606/293 338/607/406 266/608/294 +f 86/609/89 78/610/81 165/523/171 +f 334/592/399 159/556/390 335/593/400 +f 328/559/391 205/611/218 208/612/221 +f 138/613/142 140/613/144 327/553/388 +f 209/614/222 210/615/223 339/616/407 +f 215/548/362 266/548/364 340/548/408 +f 159/548/390 341/548/409 212/548/226 +f 342/617/410 315/618/363 215/619/362 +f 118/620/123 254/576/274 27/621/27 +f 201/522/214 196/622/209 163/599/169 +f 55/529/384 147/530/152 47/539/386 +f 266/608/364 315/618/363 342/617/410 +f 263/623/288 150/582/156 343/624/411 +f 157/625/163 156/626/162 220/627/234 +f 344/628/412 196/629/209 127/630/131 +f 265/631/292 156/632/162 345/633/413 +f 146/540/151 47/539/386 147/530/152 +f 345/633/413 156/632/162 155/634/161 +f 314/480/361 313/475/359 311/471/357 +f 236/635/414 135/636/139 134/637/138 +f 181/638/188 97/639/100 96/640/99 +f 179/527/186 325/526/383 79/528/82 +f 341/641/409 334/592/399 212/557/226 +f 211/642/225 327/553/388 212/552/226 +f 346/643/415 190/604/405 162/554/389 +f 340/644/408 266/608/364 342/617/410 +f 50/511/50 320/505/376 68/508/70 +f 341/645/409 159/564/390 334/646/399 +f 78/610/81 86/609/89 79/647/82 +f 117/581/122 343/624/411 150/582/156 +f 211/586/225 130/550/134 185/587/192 +f 139/587/143 138/550/142 211/586/225 +f 332/585/396 139/587/143 211/586/225 +f 191/594/204 332/585/396 185/587/192 +f 347/648/416 222/532/236 221/649/235 +f 215/619/417 266/608/294 338/607/406 +f 310/469/356 221/649/235 265/631/292 +f 193/650/206 348/651/418 194/652/207 +f 230/560/247 328/559/391 208/612/221 +f 158/653/224 212/557/226 329/654/392 +f 140/613/144 265/631/292 327/553/388 +f 79/528/82 67/543/69 66/521/68 +f 263/655/288 331/576/395 29/575/29 +f 181/656/188 175/657/181 97/658/100 +f 159/556/419 329/654/392 212/557/419 +f 149/659/155 251/537/293 158/536/224 +f 327/553/388 211/642/225 138/613/142 +f 78/610/81 81/524/84 165/523/171 +f 74/660/77 40/661/76 348/651/418 +f 141/571/145 140/570/144 172/572/178 +f 203/489/366 316/491/367 84/602/403 +f 120/590/125 112/547/239 318/496/371 +f 115/662/120 318/496/371 167/495/238 +f 161/663/167 98/499/101 319/498/373 +f 63/502/65 224/664/241 319/498/373 +f 223/546/240 161/663/167 319/498/373 +f 65/545/67 319/498/373 224/664/241 +f 176/492/368 337/603/404 242/665/262 +f 40/661/76 200/666/420 348/651/418 +f 188/667/252 247/668/267 339/616/407 +f 135/636/139 236/635/414 339/616/407 +f 339/616/407 187/669/421 188/667/252 +f 339/616/407 236/635/414 187/669/421 +f 134/637/138 231/670/255 236/635/414 +f 207/671/220 241/672/261 230/560/247 +f 349/673/422 206/674/219 205/611/218 +f 199/675/423 126/612/130 244/676/264 +f 350/611/424 126/612/130 199/675/423 +f 143/677/147 190/604/405 179/527/186 +f 157/605/163 190/604/405 346/643/415 +f 337/603/404 243/678/263 242/665/262 +f 202/679/215 242/665/262 240/680/260 +f 128/558/132 239/681/259 328/559/391 +f 199/675/423 198/682/425 350/611/424 +f 242/665/262 202/679/215 95/584/98 +f 176/492/368 242/665/262 317/493/369 +f 243/678/263 351/683/426 239/681/259 +f 95/584/98 317/493/369 242/665/262 +f 157/605/163 346/643/415 155/634/161 +f 347/648/416 221/649/235 310/469/356 +f 196/629/209 352/684/427 34/487/34 +f 240/680/260 127/630/131 196/629/209 +f 265/631/292 140/613/144 310/469/356 +f 350/611/424 198/682/425 234/566/393 +f 33/468/33 30/472/30 352/684/427 +f 254/576/274 28/685/28 27/621/27 +f 228/686/428 207/671/220 204/567/217 +f 241/672/261 237/676/429 244/676/264 +f 237/676/429 241/672/261 207/671/220 +s 2 +f 144/687/149 20/688/279 300/689/341 +f 200/690/213 244/691/287 237/692/257 +s 1 +f 350/611/424 127/630/131 126/612/130 +f 204/567/217 234/566/393 228/686/428 +f 339/616/407 210/615/223 238/693/258 +f 238/693/258 217/694/231 339/616/407 +f 348/651/418 200/666/420 194/652/207 +f 266/608/294 215/619/417 214/695/365 +f 211/642/225 312/474/358 130/565/134 +f 251/696/293 215/481/417 338/697/406 +f 34/487/34 261/476/360 250/698/270 +f 207/671/220 228/686/428 237/676/429 +f 339/616/407 217/694/231 135/636/139 +f 206/674/219 330/568/394 204/567/217 +f 339/616/407 247/668/267 209/614/222 +f 340/699/408 342/700/410 215/481/362 +f 196/629/209 202/679/215 240/680/260 +f 353/701/430 255/702/277 74/660/77 +f 263/623/288 71/703/154 150/582/156 +f 312/474/358 211/642/225 266/542/294 +f 353/701/430 193/650/206 255/702/277 +f 261/476/360 71/703/154 250/698/270 +s 2 +f 278/704/310 271/705/299 273/706/301 +f 283/707/315 21/708/320 279/709/312 +f 278/704/310 273/706/301 285/710/327 +f 269/711/297 282/712/316 270/713/298 +f 280/714/314 267/715/313 272/715/300 +f 280/714/314 272/715/300 291/714/329 +s 1 +f 250/698/270 71/703/154 263/623/288 +s 2 +f 287/716/324 19/717/311 23/718/330 +f 281/719/315 283/707/315 279/709/312 +f 270/713/298 282/712/316 286/720/316 +f 287/716/324 277/721/309 19/717/311 +s 1 +f 143/677/147 180/583/187 190/604/405 +f 143/677/147 117/581/122 180/583/187 +s 2 +f 256/722/278 298/723/337 260/724/283 +f 290/535/345 301/534/342 22/725/348 +f 256/722/278 257/726/280 298/723/337 +f 297/727/336 296/578/335 304/580/346 +f 302/728/343 258/729/281 295/729/344 +f 302/728/343 259/728/282 258/729/281 +f 144/687/149 24/730/148 20/688/279 +s 1 +f 34/487/34 30/472/30 311/471/357 +f 352/684/427 30/472/30 34/487/34 +f 157/605/163 219/525/233 179/527/186 +f 354/731/431 347/648/416 321/509/377 +f 68/508/70 354/731/431 321/509/377 +f 351/683/426 355/732/432 239/681/259 +f 351/683/426 309/466/355 355/732/432 +f 356/733/433 309/466/355 33/468/33 +f 222/532/236 347/648/416 357/734/434 +s 2 +f 358/735/435 195/736/436 359/737/437 +f 360/738/438 306/739/439 89/740/440 +f 307/741/441 306/739/439 360/738/438 +f 361/737/442 362/742/443 307/741/441 +s 1 +f 302/743/444 260/744/444 259/745/444 +s 2 +f 358/735/435 88/746/445 195/736/436 +s 1 +f 300/747/444 301/748/444 303/749/444 +f 72/750/128 262/751/128 252/752/128 +f 343/753/411 117/754/122 363/755/446 +f 144/756/444 305/757/444 296/758/444 +f 331/753/395 364/755/447 117/754/122 +f 122/759/128 189/760/128 123/761/128 +f 302/743/444 301/748/444 260/744/444 +s 2 +f 365/762/448 225/763/449 249/764/450 +s 1 +f 331/753/395 263/765/288 364/755/447 +s 2 +f 149/766/197 189/767/196 122/768/201 +f 365/762/448 195/736/436 225/763/449 +f 149/766/197 70/769/72 252/770/272 +s 1 +f 300/747/444 303/749/444 144/756/444 +f 343/753/411 363/755/446 263/765/288 +f 279/771/444 271/772/444 278/773/444 +f 279/771/444 278/773/444 277/774/444 +f 286/775/444 287/776/444 270/777/444 +f 280/778/444 271/772/444 279/771/444 +f 287/776/444 286/775/444 281/779/444 +f 277/774/444 287/776/444 281/779/444 +f 277/774/444 281/779/444 279/771/444 +f 280/778/444 291/780/444 271/772/444 +f 301/748/444 256/781/444 260/744/444 +f 301/748/444 300/747/444 256/781/444 +f 305/757/444 144/756/444 303/749/444 +f 365/782/451 249/783/269 362/784/452 +f 361/785/453 365/782/451 362/784/452 +f 360/786/454 358/787/455 361/785/453 +f 358/787/455 360/786/454 89/788/92 +s 2 +f 361/737/442 307/741/441 360/738/438 +f 195/736/436 365/762/448 359/737/437 +s 1 +f 359/785/453 361/785/453 358/787/455 +f 365/782/451 361/785/453 359/785/453 +s 2 +f 307/741/441 362/742/443 248/789/456 +f 248/789/456 362/742/443 249/764/450 +f 88/746/445 358/735/435 89/740/440 +s 1 +f 333/588/397 115/662/120 114/589/119 +usemtl back +f 316/790/367 69/791/71 366/792/457 +f 316/790/367 366/792/457 84/793/403 +f 347/794/416 310/795/356 367/796/458 +f 368/797/459 351/798/426 243/799/263 +f 321/800/377 347/794/416 367/796/458 +f 69/791/71 321/800/377 368/797/459 +f 366/792/457 243/799/263 337/801/404 +f 367/796/458 309/802/355 351/798/426 +f 84/793/403 366/792/457 337/801/404 +f 367/796/458 310/795/356 309/802/355 +usemtl color_pallete +f 55/529/384 323/504/380 326/531/385 +f 326/531/385 323/504/380 218/513/232 +f 330/568/394 206/674/219 350/611/424 +f 234/566/393 330/568/394 350/611/424 +f 37/463/37 313/475/359 308/464/354 +f 314/480/361 308/464/354 313/475/359 +f 346/643/415 265/631/292 345/633/413 +f 346/643/415 345/633/413 155/634/161 +f 218/513/232 323/504/380 369/803/460 +f 67/543/69 336/601/402 323/504/380 +f 127/630/131 350/611/424 344/628/412 +f 206/674/219 370/804/461 350/611/424 +f 354/731/431 68/508/70 320/505/376 +f 322/514/378 218/513/232 369/803/460 +f 328/559/391 239/681/259 355/732/432 +f 206/674/219 349/673/422 370/804/461 +s 2 +f 52/56/52 371/805/462 53/57/53 +f 233/56/250 99/119/102 372/805/463 +s 1 +f 33/468/33 373/806/464 356/733/433 +f 350/611/424 370/804/461 373/806/464 +f 357/734/434 374/807/465 222/532/236 +f 374/807/465 369/803/460 323/504/380 +f 117/754/122 364/755/447 375/808/466 +f 263/765/288 376/809/467 364/755/447 +usemtl back +f 368/797/459 367/796/458 351/798/426 +f 321/800/377 367/796/458 368/797/459 +usemtl color_pallete +f 263/765/288 363/755/446 376/809/467 +f 363/755/446 117/754/122 375/808/466 +f 325/526/383 222/532/236 374/807/465 +f 323/504/380 336/601/402 374/807/465 +f 373/806/464 33/468/33 352/684/427 +f 373/806/464 344/628/412 350/611/424 +s 2 +f 53/57/53 371/805/462 186/121/193 +f 372/805/463 99/119/102 101/121/104 +s 1 +f 309/466/355 356/733/433 355/732/432 +f 349/673/422 355/732/432 356/733/433 +f 322/514/378 357/734/434 354/731/431 +f 354/731/431 357/734/434 347/648/416 +f 375/808/466 364/755/447 377/810/468 +f 377/810/468 363/755/446 375/808/466 +f 313/475/359 37/463/37 312/474/358 +f 313/475/359 312/474/358 214/488/365 +f 265/631/292 346/643/415 327/553/388 +f 162/554/389 327/553/388 346/643/415 +usemtl shoes +f 5/5/5 2/2/2 1/1/1 +f 6/6/6 5/5/5 1/1/1 +f 14/14/14 8/8/8 11/11/11 +f 14/14/14 15/15/15 8/8/8 +usemtl color_pallete +s 2 +f 378/56/469 92/111/95 91/110/94 +f 125/110/129 253/111/273 379/56/470 +s 1 +f 363/755/446 377/810/468 376/809/467 +f 376/809/467 377/810/468 364/755/447 +s 2 +f 226/45/243 197/296/210 233/56/250 +f 41/45/41 52/56/52 42/46/42 +s 1 +f 357/734/434 322/514/378 369/803/460 +f 369/803/460 374/807/465 357/734/434 +f 356/733/433 370/804/461 349/673/422 +f 370/804/461 356/733/433 373/806/464 +f 320/505/376 322/514/378 354/731/431 +f 320/505/376 148/504/153 322/514/378 +f 355/732/432 349/673/422 328/559/391 +f 205/611/218 328/559/391 349/673/422 +s 2 +f 108/128/111 182/228/189 109/129/112 +f 182/228/189 53/204/53 109/129/112 +f 177/217/184 136/168/140 166/201/172 +f 99/206/102 177/217/184 166/201/172 +s 1 +f 294/436/333 293/435/332 289/433/326 +f 352/684/427 344/628/412 373/806/464 +f 196/629/209 344/628/412 352/684/427 +f 374/807/465 336/601/402 325/526/383 +f 79/528/82 325/526/383 336/601/402 +f 333/588/397 318/496/371 115/662/120 +f 333/588/397 120/590/125 318/496/371 +s 2 +f 101/121/104 125/110/129 379/56/470 +f 379/56/470 372/805/463 101/121/104 +f 371/805/462 378/56/469 186/121/193 +f 186/121/193 378/56/469 91/110/94 +s 1 +f 353/701/430 74/660/77 348/651/418 +f 353/701/430 348/651/418 193/650/206 +usemtl back +f 69/791/71 368/797/459 366/792/457 +f 366/792/457 368/797/459 243/799/263 +# 0 polygons - 732 triangles + diff --git a/resources/objects/crash/icon.png b/resources/objects/crash/icon.png new file mode 100644 index 0000000..2050283 Binary files /dev/null and b/resources/objects/crash/icon.png differ diff --git a/resources/objects/crash/render.png b/resources/objects/crash/render.png new file mode 100644 index 0000000..c1ad038 Binary files /dev/null and b/resources/objects/crash/render.png differ diff --git a/resources/objects/crash/shoes.png b/resources/objects/crash/shoes.png new file mode 100644 index 0000000..dd405f6 Binary files /dev/null and b/resources/objects/crash/shoes.png differ diff --git a/resources/shaders/basic.frag b/resources/shaders/basic.frag index 83a604a..af322c4 100644 --- a/resources/shaders/basic.frag +++ b/resources/shaders/basic.frag @@ -1,8 +1,6 @@ #version 460 core out vec4 FragColor; -in vec4 _color; - void main() { - FragColor = _color; -} \ No newline at end of file + FragColor = vec4(1.0,1.0,0.0,1.0); +} diff --git a/resources/shaders/basic.vert b/resources/shaders/basic.vert index 8bac9e1..82b0c9d 100644 --- a/resources/shaders/basic.vert +++ b/resources/shaders/basic.vert @@ -1,8 +1,5 @@ #version 460 core layout (location = 0) in vec3 pos; -layout (location = 1) in vec4 color; - -out vec4 _color; uniform mat4 proj; uniform mat4 view; @@ -10,5 +7,4 @@ uniform mat4 model; void main() { gl_Position = proj * view * model * vec4(pos, 1.0); - _color = color; -} \ No newline at end of file +} diff --git a/resources/shaders/light_source.frag b/resources/shaders/light_source.frag new file mode 100644 index 0000000..850d777 --- /dev/null +++ b/resources/shaders/light_source.frag @@ -0,0 +1,6 @@ +#version 460 core +out vec4 FragColor; + +void main() { + FragColor = vec4(1.0); +} diff --git a/resources/shaders/light_source.vert b/resources/shaders/light_source.vert new file mode 100644 index 0000000..82b0c9d --- /dev/null +++ b/resources/shaders/light_source.vert @@ -0,0 +1,10 @@ +#version 460 core +layout (location = 0) in vec3 pos; + +uniform mat4 proj; +uniform mat4 view; +uniform mat4 model; + +void main() { + gl_Position = proj * view * model * vec4(pos, 1.0); +} diff --git a/resources/shaders/texture.frag b/resources/shaders/texture.frag index cc6a7a1..c36e58d 100644 --- a/resources/shaders/texture.frag +++ b/resources/shaders/texture.frag @@ -4,7 +4,9 @@ out vec4 FragColor; in vec2 _tex_coords; uniform sampler2D tex; +uniform vec4 color; +uniform vec4 light_color; void main() { - FragColor = texture(tex, _tex_coords); -} \ No newline at end of file + FragColor = mix(texture(tex, _tex_coords), color * light_color, 0.5); +} diff --git a/resources/shaders/texture.vert b/resources/shaders/texture.vert index 38927c4..b73b17c 100644 --- a/resources/shaders/texture.vert +++ b/resources/shaders/texture.vert @@ -11,4 +11,4 @@ uniform mat4 model; void main() { gl_Position = proj * view * model * vec4(pos, 1.0); _tex_coords = tex_coords; -} \ No newline at end of file +} diff --git a/src/graphics.rs b/src/graphics.rs index 6421708..cd74a45 100644 --- a/src/graphics.rs +++ b/src/graphics.rs @@ -2,6 +2,7 @@ pub mod context; pub mod window; pub mod wrapper; pub mod mesh; +pub mod camera; pub use context::*; pub use window::*; diff --git a/src/graphics/camera.rs b/src/graphics/camera.rs new file mode 100644 index 0000000..789b061 --- /dev/null +++ b/src/graphics/camera.rs @@ -0,0 +1,186 @@ +use cgmath::{num_traits::clamp, Matrix4}; + +use crate::{ + maths::{Matrix, Vector}, + vector, +}; + +#[derive(Debug)] +pub struct Camera { + aspect: f32, + speed: f32, + position: Vector, + world_up: Vector, + front: Vector, + right: Vector, + up: Vector, + rotation_sensitivity: f32, + yaw: f32, + pitch: f32, + near: f32, + far: f32, + fov: f32, + min_fov: f32, + max_fov: f32, +} + +impl Camera { + pub fn new( + aspect: f32, + speed: f32, + position: Vector, + world_up: Vector, + rotation_sensitivity: f32, + yaw: f32, + pitch: f32, + near: f32, + far: f32, + fov: f32, + min_fov: f32, + max_fov: f32, + ) -> Camera { + let mut c = Camera { + aspect, + speed, + position, + world_up, + front: vector![0.0, 0.0, -1.0], + right: vector![1.0, 0.0, 0.0], + up: vector![0.0, 1.0, 0.0], + rotation_sensitivity, + yaw, + pitch, + near, + far, + fov, + min_fov, + max_fov, + }; + c.update_vectors(); + c + } + + pub fn pos(&self) -> Vector { + self.position.clone() + } + + pub fn orientation(&self) -> (f32, f32) { + (self.yaw, self.pitch) + } + + pub fn set_aspect(&mut self, aspect: f32) { + self.aspect = aspect; + } + + pub fn set_speed(&mut self, speed: f32) { + self.speed = speed + } + + pub fn set_yaw(&mut self, yaw: f32) { + self.yaw = yaw; + self.clamp_yaw(); + self.update_vectors(); + } + + pub fn set_yaw_w_offset(&mut self, yaw_offset: f32) { + self.yaw += yaw_offset; + self.clamp_yaw(); + self.update_vectors(); + } + + fn clamp_yaw(&mut self) { + match self.yaw { + y if y > 360.0 => { + while self.yaw > 360.0 { + self.yaw -= 360.0 + } + } + y if y < 0.0 => { + while self.yaw < 0.0 { + self.yaw += 360.0 + } + } + _ => (), + } + } + + pub fn set_pitch(&mut self, pitch: f32) { + self.pitch = pitch; + self.clamp_pitch(); + self.update_vectors(); + } + + pub fn set_pitch_w_offset(&mut self, pitch_offset: f32) { + self.pitch += pitch_offset; + self.clamp_pitch(); + self.update_vectors(); + } + + fn clamp_pitch(&mut self) { + self.pitch = clamp(self.pitch, -89.0, 89.0) + } + + fn update_vectors(&mut self) { + self.front = vector![ + self.yaw.to_radians().cos() * self.pitch.to_radians().cos(), + self.pitch.to_radians().sin(), + self.yaw.to_radians().sin() * self.pitch.to_radians().cos() + ] + .unit(); + self.right = self.front.cross(&self.world_up).unit(); + self.up = self.right.cross(&self.front).unit(); + } + + pub fn view(&self) -> Matrix { + Matrix::look_at(&self.position, &(&self.position + &self.front), &self.up) + } + + pub fn proj(&self) -> Matrix { + Matrix::projection_perspective(self.fov.to_radians(), self.aspect, self.near, self.far) + } + + pub fn update_pos(&mut self, time_delta: f64, window: &glfw::Window) { + let speed = self.speed * time_delta as f32; + if window.get_key(glfw::Key::W) == glfw::Action::Press { + self.position += speed * &self.front; + } + if window.get_key(glfw::Key::S) == glfw::Action::Press { + self.position -= speed * &self.front; + } + if window.get_key(glfw::Key::A) == glfw::Action::Press { + self.position -= speed * &self.right; + } + if window.get_key(glfw::Key::D) == glfw::Action::Press { + self.position += speed * &self.right; + } + } + + pub fn cursor_pos_callback(&mut self, x_offset: f64, y_offset: f64) { + self.set_yaw_w_offset(x_offset as f32 * self.rotation_sensitivity); + self.set_pitch_w_offset(y_offset as f32 * self.rotation_sensitivity); + } + + pub fn scroll_callback(&mut self, _x_offset: f64, y_offset: f64) { + self.fov -= y_offset as f32; + self.fov = clamp(self.fov, self.min_fov, self.max_fov) + } +} + +impl Default for Camera { + fn default() -> Self { + Self::new( + 1920.0 / 1080.0, + 3.0, + vector![0.0, 0.0, 5.0], + vector![0.0, 1.0, 0.0], + 0.05, + -90.0, + 0.0, + 0.1, + 100.0, + 70.0, + 1.0, + 70.0, + ) + } +} diff --git a/src/graphics/mesh.rs b/src/graphics/mesh.rs index e69de29..dfce0c4 100644 --- a/src/graphics/mesh.rs +++ b/src/graphics/mesh.rs @@ -0,0 +1,123 @@ +use std::{ + mem::{self, size_of}, + os::raw::c_void, + ptr, +}; + +use gl::types::{GLfloat, GLsizei}; +use obj::Obj; + +use crate::maths::Matrix; + +use super::{ + camera::Camera, + wrapper::{shader_program, ShaderProgram, Texture2D, VertexAttrib, BO, EBO, VAO, VBO}, +}; + +pub struct Cube<'a> { + model: Matrix, + vao: VAO, + vbo: VBO, + ebo: EBO, + attrib:VertexAttrib, + texture: Option<&'a Texture2D>, +} + +impl<'a> Cube<'a> { + pub fn new( + model: Option, + texture: Option<&'a Texture2D>, + tex_coords: Option>, + ) -> Self { + let mut vertex_data = vec![ + 1.0, 1.0, 1.0, //0 + 1.0, 1.0, -1.0, //1 + 1.0, -1.0, 1.0, //2 + 1.0, -1.0, -1.0, //3 + -1.0, 1.0, 1.0, //4 + -1.0, 1.0, -1.0, //5 + -1.0, -1.0, 1.0, //6 + -1.0, -1.0, -1.0, //7 + ]; + + match texture { + Some(texture) => { + let tex_coords = tex_coords.unwrap_or(vec![ + 1.0, 1.0, //0 + 0.0, 1.0, //1 + 1.0, 0.0, //2 + 0.0, 0.0, //3 + 0.0, 1.0, //4 + 1.0, 1.0, //5 + 0.0, 0.0, //6 + 1.0, 0.0, //7 + ]); + } + None => (), + } + + let vao = VAO::new(); + let vbo: VBO = BO::new(gl::STATIC_DRAW, vertex_data); + let ebo: EBO = BO::new( + gl::STATIC_DRAW, + vec![ + 4, 5, 6, 4, 1, 0, //Top + 7, 6, 2, 7, 2, 3, //Bottom + 7, 5, 4, 7, 4, 6, //Left + 2, 0, 1, 2, 1, 3, //Right + 6, 4, 0, 6, 0, 2, //Front + 3, 1, 5, 3, 5, 7, //Back + ], + ); + let attrib = VertexAttrib::new( + 0, + 3, + gl::FLOAT, + gl::FALSE, + 3 * size_of::() as GLsizei, + ptr::null(), + ); + + attrib.disable(); + ebo.unbind(); + vbo.unbind(); + vao.unbind(); + + Cube { + model: model.unwrap_or(Matrix::model_default()), + vao, + vbo, + ebo, + attrib, + texture, + } + } + + pub fn draw(&mut self, camera: &Camera, shader: &mut ShaderProgram) { + shader.bind(); + self.vao.bind(); + self.vbo.bind(); + self.ebo.bind(); + self.attrib.enable(); + shader.uniform_matrix_4fv("proj", &camera.proj()); + shader.uniform_matrix_4fv("view", &camera.view()); + shader.uniform_matrix_4fv("model", &self.model); + unsafe { gl::DrawElements(gl::TRIANGLES, 36, gl::UNSIGNED_INT, ptr::null()) } + self.attrib.disable(); + self.ebo.unbind(); + self.vbo.unbind(); + self.vao.unbind(); + shader.unbind(); + } +} + +pub struct Mesh { + obj: Obj, + textures: Vec, +} + +impl Mesh { + pub fn new(obj: Obj, textures: Vec) -> Self { + Self { obj, textures } + } +} diff --git a/src/graphics/window.rs b/src/graphics/window.rs index 7ce5f40..56c9396 100644 --- a/src/graphics/window.rs +++ b/src/graphics/window.rs @@ -6,16 +6,22 @@ use std::os::raw::c_void; use std::ptr; use std::sync::mpsc::Receiver; +use super::camera::Camera; + pub struct Window { glfw: glfw::Glfw, window: glfw::Window, ui: EguiBackend, + camera: Camera, events: Receiver<(f64, WindowEvent)>, + last_pos: (f64, f64), + last_frame: f64, + time_delta: f64, } impl Window { pub fn new(width: u32, height: u32, title: &str) -> Window { - let mut glfw = glfw::init(glfw::FAIL_ON_ERRORS).unwrap(); + let mut glfw = glfw::init(glfw::fail_on_errors).unwrap(); glfw.window_hint(glfw::WindowHint::ContextVersion(4, 6)); glfw.window_hint(glfw::WindowHint::OpenGlProfile( glfw::OpenGlProfileHint::Core, @@ -27,6 +33,8 @@ impl Window { .create_window(width, height, title, glfw::WindowMode::Windowed) .expect("Failed to create GLFW window!"); + window.make_current(); + window.set_key_polling(true); window.set_cursor_pos_polling(true); window.set_mouse_button_polling(true); @@ -34,7 +42,11 @@ impl Window { window.set_scroll_polling(true); window.set_char_polling(true); - window.make_current(); + let last_pos = (width as f64 / 2.0, height as f64 / 2.0); + window.set_cursor_mode(glfw::CursorMode::Disabled); + window.set_cursor_pos(last_pos.0, last_pos.1); + window.set_sticky_keys(true); + glfw.set_swap_interval(glfw::SwapInterval::Sync(1)); gl::load_with(|symbol| window.get_proc_address(symbol) as *const _); @@ -50,14 +62,21 @@ impl Window { } let ui = EguiBackend::new(&mut window, &mut glfw); + let mut camera = Camera::default(); + camera.set_aspect(width as f32 / height as f32); Window { glfw, window, ui, + camera, events, + last_pos, + last_frame: 0.0, + time_delta: 0.0, } } + pub fn glfw_handle(&self) -> &glfw::Glfw { &self.glfw } @@ -78,12 +97,24 @@ impl Window { &self.ui } + pub fn camera_handle(&self) -> &Camera { + &self.camera + } + + pub fn time_delta(&self) -> f64 { + self.time_delta + } + pub fn update(&mut self) { self.glfw.poll_events(); self.process_events(); self.process_errors(); - self.update_ui(); self.window.swap_buffers(); + + let cur_frame = self.glfw.get_time(); + self.time_delta = cur_frame - self.last_frame; + self.last_frame = cur_frame; + self.camera.update_pos(self.time_delta, &self.window); } pub fn events(&self) -> glfw::FlushedMessages<'_, (f64, WindowEvent)> { @@ -93,14 +124,56 @@ impl Window { fn process_events(&mut self) { for (_, event) in glfw::flush_messages(&self.events) { self.ui.handle_event(&event, &self.window); - // println!("EVENT - {:?}", event); + match event { + WindowEvent::CursorPos(x, y) => { + let (last_x, last_y) = self.last_pos; + self.camera.cursor_pos_callback(x - last_x, last_y - y); + self.last_pos = (x, y); + } WindowEvent::FramebufferSize(width, height) => unsafe { gl::Viewport(0, 0, width, height) }, WindowEvent::Key(Key::Escape, _, Action::Press, _) => { self.window.set_should_close(true) } + WindowEvent::Scroll(x_offset, y_offset) => { + self.camera.scroll_callback(x_offset, y_offset) + } + // //egui bindings + // glfw::WindowEvent::Key( + // glfw::Key::X, + // _, + // glfw::Action::Press, + // glfw::Modifiers::Control, + // ) => { + // self.ui.push_event(egui::Event::Cut); + // } + // glfw::WindowEvent::Key( + // glfw::Key::C, + // _, + // glfw::Action::Press, + // glfw::Modifiers::Control, + // ) => { + // self.ui.push_event(egui::Event::Copy); + // } + // glfw::WindowEvent::Key( + // glfw::Key::V, + // _, + // glfw::Action::Press, + // glfw::Modifiers::Control, + // ) => { + // let text = match copypasta_ext::try_context() { + // Some(mut context) => Some(context.get_contents().unwrap()), + // None => { + // eprintln!("enable to gather context for clipboard"); + // None + // } + // }; + // if let Some(text) = text { + // self.ui.push_event(egui::Event::Text(text)); + // } + // } _ => (), } } @@ -118,7 +191,9 @@ impl Window { } } - fn update_ui(&mut self) { + pub fn render_ui(&mut self, render_ui: fn(egui::Context)) { + self.ui.begin_frame(&self.window, &mut self.glfw); + render_ui(self.ui.get_egui_ctx().to_owned()); let (w, h) = self.window.get_framebuffer_size(); let output = self.ui.end_frame((w as _, h as _)); if !output.platform_output.copied_text.is_empty() { @@ -132,10 +207,6 @@ impl Window { } } } - - pub fn ui_begin_frame(&mut self) { - self.ui.begin_frame(&mut self.window, &mut self.glfw) - } } extern "system" fn debug_callback( diff --git a/src/graphics/wrapper/shader_program.rs b/src/graphics/wrapper/shader_program.rs index e67a1fa..2ed47c3 100644 --- a/src/graphics/wrapper/shader_program.rs +++ b/src/graphics/wrapper/shader_program.rs @@ -81,6 +81,13 @@ impl ShaderProgram { } } + pub fn uniform_3fv(&mut self, name: &str, v: Vector) { + assert_eq!(v.len(), 3); + unsafe { + gl::Uniform3fv(self.get_location(name), 1, v.as_ptr()); + } + } + pub fn uniform_4f(&mut self, name: &str, v1: f32, v2: f32, v3: f32, v4: f32) { unsafe { gl::Uniform4f(self.get_location(name), v1, v2, v3, v4); diff --git a/src/main.rs b/src/main.rs index 0fd906c..67cd7d1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,67 +1,204 @@ +use doom_engine::graphics::mesh::Cube; use doom_engine::graphics::{wrapper::*, Window}; use doom_engine::maths::*; +use doom_engine::{matrix, vector}; use egui_glfw::egui; use gl::types::*; +use std::error::Error; use std::f32::consts::PI; +use std::fs::File; +use std::io::BufReader; use std::{mem, os::raw::c_void, ptr}; +use tobj::{load_obj, LoadOptions}; -static WIDTH: u32 = 1400; +static WIDTH: u32 = 1920; -static HEIGHT: u32 = 800; +static HEIGHT: u32 = 1080; -fn main() { +fn maaaain() -> Result<(), Box> { + // let (models, materials) = load_obj( + // "resources/objects/crash/crashbandicoot.obj", + // &LoadOptions::default(), + // ) + // .expect("obj loading"); + // let materials = materials.expect("material loading"); + + // println!("Number of models = {}", models.len()); + // println!("Number of materials = {}", materials.len()); + + // for (i, m) in models.iter().enumerate() { + // let mesh = &m.mesh; + // println!(""); + // println!("model[{}].name = \'{}\'", i, m.name); + // println!("model[{}].mesh.material_id = {:?}", i, mesh.material_id); + + // println!( + // "model[{}].face_count = {}", + // i, + // mesh.face_arities.len() + // ); + + // let mut next_face = 0; + // for face in 0..mesh.face_arities.len() { + // let end = next_face + mesh.face_arities[face] as usize; + + // let face_indices = &mesh.indices[next_face..end]; + // println!(" face[{}].indices = {:?}", face, face_indices); + + // if !mesh.texcoord_indices.is_empty() { + // let texcoord_face_indices = &mesh.texcoord_indices[next_face..end]; + // println!( + // " face[{}].texcoord_indices = {:?}", + // face, texcoord_face_indices + // ); + // } + // if !mesh.normal_indices.is_empty() { + // let normal_face_indices = &mesh.normal_indices[next_face..end]; + // println!( + // " face[{}].normal_indices = {:?}", + // face, normal_face_indices + // ); + // } + + // next_face = end; + // } + + // // Normals and texture coordinates are also loaded, but not printed in + // // this example. + // println!( + // "model[{}].positions = {}", + // i, + // mesh.positions.len() / 3 + // ); + // assert!(mesh.positions.len() % 3 == 0); + + // for vtx in 0..mesh.positions.len() / 3 { + // println!( + // " position[{}] = ({}, {}, {})", + // vtx, + // mesh.positions[3 * vtx], + // mesh.positions[3 * vtx + 1], + // mesh.positions[3 * vtx + 2] + // ); + // } + // } + + // for (i, m) in materials.iter().enumerate() { + // println!("material[{}].name = \'{}\'", i, m.name); + // println!( + // " material.Ka = ({:#?})", + // m.ambient.unwrap_or([-1., -1., -1.]) + // ); + // println!( + // " material.Kd = ({:#?})", + // m.diffuse.unwrap_or([-1., -1., -1.]) + // ); + // println!( + // " material.Ks = ({:#?})", + // m.specular.unwrap_or([-1., -1., -1.]) + // ); + // println!(" material.Ns = {}", m.shininess.unwrap_or(-1.)); + // println!(" material.d = {}", m.dissolve.unwrap_or(-1.)); + // println!( + // " material.map_Ka = {}", + // m.ambient_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + // println!( + // " material.map_Kd = {}", + // m.diffuse_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + // println!( + // " material.map_Ks = {}", + // m.specular_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + // println!( + // " material.map_Ns = {}", + // m.shininess_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + // println!( + // " material.map_Bump = {}", + // m.normal_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + // println!( + // " material.map_d = {}", + // m.dissolve_texture.as_ref().unwrap_or(&"NONE".to_string()) + // ); + + // for (k, v) in &m.unknown_param { + // println!(" material.{} = {}", k, v); + // } + // } + // return Ok(()); let mut window = Window::new(WIDTH, HEIGHT, "Doom Engine"); - let mut shader_program = ShaderProgram::new( - "resources/shaders/texture.vert", - "resources/shaders/texture.frag", - ); + // let mut shader_program = ShaderProgram::new( + // "resources/shaders/texture.vert", + // "resources/shaders/texture.frag", + // ); - let texture_gato = Texture2D::new("resources/textures/cat.jpg"); - let texture_gatorrito = Texture2D::new("resources/textures/gatorrito.jpg"); - let texture_pog = Texture2D::new("resources/textures/pog.jpg"); - - // All Buffer Objects are binded and the data is stored on creation - let _vao = VAO::new(); - let _vbo: VBO = BO::new( - gl::STATIC_DRAW, - vec![ - // positions [3] // tex [2] - -0.5, 0.5, 0., 0.0, 1.0, // top right - 0.5, 0.5, 0., 1., 1., // bottom right - -0.5, -0.5, 0., 0., 0., // bottom left - 0.5, -0.5, 0., 1., 0., // top left - ], - ); - let _ebo: EBO = BO::new( - gl::STATIC_DRAW, - vec![ - 2, 1, 0, // first Triangle - 3, 2, 1, // second Triangle - ], - ); + // let texture_gato = Texture2D::new("resources/textures/cat.jpg"); + // let texture_gatorrito = Texture2D::new("resources/textures/gatorrito.jpg"); + // let texture_pog = Texture2D::new("resources/textures/pog.jpg"); - let stride = 5 * mem::size_of::() as GLsizei; + // // All Buffer Objects are binded and the data is stored on creation + // let _vao = VAO::new(); + // let _vbo: VBO = BO::new( + // gl::STATIC_DRAW, + // vec![ + // -0.5, -0.5, -0.5, 0.0, 0.0, 0.5, -0.5, -0.5, 1.0, 0.0, 0.5, 0.5, -0.5, 1.0, 1.0, 0.5, + // 0.5, -0.5, 1.0, 1.0, -0.5, 0.5, -0.5, 0.0, 1.0, -0.5, -0.5, -0.5, 0.0, 0.0, -0.5, -0.5, + // 0.5, 0.0, 0.0, 0.5, -0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 1.0, 0.5, 0.5, 0.5, 1.0, + // 1.0, -0.5, 0.5, 0.5, 0.0, 1.0, -0.5, -0.5, 0.5, 0.0, 0.0, -0.5, 0.5, 0.5, 1.0, 0.0, + // -0.5, 0.5, -0.5, 1.0, 1.0, -0.5, -0.5, -0.5, 0.0, 1.0, -0.5, -0.5, -0.5, 0.0, 1.0, + // -0.5, -0.5, 0.5, 0.0, 0.0, -0.5, 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, + // -0.5, 1.0, 1.0, 0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, 0.5, + // 0.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, -0.5, -0.5, -0.5, 0.0, 1.0, 0.5, -0.5, -0.5, 1.0, + // 1.0, 0.5, -0.5, 0.5, 1.0, 0.0, 0.5, -0.5, 0.5, 1.0, 0.0, -0.5, -0.5, 0.5, 0.0, 0.0, + // -0.5, -0.5, -0.5, 0.0, 1.0, -0.5, 0.5, -0.5, 0.0, 1.0, 0.5, 0.5, -0.5, 1.0, 1.0, 0.5, + // 0.5, 0.5, 1.0, 0.0, 0.5, 0.5, 0.5, 1.0, 0.0, -0.5, 0.5, 0.5, 0.0, 0.0, -0.5, 0.5, -0.5, + // 0.0, 1.0, + // ], + // ); + // let cube_pos = [ + // (2.0, 5.0, -15.0), + // (-1.5, -2.2, -2.5), + // (-3.8, -2.0, -12.3), + // (2.4, -0.4, -3.5), + // (-1.7, 3.0, -7.5), + // (1.3, -2.0, -2.5), + // (1.5, 2.0, -2.5), + // (1.5, 0.2, -1.5), + // (-1.3, 1.0, -1.5), + // ]; + // //let _ebo: EBO = BO::new( + // // gl::STATIC_DRAW, + // // vec![ + // // 2, 1, 0, // first Triangle + // // 3, 2, 1, // second Triangle + // // ], + // //); - let _pos_attrib = VertexAttrib::new(0, 3, gl::FLOAT, gl::FALSE, stride, ptr::null()); - let _tex_attrib = VertexAttrib::new( - 1, - 2, - gl::FLOAT, - gl::FALSE, - stride, - (3 * mem::size_of::()) as *const c_void, - ); + // let stride = 5 * mem::size_of::() as GLsizei; + + // let _pos_attrib = VertexAttrib::new(0, 3, gl::FLOAT, gl::FALSE, stride, ptr::null()); + // let _tex_attrib = VertexAttrib::new( + // 1, + // 2, + // gl::FLOAT, + // gl::FALSE, + // stride, + // (3 * mem::size_of::()) as *const c_void, + // ); - _ebo.unbind(); - _vbo.unbind(); - _vao.unbind(); - _pos_attrib.disable(); - _tex_attrib.disable(); - texture_gato.unbind(); - texture_pog.unbind(); - texture_gatorrito.unbind(); - shader_program.unbind(); + // //_ebo.unbind(); + // _vbo.unbind(); + // _vao.unbind(); + // _pos_attrib.disable(); + // _tex_attrib.disable(); + // texture_gato.unbind(); + // texture_pog.unbind(); + // texture_gatorrito.unbind(); + // shader_program.unbind(); let mut scale = ( 1.0.to_string().to_owned(), @@ -75,238 +212,282 @@ fn main() { 0.0.to_string().to_owned(), ); + //let mut basic_shader = ShaderProgram::new( + // "resources/shaders/basic.vert", + // "resources/shaders/basic.frag", + //); + + // let mut light_shader = ShaderProgram::new( + // "resources/shaders/light_source.vert", + // "resources/shaders/light_source.frag", + // ); + + // let mut cube = Cube::new(None, None, None); + + let mut t; unsafe { gl::ClearColor(154. / 258., 127. / 258., 174. / 258., 1.0); } - - let mut t; - + window.glfw_handle_mut().set_time(0.); while !window.window_handle().should_close() { unsafe { gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT); } - { - t = window.glfw_handle().get_time() as f32; - - // shader_program.bind(); - // _pos_attrib.enable(); - // _tex_attrib.enable(); - _vao.bind(); - _ebo.bind(); - // shader_program.uniform_4fv( - // "color", - // vector![1.0 - color, color, color.powi(2), 1.0], - // ); - shader_program.uniform_matrix_4fv( - "proj", - &Matrix::projection_perspective(PI / 2., WIDTH as f32 / HEIGHT as f32, 0.1, 100.), - ); - shader_program.uniform_matrix_4fv("view", &Matrix::translation((0., 0., -1.5))); - - shader_program.uniform_matrix_4fv( - "model", - &(Matrix::translation((0., 0.5 * (1.5 * t).sin(), 0.)) - * Matrix::translation(( - translate.0.parse::().unwrap_or(0.0), - translate.1.parse::().unwrap_or(0.0), - translate.2.parse::().unwrap_or(0.0), - )) - * Matrix::rotation((0.12, t, 0.)) - * Matrix::rotation(rotate) - * Matrix::scaling(( - scale.0.parse::().unwrap_or(0.0), - scale.1.parse::().unwrap_or(0.0), - scale.2.parse::().unwrap_or(0.0), - ))), - ); - - texture_gato.bind(); - shader_program.uniform_2dtex("tex", &texture_gato); - unsafe { gl::DrawElements(gl::TRIANGLES, 6, gl::UNSIGNED_INT, ptr::null()) } - texture_gato.unbind(); - - shader_program.uniform_matrix_4fv( - "model", - &(Matrix::translation(((2. * t).sin(), 0., (2. * t).cos())) - * Matrix::translation(( - translate.0.parse::().unwrap_or(0.0), - translate.1.parse::().unwrap_or(0.0), - translate.2.parse::().unwrap_or(0.0), - )) - * Matrix::rotation((0.12, 2. * PI * t, 0.)) - * Matrix::rotation(rotate) - * Matrix::scaling(( - scale.0.parse::().unwrap_or(0.0), - scale.1.parse::().unwrap_or(0.0), - scale.2.parse::().unwrap_or(0.0), - ))), - ); - - texture_gatorrito.bind(); - shader_program.uniform_2dtex("tex", &texture_gatorrito); - unsafe { gl::DrawElements(gl::TRIANGLES, 6, gl::UNSIGNED_INT, ptr::null()) } - texture_gatorrito.unbind(); - - shader_program.uniform_matrix_4fv( - "model", - &(Matrix::translation((0.2 * (t).sin(), (2. * t).sin(), (2. * t).cos())) - * Matrix::translation(( - translate.0.parse::().unwrap_or(0.0), - translate.1.parse::().unwrap_or(0.0), - translate.2.parse::().unwrap_or(0.0), - )) - * Matrix::rotation((0.12, 2. * PI * t, 0.)) - * Matrix::rotation(rotate) - * Matrix::scaling(( - scale.0.parse::().unwrap_or(0.0), - scale.1.parse::().unwrap_or(0.0), - scale.2.parse::().unwrap_or(0.0), - ))), - ); - - texture_pog.bind(); - shader_program.uniform_2dtex("tex", &texture_pog); - unsafe { gl::DrawElements(gl::TRIANGLES, 6, gl::UNSIGNED_INT, ptr::null()) } - texture_pog.unbind(); - - _ebo.unbind(); - _vao.unbind(); - // _pos_attrib.disable(); - // _tex_attrib.disable(); - shader_program.unbind(); - } + // { + t = window.glfw_handle().get_time() as f32; + // println!("cum"); + // shader_program.bind(); + // //_pos_attrib.enable(); + // //_tex_attrib.enable(); + // _vao.bind(); + // //_ebo.bind(); + // // shader_program.uniform_4fv( + // // "color", + // // vector![1.0 - color, color, color.powi(2), 1.0], + // // ); + // shader_program.uniform_matrix_4fv("proj", &window.camera_handle().proj()); + // shader_program.uniform_matrix_4fv("view", &window.camera_handle().view()); + // shader_program.uniform_4fv("color", vector![1.0, 0.5, 0.31, 1.0]); + // shader_program.uniform_4fv("light_color", vector![1.0, 0.5, 0.31, 1.0]); - { - window.ui_begin_frame(); - - let egui_ctx = window.ui_handle().get_egui_ctx().to_owned(); - egui::SidePanel::left("my_side_panel") - .resizable(true) - .show(&egui_ctx, |ui| { - ui.heading("Hello World!"); - if ui.button("Quit").clicked() { - window.window_handle_mut().set_should_close(true); - } - - egui::ComboBox::from_label("Version") - .width(150.0) - .selected_text("foo") - .show_ui(ui, |ui| { - egui::CollapsingHeader::new("Dev") - .default_open(true) - .show(ui, |ui| { - ui.label("contents"); - }); - }); - - ui.label(format!( - "window content scale: {:?}", - window.window_handle().get_content_scale() - )); - ui.label(format!( - "monitor content scale: {:?}", - window - .glfw_handle_mut() - .with_connected_monitors(|_, monitors| { - monitors - .iter() - .map(|monitor| monitor.get_content_scale()) - .collect::>() - }) - )); - ui.label(format!( - "monitor physical size in mm: {:?}", - window - .glfw_handle_mut() - .with_connected_monitors(|_, monitors| { - monitors - .iter() - .map(|monitor| monitor.get_physical_size()) - .collect::>() - }) - )); - ui.label(format!( - "monitor physical size in inch: {:?}", - window - .glfw_handle_mut() - .with_connected_monitors(|_, monitors| { - monitors - .iter() - .map(|monitor| { - let mm = monitor.get_physical_size(); - (mm.0 as f32 / 25.4, mm.1 as f32 / 25.4) - }) - .collect::>() - }) - )); - ui.label(format!( - "monitor positions: {:?}", - window - .glfw_handle_mut() - .with_connected_monitors(|_, monitors| { - monitors - .iter() - .map(|monitor| monitor.get_pos()) - .collect::>() - }) - )); - ui.label(format!( - "window position: {:?}", - window.window_handle().get_pos() - )); - }); - - egui::Window::new("Quad").show(&window.ui_handle().get_egui_ctx(), |ui| { - ui.set_max_width(280.0); - ui.group(|ui| { - ui.horizontal(|ui| { - ui.label("time"); - ui.label(window.glfw_handle().get_time().to_string()); - ui.label("s."); - }); - ui.horizontal(|ui| { - ui.set_max_width(250.0); - ui.label("scale"); - ui.label("x:"); - ui.add(egui::TextEdit::singleline(&mut scale.0).desired_width(30.0)); - ui.label("y:"); - ui.add(egui::TextEdit::singleline(&mut scale.1).desired_width(30.0)); - ui.label("z:"); - ui.add(egui::TextEdit::singleline(&mut scale.2).desired_width(30.0)); - }); - ui.horizontal(|ui| { - ui.label("rotate"); - ui.vertical(|ui| { - ui.horizontal(|ui| { - ui.label("x"); - ui.add(egui::Slider::new(&mut rotate.0, 0.0..=(2.0 * PI))); - }); - ui.horizontal(|ui| { - ui.label("y"); - ui.add(egui::Slider::new(&mut rotate.1, 0.0..=(2.0 * PI))); - }); - - ui.horizontal(|ui| { - ui.label("z"); - ui.add(egui::Slider::new(&mut rotate.2, 0.0..=(2.0 * PI))); - }); - }) - }); - ui.horizontal(|ui| { - ui.set_max_width(250.0); - ui.label("translate"); - ui.label("x:"); - ui.add(egui::TextEdit::singleline(&mut translate.0).desired_width(30.0)); - ui.label("y:"); - ui.add(egui::TextEdit::singleline(&mut translate.1).desired_width(30.0)); - ui.label("z:"); - ui.add(egui::TextEdit::singleline(&mut translate.2).desired_width(30.0)); - }); - }); - }); - } + // cube_pos.iter().for_each(|pos| { + // let m = Matrix::translation(*pos) + // //* Matrix::translation(( + // // translate.0.parse::().unwrap_or(0.0), + // // translate.1.parse::().unwrap_or(0.0), + // // translate.2.parse::().unwrap_or(0.0), + // //)) + // //* Matrix::scaling(( + // // scale.0.parse::().unwrap_or(1.0), + // // scale.1.parse::().unwrap_or(1.0), + // // scale.2.parse::().unwrap_or(1.0), + // //)) + // ; + // shader_program.uniform_matrix_4fv("model", &m); + + // shader_program.uniform_2dtex("tex", &texture_gatorrito); + // unsafe { gl::DrawArrays(gl::TRIANGLES, 0, 36) } + // texture_gatorrito.unbind(); + // }); + + // //shader_program.uniform_matrix_4fv( + // // "model", + // // &(Matrix::translation((0., 0.5 * (1.5 * t).sin(), 0.)) + // // * Matrix::translation(( + // // translate.0.parse::().unwrap_or(0.0), + // // translate.1.parse::().unwrap_or(0.0), + // // translate.2.parse::().unwrap_or(0.0), + // // )) + // // * Matrix::rotation((0.12, t, 0.)) + // // * Matrix::rotation(rotate) + // // * Matrix::scaling(( + // // scale.0.parse::().unwrap_or(0.0), + // // scale.1.parse::().unwrap_or(0.0), + // // scale.2.parse::().unwrap_or(0.0), + // // ))), + // // ); + + // //texture_gato.bind(); + // //shader_program.uniform_2dtex("tex", &texture_gato); + // //unsafe { gl::DrawArrays(gl::TRIANGLES, 0, 32) } + // //texture_gato.unbind(); + + // //shader_program.uniform_matrix_4fv( + // // "model", + // // &(Matrix::translation(((2. * t).sin(), 0., (2. * t).cos())) + // // * Matrix::translation(( + // // translate.0.parse::().unwrap_or(0.0), + // // translate.1.parse::().unwrap_or(0.0), + // // translate.2.parse::().unwrap_or(0.0), + // // )) + // // * Matrix::rotation((0.12, 2. * PI * t, 0.)) + // // * Matrix::rotation(rotate) + // // * Matrix::scaling(( + // // scale.0.parse::().unwrap_or(0.0), + // // scale.1.parse::().unwrap_or(0.0), + // // scale.2.parse::().unwrap_or(0.0), + // // ))), + // //); + + // //texture_gatorrito.bind(); + // //shader_program.uniform_2dtex("tex", &texture_gatorrito); + // //unsafe { gl::DrawArrays(gl::TRIANGLES, 0, 32) } + // //texture_gatorrito.unbind(); + + // //shader_program.uniform_matrix_4fv( + // // "model", + // // &(Matrix::translation((0.2 * (t).sin(), (2. * t).sin(), (2. * t).cos())) + // // * Matrix::translation(( + // // translate.0.parse::().unwrap_or(0.0), + // // translate.1.parse::().unwrap_or(0.0), + // // translate.2.parse::().unwrap_or(0.0), + // // )) + + // // * Matrix::rotation((0.12, 2. * PI * t, 0.)) + // // * Matrix::rotation(rotate) + // // * Matrix::scaling(( + // // scale.0.parse::().unwrap_or(0.0), + // // scale.1.parse::().unwrap_or(0.0), + // // scale.2.parse::().unwrap_or(0.0), + // // ))), + // //); + + // //texture_pog.bind(); + // //shader_program.uniform_2dtex("tex", &texture_pog); + // //unsafe { gl::DrawArrays(gl::TRIANGLES, 0, 32) } + // //texture_pog.unbind(); + + // //_ebo.unbind(); + // _vao.unbind(); + // _pos_attrib.disable(); + // _tex_attrib.disable(); + // } + println!("Draw cube"); + // cube.draw(window.camera_handle(), &mut light_shader); + + // { + // egui::SidePanel::left("my_side_panel") + // .resizable(true) + // .show(&egui_ctx, |ui| { + // ui.heading("Hello World!"); + // if ui.button("Quit").clicked() { + // window.window_handle_mut().set_should_close(true); + // } + + // egui::ComboBox::from_label("Version") + // .width(150.0) + // .selected_text("foo") + // .show_ui(ui, |ui| { + // egui::CollapsingHeader::new("Dev") + // .default_open(true) + // .show(ui, |ui| { + // ui.label("contents"); + // }); + // }); + + // ui.label(format!( + // "window content scale: {:?}", + // window.window_handle().get_content_scale() + // )); + // ui.label(format!( + // "monitor content scale: {:?}", + // window + // .glfw_handle_mut() + // .with_connected_monitors(|_, monitors| { + // monitors + // .iter() + // .map(|monitor| monitor.get_content_scale()) + // .collect::>() + // }) + // )); + // ui.label(format!( + // "monitor physical size in mm: {:?}", + // window + // .glfw_handle_mut() + // .with_connected_monitors(|_, monitors| { + // monitors + // .iter() + // .map(|monitor| monitor.get_physical_size()) + // .collect::>() + // }) + // )); + // ui.label(format!( + // "monitor physical size in inch: {:?}", + // window + // .glfw_handle_mut() + // .with_connected_monitors(|_, monitors| { + // monitors + // .iter() + // .map(|monitor| { + // let mm = monitor.get_physical_size(); + // (mm.0 as f32 / 25.4, mm.1 as f32 / 25.4) + // }) + // .collect::>() + // }) + // )); + // ui.label(format!( + // "monitor positions: {:?}", + // window + // .glfw_handle_mut() + // .with_connected_monitors(|_, monitors| { + // monitors + // .iter() + // .map(|monitor| monitor.get_pos()) + // .collect::>() + // }) + // )); + // ui.label(format!( + // "window position: {:?}", + // window.window_handle().get_pos() + // )); + // ui.label(format!("camera: {:#?}", window.camera_handle())); + // }); + + // egui::Window::new("Quad").show(window.ui_handle().get_egui_ctx(), |ui| { + // ui.set_max_width(280.0); + // ui.group(|ui| { + // ui.horizontal(|ui| { + // ui.label("time"); + // ui.label(window.glfw_handle().get_time().to_string()); + // ui.label("s."); + // }); + // ui.horizontal(|ui| { + // ui.set_max_width(250.0); + // ui.label("scale"); + // ui.label("x:"); + // ui.add(egui::TextEdit::singleline(&mut scale.0).desired_width(30.0)); + // ui.label("y:"); + // ui.add(egui::TextEdit::singleline(&mut scale.1).desired_width(30.0)); + // ui.label("z:"); + // ui.add(egui::TextEdit::singleline(&mut scale.2).desired_width(30.0)); + // }); + // ui.horizontal(|ui| { + // ui.label("rotate"); + // ui.vertical(|ui| { + // ui.horizontal(|ui| { + // ui.label("x"); + // ui.add(egui::Slider::new(&mut rotate.0, 0.0..=(2.0 * PI))); + // }); + // ui.horizontal(|ui| { + // ui.label("y"); + // ui.add(egui::Slider::new(&mut rotate.1, 0.0..=(2.0 * PI))); + // }); + + // ui.horizontal(|ui| { + // ui.label("z"); + // ui.add(egui::Slider::new(&mut rotate.2, 0.0..=(2.0 * PI))); + // }); + // }) + // }); + // ui.horizontal(|ui| { + // ui.set_max_width(250.0); + // ui.label("translate"); + // ui.label("x:"); + // ui.add(egui::TextEdit::singleline(&mut translate.0).desired_width(30.0)); + // ui.label("y:"); + // ui.add(egui::TextEdit::singleline(&mut translate.1).desired_width(30.0)); + // ui.label("z:"); + // ui.add(egui::TextEdit::singleline(&mut translate.2).desired_width(30.0)); + // }); + // }); + // }); + // } window.update(); } + + Ok(()) +} + +fn main() { + let mut w = Window::new(500, 300, "Hola"); + unsafe { + gl::ClearColor(154. / 258., 127. / 258., 174. / 258., 1.0); + } + w.glfw_handle_mut().set_time(0.); + while !w.window_handle().should_close() { + unsafe { gl::Clear(gl::COLOR_BUFFER_BIT) } + w.update(); + } } diff --git a/src/maths/matrix.rs b/src/maths/matrix.rs index 249d0e6..bbeb3f3 100644 --- a/src/maths/matrix.rs +++ b/src/maths/matrix.rs @@ -22,14 +22,14 @@ macro_rules! matrix { //Usual methods impl Matrix { - pub fn new(rows: usize, cols: usize, data: Vec) -> Matrix { + pub fn new(rows: usize, cols: usize, data: Vec) -> Self { assert_eq!(data.len(), rows * cols); - Matrix { data, rows, cols } + Self { data, rows, cols } } - pub fn identity(rows: usize, cols: usize) -> Self { - let mut m = Matrix::zeroes(rows, cols); - for i in 0..rows { + pub fn identity(size: usize) -> Self { + let mut m = Self::zeroes(size, size); + for i in 0..size { m[i][i] = 1.0; } m @@ -58,7 +58,7 @@ impl Matrix { pub fn from_vec(data: Vec>) -> Self { let rows = data.len(); let cols = data[0].len(); - let mut m = Matrix::zeroes(rows, cols); + let mut m = Self::zeroes(rows, cols); for i in 0..rows { for j in 0..cols { m[i][j] = data[i][j]; @@ -68,7 +68,7 @@ impl Matrix { } pub fn from_vector(data: &Vector) -> Self { - Matrix { + Self { data: data.as_slice().to_vec(), rows: data.len(), cols: 1, @@ -89,17 +89,17 @@ impl Matrix { pub fn reshape(&self, new_rows: usize, new_cols: usize) -> Self { assert_eq!(self.rows * self.cols, new_rows * new_cols); - Matrix::new(new_rows, new_cols, self.data.clone()) + Self::new(new_rows, new_cols, self.data.clone()) } - pub fn transpose(&self) -> Matrix { + pub fn transpose(&self) -> Self { let mut data = vec![0.0; self.rows * self.cols]; for i in 0..self.rows { for j in 0..self.cols { data[j * self.rows + i] = self[i][j]; } } - Matrix::new(self.cols, self.rows, data) + Self::new(self.cols, self.rows, data) } pub fn remove_row(&mut self, i: usize) { @@ -141,7 +141,7 @@ impl Matrix { ///Takes a column matrix and turns it into a vector pub fn as_vector(&self) -> Vector { assert_eq!(self.cols(), 1); - Vector::from_vec(self.data.clone()) + Vector::from(self.data.clone()) } pub fn as_ptr(&self) -> *const f32 { @@ -274,17 +274,17 @@ impl Matrix { } pub fn model( - scaling_values: (f32, f32, f32), - rotation_values: (f32, f32, f32), translation_values: (f32, f32, f32), + rotation_values: (f32, f32, f32), + scaling_values: (f32, f32, f32), ) -> Self { - Self::scaling(scaling_values) + Self::translation(translation_values) * Self::rotation(rotation_values) - * Self::translation(translation_values) + * Self::scaling(scaling_values) } pub fn model_default() -> Self { - Self::model((1., 1., 1.), (0., 0., 0.), (0., 0., 0.)) + Self::identity(4) } pub fn projection_orthographic( @@ -320,14 +320,15 @@ impl Matrix { } pub fn projection_perspective(fov: f32, aspect: f32, near: f32, far: f32) -> Self { + let tan_of_half_fov = (fov / 2.).tan(); Self { data: vec![ - (fov / 2.).cos() / (aspect * (fov / 2.).sin()), + 1. / (aspect * tan_of_half_fov), 0., 0., 0., //row 1 0., - (fov / 2.).cos() / (fov / 2.).sin(), + 1. / tan_of_half_fov, 0., 0., //row 2 0., @@ -343,6 +344,40 @@ impl Matrix { cols: 4, } } + + /// position: Camera position + /// target: Target position + /// up: Up vector in world space + pub fn look_at(position: &Vector, target: &Vector, up: &Vector) -> Self { + assert_eq!(position.len(), 3); + assert_eq!(target.len(), 3); + assert_eq!(up.len(), 3); + let direction = (position - target).unit(); + let cam_right = up.unit().cross(&direction).unit(); + let cam_up = direction.cross(&cam_right); + Self { + data: vec![ + cam_right[0], + cam_right[1], + cam_right[2], + 0., //row 1 + cam_up[0], + cam_up[1], + cam_up[2], + 0., //row 2 + direction[0], + direction[1], + direction[2], + 0., //row 3 + 0., + 0., + 0., + 1., //row 4 + ], + rows: 4, + cols: 4, + } * Self::translation((-position[0], -position[1], -position[2])) + } } // Unary Ops @@ -546,3 +581,47 @@ impl IndexMut for Matrix { &mut self.data[index * self.cols..(index + 1) * self.cols] } } + +// Conversions + +// - From + +impl From<&[&[f32]]> for Matrix { + fn from(value: &[&[f32]]) -> Self { + Self::from(value.iter().map(|v| v.to_vec()).collect::>>()) + } +} + +impl From>> for Matrix { + fn from(vec: Vec>) -> Self { + let rows = vec.len(); + let cols = vec[0].len(); + let mut m = Self::zeroes(rows, cols); + for i in 0..rows { + for j in 0..cols { + m[i][j] = vec[i][j]; + } + } + m + } +} + +impl From for Matrix { + fn from(value: Vector) -> Self { + Self { + data: value.clone().into(), + rows: value.len(), + cols: 1, + } + } +} + +impl From<&Vector> for Matrix { + fn from(value: &Vector) -> Self { + Self { + data: value.into(), + rows: value.len(), + cols: 1, + } + } +} diff --git a/src/maths/vector.rs b/src/maths/vector.rs index b6dc682..7d9ae79 100644 --- a/src/maths/vector.rs +++ b/src/maths/vector.rs @@ -18,21 +18,21 @@ pub struct Vector { #[macro_export] macro_rules! vector { ( $( $x:expr ),* ) => { - $crate::maths::Vector::from_vec(vec![ $( $x ),* ]) + $crate::maths::Vector::from(vec![ $( $x ),* ]) }; } impl Vector { pub fn new(n: usize, val: f32) -> Self { - Vector::from_vec(vec![val; n]) + Vector::from(vec![val; n]) } - pub fn zeroes(n: usize) { - Vector::from_vec(vec![0.; n]); + pub fn zeroes(n: usize) -> Self { + Vector::from(vec![0.; n]) } - pub fn ones(n: usize) { - Vector::from_vec(vec![1.; n]); + pub fn ones(n: usize) -> Self { + Vector::from(vec![1.; n]) } pub fn len(&self) -> usize { @@ -58,10 +58,10 @@ impl Vector { pub fn cross(&self, other: &Vector) -> Self { assert_eq!(self.len(), 3); assert_eq!(other.len(), 3); - Vector::from_vec(vec![ - self[1] * other[2] + self[2] * other[1], - self[2] * other[0] + self[0] * other[2], - self[0] * other[1] + self[1] * other[0], + Vector::from(vec![ + self[1] * other[2] - self[2] * other[1], + self[2] * other[0] - self[0] * other[2], + self[0] * other[1] - self[1] * other[0], ]) } @@ -124,14 +124,6 @@ impl Vector { // Conversion - pub fn from_vec(v: Vec) -> Self { - Self { data: v } - } - - pub fn from_matrix(m: &Matrix) -> Self { - m.as_vector() - } - pub fn as_slice(&self) -> &[f32] { &self.data } @@ -273,14 +265,33 @@ impl IndexMut for Vector { } } -// Iterators +// Conversions -impl IntoIterator for Vector { - type Item = f32; - type IntoIter = std::vec::IntoIter; +// - From - fn into_iter(self) -> Self::IntoIter { - self.data.into_iter() +impl From<&[f32]> for Vector { + fn from(value: &[f32]) -> Self { + Vector { + data: value.to_vec(), + } + } +} + +impl From> for Vector { + fn from(value: Vec) -> Self { + Vector { data: value } + } +} + +impl From for Vector { + fn from(value: Matrix) -> Self { + value.as_vector() + } +} + +impl From<&Matrix> for Vector { + fn from(value: &Matrix) -> Self { + value.as_vector() } } @@ -299,3 +310,35 @@ impl FromIterator for Vector { } } } + +// - Into / Reverse From + +impl From for Vec { + fn from(val: Vector) -> Self { + val.data + } +} + +impl From<&Vector> for Vec { + fn from(val: &Vector) -> Self { + val.data.clone() + } +} + +impl IntoIterator for Vector { + type Item = f32; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.data.into_iter() + } +} + +impl IntoIterator for &Vector { + type Item = f32; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.data.clone().into_iter() + } +} diff --git a/tests/tests.rs b/tests/tests.rs index 85b8a32..5f5d330 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -17,7 +17,7 @@ mod tests { #[test] fn make_vector_from_vec() { - let a = Vector::from_vec(vec![1., 2., 3.]); + let a = Vector::from(vec![1., 2., 3.]); let b = vector![1., 2., 3.]; assert_eq!(a, b); }