diff --git a/elm.json b/elm.json index 7edd76f..de9b40f 100644 --- a/elm.json +++ b/elm.json @@ -1,44 +1,46 @@ { - "type": "application", - "source-directories": [ - "src" - ], - "elm-version": "0.19.1", - "dependencies": { - "direct": { - "avh4/elm-color": "1.0.0", - "elm/browser": "1.0.2", - "elm/core": "1.0.5", - "elm/html": "1.0.0", - "elm/json": "1.1.3", - "elm/time": "1.0.0", - "elm-explorations/webgl": "1.1.3", - "ianmackenzie/elm-3d-camera": "3.1.0", - "ianmackenzie/elm-3d-scene": "1.0.2", - "ianmackenzie/elm-geometry": "3.11.0", - "ianmackenzie/elm-units": "2.10.0", - "mdgriffith/elm-animator": "1.1.1", - "w0rm/elm-physics": "5.1.3" + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "avh4/elm-color": "1.0.0", + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.0", + "elm/http": "2.0.0", + "elm/json": "1.1.3", + "elm/time": "1.0.0", + "elm-explorations/webgl": "1.1.3", + "ianmackenzie/elm-3d-camera": "3.1.0", + "ianmackenzie/elm-3d-scene": "1.0.2", + "ianmackenzie/elm-geometry": "3.11.0", + "ianmackenzie/elm-units": "2.10.0", + "mdgriffith/elm-animator": "1.1.1", + "w0rm/elm-obj-file": "1.2.1", + "w0rm/elm-physics": "5.1.3" + }, + "indirect": { + "elm/bytes": "1.0.8", + "elm/file": "1.0.5", + "elm/random": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.3", + "elm-explorations/linear-algebra": "1.0.3", + "ianmackenzie/elm-1d-parameter": "1.0.1", + "ianmackenzie/elm-float-extra": "1.1.0", + "ianmackenzie/elm-geometry-linear-algebra-interop": "2.0.2", + "ianmackenzie/elm-interval": "3.1.0", + "ianmackenzie/elm-triangular-mesh": "1.1.0", + "ianmackenzie/elm-units-interval": "3.2.0" + } }, - "indirect": { - "elm/random": "1.0.0", - "elm/url": "1.0.0", - "elm/virtual-dom": "1.0.3", - "elm-explorations/linear-algebra": "1.0.3", - "ianmackenzie/elm-1d-parameter": "1.0.1", - "ianmackenzie/elm-float-extra": "1.1.0", - "ianmackenzie/elm-geometry-linear-algebra-interop": "2.0.2", - "ianmackenzie/elm-interval": "3.1.0", - "ianmackenzie/elm-triangular-mesh": "1.1.0", - "ianmackenzie/elm-units-interval": "3.2.0" + "test-dependencies": { + "direct": { + "elm-explorations/test": "2.1.2" + }, + "indirect": {} } - }, - "test-dependencies": { - "direct": { - "elm-explorations/test": "2.1.2" - }, - "indirect": { - "elm/bytes": "1.0.8" - } - } } diff --git a/public/billiard-table.obj.txt b/public/billiard-table.obj.txt new file mode 100644 index 0000000..12a7a4f --- /dev/null +++ b/public/billiard-table.obj.txt @@ -0,0 +1,1985 @@ +# Blender 3.6.5 +# www.blender.org +o Table-CornerWall +v -1.260000 0.670000 0.029774 +v -1.219812 0.630188 0.029774 +v -1.260000 0.670000 -0.100000 +v -1.219812 0.630188 -0.100000 +v -1.180000 0.750000 0.029774 +v -1.140188 0.709812 0.029774 +v -1.180000 0.750000 -0.100000 +v -1.140188 0.709812 -0.100000 +vn -0.7038 -0.7104 -0.0000 +vn 0.7104 0.7038 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 1//1 3//1 4//1 2//1 +f 5//2 6//2 8//2 7//2 +f 2//3 4//3 8//3 6//3 +f 1//4 2//4 6//4 5//4 +f 3//5 1//5 5//5 7//5 +f 4//6 3//6 7//6 8//6 +o Table-FrontWall +v 1.260000 0.670000 0.000000 +v 1.160000 0.570000 0.000000 +v 1.260000 -0.670000 0.000000 +v 1.160000 -0.570000 0.000000 +v 1.260000 0.670000 -0.100000 +v 1.160000 0.570000 -0.100000 +v 1.260000 -0.670000 -0.100000 +v 1.160000 -0.570000 -0.100000 +v 1.160000 -0.570000 0.000000 +v 1.260000 -0.670000 0.000000 +v 1.160000 0.570000 0.000000 +v 1.260000 0.670000 0.000000 +v 1.260000 0.670000 -0.100000 +v 1.160000 0.570000 -0.100000 +v 1.260000 -0.670000 -0.100000 +v 1.160000 -0.570000 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 1.0000 -0.0000 -0.0000 +s 0 +f 12//7 11//7 9//7 10//7 +f 16//8 14//8 13//8 15//8 +f 10//9 14//9 16//9 12//9 +f 9//10 13//10 14//10 10//10 +f 12//11 16//11 15//11 11//11 +f 11//12 15//12 13//12 9//12 +f 17//7 18//7 20//7 19//7 +f 24//8 22//8 21//8 23//8 +f 19//9 22//9 24//9 17//9 +f 20//10 21//10 22//10 19//10 +f 17//11 24//11 23//11 18//11 +f 18//12 23//12 21//12 20//12 +o Table-MiddleWall +v -0.040082 0.700030 0.030000 +v -0.040073 0.750040 0.030000 +v -0.040082 0.700030 -0.100000 +v -0.040073 0.750040 -0.100000 +v 0.040005 0.750040 0.030000 +v 0.039995 0.700030 0.030000 +v 0.040005 0.750040 -0.100000 +v 0.039995 0.700030 -0.100000 +vn -1.0000 0.0002 -0.0000 +vn 1.0000 -0.0002 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 26//13 28//13 27//13 25//13 +f 29//14 30//14 32//14 31//14 +f 28//15 26//15 29//15 31//15 +f 26//16 25//16 30//16 29//16 +f 25//17 27//17 32//17 30//17 +f 27//18 28//18 31//18 32//18 +o Table-SideWall +v -0.055011 0.650000 0.000000 +v -0.040082 0.700030 0.000000 +v -1.081491 0.650000 0.000000 +v -1.180000 0.750068 0.000000 +v -0.040073 0.750040 0.000000 +v -1.081491 0.650000 0.000000 +v -1.180000 0.750068 0.000000 +v -0.055011 0.650000 0.000000 +v -0.040082 0.700030 0.000000 +v -0.040073 0.750040 0.000000 +v -1.081491 0.650000 -0.100000 +v -1.180000 0.750068 -0.100000 +v -0.055011 0.650000 -0.100000 +v -0.040082 0.700030 -0.100000 +v -0.040073 0.750040 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0002 -0.0000 +vn -0.7126 -0.7015 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.9582 -0.2859 -0.0000 +s 0 +f 36//19 35//19 33//19 34//19 37//19 +f 39//20 42//20 47//20 44//20 +f 37//19 34//19 41//19 42//19 +f 35//19 36//19 39//19 38//19 +f 33//19 35//19 38//19 40//19 +f 34//19 33//19 40//19 41//19 +f 36//19 37//19 42//19 39//19 +f 44//21 47//21 46//21 45//21 43//21 +f 42//22 41//22 46//22 47//22 +f 38//23 39//23 44//23 43//23 +f 40//24 38//24 43//24 45//24 +f 41//25 40//25 45//25 46//25 +o Table-MiddleWall.001 +v -0.040082 -0.700030 0.030000 +v -0.040073 -0.750040 0.030000 +v -0.040082 -0.700030 -0.100000 +v -0.040073 -0.750040 -0.100000 +v 0.040005 -0.750040 0.030000 +v 0.039995 -0.700030 0.030000 +v 0.040005 -0.750040 -0.100000 +v 0.039995 -0.700030 -0.100000 +vn -1.0000 -0.0002 -0.0000 +vn 1.0000 0.0002 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 49//26 48//26 50//26 51//26 +f 52//27 54//27 55//27 53//27 +f 51//28 54//28 52//28 49//28 +f 49//29 52//29 53//29 48//29 +f 48//30 53//30 55//30 50//30 +f 50//31 55//31 54//31 51//31 +o Table-CornerWall.001 +v 1.260000 0.670000 0.029774 +v 1.219812 0.630188 0.029774 +v 1.260000 0.670000 -0.100000 +v 1.219812 0.630188 -0.100000 +v 1.180000 0.750000 0.029774 +v 1.140188 0.709812 0.029774 +v 1.180000 0.750000 -0.100000 +v 1.140188 0.709812 -0.100000 +vn 0.7038 -0.7104 -0.0000 +vn -0.7104 0.7038 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 56//32 57//32 59//32 58//32 +f 60//33 62//33 63//33 61//33 +f 57//34 61//34 63//34 59//34 +f 56//35 60//35 61//35 57//35 +f 58//36 62//36 60//36 56//36 +f 59//37 63//37 62//37 58//37 +o Table-CornerWall.002 +v 1.260000 -0.670000 0.029774 +v 1.219812 -0.630188 0.029774 +v 1.260000 -0.670000 -0.100000 +v 1.219812 -0.630188 -0.100000 +v 1.180000 -0.750000 0.029774 +v 1.140188 -0.709812 0.029774 +v 1.180000 -0.750000 -0.100000 +v 1.140188 -0.709812 -0.100000 +vn 0.7038 0.7104 -0.0000 +vn -0.7104 -0.7038 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.7071 -0.7071 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 64//38 66//38 67//38 65//38 +f 68//39 69//39 71//39 70//39 +f 65//40 67//40 71//40 69//40 +f 64//41 65//41 69//41 68//41 +f 66//42 64//42 68//42 70//42 +f 67//43 66//43 70//43 71//43 +o Table-CornerWall.003 +v -1.260000 -0.670000 0.029774 +v -1.219812 -0.630188 0.029774 +v -1.260000 -0.670000 -0.100000 +v -1.219812 -0.630188 -0.100000 +v -1.180000 -0.750000 0.029774 +v -1.140188 -0.709812 0.029774 +v -1.180000 -0.750000 -0.100000 +v -1.140188 -0.709812 -0.100000 +vn -0.7038 0.7104 -0.0000 +vn 0.7104 -0.7038 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 72//44 73//44 75//44 74//44 +f 76//45 78//45 79//45 77//45 +f 73//46 77//46 79//46 75//46 +f 72//47 76//47 77//47 73//47 +f 74//48 78//48 76//48 72//48 +f 75//49 79//49 78//49 74//49 +o Table-SideWall.001 +v 0.055011 0.650000 0.000000 +v 0.040082 0.700030 0.000000 +v 1.081491 0.650000 0.000000 +v 1.180000 0.750068 0.000000 +v 0.040073 0.750040 0.000000 +v 1.081491 0.650000 0.000000 +v 1.180000 0.750068 0.000000 +v 0.055011 0.650000 0.000000 +v 0.040082 0.700030 0.000000 +v 0.040073 0.750040 0.000000 +v 1.081491 0.650000 -0.100000 +v 1.180000 0.750068 -0.100000 +v 0.055011 0.650000 -0.100000 +v 0.040082 0.700030 -0.100000 +v 0.040073 0.750040 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0002 -0.0000 +vn 0.7126 -0.7015 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.9582 -0.2859 -0.0000 +s 0 +f 83//50 84//50 81//50 80//50 82//50 +f 86//51 91//51 94//51 89//51 +f 84//50 89//50 88//50 81//50 +f 82//50 85//50 86//50 83//50 +f 80//50 87//50 85//50 82//50 +f 81//50 88//50 87//50 80//50 +f 83//50 86//50 89//50 84//50 +f 91//52 90//52 92//52 93//52 94//52 +f 89//53 94//53 93//53 88//53 +f 85//54 90//54 91//54 86//54 +f 87//55 92//55 90//55 85//55 +f 88//56 93//56 92//56 87//56 +o Table-SideWall.002 +v -0.055011 -0.650000 0.000000 +v -0.040082 -0.700030 0.000000 +v -1.081491 -0.650000 0.000000 +v -1.180000 -0.750068 0.000000 +v -0.040073 -0.750040 0.000000 +v -1.081491 -0.650000 0.000000 +v -1.180000 -0.750068 0.000000 +v -0.055011 -0.650000 0.000000 +v -0.040082 -0.700030 0.000000 +v -0.040073 -0.750040 0.000000 +v -1.081491 -0.650000 -0.100000 +v -1.180000 -0.750068 -0.100000 +v -0.055011 -0.650000 -0.100000 +v -0.040082 -0.700030 -0.100000 +v -0.040073 -0.750040 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 0.0002 -0.0000 +vn -0.7126 0.7015 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.9582 0.2859 -0.0000 +s 0 +f 98//57 99//57 96//57 95//57 97//57 +f 101//58 106//58 109//58 104//58 +f 99//57 104//57 103//57 96//57 +f 97//57 100//57 101//57 98//57 +f 95//57 102//57 100//57 97//57 +f 96//57 103//57 102//57 95//57 +f 98//57 101//57 104//57 99//57 +f 106//59 105//59 107//59 108//59 109//59 +f 104//60 109//60 108//60 103//60 +f 100//61 105//61 106//61 101//61 +f 102//62 107//62 105//62 100//62 +f 103//63 108//63 107//63 102//63 +o Table-SideWall.003 +v 0.055011 -0.650000 0.000000 +v 0.040082 -0.700030 0.000000 +v 1.081491 -0.650000 0.000000 +v 1.180000 -0.750068 0.000000 +v 0.040073 -0.750040 0.000000 +v 1.081491 -0.650000 0.000000 +v 1.180000 -0.750068 0.000000 +v 0.055011 -0.650000 0.000000 +v 0.040082 -0.700030 0.000000 +v 0.040073 -0.750040 0.000000 +v 1.081491 -0.650000 -0.100000 +v 1.180000 -0.750068 -0.100000 +v 0.055011 -0.650000 -0.100000 +v 0.040082 -0.700030 -0.100000 +v 0.040073 -0.750040 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 0.0002 -0.0000 +vn 0.7126 0.7015 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.9582 0.2859 -0.0000 +s 0 +f 113//64 112//64 110//64 111//64 114//64 +f 116//65 119//65 124//65 121//65 +f 114//64 111//64 118//64 119//64 +f 112//64 113//64 116//64 115//64 +f 110//64 112//64 115//64 117//64 +f 111//64 110//64 117//64 118//64 +f 113//64 114//64 119//64 116//64 +f 121//66 124//66 123//66 122//66 120//66 +f 119//67 118//67 123//67 124//67 +f 115//68 116//68 121//68 120//68 +f 117//69 115//69 120//69 122//69 +f 118//70 117//70 122//70 123//70 +o Table-SurfaceBit +v -1.110000 0.600000 0.000000 +v -1.110000 0.600000 -0.100212 +v -1.160000 0.570000 0.000000 +v -1.160000 0.570000 -0.100212 +v -1.110000 -0.600000 0.000000 +v -1.110000 -0.600000 -0.100212 +v -1.160000 -0.570000 0.000000 +v -1.160000 -0.570000 -0.100212 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.5145 -0.8575 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.5145 0.8575 -0.0000 +vn -1.0000 -0.0000 -0.0000 +s 0 +f 131//71 129//71 125//71 127//71 +f 125//72 129//72 130//72 126//72 +f 132//73 130//73 129//73 131//73 +f 126//74 130//74 132//74 128//74 +f 128//75 127//75 125//75 126//75 +f 128//76 132//76 131//76 127//76 +o Table-SurfaceBit.001 +v 1.110000 0.600000 0.000000 +v 1.110000 0.600000 -0.100212 +v 1.160000 0.570000 0.000000 +v 1.160000 0.570000 -0.100212 +v 1.110000 -0.600000 0.000000 +v 1.110000 -0.600000 -0.100212 +v 1.160000 -0.570000 0.000000 +v 1.160000 -0.570000 -0.100212 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.5145 -0.8575 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 0.5145 0.8575 -0.0000 +vn 1.0000 -0.0000 -0.0000 +s 0 +f 139//77 135//77 133//77 137//77 +f 133//78 134//78 138//78 137//78 +f 140//79 139//79 137//79 138//79 +f 134//80 136//80 140//80 138//80 +f 136//81 134//81 133//81 135//81 +f 136//82 135//82 139//82 140//82 +o Table-SurfaceHalf +v -0.055011 -0.650000 0.000000 +v -0.055011 -0.650000 -0.100212 +v 0.000000 -0.630000 -0.100212 +v 0.000000 -0.630000 0.000000 +v -1.080000 -0.650000 -0.100212 +v -1.080000 -0.650000 0.000000 +v -1.110000 -0.600000 -0.100212 +v -1.110000 -0.600000 0.000000 +v -0.055011 0.650000 0.000000 +v -0.055011 0.650000 -0.100212 +v 0.000000 0.630000 -0.100212 +v 0.000000 0.630000 0.000000 +v -1.080000 0.650000 -0.100212 +v -1.080000 0.650000 0.000000 +v -1.110000 0.600000 -0.100212 +v -1.110000 0.600000 0.000000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.8575 -0.5145 -0.0000 +vn 0.3417 -0.9398 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.8575 0.5145 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.3417 0.9398 -0.0000 +s 0 +f 145//83 147//83 155//83 153//83 150//83 151//83 143//83 142//83 +f 146//84 145//84 142//84 141//84 +f 147//85 145//85 146//85 148//85 +f 142//86 143//86 144//86 141//86 +f 144//87 152//87 149//87 154//87 156//87 148//87 146//87 141//87 +f 148//88 156//88 155//88 147//88 +f 153//89 154//89 149//89 150//89 +f 155//90 156//90 154//90 153//90 +f 152//91 144//91 143//91 151//91 +f 150//92 149//92 152//92 151//92 +o Table-SurfaceHalf.001 +v 0.055011 -0.650000 0.000000 +v 0.055011 -0.650000 -0.100212 +v 0.000000 -0.630000 -0.100212 +v 0.000000 -0.630000 0.000000 +v 1.080000 -0.650000 -0.100212 +v 1.080000 -0.650000 0.000000 +v 1.110000 -0.600000 -0.100212 +v 1.110000 -0.600000 0.000000 +v 0.055011 0.650000 0.000000 +v 0.055011 0.650000 -0.100212 +v 0.000000 0.630000 -0.100212 +v 0.000000 0.630000 0.000000 +v 1.080000 0.650000 -0.100212 +v 1.080000 0.650000 0.000000 +v 1.110000 0.600000 -0.100212 +v 1.110000 0.600000 0.000000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.8575 -0.5145 -0.0000 +vn -0.3417 -0.9398 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.8575 0.5145 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.3417 0.9398 -0.0000 +s 0 +f 161//93 158//93 159//93 167//93 166//93 169//93 171//93 163//93 +f 162//94 157//94 158//94 161//94 +f 163//95 164//95 162//95 161//95 +f 158//96 157//96 160//96 159//96 +f 160//97 157//97 162//97 164//97 172//97 170//97 165//97 168//97 +f 164//98 163//98 171//98 172//98 +f 169//99 166//99 165//99 170//99 +f 171//100 169//100 170//100 172//100 +f 168//101 167//101 159//101 160//101 +f 166//102 167//102 168//102 165//102 +o Table-FrontWall.001 +v -1.260000 0.670000 0.000000 +v -1.160000 0.570000 0.000000 +v -1.260000 -0.670000 0.000000 +v -1.160000 -0.570000 0.000000 +v -1.260000 0.670000 -0.100000 +v -1.160000 0.570000 -0.100000 +v -1.260000 -0.670000 -0.100000 +v -1.160000 -0.570000 -0.100000 +v -1.160000 -0.570000 0.000000 +v -1.260000 -0.670000 0.000000 +v -1.160000 0.570000 0.000000 +v -1.260000 0.670000 0.000000 +v -1.260000 0.670000 -0.100000 +v -1.160000 0.570000 -0.100000 +v -1.260000 -0.670000 -0.100000 +v -1.160000 -0.570000 -0.100000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn -1.0000 -0.0000 -0.0000 +s 0 +f 176//103 174//103 173//103 175//103 +f 180//104 179//104 177//104 178//104 +f 174//105 176//105 180//105 178//105 +f 173//106 174//106 178//106 177//106 +f 176//107 175//107 179//107 180//107 +f 175//108 173//108 177//108 179//108 +f 181//103 183//103 184//103 182//103 +f 188//104 187//104 185//104 186//104 +f 183//105 181//105 188//105 186//105 +f 184//106 183//106 186//106 185//106 +f 181//107 182//107 187//107 188//107 +f 182//108 184//108 185//108 187//108 +o Cushions-Front +v -1.260000 0.670000 0.000000 +v -1.160000 0.570000 0.000000 +v -1.260000 0.670000 0.030000 +v -1.160000 0.570000 0.030000 +v -1.130000 0.540000 0.021000 +v -1.130000 0.540000 0.024000 +v -1.260000 -0.670000 0.000000 +v -1.160000 -0.570000 0.000000 +v -1.260000 -0.670000 0.030000 +v -1.160000 -0.570000 0.030000 +v -1.130000 -0.540000 0.021000 +v -1.130000 -0.540000 0.024000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.1961 -0.0000 0.9806 +vn 1.0000 -0.0000 -0.0000 +vn 0.7071 0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn 0.5735 -0.0000 -0.8192 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 189//109 195//109 197//109 191//109 +f 198//110 192//110 191//110 197//110 +f 192//111 198//111 200//111 194//111 +f 199//112 193//112 194//112 200//112 +f 189//113 191//113 192//113 194//113 193//113 190//113 +f 195//114 196//114 199//114 200//114 198//114 197//114 +f 199//115 196//115 190//115 193//115 +f 190//116 196//116 195//116 189//116 +o Cushions-Side +v -0.040073 0.750040 0.000000 +v -0.055011 0.650000 0.000000 +v -0.040082 0.700030 0.000000 +v -1.081491 0.650000 0.000000 +v -1.180000 0.749932 0.030000 +v -1.180000 0.750068 0.000000 +v -0.040073 0.749912 0.030000 +v -1.081454 0.650000 0.030000 +v -0.054979 0.650000 0.030000 +v -0.040053 0.699940 0.030000 +v -0.055011 0.650000 0.000000 +v -0.040082 0.700030 0.000000 +v -0.066000 0.620000 0.021000 +v -0.066000 0.620000 0.024000 +v -1.050000 0.620004 0.021000 +v -1.050000 0.619996 0.024000 +v -1.081491 0.650000 0.000000 +v -1.180000 0.750068 0.000000 +v -0.040073 0.750040 0.000000 +vn 1.0000 0.0001 -0.0005 +vn -0.0000 -0.1961 0.9806 +vn -0.0000 1.0000 0.0044 +vn -0.7091 -0.7051 -0.0009 +vn -0.0000 -0.5735 -0.8192 +vn 0.9536 -0.3010 -0.0013 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0015 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 201//117 207//117 210//117 203//117 +f 214//118 209//118 208//118 216//118 +f 206//119 205//119 207//119 201//119 +f 204//120 215//120 216//120 208//120 205//120 206//120 +f 215//121 204//121 202//121 213//121 +f 203//122 210//122 209//122 214//122 213//122 202//122 +f 203//123 202//123 211//123 212//123 +f 214//124 216//124 215//124 213//124 +f 207//123 205//123 208//123 209//123 210//123 +f 218//125 219//125 212//125 211//125 217//125 +f 201//123 203//123 212//123 219//123 +f 204//123 206//123 218//123 217//123 +f 206//123 201//123 219//123 218//123 +f 202//123 204//123 217//123 211//123 +o Cushions-Front.001 +v 1.260000 0.670000 0.000000 +v 1.160000 0.570000 0.000000 +v 1.260000 0.670000 0.030000 +v 1.160000 0.570000 0.030000 +v 1.130000 0.540000 0.021000 +v 1.130000 0.540000 0.024000 +v 1.260000 -0.670000 0.000000 +v 1.160000 -0.570000 0.000000 +v 1.260000 -0.670000 0.030000 +v 1.160000 -0.570000 0.030000 +v 1.130000 -0.540000 0.021000 +v 1.130000 -0.540000 0.024000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.1961 -0.0000 0.9806 +vn -1.0000 -0.0000 -0.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn -0.5735 -0.0000 -0.8192 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 220//126 222//126 228//126 226//126 +f 229//127 228//127 222//127 223//127 +f 223//128 225//128 231//128 229//128 +f 230//129 231//129 225//129 224//129 +f 220//130 221//130 224//130 225//130 223//130 222//130 +f 226//131 228//131 229//131 231//131 230//131 227//131 +f 230//132 224//132 221//132 227//132 +f 221//133 220//133 226//133 227//133 +o Cushions-Side.001 +v 0.040073 0.750040 0.000000 +v 0.055011 0.650000 0.000000 +v 0.040082 0.700030 0.000000 +v 1.081491 0.650000 0.000000 +v 1.180000 0.749932 0.030000 +v 1.180000 0.750068 0.000000 +v 0.040073 0.749912 0.030000 +v 1.081454 0.650000 0.030000 +v 0.054979 0.650000 0.030000 +v 0.040053 0.699940 0.030000 +v 0.055011 0.650000 0.000000 +v 0.040082 0.700030 0.000000 +v 0.066000 0.620000 0.021000 +v 0.066000 0.620000 0.024000 +v 1.050000 0.620004 0.021000 +v 1.050000 0.619996 0.024000 +v 1.081491 0.650000 0.000000 +v 1.180000 0.750068 0.000000 +v 0.040073 0.750040 0.000000 +vn -1.0000 0.0001 -0.0005 +vn -0.0000 -0.1961 0.9806 +vn -0.0000 1.0000 0.0044 +vn 0.7091 -0.7051 -0.0009 +vn -0.0000 -0.5735 -0.8192 +vn -0.9536 -0.3010 -0.0013 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -1.0000 -0.0015 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 232//134 234//134 241//134 238//134 +f 245//135 247//135 239//135 240//135 +f 237//136 232//136 238//136 236//136 +f 235//137 237//137 236//137 239//137 247//137 246//137 +f 246//138 244//138 233//138 235//138 +f 234//139 233//139 244//139 245//139 240//139 241//139 +f 234//140 243//140 242//140 233//140 +f 245//141 244//141 246//141 247//141 +f 238//140 241//140 240//140 239//140 236//140 +f 249//142 248//142 242//142 243//142 250//142 +f 232//140 250//140 243//140 234//140 +f 235//140 248//140 249//140 237//140 +f 237//140 249//140 250//140 232//140 +f 233//140 242//140 248//140 235//140 +o Cushions-Side.002 +v 0.040073 -0.750040 0.000000 +v 0.055011 -0.650000 0.000000 +v 0.040082 -0.700030 0.000000 +v 1.081491 -0.650000 0.000000 +v 1.180000 -0.749932 0.030000 +v 1.180000 -0.750068 0.000000 +v 0.040073 -0.749912 0.030000 +v 1.081454 -0.650000 0.030000 +v 0.054979 -0.650000 0.030000 +v 0.040053 -0.699940 0.030000 +v 0.055011 -0.650000 0.000000 +v 0.040082 -0.700030 0.000000 +v 0.066000 -0.620000 0.021000 +v 0.066000 -0.620000 0.024000 +v 1.050000 -0.620004 0.021000 +v 1.050000 -0.619996 0.024000 +v 1.081491 -0.650000 0.000000 +v 1.180000 -0.750068 0.000000 +v 0.040073 -0.750040 0.000000 +vn -1.0000 -0.0001 -0.0005 +vn -0.0000 0.1961 0.9806 +vn -0.0000 -1.0000 0.0044 +vn 0.7091 0.7051 -0.0009 +vn -0.0000 0.5735 -0.8192 +vn -0.9536 0.3010 -0.0013 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0015 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 251//143 257//143 260//143 253//143 +f 264//144 259//144 258//144 266//144 +f 256//145 255//145 257//145 251//145 +f 254//146 265//146 266//146 258//146 255//146 256//146 +f 265//147 254//147 252//147 263//147 +f 253//148 260//148 259//148 264//148 263//148 252//148 +f 253//149 252//149 261//149 262//149 +f 264//150 266//150 265//150 263//150 +f 257//149 255//149 258//149 259//149 260//149 +f 268//151 269//151 262//151 261//151 267//151 +f 251//149 253//149 262//149 269//149 +f 254//149 256//149 268//149 267//149 +f 256//149 251//149 269//149 268//149 +f 252//149 254//149 267//149 261//149 +o Cushions-Side.003 +v -0.040073 -0.750040 0.000000 +v -0.055011 -0.650000 0.000000 +v -0.040082 -0.700030 0.000000 +v -1.081491 -0.650000 0.000000 +v -1.180000 -0.749932 0.030000 +v -1.180000 -0.750068 0.000000 +v -0.040073 -0.749912 0.030000 +v -1.081454 -0.650000 0.030000 +v -0.054979 -0.650000 0.030000 +v -0.040053 -0.699940 0.030000 +v -0.055011 -0.650000 0.000000 +v -0.040082 -0.700030 0.000000 +v -0.066000 -0.620000 0.021000 +v -0.066000 -0.620000 0.024000 +v -1.050000 -0.620004 0.021000 +v -1.050000 -0.619996 0.024000 +v -1.081491 -0.650000 0.000000 +v -1.180000 -0.750068 0.000000 +v -0.040073 -0.750040 0.000000 +vn 1.0000 -0.0001 -0.0005 +vn -0.0000 0.1961 0.9806 +vn -0.0000 -1.0000 0.0044 +vn -0.7091 0.7051 -0.0009 +vn -0.0000 0.5735 -0.8192 +vn 0.9536 0.3010 -0.0013 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0015 +vn -0.0000 -0.0000 -1.0000 +s 0 +f 270//152 272//152 279//152 276//152 +f 283//153 285//153 277//153 278//153 +f 275//154 270//154 276//154 274//154 +f 273//155 275//155 274//155 277//155 285//155 284//155 +f 284//156 282//156 271//156 273//156 +f 272//157 271//157 282//157 283//157 278//157 279//157 +f 272//158 281//158 280//158 271//158 +f 283//159 282//159 284//159 285//159 +f 276//158 279//158 278//158 277//158 274//158 +f 287//160 286//160 280//160 281//160 288//160 +f 270//158 288//158 281//158 272//158 +f 273//158 286//158 287//158 275//158 +f 275//158 287//158 288//158 270//158 +f 271//158 280//158 286//158 273//158 +o Pockets +v -1.220000 -0.710000 -0.130000 +v -1.220000 -0.710000 -0.100000 +v -1.220000 0.710000 -0.130000 +v -1.220000 0.710000 -0.100000 +v 1.220000 -0.710000 -0.130000 +v 1.220000 -0.710000 -0.100000 +v 1.220000 0.710000 -0.130000 +v 1.220000 0.710000 -0.100000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -0.0000 1.0000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.625000 0.500000 +vt 0.375000 0.500000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.125000 0.500000 +vt 0.125000 0.750000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +s 0 +f 289/1/161 290/2/161 292/3/161 291/4/161 +f 291/4/162 292/3/162 296/5/162 295/6/162 +f 295/6/163 296/5/163 294/7/163 293/8/163 +f 293/8/164 294/7/164 290/9/164 289/10/164 +f 291/11/165 295/6/165 293/8/165 289/12/165 +f 296/5/166 292/13/166 290/14/166 294/7/166 +o Billiard-Table +v -1.240011 -0.730043 0.000000 +v -1.240011 -0.730043 -0.100212 +v -1.260011 0.000000 -0.100212 +v -1.260011 0.000000 0.000000 +v -1.160000 0.000000 -0.100212 +v -1.160000 0.000000 0.000000 +v 0.000000 0.000000 -0.100212 +v -0.040073 -0.750040 0.000000 +v 0.000000 0.000000 0.000000 +v -0.040073 -0.750040 -0.100212 +v -0.055011 -0.650000 0.000000 +v -0.055011 -0.650000 -0.100212 +v -1.260011 -0.610042 0.000000 +v -1.260011 -0.610042 -0.100212 +v -1.160000 -0.570000 -0.100212 +v -1.160000 -0.570067 0.000000 +v 0.000000 -0.630000 -0.100212 +v 0.000000 -0.630000 0.000000 +v -1.260000 -0.680000 -0.100212 +v -1.260017 -0.680064 0.000000 +v -0.040082 -0.700030 0.000000 +v -0.040082 -0.700030 -0.100212 +v -1.107710 0.000000 -0.100212 +v -1.120011 -0.750040 0.000000 +v -1.080012 -0.650000 -0.100212 +v -1.107710 0.000000 0.000000 +v -1.120011 -0.750040 -0.100212 +v -1.080012 -0.650000 0.000000 +v -1.110000 -0.600000 -0.100212 +v -1.110000 -0.600000 0.000000 +v -1.120011 -0.689981 -0.100212 +v -1.120011 -0.690113 0.000000 +v -1.260012 -0.540013 0.000000 +v -1.190017 -0.750064 0.000000 +v -1.190000 -0.750000 -0.100212 +v -1.199995 0.000000 -0.100212 +v -1.200023 -0.610043 0.000000 +v -1.199988 -0.610043 -0.100212 +v -1.190000 -0.680000 -0.100212 +v -1.190000 -0.680000 0.000000 +v 0.000000 -0.750040 0.000000 +v 0.000000 -0.750040 -0.100212 +v 0.000000 -0.710030 -0.100212 +v 0.000000 -0.710030 0.000000 +v -1.199995 0.000000 0.030000 +v -1.160000 0.000000 0.030000 +v -1.189983 -0.749936 0.030000 +v -1.239978 -0.729914 0.030000 +v -1.119978 -0.749912 0.030000 +v -1.259978 -0.609920 0.030000 +v -1.259978 0.000000 0.030000 +v -1.259983 -0.679936 0.030000 +v 0.000000 -0.749912 0.030000 +v -0.040073 -0.749912 0.030000 +v -1.079975 -0.650000 0.030000 +v -0.054979 -0.650000 0.030000 +v -0.040053 -0.699940 0.030000 +v -1.160000 -0.569933 0.030000 +v -1.199988 -0.609914 0.030000 +v 0.000000 -0.709940 0.030000 +v -1.119976 -0.689981 0.030000 +v -1.190000 -0.680000 0.030000 +v -1.260011 -0.540013 -0.100212 +v -1.160000 -0.540013 -0.100212 +v -1.160000 -0.540013 0.000000 +v 0.000000 -0.540013 -0.100212 +v 0.000000 -0.540013 0.000000 +v -1.110000 -0.540013 0.000000 +v -1.110000 -0.540013 -0.100212 +v -1.199995 -0.540013 -0.100212 +v -1.259978 -0.540013 0.030000 +v -1.160000 -0.540013 0.030000 +v -1.199995 -0.540013 0.030000 +v -1.050000 0.000000 0.000000 +v -1.050000 -0.750069 -0.100212 +v -1.050000 -0.650000 0.000000 +v -1.050000 -0.599995 0.000000 +v -1.050000 0.000000 -0.100212 +v -1.050000 -0.750058 0.000000 +v -1.050000 -0.650000 -0.100212 +v -1.050000 -0.600006 -0.100212 +v -1.050000 -0.689981 -0.100212 +v -1.050000 -0.650000 0.030000 +v -1.050000 -0.689981 0.030000 +v -1.050000 -0.749921 0.030000 +v -1.050000 -0.540013 0.000000 +v -1.050000 -0.540013 -0.100212 +v -0.090000 0.000000 0.000000 +v -0.090000 -0.750040 -0.100212 +v -0.090000 -0.650000 0.000000 +v -0.090000 -0.600000 0.000000 +v -0.090000 -0.650000 0.030000 +v -0.090000 -0.689981 0.030000 +v -0.090000 -0.540013 0.000000 +v -0.090000 0.000000 -0.100212 +v -0.090000 -0.750039 0.000000 +v -0.090000 -0.650000 -0.100212 +v -0.090000 -0.600000 -0.100212 +v -0.090000 -0.689981 -0.100212 +v -0.090000 -0.749910 0.030000 +v -0.090000 -0.540013 -0.100212 +v -0.090000 -0.620004 0.021000 +v -0.066000 -0.620000 0.021000 +v -1.130017 -0.539895 0.021000 +v -0.090000 -0.619996 0.024000 +v -0.066000 -0.620000 0.024000 +v -1.129984 -0.539895 0.024000 +v -1.130017 0.000000 0.021000 +v -1.129983 0.000000 0.024000 +v -1.050000 -0.620004 0.021000 +v -1.050000 -0.619996 0.024000 +v 1.240011 -0.730043 0.000000 +v 1.240011 -0.730043 -0.100212 +v 1.260011 0.000000 -0.100212 +v 1.260011 0.000000 0.000000 +v 1.160000 0.000000 -0.100212 +v 1.160000 0.000000 0.000000 +v 0.000000 0.000000 -0.100212 +v 0.040073 -0.750040 0.000000 +v 0.000000 0.000000 0.000000 +v 0.040073 -0.750040 -0.100212 +v 0.055011 -0.650000 0.000000 +v 0.055011 -0.650000 -0.100212 +v 1.260011 -0.610042 0.000000 +v 1.260011 -0.610042 -0.100212 +v 1.160000 -0.570000 -0.100212 +v 1.160000 -0.570067 0.000000 +v 0.000000 -0.630000 -0.100212 +v 0.000000 -0.630000 0.000000 +v 1.260000 -0.680000 -0.100212 +v 1.260017 -0.680064 0.000000 +v 0.040082 -0.700030 0.000000 +v 0.040082 -0.700030 -0.100212 +v 1.107710 0.000000 -0.100212 +v 1.120011 -0.750040 0.000000 +v 1.080012 -0.650000 -0.100212 +v 1.107710 0.000000 0.000000 +v 1.120011 -0.750040 -0.100212 +v 1.080012 -0.650000 0.000000 +v 1.110000 -0.600000 -0.100212 +v 1.110000 -0.600000 0.000000 +v 1.120011 -0.689981 -0.100212 +v 1.120011 -0.690113 0.000000 +v 1.260012 -0.540013 0.000000 +v 1.190017 -0.750064 0.000000 +v 1.190000 -0.750000 -0.100212 +v 1.199995 0.000000 -0.100212 +v 1.200023 -0.610043 0.000000 +v 1.199988 -0.610043 -0.100212 +v 1.190000 -0.680000 -0.100212 +v 1.190000 -0.680000 0.000000 +v 0.000000 -0.750040 0.000000 +v 0.000000 -0.750040 -0.100212 +v 0.000000 -0.710030 -0.100212 +v 0.000000 -0.710030 0.000000 +v 1.199995 0.000000 0.030000 +v 1.160000 0.000000 0.030000 +v 1.189983 -0.749936 0.030000 +v 1.239978 -0.729914 0.030000 +v 1.119978 -0.749912 0.030000 +v 1.259978 -0.609920 0.030000 +v 1.259978 0.000000 0.030000 +v 1.259983 -0.679936 0.030000 +v 0.000000 -0.749912 0.030000 +v 0.040073 -0.749912 0.030000 +v 1.079975 -0.650000 0.030000 +v 0.054979 -0.650000 0.030000 +v 0.040053 -0.699940 0.030000 +v 1.160000 -0.569933 0.030000 +v 1.199988 -0.609914 0.030000 +v 0.000000 -0.709940 0.030000 +v 1.119976 -0.689981 0.030000 +v 1.190000 -0.680000 0.030000 +v 1.260011 -0.540013 -0.100212 +v 1.160000 -0.540013 -0.100212 +v 1.160000 -0.540013 0.000000 +v 0.000000 -0.540013 -0.100212 +v 0.000000 -0.540013 0.000000 +v 1.110000 -0.540013 0.000000 +v 1.110000 -0.540013 -0.100212 +v 1.199995 -0.540013 -0.100212 +v 1.259978 -0.540013 0.030000 +v 1.160000 -0.540013 0.030000 +v 1.199995 -0.540013 0.030000 +v 1.050000 0.000000 0.000000 +v 1.050000 -0.750069 -0.100212 +v 1.050000 -0.650000 0.000000 +v 1.050000 -0.599995 0.000000 +v 1.050000 0.000000 -0.100212 +v 1.050000 -0.750058 0.000000 +v 1.050000 -0.650000 -0.100212 +v 1.050000 -0.600006 -0.100212 +v 1.050000 -0.689981 -0.100212 +v 1.050000 -0.650000 0.030000 +v 1.050000 -0.689981 0.030000 +v 1.050000 -0.749921 0.030000 +v 1.050000 -0.540013 0.000000 +v 1.050000 -0.540013 -0.100212 +v 0.090000 0.000000 0.000000 +v 0.090000 -0.750040 -0.100212 +v 0.090000 -0.650000 0.000000 +v 0.090000 -0.600000 0.000000 +v 0.090000 -0.650000 0.030000 +v 0.090000 -0.689981 0.030000 +v 0.090000 -0.540013 0.000000 +v 0.090000 0.000000 -0.100212 +v 0.090000 -0.750039 0.000000 +v 0.090000 -0.650000 -0.100212 +v 0.090000 -0.600000 -0.100212 +v 0.090000 -0.689981 -0.100212 +v 0.090000 -0.749910 0.030000 +v 0.090000 -0.540013 -0.100212 +v 0.090000 -0.620004 0.021000 +v 0.066000 -0.620000 0.021000 +v 1.130017 -0.539895 0.021000 +v 0.090000 -0.619996 0.024000 +v 0.066000 -0.620000 0.024000 +v 1.129984 -0.539895 0.024000 +v 1.130017 0.000000 0.021000 +v 1.129983 0.000000 0.024000 +v 1.050000 -0.620004 0.021000 +v 1.050000 -0.619996 0.024000 +v -1.240011 0.730043 0.000000 +v -1.240011 0.730043 -0.100212 +v -1.260011 0.000000 -0.100212 +v -1.260011 0.000000 0.000000 +v -1.160000 0.000000 -0.100212 +v -1.160000 0.000000 0.000000 +v 0.000000 0.000000 -0.100212 +v -0.040073 0.750040 0.000000 +v 0.000000 0.000000 0.000000 +v -0.040073 0.750040 -0.100212 +v -0.055011 0.650000 0.000000 +v -0.055011 0.650000 -0.100212 +v -1.260011 0.610042 0.000000 +v -1.260011 0.610042 -0.100212 +v -1.160000 0.570000 -0.100212 +v -1.160000 0.570067 0.000000 +v 0.000000 0.630000 -0.100212 +v 0.000000 0.630000 0.000000 +v -1.260000 0.680000 -0.100212 +v -1.260017 0.680064 0.000000 +v -0.040082 0.700030 0.000000 +v -0.040082 0.700030 -0.100212 +v -1.107710 0.000000 -0.100212 +v -1.120011 0.750040 0.000000 +v -1.080012 0.650000 -0.100212 +v -1.107710 0.000000 0.000000 +v -1.120011 0.750040 -0.100212 +v -1.080012 0.650000 0.000000 +v -1.110000 0.600000 -0.100212 +v -1.110000 0.600000 0.000000 +v -1.120011 0.689981 -0.100212 +v -1.120011 0.690113 0.000000 +v -1.260012 0.540013 0.000000 +v -1.190017 0.750064 0.000000 +v -1.190000 0.750000 -0.100212 +v -1.199995 0.000000 -0.100212 +v -1.200023 0.610043 0.000000 +v -1.199988 0.610043 -0.100212 +v -1.190000 0.680000 -0.100212 +v -1.190000 0.680000 0.000000 +v 0.000000 0.750040 0.000000 +v 0.000000 0.750040 -0.100212 +v 0.000000 0.710030 -0.100212 +v 0.000000 0.710030 0.000000 +v -1.199995 0.000000 0.030000 +v -1.160000 0.000000 0.030000 +v -1.189983 0.749936 0.030000 +v -1.239978 0.729914 0.030000 +v -1.119978 0.749912 0.030000 +v -1.259978 0.609920 0.030000 +v -1.259978 0.000000 0.030000 +v -1.259983 0.679936 0.030000 +v 0.000000 0.749912 0.030000 +v -0.040073 0.749912 0.030000 +v -1.079975 0.650000 0.030000 +v -0.054979 0.650000 0.030000 +v -0.040053 0.699940 0.030000 +v -1.160000 0.569933 0.030000 +v -1.199988 0.609914 0.030000 +v 0.000000 0.709940 0.030000 +v -1.119976 0.689981 0.030000 +v -1.190000 0.680000 0.030000 +v -1.260011 0.540013 -0.100212 +v -1.160000 0.540013 -0.100212 +v -1.160000 0.540013 0.000000 +v 0.000000 0.540013 -0.100212 +v 0.000000 0.540013 0.000000 +v -1.110000 0.540013 0.000000 +v -1.110000 0.540013 -0.100212 +v -1.199995 0.540013 -0.100212 +v -1.259978 0.540013 0.030000 +v -1.160000 0.540013 0.030000 +v -1.199995 0.540013 0.030000 +v -1.050000 0.000000 0.000000 +v -1.050000 0.750069 -0.100212 +v -1.050000 0.650000 0.000000 +v -1.050000 0.599995 0.000000 +v -1.050000 0.000000 -0.100212 +v -1.050000 0.750058 0.000000 +v -1.050000 0.650000 -0.100212 +v -1.050000 0.600006 -0.100212 +v -1.050000 0.689981 -0.100212 +v -1.050000 0.650000 0.030000 +v -1.050000 0.689981 0.030000 +v -1.050000 0.749921 0.030000 +v -1.050000 0.540013 0.000000 +v -1.050000 0.540013 -0.100212 +v -0.090000 0.000000 0.000000 +v -0.090000 0.750040 -0.100212 +v -0.090000 0.650000 0.000000 +v -0.090000 0.600000 0.000000 +v -0.090000 0.650000 0.030000 +v -0.090000 0.689981 0.030000 +v -0.090000 0.540013 0.000000 +v -0.090000 0.000000 -0.100212 +v -0.090000 0.750039 0.000000 +v -0.090000 0.650000 -0.100212 +v -0.090000 0.600000 -0.100212 +v -0.090000 0.689981 -0.100212 +v -0.090000 0.749910 0.030000 +v -0.090000 0.540013 -0.100212 +v -0.090000 0.620004 0.021000 +v -0.066000 0.620000 0.021000 +v -1.130017 0.539895 0.021000 +v -0.090000 0.619996 0.024000 +v -0.066000 0.620000 0.024000 +v -1.129984 0.539895 0.024000 +v -1.130017 0.000000 0.021000 +v -1.129983 0.000000 0.024000 +v -1.050000 0.620004 0.021000 +v -1.050000 0.619996 0.024000 +v 1.240011 0.730043 0.000000 +v 1.240011 0.730043 -0.100212 +v 1.260011 0.000000 -0.100212 +v 1.260011 0.000000 0.000000 +v 1.160000 0.000000 -0.100212 +v 1.160000 0.000000 0.000000 +v 0.000000 0.000000 -0.100212 +v 0.040073 0.750040 0.000000 +v 0.000000 0.000000 0.000000 +v 0.040073 0.750040 -0.100212 +v 0.055011 0.650000 0.000000 +v 0.055011 0.650000 -0.100212 +v 1.260011 0.610042 0.000000 +v 1.260011 0.610042 -0.100212 +v 1.160000 0.570000 -0.100212 +v 1.160000 0.570067 0.000000 +v 0.000000 0.630000 -0.100212 +v 0.000000 0.630000 0.000000 +v 1.260000 0.680000 -0.100212 +v 1.260017 0.680064 0.000000 +v 0.040082 0.700030 0.000000 +v 0.040082 0.700030 -0.100212 +v 1.107710 0.000000 -0.100212 +v 1.120011 0.750040 0.000000 +v 1.080012 0.650000 -0.100212 +v 1.107710 0.000000 0.000000 +v 1.120011 0.750040 -0.100212 +v 1.080012 0.650000 0.000000 +v 1.110000 0.600000 -0.100212 +v 1.110000 0.600000 0.000000 +v 1.120011 0.689981 -0.100212 +v 1.120011 0.690113 0.000000 +v 1.260012 0.540013 0.000000 +v 1.190017 0.750064 0.000000 +v 1.190000 0.750000 -0.100212 +v 1.199995 0.000000 -0.100212 +v 1.200023 0.610043 0.000000 +v 1.199988 0.610043 -0.100212 +v 1.190000 0.680000 -0.100212 +v 1.190000 0.680000 0.000000 +v 0.000000 0.750040 0.000000 +v 0.000000 0.750040 -0.100212 +v 0.000000 0.710030 -0.100212 +v 0.000000 0.710030 0.000000 +v 1.199995 0.000000 0.030000 +v 1.160000 0.000000 0.030000 +v 1.189983 0.749936 0.030000 +v 1.239978 0.729914 0.030000 +v 1.119978 0.749912 0.030000 +v 1.259978 0.609920 0.030000 +v 1.259978 0.000000 0.030000 +v 1.259983 0.679936 0.030000 +v 0.000000 0.749912 0.030000 +v 0.040073 0.749912 0.030000 +v 1.079975 0.650000 0.030000 +v 0.054979 0.650000 0.030000 +v 0.040053 0.699940 0.030000 +v 1.160000 0.569933 0.030000 +v 1.199988 0.609914 0.030000 +v 0.000000 0.709940 0.030000 +v 1.119976 0.689981 0.030000 +v 1.190000 0.680000 0.030000 +v 1.260011 0.540013 -0.100212 +v 1.160000 0.540013 -0.100212 +v 1.160000 0.540013 0.000000 +v 0.000000 0.540013 -0.100212 +v 0.000000 0.540013 0.000000 +v 1.110000 0.540013 0.000000 +v 1.110000 0.540013 -0.100212 +v 1.199995 0.540013 -0.100212 +v 1.259978 0.540013 0.030000 +v 1.160000 0.540013 0.030000 +v 1.199995 0.540013 0.030000 +v 1.050000 0.000000 0.000000 +v 1.050000 0.750069 -0.100212 +v 1.050000 0.650000 0.000000 +v 1.050000 0.599995 0.000000 +v 1.050000 0.000000 -0.100212 +v 1.050000 0.750058 0.000000 +v 1.050000 0.650000 -0.100212 +v 1.050000 0.600006 -0.100212 +v 1.050000 0.689981 -0.100212 +v 1.050000 0.650000 0.030000 +v 1.050000 0.689981 0.030000 +v 1.050000 0.749921 0.030000 +v 1.050000 0.540013 0.000000 +v 1.050000 0.540013 -0.100212 +v 0.090000 0.000000 0.000000 +v 0.090000 0.750040 -0.100212 +v 0.090000 0.650000 0.000000 +v 0.090000 0.600000 0.000000 +v 0.090000 0.650000 0.030000 +v 0.090000 0.689981 0.030000 +v 0.090000 0.540013 0.000000 +v 0.090000 0.000000 -0.100212 +v 0.090000 0.750039 0.000000 +v 0.090000 0.650000 -0.100212 +v 0.090000 0.600000 -0.100212 +v 0.090000 0.689981 -0.100212 +v 0.090000 0.749910 0.030000 +v 0.090000 0.540013 -0.100212 +v 0.090000 0.620004 0.021000 +v 0.066000 0.620000 0.021000 +v 1.130017 0.539895 0.021000 +v 0.090000 0.619996 0.024000 +v 0.066000 0.620000 0.024000 +v 1.129984 0.539895 0.024000 +v 1.130017 0.000000 0.021000 +v 1.129983 0.000000 0.024000 +v 1.050000 0.620004 0.021000 +v 1.050000 0.619996 0.024000 +vn 0.7069 -0.7073 0.0027 +vn -0.3712 -0.9286 -0.0003 +vn 0.2421 0.9702 -0.0030 +vn -1.0000 -0.0000 -0.0000 +vn 0.0003 -1.0000 0.0043 +vn 0.9582 0.2861 -0.0014 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.1421 0.9899 -0.0023 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 0.0011 +vn -0.9285 -0.3713 -0.0002 +vn 0.1421 0.9899 0.0007 +vn -0.7075 0.7067 -0.0007 +vn -0.0003 -1.0000 0.0001 +vn -0.9284 -0.3716 0.0026 +vn -0.0001 -1.0000 -0.0003 +vn -0.0000 -1.0000 0.0043 +vn -0.8576 -0.5143 -0.0000 +vn -0.7075 0.7067 0.0005 +vn 0.9899 0.1415 -0.0009 +vn 0.7071 -0.7071 -0.0001 +vn -0.5141 -0.8577 -0.0003 +vn 0.2421 0.9703 -0.0000 +vn 0.9582 0.2859 -0.0000 +vn 0.3417 -0.9398 -0.0000 +vn -1.0000 0.0001 0.0011 +vn -1.0000 -0.0000 -0.0001 +vn 0.9899 0.1416 0.0002 +vn -0.3718 -0.9283 0.0044 +vn -0.0000 0.1961 0.9806 +vn -0.0000 0.5735 -0.8192 +vn -0.0002 -1.0000 0.0044 +vn -0.0000 -1.0000 0.0001 +vn -0.0000 -1.0000 0.0044 +vn 0.9999 -0.0000 -0.0111 +vn 0.5737 -0.0000 -0.8191 +vn -0.0000 1.0000 -0.0030 +vn -0.0000 1.0000 -0.0015 +vn 0.1960 -0.0000 0.9806 +vn 0.7081 -0.7061 0.0022 +vn -0.7073 0.7070 0.0006 +vn 0.9387 0.3446 -0.0009 +vn -0.7069 -0.7073 0.0027 +vn 0.3712 -0.9286 -0.0003 +vn -0.2421 0.9702 -0.0030 +vn 1.0000 -0.0000 -0.0000 +vn -0.0003 -1.0000 0.0043 +vn -0.9582 0.2861 -0.0014 +vn -0.1421 0.9899 -0.0023 +vn 1.0000 -0.0000 0.0011 +vn 0.9285 -0.3713 -0.0002 +vn -0.1421 0.9899 0.0007 +vn 0.7075 0.7067 -0.0007 +vn 0.0003 -1.0000 0.0001 +vn 0.9284 -0.3716 0.0026 +vn 0.0001 -1.0000 -0.0003 +vn 0.8576 -0.5143 -0.0000 +vn 0.7075 0.7067 0.0005 +vn -0.9899 0.1415 -0.0009 +vn -0.7071 -0.7071 -0.0001 +vn 0.5141 -0.8577 -0.0003 +vn -0.2421 0.9703 -0.0000 +vn -0.9582 0.2859 -0.0000 +vn -0.3417 -0.9398 -0.0000 +vn 1.0000 0.0001 0.0011 +vn 1.0000 -0.0000 -0.0001 +vn -0.9899 0.1416 0.0002 +vn 0.3718 -0.9283 0.0044 +vn 0.0002 -1.0000 0.0044 +vn -0.9999 -0.0000 -0.0111 +vn -0.5737 -0.0000 -0.8191 +vn -0.1960 -0.0000 0.9806 +vn -0.7081 -0.7061 0.0022 +vn 0.7073 0.7070 0.0006 +vn -0.9388 0.3446 -0.0009 +vn 0.7069 0.7073 0.0027 +vn -0.3712 0.9286 -0.0003 +vn 0.2421 -0.9702 -0.0030 +vn 0.0003 1.0000 0.0043 +vn 0.9582 -0.2861 -0.0014 +vn -0.0000 1.0000 -0.0000 +vn 0.1421 -0.9899 -0.0023 +vn -0.9285 0.3713 -0.0002 +vn 0.1421 -0.9899 0.0007 +vn -0.7075 -0.7067 -0.0007 +vn -0.0003 1.0000 0.0001 +vn -0.9284 0.3716 0.0026 +vn -0.0001 1.0000 -0.0003 +vn -0.0000 1.0000 0.0043 +vn -0.8576 0.5143 -0.0000 +vn -0.7075 -0.7067 0.0005 +vn 0.9899 -0.1415 -0.0009 +vn 0.7071 0.7071 -0.0001 +vn -0.5141 0.8577 -0.0003 +vn 0.2421 -0.9703 -0.0000 +vn 0.9582 -0.2859 -0.0000 +vn 0.3417 0.9398 -0.0000 +vn -1.0000 -0.0001 0.0011 +vn 0.9899 -0.1416 0.0002 +vn -0.3718 0.9283 0.0044 +vn -0.0000 -0.1961 0.9806 +vn -0.0000 -0.5735 -0.8192 +vn -0.0002 1.0000 0.0044 +vn -0.0000 1.0000 0.0001 +vn -0.0000 1.0000 0.0044 +vn -0.0000 -1.0000 -0.0030 +vn -0.0000 -1.0000 -0.0015 +vn 0.7081 0.7061 0.0022 +vn -0.7073 -0.7070 0.0006 +vn 0.9387 -0.3446 -0.0009 +vn -0.7069 0.7073 0.0027 +vn 0.3712 0.9286 -0.0003 +vn -0.2421 -0.9702 -0.0030 +vn -0.0003 1.0000 0.0043 +vn -0.9582 -0.2861 -0.0014 +vn -0.1421 -0.9899 -0.0023 +vn 0.9285 0.3713 -0.0002 +vn -0.1421 -0.9899 0.0007 +vn 0.7075 -0.7067 -0.0007 +vn 0.0003 1.0000 0.0001 +vn 0.9284 0.3716 0.0026 +vn 0.0001 1.0000 -0.0003 +vn 0.8576 0.5143 -0.0000 +vn 0.7075 -0.7067 0.0005 +vn -0.9899 -0.1415 -0.0009 +vn -0.7071 0.7071 -0.0001 +vn 0.5141 0.8577 -0.0003 +vn -0.2421 -0.9703 -0.0000 +vn -0.9582 -0.2859 -0.0000 +vn -0.3417 0.9398 -0.0000 +vn 1.0000 -0.0001 0.0011 +vn -0.9899 -0.1416 0.0002 +vn 0.3718 0.9283 0.0044 +vn 0.0002 1.0000 0.0044 +vn -0.7081 0.7061 0.0022 +vn 0.7073 -0.7070 0.0006 +vn -0.9388 -0.3446 -0.0009 +vt 0.184664 0.930683 +vt 0.187499 0.937642 +vt 0.187507 0.937640 +vt 0.187507 0.937640 +vt 0.187499 0.937642 +vt 0.196759 0.928727 +vt 0.060802 0.686380 +vt 0.060757 0.686375 +vt 0.060798 0.686380 +vt 0.060804 0.686380 +vt 0.184855 0.938013 +vt 0.184854 0.938013 +vt 0.184704 0.938013 +vt 0.211775 0.932131 +vt 0.176003 0.913859 +vt 0.176967 0.913859 +vt 0.176967 0.921156 +vt 0.176003 0.921156 +vt 0.184375 0.936342 +vt 0.184373 0.936332 +vt 0.184375 0.936341 +vt 0.176003 0.927303 +vt 0.176967 0.927303 +vt 0.176967 0.939124 +vt 0.176003 0.939124 +vt 0.176003 0.907272 +vt 0.176967 0.907272 +vt 0.184338 0.932375 +vt 0.197123 0.912405 +vt 0.215013 0.912405 +vt 0.215013 0.915587 +vt 0.197123 0.915587 +vt 0.187579 0.308760 +vt 0.187729 0.307257 +vt 0.187997 0.308057 +vt 0.188662 0.308847 +vt 0.185735 0.953124 +vt 0.185735 0.953125 +vt 0.184930 0.933074 +vt 0.184945 0.933139 +vt 0.184933 0.933086 +vt 0.184945 0.933137 +vt 0.066618 0.061066 +vt 0.185170 0.310227 +vt 0.184077 0.309827 +vt 0.184624 0.310056 +vt 0.183794 0.309653 +vt 0.215583 0.912405 +vt 0.215583 0.915587 +vt 0.187194 0.310284 +vt 0.187302 0.310195 +vt 0.187666 0.310005 +vt 0.187472 0.310072 +vt 0.193296 0.930647 +vt 0.188805 0.936117 +vt 0.188820 0.936132 +vt 0.188830 0.936141 +vt 0.174762 0.912405 +vt 0.174762 0.915587 +vt 0.190001 0.929170 +vt 0.189987 0.929172 +vt 0.195511 0.939851 +vt 0.195570 0.939847 +vt 0.195510 0.939851 +vt 0.195510 0.939851 +vt 0.209455 0.921503 +vt 0.209455 0.912924 +vt 0.190856 0.927303 +vt 0.190856 0.939124 +vt 0.055804 0.060024 +vt 0.057488 0.058346 +vt 0.186201 0.936342 +vt 0.186183 0.936250 +vt 0.186183 0.936250 +vt 0.186201 0.936342 +vt 0.186437 0.932583 +vt 0.186480 0.932592 +vt 0.060625 0.054661 +vt 0.058625 0.062067 +vt 0.057812 0.058037 +vt 0.061325 0.057801 +vt 0.059462 0.051997 +vt 0.159309 0.967081 +vt 0.187789 0.927081 +vt 0.186388 0.927081 +vt 0.172681 0.972960 +vt 0.186655 0.927081 +vt 0.186971 0.927081 +vt 0.188060 0.937538 +vt 0.188033 0.938268 +vt 0.184530 0.934340 +vt 0.184807 0.933708 +vt 0.184252 0.934560 +vt 0.184008 0.934760 +vt 0.184774 0.933807 +vt 0.189839 0.935177 +vt 0.189839 0.935177 +vt 0.189839 0.935177 +vt 0.182696 0.934341 +vt 0.182717 0.934341 +vt 0.181806 0.934348 +vt 0.182638 0.934341 +vt 0.177038 0.934216 +vt 0.177003 0.934314 +vt 0.177023 0.934181 +vt 0.177017 0.934331 +vt 0.178245 0.928866 +vt 0.178074 0.928777 +vt 0.179694 0.928830 +vt 0.178578 0.928872 +vt 0.052102 0.056567 +vt 0.052540 0.057270 +vt 0.209455 0.922099 +vt 0.187334 0.932667 +vt 0.187375 0.932490 +vt 0.188013 0.311807 +vt 0.188013 0.311805 +vt 0.159309 0.970905 +vt 0.197123 0.922081 +vt 0.184630 0.931410 +vt 0.184744 0.931431 +vt 0.184687 0.931430 +vt 0.184734 0.931437 +vt 0.186359 0.311555 +vt 0.186365 0.311550 +vt 0.065644 0.667150 +vt 0.072432 0.667150 +vt 0.072432 0.684222 +vt 0.065644 0.684222 +vt 0.059462 0.686434 +vt 0.059779 0.686140 +vt 0.060236 0.686334 +vt 0.058974 0.686497 +vt 0.016125 0.687554 +vt 0.024610 0.687554 +vt 0.024610 0.704626 +vt 0.016125 0.704626 +vt 0.031398 0.687554 +vt 0.031615 0.687554 +vt 0.031615 0.704626 +vt 0.031398 0.704626 +vt 0.185709 0.313606 +vt 0.185760 0.313599 +vt 0.185824 0.313601 +vt 0.185803 0.313600 +vt 0.059477 0.679918 +vt 0.059477 0.680322 +vt 0.192701 0.311571 +vt 0.192701 0.311571 +vt 0.192698 0.311571 +vt 0.192699 0.311571 +vt 0.036313 0.687554 +vt 0.036489 0.687554 +vt 0.036489 0.704626 +vt 0.036313 0.704626 +vt 0.191678 0.939853 +vt 0.191665 0.939854 +vt 0.191665 0.939854 +vt 0.191677 0.939853 +vt 0.031791 0.687554 +vt 0.031791 0.704626 +vt 0.189867 0.307816 +vt 0.189868 0.307942 +vt 0.189867 0.307821 +vt 0.189867 0.307817 +vt 0.188644 0.926860 +vt 0.187209 0.926988 +vt 0.187208 0.926988 +vt 0.055416 0.688623 +vt 0.055416 0.688622 +vt 0.055415 0.688624 +vt 0.055416 0.688622 +vt 0.061329 0.678940 +vt 0.061329 0.678940 +vt 0.061329 0.678940 +vt 0.051564 0.718556 +vt 0.097383 0.718556 +vt 0.097383 0.723077 +vt 0.051564 0.723077 +vt 0.188035 0.309450 +vt 0.188035 0.309449 +vt 0.188035 0.309449 +vt 0.188035 0.309449 +vt 0.186818 0.308632 +vt 0.186897 0.308674 +vt 0.186817 0.308631 +vt 0.186801 0.308623 +vt 0.215583 0.919111 +vt 0.216047 0.919111 +vt 0.216047 0.922081 +vt 0.215583 0.922081 +vt 0.216047 0.912405 +vt 0.216047 0.915587 +vt 0.216047 0.927790 +vt 0.215583 0.927790 +vt 0.186126 0.310781 +vt 0.186126 0.310781 +vt 0.186126 0.310781 +vt 0.186126 0.310781 +vt 0.188024 0.308133 +vt 0.188024 0.308134 +vt 0.188030 0.308102 +vt 0.188030 0.308100 +vt 0.189885 0.934301 +vt 0.189881 0.934310 +vt 0.189884 0.934302 +vt 0.187917 0.931428 +vt 0.187917 0.931429 +vt 0.187918 0.931436 +vt 0.187918 0.931436 +vt 0.186273 0.928620 +vt 0.186270 0.928624 +vt 0.186268 0.928628 +vt 0.186277 0.928614 +vt 0.187043 0.306337 +vt 0.187044 0.306337 +vt 0.051774 0.684177 +vt 0.051716 0.683702 +vt 0.051697 0.684012 +vt 0.052630 0.685325 +vt 0.031791 0.707171 +vt 0.036313 0.707171 +vt 0.036313 0.708297 +vt 0.031791 0.708297 +vt 0.036313 0.705833 +vt 0.031791 0.705833 +vt 0.036313 0.710464 +vt 0.031791 0.710464 +vt 0.188222 0.313836 +vt 0.188405 0.314042 +vt 0.188022 0.315128 +vt 0.188022 0.315131 +vt 0.207392 0.318085 +vt 0.207392 0.280512 +vt 0.183962 0.308890 +vt 0.186237 0.308844 +vt 0.186236 0.308840 +vt 0.190176 0.311495 +vt 0.190175 0.311495 +vt 0.189839 0.306437 +vt 0.189839 0.306437 +vt 0.188033 0.310573 +vt 0.188033 0.310568 +vt 0.187362 0.309929 +vt 0.187361 0.309929 +vt 0.188032 0.311595 +vt 0.188028 0.311177 +vt 0.187468 0.306253 +vt 0.187812 0.306251 +vt 0.186114 0.310921 +vt 0.184374 0.308038 +vt 0.184330 0.307984 +vt 0.193601 0.309819 +vt 0.184136 0.937759 +vt 0.184136 0.937759 +s 0 +f 333/15/167 312/15/167 354/15/167 355/15/167 +f 331/16/168 330/17/168 297/18/168 298/19/168 +f 340/20/169 317/20/169 353/20/169 356/20/169 +f 359/21/170 329/22/170 300/23/170 299/24/170 +f 330/25/171 320/26/171 345/26/171 343/27/171 +f 317/28/172 307/28/172 352/28/172 353/28/172 +f 394/29/173 313/30/173 308/31/173 393/32/173 +f 338/33/174 337/34/174 304/35/174 306/33/174 +f 395/36/173 318/37/173 306/38/173 385/39/173 +f 397/40/173 362/41/173 313/30/173 394/29/173 +f 358/42/175 357/42/175 328/42/175 336/42/175 +f 366/43/173 360/44/173 311/45/173 334/46/173 +f 364/47/176 361/48/176 312/49/176 326/50/176 +f 393/32/173 308/31/173 318/37/173 395/36/173 +f 329/51/177 309/52/177 346/52/177 367/51/177 +f 298/53/178 297/54/178 316/55/178 315/56/178 +f 327/57/179 335/57/179 336/57/179 328/57/179 +f 382/58/176 364/59/176 326/60/176 373/61/176 +f 360/44/173 365/62/173 325/63/173 311/45/173 +f 373/64/176 326/65/176 324/66/176 372/67/176 +f 324/68/180 328/68/180 357/68/180 351/68/180 +f 371/69/181 375/70/181 320/71/181 323/69/181 +f 359/72/173 366/43/173 334/46/173 310/73/173 +f 316/74/182 297/75/182 344/75/182 348/74/182 +f 323/76/183 320/77/183 330/78/183 331/79/183 +f 304/80/184 337/81/184 349/81/184 350/80/184 +f 318/37/173 339/82/173 338/83/173 306/38/173 +f 325/84/185 321/84/185 324/84/185 326/84/185 +f 321/85/186 327/85/186 328/85/186 324/85/186 +f 355/86/176 346/87/176 348/88/176 358/89/176 +f 336/90/187 333/91/187 355/91/187 358/90/187 +f 334/92/188 311/92/188 312/92/188 333/92/188 +f 311/93/189 325/93/189 326/93/189 312/93/189 +f 339/94/190 318/94/190 317/94/190 340/94/190 +f 318/95/191 308/95/191 307/95/191 317/95/191 +f 308/96/192 313/96/192 314/96/192 307/96/192 +f 315/97/173 335/98/173 331/99/173 298/100/173 +f 331/99/173 335/98/173 327/101/173 323/102/173 +f 309/103/193 316/104/193 348/104/193 346/103/193 +f 356/105/176 353/105/176 350/105/176 349/105/176 +f 369/106/176 367/107/176 346/108/176 355/109/176 +f 310/110/194 315/111/194 316/111/194 309/112/194 +f 379/113/176 351/114/176 357/115/176 380/116/176 +f 380/117/176 357/118/176 345/119/176 381/120/176 +f 368/121/176 369/122/176 355/123/176 354/124/176 +f 336/125/195 335/126/195 334/125/195 333/125/195 +f 392/127/184 304/80/184 350/80/184 396/127/184 +f 297/128/196 330/129/196 343/129/196 344/128/196 +f 388/130/197 352/131/197 402/130/197 401/130/197 +f 310/132/173 334/46/173 335/133/173 315/97/173 +f 343/134/176 345/135/176 357/136/176 358/137/176 +f 372/138/198 324/139/198 406/138/198 +f 342/140/176 341/141/176 369/142/176 368/143/176 +f 341/144/176 347/145/176 367/146/176 369/147/176 +f 299/148/173 332/149/173 366/150/173 359/151/173 +f 301/152/173 319/153/173 365/154/173 360/155/173 +f 370/156/176 322/157/176 364/158/176 382/159/176 +f 300/160/177 329/161/177 367/161/177 347/160/177 +f 322/162/176 302/163/176 361/164/176 364/165/176 +f 332/149/173 301/152/173 360/155/173 366/150/173 +f 391/166/173 303/167/173 362/168/173 397/169/173 +f 310/170/170 309/171/170 329/172/170 359/173/170 +f 319/153/173 374/174/173 383/175/173 365/154/173 +f 384/176/176 370/177/176 382/178/176 390/179/176 +f 320/180/199 375/181/199 381/182/199 345/180/199 +f 389/183/176 380/184/176 381/185/176 396/186/176 +f 388/187/176 379/188/176 380/189/176 389/188/176 +f 385/190/200 392/191/200 375/192/200 371/193/200 +f 387/194/176 373/195/176 372/196/176 386/197/176 +f 390/198/176 382/199/176 373/200/176 387/201/176 +f 321/202/173 376/203/173 378/204/173 327/205/173 +f 365/62/173 383/206/173 377/207/173 325/63/173 +f 327/205/173 378/204/173 371/208/173 323/209/173 +f 325/63/173 377/207/173 376/203/173 321/202/173 +f 363/210/176 390/211/176 387/212/176 314/213/176 +f 314/214/176 387/215/176 386/216/176 307/217/176 +f 306/218/174 304/219/174 392/220/174 385/218/174 +f 352/221/176 388/222/176 389/223/176 353/224/176 +f 353/225/176 389/226/176 396/227/176 350/228/176 +f 305/229/176 384/229/176 390/229/176 363/230/176 +f 374/231/173 391/232/173 397/233/173 383/234/173 +f 375/192/201 392/191/201 396/191/201 381/192/201 +f 376/235/173 393/236/173 395/237/173 378/238/173 +f 383/175/173 397/169/173 394/239/173 377/240/173 +f 378/238/173 395/237/173 385/241/173 371/242/173 +f 377/240/173 394/239/173 393/236/173 376/235/173 +f 307/243/198 386/244/198 398/244/198 399/243/198 +f 351/245/197 379/246/197 407/245/197 +f 400/247/202 404/248/202 405/248/202 403/247/202 +f 312/249/203 361/249/203 400/249/203 +f 398/250/204 406/251/204 407/251/204 401/250/204 +f 399/252/205 398/253/205 401/253/205 402/252/205 +f 386/254/198 372/255/198 406/255/198 398/254/198 +f 368/256/206 354/257/206 403/256/206 +f 354/258/207 312/258/207 400/259/207 403/258/207 +f 379/260/197 388/261/197 401/261/197 407/260/197 +f 361/262/203 302/263/203 404/263/203 400/262/203 +f 351/264/208 407/264/208 406/264/208 324/264/208 +f 342/265/206 368/266/206 403/266/206 405/265/206 +f 352/267/209 307/267/209 399/267/209 402/267/209 +f 344/268/176 343/269/176 358/269/176 348/269/176 +f 444/15/210 466/15/210 465/15/210 423/15/210 +f 442/16/211 409/19/211 408/18/211 441/17/211 +f 451/20/212 467/20/212 464/20/212 428/20/212 +f 470/21/213 410/24/213 411/23/213 440/22/213 +f 441/25/214 454/27/214 456/26/214 431/26/214 +f 428/28/215 464/28/215 463/28/215 418/28/215 +f 505/29/173 504/32/173 419/31/173 424/30/173 +f 449/33/174 417/33/174 415/35/174 448/34/174 +f 506/36/173 496/39/173 417/38/173 429/37/173 +f 508/40/173 505/29/173 424/30/173 473/41/173 +f 469/42/216 447/42/216 439/42/216 468/42/216 +f 477/43/173 445/46/173 422/45/173 471/44/173 +f 475/47/176 437/50/176 423/49/176 472/48/176 +f 504/32/173 506/36/173 429/37/173 419/31/173 +f 440/51/217 478/51/217 457/52/217 420/52/217 +f 409/53/218 426/56/218 427/55/218 408/54/218 +f 438/57/219 439/57/219 447/57/219 446/57/219 +f 493/58/176 484/61/176 437/60/176 475/59/176 +f 471/44/173 422/45/173 436/63/173 476/62/173 +f 484/64/176 483/67/176 435/66/176 437/65/176 +f 435/68/220 462/68/220 468/68/220 439/68/220 +f 482/69/221 434/69/221 431/71/221 486/70/221 +f 470/72/173 421/73/173 445/46/173 477/43/173 +f 427/74/222 459/74/222 455/75/222 408/75/222 +f 434/76/223 442/79/223 441/78/223 431/77/223 +f 415/80/184 461/80/184 460/81/184 448/81/184 +f 429/37/173 417/38/173 449/83/173 450/82/173 +f 436/84/224 437/84/224 435/84/224 432/84/224 +f 432/85/225 435/85/225 439/85/225 438/85/225 +f 466/86/176 469/89/176 459/88/176 457/87/176 +f 447/90/226 469/90/226 466/91/226 444/91/226 +f 445/92/227 444/92/227 423/92/227 422/92/227 +f 422/93/228 423/93/228 437/93/228 436/93/228 +f 450/94/229 451/94/229 428/94/229 429/94/229 +f 429/95/230 428/95/230 418/95/230 419/95/230 +f 419/96/231 418/96/231 425/96/231 424/96/231 +f 426/97/173 409/100/173 442/99/173 446/98/173 +f 442/99/173 434/102/173 438/101/173 446/98/173 +f 420/103/232 457/103/232 459/104/232 427/104/232 +f 467/105/176 460/105/176 461/105/176 464/105/176 +f 480/106/176 466/109/176 457/108/176 478/107/176 +f 421/110/233 420/112/233 427/111/233 426/111/233 +f 490/113/176 491/116/176 468/115/176 462/114/176 +f 491/117/176 492/120/176 456/119/176 468/118/176 +f 479/121/176 465/124/176 466/123/176 480/122/176 +f 447/125/234 444/125/234 445/125/234 446/126/234 +f 503/127/184 507/127/184 461/80/184 415/80/184 +f 408/128/235 455/128/235 454/129/235 441/129/235 +f 499/130/197 512/130/197 513/130/197 463/131/197 +f 421/132/173 426/97/173 446/133/173 445/46/173 +f 454/134/176 469/137/176 468/136/176 456/135/176 +f 483/138/198 517/138/198 435/139/198 +f 453/140/176 479/143/176 480/142/176 452/141/176 +f 452/144/176 480/147/176 478/146/176 458/145/176 +f 410/148/173 470/151/173 477/150/173 443/149/173 +f 412/152/173 471/155/173 476/154/173 430/153/173 +f 481/156/176 493/159/176 475/158/176 433/157/176 +f 411/160/217 458/160/217 478/161/217 440/161/217 +f 433/162/176 475/165/176 472/164/176 413/163/176 +f 443/149/173 477/150/173 471/155/173 412/152/173 +f 502/166/173 508/169/173 473/168/173 414/167/173 +f 421/170/213 470/173/213 440/172/213 420/171/213 +f 430/153/173 476/154/173 494/175/173 485/174/173 +f 495/176/176 501/179/176 493/178/176 481/177/176 +f 431/180/236 456/180/236 492/182/236 486/181/236 +f 500/183/176 507/186/176 492/185/176 491/184/176 +f 499/187/176 500/188/176 491/189/176 490/188/176 +f 496/190/200 482/193/200 486/192/200 503/191/200 +f 498/194/176 497/197/176 483/196/176 484/195/176 +f 501/198/176 498/201/176 484/200/176 493/199/176 +f 432/202/173 438/205/173 489/204/173 487/203/173 +f 476/62/173 436/63/173 488/207/173 494/206/173 +f 438/205/173 434/209/173 482/208/173 489/204/173 +f 436/63/173 432/202/173 487/203/173 488/207/173 +f 474/210/176 425/213/176 498/212/176 501/211/176 +f 425/214/176 418/217/176 497/216/176 498/215/176 +f 417/218/174 496/218/174 503/220/174 415/219/174 +f 463/221/176 464/224/176 500/223/176 499/222/176 +f 464/225/176 461/228/176 507/227/176 500/226/176 +f 416/229/176 474/230/176 501/229/176 495/229/176 +f 485/231/173 494/234/173 508/233/173 502/232/173 +f 486/192/201 492/192/201 507/191/201 503/191/201 +f 487/235/173 489/238/173 506/237/173 504/236/173 +f 494/175/173 488/240/173 505/239/173 508/169/173 +f 489/238/173 482/242/173 496/241/173 506/237/173 +f 488/240/173 487/235/173 504/236/173 505/239/173 +f 418/243/198 510/243/198 509/244/198 497/244/198 +f 462/245/197 518/245/197 490/246/197 +f 511/247/237 514/247/237 516/248/237 515/248/237 +f 423/249/238 511/249/238 472/249/238 +f 509/250/204 512/250/204 518/251/204 517/251/204 +f 510/252/205 513/252/205 512/253/205 509/253/205 +f 497/254/198 509/254/198 517/255/198 483/255/198 +f 479/256/239 514/256/239 465/257/239 +f 465/258/240 514/258/240 511/259/240 423/258/240 +f 490/260/197 518/260/197 512/261/197 499/261/197 +f 472/262/238 511/262/238 515/263/238 413/263/238 +f 462/264/241 435/264/241 517/264/241 518/264/241 +f 453/265/239 516/265/239 514/266/239 479/266/239 +f 463/267/242 513/267/242 510/267/242 418/267/242 +f 455/268/176 459/269/176 469/269/176 454/269/176 +f 555/15/243 577/15/243 576/15/243 534/15/243 +f 553/16/244 520/19/244 519/18/244 552/17/244 +f 562/20/245 578/20/245 575/20/245 539/20/245 +f 581/21/170 521/24/170 522/23/170 551/22/170 +f 552/25/246 565/27/246 567/26/246 542/26/246 +f 539/28/247 575/28/247 574/28/247 529/28/247 +f 616/29/173 615/32/173 530/31/173 535/30/173 +f 560/33/248 528/33/248 526/35/248 559/34/248 +f 617/36/173 607/39/173 528/38/173 540/37/173 +f 619/40/173 616/29/173 535/30/173 584/41/173 +f 580/42/249 558/42/249 550/42/249 579/42/249 +f 588/43/173 556/46/173 533/45/173 582/44/173 +f 586/47/176 548/50/176 534/49/176 583/48/176 +f 615/32/173 617/36/173 540/37/173 530/31/173 +f 551/51/177 589/51/177 568/52/177 531/52/177 +f 520/53/250 537/56/250 538/55/250 519/54/250 +f 549/57/251 550/57/251 558/57/251 557/57/251 +f 604/58/176 595/61/176 548/60/176 586/59/176 +f 582/44/173 533/45/173 547/63/173 587/62/173 +f 595/64/176 594/67/176 546/66/176 548/65/176 +f 546/68/252 573/68/252 579/68/252 550/68/252 +f 593/69/253 545/69/253 542/71/253 597/70/253 +f 581/72/173 532/73/173 556/46/173 588/43/173 +f 538/74/254 570/74/254 566/75/254 519/75/254 +f 545/76/255 553/79/255 552/78/255 542/77/255 +f 526/80/256 572/80/256 571/81/256 559/81/256 +f 540/37/173 528/38/173 560/83/173 561/82/173 +f 547/84/257 548/84/257 546/84/257 543/84/257 +f 543/85/258 546/85/258 550/85/258 549/85/258 +f 577/86/176 580/89/176 570/88/176 568/87/176 +f 558/90/259 580/90/259 577/91/259 555/91/259 +f 556/92/260 555/92/260 534/92/260 533/92/260 +f 533/93/261 534/93/261 548/93/261 547/93/261 +f 561/94/262 562/94/262 539/94/262 540/94/262 +f 540/95/263 539/95/263 529/95/263 530/95/263 +f 530/96/264 529/96/264 536/96/264 535/96/264 +f 537/97/173 520/100/173 553/99/173 557/98/173 +f 553/99/173 545/102/173 549/101/173 557/98/173 +f 531/103/265 568/103/265 570/104/265 538/104/265 +f 578/105/176 571/105/176 572/105/176 575/105/176 +f 591/106/176 577/109/176 568/108/176 589/107/176 +f 532/110/194 531/112/194 538/111/194 537/111/194 +f 601/113/176 602/116/176 579/115/176 573/114/176 +f 602/117/176 603/120/176 567/119/176 579/118/176 +f 590/121/176 576/124/176 577/123/176 591/122/176 +f 558/125/266 555/125/266 556/125/266 557/126/266 +f 614/127/256 618/127/256 572/80/256 526/80/256 +f 519/128/267 566/128/267 565/129/267 552/129/267 +f 610/130/268 623/130/268 624/130/268 574/131/268 +f 532/132/173 537/97/173 557/133/173 556/46/173 +f 565/134/176 580/137/176 579/136/176 567/135/176 +f 594/138/269 628/138/269 546/139/269 +f 564/140/176 590/143/176 591/142/176 563/141/176 +f 563/144/176 591/147/176 589/146/176 569/145/176 +f 521/148/173 581/151/173 588/150/173 554/149/173 +f 523/152/173 582/155/173 587/154/173 541/153/173 +f 592/156/176 604/159/176 586/158/176 544/157/176 +f 522/160/177 569/160/177 589/161/177 551/161/177 +f 544/162/176 586/165/176 583/164/176 524/163/176 +f 554/149/173 588/150/173 582/155/173 523/152/173 +f 613/166/173 619/169/173 584/168/173 525/167/173 +f 532/170/170 581/173/170 551/172/170 531/171/170 +f 541/153/173 587/154/173 605/175/173 596/174/173 +f 606/176/176 612/179/176 604/178/176 592/177/176 +f 542/180/270 567/180/270 603/182/270 597/181/270 +f 611/183/176 618/186/176 603/185/176 602/184/176 +f 610/187/176 611/188/176 602/189/176 601/188/176 +f 607/190/271 593/193/271 597/192/271 614/191/271 +f 609/194/176 608/197/176 594/196/176 595/195/176 +f 612/198/176 609/201/176 595/200/176 604/199/176 +f 543/202/173 549/205/173 600/204/173 598/203/173 +f 587/62/173 547/63/173 599/207/173 605/206/173 +f 549/205/173 545/209/173 593/208/173 600/204/173 +f 547/63/173 543/202/173 598/203/173 599/207/173 +f 585/210/176 536/213/176 609/212/176 612/211/176 +f 536/214/176 529/217/176 608/216/176 609/215/176 +f 528/218/248 607/218/248 614/220/248 526/219/248 +f 574/221/176 575/224/176 611/223/176 610/222/176 +f 575/225/176 572/228/176 618/227/176 611/226/176 +f 527/229/176 585/230/176 612/229/176 606/229/176 +f 596/231/173 605/234/173 619/233/173 613/232/173 +f 597/192/272 603/192/272 618/191/272 614/191/272 +f 598/235/173 600/238/173 617/237/173 615/236/173 +f 605/175/173 599/240/173 616/239/173 619/169/173 +f 600/238/173 593/242/173 607/241/173 617/237/173 +f 599/240/173 598/235/173 615/236/173 616/239/173 +f 529/243/269 621/243/269 620/244/269 608/244/269 +f 573/245/268 629/245/268 601/246/268 +f 622/247/202 625/247/202 627/248/202 626/248/202 +f 534/249/203 622/249/203 583/249/203 +f 620/250/273 623/250/273 629/251/273 628/251/273 +f 621/252/274 624/252/274 623/253/274 620/253/274 +f 608/254/269 620/254/269 628/255/269 594/255/269 +f 590/256/206 625/256/206 576/257/206 +f 576/258/275 625/258/275 622/259/275 534/258/275 +f 601/260/268 629/260/268 623/261/268 610/261/268 +f 583/262/203 622/262/203 626/263/203 524/263/203 +f 573/264/276 546/264/276 628/264/276 629/264/276 +f 564/265/206 627/265/206 625/266/206 590/266/206 +f 574/267/277 624/267/277 621/267/277 529/267/277 +f 566/268/176 570/269/176 580/269/176 565/269/176 +f 666/15/278 645/15/278 687/15/278 688/15/278 +f 664/16/279 663/17/279 630/18/279 631/19/279 +f 673/20/280 650/20/280 686/20/280 689/20/280 +f 692/21/213 662/22/213 633/23/213 632/24/213 +f 663/25/281 653/26/281 678/26/281 676/27/281 +f 650/28/282 640/28/282 685/28/282 686/28/282 +f 727/29/173 646/30/173 641/31/173 726/32/173 +f 671/33/248 670/34/248 637/35/248 639/33/248 +f 728/36/173 651/37/173 639/38/173 718/39/173 +f 730/40/173 695/41/173 646/30/173 727/29/173 +f 691/42/283 690/42/283 661/42/283 669/42/283 +f 699/43/173 693/44/173 644/45/173 667/46/173 +f 697/47/176 694/48/176 645/49/176 659/50/176 +f 726/32/173 641/31/173 651/37/173 728/36/173 +f 662/51/217 642/52/217 679/52/217 700/51/217 +f 631/53/284 630/54/284 649/55/284 648/56/284 +f 660/57/285 668/57/285 669/57/285 661/57/285 +f 715/58/176 697/59/176 659/60/176 706/61/176 +f 693/44/173 698/62/173 658/63/173 644/45/173 +f 706/64/176 659/65/176 657/66/176 705/67/176 +f 657/68/286 661/68/286 690/68/286 684/68/286 +f 704/69/287 708/70/287 653/71/287 656/69/287 +f 692/72/173 699/43/173 667/46/173 643/73/173 +f 649/74/288 630/75/288 677/75/288 681/74/288 +f 656/76/289 653/77/289 663/78/289 664/79/289 +f 637/80/256 670/81/256 682/81/256 683/80/256 +f 651/37/173 672/82/173 671/83/173 639/38/173 +f 658/84/290 654/84/290 657/84/290 659/84/290 +f 654/85/291 660/85/291 661/85/291 657/85/291 +f 688/86/176 679/87/176 681/88/176 691/89/176 +f 669/90/292 666/91/292 688/91/292 691/90/292 +f 667/92/293 644/92/293 645/92/293 666/92/293 +f 644/93/294 658/93/294 659/93/294 645/93/294 +f 672/94/295 651/94/295 650/94/295 673/94/295 +f 651/95/296 641/95/296 640/95/296 650/95/296 +f 641/96/297 646/96/297 647/96/297 640/96/297 +f 648/97/173 668/98/173 664/99/173 631/100/173 +f 664/99/173 668/98/173 660/101/173 656/102/173 +f 642/103/298 649/104/298 681/104/298 679/103/298 +f 689/105/176 686/105/176 683/105/176 682/105/176 +f 702/106/176 700/107/176 679/108/176 688/109/176 +f 643/110/233 648/111/233 649/111/233 642/112/233 +f 712/113/176 684/114/176 690/115/176 713/116/176 +f 713/117/176 690/118/176 678/119/176 714/120/176 +f 701/121/176 702/122/176 688/123/176 687/124/176 +f 669/125/299 668/126/299 667/125/299 666/125/299 +f 725/127/256 637/80/256 683/80/256 729/127/256 +f 630/128/300 663/129/300 676/129/300 677/128/300 +f 721/130/268 685/131/268 735/130/268 734/130/268 +f 643/132/173 667/46/173 668/133/173 648/97/173 +f 676/134/176 678/135/176 690/136/176 691/137/176 +f 705/138/269 657/139/269 739/138/269 +f 675/140/176 674/141/176 702/142/176 701/143/176 +f 674/144/176 680/145/176 700/146/176 702/147/176 +f 632/148/173 665/149/173 699/150/173 692/151/173 +f 634/152/173 652/153/173 698/154/173 693/155/173 +f 703/156/176 655/157/176 697/158/176 715/159/176 +f 633/160/217 662/161/217 700/161/217 680/160/217 +f 655/162/176 635/163/176 694/164/176 697/165/176 +f 665/149/173 634/152/173 693/155/173 699/150/173 +f 724/166/173 636/167/173 695/168/173 730/169/173 +f 643/170/213 642/171/213 662/172/213 692/173/213 +f 652/153/173 707/174/173 716/175/173 698/154/173 +f 717/176/176 703/177/176 715/178/176 723/179/176 +f 653/180/301 708/181/301 714/182/301 678/180/301 +f 722/183/176 713/184/176 714/185/176 729/186/176 +f 721/187/176 712/188/176 713/189/176 722/188/176 +f 718/190/271 725/191/271 708/192/271 704/193/271 +f 720/194/176 706/195/176 705/196/176 719/197/176 +f 723/198/176 715/199/176 706/200/176 720/201/176 +f 654/202/173 709/203/173 711/204/173 660/205/173 +f 698/62/173 716/206/173 710/207/173 658/63/173 +f 660/205/173 711/204/173 704/208/173 656/209/173 +f 658/63/173 710/207/173 709/203/173 654/202/173 +f 696/210/176 723/211/176 720/212/176 647/213/176 +f 647/214/176 720/215/176 719/216/176 640/217/176 +f 639/218/248 637/219/248 725/220/248 718/218/248 +f 685/221/176 721/222/176 722/223/176 686/224/176 +f 686/225/176 722/226/176 729/227/176 683/228/176 +f 638/229/176 717/229/176 723/229/176 696/230/176 +f 707/231/173 724/232/173 730/233/173 716/234/173 +f 708/192/272 725/191/272 729/191/272 714/192/272 +f 709/235/173 726/236/173 728/237/173 711/238/173 +f 716/175/173 730/169/173 727/239/173 710/240/173 +f 711/238/173 728/237/173 718/241/173 704/242/173 +f 710/240/173 727/239/173 726/236/173 709/235/173 +f 640/243/269 719/244/269 731/244/269 732/243/269 +f 684/245/268 712/246/268 740/245/268 +f 733/247/237 737/248/237 738/248/237 736/247/237 +f 645/249/238 694/249/238 733/249/238 +f 731/250/273 739/251/273 740/251/273 734/250/273 +f 732/252/274 731/253/274 734/253/274 735/252/274 +f 719/254/269 705/255/269 739/255/269 731/254/269 +f 701/256/239 687/257/239 736/256/239 +f 687/258/302 645/258/302 733/259/302 736/258/302 +f 712/260/268 721/261/268 734/261/268 740/260/268 +f 694/262/238 635/263/238 737/263/238 733/262/238 +f 684/264/303 740/264/303 739/264/303 657/264/303 +f 675/265/239 701/266/239 736/266/239 738/265/239 +f 685/267/304 640/267/304 732/267/304 735/267/304 +f 677/268/176 676/269/176 691/269/176 681/269/176 diff --git a/public/img/billiard-table.png b/public/img/billiard-table.png new file mode 100644 index 0000000..bf7fa1d Binary files /dev/null and b/public/img/billiard-table.png differ diff --git a/src/Bodies.elm b/src/Bodies.elm index e2fa31a..968d284 100644 --- a/src/Bodies.elm +++ b/src/Bodies.elm @@ -18,7 +18,6 @@ module Bodies exposing import Acceleration import Angle import Axis3d exposing (Axis3d) -import Block3d exposing (Block3d) import Camera3d exposing (Camera3d) import Color exposing (Color) import Cylinder3d @@ -30,7 +29,6 @@ import Mass import Physics.Body as Body exposing (Body) import Physics.Coordinates exposing (BodyCoordinates, WorldCoordinates) import Physics.Material exposing (Material) -import Physics.Shape import Physics.World as World exposing (World) import Point2d import Point3d @@ -41,6 +39,7 @@ import Scene3d exposing (Entity) import Scene3d.Material as Material import SketchPlane3d import Sphere3d exposing (Sphere3d) +import Table exposing (Table) import Vector3d import Viewpoint3d @@ -50,39 +49,43 @@ type Id | Numbered Ball | CueBall | Table - | Walls + | Cushion + | Pocket areaBallInHand : Rectangle3d Meters WorldCoordinates areaBallInHand = - Rectangle3d.on - SketchPlane3d.xy + let + xOffset = + Quantity.half tableLength |> Quantity.minus ballRadius + + yOffset = + Quantity.half tableWidth |> Quantity.minus ballRadius + in + Rectangle3d.on SketchPlane3d.xy (Rectangle2d.from - (Point2d.meters - -(sizes.halfWidth - sizes.wallThickness - sizes.ballRadius) - -(sizes.halfLength - sizes.wallThickness - sizes.ballRadius) - ) - (Point2d.meters - (sizes.halfWidth - sizes.wallThickness - sizes.ballRadius) - (sizes.halfLength - sizes.wallThickness - sizes.ballRadius) - ) + (Point2d.xy (Quantity.negate xOffset) (Quantity.negate yOffset)) + (Point2d.xy xOffset yOffset) ) |> Rectangle3d.translateIn Direction3d.z (Length.millimeters 1) areaBehindTheHeadString : Rectangle3d Meters WorldCoordinates areaBehindTheHeadString = - Rectangle3d.on - SketchPlane3d.xy + let + yOffset = + Quantity.half tableWidth |> Quantity.minus ballRadius + + xMin = + Quantity.half tableLength |> Quantity.minus ballRadius |> Quantity.negate + + xMax = + Quantity.half (Quantity.half tableLength) |> Quantity.negate + in + Rectangle3d.on SketchPlane3d.xy (Rectangle2d.from - (Point2d.meters - -(sizes.halfWidth - sizes.wallThickness - sizes.ballRadius) - -(sizes.halfLength - sizes.wallThickness - sizes.ballRadius) - ) - (Point2d.meters - (sizes.halfWidth - sizes.wallThickness - sizes.ballRadius) - -((sizes.halfLength - sizes.wallThickness) / 2) - ) + (Point2d.xy xMin (Quantity.negate yOffset)) + (Point2d.xy xMax yOffset) ) |> Rectangle3d.translateIn Direction3d.z (Length.millimeters 1) @@ -93,7 +96,7 @@ areaBehindTheHeadStringEntity = [ v1, v2, v3, v4 ] -> Scene3d.quad (Material.nonmetal - { baseColor = Color.rgb255 30 100 20 + { baseColor = Color.rgb255 131 146 34 , roughness = 1 } ) @@ -165,14 +168,31 @@ cueEntity camera3d axis isActive = Scene3d.nothing -world : World Id -world = +world : Table -> World Id +world table = World.empty |> World.withGravity (Acceleration.metersPerSecondSquared 9.80665) Direction3d.negativeZ - |> World.add tableSurface - |> World.add tableWalls + |> World.add + (Body.compound table.table Table + |> Body.withMaterial + (Physics.Material.custom + { friction = 0.8 + , bounciness = 0 + } + ) + ) + |> World.add + (Body.compound table.cushions Cushion + |> Body.withMaterial + (Physics.Material.custom + { friction = 0.1 + , bounciness = 0.8 + } + ) + ) + |> World.add (Body.compound table.pockets Pocket) |> World.add floor |> (\w -> List.foldl World.add w balls) @@ -182,6 +202,16 @@ ballRadius = Length.millimeters (57.15 / 2) +tableLength : Length +tableLength = + Length.meters 2.26 + + +tableWidth : Length +tableWidth = + Length.meters 1.24 + + cueLength : Length cueLength = Length.centimeters 150 @@ -231,10 +261,11 @@ balls = Length.inMillimeters ballRadius * sqrt 3 x = - (toFloat index - toFloat rowStartIndex - toFloat row / 2) * Length.inMillimeters ballRadius * 2 + Length.millimeters ((toFloat row - lastRow / 2) * distance) + |> Quantity.plus (Quantity.half (Quantity.half tableLength)) y = - (toFloat row - lastRow / 2) * distance + Length.millimeters ((toFloat index - toFloat rowStartIndex - toFloat row / 2) * Length.inMillimeters ballRadius * 2) in Body.sphere ballSphere (EightBall.numberedBall number @@ -244,13 +275,13 @@ balls = |> Body.withMaterial ballMaterial |> Body.withDamping ballDamping |> Body.withBehavior (Body.dynamic (Mass.grams 170)) - |> Body.translateBy (Vector3d.millimeters x (y + 2100 / 4) (Length.inMillimeters ballRadius)) + |> Body.translateBy (Vector3d.xyz x y ballRadius) ) numbers -bodyToEntity : Material.Texture Float -> Dict Int (Material.Texture Color) -> Body Id -> Entity WorldCoordinates -bodyToEntity roughnessTexture ballTextures body = +bodyToEntity : Material.Texture Float -> Dict Int (Material.Texture Color) -> Table -> Body Id -> Entity WorldCoordinates +bodyToEntity roughnessTexture ballTextures table body = let id = Body.data body @@ -298,28 +329,12 @@ bodyToEntity roughnessTexture ballTextures body = ballSphere Table -> - tableBlocks - |> List.map - (Scene3d.blockWithShadow - (Material.nonmetal - { baseColor = Color.rgb255 10 80 0 - , roughness = 1 - } - ) - ) - |> Scene3d.group - - Walls -> - wallsBlocks - |> List.map - (Scene3d.blockWithShadow - (Material.nonmetal - { baseColor = Color.rgb255 10 80 0 - , roughness = 0.9 - } - ) - ) - |> Scene3d.group + Scene3d.meshWithShadow table.material + table.mesh + table.shadow + + _ -> + Scene3d.nothing in Scene3d.placeIn frame entity @@ -372,7 +387,6 @@ sizes : , halfCornerHole : Float , halfCornerDiagonal : Float , height : Float - , thickness : Float , floorHalfSize : Float , ballRadius : Float } @@ -395,76 +409,6 @@ sizes = , halfCornerHole = halfCornerHole , halfCornerDiagonal = sqrt (halfCornerHole ^ 2 / 2) , height = 0.45 -- distance from the floor until the top of the table - , thickness = 0.03 -- the height of table top , floorHalfSize = 15 , ballRadius = 57.15 / 2000 } - - -tableBlocks : List (Block3d Meters BodyCoordinates) -tableBlocks = - let - cornerBlock = - Block3d.from - (Point3d.meters -sizes.halfCornerDiagonal -sizes.halfCornerDiagonal 0) - (Point3d.meters sizes.halfCornerDiagonal sizes.halfCornerDiagonal -sizes.thickness) - |> Block3d.rotateAround Axis3d.z (Angle.degrees 45) - in - [ Block3d.from - (Point3d.meters -sizes.halfWidth (-sizes.halfLength + sizes.halfCornerHole) 0) - (Point3d.meters sizes.halfWidth (sizes.halfLength - sizes.halfCornerHole) -sizes.thickness) - , Block3d.from - (Point3d.meters (-sizes.halfWidth + sizes.halfCornerHole) (sizes.halfLength - sizes.halfCornerHole) 0) - (Point3d.meters (sizes.halfWidth - sizes.halfCornerHole) sizes.halfLength -sizes.thickness) - , Block3d.from - (Point3d.meters (-sizes.halfWidth + sizes.halfCornerHole) (-sizes.halfLength + sizes.halfCornerHole) 0) - (Point3d.meters (sizes.halfWidth - sizes.halfCornerHole) -sizes.halfLength -sizes.thickness) - , Block3d.from - (Point3d.meters (-sizes.halfWidth + sizes.halfCornerHole) (-sizes.halfLength + sizes.halfCornerHole) 0) - (Point3d.meters (sizes.halfWidth - sizes.halfCornerHole) -sizes.halfLength -sizes.thickness) - , Block3d.translateBy (Vector3d.meters (-sizes.halfWidth + sizes.halfCornerHole) (-sizes.halfLength + sizes.halfCornerHole) 0) cornerBlock - , Block3d.translateBy (Vector3d.meters (sizes.halfWidth - sizes.halfCornerHole) (-sizes.halfLength + sizes.halfCornerHole) 0) cornerBlock - , Block3d.translateBy (Vector3d.meters (-sizes.halfWidth + sizes.halfCornerHole) (sizes.halfLength - sizes.halfCornerHole) 0) cornerBlock - , Block3d.translateBy (Vector3d.meters (sizes.halfWidth - sizes.halfCornerHole) (sizes.halfLength - sizes.halfCornerHole) 0) cornerBlock - ] - - -tableSurface : Body Id -tableSurface = - Body.compound (List.map Physics.Shape.block tableBlocks) Table - |> Body.withMaterial - (Physics.Material.custom - { friction = 0.8 - , bounciness = 0 - } - ) - - -wallsBlocks : List (Block3d Meters BodyCoordinates) -wallsBlocks = - [ Block3d.from - (Point3d.meters -sizes.halfWidth (-sizes.halfLength + sizes.halfCornerHole) sizes.wallHeight) - (Point3d.meters (-sizes.halfWidth + sizes.wallThickness) -sizes.halfHole 0) - , Block3d.from - (Point3d.meters (sizes.halfWidth - sizes.wallThickness) -sizes.halfHole 0) - (Point3d.meters sizes.halfWidth (-sizes.halfLength + sizes.halfCornerHole) sizes.wallHeight) - , Block3d.from - (Point3d.meters (sizes.halfWidth - sizes.halfCornerHole) (-sizes.halfLength + sizes.wallThickness) 0) - (Point3d.meters (-sizes.halfWidth + sizes.halfCornerHole) -sizes.halfLength sizes.wallHeight) - ] - |> List.foldl - (\block result -> - Block3d.rotateAround Axis3d.z (Angle.degrees 180) block :: block :: result - ) - [] - - -tableWalls : Body Id -tableWalls = - Body.compound (List.map Physics.Shape.block wallsBlocks) Walls - |> Body.withMaterial - (Physics.Material.custom - { friction = 0.1 - , bounciness = 0.8 - } - ) diff --git a/src/Game.elm b/src/Game.elm index 29a871a..47249c1 100644 --- a/src/Game.elm +++ b/src/Game.elm @@ -45,6 +45,7 @@ import Scene3d.Material exposing (Texture) import Set exposing (Set) import SketchPlane3d import Speed +import Table exposing (Table) import Time exposing (Posix) import Vector2d import Vector3d @@ -59,6 +60,7 @@ type alias Model = , world : World Id , state : State , camera : Camera + , table : Table , orbiting : Maybe (Point2d Pixels ScreenCoordinates) } @@ -118,15 +120,16 @@ initialState time pool = PlacingBall OutsideOfTable (BehindHeadString (EightBall.rack time pool)) -initial : Model -initial = +initial : Table -> Model +initial table = let time = -- TODO: consider getting the initial time Time.millisToPosix 0 in - { world = Bodies.world + { world = Bodies.world table , time = time + , table = table , camera = Camera.initial , state = initialState time EightBall.start , orbiting = Nothing @@ -280,7 +283,7 @@ update window msg oldModel = -- Stop the simulation, decide what to do next! Stop (EightBall.IllegalBreak newPool) -> { model - | world = Bodies.world -- Reset the table. + | world = Bodies.world model.table -- Reset the table. , state = initialState time newPool , camera = Camera.focusOn Point3d.origin model.camera } @@ -663,22 +666,27 @@ simulateWithEvents frame time world events = Contact.bodies contact in case ( Body.data b1, Body.data b2 ) of - -- TODO: check collisions with pockets instead when we have them - ( Numbered ball, Floor ) -> + ( Numbered ball, Pocket ) -> ( EightBall.ballFellInPocket time ball :: currentEvents , World.keepIf (\b -> Body.data b /= Numbered ball) currentWorld ) - ( Floor, Numbered ball ) -> + ( Pocket, Numbered ball ) -> ( EightBall.ballFellInPocket time ball :: currentEvents , World.keepIf (\b -> Body.data b /= Numbered ball) currentWorld ) - ( CueBall, Numbered ball ) -> - ( EightBall.cueHitBall time ball :: currentEvents, currentWorld ) + -- TODO: implement “spotted” balls. When a numbered ball falls off the table, + -- it has to be placed on the foot spot + ( Numbered ball, Floor ) -> + ( EightBall.ballFellInPocket time ball :: currentEvents + , World.keepIf (\b -> Body.data b /= Numbered ball) currentWorld + ) - ( Numbered ball, CueBall ) -> - ( EightBall.cueHitBall time ball :: currentEvents, currentWorld ) + ( Floor, Numbered ball ) -> + ( EightBall.ballFellInPocket time ball :: currentEvents + , World.keepIf (\b -> Body.data b /= Numbered ball) currentWorld + ) ( CueBall, Floor ) -> ( EightBall.scratch time :: currentEvents @@ -690,30 +698,41 @@ simulateWithEvents frame time world events = , World.keepIf (\b -> Body.data b /= CueBall) currentWorld ) + ( Pocket, CueBall ) -> + ( EightBall.scratch time :: currentEvents + , World.keepIf (\b -> Body.data b /= CueBall) currentWorld + ) + + ( CueBall, Numbered ball ) -> + ( EightBall.cueHitBall time ball :: currentEvents, currentWorld ) + + ( Numbered ball, CueBall ) -> + ( EightBall.cueHitBall time ball :: currentEvents, currentWorld ) + --(Numbered _, Numbered _) -> -- (EightBall.ballsCollided time, currentWorld) - ( Walls, Numbered ball ) -> + ( Cushion, Numbered ball ) -> if not (Set.member (EightBall.ballNumber ball) frozen) then ( EightBall.ballHitWall time ball :: currentEvents, currentWorld ) else ( currentEvents, currentWorld ) - ( Numbered ball, Walls ) -> + ( Numbered ball, Cushion ) -> if not (Set.member (EightBall.ballNumber ball) frozen) then ( EightBall.ballHitWall time ball :: currentEvents, currentWorld ) else ( currentEvents, currentWorld ) - ( Walls, CueBall ) -> + ( Cushion, CueBall ) -> if not frozenCue then ( EightBall.cueHitWall time :: currentEvents, currentWorld ) else ( currentEvents, currentWorld ) - ( CueBall, Walls ) -> + ( CueBall, Cushion ) -> if not frozenCue then ( EightBall.cueHitWall time :: currentEvents, currentWorld ) @@ -743,10 +762,10 @@ frozenBalls world = Contact.bodies contact in case ( Body.data b1, Body.data b2 ) of - ( Walls, Numbered ball ) -> + ( Cushion, Numbered ball ) -> Set.insert (EightBall.ballNumber ball) frozen - ( Numbered ball, Walls ) -> + ( Numbered ball, Cushion ) -> Set.insert (EightBall.ballNumber ball) frozen _ -> @@ -767,10 +786,10 @@ frozenCueBall world = Contact.bodies contact in case ( Body.data b1, Body.data b2 ) of - ( Walls, CueBall ) -> + ( Cushion, CueBall ) -> True - ( CueBall, Walls ) -> + ( CueBall, Cushion ) -> True _ -> @@ -783,8 +802,8 @@ frozenCueBall world = -- VIEW -view : Dict Int (Texture Color) -> Texture Float -> Rectangle2d Pixels ScreenCoordinates -> Model -> Html Msg -view ballTextures roughnessTexture window model = +view : Dict Int (Texture Color) -> Texture Float -> Table -> Rectangle2d Pixels ScreenCoordinates -> Model -> Html Msg +view ballTextures roughnessTexture table window model = let sunlight = Scene3d.Light.directional (Scene3d.Light.castsShadows True) @@ -798,7 +817,7 @@ view ballTextures roughnessTexture window model = { upDirection = Direction3d.positiveZ , chromaticity = Scene3d.Light.daylight , intensityAbove = Illuminance.lux 3000 - , intensityBelow = Illuminance.lux 0 + , intensityBelow = Illuminance.lux 2000 } camera3d = @@ -806,7 +825,7 @@ view ballTextures roughnessTexture window model = entities = List.map - (Bodies.bodyToEntity roughnessTexture ballTextures) + (Bodies.bodyToEntity roughnessTexture ballTextures table) (World.bodies model.world) dimensions = @@ -861,7 +880,7 @@ view ballTextures roughnessTexture window model = ] [ Scene3d.custom { dimensions = dimensions - , antialiasing = Scene3d.noAntialiasing + , antialiasing = Scene3d.multisampling , camera = camera3d , entities = entitiesWithUI , lights = Scene3d.twoLights environmentalLighting sunlight diff --git a/src/Main.elm b/src/Main.elm index 8f4eb63..174c21f 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -15,6 +15,7 @@ import Json.Encode import Pixels exposing (Pixels) import Rectangle2d exposing (Rectangle2d) import Scene3d.Material as Material +import Table exposing (Table) import Task import WebGL.Texture exposing (defaultOptions) @@ -29,6 +30,7 @@ type Msg = WindowResized (Rectangle2d Pixels ScreenCoordinates) | GotBallTexture Int (Result WebGL.Texture.Error (Material.Texture Color)) | GotRoughnessTexture (Result WebGL.Texture.Error (Material.Texture Float)) + | GotTable (Result String Table) | RunningMsg Game.Msg | StartNewGameButtonClicked @@ -36,6 +38,7 @@ type Msg type alias LoadingModel = { ballTextures : Dict Int (Material.Texture Color) , roughnessTexture : Maybe (Material.Texture Float) + , table : Maybe Table , window : Maybe (Rectangle2d Pixels ScreenCoordinates) , assetsPath : String } @@ -44,6 +47,7 @@ type alias LoadingModel = type alias LoadedModel = { ballTextures : Dict Int (Material.Texture Color) , roughnessTexture : Material.Texture Float + , table : Table , window : Rectangle2d Pixels ScreenCoordinates , assetsPath : String , game : Game.Model @@ -111,6 +115,7 @@ init unsafeFlags = ( Loading { window = Nothing , roughnessTexture = Nothing + , table = Nothing , ballTextures = Dict.empty , assetsPath = assetsPath } @@ -126,6 +131,12 @@ init unsafeFlags = (List.range 1 15) ) , Task.attempt GotRoughnessTexture (Material.load (assetsPath ++ "img/roughness.jpg")) + , Task.attempt GotTable + (Table.load + { texture = assetsPath ++ "img/billiard-table.png" + , mesh = assetsPath ++ "/billiard-table.obj.txt" + } + ) , Task.perform (\{ viewport } -> WindowResized @@ -145,11 +156,11 @@ init unsafeFlags = view : Model -> Html Msg view model = case model of - Loaded { game, roughnessTexture, ballTextures, window, assetsPath } -> + Loaded { game, roughnessTexture, table, ballTextures, window, assetsPath } -> Html.div [] [ Html.map RunningMsg - (Game.view ballTextures roughnessTexture window game) + (Game.view ballTextures roughnessTexture table window game) , viewCurrentStatus game assetsPath ] @@ -280,6 +291,17 @@ update msg model = Err _ -> Failed "Failed to load roughness texture" + ( GotTable maybeTable, Loading loadingModel ) -> + case maybeTable of + Ok table -> + loadComplete + { loadingModel + | table = Just table + } + + Err error -> + Failed ("Failed to load table mesh: " ++ error) + ( RunningMsg runningMsg, Loaded loadedModel ) -> let newGame = @@ -288,7 +310,7 @@ update msg model = Loaded { loadedModel | game = newGame } ( StartNewGameButtonClicked, Loaded loadedModel ) -> - Loaded { loadedModel | game = Game.initial } + Loaded { loadedModel | game = Game.initial loadedModel.table } _ -> model @@ -297,17 +319,19 @@ update msg model = loadComplete : LoadingModel -> Model loadComplete model = if Dict.size model.ballTextures == 15 then - Maybe.map2 - (\roughnessTexture window -> + Maybe.map3 + (\roughnessTexture table window -> Loaded { ballTextures = model.ballTextures + , table = table , assetsPath = model.assetsPath , window = window , roughnessTexture = roughnessTexture - , game = Game.initial + , game = Game.initial table } ) model.roughnessTexture + model.table model.window |> Maybe.withDefault (Loading model) diff --git a/src/Table.elm b/src/Table.elm new file mode 100644 index 0000000..f4f60bc --- /dev/null +++ b/src/Table.elm @@ -0,0 +1,94 @@ +module Table exposing (Table, load) + +{-| elm-obj-file is used to decode various objects from the obj file. + + - Colliders for the table body prefixed with `Table-*` + - Colliders for the cushions body prefixed with `Cushions-*` + - Collider for the pockets body: `Pockets` + - Mesh used for rendering: `Billiard-Table` + +The Billiard Table model is designed by Kolja Wilcke + +-} + +import Frame3d +import Http +import Length +import Obj.Decode exposing (Decoder) +import Physics.Coordinates exposing (BodyCoordinates) +import Physics.Shape as Shape exposing (Shape) +import Scene3d.Material +import Scene3d.Mesh exposing (Shadow, Textured) +import Task exposing (Task) + + +type alias Table = + { table : List Shape + , cushions : List Shape + , pockets : List Shape + , mesh : Textured BodyCoordinates + , shadow : Shadow BodyCoordinates + , material : Scene3d.Material.Textured BodyCoordinates + } + + +load : { texture : String, mesh : String } -> Task String Table +load urls = + Http.task + { method = "get" + , headers = [] + , body = Http.emptyBody + , url = urls.mesh + , resolver = + Http.stringResolver + (\resp -> + case resp of + Http.GoodStatus_ _ str -> + Obj.Decode.decodeString Length.meters tableDecoder str + + _ -> + Err "Failed to load mesh" + ) + , timeout = Nothing + } + |> Task.andThen + (\fn -> + Scene3d.Material.loadWith Scene3d.Material.nearestNeighborFiltering urls.texture + |> Task.mapError (\_ -> "Failed to load texture") + |> Task.map (\texture -> fn (Scene3d.Material.texturedMatte texture)) + ) + + +tableDecoder : Decoder (Scene3d.Material.Textured BodyCoordinates -> Table) +tableDecoder = + Obj.Decode.map4 + (\tableConvexes cushionsConvexes pocketsConvex visual -> + let + mesh = + Scene3d.Mesh.texturedFaces visual + in + \material -> + { table = List.map Shape.unsafeConvex tableConvexes + , cushions = List.map Shape.unsafeConvex cushionsConvexes + , pockets = [ Shape.unsafeConvex pocketsConvex ] + , mesh = mesh + , shadow = Scene3d.Mesh.shadow mesh + , material = material + } + ) + (startsWith "Table-" (Obj.Decode.trianglesIn Frame3d.atOrigin)) + (startsWith "Cushions-" (Obj.Decode.trianglesIn Frame3d.atOrigin)) + (Obj.Decode.object "Pockets" (Obj.Decode.trianglesIn Frame3d.atOrigin)) + (Obj.Decode.object "Billiard-Table" (Obj.Decode.texturedFacesIn Frame3d.atOrigin)) + + +startsWith : String -> Decoder a -> Decoder (List a) +startsWith prefix decoder = + Obj.Decode.objectNames + |> Obj.Decode.andThen + (\names -> + names + |> List.filter (String.startsWith prefix) + |> List.map (\name -> Obj.Decode.object name decoder) + |> Obj.Decode.combine + )