diff --git a/AimGL/resources/Models/button_stand/button-stand-clicked.png b/AimGL/resources/Models/button_stand/button-stand-clicked.png new file mode 100644 index 0000000..95ddad3 Binary files /dev/null and b/AimGL/resources/Models/button_stand/button-stand-clicked.png differ diff --git a/AimGL/resources/Models/button_stand/button-stand.obj b/AimGL/resources/Models/button_stand/button-stand.obj new file mode 100644 index 0000000..4831311 --- /dev/null +++ b/AimGL/resources/Models/button_stand/button-stand.obj @@ -0,0 +1,3852 @@ +# Blender 3.4.1 +# www.blender.org +o Sphere +v 0.000000 0.588343 -0.029989 +v 0.000000 0.573451 -0.044882 +v 0.000000 0.553992 -0.052942 +v 0.000000 0.543462 -0.053979 +v 0.000000 0.532931 -0.052942 +v 0.000000 0.513472 -0.044882 +v 0.002054 0.596403 -0.010328 +v 0.004030 0.593332 -0.020260 +v 0.005851 0.588343 -0.029413 +v 0.007446 0.581630 -0.037435 +v 0.008756 0.573451 -0.044019 +v 0.009729 0.564118 -0.048912 +v 0.010328 0.553992 -0.051924 +v 0.010531 0.543462 -0.052942 +v 0.010328 0.532931 -0.051924 +v 0.009729 0.522805 -0.048912 +v 0.008756 0.513472 -0.044019 +v 0.007446 0.505293 -0.037435 +v 0.005851 0.498580 -0.029413 +v 0.004030 0.493592 -0.020260 +v 0.002054 0.490520 -0.010328 +v 0.004030 0.596403 -0.009729 +v 0.007905 0.593332 -0.019084 +v 0.011476 0.588343 -0.027706 +v 0.014607 0.581630 -0.035263 +v 0.017176 0.573451 -0.041465 +v 0.019084 0.564118 -0.046074 +v 0.020260 0.553992 -0.048912 +v 0.020657 0.543462 -0.049870 +v 0.020260 0.532931 -0.048912 +v 0.019084 0.522805 -0.046074 +v 0.017176 0.513472 -0.041465 +v 0.014607 0.505293 -0.035263 +v 0.011476 0.498580 -0.027706 +v 0.007905 0.493592 -0.019084 +v 0.004030 0.490520 -0.009729 +v 0.005851 0.596403 -0.008756 +v 0.011476 0.593332 -0.017176 +v 0.016661 0.588343 -0.024935 +v 0.021205 0.581630 -0.031736 +v 0.024935 0.573451 -0.037318 +v 0.027706 0.564118 -0.041465 +v 0.029413 0.553992 -0.044019 +v 0.029989 0.543462 -0.044882 +v 0.029413 0.532931 -0.044019 +v 0.027706 0.522805 -0.041465 +v 0.024935 0.513472 -0.037318 +v 0.021205 0.505293 -0.031736 +v 0.016661 0.498580 -0.024935 +v 0.011476 0.493592 -0.017176 +v 0.005851 0.490520 -0.008756 +v 0.007446 0.596403 -0.007446 +v 0.014607 0.593332 -0.014607 +v 0.021205 0.588343 -0.021205 +v 0.026989 0.581630 -0.026989 +v 0.031736 0.573451 -0.031736 +v 0.035263 0.564118 -0.035263 +v 0.037435 0.553992 -0.037435 +v 0.038169 0.543462 -0.038169 +v 0.037435 0.532931 -0.037435 +v 0.035263 0.522805 -0.035263 +v 0.031736 0.513472 -0.031736 +v 0.026989 0.505293 -0.026989 +v 0.021205 0.498580 -0.021205 +v 0.014607 0.493592 -0.014607 +v 0.007446 0.490520 -0.007446 +v 0.008756 0.596403 -0.005851 +v 0.017176 0.593332 -0.011476 +v 0.024935 0.588343 -0.016661 +v 0.031736 0.581630 -0.021205 +v 0.037318 0.573451 -0.024935 +v 0.041465 0.564118 -0.027706 +v 0.044019 0.553992 -0.029413 +v 0.044882 0.543462 -0.029989 +v 0.044019 0.532931 -0.029413 +v 0.041465 0.522805 -0.027706 +v 0.037318 0.513472 -0.024935 +v 0.031736 0.505293 -0.021205 +v 0.024935 0.498580 -0.016661 +v 0.017176 0.493592 -0.011476 +v 0.008756 0.490520 -0.005851 +v 0.000000 0.597440 0.000000 +v 0.009729 0.596403 -0.004030 +v 0.019084 0.593332 -0.007905 +v 0.027706 0.588343 -0.011476 +v 0.035263 0.581630 -0.014607 +v 0.041465 0.573451 -0.017176 +v 0.046074 0.564118 -0.019084 +v 0.048912 0.553992 -0.020260 +v 0.049870 0.543462 -0.020657 +v 0.048912 0.532931 -0.020260 +v 0.046074 0.522805 -0.019084 +v 0.041465 0.513472 -0.017176 +v 0.035263 0.505293 -0.014607 +v 0.027706 0.498580 -0.011476 +v 0.019084 0.493592 -0.007905 +v 0.009729 0.490520 -0.004030 +v 0.010328 0.596403 -0.002054 +v 0.020260 0.593332 -0.004030 +v 0.029413 0.588343 -0.005851 +v 0.037435 0.581630 -0.007446 +v 0.044019 0.573451 -0.008756 +v 0.048912 0.564118 -0.009729 +v 0.051924 0.553992 -0.010328 +v 0.052942 0.543462 -0.010531 +v 0.051924 0.532931 -0.010328 +v 0.048912 0.522805 -0.009729 +v 0.044019 0.513472 -0.008756 +v 0.037435 0.505293 -0.007446 +v 0.029413 0.498580 -0.005851 +v 0.020260 0.493592 -0.004030 +v 0.010328 0.490520 -0.002054 +v 0.010531 0.596403 0.000000 +v 0.020657 0.593332 0.000000 +v 0.029989 0.588343 0.000000 +v 0.038169 0.581630 -0.000000 +v 0.044882 0.573451 0.000000 +v 0.049870 0.564118 -0.000000 +v 0.052942 0.553992 0.000000 +v 0.053979 0.543462 0.000000 +v 0.052942 0.532931 0.000000 +v 0.049870 0.522805 -0.000000 +v 0.044882 0.513472 0.000000 +v 0.038169 0.505293 -0.000000 +v 0.029989 0.498580 0.000000 +v 0.020657 0.493592 0.000000 +v 0.010531 0.490520 0.000000 +v 0.010328 0.596403 0.002054 +v 0.020260 0.593332 0.004030 +v 0.029413 0.588343 0.005851 +v 0.037435 0.581630 0.007446 +v 0.044019 0.573451 0.008756 +v 0.048912 0.564118 0.009729 +v 0.051924 0.553992 0.010328 +v 0.052942 0.543462 0.010531 +v 0.051924 0.532931 0.010328 +v 0.048912 0.522805 0.009729 +v 0.044019 0.513472 0.008756 +v 0.037435 0.505293 0.007446 +v 0.029413 0.498580 0.005851 +v 0.020260 0.493592 0.004030 +v 0.010328 0.490520 0.002054 +v 0.009729 0.596403 0.004030 +v 0.019084 0.593332 0.007905 +v 0.027706 0.588343 0.011476 +v 0.035263 0.581630 0.014607 +v 0.041465 0.573451 0.017176 +v 0.046074 0.564118 0.019084 +v 0.048912 0.553992 0.020260 +v 0.049870 0.543462 0.020657 +v 0.048912 0.532931 0.020260 +v 0.046074 0.522805 0.019084 +v 0.041465 0.513472 0.017176 +v 0.035263 0.505293 0.014607 +v 0.027706 0.498580 0.011476 +v 0.019084 0.493592 0.007905 +v 0.009729 0.490520 0.004030 +v 0.008756 0.596403 0.005851 +v 0.017176 0.593332 0.011476 +v 0.024935 0.588343 0.016661 +v 0.031736 0.581630 0.021205 +v 0.037318 0.573451 0.024935 +v 0.041465 0.564118 0.027706 +v 0.044019 0.553992 0.029413 +v 0.044882 0.543462 0.029989 +v 0.044019 0.532931 0.029413 +v 0.041465 0.522805 0.027706 +v 0.037318 0.513472 0.024935 +v 0.031736 0.505293 0.021205 +v 0.024935 0.498580 0.016661 +v 0.017176 0.493592 0.011476 +v 0.008756 0.490520 0.005851 +v 0.007446 0.596403 0.007446 +v 0.014607 0.593332 0.014607 +v 0.021205 0.588343 0.021205 +v 0.026989 0.581630 0.026989 +v 0.031736 0.573451 0.031736 +v 0.035263 0.564118 0.035263 +v 0.037435 0.553992 0.037435 +v 0.038169 0.543462 0.038169 +v 0.037435 0.532931 0.037435 +v 0.035263 0.522805 0.035263 +v 0.031736 0.513472 0.031736 +v 0.026989 0.505293 0.026989 +v 0.021205 0.498580 0.021205 +v 0.014607 0.493592 0.014607 +v 0.007446 0.490520 0.007446 +v 0.005851 0.596403 0.008756 +v 0.011476 0.593332 0.017176 +v 0.016661 0.588343 0.024935 +v 0.021205 0.581630 0.031736 +v 0.024935 0.573451 0.037318 +v 0.027706 0.564118 0.041465 +v 0.029413 0.553992 0.044019 +v 0.029989 0.543462 0.044882 +v 0.029413 0.532931 0.044019 +v 0.027706 0.522805 0.041465 +v 0.024935 0.513472 0.037318 +v 0.021205 0.505293 0.031736 +v 0.016661 0.498580 0.024935 +v 0.011476 0.493592 0.017176 +v 0.005851 0.490520 0.008756 +v 0.004030 0.596403 0.009729 +v 0.007905 0.593332 0.019084 +v 0.011476 0.588343 0.027706 +v 0.014607 0.581630 0.035263 +v 0.017176 0.573451 0.041465 +v 0.019084 0.564118 0.046074 +v 0.020260 0.553992 0.048912 +v 0.020657 0.543462 0.049870 +v 0.020260 0.532931 0.048912 +v 0.019084 0.522805 0.046074 +v 0.017176 0.513472 0.041465 +v 0.014607 0.505293 0.035263 +v 0.011476 0.498580 0.027706 +v 0.007905 0.493592 0.019084 +v 0.004030 0.490520 0.009729 +v 0.002054 0.596403 0.010328 +v 0.004030 0.593332 0.020260 +v 0.005851 0.588343 0.029413 +v 0.007446 0.581630 0.037435 +v 0.008756 0.573451 0.044019 +v 0.009729 0.564118 0.048912 +v 0.010328 0.553992 0.051924 +v 0.010531 0.543462 0.052942 +v 0.010328 0.532931 0.051924 +v 0.009729 0.522805 0.048912 +v 0.008756 0.513472 0.044019 +v 0.007446 0.505293 0.037435 +v 0.005851 0.498580 0.029413 +v 0.004030 0.493592 0.020260 +v 0.002054 0.490520 0.010328 +v -0.000000 0.596403 0.010531 +v -0.000000 0.593332 0.020657 +v -0.000000 0.588343 0.029989 +v -0.000000 0.581630 0.038169 +v -0.000000 0.573451 0.044882 +v 0.000000 0.564118 0.049870 +v -0.000000 0.553992 0.052942 +v -0.000000 0.543462 0.053979 +v -0.000000 0.532931 0.052942 +v 0.000000 0.522805 0.049870 +v -0.000000 0.513472 0.044882 +v -0.000000 0.505293 0.038169 +v -0.000000 0.498580 0.029989 +v -0.000000 0.493592 0.020657 +v -0.000000 0.490520 0.010531 +v -0.002054 0.596403 0.010328 +v -0.004030 0.593332 0.020260 +v -0.005851 0.588343 0.029413 +v -0.007446 0.581630 0.037435 +v -0.008756 0.573451 0.044019 +v -0.009729 0.564118 0.048912 +v -0.010328 0.553992 0.051924 +v -0.010531 0.543462 0.052942 +v -0.010328 0.532931 0.051924 +v -0.009729 0.522805 0.048912 +v -0.008756 0.513472 0.044019 +v -0.007446 0.505293 0.037435 +v -0.005851 0.498580 0.029413 +v -0.004030 0.493592 0.020260 +v -0.002054 0.490520 0.010328 +v -0.004030 0.596403 0.009729 +v -0.007905 0.593332 0.019084 +v -0.011476 0.588343 0.027706 +v -0.014607 0.581630 0.035263 +v -0.017176 0.573451 0.041465 +v -0.019084 0.564118 0.046074 +v -0.020260 0.553992 0.048912 +v -0.020657 0.543462 0.049870 +v -0.020260 0.532931 0.048912 +v -0.019084 0.522805 0.046074 +v -0.017176 0.513472 0.041465 +v -0.014607 0.505293 0.035263 +v -0.011476 0.498580 0.027706 +v -0.007905 0.493592 0.019084 +v -0.004030 0.490520 0.009729 +v -0.005851 0.596403 0.008756 +v -0.011476 0.593332 0.017176 +v -0.016661 0.588343 0.024935 +v -0.021205 0.581630 0.031736 +v -0.024935 0.573451 0.037318 +v -0.027706 0.564118 0.041465 +v -0.029413 0.553992 0.044019 +v -0.029989 0.543462 0.044882 +v -0.029413 0.532931 0.044019 +v -0.027706 0.522805 0.041465 +v -0.024935 0.513472 0.037318 +v -0.021205 0.505293 0.031736 +v -0.016661 0.498580 0.024935 +v -0.011476 0.493592 0.017176 +v -0.005851 0.490520 0.008756 +v -0.007446 0.596403 0.007446 +v -0.014607 0.593332 0.014607 +v -0.021205 0.588343 0.021205 +v -0.026989 0.581630 0.026989 +v -0.031736 0.573451 0.031736 +v -0.035263 0.564118 0.035263 +v -0.037435 0.553992 0.037435 +v -0.038169 0.543462 0.038169 +v -0.037435 0.532931 0.037435 +v -0.035263 0.522805 0.035263 +v -0.031736 0.513472 0.031736 +v -0.026989 0.505293 0.026989 +v -0.021205 0.498580 0.021205 +v -0.014607 0.493592 0.014607 +v -0.007446 0.490520 0.007446 +v 0.000000 0.489483 0.000000 +v -0.008756 0.596403 0.005851 +v -0.017176 0.593332 0.011476 +v -0.024935 0.588343 0.016661 +v -0.031736 0.581630 0.021205 +v -0.037318 0.573451 0.024935 +v -0.041465 0.564118 0.027706 +v -0.044019 0.553992 0.029413 +v -0.044882 0.543462 0.029989 +v -0.044019 0.532931 0.029413 +v -0.041465 0.522805 0.027706 +v -0.037318 0.513472 0.024935 +v -0.031736 0.505293 0.021205 +v -0.024935 0.498580 0.016661 +v -0.017176 0.493592 0.011476 +v -0.008756 0.490520 0.005851 +v -0.009729 0.596403 0.004030 +v -0.019084 0.593332 0.007905 +v -0.027706 0.588343 0.011476 +v -0.035263 0.581630 0.014607 +v -0.041465 0.573451 0.017176 +v -0.046074 0.564118 0.019084 +v -0.048912 0.553992 0.020260 +v -0.049870 0.543462 0.020657 +v -0.048912 0.532931 0.020260 +v -0.046074 0.522805 0.019084 +v -0.041465 0.513472 0.017176 +v -0.035263 0.505293 0.014607 +v -0.027706 0.498580 0.011476 +v -0.019084 0.493592 0.007905 +v -0.009729 0.490520 0.004030 +v -0.010328 0.596403 0.002054 +v -0.020260 0.593332 0.004030 +v -0.029413 0.588343 0.005851 +v -0.037435 0.581630 0.007446 +v -0.044019 0.573451 0.008756 +v -0.048912 0.564118 0.009729 +v -0.051924 0.553992 0.010328 +v -0.052942 0.543462 0.010531 +v -0.051924 0.532931 0.010328 +v -0.048912 0.522805 0.009729 +v -0.044019 0.513472 0.008756 +v -0.037435 0.505293 0.007446 +v -0.029413 0.498580 0.005851 +v -0.020260 0.493592 0.004030 +v -0.010328 0.490520 0.002054 +v -0.010531 0.596403 -0.000000 +v -0.020657 0.593332 -0.000000 +v -0.029989 0.588343 -0.000000 +v -0.038169 0.581630 -0.000000 +v -0.044882 0.573451 -0.000000 +v -0.049870 0.564118 -0.000000 +v -0.052942 0.553992 -0.000000 +v -0.053979 0.543462 -0.000000 +v -0.052942 0.532931 -0.000000 +v -0.049870 0.522805 -0.000000 +v -0.044882 0.513472 -0.000000 +v -0.038169 0.505293 -0.000000 +v -0.029989 0.498580 -0.000000 +v -0.020657 0.493592 -0.000000 +v -0.010531 0.490520 -0.000000 +v -0.010328 0.596403 -0.002054 +v -0.020260 0.593332 -0.004030 +v -0.029413 0.588343 -0.005851 +v -0.037435 0.581630 -0.007446 +v -0.044019 0.573451 -0.008756 +v -0.048912 0.564118 -0.009729 +v -0.051924 0.553992 -0.010328 +v -0.052942 0.543462 -0.010531 +v -0.051924 0.532931 -0.010328 +v -0.048912 0.522805 -0.009729 +v -0.044019 0.513472 -0.008756 +v -0.037435 0.505293 -0.007446 +v -0.029413 0.498580 -0.005851 +v -0.020260 0.493592 -0.004030 +v -0.010328 0.490520 -0.002054 +v -0.009729 0.596403 -0.004030 +v -0.019084 0.593332 -0.007905 +v -0.027706 0.588343 -0.011476 +v -0.035263 0.581630 -0.014607 +v -0.041465 0.573451 -0.017176 +v -0.046074 0.564118 -0.019084 +v -0.048912 0.553992 -0.020260 +v -0.049870 0.543462 -0.020657 +v -0.048912 0.532931 -0.020260 +v -0.046074 0.522805 -0.019084 +v -0.041465 0.513472 -0.017176 +v -0.035263 0.505293 -0.014607 +v -0.027706 0.498580 -0.011476 +v -0.019084 0.493592 -0.007905 +v -0.009729 0.490520 -0.004030 +v -0.008756 0.596403 -0.005851 +v -0.017176 0.593332 -0.011476 +v -0.024935 0.588343 -0.016661 +v -0.031736 0.581630 -0.021205 +v -0.037318 0.573451 -0.024935 +v -0.041465 0.564118 -0.027706 +v -0.044019 0.553992 -0.029413 +v -0.044882 0.543462 -0.029989 +v -0.044019 0.532931 -0.029413 +v -0.041465 0.522805 -0.027706 +v -0.037318 0.513472 -0.024935 +v -0.031736 0.505293 -0.021205 +v -0.024935 0.498580 -0.016661 +v -0.017176 0.493592 -0.011476 +v -0.008756 0.490520 -0.005851 +v -0.007446 0.596403 -0.007446 +v -0.014607 0.593332 -0.014607 +v -0.021205 0.588343 -0.021205 +v -0.026989 0.581630 -0.026989 +v -0.031736 0.573451 -0.031736 +v -0.035263 0.564118 -0.035263 +v -0.037435 0.553992 -0.037435 +v -0.038169 0.543462 -0.038169 +v -0.037435 0.532931 -0.037435 +v -0.035263 0.522805 -0.035263 +v -0.031736 0.513472 -0.031736 +v -0.026989 0.505293 -0.026989 +v -0.021205 0.498580 -0.021205 +v -0.014607 0.493592 -0.014607 +v -0.007446 0.490520 -0.007446 +v -0.005851 0.596403 -0.008756 +v -0.011476 0.593332 -0.017176 +v -0.016661 0.588343 -0.024935 +v -0.021205 0.581630 -0.031736 +v -0.024935 0.573451 -0.037318 +v -0.027706 0.564118 -0.041465 +v -0.029413 0.553992 -0.044019 +v -0.029989 0.543462 -0.044882 +v -0.029413 0.532931 -0.044019 +v -0.027706 0.522805 -0.041465 +v -0.024935 0.513472 -0.037318 +v -0.021205 0.505293 -0.031736 +v -0.016661 0.498580 -0.024935 +v -0.011476 0.493592 -0.017176 +v -0.005851 0.490520 -0.008756 +v -0.004030 0.596403 -0.009729 +v -0.007905 0.593332 -0.019084 +v -0.011476 0.588343 -0.027706 +v -0.014607 0.581630 -0.035263 +v -0.017176 0.573451 -0.041465 +v -0.019084 0.564118 -0.046074 +v -0.020260 0.553992 -0.048912 +v -0.020657 0.543462 -0.049870 +v -0.020260 0.532931 -0.048912 +v -0.019084 0.522805 -0.046074 +v -0.017176 0.513472 -0.041465 +v -0.014607 0.505293 -0.035263 +v -0.011476 0.498580 -0.027706 +v -0.007905 0.493592 -0.019084 +v -0.004030 0.490520 -0.009729 +v -0.002054 0.596403 -0.010328 +v -0.004030 0.593332 -0.020260 +v -0.005851 0.588343 -0.029413 +v -0.007446 0.581630 -0.037435 +v -0.008756 0.573451 -0.044019 +v -0.009729 0.564118 -0.048912 +v -0.010328 0.553992 -0.051924 +v -0.010531 0.543462 -0.052942 +v -0.010328 0.532931 -0.051924 +v -0.009729 0.522805 -0.048912 +v -0.008756 0.513472 -0.044019 +v -0.007446 0.505293 -0.037435 +v -0.005851 0.498580 -0.029413 +v -0.004030 0.493592 -0.020260 +v -0.002054 0.490520 -0.010328 +v 0.000000 0.596403 -0.010531 +v 0.000000 0.593332 -0.020657 +v 0.000000 0.581630 -0.038169 +v 0.000000 0.564118 -0.049870 +v 0.000000 0.522805 -0.049870 +v 0.000000 0.505293 -0.038169 +v 0.000000 0.498580 -0.029989 +v 0.000000 0.493592 -0.020657 +v 0.000000 0.490520 -0.010531 +v 0.000000 0.006552 -0.109171 +v 0.000000 0.047415 -0.109171 +v 0.021298 0.006552 -0.107073 +v 0.021298 0.047415 -0.107073 +v 0.041778 0.006552 -0.100861 +v 0.041778 0.047415 -0.100861 +v 0.060652 0.006552 -0.090772 +v 0.060652 0.047415 -0.090772 +v 0.077195 0.006552 -0.077195 +v 0.077195 0.047415 -0.077195 +v 0.090772 0.006552 -0.060652 +v 0.090772 0.047415 -0.060652 +v 0.100861 0.006552 -0.041778 +v 0.100861 0.047415 -0.041778 +v 0.107073 0.006552 -0.021298 +v 0.107073 0.047415 -0.021298 +v 0.109171 0.006552 0.000000 +v 0.109171 0.047415 0.000000 +v 0.107073 0.006552 0.021298 +v 0.107073 0.047415 0.021298 +v 0.100861 0.006552 0.041778 +v 0.100861 0.047415 0.041778 +v 0.090772 0.006552 0.060652 +v 0.090772 0.047415 0.060652 +v 0.077195 0.006552 0.077195 +v 0.077195 0.047415 0.077195 +v 0.060652 0.006552 0.090772 +v 0.060652 0.047415 0.090772 +v 0.041778 0.006552 0.100861 +v 0.041778 0.047415 0.100861 +v 0.021298 0.006552 0.107073 +v 0.021298 0.047415 0.107073 +v 0.000000 0.006552 0.109171 +v 0.000000 0.047415 0.109171 +v -0.021298 0.006552 0.107073 +v -0.021298 0.047415 0.107073 +v -0.041778 0.006552 0.100861 +v -0.041778 0.047415 0.100861 +v -0.060652 0.006552 0.090772 +v -0.060652 0.047415 0.090772 +v -0.077195 0.006552 0.077195 +v -0.077195 0.047415 0.077195 +v -0.090772 0.006552 0.060652 +v -0.090772 0.047415 0.060652 +v -0.100861 0.006552 0.041778 +v -0.100861 0.047415 0.041778 +v -0.107073 0.006552 0.021298 +v -0.107073 0.047415 0.021298 +v -0.109171 0.006552 0.000000 +v -0.109171 0.047415 0.000000 +v -0.107073 0.006552 -0.021298 +v -0.107073 0.047415 -0.021298 +v -0.100861 0.006552 -0.041778 +v -0.100861 0.047415 -0.041778 +v -0.090772 0.006552 -0.060652 +v -0.090772 0.047415 -0.060652 +v -0.077195 0.006552 -0.077195 +v -0.077195 0.047415 -0.077195 +v -0.060652 0.006552 -0.090772 +v -0.060652 0.047415 -0.090772 +v -0.041778 0.006552 -0.100861 +v -0.041778 0.047415 -0.100861 +v -0.021298 0.006552 -0.107073 +v -0.021298 0.047415 -0.107073 +v 0.014380 0.047415 -0.072295 +v -0.000000 0.047415 -0.073712 +v 0.028208 0.047415 -0.068101 +v 0.040952 0.047415 -0.061289 +v 0.052122 0.047415 -0.052122 +v 0.061289 0.047415 -0.040952 +v 0.068101 0.047415 -0.028208 +v 0.072295 0.047415 -0.014380 +v 0.073712 0.047415 -0.000000 +v 0.072295 0.047415 0.014380 +v 0.068101 0.047415 0.028208 +v 0.061289 0.047415 0.040952 +v 0.052122 0.047415 0.052122 +v 0.040952 0.047415 0.061289 +v 0.028208 0.047415 0.068101 +v 0.014380 0.047415 0.072295 +v -0.000000 0.047415 0.073712 +v -0.014380 0.047415 0.072295 +v -0.028208 0.047415 0.068101 +v -0.040952 0.047415 0.061289 +v -0.052122 0.047415 0.052122 +v -0.061289 0.047415 0.040952 +v -0.068101 0.047415 0.028208 +v -0.072295 0.047415 0.014380 +v -0.073712 0.047415 -0.000000 +v -0.072295 0.047415 -0.014380 +v -0.068101 0.047415 -0.028208 +v -0.061289 0.047415 -0.040952 +v -0.052122 0.047415 -0.052122 +v -0.040952 0.047415 -0.061289 +v -0.028208 0.047415 -0.068101 +v -0.014380 0.047415 -0.072295 +v 0.014380 0.514031 -0.072295 +v 0.000000 0.514031 -0.073712 +v 0.028208 0.514031 -0.068101 +v 0.040952 0.514031 -0.061289 +v 0.052122 0.514031 -0.052122 +v 0.061289 0.514031 -0.040952 +v 0.068101 0.514031 -0.028208 +v 0.072296 0.514031 -0.014380 +v 0.073712 0.514031 -0.000000 +v 0.072296 0.514031 0.014380 +v 0.068101 0.514031 0.028208 +v 0.061289 0.514031 0.040952 +v 0.052122 0.514031 0.052122 +v 0.040952 0.514031 0.061289 +v 0.028208 0.514031 0.068101 +v 0.014380 0.514031 0.072295 +v 0.000000 0.514031 0.073712 +v -0.014380 0.514031 0.072295 +v -0.028208 0.514031 0.068101 +v -0.040952 0.514031 0.061289 +v -0.052122 0.514031 0.052122 +v -0.061289 0.514031 0.040952 +v -0.068101 0.514031 0.028208 +v -0.072295 0.514031 0.014380 +v -0.073712 0.514031 -0.000000 +v -0.072295 0.514031 -0.014380 +v -0.068101 0.514031 -0.028208 +v -0.061289 0.514031 -0.040952 +v -0.052122 0.514031 -0.052122 +v -0.040952 0.514031 -0.061289 +v -0.028208 0.514031 -0.068101 +v -0.014380 0.514031 -0.072295 +v 0.014380 0.540358 -0.065941 +v -0.000000 0.539778 -0.067233 +v 0.028208 0.542078 -0.062115 +v 0.040952 0.544870 -0.055902 +v 0.052122 0.548629 -0.047541 +v 0.061289 0.553208 -0.037353 +v 0.068101 0.558432 -0.025729 +v 0.072295 0.564101 -0.013117 +v 0.073712 0.569996 0.000000 +v 0.072295 0.575891 0.013117 +v 0.068101 0.581560 0.025729 +v 0.061289 0.586785 0.037353 +v 0.052122 0.591364 0.047541 +v 0.040952 0.595122 0.055902 +v 0.028208 0.597914 0.062115 +v 0.014380 0.599634 0.065941 +v -0.000000 0.600215 0.067233 +v -0.014380 0.599634 0.065941 +v -0.028208 0.597914 0.062115 +v -0.040952 0.595122 0.055902 +v -0.052122 0.591364 0.047541 +v -0.061289 0.586785 0.037353 +v -0.068101 0.581560 0.025729 +v -0.072296 0.575891 0.013117 +v -0.073712 0.569996 0.000000 +v -0.072296 0.564101 -0.013117 +v -0.068101 0.558432 -0.025729 +v -0.061289 0.553208 -0.037353 +v -0.052122 0.548629 -0.047541 +v -0.040952 0.544870 -0.055902 +v -0.028208 0.542078 -0.062115 +v -0.014380 0.540358 -0.065941 +v 0.012133 0.544991 -0.055634 +v -0.000000 0.544501 -0.056724 +v 0.023799 0.546442 -0.052406 +v 0.034551 0.548798 -0.047165 +v 0.043975 0.551968 -0.040110 +v 0.051709 0.555832 -0.031514 +v 0.057457 0.560240 -0.021707 +v 0.060996 0.565022 -0.011066 +v 0.062190 0.569996 0.000000 +v 0.060996 0.574970 0.011066 +v 0.057457 0.579753 0.021707 +v 0.051709 0.584161 0.031514 +v 0.043975 0.588024 0.040110 +v 0.034551 0.591195 0.047165 +v 0.023799 0.593551 0.052406 +v 0.012133 0.595001 0.055634 +v -0.000000 0.595491 0.056724 +v -0.012133 0.595001 0.055634 +v -0.023799 0.593551 0.052406 +v -0.034551 0.591195 0.047165 +v -0.043975 0.588024 0.040110 +v -0.051709 0.584161 0.031514 +v -0.057457 0.579753 0.021707 +v -0.060996 0.574970 0.011066 +v -0.062190 0.569996 0.000000 +v -0.060996 0.565022 -0.011066 +v -0.057457 0.560240 -0.021707 +v -0.051709 0.555832 -0.031514 +v -0.043975 0.551968 -0.040110 +v -0.034551 0.548798 -0.047165 +v -0.023799 0.546442 -0.052406 +v -0.012133 0.544991 -0.055634 +v 0.012133 0.512749 -0.046686 +v -0.000000 0.512259 -0.047776 +v 0.023799 0.514199 -0.043458 +v 0.034551 0.516555 -0.038217 +v 0.043975 0.519726 -0.031162 +v 0.051709 0.523589 -0.022566 +v 0.057456 0.527997 -0.012759 +v 0.060995 0.532780 -0.002118 +v 0.062190 0.537754 0.008948 +v 0.060995 0.542728 0.020014 +v 0.057456 0.547510 0.030656 +v 0.051709 0.551918 0.040462 +v 0.043975 0.555782 0.049058 +v 0.034551 0.558952 0.056113 +v 0.023799 0.561308 0.061355 +v 0.012133 0.562759 0.064582 +v -0.000000 0.563249 0.065672 +v -0.012133 0.562759 0.064582 +v -0.023799 0.561308 0.061355 +v -0.034551 0.558952 0.056113 +v -0.043975 0.555782 0.049058 +v -0.051710 0.551918 0.040462 +v -0.057457 0.547510 0.030656 +v -0.060996 0.542728 0.020014 +v -0.062190 0.537754 0.008948 +v -0.060996 0.532780 -0.002118 +v -0.057457 0.527997 -0.012759 +v -0.051710 0.523589 -0.022566 +v -0.043975 0.519726 -0.031162 +v -0.034551 0.516555 -0.038217 +v -0.023799 0.514199 -0.043458 +v -0.012133 0.512749 -0.046686 +vn -0.0000 0.5528 -0.8333 +vn 0.1385 0.7041 -0.6965 +vn 0.1626 0.5528 -0.8173 +vn -0.0000 -0.7041 -0.7101 +vn 0.1092 -0.8286 -0.5490 +vn -0.0000 -0.8286 -0.5598 +vn -0.0000 0.3805 -0.9248 +vn 0.1804 0.3805 -0.9070 +vn 0.0757 -0.9217 -0.3804 +vn -0.0000 -0.9217 -0.3879 +vn -0.0000 0.1939 -0.9810 +vn 0.1914 0.1939 -0.9622 +vn 0.0392 -0.9796 -0.1971 +vn -0.0000 -0.9796 -0.2010 +vn 0.1951 -0.0000 -0.9808 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 0.9796 -0.2010 +vn -0.0000 1.0000 -0.0000 +vn 0.0392 0.9796 -0.1971 +vn -0.0000 -1.0000 -0.0000 +vn 0.1914 -0.1939 -0.9622 +vn -0.0000 -0.1939 -0.9810 +vn -0.0000 0.9217 -0.3879 +vn 0.0757 0.9217 -0.3804 +vn 0.1804 -0.3805 -0.9070 +vn -0.0000 -0.3805 -0.9248 +vn -0.0000 0.8286 -0.5598 +vn 0.1092 0.8286 -0.5490 +vn 0.1626 -0.5528 -0.8173 +vn -0.0000 -0.5528 -0.8333 +vn -0.0000 0.7041 -0.7101 +vn 0.1385 -0.7041 -0.6965 +vn 0.3189 -0.5528 -0.7699 +vn 0.2718 0.7041 -0.6561 +vn 0.2718 -0.7041 -0.6561 +vn 0.3189 0.5528 -0.7699 +vn 0.2142 -0.8286 -0.5172 +vn 0.3539 0.3805 -0.8544 +vn 0.1484 -0.9217 -0.3584 +vn 0.3754 0.1939 -0.9063 +vn 0.0769 -0.9796 -0.1857 +vn 0.3827 -0.0000 -0.9239 +vn 0.0769 0.9796 -0.1857 +vn 0.3754 -0.1939 -0.9063 +vn 0.1484 0.9217 -0.3584 +vn 0.3539 -0.3805 -0.8544 +vn 0.2142 0.8286 -0.5172 +vn 0.1117 -0.9796 -0.1671 +vn 0.5556 -0.0000 -0.8315 +vn 0.1117 0.9796 -0.1671 +vn 0.5450 -0.1939 -0.8157 +vn 0.2155 0.9217 -0.3225 +vn 0.5138 -0.3805 -0.7689 +vn 0.3110 0.8286 -0.4654 +vn 0.4630 -0.5528 -0.6929 +vn 0.3945 0.7041 -0.5905 +vn 0.3945 -0.7041 -0.5905 +vn 0.4630 0.5528 -0.6929 +vn 0.3110 -0.8286 -0.4654 +vn 0.5138 0.3805 -0.7689 +vn 0.2155 -0.9217 -0.3225 +vn 0.5450 0.1939 -0.8157 +vn 0.5021 -0.7041 -0.5021 +vn 0.5893 0.5528 -0.5893 +vn 0.3958 -0.8286 -0.3958 +vn 0.6539 0.3805 -0.6539 +vn 0.2743 -0.9217 -0.2743 +vn 0.6937 0.1939 -0.6937 +vn 0.1421 -0.9796 -0.1421 +vn 0.7071 -0.0000 -0.7071 +vn 0.1421 0.9796 -0.1421 +vn 0.6937 -0.1939 -0.6937 +vn 0.2743 0.9217 -0.2743 +vn 0.6539 -0.3805 -0.6539 +vn 0.3958 0.8286 -0.3958 +vn 0.5893 -0.5528 -0.5893 +vn 0.5021 0.7041 -0.5021 +vn 0.1671 0.9796 -0.1117 +vn 0.1671 -0.9796 -0.1117 +vn 0.8157 -0.1939 -0.5450 +vn 0.3225 0.9217 -0.2155 +vn 0.7689 -0.3805 -0.5138 +vn 0.4654 0.8286 -0.3110 +vn 0.6929 -0.5528 -0.4630 +vn 0.5905 0.7041 -0.3945 +vn 0.5905 -0.7041 -0.3945 +vn 0.6929 0.5528 -0.4630 +vn 0.4654 -0.8286 -0.3110 +vn 0.7689 0.3805 -0.5138 +vn 0.3225 -0.9217 -0.2155 +vn 0.8157 0.1939 -0.5450 +vn 0.8315 -0.0000 -0.5556 +vn 0.6561 0.7041 -0.2718 +vn 0.7699 0.5528 -0.3189 +vn 0.5172 -0.8286 -0.2142 +vn 0.8544 0.3805 -0.3539 +vn 0.3584 -0.9217 -0.1484 +vn 0.9063 0.1939 -0.3754 +vn 0.1857 -0.9796 -0.0769 +vn 0.9239 -0.0000 -0.3827 +vn 0.1857 0.9796 -0.0769 +vn 0.9063 -0.1939 -0.3754 +vn 0.3584 0.9217 -0.1484 +vn 0.8544 -0.3805 -0.3539 +vn 0.5172 0.8286 -0.2142 +vn 0.7699 -0.5528 -0.3189 +vn 0.6561 -0.7041 -0.2718 +vn 0.9622 -0.1939 -0.1914 +vn 0.1971 0.9796 -0.0392 +vn 0.3804 0.9217 -0.0757 +vn 0.9070 -0.3805 -0.1804 +vn 0.5490 0.8286 -0.1092 +vn 0.8173 -0.5528 -0.1626 +vn 0.6965 0.7041 -0.1385 +vn 0.6965 -0.7041 -0.1385 +vn 0.8173 0.5528 -0.1626 +vn 0.5490 -0.8286 -0.1092 +vn 0.9070 0.3805 -0.1804 +vn 0.3804 -0.9217 -0.0757 +vn 0.9622 0.1939 -0.1914 +vn 0.1971 -0.9796 -0.0392 +vn 0.9808 -0.0000 -0.1951 +vn 0.7101 -0.7041 -0.0000 +vn 0.5598 -0.8286 -0.0000 +vn 0.9248 0.3805 -0.0000 +vn 0.3879 -0.9217 -0.0000 +vn 0.9810 0.1939 -0.0000 +vn 0.2010 -0.9796 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn 0.2010 0.9796 -0.0000 +vn 0.9810 -0.1939 -0.0000 +vn 0.3879 0.9217 -0.0000 +vn 0.9248 -0.3805 -0.0000 +vn 0.5598 0.8286 -0.0000 +vn 0.8333 -0.5528 -0.0000 +vn 0.7101 0.7041 -0.0000 +vn 0.8333 0.5528 -0.0000 +vn 0.3804 0.9217 0.0757 +vn 0.9070 -0.3805 0.1804 +vn 0.5490 0.8286 0.1092 +vn 0.8173 -0.5528 0.1626 +vn 0.6965 0.7041 0.1385 +vn 0.6965 -0.7041 0.1385 +vn 0.8173 0.5528 0.1626 +vn 0.5490 -0.8286 0.1092 +vn 0.9070 0.3805 0.1804 +vn 0.3804 -0.9217 0.0757 +vn 0.9622 0.1939 0.1914 +vn 0.1971 -0.9796 0.0392 +vn 0.9808 -0.0000 0.1951 +vn 0.1971 0.9796 0.0392 +vn 0.9622 -0.1939 0.1914 +vn 0.8544 0.3805 0.3539 +vn 0.3584 -0.9217 0.1484 +vn 0.9063 0.1939 0.3754 +vn 0.1857 -0.9796 0.0769 +vn 0.9239 -0.0000 0.3827 +vn 0.1857 0.9796 0.0769 +vn 0.9063 -0.1939 0.3754 +vn 0.3584 0.9217 0.1484 +vn 0.8544 -0.3805 0.3539 +vn 0.5172 0.8286 0.2142 +vn 0.7699 -0.5528 0.3189 +vn 0.6561 0.7041 0.2718 +vn 0.6561 -0.7041 0.2718 +vn 0.7699 0.5528 0.3189 +vn 0.5172 -0.8286 0.2142 +vn 0.7689 -0.3805 0.5138 +vn 0.3225 0.9217 0.2155 +vn 0.4654 0.8286 0.3110 +vn 0.6929 -0.5528 0.4630 +vn 0.5905 0.7041 0.3945 +vn 0.5905 -0.7041 0.3945 +vn 0.6929 0.5528 0.4630 +vn 0.4654 -0.8286 0.3110 +vn 0.7689 0.3805 0.5138 +vn 0.3225 -0.9217 0.2155 +vn 0.8157 0.1939 0.5450 +vn 0.1671 -0.9796 0.1117 +vn 0.8315 -0.0000 0.5556 +vn 0.1671 0.9796 0.1117 +vn 0.8157 -0.1939 0.5450 +vn 0.3958 -0.8286 0.3958 +vn 0.2743 -0.9217 0.2743 +vn 0.6539 0.3805 0.6539 +vn 0.6937 0.1939 0.6937 +vn 0.1421 -0.9796 0.1421 +vn 0.7071 -0.0000 0.7071 +vn 0.1421 0.9796 0.1421 +vn 0.6937 -0.1939 0.6937 +vn 0.2743 0.9217 0.2743 +vn 0.6539 -0.3805 0.6539 +vn 0.3958 0.8286 0.3958 +vn 0.5893 -0.5528 0.5893 +vn 0.5021 0.7041 0.5021 +vn 0.5021 -0.7041 0.5021 +vn 0.5893 0.5528 0.5893 +vn 0.5138 -0.3805 0.7689 +vn 0.4630 -0.5528 0.6929 +vn 0.3945 0.7041 0.5905 +vn 0.3945 -0.7041 0.5905 +vn 0.4630 0.5528 0.6929 +vn 0.3110 -0.8286 0.4654 +vn 0.5138 0.3805 0.7689 +vn 0.2155 -0.9217 0.3225 +vn 0.5450 0.1939 0.8157 +vn 0.1117 -0.9796 0.1671 +vn 0.5556 -0.0000 0.8315 +vn 0.1117 0.9796 0.1671 +vn 0.5450 -0.1939 0.8157 +vn 0.2155 0.9217 0.3225 +vn 0.3110 0.8286 0.4654 +vn 0.0769 -0.9796 0.1857 +vn 0.3754 0.1939 0.9063 +vn 0.3827 -0.0000 0.9239 +vn 0.0769 0.9796 0.1857 +vn 0.3754 -0.1939 0.9063 +vn 0.1484 0.9217 0.3584 +vn 0.3539 -0.3805 0.8544 +vn 0.2142 0.8286 0.5172 +vn 0.3189 -0.5528 0.7699 +vn 0.2718 0.7041 0.6561 +vn 0.2718 -0.7041 0.6561 +vn 0.3189 0.5528 0.7699 +vn 0.2142 -0.8286 0.5172 +vn 0.3539 0.3805 0.8544 +vn 0.1484 -0.9217 0.3584 +vn 0.1385 0.7041 0.6965 +vn 0.1385 -0.7041 0.6965 +vn 0.1626 0.5528 0.8173 +vn 0.1092 -0.8286 0.5490 +vn 0.1804 0.3805 0.9070 +vn 0.0757 -0.9217 0.3804 +vn 0.1914 0.1939 0.9622 +vn 0.0392 -0.9796 0.1971 +vn 0.1951 -0.0000 0.9808 +vn 0.0392 0.9796 0.1971 +vn 0.1914 -0.1939 0.9622 +vn 0.0757 0.9217 0.3804 +vn 0.1804 -0.3805 0.9070 +vn 0.1092 0.8286 0.5490 +vn 0.1626 -0.5528 0.8173 +vn -0.0000 0.1939 0.9810 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 0.9796 0.2010 +vn -0.0000 -0.9796 0.2010 +vn -0.0000 -0.1939 0.9810 +vn -0.0000 0.9217 0.3879 +vn -0.0000 -0.3805 0.9248 +vn -0.0000 0.8286 0.5598 +vn -0.0000 -0.5528 0.8333 +vn -0.0000 0.7041 0.7101 +vn -0.0000 -0.7041 0.7101 +vn -0.0000 0.5528 0.8333 +vn -0.0000 -0.8286 0.5598 +vn -0.0000 0.3805 0.9248 +vn -0.0000 -0.9217 0.3879 +vn -0.1385 -0.7041 0.6965 +vn -0.1385 0.7041 0.6965 +vn -0.1626 0.5528 0.8173 +vn -0.1092 -0.8286 0.5490 +vn -0.1804 0.3805 0.9070 +vn -0.0757 -0.9217 0.3804 +vn -0.1914 0.1939 0.9622 +vn -0.0392 -0.9796 0.1971 +vn -0.1951 -0.0000 0.9808 +vn -0.0392 0.9796 0.1971 +vn -0.1914 -0.1939 0.9622 +vn -0.0757 0.9217 0.3804 +vn -0.1804 -0.3805 0.9070 +vn -0.1092 0.8286 0.5490 +vn -0.1626 -0.5528 0.8173 +vn -0.0769 0.9796 0.1857 +vn -0.0769 -0.9796 0.1857 +vn -0.3754 -0.1939 0.9063 +vn -0.1484 0.9217 0.3584 +vn -0.3539 -0.3805 0.8544 +vn -0.2142 0.8286 0.5172 +vn -0.3189 -0.5528 0.7699 +vn -0.2718 0.7041 0.6561 +vn -0.2718 -0.7041 0.6561 +vn -0.3189 0.5528 0.7699 +vn -0.2142 -0.8286 0.5172 +vn -0.3539 0.3805 0.8544 +vn -0.1484 -0.9217 0.3584 +vn -0.3754 0.1939 0.9063 +vn -0.3827 -0.0000 0.9239 +vn -0.3945 0.7041 0.5905 +vn -0.4630 0.5528 0.6929 +vn -0.3945 -0.7041 0.5905 +vn -0.3110 -0.8286 0.4654 +vn -0.5138 0.3805 0.7689 +vn -0.2155 -0.9217 0.3225 +vn -0.5450 0.1939 0.8157 +vn -0.1117 -0.9796 0.1671 +vn -0.5556 -0.0000 0.8315 +vn -0.1117 0.9796 0.1671 +vn -0.5450 -0.1939 0.8157 +vn -0.2155 0.9217 0.3225 +vn -0.5138 -0.3805 0.7689 +vn -0.3110 0.8286 0.4654 +vn -0.4630 -0.5528 0.6929 +vn -0.6937 -0.1939 0.6937 +vn -0.2743 0.9217 0.2743 +vn -0.6539 -0.3805 0.6539 +vn -0.3958 0.8286 0.3958 +vn -0.5893 -0.5528 0.5893 +vn -0.5021 0.7041 0.5021 +vn -0.5021 -0.7041 0.5021 +vn -0.5893 0.5528 0.5893 +vn -0.3958 -0.8286 0.3958 +vn -0.6539 0.3805 0.6539 +vn -0.2743 -0.9217 0.2743 +vn -0.6937 0.1939 0.6937 +vn -0.1421 -0.9796 0.1421 +vn -0.7071 -0.0000 0.7071 +vn -0.1421 0.9796 0.1421 +vn -0.5905 -0.7041 0.3945 +vn -0.4654 -0.8286 0.3110 +vn -0.7689 0.3805 0.5138 +vn -0.3225 -0.9217 0.2155 +vn -0.8157 0.1939 0.5450 +vn -0.1671 -0.9796 0.1117 +vn -0.8315 -0.0000 0.5556 +vn -0.1671 0.9796 0.1117 +vn -0.8157 -0.1939 0.5450 +vn -0.3225 0.9217 0.2155 +vn -0.7689 -0.3805 0.5138 +vn -0.4654 0.8286 0.3110 +vn -0.6929 -0.5528 0.4630 +vn -0.5905 0.7041 0.3945 +vn -0.6929 0.5528 0.4630 +vn -0.8544 -0.3805 0.3539 +vn -0.5172 0.8286 0.2142 +vn -0.7699 -0.5528 0.3189 +vn -0.6561 0.7041 0.2718 +vn -0.6561 -0.7041 0.2718 +vn -0.7699 0.5528 0.3189 +vn -0.5172 -0.8286 0.2142 +vn -0.8544 0.3805 0.3539 +vn -0.3584 -0.9217 0.1484 +vn -0.9063 0.1939 0.3754 +vn -0.1857 -0.9796 0.0769 +vn -0.9239 -0.0000 0.3827 +vn -0.1857 0.9796 0.0769 +vn -0.9063 -0.1939 0.3754 +vn -0.3584 0.9217 0.1484 +vn -0.3804 -0.9217 0.0757 +vn -0.9070 0.3805 0.1804 +vn -0.9622 0.1939 0.1914 +vn -0.1971 -0.9796 0.0392 +vn -0.9808 -0.0000 0.1951 +vn -0.1971 0.9796 0.0392 +vn -0.9622 -0.1939 0.1914 +vn -0.3804 0.9217 0.0757 +vn -0.9070 -0.3805 0.1804 +vn -0.5490 0.8286 0.1092 +vn -0.8173 -0.5528 0.1626 +vn -0.6965 0.7041 0.1385 +vn -0.6965 -0.7041 0.1385 +vn -0.8173 0.5528 0.1626 +vn -0.5490 -0.8286 0.1092 +vn -0.3879 0.9217 -0.0000 +vn -0.5598 0.8286 -0.0000 +vn -0.9248 -0.3805 -0.0000 +vn -0.8333 -0.5528 -0.0000 +vn -0.7101 0.7041 -0.0000 +vn -0.7101 -0.7041 -0.0000 +vn -0.8333 0.5528 -0.0000 +vn -0.5598 -0.8286 -0.0000 +vn -0.9248 0.3805 -0.0000 +vn -0.3879 -0.9217 -0.0000 +vn -0.9810 0.1939 -0.0000 +vn -0.2010 -0.9796 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.2010 0.9796 -0.0000 +vn -0.9810 -0.1939 -0.0000 +vn -0.9070 0.3805 -0.1804 +vn -0.9622 0.1939 -0.1914 +vn -0.1971 -0.9796 -0.0392 +vn -0.9808 -0.0000 -0.1951 +vn -0.1971 0.9796 -0.0392 +vn -0.9622 -0.1939 -0.1914 +vn -0.3804 0.9217 -0.0757 +vn -0.9070 -0.3805 -0.1804 +vn -0.5490 0.8286 -0.1092 +vn -0.8173 -0.5528 -0.1626 +vn -0.6965 0.7041 -0.1385 +vn -0.6965 -0.7041 -0.1385 +vn -0.8173 0.5528 -0.1626 +vn -0.5490 -0.8286 -0.1092 +vn -0.3804 -0.9217 -0.0757 +vn -0.8544 -0.3805 -0.3539 +vn -0.7699 -0.5528 -0.3189 +vn -0.6561 0.7041 -0.2718 +vn -0.6561 -0.7041 -0.2718 +vn -0.7699 0.5528 -0.3189 +vn -0.5172 -0.8286 -0.2142 +vn -0.8544 0.3805 -0.3539 +vn -0.3584 -0.9217 -0.1484 +vn -0.9063 0.1939 -0.3754 +vn -0.1857 -0.9796 -0.0769 +vn -0.9239 -0.0000 -0.3827 +vn -0.1857 0.9796 -0.0769 +vn -0.9063 -0.1939 -0.3754 +vn -0.3584 0.9217 -0.1484 +vn -0.5172 0.8286 -0.2142 +vn -0.1671 -0.9796 -0.1117 +vn -0.8157 0.1939 -0.5450 +vn -0.8315 -0.0000 -0.5556 +vn -0.1671 0.9796 -0.1117 +vn -0.8157 -0.1939 -0.5450 +vn -0.3225 0.9217 -0.2155 +vn -0.7689 -0.3805 -0.5138 +vn -0.4654 0.8286 -0.3110 +vn -0.6929 -0.5528 -0.4630 +vn -0.5905 0.7041 -0.3945 +vn -0.5905 -0.7041 -0.3945 +vn -0.6929 0.5528 -0.4630 +vn -0.4654 -0.8286 -0.3110 +vn -0.7689 0.3805 -0.5138 +vn -0.3225 -0.9217 -0.2155 +vn -0.5021 0.7041 -0.5021 +vn -0.5021 -0.7041 -0.5021 +vn -0.5893 0.5528 -0.5893 +vn -0.3958 -0.8286 -0.3958 +vn -0.6539 0.3805 -0.6539 +vn -0.2743 -0.9217 -0.2743 +vn -0.6937 0.1939 -0.6937 +vn -0.1421 -0.9796 -0.1421 +vn -0.7071 -0.0000 -0.7071 +vn -0.1421 0.9796 -0.1421 +vn -0.6937 -0.1939 -0.6937 +vn -0.2743 0.9217 -0.2743 +vn -0.6539 -0.3805 -0.6539 +vn -0.3958 0.8286 -0.3958 +vn -0.5893 -0.5528 -0.5893 +vn -0.5450 0.1939 -0.8157 +vn -0.5556 -0.0000 -0.8315 +vn -0.1117 0.9796 -0.1671 +vn -0.1117 -0.9796 -0.1671 +vn -0.5450 -0.1939 -0.8157 +vn -0.2155 0.9217 -0.3225 +vn -0.5138 -0.3805 -0.7689 +vn -0.3110 0.8286 -0.4654 +vn -0.4630 -0.5528 -0.6929 +vn -0.3945 0.7041 -0.5905 +vn -0.3945 -0.7041 -0.5905 +vn -0.4630 0.5528 -0.6929 +vn -0.3110 -0.8286 -0.4654 +vn -0.5138 0.3805 -0.7689 +vn -0.2155 -0.9217 -0.3225 +vn -0.2718 -0.7041 -0.6561 +vn -0.2718 0.7041 -0.6561 +vn -0.3189 0.5528 -0.7699 +vn -0.2142 -0.8286 -0.5172 +vn -0.3539 0.3805 -0.8544 +vn -0.1484 -0.9217 -0.3584 +vn -0.3754 0.1939 -0.9063 +vn -0.0769 -0.9796 -0.1857 +vn -0.3827 -0.0000 -0.9239 +vn -0.0769 0.9796 -0.1857 +vn -0.3754 -0.1939 -0.9063 +vn -0.1484 0.9217 -0.3584 +vn -0.3539 -0.3805 -0.8544 +vn -0.2142 0.8286 -0.5172 +vn -0.3189 -0.5528 -0.7699 +vn -0.0392 -0.9796 -0.1971 +vn -0.1914 -0.1939 -0.9622 +vn -0.0757 0.9217 -0.3804 +vn -0.1804 -0.3805 -0.9070 +vn -0.1092 0.8286 -0.5490 +vn -0.1626 -0.5528 -0.8173 +vn -0.1385 0.7041 -0.6965 +vn -0.1385 -0.7041 -0.6965 +vn -0.1626 0.5528 -0.8173 +vn -0.1092 -0.8286 -0.5490 +vn -0.1804 0.3805 -0.9070 +vn -0.0757 -0.9217 -0.3804 +vn -0.1914 0.1939 -0.9622 +vn -0.1951 -0.0000 -0.9808 +vn -0.0392 0.9796 -0.1971 +vn -0.0000 0.6857 -0.7279 +vn 0.1420 -0.6857 -0.7139 +vn -0.0000 -0.6857 -0.7279 +vn 0.1420 0.6857 -0.7139 +vn 0.2786 -0.6857 -0.6725 +vn 0.2786 0.6857 -0.6725 +vn 0.4044 -0.6857 -0.6052 +vn 0.4044 0.6857 -0.6052 +vn 0.5147 -0.6857 -0.5147 +vn 0.5147 0.6857 -0.5147 +vn 0.6052 -0.6857 -0.4044 +vn 0.6052 0.6857 -0.4044 +vn 0.6725 -0.6857 -0.2785 +vn 0.6725 0.6857 -0.2786 +vn 0.7139 -0.6857 -0.1420 +vn 0.7139 0.6857 -0.1420 +vn 0.7279 -0.6857 -0.0000 +vn 0.7279 0.6857 -0.0000 +vn 0.7139 -0.6857 0.1420 +vn 0.7139 0.6857 0.1420 +vn 0.6725 -0.6857 0.2785 +vn 0.6725 0.6857 0.2786 +vn 0.6052 -0.6857 0.4044 +vn 0.6052 0.6857 0.4044 +vn 0.5147 -0.6857 0.5147 +vn 0.5147 0.6857 0.5147 +vn 0.4044 -0.6857 0.6052 +vn 0.4044 0.6857 0.6052 +vn 0.2786 -0.6857 0.6725 +vn 0.2785 0.6857 0.6725 +vn 0.1420 -0.6857 0.7139 +vn 0.1420 0.6857 0.7139 +vn -0.0000 -0.6857 0.7279 +vn -0.0000 0.6857 0.7279 +vn -0.1420 -0.6857 0.7139 +vn -0.1420 0.6857 0.7139 +vn -0.2786 -0.6857 0.6725 +vn -0.2786 0.6857 0.6725 +vn -0.4044 -0.6857 0.6052 +vn -0.4044 0.6857 0.6052 +vn -0.5147 -0.6857 0.5147 +vn -0.5147 0.6857 0.5147 +vn -0.6052 -0.6857 0.4044 +vn -0.6052 0.6857 0.4044 +vn -0.6725 -0.6857 0.2785 +vn -0.6725 0.6857 0.2786 +vn -0.7139 -0.6857 0.1420 +vn -0.7139 0.6857 0.1420 +vn -0.7279 -0.6857 -0.0000 +vn -0.7279 0.6857 -0.0000 +vn -0.7139 -0.6857 -0.1420 +vn -0.7139 0.6857 -0.1420 +vn -0.6725 -0.6857 -0.2785 +vn -0.6725 0.6857 -0.2786 +vn -0.6052 -0.6857 -0.4044 +vn -0.6052 0.6857 -0.4044 +vn -0.5147 -0.6857 -0.5147 +vn -0.5147 0.6857 -0.5147 +vn -0.4044 -0.6857 -0.6052 +vn -0.4044 0.6857 -0.6052 +vn -0.2786 -0.6857 -0.6725 +vn 0.6705 0.7298 0.1334 +vn -0.2785 0.6857 -0.6725 +vn -0.1420 -0.6857 -0.7139 +vn -0.1420 0.6857 -0.7139 +vn -0.6705 0.7298 0.1334 +vn -1.0000 0.0005 -0.0004 +vn -0.6836 0.7298 -0.0000 +vn -0.2616 0.7298 0.6316 +vn -0.5684 0.7298 -0.3798 +vn 0.5684 0.7298 -0.3798 +vn 0.2616 0.7298 0.6316 +vn 0.1334 0.7298 -0.6705 +vn -0.0000 0.7298 -0.6836 +vn 0.6316 0.7298 0.2616 +vn -0.3798 0.7298 0.5684 +vn -0.4834 0.7298 -0.4834 +vn 0.6316 0.7298 -0.2616 +vn 0.1334 0.7298 0.6705 +vn 0.2616 0.7298 -0.6316 +vn 0.5684 0.7298 0.3798 +vn -0.4834 0.7298 0.4834 +vn -0.3798 0.7298 -0.5684 +vn 0.6705 0.7298 -0.1334 +vn -0.0000 0.7298 0.6836 +vn -0.6705 0.7298 -0.1334 +vn 0.3798 0.7298 -0.5684 +vn 0.4834 0.7298 0.4834 +vn -0.5684 0.7298 0.3798 +vn -0.2616 0.7298 -0.6316 +vn 0.6836 0.7298 -0.0000 +vn -0.1334 0.7298 0.6705 +vn -0.6316 0.7298 -0.2616 +vn 0.4834 0.7298 -0.4834 +vn 0.3798 0.7298 0.5684 +vn -0.6316 0.7298 0.2616 +vn -0.1334 0.7298 -0.6705 +vn -0.9222 0.0144 -0.3866 +vn -0.5309 0.5769 -0.6207 +vn -0.8276 0.0311 -0.5605 +vn 0.8302 0.0125 0.5574 +vn -0.9804 0.0044 -0.1972 +vn 0.7054 0.0197 0.7086 +vn 0.5537 0.0264 0.8323 +vn 0.3811 0.0319 0.9240 +vn 0.1910 0.1169 -0.9746 +vn -0.7006 0.0536 -0.7116 +vn 0.1941 0.0357 0.9803 +vn 0.3750 0.1017 -0.9214 +vn -0.5473 0.0787 -0.8333 +vn -0.0000 0.0370 0.9993 +vn 0.5473 0.0787 -0.8333 +vn -0.3750 0.1017 -0.9214 +vn -0.1941 0.0357 0.9803 +vn 0.7006 0.0536 -0.7116 +vn -0.1910 0.1169 -0.9746 +vn -0.3811 0.0319 0.9240 +vn 0.8276 0.0311 -0.5605 +vn -0.0000 0.1220 -0.9925 +vn -0.5537 0.0264 0.8323 +vn 0.9222 0.0144 -0.3866 +vn -0.7054 0.0197 0.7086 +vn 0.9804 0.0044 -0.1972 +vn -0.8302 0.0125 0.5574 +vn 1.0000 0.0005 -0.0004 +vn -0.9232 0.0061 0.3843 +vn 0.9806 0.0016 0.1960 +vn -0.9806 0.0016 0.1960 +vn 0.9232 0.0061 0.3843 +vn 0.3143 0.5889 -0.7446 +vn -0.2830 0.8976 0.3380 +vn -0.4078 0.8724 0.2694 +vn 0.4490 0.8024 0.3930 +vn 0.3116 0.8256 0.4705 +vn -0.0000 0.6209 -0.7839 +vn 0.1005 0.6155 -0.7817 +vn -0.4256 0.5789 -0.6955 +vn 0.1594 0.8401 0.5185 +vn 0.2045 0.6028 -0.7712 +vn -0.3143 0.5889 -0.7446 +vn -0.0000 0.8450 0.5348 +vn -0.2045 0.6028 -0.7712 +vn -0.1594 0.8401 0.5185 +vn 0.4256 0.5789 -0.6955 +vn -0.1005 0.6155 -0.7817 +vn -0.3116 0.8256 0.4705 +vn 0.5309 0.5769 -0.6207 +vn -0.4490 0.8024 0.3930 +vn 0.6219 0.5849 -0.5208 +vn -0.5654 0.7722 0.2900 +vn 0.6907 0.6029 -0.3993 +vn -0.6551 0.7371 0.1662 +vn 0.7312 0.6297 -0.2624 +vn -0.7139 0.6996 0.0281 +vn 0.7395 0.6629 -0.1174 +vn -0.7395 0.6629 -0.1174 +vn 0.7139 0.6996 0.0281 +vn -0.7312 0.6297 -0.2624 +vn 0.6551 0.7371 0.1662 +vn -0.6907 0.6029 -0.3993 +vn 0.5654 0.7722 0.2900 +vn -0.6219 0.5849 -0.5208 +vn -0.5964 0.7996 0.0701 +vn -0.6885 0.7252 -0.0056 +vn -0.6529 0.7557 -0.0505 +vn 0.2830 0.8976 0.3380 +vn 0.1214 0.4573 -0.8810 +vn -0.5137 0.8392 0.1785 +vn 0.1449 0.9133 0.3807 +vn 0.2394 0.4681 -0.8506 +vn -0.0000 0.9186 0.3952 +vn 0.3508 0.4860 -0.8005 +vn 0.4519 0.5106 -0.7315 +vn -0.6818 0.7097 -0.1775 +vn 0.5392 0.5414 -0.6451 +vn -0.6831 0.6635 -0.3053 +vn 0.6091 0.5779 -0.5432 +vn -0.6580 0.6190 -0.4287 +vn 0.6580 0.6190 -0.4287 +vn -0.6091 0.5779 -0.5432 +vn 0.6831 0.6635 -0.3053 +vn -0.5392 0.5414 -0.6451 +vn 0.6818 0.7097 -0.1775 +vn -0.4519 0.5106 -0.7315 +vn 0.6529 0.7557 -0.0505 +vn -0.3508 0.4860 -0.8005 +vn 0.5964 0.7996 0.0701 +vn -0.2394 0.4681 -0.8506 +vn -0.1449 0.9133 0.3807 +vn 0.5137 0.8392 0.1785 +vn -0.1214 0.4573 -0.8810 +vn 0.4078 0.8724 0.2694 +vn -0.0000 0.4537 -0.8911 +vn 0.2618 0.4140 -0.8718 +vn -0.6565 0.5354 -0.5314 +vn -0.2936 0.8712 0.3935 +vn 0.3826 0.4340 -0.8157 +vn 0.4913 0.4613 -0.7388 +vn -0.7229 0.6768 -0.1389 +vn 0.5839 0.4954 -0.6431 +vn -0.7284 0.6278 -0.2746 +vn 0.6565 0.5354 -0.5314 +vn -0.7056 0.5800 -0.4071 +vn 0.7056 0.5800 -0.4071 +vn 0.7284 0.6278 -0.2746 +vn -0.5839 0.4954 -0.6431 +vn 0.7229 0.6768 -0.1389 +vn -0.4913 0.4613 -0.7388 +vn 0.6885 0.7252 -0.0056 +vn -0.3826 0.4340 -0.8157 +vn 0.6257 0.7709 0.1197 +vn -0.2618 0.4140 -0.8718 +vn -0.1501 0.8870 0.4366 +vn 0.5365 0.8116 0.2312 +vn -0.1329 0.4019 -0.9060 +vn 0.4243 0.8456 0.3239 +vn -0.0000 0.3978 -0.9175 +vn -0.4243 0.8456 0.3239 +vn 0.2936 0.8712 0.3935 +vn 0.1329 0.4019 -0.9060 +vn -0.5365 0.8116 0.2312 +vn 0.1501 0.8870 0.4366 +vn -0.6257 0.7709 0.1197 +vn -0.0000 0.8924 0.4512 +vt 0.255776 0.893830 +vt 0.274100 0.908809 +vt 0.012026 0.868765 +vt 0.040471 0.876350 +vt 0.055895 0.877327 +vt 0.720684 0.908254 +vt 0.071338 0.876352 +vt 0.719510 0.923717 +vt 0.099927 0.868771 +vt 0.710322 0.952694 +vt 0.007836 0.899193 +vt 0.234653 0.872673 +vt 0.248019 0.879859 +vt 0.260552 0.886659 +vt 0.271772 0.892810 +vt 0.000050 0.853390 +vt 0.281247 0.898077 +vt 0.011969 0.858114 +vt 0.025596 0.861624 +vt 0.040405 0.863787 +vt 0.055827 0.864518 +vt 0.071271 0.863789 +vt 0.086143 0.861629 +vt 0.099871 0.858121 +vt 0.111927 0.853399 +vt 0.023261 0.898667 +vt 0.030257 0.908402 +vt 0.038239 0.919508 +vt 0.046900 0.931559 +vt 0.235808 0.869878 +vt 0.250284 0.874376 +vt 0.263842 0.878698 +vt 0.275959 0.882678 +vt 0.000017 0.843300 +vt 0.011931 0.846250 +vt 0.025552 0.848442 +vt 0.040359 0.849792 +vt 0.055781 0.850249 +vt 0.071226 0.849794 +vt 0.086100 0.848446 +vt 0.099832 0.846256 +vt 0.111894 0.843309 +vt 0.032750 0.893171 +vt 0.037713 0.904083 +vt 0.043375 0.916534 +vt 0.049518 0.930043 +vt 0.236397 0.866913 +vt 0.251440 0.868560 +vt 0.265519 0.870255 +vt 0.278093 0.871931 +vt 0.000000 0.832566 +vt 0.011911 0.833628 +vt 0.025530 0.834417 +vt 0.040335 0.834903 +vt 0.055757 0.835069 +vt 0.071202 0.834906 +vt 0.086078 0.834422 +vt 0.099812 0.833635 +vt 0.111877 0.832575 +vt 0.043129 0.889631 +vt 0.045868 0.901302 +vt 0.048992 0.914618 +vt 0.052382 0.929067 +vt 0.236397 0.863892 +vt 0.251440 0.862634 +vt 0.265519 0.861652 +vt 0.278093 0.860982 +vt 0.000000 0.821601 +vt 0.011911 0.820734 +vt 0.025530 0.820090 +vt 0.040335 0.819694 +vt 0.055757 0.819561 +vt 0.071202 0.819696 +vt 0.086078 0.820094 +vt 0.099812 0.820740 +vt 0.111877 0.821609 +vt 0.054000 0.888185 +vt 0.054408 0.900166 +vt 0.054875 0.913835 +vt 0.055381 0.928667 +vt 0.235808 0.860931 +vt 0.250284 0.856827 +vt 0.263842 0.853221 +vt 0.275959 0.850252 +vt 0.000017 0.810825 +vt 0.011931 0.808062 +vt 0.025552 0.806010 +vt 0.040359 0.804747 +vt 0.055781 0.804321 +vt 0.071226 0.804749 +vt 0.086100 0.806015 +vt 0.099832 0.808069 +vt 0.111894 0.810833 +vt 0.064943 0.888887 +vt 0.063007 0.900718 +vt 0.060798 0.914215 +vt 0.058401 0.928861 +vt 0.220970 0.865376 +vt 0.234653 0.858145 +vt 0.248019 0.851361 +vt 0.260552 0.845286 +vt 0.000050 0.800652 +vt 0.271772 0.840153 +vt 0.281247 0.836158 +vt 0.011969 0.796101 +vt 0.025596 0.792719 +vt 0.040405 0.790638 +vt 0.055827 0.789935 +vt 0.071271 0.790640 +vt 0.086143 0.792724 +vt 0.099871 0.796108 +vt 0.111927 0.800661 +vt 0.075540 0.891710 +vt 0.071333 0.902936 +vt 0.066532 0.915743 +vt 0.061324 0.929640 +vt 0.232976 0.855639 +vt 0.244729 0.846447 +vt 0.255776 0.838151 +vt 0.265694 0.831072 +vt 0.012026 0.785309 +vt 0.274100 0.825481 +vt 0.025658 0.780728 +vt 0.040471 0.777908 +vt 0.055895 0.776956 +vt 0.071338 0.777910 +vt 0.086206 0.780733 +vt 0.099927 0.785316 +vt 0.090566 0.888185 +vt 0.111975 0.791483 +vt 0.085382 0.896547 +vt 0.079065 0.906736 +vt 0.071859 0.918361 +vt 0.064040 0.930975 +vt 0.230842 0.853512 +vt 0.240542 0.842273 +vt 0.249698 0.832092 +vt 0.257958 0.823360 +vt 0.377178 0.923411 +vt 0.265003 0.816412 +vt 0.012098 0.776102 +vt 0.383911 0.911207 +vt 0.025738 0.770498 +vt 0.388920 0.897372 +vt 0.040556 0.767047 +vt 0.392011 0.882437 +vt 0.055982 0.765883 +vt 0.393065 0.866977 +vt 0.071423 0.767050 +vt 0.392043 0.851585 +vt 0.086285 0.770502 +vt 0.388984 0.836853 +vt 0.099999 0.776109 +vt 0.384005 0.823348 +vt 0.100807 0.896020 +vt 0.094091 0.903210 +vt 0.085908 0.911972 +vt 0.076572 0.921967 +vt 0.066442 0.932813 +vt 0.228332 0.851843 +vt 0.235619 0.839000 +vt 0.242551 0.827340 +vt 0.248861 0.817311 +vt 0.368473 0.923189 +vt 0.373676 0.910946 +vt 0.377546 0.897083 +vt 0.379937 0.882130 +vt 0.380755 0.866664 +vt 0.379970 0.851278 +vt 0.377611 0.836564 +vt 0.109322 0.905703 +vt 0.373769 0.823087 +vt 0.368592 0.811365 +vt 0.101333 0.911445 +vt 0.091598 0.918442 +vt 0.080492 0.926424 +vt 0.068440 0.935085 +vt 0.225543 0.850698 +vt 0.230149 0.836753 +vt 0.234609 0.824078 +vt 0.238753 0.813160 +vt 0.358635 0.923025 +vt 0.362107 0.910753 +vt 0.364692 0.896868 +vt 0.366290 0.881902 +vt 0.366841 0.866431 +vt 0.366323 0.851050 +vt 0.364756 0.836349 +vt 0.362200 0.822894 +vt 0.358754 0.811201 +vt 0.106829 0.920935 +vt 0.095917 0.925897 +vt 0.083466 0.931559 +vt 0.069957 0.937703 +vt 0.222583 0.850120 +vt 0.224342 0.835619 +vt 0.226178 0.822432 +vt 0.228023 0.811065 +vt 0.348040 0.922923 +vt 0.349649 0.910634 +vt 0.350849 0.896735 +vt 0.351595 0.881761 +vt 0.351858 0.866288 +vt 0.351628 0.850909 +vt 0.350914 0.836217 +vt 0.349742 0.822775 +vt 0.348159 0.811099 +vt 0.110369 0.931314 +vt 0.098698 0.934052 +vt 0.085382 0.937177 +vt 0.070933 0.940567 +vt 0.219564 0.850131 +vt 0.218421 0.835642 +vt 0.217582 0.822465 +vt 0.217082 0.811107 +vt 0.337097 0.922889 +vt 0.336781 0.910594 +vt 0.336551 0.896691 +vt 0.336417 0.881714 +vt 0.336382 0.866240 +vt 0.336449 0.850862 +vt 0.336616 0.836172 +vt 0.336874 0.822734 +vt 0.337216 0.811065 +vt 0.111815 0.942184 +vt 0.099834 0.942593 +vt 0.086165 0.943060 +vt 0.071333 0.943566 +vt 0.216604 0.850732 +vt 0.212613 0.836820 +vt 0.209152 0.824176 +vt 0.206352 0.813284 +vt 0.326225 0.922923 +vt 0.323997 0.910634 +vt 0.322347 0.896735 +vt 0.321338 0.881761 +vt 0.321008 0.866288 +vt 0.321370 0.850909 +vt 0.322412 0.836217 +vt 0.324091 0.822775 +vt 0.326344 0.811099 +vt 0.111113 0.953128 +vt 0.099282 0.951192 +vt 0.085785 0.948982 +vt 0.071139 0.946585 +vt 0.213815 0.851899 +vt 0.207143 0.839109 +vt 0.201210 0.827498 +vt 0.196244 0.817513 +vt 0.315844 0.923025 +vt 0.311790 0.910753 +vt 0.308783 0.896868 +vt 0.306938 0.881902 +vt 0.306326 0.866431 +vt 0.306970 0.851050 +vt 0.308847 0.836349 +vt 0.311883 0.822894 +vt 0.315963 0.811201 +vt 0.108290 0.963724 +vt 0.097064 0.959517 +vt 0.084257 0.954717 +vt 0.070360 0.949509 +vt 0.211305 0.853586 +vt 0.202220 0.842420 +vt 0.194063 0.832305 +vt 0.187147 0.823631 +vt 0.306350 0.923189 +vt 0.300627 0.910946 +vt 0.296379 0.897083 +vt 0.293770 0.882130 +vt 0.292900 0.866664 +vt 0.293803 0.851278 +vt 0.296444 0.836564 +vt 0.300721 0.823087 +vt 0.111815 0.978750 +vt 0.306470 0.811365 +vt 0.103453 0.973566 +vt 0.093264 0.967250 +vt 0.081639 0.960044 +vt 0.069025 0.952224 +vt 0.209171 0.855731 +vt 0.198033 0.846626 +vt 0.187984 0.838411 +vt 0.179411 0.831403 +vt 0.298111 0.923411 +vt 0.907659 0.930785 +vt 0.290938 0.911207 +vt 0.914832 0.918582 +vt 0.285613 0.897372 +vt 0.920157 0.904747 +vt 0.282341 0.882437 +vt 0.923429 0.889812 +vt 0.281247 0.866977 +vt 0.924523 0.874352 +vt 0.282374 0.851585 +vt 0.923396 0.858960 +vt 0.285678 0.836853 +vt 0.920092 0.844228 +vt 0.291032 0.823348 +vt 0.103980 0.988991 +vt 0.914738 0.830722 +vt 0.096790 0.982276 +vt 0.088028 0.974093 +vt 0.078033 0.964757 +vt 0.067187 0.954627 +vt 0.207494 0.858249 +vt 0.194744 0.851565 +vt 0.183209 0.845582 +vt 0.173333 0.840530 +vt 0.899419 0.930564 +vt 0.905143 0.918321 +vt 0.909391 0.904458 +vt 0.912000 0.889505 +vt 0.912870 0.874039 +vt 0.911967 0.858653 +vt 0.909326 0.843939 +vt 0.094297 0.997507 +vt 0.905049 0.830462 +vt 0.899300 0.818740 +vt 0.088555 0.989518 +vt 0.081558 0.979783 +vt 0.073576 0.968676 +vt 0.064915 0.956625 +vt 0.206339 0.861044 +vt 0.192478 0.857049 +vt 0.179919 0.853543 +vt 0.169146 0.850661 +vt 0.889926 0.930399 +vt 0.893980 0.918128 +vt 0.896987 0.904243 +vt 0.898832 0.889277 +vt 0.899444 0.873806 +vt 0.898799 0.858425 +vt 0.896923 0.843724 +vt 0.893887 0.830269 +vt 0.889807 0.818576 +vt 0.079065 0.995014 +vt 0.074103 0.984101 +vt 0.068440 0.971651 +vt 0.062297 0.958142 +vt 0.205750 0.864009 +vt 0.191323 0.862865 +vt 0.178242 0.861986 +vt 0.167012 0.861408 +vt 0.879544 0.930298 +vt 0.881772 0.918009 +vt 0.883423 0.904110 +vt 0.884432 0.889136 +vt 0.884762 0.873663 +vt 0.884400 0.858284 +vt 0.883358 0.843592 +vt 0.881679 0.830149 +vt 0.879425 0.818474 +vt 0.068686 0.998554 +vt 0.065948 0.986882 +vt 0.062823 0.973566 +vt 0.059433 0.959118 +vt 0.205750 0.867030 +vt 0.191323 0.868790 +vt 0.178242 0.870589 +vt 0.167012 0.872357 +vt 0.868673 0.930264 +vt 0.868989 0.917969 +vt 0.869219 0.904065 +vt 0.869353 0.889089 +vt 0.869388 0.873614 +vt 0.869321 0.858237 +vt 0.869154 0.843547 +vt 0.868896 0.830109 +vt 0.868554 0.818440 +vt 0.057816 1.000000 +vt 0.057407 0.988019 +vt 0.056940 0.974349 +vt 0.056434 0.959517 +vt 0.055908 0.944092 +vt 0.206339 0.869990 +vt 0.192478 0.874597 +vt 0.179919 0.879020 +vt 0.169146 0.883088 +vt 0.857730 0.930298 +vt 0.856121 0.918009 +vt 0.854921 0.904110 +vt 0.854175 0.889136 +vt 0.853912 0.873663 +vt 0.854142 0.858284 +vt 0.854856 0.843592 +vt 0.856028 0.830149 +vt 0.857611 0.818474 +vt 0.046872 0.999298 +vt 0.048808 0.987467 +vt 0.051018 0.973969 +vt 0.053415 0.959324 +vt 0.207494 0.872777 +vt 0.194744 0.880063 +vt 0.183209 0.886955 +vt 0.173333 0.893187 +vt 0.847135 0.930399 +vt 0.843663 0.918128 +vt 0.841078 0.904243 +vt 0.839480 0.889277 +vt 0.838929 0.873806 +vt 0.839447 0.858425 +vt 0.841014 0.843724 +vt 0.843570 0.830269 +vt 0.847016 0.818576 +vt 0.036276 0.996474 +vt 0.040483 0.985249 +vt 0.045283 0.972441 +vt 0.050491 0.958544 +vt 0.209171 0.875282 +vt 0.198033 0.884978 +vt 0.187984 0.894089 +vt 0.179411 0.902268 +vt 0.837297 0.930564 +vt 0.832094 0.918321 +vt 0.828224 0.904458 +vt 0.825833 0.889505 +vt 0.825015 0.874039 +vt 0.825800 0.858653 +vt 0.828159 0.843939 +vt 0.832001 0.830462 +vt 0.021250 1.000000 +vt 0.837178 0.818740 +vt 0.026433 0.991638 +vt 0.032750 0.981449 +vt 0.039956 0.969824 +vt 0.047776 0.957210 +vt 0.211305 0.877410 +vt 0.202220 0.889152 +vt 0.194063 0.900149 +vt 0.828592 0.930785 +vt 0.187147 0.909980 +vt 0.821859 0.918582 +vt 0.181739 0.918267 +vt 0.617780 0.864365 +vt 0.816850 0.904747 +vt 0.613212 0.877609 +vt 0.813759 0.889812 +vt 0.610404 0.892167 +vt 0.812705 0.874352 +vt 0.609463 0.907479 +vt 0.813727 0.858960 +vt 0.610427 0.922957 +vt 0.816786 0.844228 +vt 0.613257 0.938007 +vt 0.821765 0.830722 +vt 0.011009 0.992164 +vt 0.617845 0.952049 +vt 0.624016 0.964545 +vt 0.017724 0.984974 +vt 0.025907 0.976213 +vt 0.035243 0.966217 +vt 0.045373 0.955372 +vt 0.213815 0.879079 +vt 0.207143 0.892425 +vt 0.201210 0.904901 +vt 0.196244 0.916028 +vt 0.633114 0.852514 +vt 0.192436 0.925378 +vt 0.628576 0.863859 +vt 0.625208 0.877047 +vt 0.623139 0.891570 +vt 0.622448 0.906870 +vt 0.623162 0.922360 +vt 0.625253 0.937445 +vt 0.628642 0.951543 +vt 0.633197 0.964115 +vt 0.010482 0.976739 +vt 0.020217 0.969743 +vt 0.031324 0.961761 +vt 0.043375 0.953100 +vt 0.216604 0.880224 +vt 0.212613 0.894671 +vt 0.209152 0.908163 +vt 0.206352 0.920179 +vt 0.643289 0.852217 +vt 0.640541 0.863510 +vt 0.638502 0.876659 +vt 0.637252 0.891158 +vt 0.636837 0.906451 +vt 0.637275 0.921949 +vt 0.638547 0.937057 +vt 0.640606 0.951195 +vt 0.643372 0.963818 +vt 0.004986 0.967250 +vt 0.015899 0.962287 +vt 0.028349 0.956625 +vt 0.041858 0.950482 +vt 0.219564 0.880802 +vt 0.218421 0.895805 +vt 0.217582 0.909809 +vt 0.217082 0.922274 +vt 0.654066 0.852066 +vt 0.653214 0.863333 +vt 0.652584 0.876462 +vt 0.652200 0.890949 +vt 0.652079 0.906237 +vt 0.652223 0.921739 +vt 0.652629 0.936860 +vt 0.653279 0.951017 +vt 0.654149 0.963667 +vt 0.001446 0.956871 +vt 0.013118 0.954132 +vt 0.026433 0.951008 +vt 0.040882 0.947618 +vt 0.222583 0.880791 +vt 0.224342 0.895782 +vt 0.226178 0.909776 +vt 0.228023 0.922232 +vt 0.665032 0.852066 +vt 0.666108 0.863333 +vt 0.666911 0.876462 +vt 0.667410 0.890949 +vt 0.667586 0.906237 +vt 0.667433 0.921739 +vt 0.666956 0.936860 +vt 0.666173 0.951017 +vt 0.665115 0.963667 +vt 0.000000 0.946000 +vt 0.011981 0.945591 +vt 0.025651 0.945125 +vt 0.040483 0.944619 +vt 0.225543 0.880190 +vt 0.230149 0.894604 +vt 0.234609 0.908065 +vt 0.675764 0.852217 +vt 0.238753 0.920055 +vt 0.242421 0.930114 +vt 0.678728 0.863510 +vt 0.680933 0.876659 +vt 0.682296 0.891158 +vt 0.682764 0.906451 +vt 0.682319 0.921949 +vt 0.680978 0.937057 +vt 0.678793 0.951195 +vt 0.675847 0.963818 +vt 0.000702 0.935057 +vt 0.012533 0.936993 +vt 0.026031 0.939202 +vt 0.040676 0.941599 +vt 0.228332 0.879023 +vt 0.235619 0.892316 +vt 0.242551 0.904743 +vt 0.248861 0.915826 +vt 0.254307 0.925141 +vt 0.690589 0.863859 +vt 0.694112 0.877047 +vt 0.696287 0.891570 +vt 0.697029 0.906870 +vt 0.696310 0.922360 +vt 0.694157 0.937445 +vt 0.690654 0.951543 +vt 0.685934 0.964115 +vt 0.003526 0.924460 +vt 0.014751 0.928667 +vt 0.027559 0.933468 +vt 0.041455 0.938676 +vt 0.230842 0.877335 +vt 0.240542 0.889005 +vt 0.249698 0.899936 +vt 0.257958 0.909709 +vt 0.701235 0.864365 +vt 0.012098 0.877792 +vt 0.265003 0.917948 +vt 0.705942 0.877609 +vt 0.025738 0.883490 +vt 0.708845 0.892167 +vt 0.040556 0.886999 +vt 0.055982 0.888185 +vt 0.709833 0.907479 +vt 0.708868 0.922957 +vt 0.705987 0.938007 +vt 0.701300 0.952049 +vt 0.000000 0.909434 +vt 0.694988 0.964545 +vt 0.008362 0.914618 +vt 0.018551 0.920935 +vt 0.030176 0.928141 +vt 0.042790 0.935960 +vt 0.232976 0.875191 +vt 0.244729 0.884799 +vt 0.265694 0.901937 +vt 0.025658 0.873459 +vt 0.086206 0.873463 +vt 0.716011 0.938723 +vt 0.111975 0.862456 +vt 0.015026 0.905909 +vt 0.023787 0.914092 +vt 0.033783 0.923428 +vt 0.044628 0.933558 +vt 0.986860 0.543857 +vt 0.609463 0.143547 +vt 0.926973 0.543852 +vt 0.609463 0.493257 +vt 0.986723 0.517950 +vt 0.615582 0.112784 +vt 0.926836 0.517946 +vt 0.615559 0.524023 +vt 0.986629 0.489092 +vt 0.627585 0.083806 +vt 0.926742 0.489087 +vt 0.627516 0.553010 +vt 0.986581 0.458390 +vt 0.645011 0.057727 +vt 0.926693 0.458386 +vt 0.644874 0.579101 +vt 0.986581 0.427026 +vt 0.667190 0.035548 +vt 0.926693 0.427022 +vt 0.666967 0.601296 +vt 0.986629 0.396205 +vt 0.693269 0.018122 +vt 0.926742 0.396200 +vt 0.692946 0.618741 +vt 0.986723 0.367110 +vt 0.722247 0.006119 +vt 0.926836 0.367105 +vt 0.721812 0.630766 +vt 0.986860 0.340860 +vt 0.753010 0.000000 +vt 0.926973 0.340856 +vt 0.752456 0.636908 +vt 0.473893 0.764082 +vt 0.987035 0.318465 +vt 0.784376 0.000000 +vt 0.927148 0.318460 +vt 0.533752 0.764145 +vt 0.783700 0.636932 +vt 0.473260 0.788979 +vt 0.815139 0.006119 +vt 0.533119 0.789042 +vt 0.814344 0.630836 +vt 0.472790 0.817119 +vt 0.844117 0.018122 +vt 0.532648 0.817183 +vt 0.843210 0.618855 +vt 0.472500 0.847422 +vt 0.870196 0.035548 +vt 0.532358 0.847485 +vt 0.869189 0.601450 +vt 0.472402 0.878721 +vt 0.892375 0.057727 +vt 0.532261 0.878785 +vt 0.891283 0.579289 +vt 0.472500 0.909816 +vt 0.909801 0.083806 +vt 0.532359 0.909879 +vt 0.908641 0.553224 +vt 0.472790 0.939510 +vt 0.921804 0.112784 +vt 0.532648 0.939573 +vt 0.920598 0.524256 +vt 0.473260 0.966662 +vt 0.927923 0.143547 +vt 0.533119 0.966726 +vt 0.926693 0.493499 +vt 0.929415 0.000064 +vt 0.473893 0.990230 +vt 0.927923 0.174913 +vt 0.533752 0.990294 +vt 0.989274 0.000000 +vt 0.926693 0.462134 +vt 0.928782 0.023631 +vt 0.921804 0.205676 +vt 0.988641 0.023568 +vt 0.920598 0.431368 +vt 0.928311 0.050784 +vt 0.909801 0.234654 +vt 0.988170 0.050720 +vt 0.908641 0.402382 +vt 0.928021 0.080478 +vt 0.892375 0.260733 +vt 0.987881 0.080414 +vt 0.891282 0.376290 +vt 0.927923 0.111572 +vt 0.870196 0.282912 +vt 0.987782 0.111508 +vt 0.869189 0.354095 +vt 0.928021 0.142872 +vt 0.844117 0.300338 +vt 0.987881 0.142808 +vt 0.843210 0.336650 +vt 0.928311 0.173174 +vt 0.815139 0.312341 +vt 0.988170 0.173111 +vt 0.814344 0.324626 +vt 0.928782 0.201315 +vt 0.784376 0.318460 +vt 0.988641 0.201251 +vt 0.783700 0.318484 +vt 0.596004 0.967077 +vt 0.929415 0.226212 +vt 0.753010 0.318460 +vt 0.989274 0.226148 +vt 0.536264 0.967121 +vt 0.752456 0.318460 +vt 0.594772 0.940816 +vt 0.722247 0.312341 +vt 0.535033 0.940860 +vt 0.721812 0.324555 +vt 0.593925 0.911713 +vt 0.693269 0.300338 +vt 0.534184 0.911758 +vt 0.692946 0.336536 +vt 0.593493 0.880888 +vt 0.667190 0.282912 +vt 0.533752 0.880933 +vt 0.666967 0.353941 +vt 0.593493 0.849524 +vt 0.645011 0.260733 +vt 0.533752 0.849569 +vt 0.644874 0.376103 +vt 0.593925 0.818827 +vt 0.627585 0.234653 +vt 0.534184 0.818872 +vt 0.627515 0.402168 +vt 0.594772 0.789977 +vt 0.615582 0.205675 +vt 0.535033 0.790021 +vt 0.615559 0.431136 +vt 0.987035 0.565816 +vt 0.596004 0.764082 +vt 0.609463 0.174913 +vt 0.536264 0.764126 +vt 0.927148 0.565812 +vt 0.609463 0.461893 +vt 0.665097 0.508976 +vt 0.032319 0.765670 +vt 0.660982 0.488203 +vt 0.014827 0.765764 +vt 0.673171 0.528547 +vt 0.051804 0.765604 +vt 0.684891 0.546165 +vt 0.072534 0.765570 +vt 0.699808 0.561150 +vt 0.093711 0.765569 +vt 0.717349 0.572929 +vt 0.114521 0.765600 +vt 0.736839 0.581048 +vt 0.134166 0.765662 +vt 0.757530 0.585195 +vt 0.151890 0.765753 +vt 0.167012 0.765870 +vt 0.778626 0.585212 +vt 0.167012 0.810141 +vt 0.799317 0.581096 +vt 0.183823 0.810550 +vt 0.818807 0.573007 +vt 0.202823 0.810848 +vt 0.836348 0.561254 +vt 0.223284 0.811022 +vt 0.851265 0.546291 +vt 0.244417 0.811065 +vt 0.862986 0.528692 +vt 0.265412 0.810977 +vt 0.871059 0.509133 +vt 0.285461 0.810760 +vt 0.875175 0.488366 +vt 0.303794 0.810423 +vt 0.875175 0.467189 +vt 0.319706 0.809978 +vt 0.871059 0.446415 +vt 0.335619 0.810423 +vt 0.862986 0.426844 +vt 0.353952 0.810760 +vt 0.851265 0.409227 +vt 0.374001 0.810977 +vt 0.836348 0.394241 +vt 0.394996 0.811065 +vt 0.818807 0.382462 +vt 0.416129 0.811022 +vt 0.799317 0.374343 +vt 0.436590 0.810848 +vt 0.455590 0.810550 +vt 0.778626 0.370196 +vt 0.472401 0.810141 +vt 0.757530 0.370180 +vt 0.609463 0.000102 +vt 0.736839 0.374296 +vt 0.591731 0.000920 +vt 0.717349 0.382385 +vt 0.572081 0.001478 +vt 0.699808 0.394137 +vt 0.551267 0.001755 +vt 0.684891 0.409100 +vt 0.530091 0.001739 +vt 0.673170 0.426699 +vt 0.509364 0.001431 +vt 0.665097 0.446258 +vt 0.489885 0.000844 +vt 0.472401 0.000000 +vt 0.660982 0.467026 +vt 0.000000 0.765883 +vt 0.032319 0.081820 +vt 0.014827 0.081914 +vt 0.051804 0.081754 +vt 0.072534 0.081720 +vt 0.093711 0.081718 +vt 0.114521 0.081749 +vt 0.134166 0.081812 +vt 0.151890 0.081903 +vt 0.167012 0.082020 +vt 0.167012 0.126615 +vt 0.183823 0.127025 +vt 0.202823 0.127323 +vt 0.223284 0.127496 +vt 0.244417 0.127540 +vt 0.265412 0.127452 +vt 0.285461 0.127235 +vt 0.303794 0.126897 +vt 0.319706 0.126453 +vt 0.335619 0.126897 +vt 0.353952 0.127235 +vt 0.374001 0.127452 +vt 0.394996 0.127540 +vt 0.416129 0.127496 +vt 0.436590 0.127323 +vt 0.455590 0.127025 +vt 0.472401 0.126615 +vt 0.609463 0.682264 +vt 0.591731 0.683083 +vt 0.572081 0.683640 +vt 0.551267 0.683917 +vt 0.530091 0.683901 +vt 0.509364 0.683594 +vt 0.489885 0.683006 +vt 0.472401 0.682162 +vt 0.000000 0.082033 +vt 0.038298 0.043292 +vt 0.609463 0.756210 +vt 0.020923 0.044238 +vt 0.609463 0.735043 +vt 0.057436 0.040703 +vt 0.613369 0.776927 +vt 0.077602 0.036571 +vt 0.621029 0.796398 +vt 0.098021 0.031055 +vt 0.632150 0.813874 +vt 0.117908 0.024366 +vt 0.646304 0.828685 +vt 0.136499 0.016762 +vt 0.662948 0.840260 +vt 0.153079 0.008534 +vt 0.681442 0.848155 +vt 0.167012 0.000000 +vt 0.167012 0.044634 +vt 0.701075 0.852066 +vt 0.182470 0.036368 +vt 0.721093 0.851844 +vt 0.200169 0.028323 +vt 0.740726 0.847497 +vt 0.219431 0.020808 +vt 0.759219 0.839191 +vt 0.239513 0.014113 +vt 0.775863 0.827246 +vt 0.259646 0.008494 +vt 0.790018 0.812122 +vt 0.279054 0.004167 +vt 0.801139 0.794399 +vt 0.296992 0.001299 +vt 0.808800 0.774758 +vt 0.312771 0.000000 +vt 0.326641 0.000000 +vt 0.812705 0.753954 +vt 0.342420 0.001299 +vt 0.812705 0.732787 +vt 0.360359 0.004167 +vt 0.808800 0.712070 +vt 0.379767 0.008494 +vt 0.801139 0.692600 +vt 0.399899 0.014113 +vt 0.790018 0.675123 +vt 0.419982 0.020808 +vt 0.775863 0.660313 +vt 0.439243 0.028323 +vt 0.759219 0.648738 +vt 0.456943 0.036368 +vt 0.740726 0.640843 +vt 0.472401 0.044634 +vt 0.609463 0.764082 +vt 0.721093 0.636932 +vt 0.593175 0.756200 +vt 0.701075 0.637154 +vt 0.574914 0.748391 +vt 0.681442 0.641501 +vt 0.555380 0.740957 +vt 0.662948 0.649807 +vt 0.535325 0.734183 +vt 0.646304 0.661751 +vt 0.515520 0.728330 +vt 0.632150 0.676876 +vt 0.496725 0.723621 +vt 0.621029 0.694599 +vt 0.479662 0.720239 +vt 0.005979 0.043505 +vt 0.613368 0.714240 +vt 0.625347 0.754380 +vt 0.164074 0.881446 +vt 0.625347 0.736521 +vt 0.166924 0.894497 +vt 0.979472 0.823194 +vt 0.628642 0.771859 +vt 0.161957 0.866267 +vt 0.635105 0.788286 +vt 0.160653 0.849541 +vt 0.644488 0.803031 +vt 0.160212 0.831911 +vt 0.160653 0.814056 +vt 0.656430 0.815526 +vt 0.670472 0.825292 +vt 0.161957 0.796661 +vt 0.686075 0.831953 +vt 0.164074 0.780395 +vt 0.166924 0.765883 +vt 0.702640 0.835253 +vt 0.725841 0.856729 +vt 0.719528 0.835066 +vt 0.723651 0.871838 +vt 0.736093 0.831398 +vt 0.722024 0.888515 +vt 0.751696 0.824390 +vt 0.721022 0.906120 +vt 0.765738 0.814313 +vt 0.720684 0.923977 +vt 0.777680 0.801552 +vt 0.721022 0.941398 +vt 0.787063 0.786599 +vt 0.722024 0.957715 +vt 0.793526 0.770028 +vt 0.723651 0.972300 +vt 0.725841 0.984593 +vt 0.796821 0.752476 +vt 0.401272 0.811065 +vt 0.796821 0.734618 +vt 0.397788 0.825327 +vt 0.793526 0.717139 +vt 0.395198 0.841414 +vt 0.787063 0.700712 +vt 0.393604 0.858708 +vt 0.777680 0.685967 +vt 0.393065 0.876545 +vt 0.765738 0.673472 +vt 0.393604 0.894239 +vt 0.751696 0.663706 +vt 0.395198 0.911110 +vt 0.736093 0.657045 +vt 0.397787 0.926510 +vt 0.719528 0.653745 +vt 0.401272 0.939847 +vt 0.979472 0.951808 +vt 0.702640 0.653932 +vt 0.976622 0.937296 +vt 0.686075 0.657600 +vt 0.974505 0.921029 +vt 0.670472 0.664607 +vt 0.973200 0.903634 +vt 0.656430 0.674685 +vt 0.972760 0.885779 +vt 0.644488 0.687445 +vt 0.973200 0.868150 +vt 0.635105 0.702398 +vt 0.974505 0.851424 +vt 0.628642 0.718969 +vt 0.976622 0.836244 +vt 0.812705 0.737567 +vt 0.115837 0.886200 +vt 0.931235 0.818440 +vt 0.812705 0.719708 +vt 0.118687 0.899251 +vt 0.816000 0.755046 +vt 0.113719 0.871021 +vt 0.822463 0.771473 +vt 0.112415 0.854295 +vt 0.831846 0.786218 +vt 0.111975 0.836666 +vt 0.843788 0.798713 +vt 0.112415 0.818810 +vt 0.857830 0.808479 +vt 0.113719 0.801415 +vt 0.873433 0.815140 +vt 0.115837 0.785149 +vt 0.889998 0.818440 +vt 0.118687 0.770637 +vt 0.774417 0.852066 +vt 0.906886 0.818253 +vt 0.772227 0.867175 +vt 0.923451 0.814585 +vt 0.770600 0.883852 +vt 0.939054 0.807577 +vt 0.769598 0.901457 +vt 0.953096 0.797500 +vt 0.769260 0.919313 +vt 0.965038 0.784739 +vt 0.769598 0.936735 +vt 0.974421 0.769786 +vt 0.770600 0.953051 +vt 0.980884 0.753215 +vt 0.772227 0.967637 +vt 0.984179 0.735663 +vt 0.774417 0.979930 +vt 0.449013 0.816725 +vt 0.984179 0.717805 +vt 0.445528 0.830987 +vt 0.980884 0.700326 +vt 0.442939 0.847074 +vt 0.974421 0.683898 +vt 0.441344 0.864368 +vt 0.965038 0.669154 +vt 0.440806 0.882205 +vt 0.953096 0.656658 +vt 0.441344 0.899899 +vt 0.939054 0.646893 +vt 0.442939 0.916770 +vt 0.923450 0.640232 +vt 0.445528 0.932170 +vt 0.449013 0.945507 +vt 0.906886 0.636932 +vt 0.931235 0.947054 +vt 0.889997 0.637119 +vt 0.928385 0.932541 +vt 0.873433 0.640787 +vt 0.926267 0.916275 +vt 0.857830 0.647794 +vt 0.924963 0.898880 +vt 0.843788 0.657872 +vt 0.924523 0.881025 +vt 0.831845 0.670632 +vt 0.924963 0.863396 +vt 0.822463 0.685585 +vt 0.926267 0.846670 +vt 0.816000 0.702156 +vt 0.928385 0.831490 +s 1 +f 2/2/1 10/15/2 11/17/3 +f 479/587/4 19/27/5 480/588/6 +f 477/583/7 11/18/3 12/19/8 +f 480/588/6 20/28/9 481/589/10 +f 3/4/11 12/19/8 13/20/12 +f 481/589/10 21/29/13 482/590/14 +f 3/4/11 14/21/15 4/5/16 +f 474/580/17 82/98/18 7/12/19 +f 308/375/20 482/590/14 21/29/13 +f 4/5/16 15/22/21 5/7/22 +f 475/581/23 7/12/19 8/13/24 +f 5/7/22 16/23/25 478/584/26 +f 1/1/27 8/13/24 9/14/28 +f 478/584/26 17/24/29 6/9/30 +f 476/582/31 9/14/28 10/15/2 +f 6/9/30 18/25/32 479/586/4 +f 16/23/25 32/41/33 17/24/29 +f 9/14/28 25/33/34 10/15/2 +f 17/24/29 33/42/35 18/25/32 +f 10/16/2 26/35/36 11/18/3 +f 19/27/5 33/43/35 34/44/37 +f 11/18/3 27/36/38 12/19/8 +f 20/28/9 34/44/37 35/45/39 +f 13/20/12 27/36/38 28/37/40 +f 20/28/9 36/46/41 21/29/13 +f 13/20/12 29/38/42 14/21/15 +f 7/12/19 82/98/18 22/30/43 +f 308/375/20 21/29/13 36/46/41 +f 14/21/15 30/39/44 15/22/21 +f 7/12/19 23/31/45 8/13/24 +f 15/22/21 31/40/46 16/23/25 +f 8/13/24 24/32/47 9/14/28 +f 35/45/39 51/63/48 36/46/41 +f 28/37/40 44/55/49 29/38/42 +f 22/30/43 82/98/18 37/47/50 +f 308/375/20 36/46/41 51/63/48 +f 30/39/44 44/55/49 45/56/51 +f 22/30/43 38/48/52 23/31/45 +f 30/39/44 46/57/53 31/40/46 +f 23/31/45 39/49/54 24/32/47 +f 32/41/33 46/57/53 47/58/55 +f 24/32/47 40/50/56 25/33/34 +f 33/42/35 47/58/55 48/59/57 +f 25/34/34 41/52/58 26/35/36 +f 34/44/37 48/60/57 49/61/59 +f 26/35/36 42/53/60 27/36/38 +f 34/44/37 50/62/61 35/45/39 +f 27/36/38 43/54/62 28/37/40 +f 47/58/55 63/76/63 48/59/57 +f 40/51/56 56/69/64 41/52/58 +f 48/60/57 64/78/65 49/61/59 +f 41/52/58 57/70/66 42/53/60 +f 49/61/59 65/79/67 50/62/61 +f 43/54/62 57/70/66 58/71/68 +f 50/62/61 66/80/69 51/63/48 +f 44/55/49 58/71/68 59/72/70 +f 37/47/50 82/98/18 52/64/71 +f 308/375/20 51/63/48 66/80/69 +f 44/55/49 60/73/72 45/56/51 +f 37/47/50 53/65/73 38/48/52 +f 45/56/51 61/74/74 46/57/53 +f 38/48/52 54/66/75 39/49/54 +f 47/58/55 61/74/74 62/75/76 +f 39/49/54 55/67/77 40/50/56 +f 52/64/71 82/98/18 67/81/78 +f 308/375/20 66/80/69 81/97/79 +f 59/72/70 75/90/80 60/73/72 +f 52/64/71 68/82/81 53/65/73 +f 60/73/72 76/91/82 61/74/74 +f 53/65/73 69/83/83 54/66/75 +f 62/75/76 76/91/82 77/92/84 +f 54/66/75 70/84/85 55/67/77 +f 62/75/76 78/93/86 63/76/63 +f 56/69/64 70/85/85 71/86/87 +f 63/77/63 79/95/88 64/78/65 +f 56/69/64 72/87/89 57/70/66 +f 65/79/67 79/95/88 80/96/90 +f 58/71/68 72/87/89 73/88/91 +f 65/79/67 81/97/79 66/80/69 +f 59/72/70 73/88/91 74/89/92 +f 71/86/87 86/102/93 87/105/94 +f 78/94/86 95/114/95 79/95/88 +f 71/86/87 88/106/96 72/87/89 +f 79/95/88 96/115/97 80/96/90 +f 73/88/91 88/106/96 89/107/98 +f 81/97/79 96/115/97 97/116/99 +f 74/89/92 89/107/98 90/108/100 +f 67/81/78 82/98/18 83/99/101 +f 308/375/20 81/97/79 97/116/99 +f 74/89/92 91/109/102 75/90/80 +f 67/81/78 84/100/103 68/82/81 +f 75/90/80 92/110/104 76/91/82 +f 68/82/81 85/101/105 69/83/83 +f 77/92/84 92/110/104 93/111/106 +f 69/83/83 86/103/93 70/84/85 +f 77/92/84 94/112/107 78/93/86 +f 90/108/100 106/126/108 91/109/102 +f 84/100/103 98/117/109 99/118/110 +f 91/109/102 107/127/111 92/110/104 +f 84/100/103 100/119/112 85/101/105 +f 93/111/106 107/127/111 108/128/113 +f 85/101/105 101/120/114 86/103/93 +f 93/111/106 109/130/115 94/112/107 +f 87/104/94 101/120/114 102/122/116 +f 95/114/95 109/131/115 110/132/117 +f 87/105/94 103/123/118 88/106/96 +f 96/115/97 110/132/117 111/133/119 +f 89/107/98 103/123/118 104/124/120 +f 96/115/97 112/134/121 97/116/99 +f 90/108/100 104/124/120 105/125/122 +f 83/99/101 82/98/18 98/117/109 +f 308/375/20 97/116/99 112/134/121 +f 110/132/117 124/156/123 125/157/124 +f 102/121/116 118/143/125 103/123/118 +f 110/132/117 126/158/126 111/133/119 +f 104/124/120 118/143/125 119/145/127 +f 111/133/119 127/159/128 112/134/121 +f 105/125/122 119/145/127 120/147/129 +f 98/117/109 82/98/18 113/135/130 +f 308/375/20 112/134/121 127/159/128 +f 105/125/122 121/149/131 106/126/108 +f 99/118/110 113/135/130 114/136/132 +f 106/126/108 122/151/133 107/127/111 +f 99/118/110 115/137/134 100/119/112 +f 108/128/113 122/151/133 123/153/135 +f 100/119/112 116/138/136 101/120/114 +f 108/129/113 124/156/123 109/131/115 +f 102/122/116 116/138/136 117/140/137 +f 113/135/130 129/161/138 114/136/132 +f 121/150/131 137/170/139 122/152/133 +f 114/136/132 130/162/140 115/137/134 +f 123/154/135 137/170/139 138/172/141 +f 115/137/134 131/163/142 116/138/136 +f 123/155/135 139/174/143 124/156/123 +f 117/142/137 131/164/142 132/165/144 +f 125/157/124 139/174/143 140/175/145 +f 117/142/137 133/166/146 118/144/125 +f 125/157/124 141/176/147 126/158/126 +f 119/146/127 133/166/146 134/167/148 +f 126/158/126 142/177/149 127/159/128 +f 120/148/129 134/167/148 135/168/150 +f 113/135/130 82/98/18 128/160/151 +f 308/375/20 127/159/128 142/177/149 +f 120/148/129 136/169/152 121/150/131 +f 132/165/144 148/184/153 133/166/146 +f 140/175/145 156/193/154 141/176/147 +f 134/167/148 148/184/153 149/185/155 +f 142/177/149 156/193/154 157/194/156 +f 135/168/150 149/185/155 150/186/157 +f 128/160/151 82/98/18 143/178/158 +f 308/375/20 142/177/149 157/194/156 +f 135/168/150 151/187/159 136/169/152 +f 128/160/151 144/179/160 129/161/138 +f 136/169/152 152/188/161 137/170/139 +f 130/162/140 144/179/160 145/180/162 +f 138/172/141 152/188/161 153/189/163 +f 130/162/140 146/181/164 131/163/142 +f 138/172/141 154/190/165 139/173/143 +f 132/165/144 146/182/164 147/183/166 +f 140/175/145 154/191/165 155/192/167 +f 151/187/159 167/205/168 152/188/161 +f 145/180/162 159/196/169 160/197/170 +f 153/189/163 167/205/168 168/206/171 +f 145/180/162 161/198/172 146/181/164 +f 153/189/163 169/207/173 154/190/165 +f 147/183/166 161/199/172 162/200/174 +f 155/192/167 169/208/173 170/209/175 +f 147/183/166 163/201/176 148/184/153 +f 155/192/167 171/210/177 156/193/154 +f 149/185/155 163/201/176 164/202/178 +f 156/193/154 172/211/179 157/194/156 +f 150/186/157 164/202/178 165/203/180 +f 143/178/158 82/98/18 158/195/181 +f 308/375/20 157/194/156 172/211/179 +f 150/186/157 166/204/182 151/187/159 +f 143/178/158 159/196/169 144/179/160 +f 171/210/177 185/226/183 186/227/184 +f 164/202/178 178/218/185 179/219/186 +f 172/211/179 186/227/184 187/228/187 +f 165/203/180 179/219/186 180/220/188 +f 158/195/181 82/98/18 173/212/189 +f 308/375/20 172/211/179 187/228/187 +f 165/203/180 181/221/190 166/204/182 +f 158/195/181 174/213/191 159/196/169 +f 166/204/182 182/222/192 167/205/168 +f 159/196/169 175/214/193 160/197/170 +f 168/206/171 182/222/192 183/223/194 +f 160/197/170 176/215/195 161/198/172 +f 168/206/171 184/224/196 169/207/173 +f 162/200/174 176/216/195 177/217/197 +f 169/208/173 185/226/183 170/209/175 +f 162/200/174 178/218/185 163/201/176 +f 183/223/194 197/239/198 198/240/199 +f 175/214/193 191/232/200 176/215/195 +f 183/223/194 199/241/201 184/224/196 +f 177/217/197 191/233/200 192/234/202 +f 185/226/183 199/242/201 200/243/203 +f 177/217/197 193/235/204 178/218/185 +f 185/226/183 201/244/205 186/227/184 +f 179/219/186 193/235/204 194/236/206 +f 186/227/184 202/245/207 187/228/187 +f 180/220/188 194/236/206 195/237/208 +f 173/212/189 82/98/18 188/229/209 +f 308/375/20 187/228/187 202/245/207 +f 180/220/188 196/238/210 181/221/190 +f 174/213/191 188/229/209 189/230/211 +f 181/221/190 197/239/198 182/222/192 +f 175/214/193 189/230/211 190/231/212 +f 201/244/205 217/262/213 202/245/207 +f 195/237/208 209/253/214 210/254/215 +f 188/229/209 82/98/18 203/246/216 +f 308/375/20 202/245/207 217/262/213 +f 195/237/208 211/255/217 196/238/210 +f 188/229/209 204/247/218 189/230/211 +f 196/238/210 212/256/219 197/239/198 +f 189/230/211 205/248/220 190/231/212 +f 198/240/199 212/256/219 213/257/221 +f 190/231/212 206/249/222 191/232/200 +f 198/240/199 214/258/223 199/241/201 +f 192/234/202 206/250/222 207/251/224 +f 200/243/203 214/259/223 215/260/225 +f 192/234/202 208/252/226 193/235/204 +f 200/243/203 216/261/227 201/244/205 +f 194/236/206 208/252/226 209/253/214 +f 205/248/220 221/266/228 206/249/222 +f 213/257/221 229/276/229 214/258/223 +f 207/251/224 221/267/228 222/268/230 +f 215/260/225 229/277/229 230/278/231 +f 207/251/224 223/269/232 208/252/226 +f 215/260/225 231/279/233 216/261/227 +f 209/253/214 223/269/232 224/270/234 +f 216/261/227 232/280/235 217/262/213 +f 210/254/215 224/270/234 225/271/236 +f 203/246/216 82/98/18 218/263/237 +f 308/375/20 217/262/213 232/280/235 +f 210/254/215 226/272/238 211/255/217 +f 203/246/216 219/264/239 204/247/218 +f 211/255/217 227/273/240 212/256/219 +f 204/247/218 220/265/241 205/248/220 +f 213/257/221 227/273/240 228/274/242 +f 225/271/236 239/291/243 240/293/244 +f 218/263/237 82/98/18 233/281/245 +f 308/375/20 232/280/235 247/305/246 +f 225/271/236 241/295/247 226/272/238 +f 218/263/237 234/282/248 219/264/239 +f 226/272/238 242/297/249 227/273/240 +f 220/265/241 234/282/248 235/283/250 +f 228/274/242 242/297/249 243/299/251 +f 220/265/241 236/284/252 221/266/228 +f 228/275/242 244/302/253 229/277/229 +f 222/268/230 236/285/252 237/287/254 +f 230/278/231 244/302/253 245/303/255 +f 222/268/230 238/289/256 223/269/232 +f 230/278/231 246/304/257 231/279/233 +f 224/270/234 238/289/256 239/291/243 +f 232/280/235 246/304/257 247/305/246 +f 243/300/251 259/320/258 244/302/253 +f 237/288/254 251/310/259 252/311/260 +f 245/303/255 259/320/258 260/321/261 +f 237/288/254 253/312/262 238/290/256 +f 245/303/255 261/322/263 246/304/257 +f 239/292/243 253/312/262 254/313/264 +f 246/304/257 262/323/265 247/305/246 +f 240/294/244 254/313/264 255/314/266 +f 233/281/245 82/98/18 248/306/267 +f 308/375/20 247/305/246 262/323/265 +f 240/294/244 256/315/268 241/296/247 +f 233/281/245 249/307/269 234/282/248 +f 241/296/247 257/316/270 242/298/249 +f 234/282/248 250/308/271 235/283/250 +f 243/301/251 257/316/270 258/318/272 +f 235/283/250 251/309/259 236/284/252 +f 248/306/267 82/98/18 263/324/273 +f 308/375/20 262/323/265 277/340/274 +f 255/314/266 271/333/275 256/315/268 +f 249/307/269 263/324/273 264/325/276 +f 256/315/268 272/334/277 257/316/270 +f 249/307/269 265/326/278 250/308/271 +f 258/318/272 272/334/277 273/335/279 +f 250/308/271 266/327/280 251/309/259 +f 258/318/272 274/336/281 259/319/258 +f 252/311/260 266/328/280 267/329/282 +f 260/321/261 274/337/281 275/338/283 +f 252/311/260 268/330/284 253/312/262 +f 260/321/261 276/339/285 261/322/263 +f 254/313/264 268/330/284 269/331/286 +f 261/322/263 277/340/274 262/323/265 +f 255/314/266 269/331/286 270/332/287 +f 267/329/282 281/345/288 282/346/289 +f 275/338/283 289/354/290 290/355/291 +f 267/329/282 283/347/292 268/330/284 +f 275/338/283 291/356/293 276/339/285 +f 269/331/286 283/347/292 284/348/294 +f 277/340/274 291/356/293 292/357/295 +f 270/332/287 284/348/294 285/349/296 +f 263/324/273 82/98/18 278/341/297 +f 308/375/20 277/340/274 292/357/295 +f 270/332/287 286/350/298 271/333/275 +f 264/325/276 278/341/297 279/342/299 +f 271/333/275 287/351/300 272/334/277 +f 264/325/276 280/343/301 265/326/278 +f 273/335/279 287/351/300 288/352/302 +f 265/326/278 281/344/288 266/327/280 +f 273/335/279 289/353/290 274/336/281 +f 285/349/296 301/367/303 286/350/298 +f 278/341/297 294/359/304 279/342/299 +f 286/350/298 302/368/305 287/351/300 +f 279/342/299 295/360/306 280/343/301 +f 288/352/302 302/368/305 303/369/307 +f 280/343/301 296/361/308 281/344/288 +f 288/352/302 304/370/309 289/353/290 +f 282/346/289 296/362/308 297/363/310 +f 290/355/291 304/371/309 305/372/311 +f 282/346/289 298/364/312 283/347/292 +f 290/355/291 306/373/313 291/356/293 +f 284/348/294 298/364/312 299/365/314 +f 292/357/295 306/373/313 307/374/315 +f 285/349/296 299/365/314 300/366/316 +f 278/341/297 82/98/18 293/358/317 +f 308/375/20 292/357/295 307/374/315 +f 305/372/311 320/389/318 321/390/319 +f 297/363/310 314/382/320 298/364/312 +f 305/372/311 322/391/321 306/373/313 +f 299/365/314 314/382/320 315/383/322 +f 306/373/313 323/392/323 307/374/315 +f 300/366/316 315/383/322 316/384/324 +f 293/358/317 82/98/18 309/376/325 +f 308/375/20 307/374/315 323/392/323 +f 300/366/316 317/385/326 301/367/303 +f 293/358/317 310/377/327 294/359/304 +f 301/367/303 318/386/328 302/368/305 +f 294/359/304 311/378/329 295/360/306 +f 303/369/307 318/386/328 319/387/330 +f 295/360/306 312/379/331 296/361/308 +f 303/369/307 320/388/318 304/370/309 +f 297/363/310 312/380/331 313/381/332 +f 317/385/326 333/403/333 318/386/328 +f 310/377/327 326/395/334 311/378/329 +f 319/387/330 333/403/333 334/404/335 +f 311/378/329 327/396/336 312/379/331 +f 319/387/330 335/405/337 320/388/318 +f 312/380/331 328/398/338 313/381/332 +f 321/390/319 335/406/337 336/407/339 +f 313/381/332 329/399/340 314/382/320 +f 321/390/319 337/408/341 322/391/321 +f 315/383/322 329/399/340 330/400/342 +f 322/391/321 338/409/343 323/392/323 +f 316/384/324 330/400/342 331/401/344 +f 309/376/325 82/98/18 324/393/345 +f 308/375/20 323/392/323 338/409/343 +f 316/384/324 332/402/346 317/385/326 +f 309/376/325 325/394/347 310/377/327 +f 336/407/339 352/426/348 337/408/341 +f 330/400/342 344/416/349 345/417/350 +f 337/408/341 353/427/351 338/409/343 +f 331/401/344 345/417/350 346/418/352 +f 324/393/345 82/98/18 339/410/353 +f 308/375/20 338/409/343 353/427/351 +f 331/401/344 347/419/354 332/402/346 +f 324/393/345 340/411/355 325/394/347 +f 332/402/346 348/420/356 333/403/333 +f 325/394/347 341/412/357 326/395/334 +f 334/404/335 348/420/356 349/421/358 +f 326/395/334 342/413/359 327/396/336 +f 334/404/335 350/423/360 335/405/337 +f 328/398/338 342/414/359 343/415/361 +f 336/407/339 350/424/360 351/425/362 +f 328/398/338 344/416/349 329/399/340 +f 341/412/357 355/429/363 356/430/364 +f 349/421/358 363/444/365 364/446/366 +f 341/412/357 357/432/367 342/413/359 +f 349/422/358 365/450/368 350/424/360 +f 343/415/361 357/431/367 358/433/369 +f 351/425/362 365/450/368 366/451/370 +f 343/415/361 359/436/371 344/416/349 +f 351/425/362 367/452/372 352/426/348 +f 345/417/350 359/436/371 360/438/373 +f 352/426/348 368/453/374 353/427/351 +f 346/418/352 360/438/373 361/440/375 +f 339/410/353 82/98/18 354/428/376 +f 308/375/20 353/427/351 368/453/374 +f 346/418/352 362/442/377 347/419/354 +f 339/410/353 355/429/363 340/411/355 +f 347/419/354 363/444/365 348/420/356 +f 360/439/373 374/461/378 375/462/379 +f 367/452/372 383/471/380 368/453/374 +f 361/441/375 375/462/379 376/463/381 +f 354/428/376 82/98/18 369/454/382 +f 308/375/20 368/453/374 383/471/380 +f 361/441/375 377/464/383 362/443/377 +f 354/428/376 370/455/384 355/429/363 +f 362/443/377 378/465/385 363/445/365 +f 356/430/364 370/455/384 371/456/386 +f 364/448/366 378/465/385 379/466/387 +f 356/430/364 372/457/388 357/432/367 +f 364/448/366 380/467/389 365/449/368 +f 358/434/369 372/457/388 373/459/390 +f 366/451/370 380/468/389 381/469/391 +f 358/435/369 374/461/378 359/437/371 +f 366/451/370 382/470/392 367/452/372 +f 379/466/387 393/482/393 394/483/394 +f 371/456/386 387/475/395 372/457/388 +f 379/466/387 395/484/396 380/467/389 +f 373/460/390 387/476/395 388/477/397 +f 381/469/391 395/485/396 396/486/398 +f 373/460/390 389/478/399 374/461/378 +f 381/469/391 397/487/400 382/470/392 +f 375/462/379 389/478/399 390/479/401 +f 382/470/392 398/488/402 383/471/380 +f 376/463/381 390/479/401 391/480/403 +f 369/454/382 82/98/18 384/472/404 +f 308/375/20 383/471/380 398/488/402 +f 376/463/381 392/481/405 377/464/383 +f 369/454/382 385/473/406 370/455/384 +f 377/464/383 393/482/393 378/465/385 +f 371/456/386 385/473/406 386/474/407 +f 397/487/400 413/505/408 398/488/402 +f 391/480/403 405/496/409 406/497/410 +f 384/472/404 82/98/18 399/489/411 +f 308/375/20 398/488/402 413/505/408 +f 391/480/403 407/498/412 392/481/405 +f 385/473/406 399/489/411 400/490/413 +f 392/481/405 408/499/414 393/482/393 +f 385/473/406 401/491/415 386/474/407 +f 394/483/394 408/499/414 409/500/416 +f 386/474/407 402/492/417 387/475/395 +f 394/483/394 410/501/418 395/484/396 +f 388/477/397 402/493/417 403/494/419 +f 396/486/398 410/502/418 411/503/420 +f 388/477/397 404/495/421 389/478/399 +f 397/487/400 411/503/420 412/504/422 +f 390/479/401 404/495/421 405/496/409 +f 401/491/415 417/509/423 402/492/417 +f 409/500/416 425/518/424 410/501/418 +f 403/494/419 417/510/423 418/511/425 +f 411/503/420 425/519/424 426/520/426 +f 403/494/419 419/512/427 404/495/421 +f 411/503/420 427/521/428 412/504/422 +f 405/496/409 419/512/427 420/513/429 +f 412/504/422 428/522/430 413/505/408 +f 406/497/410 420/513/429 421/514/431 +f 399/489/411 82/98/18 414/506/432 +f 308/375/20 413/505/408 428/522/430 +f 406/497/410 422/515/433 407/498/412 +f 399/489/411 415/507/434 400/490/413 +f 407/498/412 423/516/435 408/499/414 +f 401/491/415 415/507/434 416/508/436 +f 409/500/416 423/516/435 424/517/437 +f 421/514/431 435/531/438 436/532/439 +f 414/506/432 82/98/18 429/523/440 +f 308/375/20 428/522/430 443/540/441 +f 421/514/431 437/533/442 422/515/433 +f 414/506/432 430/524/443 415/507/434 +f 422/515/433 438/534/444 423/516/435 +f 416/508/436 430/524/443 431/525/445 +f 424/517/437 438/534/444 439/535/446 +f 416/508/436 432/527/447 417/509/423 +f 424/517/437 440/536/448 425/518/424 +f 418/511/425 432/526/447 433/529/449 +f 426/520/426 440/537/448 441/538/450 +f 418/511/425 434/530/451 419/512/427 +f 426/520/426 442/539/452 427/521/428 +f 420/513/429 434/530/451 435/531/438 +f 427/521/428 443/540/441 428/522/430 +f 439/535/446 455/553/453 440/536/448 +f 433/528/449 447/544/454 448/545/455 +f 441/538/450 455/554/453 456/555/456 +f 433/529/449 449/547/457 434/530/451 +f 441/538/450 457/556/458 442/539/452 +f 435/531/438 449/547/457 450/548/459 +f 442/539/452 458/557/460 443/540/441 +f 436/532/439 450/548/459 451/549/461 +f 429/523/440 82/98/18 444/541/462 +f 308/375/20 443/540/441 458/557/460 +f 436/532/439 452/550/463 437/533/442 +f 430/524/443 444/541/462 445/542/464 +f 437/533/442 453/551/465 438/534/444 +f 430/524/443 446/543/466 431/525/445 +f 439/535/446 453/551/465 454/552/467 +f 431/525/445 447/544/454 432/527/447 +f 308/375/20 458/557/460 473/579/468 +f 451/549/461 467/571/469 452/550/463 +f 444/541/462 460/559/470 445/542/464 +f 452/550/463 468/572/471 453/551/465 +f 446/543/466 460/559/470 461/560/472 +f 454/552/467 468/572/471 469/573/473 +f 446/543/466 462/561/474 447/544/454 +f 454/552/467 470/575/475 455/553/453 +f 448/545/455 462/561/474 463/564/476 +f 456/555/456 470/576/475 471/577/477 +f 448/546/455 464/565/478 449/547/457 +f 456/555/456 472/578/479 457/556/458 +f 450/548/459 464/565/478 465/567/480 +f 458/557/460 472/578/479 473/579/468 +f 451/549/461 465/567/480 466/570/481 +f 444/541/462 82/98/18 459/558/482 +f 471/577/477 479/587/4 480/588/6 +f 464/566/478 2/3/1 477/583/7 +f 471/577/477 481/589/10 472/578/479 +f 465/568/480 477/583/7 3/4/11 +f 472/578/479 482/590/14 473/579/468 +f 466/569/481 3/4/11 4/5/16 +f 459/558/482 82/98/18 474/580/17 +f 308/375/20 473/579/468 482/590/14 +f 466/570/481 5/8/22 467/571/469 +f 460/559/470 474/580/17 475/581/23 +f 467/571/469 478/585/26 468/572/471 +f 461/560/472 475/581/23 1/1/27 +f 468/572/471 6/10/30 469/573/473 +f 462/561/474 1/1/27 476/582/31 +f 469/574/473 479/587/4 470/576/475 +f 463/564/476 476/582/31 2/2/1 +f 484/593/483 485/595/484 483/591/485 +f 486/597/486 487/599/487 485/595/484 +f 488/601/488 489/603/489 487/599/487 +f 490/605/490 491/607/491 489/603/489 +f 492/609/492 493/611/493 491/607/491 +f 494/613/494 495/615/495 493/611/493 +f 496/617/496 497/619/497 495/615/495 +f 498/621/498 499/624/499 497/619/497 +f 500/627/500 501/629/501 499/623/499 +f 502/631/502 503/633/503 501/629/501 +f 504/635/504 505/637/505 503/633/503 +f 506/639/506 507/641/507 505/637/505 +f 508/643/508 509/645/509 507/641/507 +f 510/647/510 511/649/511 509/645/509 +f 512/651/512 513/653/513 511/649/511 +f 514/655/514 515/658/515 513/653/513 +f 516/661/516 517/663/517 515/657/515 +f 518/665/518 519/667/519 517/663/517 +f 520/669/520 521/671/521 519/667/519 +f 522/673/522 523/675/523 521/671/521 +f 524/677/524 525/679/525 523/675/523 +f 526/681/526 527/683/527 525/679/525 +f 528/685/528 529/687/529 527/683/527 +f 530/689/530 531/692/531 529/687/529 +f 532/695/532 533/697/533 531/691/531 +f 534/699/534 535/701/535 533/697/533 +f 536/703/536 537/705/537 535/701/535 +f 538/707/538 539/709/539 537/705/537 +f 540/711/540 541/713/541 539/709/539 +f 542/715/542 543/717/543 541/713/541 +f 500/628/500 556/746/544 502/632/502 +f 544/719/545 545/722/546 543/717/543 +f 546/725/547 483/591/485 545/721/546 +f 513/654/513 529/688/529 545/723/546 +f 570/774/548 603/819/549 571/776/550 +f 518/666/518 565/764/551 520/670/520 +f 536/704/536 574/783/552 538/708/538 +f 492/610/492 552/737/553 494/614/494 +f 510/648/510 561/756/554 512/652/512 +f 528/686/528 570/775/548 530/690/530 +f 484/594/483 547/727/555 486/598/486 +f 546/726/547 548/729/556 484/594/483 +f 502/632/502 557/748/557 504/636/504 +f 520/670/520 566/766/558 522/674/522 +f 540/712/540 574/783/552 575/785/559 +f 494/614/494 553/739/560 496/618/496 +f 512/652/512 562/758/561 514/656/514 +f 530/690/530 571/777/550 532/696/532 +f 486/598/486 549/731/562 488/602/488 +f 504/636/504 558/750/563 506/640/506 +f 524/678/524 566/766/558 567/768/564 +f 540/712/540 576/787/565 542/716/542 +f 496/618/496 554/741/566 498/622/498 +f 514/656/514 563/760/567 516/662/516 +f 532/696/532 572/779/568 534/700/534 +f 488/602/488 550/733/569 490/606/490 +f 506/640/506 559/752/570 508/644/508 +f 524/678/524 568/770/571 526/682/526 +f 542/716/542 577/789/572 544/720/545 +f 498/622/498 555/744/573 500/628/500 +f 516/662/516 564/762/574 518/666/518 +f 534/700/534 573/781/575 536/704/536 +f 490/606/490 551/735/576 492/610/492 +f 508/644/508 560/754/577 510/648/510 +f 526/682/526 569/772/578 528/686/528 +f 544/720/545 578/792/579 546/726/547 +f 605/822/580 638/886/581 606/823/582 +f 557/749/557 590/806/583 558/751/563 +f 571/778/550 604/821/584 572/780/568 +f 558/751/563 591/807/585 559/753/570 +f 572/780/568 605/822/580 573/782/575 +f 559/753/570 592/808/586 560/755/577 +f 573/782/575 606/823/582 574/784/552 +f 560/755/577 593/809/587 561/757/554 +f 548/730/556 579/794/588 547/728/555 +f 574/784/552 607/824/589 575/786/559 +f 561/757/554 594/810/590 562/759/561 +f 547/728/555 581/796/591 549/732/562 +f 575/786/559 608/825/592 576/788/565 +f 562/759/561 595/811/593 563/761/567 +f 549/732/562 582/797/594 550/734/569 +f 576/788/565 609/826/595 577/790/572 +f 563/761/567 596/812/596 564/763/574 +f 550/734/569 583/798/597 551/736/576 +f 577/790/572 610/827/598 578/791/579 +f 564/763/574 597/813/599 565/765/551 +f 551/736/576 584/799/600 552/738/553 +f 578/793/579 580/795/601 548/730/556 +f 565/765/551 598/814/602 566/767/558 +f 552/738/553 585/800/603 553/740/560 +f 566/767/558 599/815/604 567/769/564 +f 553/740/560 586/801/605 554/742/566 +f 567/769/564 600/816/606 568/771/571 +f 554/742/566 587/802/607 555/743/573 +f 568/771/571 601/817/608 569/773/578 +f 555/745/573 588/804/609 556/747/544 +f 569/773/578 602/818/610 570/774/548 +f 556/747/544 589/805/611 557/749/557 +f 614/836/612 645/902/613 646/904/614 +f 593/809/587 624/856/615 625/858/616 +f 579/794/588 612/831/617 611/829/618 +f 606/823/582 639/888/619 607/824/589 +f 594/810/590 625/858/616 626/860/620 +f 581/796/591 611/829/618 613/833/621 +f 607/824/589 640/890/622 608/825/592 +f 595/811/593 626/860/620 627/862/623 +f 582/797/594 613/833/621 614/835/612 +f 608/825/592 641/892/624 609/826/595 +f 595/811/593 628/865/625 596/812/596 +f 583/798/597 614/835/612 615/837/626 +f 609/826/595 642/894/627 610/827/598 +f 596/812/596 629/867/628 597/813/599 +f 584/799/600 615/837/626 616/839/629 +f 610/828/598 612/831/617 580/795/601 +f 597/813/599 630/869/630 598/814/602 +f 585/800/603 616/839/629 617/841/631 +f 598/814/602 631/871/632 599/815/604 +f 586/801/605 617/841/631 618/843/633 +f 599/815/604 632/873/634 600/816/606 +f 587/802/607 618/843/633 619/845/635 +f 600/816/606 633/875/636 601/817/608 +f 588/804/609 619/846/635 620/848/637 +f 601/817/608 634/877/638 602/818/610 +f 589/805/611 620/848/637 621/850/639 +f 602/818/610 635/879/640 603/819/549 +f 590/806/583 621/850/639 622/852/641 +f 603/820/549 636/882/642 604/821/584 +f 591/807/585 622/852/641 623/854/643 +f 604/821/584 637/884/644 605/822/580 +f 592/808/586 623/854/643 624/856/615 +f 648/908/645 681/979/646 649/911/647 +f 640/891/622 673/961/648 641/893/624 +f 627/864/623 660/934/649 628/866/625 +f 614/836/612 647/906/650 615/838/626 +f 641/893/624 674/963/651 642/896/627 +f 629/868/628 660/934/649 661/936/652 +f 616/840/629 647/906/650 648/909/645 +f 612/832/617 674/963/651 644/899/653 +f 629/868/628 662/938/654 630/870/630 +f 617/842/631 648/909/645 649/910/647 +f 630/870/630 663/940/655 631/872/632 +f 617/842/631 650/912/656 618/844/633 +f 632/874/634 663/940/655 664/942/657 +f 619/847/635 650/912/656 651/915/658 +f 633/876/636 664/942/657 665/944/659 +f 619/847/635 652/917/660 620/849/637 +f 633/876/636 666/946/661 634/878/638 +f 620/849/637 653/919/662 621/851/639 +f 635/881/640 666/946/661 667/948/663 +f 621/851/639 654/921/664 622/853/641 +f 635/881/640 668/951/665 636/883/642 +f 622/853/641 655/923/666 623/855/643 +f 637/885/644 668/951/665 669/953/667 +f 624/857/615 655/923/666 656/925/668 +f 637/885/644 670/955/669 638/887/581 +f 625/859/616 656/925/668 657/927/670 +f 612/832/617 643/897/671 611/830/618 +f 638/887/581 671/957/672 639/889/619 +f 625/859/616 658/929/673 626/861/620 +f 613/834/621 643/897/671 645/902/613 +f 640/891/622 671/957/672 672/959/674 +f 627/864/623 658/929/673 659/932/675 +f 693/1004/676 685/987/677 677/970/678 +f 663/941/655 694/1007/679 695/1009/680 +f 649/911/647 682/981/681 650/913/656 +f 664/943/657 695/1009/680 696/1011/682 +f 650/913/656 683/983/683 651/914/658 +f 665/945/659 696/1011/682 697/1013/684 +f 651/916/658 684/986/685 652/918/660 +f 666/947/661 697/1013/684 698/1015/686 +f 652/918/660 685/988/677 653/920/662 +f 667/949/663 698/1015/686 699/1016/687 +f 653/920/662 686/990/688 654/922/664 +f 668/952/665 699/1018/687 700/1020/689 +f 654/922/664 687/992/690 655/924/666 +f 669/954/667 700/1020/689 701/1022/691 +f 655/924/666 688/994/692 656/926/668 +f 670/956/669 701/1022/691 702/1024/693 +f 656/926/668 689/996/694 657/928/670 +f 644/900/653 675/966/695 643/898/671 +f 671/958/672 702/1024/693 703/1026/696 +f 657/928/670 690/998/697 658/930/673 +f 643/898/671 677/971/678 645/903/613 +f 672/960/674 703/1026/696 704/1028/698 +f 658/930/673 691/1000/699 659/931/675 +f 645/903/613 678/973/700 646/905/614 +f 673/962/648 704/1028/698 705/1030/701 +f 660/935/649 691/1001/699 692/1003/702 +f 646/905/614 679/975/703 647/907/650 +f 674/964/651 705/1030/701 706/1032/704 +f 661/937/652 692/1003/702 693/1005/676 +f 647/907/650 680/977/705 648/908/645 +f 644/901/653 706/1032/704 676/967/706 +f 662/939/654 693/1005/676 694/1007/679 +f 2/2/1 476/582/31 10/15/2 +f 479/587/4 18/26/32 19/27/5 +f 477/583/7 2/3/1 11/18/3 +f 480/588/6 19/27/5 20/28/9 +f 3/4/11 477/583/7 12/19/8 +f 481/589/10 20/28/9 21/29/13 +f 3/4/11 13/20/12 14/21/15 +f 4/5/16 14/21/15 15/22/21 +f 475/581/23 474/580/17 7/12/19 +f 5/7/22 15/22/21 16/23/25 +f 1/1/27 475/581/23 8/13/24 +f 478/584/26 16/23/25 17/24/29 +f 476/582/31 1/1/27 9/14/28 +f 6/9/30 17/24/29 18/25/32 +f 16/23/25 31/40/46 32/41/33 +f 9/14/28 24/32/47 25/33/34 +f 17/24/29 32/41/33 33/42/35 +f 10/16/2 25/34/34 26/35/36 +f 19/27/5 18/26/32 33/43/35 +f 11/18/3 26/35/36 27/36/38 +f 20/28/9 19/27/5 34/44/37 +f 13/20/12 12/19/8 27/36/38 +f 20/28/9 35/45/39 36/46/41 +f 13/20/12 28/37/40 29/38/42 +f 14/21/15 29/38/42 30/39/44 +f 7/12/19 22/30/43 23/31/45 +f 15/22/21 30/39/44 31/40/46 +f 8/13/24 23/31/45 24/32/47 +f 35/45/39 50/62/61 51/63/48 +f 28/37/40 43/54/62 44/55/49 +f 30/39/44 29/38/42 44/55/49 +f 22/30/43 37/47/50 38/48/52 +f 30/39/44 45/56/51 46/57/53 +f 23/31/45 38/48/52 39/49/54 +f 32/41/33 31/40/46 46/57/53 +f 24/32/47 39/49/54 40/50/56 +f 33/42/35 32/41/33 47/58/55 +f 25/34/34 40/51/56 41/52/58 +f 34/44/37 33/43/35 48/60/57 +f 26/35/36 41/52/58 42/53/60 +f 34/44/37 49/61/59 50/62/61 +f 27/36/38 42/53/60 43/54/62 +f 47/58/55 62/75/76 63/76/63 +f 40/51/56 55/68/77 56/69/64 +f 48/60/57 63/77/63 64/78/65 +f 41/52/58 56/69/64 57/70/66 +f 49/61/59 64/78/65 65/79/67 +f 43/54/62 42/53/60 57/70/66 +f 50/62/61 65/79/67 66/80/69 +f 44/55/49 43/54/62 58/71/68 +f 44/55/49 59/72/70 60/73/72 +f 37/47/50 52/64/71 53/65/73 +f 45/56/51 60/73/72 61/74/74 +f 38/48/52 53/65/73 54/66/75 +f 47/58/55 46/57/53 61/74/74 +f 39/49/54 54/66/75 55/67/77 +f 59/72/70 74/89/92 75/90/80 +f 52/64/71 67/81/78 68/82/81 +f 60/73/72 75/90/80 76/91/82 +f 53/65/73 68/82/81 69/83/83 +f 62/75/76 61/74/74 76/91/82 +f 54/66/75 69/83/83 70/84/85 +f 62/75/76 77/92/84 78/93/86 +f 56/69/64 55/68/77 70/85/85 +f 63/77/63 78/94/86 79/95/88 +f 56/69/64 71/86/87 72/87/89 +f 65/79/67 64/78/65 79/95/88 +f 58/71/68 57/70/66 72/87/89 +f 65/79/67 80/96/90 81/97/79 +f 59/72/70 58/71/68 73/88/91 +f 71/86/87 70/85/85 86/102/93 +f 78/94/86 94/113/107 95/114/95 +f 71/86/87 87/105/94 88/106/96 +f 79/95/88 95/114/95 96/115/97 +f 73/88/91 72/87/89 88/106/96 +f 81/97/79 80/96/90 96/115/97 +f 74/89/92 73/88/91 89/107/98 +f 74/89/92 90/108/100 91/109/102 +f 67/81/78 83/99/101 84/100/103 +f 75/90/80 91/109/102 92/110/104 +f 68/82/81 84/100/103 85/101/105 +f 77/92/84 76/91/82 92/110/104 +f 69/83/83 85/101/105 86/103/93 +f 77/92/84 93/111/106 94/112/107 +f 90/108/100 105/125/122 106/126/108 +f 84/100/103 83/99/101 98/117/109 +f 91/109/102 106/126/108 107/127/111 +f 84/100/103 99/118/110 100/119/112 +f 93/111/106 92/110/104 107/127/111 +f 85/101/105 100/119/112 101/120/114 +f 93/111/106 108/128/113 109/130/115 +f 87/104/94 86/103/93 101/120/114 +f 95/114/95 94/113/107 109/131/115 +f 87/105/94 102/121/116 103/123/118 +f 96/115/97 95/114/95 110/132/117 +f 89/107/98 88/106/96 103/123/118 +f 96/115/97 111/133/119 112/134/121 +f 90/108/100 89/107/98 104/124/120 +f 110/132/117 109/131/115 124/156/123 +f 102/121/116 117/141/137 118/143/125 +f 110/132/117 125/157/124 126/158/126 +f 104/124/120 103/123/118 118/143/125 +f 111/133/119 126/158/126 127/159/128 +f 105/125/122 104/124/120 119/145/127 +f 105/125/122 120/147/129 121/149/131 +f 99/118/110 98/117/109 113/135/130 +f 106/126/108 121/149/131 122/151/133 +f 99/118/110 114/136/132 115/137/134 +f 108/128/113 107/127/111 122/151/133 +f 100/119/112 115/137/134 116/138/136 +f 108/129/113 123/155/135 124/156/123 +f 102/122/116 101/120/114 116/138/136 +f 113/135/130 128/160/151 129/161/138 +f 121/150/131 136/169/152 137/170/139 +f 114/136/132 129/161/138 130/162/140 +f 123/154/135 122/152/133 137/170/139 +f 115/137/134 130/162/140 131/163/142 +f 123/155/135 138/171/141 139/174/143 +f 117/142/137 116/139/136 131/164/142 +f 125/157/124 124/156/123 139/174/143 +f 117/142/137 132/165/144 133/166/146 +f 125/157/124 140/175/145 141/176/147 +f 119/146/127 118/144/125 133/166/146 +f 126/158/126 141/176/147 142/177/149 +f 120/148/129 119/146/127 134/167/148 +f 120/148/129 135/168/150 136/169/152 +f 132/165/144 147/183/166 148/184/153 +f 140/175/145 155/192/167 156/193/154 +f 134/167/148 133/166/146 148/184/153 +f 142/177/149 141/176/147 156/193/154 +f 135/168/150 134/167/148 149/185/155 +f 135/168/150 150/186/157 151/187/159 +f 128/160/151 143/178/158 144/179/160 +f 136/169/152 151/187/159 152/188/161 +f 130/162/140 129/161/138 144/179/160 +f 138/172/141 137/170/139 152/188/161 +f 130/162/140 145/180/162 146/181/164 +f 138/172/141 153/189/163 154/190/165 +f 132/165/144 131/164/142 146/182/164 +f 140/175/145 139/174/143 154/191/165 +f 151/187/159 166/204/182 167/205/168 +f 145/180/162 144/179/160 159/196/169 +f 153/189/163 152/188/161 167/205/168 +f 145/180/162 160/197/170 161/198/172 +f 153/189/163 168/206/171 169/207/173 +f 147/183/166 146/182/164 161/199/172 +f 155/192/167 154/191/165 169/208/173 +f 147/183/166 162/200/174 163/201/176 +f 155/192/167 170/209/175 171/210/177 +f 149/185/155 148/184/153 163/201/176 +f 156/193/154 171/210/177 172/211/179 +f 150/186/157 149/185/155 164/202/178 +f 150/186/157 165/203/180 166/204/182 +f 143/178/158 158/195/181 159/196/169 +f 171/210/177 170/209/175 185/226/183 +f 164/202/178 163/201/176 178/218/185 +f 172/211/179 171/210/177 186/227/184 +f 165/203/180 164/202/178 179/219/186 +f 165/203/180 180/220/188 181/221/190 +f 158/195/181 173/212/189 174/213/191 +f 166/204/182 181/221/190 182/222/192 +f 159/196/169 174/213/191 175/214/193 +f 168/206/171 167/205/168 182/222/192 +f 160/197/170 175/214/193 176/215/195 +f 168/206/171 183/223/194 184/224/196 +f 162/200/174 161/199/172 176/216/195 +f 169/208/173 184/225/196 185/226/183 +f 162/200/174 177/217/197 178/218/185 +f 183/223/194 182/222/192 197/239/198 +f 175/214/193 190/231/212 191/232/200 +f 183/223/194 198/240/199 199/241/201 +f 177/217/197 176/216/195 191/233/200 +f 185/226/183 184/225/196 199/242/201 +f 177/217/197 192/234/202 193/235/204 +f 185/226/183 200/243/203 201/244/205 +f 179/219/186 178/218/185 193/235/204 +f 186/227/184 201/244/205 202/245/207 +f 180/220/188 179/219/186 194/236/206 +f 180/220/188 195/237/208 196/238/210 +f 174/213/191 173/212/189 188/229/209 +f 181/221/190 196/238/210 197/239/198 +f 175/214/193 174/213/191 189/230/211 +f 201/244/205 216/261/227 217/262/213 +f 195/237/208 194/236/206 209/253/214 +f 195/237/208 210/254/215 211/255/217 +f 188/229/209 203/246/216 204/247/218 +f 196/238/210 211/255/217 212/256/219 +f 189/230/211 204/247/218 205/248/220 +f 198/240/199 197/239/198 212/256/219 +f 190/231/212 205/248/220 206/249/222 +f 198/240/199 213/257/221 214/258/223 +f 192/234/202 191/233/200 206/250/222 +f 200/243/203 199/242/201 214/259/223 +f 192/234/202 207/251/224 208/252/226 +f 200/243/203 215/260/225 216/261/227 +f 194/236/206 193/235/204 208/252/226 +f 205/248/220 220/265/241 221/266/228 +f 213/257/221 228/274/242 229/276/229 +f 207/251/224 206/250/222 221/267/228 +f 215/260/225 214/259/223 229/277/229 +f 207/251/224 222/268/230 223/269/232 +f 215/260/225 230/278/231 231/279/233 +f 209/253/214 208/252/226 223/269/232 +f 216/261/227 231/279/233 232/280/235 +f 210/254/215 209/253/214 224/270/234 +f 210/254/215 225/271/236 226/272/238 +f 203/246/216 218/263/237 219/264/239 +f 211/255/217 226/272/238 227/273/240 +f 204/247/218 219/264/239 220/265/241 +f 213/257/221 212/256/219 227/273/240 +f 225/271/236 224/270/234 239/291/243 +f 225/271/236 240/293/244 241/295/247 +f 218/263/237 233/281/245 234/282/248 +f 226/272/238 241/295/247 242/297/249 +f 220/265/241 219/264/239 234/282/248 +f 228/274/242 227/273/240 242/297/249 +f 220/265/241 235/283/250 236/284/252 +f 228/275/242 243/300/251 244/302/253 +f 222/268/230 221/267/228 236/285/252 +f 230/278/231 229/277/229 244/302/253 +f 222/268/230 237/287/254 238/289/256 +f 230/278/231 245/303/255 246/304/257 +f 224/270/234 223/269/232 238/289/256 +f 232/280/235 231/279/233 246/304/257 +f 243/300/251 258/317/272 259/320/258 +f 237/288/254 236/286/252 251/310/259 +f 245/303/255 244/302/253 259/320/258 +f 237/288/254 252/311/260 253/312/262 +f 245/303/255 260/321/261 261/322/263 +f 239/292/243 238/290/256 253/312/262 +f 246/304/257 261/322/263 262/323/265 +f 240/294/244 239/292/243 254/313/264 +f 240/294/244 255/314/266 256/315/268 +f 233/281/245 248/306/267 249/307/269 +f 241/296/247 256/315/268 257/316/270 +f 234/282/248 249/307/269 250/308/271 +f 243/301/251 242/298/249 257/316/270 +f 235/283/250 250/308/271 251/309/259 +f 255/314/266 270/332/287 271/333/275 +f 249/307/269 248/306/267 263/324/273 +f 256/315/268 271/333/275 272/334/277 +f 249/307/269 264/325/276 265/326/278 +f 258/318/272 257/316/270 272/334/277 +f 250/308/271 265/326/278 266/327/280 +f 258/318/272 273/335/279 274/336/281 +f 252/311/260 251/310/259 266/328/280 +f 260/321/261 259/320/258 274/337/281 +f 252/311/260 267/329/282 268/330/284 +f 260/321/261 275/338/283 276/339/285 +f 254/313/264 253/312/262 268/330/284 +f 261/322/263 276/339/285 277/340/274 +f 255/314/266 254/313/264 269/331/286 +f 267/329/282 266/328/280 281/345/288 +f 275/338/283 274/337/281 289/354/290 +f 267/329/282 282/346/289 283/347/292 +f 275/338/283 290/355/291 291/356/293 +f 269/331/286 268/330/284 283/347/292 +f 277/340/274 276/339/285 291/356/293 +f 270/332/287 269/331/286 284/348/294 +f 270/332/287 285/349/296 286/350/298 +f 264/325/276 263/324/273 278/341/297 +f 271/333/275 286/350/298 287/351/300 +f 264/325/276 279/342/299 280/343/301 +f 273/335/279 272/334/277 287/351/300 +f 265/326/278 280/343/301 281/344/288 +f 273/335/279 288/352/302 289/353/290 +f 285/349/296 300/366/316 301/367/303 +f 278/341/297 293/358/317 294/359/304 +f 286/350/298 301/367/303 302/368/305 +f 279/342/299 294/359/304 295/360/306 +f 288/352/302 287/351/300 302/368/305 +f 280/343/301 295/360/306 296/361/308 +f 288/352/302 303/369/307 304/370/309 +f 282/346/289 281/345/288 296/362/308 +f 290/355/291 289/354/290 304/371/309 +f 282/346/289 297/363/310 298/364/312 +f 290/355/291 305/372/311 306/373/313 +f 284/348/294 283/347/292 298/364/312 +f 292/357/295 291/356/293 306/373/313 +f 285/349/296 284/348/294 299/365/314 +f 305/372/311 304/371/309 320/389/318 +f 297/363/310 313/381/332 314/382/320 +f 305/372/311 321/390/319 322/391/321 +f 299/365/314 298/364/312 314/382/320 +f 306/373/313 322/391/321 323/392/323 +f 300/366/316 299/365/314 315/383/322 +f 300/366/316 316/384/324 317/385/326 +f 293/358/317 309/376/325 310/377/327 +f 301/367/303 317/385/326 318/386/328 +f 294/359/304 310/377/327 311/378/329 +f 303/369/307 302/368/305 318/386/328 +f 295/360/306 311/378/329 312/379/331 +f 303/369/307 319/387/330 320/388/318 +f 297/363/310 296/362/308 312/380/331 +f 317/385/326 332/402/346 333/403/333 +f 310/377/327 325/394/347 326/395/334 +f 319/387/330 318/386/328 333/403/333 +f 311/378/329 326/395/334 327/396/336 +f 319/387/330 334/404/335 335/405/337 +f 312/380/331 327/397/336 328/398/338 +f 321/390/319 320/389/318 335/406/337 +f 313/381/332 328/398/338 329/399/340 +f 321/390/319 336/407/339 337/408/341 +f 315/383/322 314/382/320 329/399/340 +f 322/391/321 337/408/341 338/409/343 +f 316/384/324 315/383/322 330/400/342 +f 316/384/324 331/401/344 332/402/346 +f 309/376/325 324/393/345 325/394/347 +f 336/407/339 351/425/362 352/426/348 +f 330/400/342 329/399/340 344/416/349 +f 337/408/341 352/426/348 353/427/351 +f 331/401/344 330/400/342 345/417/350 +f 331/401/344 346/418/352 347/419/354 +f 324/393/345 339/410/353 340/411/355 +f 332/402/346 347/419/354 348/420/356 +f 325/394/347 340/411/355 341/412/357 +f 334/404/335 333/403/333 348/420/356 +f 326/395/334 341/412/357 342/413/359 +f 334/404/335 349/421/358 350/423/360 +f 328/398/338 327/397/336 342/414/359 +f 336/407/339 335/406/337 350/424/360 +f 328/398/338 343/415/361 344/416/349 +f 341/412/357 340/411/355 355/429/363 +f 349/421/358 348/420/356 363/444/365 +f 341/412/357 356/430/364 357/432/367 +f 349/422/358 364/447/366 365/450/368 +f 343/415/361 342/414/359 357/431/367 +f 351/425/362 350/424/360 365/450/368 +f 343/415/361 358/433/369 359/436/371 +f 351/425/362 366/451/370 367/452/372 +f 345/417/350 344/416/349 359/436/371 +f 352/426/348 367/452/372 368/453/374 +f 346/418/352 345/417/350 360/438/373 +f 346/418/352 361/440/375 362/442/377 +f 339/410/353 354/428/376 355/429/363 +f 347/419/354 362/442/377 363/444/365 +f 360/439/373 359/437/371 374/461/378 +f 367/452/372 382/470/392 383/471/380 +f 361/441/375 360/439/373 375/462/379 +f 361/441/375 376/463/381 377/464/383 +f 354/428/376 369/454/382 370/455/384 +f 362/443/377 377/464/383 378/465/385 +f 356/430/364 355/429/363 370/455/384 +f 364/448/366 363/445/365 378/465/385 +f 356/430/364 371/456/386 372/457/388 +f 364/448/366 379/466/387 380/467/389 +f 358/434/369 357/432/367 372/457/388 +f 366/451/370 365/450/368 380/468/389 +f 358/435/369 373/460/390 374/461/378 +f 366/451/370 381/469/391 382/470/392 +f 379/466/387 378/465/385 393/482/393 +f 371/456/386 386/474/407 387/475/395 +f 379/466/387 394/483/394 395/484/396 +f 373/460/390 372/458/388 387/476/395 +f 381/469/391 380/468/389 395/485/396 +f 373/460/390 388/477/397 389/478/399 +f 381/469/391 396/486/398 397/487/400 +f 375/462/379 374/461/378 389/478/399 +f 382/470/392 397/487/400 398/488/402 +f 376/463/381 375/462/379 390/479/401 +f 376/463/381 391/480/403 392/481/405 +f 369/454/382 384/472/404 385/473/406 +f 377/464/383 392/481/405 393/482/393 +f 371/456/386 370/455/384 385/473/406 +f 397/487/400 412/504/422 413/505/408 +f 391/480/403 390/479/401 405/496/409 +f 391/480/403 406/497/410 407/498/412 +f 385/473/406 384/472/404 399/489/411 +f 392/481/405 407/498/412 408/499/414 +f 385/473/406 400/490/413 401/491/415 +f 394/483/394 393/482/393 408/499/414 +f 386/474/407 401/491/415 402/492/417 +f 394/483/394 409/500/416 410/501/418 +f 388/477/397 387/476/395 402/493/417 +f 396/486/398 395/485/396 410/502/418 +f 388/477/397 403/494/419 404/495/421 +f 397/487/400 396/486/398 411/503/420 +f 390/479/401 389/478/399 404/495/421 +f 401/491/415 416/508/436 417/509/423 +f 409/500/416 424/517/437 425/518/424 +f 403/494/419 402/493/417 417/510/423 +f 411/503/420 410/502/418 425/519/424 +f 403/494/419 418/511/425 419/512/427 +f 411/503/420 426/520/426 427/521/428 +f 405/496/409 404/495/421 419/512/427 +f 412/504/422 427/521/428 428/522/430 +f 406/497/410 405/496/409 420/513/429 +f 406/497/410 421/514/431 422/515/433 +f 399/489/411 414/506/432 415/507/434 +f 407/498/412 422/515/433 423/516/435 +f 401/491/415 400/490/413 415/507/434 +f 409/500/416 408/499/414 423/516/435 +f 421/514/431 420/513/429 435/531/438 +f 421/514/431 436/532/439 437/533/442 +f 414/506/432 429/523/440 430/524/443 +f 422/515/433 437/533/442 438/534/444 +f 416/508/436 415/507/434 430/524/443 +f 424/517/437 423/516/435 438/534/444 +f 416/508/436 431/525/445 432/527/447 +f 424/517/437 439/535/446 440/536/448 +f 418/511/425 417/510/423 432/526/447 +f 426/520/426 425/519/424 440/537/448 +f 418/511/425 433/529/449 434/530/451 +f 426/520/426 441/538/450 442/539/452 +f 420/513/429 419/512/427 434/530/451 +f 427/521/428 442/539/452 443/540/441 +f 439/535/446 454/552/467 455/553/453 +f 433/528/449 432/527/447 447/544/454 +f 441/538/450 440/537/448 455/554/453 +f 433/529/449 448/546/455 449/547/457 +f 441/538/450 456/555/456 457/556/458 +f 435/531/438 434/530/451 449/547/457 +f 442/539/452 457/556/458 458/557/460 +f 436/532/439 435/531/438 450/548/459 +f 436/532/439 451/549/461 452/550/463 +f 430/524/443 429/523/440 444/541/462 +f 437/533/442 452/550/463 453/551/465 +f 430/524/443 445/542/464 446/543/466 +f 439/535/446 438/534/444 453/551/465 +f 431/525/445 446/543/466 447/544/454 +f 451/549/461 466/570/481 467/571/469 +f 444/541/462 459/558/482 460/559/470 +f 452/550/463 467/571/469 468/572/471 +f 446/543/466 445/542/464 460/559/470 +f 454/552/467 453/551/465 468/572/471 +f 446/543/466 461/560/472 462/561/474 +f 454/552/467 469/573/473 470/575/475 +f 448/545/455 447/544/454 462/561/474 +f 456/555/456 455/554/453 470/576/475 +f 448/546/455 463/562/476 464/565/478 +f 456/555/456 471/577/477 472/578/479 +f 450/548/459 449/547/457 464/565/478 +f 458/557/460 457/556/458 472/578/479 +f 451/549/461 450/548/459 465/567/480 +f 471/577/477 470/576/475 479/587/4 +f 464/566/478 463/563/476 2/3/1 +f 471/577/477 480/588/6 481/589/10 +f 465/568/480 464/566/478 477/583/7 +f 472/578/479 481/589/10 482/590/14 +f 466/569/481 465/568/480 3/4/11 +f 466/570/481 4/6/16 5/8/22 +f 460/559/470 459/558/482 474/580/17 +f 467/571/469 5/8/22 478/585/26 +f 461/560/472 460/559/470 475/581/23 +f 468/572/471 478/585/26 6/10/30 +f 462/561/474 461/560/472 1/1/27 +f 469/574/473 6/11/30 479/587/4 +f 463/564/476 462/561/474 476/582/31 +f 484/593/483 486/597/486 485/595/484 +f 486/597/486 488/601/488 487/599/487 +f 488/601/488 490/605/490 489/603/489 +f 490/605/490 492/609/492 491/607/491 +f 492/609/492 494/613/494 493/611/493 +f 494/613/494 496/617/496 495/615/495 +f 496/617/496 498/621/498 497/619/497 +f 498/621/498 500/626/500 499/624/499 +f 500/627/500 502/631/502 501/629/501 +f 502/631/502 504/635/504 503/633/503 +f 504/635/504 506/639/506 505/637/505 +f 506/639/506 508/643/508 507/641/507 +f 508/643/508 510/647/510 509/645/509 +f 510/647/510 512/651/512 511/649/511 +f 512/651/512 514/655/514 513/653/513 +f 514/655/514 516/660/516 515/658/515 +f 516/661/516 518/665/518 517/663/517 +f 518/665/518 520/669/520 519/667/519 +f 520/669/520 522/673/522 521/671/521 +f 522/673/522 524/677/524 523/675/523 +f 524/677/524 526/681/526 525/679/525 +f 526/681/526 528/685/528 527/683/527 +f 528/685/528 530/689/530 529/687/529 +f 530/689/530 532/694/532 531/692/531 +f 532/695/532 534/699/534 533/697/533 +f 534/699/534 536/703/536 535/701/535 +f 536/703/536 538/707/538 537/705/537 +f 538/707/538 540/711/540 539/709/539 +f 540/711/540 542/715/542 541/713/541 +f 542/715/542 544/719/545 543/717/543 +f 500/628/500 555/744/573 556/746/544 +f 544/719/545 546/724/547 545/722/546 +f 546/725/547 484/593/483 483/591/485 +f 545/723/546 483/592/485 485/596/484 +f 485/596/484 487/600/487 489/604/489 +f 489/604/489 491/608/491 493/612/493 +f 493/612/493 495/616/495 497/620/497 +f 497/620/497 499/625/499 501/630/501 +f 501/630/501 503/634/503 505/638/505 +f 505/638/505 507/642/507 509/646/509 +f 509/646/509 511/650/511 513/654/513 +f 513/654/513 515/659/515 517/664/517 +f 517/664/517 519/668/519 521/672/521 +f 521/672/521 523/676/523 525/680/525 +f 525/680/525 527/684/527 529/688/529 +f 529/688/529 531/693/531 533/698/533 +f 533/698/533 535/702/535 537/706/537 +f 537/706/537 539/710/539 541/714/541 +f 541/714/541 543/718/543 545/723/546 +f 545/723/546 485/596/484 489/604/489 +f 489/604/489 493/612/493 497/620/497 +f 497/620/497 501/630/501 505/638/505 +f 505/638/505 509/646/509 513/654/513 +f 513/654/513 517/664/517 521/672/521 +f 521/672/521 525/680/525 529/688/529 +f 529/688/529 533/698/533 537/706/537 +f 537/706/537 541/714/541 545/723/546 +f 545/723/546 489/604/489 497/620/497 +f 497/620/497 505/638/505 513/654/513 +f 513/654/513 521/672/521 529/688/529 +f 529/688/529 537/706/537 545/723/546 +f 545/723/546 497/620/497 513/654/513 +f 570/774/548 602/818/610 603/819/549 +f 518/666/518 564/762/574 565/764/551 +f 536/704/536 573/781/575 574/783/552 +f 492/610/492 551/735/576 552/737/553 +f 510/648/510 560/754/577 561/756/554 +f 528/686/528 569/772/578 570/775/548 +f 484/594/483 548/729/556 547/727/555 +f 546/726/547 578/792/579 548/729/556 +f 502/632/502 556/746/544 557/748/557 +f 520/670/520 565/764/551 566/766/558 +f 540/712/540 538/708/538 574/783/552 +f 494/614/494 552/737/553 553/739/560 +f 512/652/512 561/756/554 562/758/561 +f 530/690/530 570/775/548 571/777/550 +f 486/598/486 547/727/555 549/731/562 +f 504/636/504 557/748/557 558/750/563 +f 524/678/524 522/674/522 566/766/558 +f 540/712/540 575/785/559 576/787/565 +f 496/618/496 553/739/560 554/741/566 +f 514/656/514 562/758/561 563/760/567 +f 532/696/532 571/777/550 572/779/568 +f 488/602/488 549/731/562 550/733/569 +f 506/640/506 558/750/563 559/752/570 +f 524/678/524 567/768/564 568/770/571 +f 542/716/542 576/787/565 577/789/572 +f 498/622/498 554/741/566 555/744/573 +f 516/662/516 563/760/567 564/762/574 +f 534/700/534 572/779/568 573/781/575 +f 490/606/490 550/733/569 551/735/576 +f 508/644/508 559/752/570 560/754/577 +f 526/682/526 568/770/571 569/772/578 +f 544/720/545 577/789/572 578/792/579 +f 605/822/580 637/884/644 638/886/581 +f 557/749/557 589/805/611 590/806/583 +f 571/778/550 603/820/549 604/821/584 +f 558/751/563 590/806/583 591/807/585 +f 572/780/568 604/821/584 605/822/580 +f 559/753/570 591/807/585 592/808/586 +f 573/782/575 605/822/580 606/823/582 +f 560/755/577 592/808/586 593/809/587 +f 548/730/556 580/795/601 579/794/588 +f 574/784/552 606/823/582 607/824/589 +f 561/757/554 593/809/587 594/810/590 +f 547/728/555 579/794/588 581/796/591 +f 575/786/559 607/824/589 608/825/592 +f 562/759/561 594/810/590 595/811/593 +f 549/732/562 581/796/591 582/797/594 +f 576/788/565 608/825/592 609/826/595 +f 563/761/567 595/811/593 596/812/596 +f 550/734/569 582/797/594 583/798/597 +f 577/790/572 609/826/595 610/827/598 +f 564/763/574 596/812/596 597/813/599 +f 551/736/576 583/798/597 584/799/600 +f 578/793/579 610/828/598 580/795/601 +f 565/765/551 597/813/599 598/814/602 +f 552/738/553 584/799/600 585/800/603 +f 566/767/558 598/814/602 599/815/604 +f 553/740/560 585/800/603 586/801/605 +f 567/769/564 599/815/604 600/816/606 +f 554/742/566 586/801/605 587/802/607 +f 568/771/571 600/816/606 601/817/608 +f 555/745/573 587/803/607 588/804/609 +f 569/773/578 601/817/608 602/818/610 +f 556/747/544 588/804/609 589/805/611 +f 614/836/612 613/834/621 645/902/613 +f 593/809/587 592/808/586 624/856/615 +f 579/794/588 580/795/601 612/831/617 +f 606/823/582 638/886/581 639/888/619 +f 594/810/590 593/809/587 625/858/616 +f 581/796/591 579/794/588 611/829/618 +f 607/824/589 639/888/619 640/890/622 +f 595/811/593 594/810/590 626/860/620 +f 582/797/594 581/796/591 613/833/621 +f 608/825/592 640/890/622 641/892/624 +f 595/811/593 627/863/623 628/865/625 +f 583/798/597 582/797/594 614/835/612 +f 609/826/595 641/892/624 642/894/627 +f 596/812/596 628/865/625 629/867/628 +f 584/799/600 583/798/597 615/837/626 +f 610/828/598 642/895/627 612/831/617 +f 597/813/599 629/867/628 630/869/630 +f 585/800/603 584/799/600 616/839/629 +f 598/814/602 630/869/630 631/871/632 +f 586/801/605 585/800/603 617/841/631 +f 599/815/604 631/871/632 632/873/634 +f 587/802/607 586/801/605 618/843/633 +f 600/816/606 632/873/634 633/875/636 +f 588/804/609 587/803/607 619/846/635 +f 601/817/608 633/875/636 634/877/638 +f 589/805/611 588/804/609 620/848/637 +f 602/818/610 634/877/638 635/879/640 +f 590/806/583 589/805/611 621/850/639 +f 603/820/549 635/880/640 636/882/642 +f 591/807/585 590/806/583 622/852/641 +f 604/821/584 636/882/642 637/884/644 +f 592/808/586 591/807/585 623/854/643 +f 648/908/645 680/977/705 681/979/646 +f 640/891/622 672/959/674 673/961/648 +f 627/864/623 659/932/675 660/934/649 +f 614/836/612 646/904/614 647/906/650 +f 641/893/624 673/961/648 674/963/651 +f 629/868/628 628/866/625 660/934/649 +f 616/840/629 615/838/626 647/906/650 +f 612/832/617 642/896/627 674/963/651 +f 629/868/628 661/936/652 662/938/654 +f 617/842/631 616/840/629 648/909/645 +f 630/870/630 662/938/654 663/940/655 +f 617/842/631 649/910/647 650/912/656 +f 632/874/634 631/872/632 663/940/655 +f 619/847/635 618/844/633 650/912/656 +f 633/876/636 632/874/634 664/942/657 +f 619/847/635 651/915/658 652/917/660 +f 633/876/636 665/944/659 666/946/661 +f 620/849/637 652/917/660 653/919/662 +f 635/881/640 634/878/638 666/946/661 +f 621/851/639 653/919/662 654/921/664 +f 635/881/640 667/948/663 668/951/665 +f 622/853/641 654/921/664 655/923/666 +f 637/885/644 636/883/642 668/951/665 +f 624/857/615 623/855/643 655/923/666 +f 637/885/644 669/953/667 670/955/669 +f 625/859/616 624/857/615 656/925/668 +f 612/832/617 644/899/653 643/897/671 +f 638/887/581 670/955/669 671/957/672 +f 625/859/616 657/927/670 658/929/673 +f 613/834/621 611/830/618 643/897/671 +f 640/891/622 639/889/619 671/957/672 +f 627/864/623 626/861/620 658/929/673 +f 677/970/678 675/965/695 676/968/706 +f 676/968/706 706/1031/704 705/1029/701 +f 705/1029/701 704/1027/698 703/1025/696 +f 703/1025/696 702/1023/693 701/1021/691 +f 701/1021/691 700/1019/689 699/1017/687 +f 699/1017/687 698/1014/686 697/1012/684 +f 697/1012/684 696/1010/682 695/1008/680 +f 695/1008/680 694/1006/679 693/1004/676 +f 693/1004/676 692/1002/702 691/999/699 +f 691/999/699 690/997/697 689/995/694 +f 689/995/694 688/993/692 687/991/690 +f 687/991/690 686/989/688 685/987/677 +f 685/987/677 684/985/685 683/982/683 +f 683/982/683 682/980/681 681/978/646 +f 681/978/646 680/976/705 679/974/703 +f 679/974/703 678/972/700 677/970/678 +f 677/970/678 676/968/706 705/1029/701 +f 705/1029/701 703/1025/696 701/1021/691 +f 701/1021/691 699/1017/687 697/1012/684 +f 697/1012/684 695/1008/680 693/1004/676 +f 693/1004/676 691/999/699 689/995/694 +f 689/995/694 687/991/690 685/987/677 +f 685/987/677 683/982/683 681/978/646 +f 681/978/646 679/974/703 677/970/678 +f 677/970/678 705/1029/701 701/1021/691 +f 701/1021/691 697/1012/684 693/1004/676 +f 693/1004/676 689/995/694 685/987/677 +f 685/987/677 681/978/646 677/970/678 +f 677/970/678 701/1021/691 693/1004/676 +f 663/941/655 662/939/654 694/1007/679 +f 649/911/647 681/979/646 682/981/681 +f 664/943/657 663/941/655 695/1009/680 +f 650/913/656 682/981/681 683/983/683 +f 665/945/659 664/943/657 696/1011/682 +f 651/916/658 683/984/683 684/986/685 +f 666/947/661 665/945/659 697/1013/684 +f 652/918/660 684/986/685 685/988/677 +f 667/949/663 666/947/661 698/1015/686 +f 653/920/662 685/988/677 686/990/688 +f 668/952/665 667/950/663 699/1018/687 +f 654/922/664 686/990/688 687/992/690 +f 669/954/667 668/952/665 700/1020/689 +f 655/924/666 687/992/690 688/994/692 +f 670/956/669 669/954/667 701/1022/691 +f 656/926/668 688/994/692 689/996/694 +f 644/900/653 676/969/706 675/966/695 +f 671/958/672 670/956/669 702/1024/693 +f 657/928/670 689/996/694 690/998/697 +f 643/898/671 675/966/695 677/971/678 +f 672/960/674 671/958/672 703/1026/696 +f 658/930/673 690/998/697 691/1000/699 +f 645/903/613 677/971/678 678/973/700 +f 673/962/648 672/960/674 704/1028/698 +f 660/935/649 659/933/675 691/1001/699 +f 646/905/614 678/973/700 679/975/703 +f 674/964/651 673/962/648 705/1030/701 +f 661/937/652 660/935/649 692/1003/702 +f 647/907/650 679/975/703 680/977/705 +f 644/901/653 674/964/651 706/1032/704 +f 662/939/654 661/937/652 693/1005/676 diff --git a/AimGL/resources/Models/button_stand/button-stand.png b/AimGL/resources/Models/button_stand/button-stand.png new file mode 100644 index 0000000..8a858a1 Binary files /dev/null and b/AimGL/resources/Models/button_stand/button-stand.png differ diff --git a/AimGL/resources/Models/long-crate/diffuse.png b/AimGL/resources/Models/long-crate/diffuse.png new file mode 100644 index 0000000..fd3fc5f Binary files /dev/null and b/AimGL/resources/Models/long-crate/diffuse.png differ diff --git a/AimGL/resources/Models/long-crate/long-crate.mtl b/AimGL/resources/Models/long-crate/long-crate.mtl new file mode 100644 index 0000000..b3c3a90 --- /dev/null +++ b/AimGL/resources/Models/long-crate/long-crate.mtl @@ -0,0 +1,12 @@ +# Blender 3.4.1 MTL File: 'None' +# www.blender.org + +newmtl 1001 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 diff --git a/AimGL/resources/Models/long-crate/long-crate.obj b/AimGL/resources/Models/long-crate/long-crate.obj new file mode 100644 index 0000000..7e36ece --- /dev/null +++ b/AimGL/resources/Models/long-crate/long-crate.obj @@ -0,0 +1,379 @@ +# Blender 3.4.1 +# www.blender.org +mtllib long-crate.mtl +o SM_LongCrate_LowPoly +v -0.420000 0.420000 0.960000 +v -0.420000 -0.420000 0.960000 +v 0.420000 -0.420000 0.960000 +v 0.420000 0.420000 0.960000 +v -0.420000 0.460000 -0.920000 +v -0.420000 0.460000 0.920000 +v 0.420000 0.460000 0.920000 +v 0.420000 0.460000 -0.920000 +v -0.420000 -0.420000 -0.960000 +v -0.420000 0.420000 -0.960000 +v 0.420000 0.420000 -0.960000 +v 0.420000 -0.420000 -0.960000 +v -0.420000 -0.460000 0.920000 +v -0.420000 -0.460000 -0.920000 +v 0.420000 -0.460000 -0.920000 +v 0.420000 -0.460000 0.920000 +v 0.460000 0.420000 0.920000 +v 0.460000 -0.420000 0.920000 +v 0.460000 -0.420000 -0.920000 +v 0.460000 0.420000 -0.920000 +v -0.460000 0.420000 -0.920000 +v -0.460000 -0.420000 -0.920000 +v -0.460000 -0.420000 0.920000 +v -0.460000 0.420000 0.920000 +v -0.420000 0.500000 0.920000 +v -0.500000 0.500000 1.000000 +v 0.500000 0.500000 1.000000 +v 0.420000 0.500000 0.920000 +v 0.500000 0.500000 -1.000000 +v 0.420000 0.500000 -0.920000 +v -0.500000 0.500000 -1.000000 +v -0.420000 0.500000 -0.920000 +v 0.500000 -0.420000 0.920000 +v 0.500000 -0.500000 1.000000 +v 0.500000 -0.500000 -1.000000 +v 0.500000 -0.420000 -0.920000 +v 0.500000 0.420000 -0.920000 +v 0.500000 0.420000 0.920000 +v -0.420000 0.420000 -1.000000 +v 0.420000 0.420000 -1.000000 +v 0.420000 -0.420000 -1.000000 +v -0.500000 -0.500000 -1.000000 +v -0.420000 -0.420000 -1.000000 +v -0.500000 -0.420000 -0.920000 +v -0.500000 -0.500000 1.000000 +v -0.500000 -0.420000 0.920000 +v -0.500000 0.420000 0.920000 +v -0.500000 0.420000 -0.920000 +v -0.420000 -0.420000 1.000000 +v 0.420000 -0.420000 1.000000 +v 0.420000 0.420000 1.000000 +v -0.420000 0.420000 1.000000 +v -0.420000 -0.500000 -0.920000 +v 0.420000 -0.500000 -0.920000 +v 0.420000 -0.500000 0.920000 +v -0.420000 -0.500000 0.920000 +vn 0.5774 -0.5774 0.5773 +vn 0.5774 0.5774 0.5774 +vn -0.5774 0.5773 0.5774 +vn -0.5774 -0.5774 0.5773 +vn 0.5774 0.5774 -0.5774 +vn -0.5774 0.5774 -0.5774 +vn 0.5774 0.5774 -0.5773 +vn 0.5774 -0.5774 -0.5774 +vn -0.5774 -0.5773 -0.5774 +vn -0.5774 0.5774 -0.5773 +vn 0.5774 -0.5774 0.5774 +vn -0.5774 -0.5774 0.5774 +vn 0.5773 -0.5773 -0.5774 +vn 0.5773 0.5773 0.5774 +vn -0.5774 0.5774 0.5774 +vn -0.5774 -0.5774 -0.5774 +vn 0.3015 0.9045 -0.3015 +vn 0.5774 0.5773 0.5774 +vn -0.3015 0.9045 -0.3015 +vn -0.3015 0.9045 0.3015 +vn 0.3015 0.9045 0.3015 +vn 0.9045 0.3015 -0.3015 +vn 0.9045 0.3015 0.3015 +vn 0.9045 -0.3015 0.3015 +vn 0.9045 -0.3015 -0.3015 +vn 0.3015 -0.3015 -0.9045 +vn -0.3015 -0.3015 -0.9045 +vn -0.3015 0.3015 -0.9045 +vn 0.3015 0.3015 -0.9045 +vn -0.9045 0.3015 0.3015 +vn -0.9045 0.3015 -0.3015 +vn -0.9045 -0.3015 -0.3015 +vn -0.9045 -0.3015 0.3015 +vn 0.3015 0.3015 0.9045 +vn -0.3015 0.3015 0.9045 +vn -0.3015 -0.3015 0.9045 +vn 0.3015 -0.3015 0.9045 +vn 0.3015 -0.9045 0.3015 +vn -0.3015 -0.9045 0.3015 +vn -0.3015 -0.9045 -0.3015 +vn 0.3015 -0.9045 -0.3015 +vt 0.002488 0.849118 +vt 0.962613 0.997512 +vt 0.956364 0.591837 +vt 0.002488 0.667178 +vt 0.983797 0.995063 +vt 0.956364 0.409891 +vt 0.159306 0.667178 +vt 0.983796 0.813130 +vt 0.754912 0.638869 +vt 0.159306 0.849118 +vt 0.754912 0.820808 +vt 0.962613 0.815580 +vt 0.772547 0.401615 +vt 0.747074 0.625608 +vt 0.962613 0.409895 +vt 0.772547 0.003080 +vt 0.740826 0.625583 +vt 0.962613 0.808428 +vt 0.929366 0.003080 +vt 0.740826 0.443641 +vt 0.997512 0.403885 +vt 0.929366 0.401615 +vt 0.997512 0.005352 +vt 0.747074 0.443668 +vt 0.684436 0.850623 +vt 0.719642 0.624214 +vt 0.948897 0.786654 +vt 0.527617 0.850623 +vt 0.766298 0.631188 +vt 0.948897 0.968592 +vt 0.527617 0.668683 +vt 0.766298 0.449248 +vt 0.956364 0.780017 +vt 0.684436 0.668683 +vt 0.956364 0.598076 +vt 0.719642 0.442271 +vt 0.772547 0.807449 +vt 0.178837 0.850497 +vt 0.991634 0.808854 +vt 0.772547 0.408914 +vt 0.172588 0.849605 +vt 0.991634 0.410321 +vt 0.929366 0.408914 +vt 0.172588 0.667665 +vt 0.935180 0.003559 +vt 0.929366 0.807449 +vt 0.935180 0.402095 +vt 0.178837 0.668558 +vt 0.359169 0.836766 +vt 0.956364 0.004307 +vt 0.748664 0.814229 +vt 0.202350 0.836765 +vt 0.935180 0.410377 +vt 0.748664 0.632288 +vt 0.202350 0.438231 +vt 0.935180 0.808907 +vt 0.719642 0.631689 +vt 0.359169 0.438231 +vt 0.719642 0.813631 +vt 0.956364 0.402842 +vt 0.364983 0.442776 +vt 0.976329 0.402265 +vt 0.711434 0.850067 +vt 0.521802 0.442776 +vt 0.970080 0.404312 +vt 0.711434 0.668127 +vt 0.521802 0.841311 +vt 0.970080 0.005778 +vt 0.690251 0.666925 +vt 0.364983 0.841311 +vt 0.690251 0.848865 +vt 0.976329 0.003730 +vt 0.403432 0.020021 +vt 0.733358 0.625583 +vt 0.970080 0.808428 +vt 0.388497 0.002693 +vt 0.196641 0.435502 +vt 0.002488 0.661648 +vt 0.575186 0.002693 +vt 0.767211 0.435879 +vt 0.189177 0.661648 +vt 0.560251 0.020021 +vt 0.733358 0.443641 +vt 0.990045 0.403885 +vt 0.575186 0.435884 +vt 0.767211 0.002689 +vt 0.527617 0.660965 +vt 0.560251 0.418556 +vt 0.990045 0.005352 +vt 0.754542 0.443668 +vt 0.388497 0.435884 +vt 0.714306 0.660930 +vt 0.196472 0.002488 +vt 0.403432 0.418556 +vt 0.754542 0.625608 +vt 0.970080 0.409895 +vt 0.595457 0.418551 +vt 0.942648 0.410377 +vt 0.741196 0.632288 +vt 0.580522 0.435879 +vt 0.189177 0.445052 +vt 0.002488 0.004154 +vt 0.580522 0.002689 +vt 0.527642 0.444364 +vt 0.002786 0.438161 +vt 0.595457 0.020016 +vt 0.942648 0.808907 +vt 0.727110 0.631689 +vt 0.752276 0.020016 +vt 0.727110 0.813631 +vt 0.948897 0.402842 +vt 0.752276 0.418551 +vt 0.948897 0.004307 +vt 0.741196 0.814229 +vt 0.699372 0.643604 +vt 0.758831 0.631188 +vt 0.956364 0.968592 +vt 0.542552 0.643636 +vt 0.758831 0.449248 +vt 0.948897 0.780017 +vt 0.542578 0.461691 +vt 0.948897 0.598076 +vt 0.727110 0.442271 +vt 0.714336 0.444335 +vt 0.383266 0.002523 +vt 0.189056 0.437440 +vt 0.699400 0.461662 +vt 0.727110 0.624214 +vt 0.956364 0.786654 +vt 0.368332 0.019850 +vt 0.962613 0.404312 +vt 0.703967 0.668127 +vt 0.383276 0.435909 +vt 0.002488 0.445052 +vt 0.189560 0.005127 +vt 0.368346 0.418567 +vt 0.962613 0.005778 +vt 0.697718 0.666925 +vt 0.211576 0.418188 +vt 0.697718 0.848865 +vt 0.983796 0.003730 +vt 0.211409 0.019810 +vt 0.983796 0.402265 +vt 0.703967 0.850067 +vt 0.017423 0.462380 +vt 0.976329 0.995063 +vt 0.948897 0.409891 +vt 0.174242 0.462380 +vt 0.976329 0.813130 +vt 0.762380 0.638869 +vt 0.174242 0.644320 +vt 0.762380 0.820808 +vt 0.970080 0.815580 +vt 0.017423 0.644320 +vt 0.970080 0.997512 +vt 0.948897 0.591837 +vt 0.174141 0.420135 +vt 0.165121 0.849605 +vt 0.984167 0.410321 +vt 0.017704 0.420796 +vt 0.165121 0.667665 +vt 0.942648 0.003559 +vt 0.017438 0.021532 +vt 0.942648 0.402094 +vt 0.186304 0.668558 +vt 0.174599 0.022402 +vt 0.186304 0.850497 +vt 0.984167 0.808854 +s 1 +usemtl 1001 +f 1/1/1 2/4/2 3/7/3 +f 3/7/3 4/10/4 1/1/1 +f 5/13/2 6/16/5 7/19/6 +f 7/19/6 8/22/3 5/13/2 +f 9/25/7 10/28/8 11/31/9 +f 11/31/9 12/34/10 9/25/7 +f 13/37/8 14/40/11 15/43/12 +f 15/43/12 16/46/9 13/37/8 +f 17/49/13 18/52/5 19/55/14 +f 19/55/14 20/58/11 17/49/13 +f 21/61/12 22/64/15 23/67/6 +f 23/67/6 24/70/16 21/61/12 +f 25/73/17 26/76/3 27/79/18 +f 27/79/18 28/82/19 25/73/17 +f 28/82/19 27/79/18 29/85/5 +f 29/85/5 30/88/20 28/82/19 +f 30/88/20 29/85/5 31/91/6 +f 31/91/6 32/94/21 30/88/20 +f 32/94/21 31/91/6 26/76/3 +f 26/76/3 25/73/17 32/94/21 +f 33/97/22 34/100/11 35/103/8 +f 35/103/8 36/106/23 33/97/22 +f 36/106/23 35/103/8 29/86/5 +f 29/86/5 37/109/24 36/106/23 +f 37/109/24 29/86/5 27/80/18 +f 27/80/18 38/112/25 37/109/24 +f 38/112/25 27/80/18 34/100/11 +f 34/100/11 33/97/22 38/112/25 +f 39/115/26 31/92/6 29/87/5 +f 29/87/5 40/118/27 39/115/26 +f 40/118/27 29/87/5 35/104/8 +f 35/104/8 41/121/28 40/118/27 +f 41/121/28 35/104/8 42/124/9 +f 42/124/9 43/127/29 41/121/28 +f 43/127/29 42/124/9 31/92/6 +f 31/92/6 39/115/26 43/127/29 +f 44/130/30 42/125/9 45/133/12 +f 45/133/12 46/136/31 44/130/30 +f 46/136/31 45/133/12 26/77/3 +f 26/77/3 47/139/32 46/136/31 +f 47/139/32 26/77/3 31/93/6 +f 31/93/6 48/142/33 47/139/32 +f 48/142/33 31/93/6 42/125/9 +f 42/125/9 44/130/30 48/142/33 +f 49/145/34 45/134/12 34/101/11 +f 34/101/11 50/148/35 49/145/34 +f 50/148/35 34/101/11 27/81/18 +f 27/81/18 51/151/36 50/148/35 +f 51/151/36 27/81/18 26/78/3 +f 26/78/3 52/154/37 51/151/36 +f 52/154/37 26/78/3 45/134/12 +f 45/134/12 49/145/34 52/154/37 +f 53/157/38 42/126/9 35/105/8 +f 35/105/8 54/160/39 53/157/38 +f 54/160/39 35/105/8 34/102/11 +f 34/102/11 55/163/40 54/160/39 +f 55/163/40 34/102/11 45/135/12 +f 45/135/12 56/166/41 55/163/40 +f 56/166/41 45/135/12 42/126/9 +f 42/126/9 53/157/38 56/166/41 +f 2/5/2 49/146/34 50/149/35 +f 50/149/35 3/8/3 2/5/2 +f 3/9/3 50/150/35 51/152/36 +f 51/152/36 4/11/4 3/9/3 +f 4/12/4 51/153/36 52/155/37 +f 52/155/37 1/2/1 4/12/4 +f 1/3/1 52/156/37 49/147/34 +f 49/147/34 2/6/2 1/3/1 +f 6/17/5 25/74/17 28/83/19 +f 28/83/19 7/20/6 6/17/5 +f 7/21/6 28/84/19 30/89/20 +f 30/89/20 8/23/3 7/21/6 +f 8/24/3 30/90/20 32/95/21 +f 32/95/21 5/14/2 8/24/3 +f 5/15/2 32/96/21 25/75/17 +f 25/75/17 6/18/5 5/15/2 +f 10/29/8 39/116/26 40/119/27 +f 40/119/27 11/32/9 10/29/8 +f 11/33/9 40/120/27 41/122/28 +f 41/122/28 12/35/10 11/33/9 +f 12/36/10 41/123/28 43/128/29 +f 43/128/29 9/26/7 12/36/10 +f 9/27/7 43/129/29 39/117/26 +f 39/117/26 10/30/8 9/27/7 +f 14/41/11 53/158/38 54/161/39 +f 54/161/39 15/44/12 14/41/11 +f 15/45/12 54/162/39 55/164/40 +f 55/164/40 16/47/9 15/45/12 +f 16/48/9 55/165/40 56/167/41 +f 56/167/41 13/38/8 16/48/9 +f 13/39/8 56/168/41 53/159/38 +f 53/159/38 14/42/11 13/39/8 +f 18/53/5 33/98/22 36/107/23 +f 36/107/23 19/56/14 18/53/5 +f 19/57/14 36/108/23 37/110/24 +f 37/110/24 20/59/11 19/57/14 +f 20/60/11 37/111/24 38/113/25 +f 38/113/25 17/50/13 20/60/11 +f 17/51/13 38/114/25 33/99/22 +f 33/99/22 18/54/5 17/51/13 +f 22/65/15 44/131/30 46/137/31 +f 46/137/31 23/68/6 22/65/15 +f 23/69/6 46/138/31 47/140/32 +f 47/140/32 24/71/16 23/69/6 +f 24/72/16 47/141/32 48/143/33 +f 48/143/33 21/62/12 24/72/16 +f 21/63/12 48/144/33 44/132/30 +f 44/132/30 22/66/15 21/63/12 diff --git a/AimGL/resources/Models/long-crate/specular.png b/AimGL/resources/Models/long-crate/specular.png new file mode 100644 index 0000000..37fe0c3 Binary files /dev/null and b/AimGL/resources/Models/long-crate/specular.png differ diff --git a/AimGL/resources/Models/shooting-board/diffuse.png b/AimGL/resources/Models/shooting-board/diffuse.png new file mode 100644 index 0000000..108dc1b Binary files /dev/null and b/AimGL/resources/Models/shooting-board/diffuse.png differ diff --git a/AimGL/resources/Models/shooting-board/shooting-board.obj b/AimGL/resources/Models/shooting-board/shooting-board.obj new file mode 100644 index 0000000..f1f437c --- /dev/null +++ b/AimGL/resources/Models/shooting-board/shooting-board.obj @@ -0,0 +1,432 @@ +# Blender 3.4.1 +# www.blender.org +mtllib shooting-board.mtl +o Cube.002 +v 0.030095 -0.112458 -0.021112 +v 0.030095 2.152282 -0.021112 +v 0.030002 -0.112458 0.053251 +v 0.030002 2.152282 0.053251 +v -0.044268 -0.112458 -0.021205 +v -0.044268 2.152282 -0.021205 +v -0.044361 -0.112458 0.053159 +v -0.044361 2.152282 0.053159 +v 0.030095 2.220454 -0.021112 +v 0.030002 2.220454 0.053251 +v -0.044361 2.220454 0.053159 +v -0.044268 2.220454 -0.021205 +v 0.066049 4.118887 -0.013094 +v 0.065956 4.118887 0.061269 +v -0.008407 4.118887 0.061176 +v -0.008315 4.118887 -0.013187 +v -0.044361 2.152282 0.053159 +v -0.044268 2.152282 -0.021205 +v -0.044361 2.220454 0.053159 +v -0.044268 2.220454 -0.021205 +v -2.284651 2.152282 0.050320 +v -2.284558 2.152282 -0.024043 +v -2.284651 2.220454 0.050320 +v -2.284558 2.220454 -0.024043 +v 2.228714 2.152282 -0.018424 +v 2.228621 2.152282 0.055939 +v 2.228714 2.220454 -0.018424 +v 2.228621 2.220454 0.055939 +v 2.242615 -0.125764 0.037635 +v 2.242615 4.136020 0.037635 +v 2.242444 -0.125764 0.174277 +v 2.242444 4.136020 0.174277 +v -2.289792 -0.125764 0.031988 +v -2.289792 4.136020 0.031988 +v -2.289962 -0.125764 0.168629 +v -2.289962 4.136020 0.168629 +v -2.219461 -0.120502 -0.023138 +v 0.006310 2.131313 -0.021142 +v -2.219554 -0.120502 0.051225 +v 0.006217 2.131313 0.053222 +v -2.272011 -0.067886 -0.023204 +v -0.046240 2.183929 -0.021207 +v -2.272104 -0.067886 0.051160 +v -0.046333 2.183929 0.053156 +v 0.054545 2.179488 -0.021082 +v 0.054452 2.179488 0.053282 +v 0.001902 2.232104 0.053216 +v 0.001995 2.232104 -0.021147 +v 2.226849 4.066699 -0.019398 +v 2.226757 4.066699 0.054966 +v 2.174207 4.119314 0.054900 +v 2.174300 4.119314 -0.019463 +v -0.046333 2.183929 0.053156 +v -0.046240 2.183929 -0.021207 +v 0.001902 2.232104 0.053216 +v 0.001995 2.232104 -0.021147 +v -2.255430 4.082199 0.051150 +v -2.255337 4.082199 -0.023213 +v -2.207195 4.130374 0.051210 +v -2.207102 4.130374 -0.023153 +v 2.198848 -0.138847 -0.019242 +v 2.198755 -0.138847 0.055121 +v 2.247083 -0.090673 -0.019182 +v 2.246991 -0.090673 0.055181 +vn 0.3026 -0.3015 -0.9042 +vn 0.5766 -0.5774 0.5781 +vn 0.5781 -0.5774 -0.5766 +vn 0.3004 -0.3015 0.9049 +vn -0.5781 -0.5774 0.5766 +vn -0.3342 0.6667 0.6663 +vn -0.5766 -0.5774 -0.5781 +vn -0.3325 0.6667 -0.6671 +vn 0.5766 0.5774 0.5781 +vn 0.3007 0.2941 0.9072 +vn 0.3013 0.2966 -0.9062 +vn -0.5709 0.5834 -0.5777 +vn 0.5842 0.5734 -0.5743 +vn -0.3347 0.6710 0.6616 +vn -0.3308 0.6729 -0.6616 +vn 0.0009 0.7071 -0.7071 +vn 0.0004 0.9487 -0.3162 +vn 0.5823 0.5713 0.5784 +vn -0.5719 0.5812 0.5790 +vn -0.5766 -0.5773 -0.5781 +vn -0.0004 0.9487 0.3162 +vn -0.0009 0.7071 0.7071 +vn -0.5766 0.5773 -0.5781 +vn -0.5781 0.5774 0.5766 +vn 0.5781 -0.5773 -0.5766 +vn 0.5781 0.5773 -0.5766 +vn 0.5781 0.5774 -0.5766 +vn 0.5766 0.5773 0.5781 +vn -0.5781 -0.5773 0.5766 +vn 0.0028 -0.8168 -0.5769 +vn -0.0034 -0.4206 0.9072 +vn 0.0014 -0.8167 0.5771 +vn -0.8169 -0.0021 0.5767 +vn -0.2078 0.7871 0.5808 +vn -0.8156 -0.0022 -0.5786 +vn -0.0015 -0.4206 -0.9072 +vn 0.8152 -0.0074 0.5792 +vn 0.4117 -0.0180 0.9111 +vn 0.4139 -0.0181 -0.9101 +vn 0.0294 0.8132 -0.5812 +vn 0.8191 -0.0290 -0.5729 +vn -0.2064 0.7870 -0.5814 +vn -0.1912 0.8005 0.5680 +vn -0.1900 0.8004 -0.5685 +vn -0.3715 0.7092 -0.5992 +vn 0.2183 0.9226 -0.3180 +vn 0.8179 -0.0289 0.5747 +vn 0.0281 0.8134 0.5810 +vn -0.3730 0.7090 0.5985 +vn -0.8180 -0.0306 -0.5744 +vn 0.2177 0.9226 0.3185 +vn -0.8193 -0.0307 0.5725 +vn -0.0298 0.8131 -0.5814 +vn -0.0311 0.8129 0.5815 +vn -0.0067 -0.8170 -0.5766 +vn -0.0080 -0.8171 0.5764 +vn 0.8165 -0.0073 -0.5773 +vt 0.778496 0.787350 +vt 0.962662 0.407200 +vt 0.765771 0.386832 +vt 0.778496 0.990814 +vt 0.962662 0.610668 +vt 0.851988 0.787350 +vt 0.772452 0.000000 +vt 0.765771 0.380151 +vt 0.771815 0.787350 +vt 0.845307 0.787350 +vt 0.771815 0.990814 +vt 0.772452 0.203468 +vt 0.969341 0.407200 +vt 0.778496 0.787350 +vt 0.772452 0.386832 +vt 0.778496 0.990814 +vt 0.969341 0.610668 +vt 0.382885 0.407199 +vt 0.785177 0.787350 +vt 0.765771 0.000000 +vt 0.772452 0.380151 +vt 0.765771 0.203468 +vt 0.785177 0.990814 +vt 0.382885 0.407199 +vt 0.877599 0.787350 +vt 0.962662 0.616791 +vt 0.845307 0.984879 +vt 0.772452 0.209591 +vt 0.870919 0.787378 +vt 0.838626 0.984879 +vt 0.765771 0.209591 +vt 0.884280 0.787378 +vt 0.382885 0.407199 +vt 0.877599 0.787350 +vt 0.969341 0.616791 +vt 0.382885 0.407199 +vt 0.959431 0.787350 +vt 0.765771 0.393513 +vt 0.877599 0.957923 +vt 0.870919 0.957951 +vt 0.772452 0.393513 +vt 0.775683 0.380150 +vt 0.772452 0.386832 +vt 0.769002 0.380150 +vt 0.884280 0.957951 +vt 0.966110 0.787350 +vt 0.765771 0.386832 +vt 0.877599 0.957923 +vt 0.858669 0.787350 +vt 0.805219 0.988621 +vt 0.382885 0.407199 +vt 0.382885 0.407199 +vt 0.811900 0.988621 +vt 0.864794 0.988621 +vt 0.811900 0.787350 +vt 0.382885 0.407199 +vt 0.864794 0.787350 +vt 0.870918 0.988621 +vt 0.382885 0.407199 +vt 0.818581 0.787350 +vt 0.805219 0.787350 +vt 0.771895 0.406875 +vt 0.858669 0.988621 +vt 0.811900 0.787350 +vt 0.771895 0.400194 +vt 0.864794 0.787350 +vt 0.765771 0.406875 +vt 0.864794 0.988621 +vt 0.811900 0.988621 +vt 0.765771 0.400194 +vt 0.818581 0.988621 +vt 0.870918 0.787350 +vt 0.771895 0.400194 +vt 0.851988 0.984878 +vt 0.765133 0.610668 +vt 0.771895 0.393513 +vt 0.969979 0.203468 +vt 0.845307 0.984877 +vt 0.845307 0.787350 +vt 0.765771 0.400194 +vt 0.765133 0.616791 +vt 0.969979 0.209591 +vt 0.765771 0.393513 +vt 0.838626 0.787350 +vt 0.993893 0.407200 +vt 0.765770 0.000000 +vt 0.969979 0.000000 +vt 0.993893 0.790081 +vt 0.382885 0.000000 +vt 0.969341 0.814400 +vt 0.000000 0.000000 +vt 0.982255 0.000000 +vt 0.981617 0.407200 +vt 0.981617 0.790081 +vt 0.382885 0.000000 +vt 0.981617 0.814400 +vt 0.765770 0.407200 +vt 0.982255 0.000000 +vt 0.969979 0.407200 +vt 0.982255 0.382881 +vt 0.382885 0.407200 +vt 0.969341 0.407200 +vt 0.994531 0.000000 +vt 0.000000 0.407200 +vt 0.982255 0.407200 +vt 0.981617 0.407200 +vt 0.382885 0.407200 +vt 0.994531 0.382881 +vt 0.003582 0.411900 +vt 0.791857 0.787354 +vt 0.771896 0.400194 +vt 0.791857 0.990604 +vt 0.798538 0.990368 +vt 0.204910 0.612846 +vt 0.785177 0.787350 +vt 0.761551 0.411900 +vt 0.771896 0.393513 +vt 0.805219 0.990372 +vt 0.785177 0.990601 +vt 0.560219 0.612846 +vt 0.791857 0.787354 +vt 0.008331 0.407200 +vt 0.776619 0.400194 +vt 0.791857 0.990604 +vt 0.209660 0.608150 +vt 0.382885 0.407199 +vt 0.798538 0.787350 +vt 0.756802 0.407200 +vt 0.776619 0.393513 +vt 0.555470 0.608150 +vt 0.798538 0.990601 +vt 0.382885 0.407199 +vt 0.858669 0.787353 +vt 0.209217 0.617203 +vt 0.765134 0.787352 +vt 0.851988 0.787350 +vt 0.555912 0.617203 +vt 0.771815 0.787350 +vt 0.551163 0.612503 +vt 0.825264 0.787350 +vt 0.382885 0.407199 +vt 0.213966 0.612503 +vt 0.818583 0.787353 +vt 0.382885 0.407199 +vt 0.377815 0.813187 +vt 0.818583 0.987237 +vt 0.858669 0.982516 +vt 0.825264 0.987234 +vt 0.387314 0.813187 +vt 0.851988 0.982513 +vt 0.382565 0.808491 +vt 0.825262 0.982513 +vt 0.382565 0.808491 +vt 0.818581 0.982516 +vt 0.825264 0.985817 +vt 0.382885 0.407199 +vt 0.993893 0.407665 +vt 0.831945 0.985821 +vt 0.382885 0.407199 +vt 0.993893 0.931023 +vt 0.382885 0.407199 +vt 1.000000 0.407199 +vt 0.831945 0.787352 +vt 1.000000 0.931488 +vt 0.382885 0.407199 +vt 0.838626 0.787350 +vt 0.993893 0.669342 +vt 0.825264 0.787350 +vt 0.776245 0.406875 +vt 0.776245 0.400194 +vt 0.831945 0.787354 +vt 0.993893 0.669342 +vt 0.831945 0.985821 +vt 0.771896 0.406875 +vt 1.000000 0.668876 +vt 0.771896 0.400194 +vt 0.838626 0.985819 +vt 1.000000 0.669807 +vt 0.000000 0.808834 +vt 0.765134 0.994721 +vt 0.798538 0.787350 +vt 0.771815 0.994718 +vt 0.765129 0.808834 +vt 0.805219 0.787354 +vt 0.765132 0.990372 +vt 0.004307 0.813187 +vt 0.760822 0.813187 +vt 0.771813 0.990370 +s 1 +usemtl Material.002 +f 2/4/1 3/9/2 1/1/3 +f 4/12/4 7/20/5 3/7/2 +f 8/23/6 5/14/7 7/19/5 +f 6/17/8 1/2/3 5/13/7 +f 7/21/5 1/3/3 3/8/2 +f 4/12/4 28/82/9 10/28/10 +f 9/26/11 16/46/12 13/37/13 +f 6/17/8 9/26/11 2/5/1 +f 4/12/4 11/31/14 8/22/6 +f 12/36/15 18/52/16 20/59/17 +f 14/41/18 16/47/12 15/43/19 +f 10/28/10 15/44/19 11/31/14 +f 11/32/14 16/48/12 12/34/15 +f 10/29/10 13/39/13 14/40/18 +f 18/53/16 21/61/5 22/64/20 +f 11/33/14 20/59/17 19/56/21 +f 6/18/8 17/51/22 18/52/16 +f 8/24/6 19/56/21 17/51/22 +f 21/62/5 24/70/23 22/65/20 +f 19/57/21 21/63/5 17/49/22 +f 20/60/17 23/69/24 19/55/21 +f 18/54/16 24/72/23 20/58/17 +f 25/73/25 28/83/9 26/76/2 +f 2/6/1 26/78/2 4/10/4 +f 9/26/11 25/75/25 2/5/1 +f 9/27/11 28/84/9 27/79/26 +f 37/110/30 40/119/31 39/115/32 +f 40/120/31 43/128/33 39/116/32 +f 44/131/34 41/121/35 43/127/33 +f 41/122/35 38/114/36 37/109/30 +f 43/129/33 37/111/30 39/117/32 +f 40/120/31 64/187/37 46/137/38 +f 45/134/39 52/153/40 49/145/41 +f 42/125/42 45/134/39 38/114/36 +f 40/120/31 47/139/43 44/130/34 +f 48/144/44 54/159/45 56/165/46 +f 50/148/47 52/154/40 51/152/48 +f 46/137/38 51/151/48 47/139/43 +f 48/143/44 51/152/48 52/154/40 +f 45/133/39 50/150/47 46/136/38 +f 53/155/49 58/171/50 54/158/45 +f 47/141/43 56/165/46 55/161/51 +f 42/126/42 53/156/49 54/159/45 +f 44/132/34 55/161/51 53/156/49 +f 57/169/52 60/176/53 58/170/50 +f 53/157/49 59/175/54 57/167/52 +f 55/163/51 60/177/53 59/173/54 +f 54/160/45 60/178/53 56/164/46 +f 61/180/55 64/188/37 62/182/56 +f 38/113/36 62/184/56 40/118/31 +f 38/114/36 63/186/57 61/179/55 +f 45/135/39 64/188/37 63/185/57 +f 2/4/1 4/11/4 3/9/2 +f 4/12/4 8/22/6 7/20/5 +f 8/23/6 6/16/8 5/14/7 +f 6/17/8 2/5/1 1/2/3 +f 7/21/5 5/15/7 1/3/3 +f 4/12/4 26/77/2 28/82/9 +f 9/26/11 12/35/15 16/46/12 +f 6/17/8 12/35/15 9/26/11 +f 4/12/4 10/28/10 11/31/14 +f 12/36/15 6/18/8 18/52/16 +f 14/41/18 13/38/13 16/47/12 +f 10/28/10 14/42/18 15/44/19 +f 11/32/14 15/45/19 16/48/12 +f 10/29/10 9/25/11 13/39/13 +f 18/53/16 17/50/22 21/61/5 +f 11/33/14 12/36/15 20/59/17 +f 6/18/8 8/24/6 17/51/22 +f 8/24/6 11/33/14 19/56/21 +f 21/62/5 23/67/24 24/70/23 +f 19/57/21 23/68/24 21/63/5 +f 20/60/17 24/71/23 23/69/24 +f 18/54/16 22/66/20 24/72/23 +f 25/73/25 27/80/26 28/83/9 +f 2/6/1 25/74/25 26/78/2 +f 9/26/11 27/81/26 25/75/25 +f 9/27/11 10/30/10 28/84/9 +f 37/110/30 38/112/36 40/119/31 +f 40/120/31 44/130/34 43/128/33 +f 44/131/34 42/124/42 41/121/35 +f 41/122/35 42/125/42 38/114/36 +f 43/129/33 41/123/35 37/111/30 +f 40/120/31 62/183/56 64/187/37 +f 45/134/39 48/142/44 52/153/40 +f 42/125/42 48/142/44 45/134/39 +f 40/120/31 46/137/38 47/139/43 +f 48/144/44 42/126/42 54/159/45 +f 50/148/47 49/146/41 52/154/40 +f 46/137/38 50/149/47 51/151/48 +f 48/143/44 47/140/43 51/152/48 +f 45/133/39 49/147/41 50/150/47 +f 53/155/49 57/168/52 58/171/50 +f 47/141/43 48/144/44 56/165/46 +f 42/126/42 44/132/34 53/156/49 +f 44/132/34 47/141/43 55/161/51 +f 57/169/52 59/174/54 60/176/53 +f 53/157/49 55/162/51 59/175/54 +f 55/163/51 56/166/46 60/177/53 +f 54/160/45 58/172/50 60/178/53 +f 61/180/55 63/185/57 64/188/37 +f 38/113/36 61/181/55 62/184/56 +f 38/114/36 45/134/39 63/186/57 +f 45/135/39 46/138/38 64/188/37 +usemtl Material.001 +f 30/88/27 31/93/2 29/85/25 +f 32/95/28 35/104/29 31/91/2 +f 36/108/24 33/98/7 35/103/29 +f 34/101/23 29/86/25 33/97/7 +f 35/105/29 29/87/25 31/92/2 +f 32/96/28 34/102/23 36/106/24 +f 30/88/27 32/94/28 31/93/2 +f 32/95/28 36/107/24 35/104/29 +f 36/108/24 34/100/23 33/98/7 +f 34/101/23 30/89/27 29/86/25 +f 35/105/29 33/99/7 29/87/25 +f 32/96/28 30/90/27 34/102/23 diff --git a/AimGL/resources/Models/shooting-board/specular.png b/AimGL/resources/Models/shooting-board/specular.png new file mode 100644 index 0000000..63a14e4 Binary files /dev/null and b/AimGL/resources/Models/shooting-board/specular.png differ diff --git a/AimGL/resources/Shaders/Graphics/Model/ModelTextured.fs b/AimGL/resources/Shaders/Graphics/Model/ModelTextured.fs index de2ebe8..8fae3e0 100644 --- a/AimGL/resources/Shaders/Graphics/Model/ModelTextured.fs +++ b/AimGL/resources/Shaders/Graphics/Model/ModelTextured.fs @@ -6,7 +6,7 @@ in vec3 FragmentNormal; in vec3 FragPos; in vec2 TexCoords; -uniform vec3 lightPos = vec3(3, 3, 3); +uniform vec3 lightPos = vec3(0, 8, -15); vec3 lightAmbient = vec3(0.3f, 0.3f, 0.3f); vec3 lightDiffuse = vec3(0.6f, 0.6f, 0.6f); vec3 lightSpecular = vec3(1.0f, 1.0f, 1.0f); diff --git a/AimGL/resources/Sounds/button-click.wav b/AimGL/resources/Sounds/button-click.wav new file mode 100644 index 0000000..8045121 Binary files /dev/null and b/AimGL/resources/Sounds/button-click.wav differ diff --git a/AimGL/resources/Textures/arrow-up.png b/AimGL/resources/Textures/arrow-up.png new file mode 100644 index 0000000..c2c28ec Binary files /dev/null and b/AimGL/resources/Textures/arrow-up.png differ diff --git a/AimGL/resources/Textures/welcome-screen.png b/AimGL/resources/Textures/welcome-screen.png new file mode 100644 index 0000000..5f3d82f Binary files /dev/null and b/AimGL/resources/Textures/welcome-screen.png differ diff --git a/AimGL/src/CMakeLists_Sources.txt b/AimGL/src/CMakeLists_Sources.txt index 38382a1..97b6962 100644 --- a/AimGL/src/CMakeLists_Sources.txt +++ b/AimGL/src/CMakeLists_Sources.txt @@ -1,6 +1,7 @@ set(PROJECT_SOURCES Game.cpp pch.cpp + constants.cpp Renderer/Core/Buffers/Buffer.cpp Renderer/Core/Buffers/BufferElement.cpp Renderer/Core/Buffers/BufferLayout.cpp @@ -26,8 +27,14 @@ set(PROJECT_SOURCES Player/Player.cpp World/Camera.cpp World/InfiniteGridFloor.cpp + World/Scene/Nodes/Node.cpp World/Scene/GameObjects/Rifle.cpp - World/Scene/GameObjects/PreviewTarget.cpp + World/Scene/GameObjects/Target.cpp + World/Scene/GameObjects/TargetManager.cpp + World/Scene/GameObjects/ButtonStand.cpp + World/Scene/GameObjects/ShootingRange.cpp + World/Scene/GameObjects/SidewayMovingTargetsRange.cpp + World/Scene/GameObjects/LongCrate.cpp World/Physics/Drawable/AABB.cpp World/Physics/Drawable/Ray.cpp World/Physics/Drawable/DrawableCollider.cpp @@ -37,5 +44,6 @@ set(PROJECT_SOURCES World/Physics/RectangleCollider.cpp World/Physics/SphereCollider.cpp World/Physics/Collisions.cpp + Utils/Transform.cpp Utils/Mouse.cpp ) \ No newline at end of file diff --git a/AimGL/src/Player/Player.cpp b/AimGL/src/Player/Player.cpp index 0380b01..4dd72b6 100644 --- a/AimGL/src/Player/Player.cpp +++ b/AimGL/src/Player/Player.cpp @@ -1,12 +1,15 @@ #include "Player.h" -#include "Utils/Lerp.h" #include "pch.h" +#include + Player::Player(WindowToRender& window, ColliderRegister& colliderRegister) : mCamera(window) , mCrosshairTexture("resources/Textures/crosshair.png") , mCrosshair(mCrosshairTexture) , mRifle(mCamera, colliderRegister) + , mColliderRegister(colliderRegister) + , mCollider(colliderRegister, {0, 0, 0}, {0.35, 0.8, 0.35}) { mCrosshair.setPosition({window.getSize().x / 2.f, window.getSize().y / 2.f}, Sprite2D::Origin::Center); @@ -22,6 +25,7 @@ void Player::draw(const Renderer& target) const { mRifle.draw(target); mCrosshair.draw(target); + mCollider.draw(target, mCamera); } void Player::update(const float& deltaTime) @@ -31,6 +35,33 @@ void Player::update(const float& deltaTime) mRifle.update(deltaTime); } +void Player::updateColliderPosition() +{ + auto colliderPosition = mPosition - (mCollider.dimensions() / 2.f); + colliderPosition.y = mPosition.y; + mCollider.setPosition(colliderPosition); +} + +bool Player::tryUpdatePositionByApplyingVelocityIfCollisionAllows(float& position, float& velocity) +{ + position += velocity; + updateColliderPosition(); + auto collisions = mColliderRegister.findCollisions(mCollider.collider()); + std::erase_if(collisions, + [](const auto& collision) + { + return collision->colliderTag() != ColliderTag::Solid; + }); + if (not collisions.empty()) + { + position -= velocity; + velocity = 0; + updateColliderPosition(); + return false; + } + return true; +} + void Player::updatePhysics(float deltaTime) { handleMovementKeyboardInputs(deltaTime); @@ -38,11 +69,14 @@ void Player::updatePhysics(float deltaTime) manageVerticalVelocity(deltaTime); limitVelocity(deltaTime); - mPosition += mVelocity; + tryUpdatePositionByApplyingVelocityIfCollisionAllows(mPosition.x, mVelocity.x); + doesPlayerStandOnCollider = + not tryUpdatePositionByApplyingVelocityIfCollisionAllows(mPosition.y, mVelocity.y); if (mPosition.y < 0) { mPosition.y = 0; } + tryUpdatePositionByApplyingVelocityIfCollisionAllows(mPosition.z, mVelocity.z); } void Player::decelerateVelocity(const float& deltaTime) @@ -85,6 +119,7 @@ void Player::limitVelocity(const float& deltaTime) void Player::fixedUpdate(const float& deltaTime) { + updateColliderPosition(); updatePhysics(deltaTime); } @@ -169,5 +204,5 @@ const Camera& Player::camera() const bool Player::isOnGround() const { - return mPosition.y <= 0; + return mPosition.y <= 0 or doesPlayerStandOnCollider; } diff --git a/AimGL/src/Player/Player.h b/AimGL/src/Player/Player.h index c1c3113..2b7d23b 100644 --- a/AimGL/src/Player/Player.h +++ b/AimGL/src/Player/Player.h @@ -1,6 +1,7 @@ #pragma once #include #include +#include #include class Renderer; @@ -43,6 +44,11 @@ class Player */ void update(const float& deltaTime); + /** + * \brief TODO: THIS + */ + void updateColliderPosition(); + /** * \brief Updates the Player logic at equal intervals independent of the frame rate. * \param deltaTime Time interval @@ -83,6 +89,14 @@ class Player */ const Camera& camera() const; + /** + * \brief TODO: THIS + * \param position TODO: THIS + * \param velocity TODO: THIS + * \return TODO: THIS + */ + bool tryUpdatePositionByApplyingVelocityIfCollisionAllows(float& position, float& velocity); + private: /** * \brief Updates the player's physics @@ -130,4 +144,7 @@ class Player Sprite2D mCrosshair; sf::SoundBuffer mSoundBuffer; sf::Sound mWalkingSound; + ColliderRegister& mColliderRegister; + AABB mCollider; + bool doesPlayerStandOnCollider = false; }; \ No newline at end of file diff --git a/AimGL/src/Renderer/Core/Shader.cpp b/AimGL/src/Renderer/Core/Shader.cpp index bc61e9b..97e0cea 100644 --- a/AimGL/src/Renderer/Core/Shader.cpp +++ b/AimGL/src/Renderer/Core/Shader.cpp @@ -7,8 +7,18 @@ Shader::Shader(std::initializer_list shaders) : mRendererId(0) + , mFilePaths(std::move(shaders)) { - auto parsedShaders = parseShaders(shaders); + auto parsedShaders = parseShaders(mFilePaths); + mRendererId = createShader(parsedShaders); + GLCall(glUseProgram(mRendererId)); +} + +Shader::Shader(std::vector shaders) + : mRendererId(0) + , mFilePaths(std::move(shaders)) +{ + auto parsedShaders = parseShaders(mFilePaths); mRendererId = createShader(parsedShaders); GLCall(glUseProgram(mRendererId)); } @@ -98,6 +108,11 @@ void Shader::setUniform(const std::string& name, int i1) const GLCall(glUniform1i(getUniformLocation(name), i1)); } +std::vector Shader::filePaths() const +{ + return mFilePaths; +} + unsigned Shader::getUniformLocation(const std::string& name) const { if (mUniformLocationCache.find(name) != mUniformLocationCache.end()) diff --git a/AimGL/src/Renderer/Core/Shader.h b/AimGL/src/Renderer/Core/Shader.h index e6fb669..629021e 100644 --- a/AimGL/src/Renderer/Core/Shader.h +++ b/AimGL/src/Renderer/Core/Shader.h @@ -46,6 +46,7 @@ class Shader * \param shaders List of shaders, where one shader is the type and path to the file */ Shader(std::initializer_list shaders); + Shader(std::vector shaders); Shader(const Shader&) = delete; Shader(Shader&&) noexcept; @@ -75,6 +76,11 @@ class Shader void setUniform(const std::string& name, int i1, int i2) const; void setUniform(const std::string& name, int i1) const; + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + std::vector filePaths() const; private: /** @@ -141,6 +147,7 @@ class Shader private: unsigned int mRendererId; + std::vector mFilePaths; mutable std::unordered_map mUniformLocationCache; }; diff --git a/AimGL/src/Renderer/Graphics/3D/Core/Mesh.cpp b/AimGL/src/Renderer/Graphics/3D/Core/Mesh.cpp index 68712f2..b30a559 100644 --- a/AimGL/src/Renderer/Graphics/3D/Core/Mesh.cpp +++ b/AimGL/src/Renderer/Graphics/3D/Core/Mesh.cpp @@ -1,11 +1,7 @@ #include "Mesh.h" #include "pch.h" -Mesh::Mesh(std::vector&& vertices, std::vector&& indices, - std::vector&& textures) - : vertices(std::move(vertices)) - , indices(std::move(indices)) - , textures(std::move(textures)) +void Mesh::setupBuffers() { mVBO.setBuffer(this->vertices); mEBO.setBuffer(this->indices); @@ -19,6 +15,23 @@ Mesh::Mesh(std::vector&& vertices, std::vector&& indices, mVAO.unbind(); } +Mesh::Mesh(std::vector&& vertices, std::vector&& indices, + std::vector&& textures) + : vertices(std::move(vertices)) + , indices(std::move(indices)) + , textures(std::move(textures)) +{ + setupBuffers(); +} + +Mesh::Mesh(const Mesh& rhs) + : vertices(rhs.vertices) + , indices(rhs.indices) + , textures(rhs.textures) +{ + setupBuffers(); +} + void Mesh::setTextureToShaderUniform(const Shader& shader, const Texture& texture) const { switch (texture.type()) @@ -56,3 +69,19 @@ void Mesh::draw(const Renderer& target, const Camera& camera, const Shader& shad } target.draw3D(mVAO, mEBO, shader, camera); } + +void Mesh::setTexture(Texture&& newTexture) +{ + auto it = std::find_if(textures.begin(), textures.end(), + [&newTexture](const auto& texture) + { + return texture.type() == newTexture.type(); + }); + + if (it != textures.end()) + { + *it = std::move(newTexture); + } + + textures.push_back(std::move(newTexture)); +} diff --git a/AimGL/src/Renderer/Graphics/3D/Core/Mesh.h b/AimGL/src/Renderer/Graphics/3D/Core/Mesh.h index 5a23a55..7779ab8 100644 --- a/AimGL/src/Renderer/Graphics/3D/Core/Mesh.h +++ b/AimGL/src/Renderer/Graphics/3D/Core/Mesh.h @@ -14,6 +14,7 @@ class Mesh { public: + void setupBuffers(); /** * \brief Constructor of Mesh class * \param vertices The vertices of which the shape consists @@ -23,6 +24,12 @@ class Mesh Mesh(std::vector&& vertices, std::vector&& indices, std::vector&& textures); + /** + * \brief TODO: THIS + * \param rhs TODO: THIS + */ + Mesh(const Mesh& rhs); + /** * \brief Draws a mesh for a given target * \param target The target to which the mesh is drawn @@ -31,6 +38,12 @@ class Mesh */ void draw(const Renderer& target, const Camera& camera, const Shader& shader) const; + /** + * \brief TODO: THIS + * \param newTexture TODO: THIS + */ + void setTexture(Texture&& newTexture); + private: /** * \brief Sets the specified texture to the shader diff --git a/AimGL/src/Renderer/Graphics/3D/Model.cpp b/AimGL/src/Renderer/Graphics/3D/Model.cpp index 16a0a2d..0944b1f 100644 --- a/AimGL/src/Renderer/Graphics/3D/Model.cpp +++ b/AimGL/src/Renderer/Graphics/3D/Model.cpp @@ -4,8 +4,8 @@ Model::Model(const std::string& objFilePath, const std::vector& texturesToLoad) : mShader{{ShaderType::VertexShader, "resources/Shaders/Graphics/Model/ModelTextured.vs"}, {ShaderType::FragmentShader, "resources/Shaders/Graphics/Model/ModelTextured.fs"}} - , mObjLoader(objFilePath, {ObjLoader::Flags::ForceCenterAtOrigin}) { + ObjLoader objLoader(objFilePath, {ObjLoader::Flags::ForceCenterAtOrigin}); // TODO: Storing texture this way is not the best idea as the texture // TODO: may be duplicated as many times as this object is loaded! :<< std::vector textures; @@ -15,13 +15,17 @@ Model::Model(const std::string& objFilePath, const std::vector& tex const auto& [texturePath, textureType] = textureToLoad; textures.emplace_back(texturePath, textureType); } - mMesh = std::make_unique(std::move(mObjLoader.vertices()), - std::move(mObjLoader.indices()), std::move(textures)); + mMesh = std::make_unique(std::move(objLoader.vertices()), std::move(objLoader.indices()), + std::move(textures)); + mDimensions = objLoader.dimensions(); setPosition({0, 0, 0}); } void Model::draw(const Renderer& target, const Camera& camera) const { + mShader.bind(); + mShader.setUniform("model", mLastCalculatedModel); + mShader.unbind(); mMesh->draw(target, camera, mShader); } @@ -51,6 +55,7 @@ Rotation3D Model::rotation() const void Model::setRotation(const Rotation3D& rotation) { mRotation = rotation; + updateModel(); } void Model::resetRotationOrigin() @@ -74,6 +79,16 @@ void Model::showDebugImGui(std::string name) updateModel(); } +Mesh& Model::mesh() +{ + return *mMesh; +} + +const Mesh& Model::mesh() const +{ + return *mMesh; +} + glm::vec3 Model::position() const { return mPosition; @@ -81,19 +96,15 @@ glm::vec3 Model::position() const glm::vec3 Model::dimensions() const { - return mObjLoader.dimensions() * mScale; + return mDimensions * mScale; } void Model::updateModel() { - glm::mat4 model = glm::mat4(1.0f); - model = glm::translate(model, glm::vec3(mPosition)); - model = glm::translate(model, -mRotationOrigin); - model = mRotation.rotate(model); - model = glm::translate(model, mRotationOrigin); - model = glm::scale(model, glm::vec3(mScale, mScale, mScale)); - - mShader.bind(); - mShader.setUniform("model", model); - mShader.unbind(); + mLastCalculatedModel = glm::mat4(1.0f); + mLastCalculatedModel = glm::translate(mLastCalculatedModel, glm::vec3(mPosition)); + mLastCalculatedModel = glm::translate(mLastCalculatedModel, -mRotationOrigin); + mLastCalculatedModel = mRotation.rotate(mLastCalculatedModel); + mLastCalculatedModel = glm::translate(mLastCalculatedModel, mRotationOrigin); + mLastCalculatedModel = glm::scale(mLastCalculatedModel, glm::vec3(mScale, mScale, mScale)); } diff --git a/AimGL/src/Renderer/Graphics/3D/Model.h b/AimGL/src/Renderer/Graphics/3D/Model.h index 75b4398..f1d2eb9 100644 --- a/AimGL/src/Renderer/Graphics/3D/Model.h +++ b/AimGL/src/Renderer/Graphics/3D/Model.h @@ -5,6 +5,7 @@ #include #include +class Transform; /** * \brief Texture along with the type of texture it represents */ @@ -28,6 +29,37 @@ class Model */ explicit Model(const std::string& objFilePath, const std::vector& textures = {}); + /** + * \brief TODO: THIS + * \param rhs TODO: THIS + */ + Model(const Model& rhs) + : mShader(rhs.mShader.filePaths()) + , mMesh(std::make_unique(*rhs.mMesh)) + , mPosition(rhs.mPosition) + , mRotationOrigin(rhs.mRotationOrigin) + , mScale(rhs.mScale) + , mRotation(rhs.mRotation) + , mDimensions(rhs.mDimensions) + , mLastCalculatedModel(rhs.mLastCalculatedModel) + { + setPosition(mPosition); + } + + Model& operator=(const Model& rhs) + { + // mShader = // TODO: Hmm how should i copy it? + mMesh = std::make_unique(*rhs.mMesh);// it completely copies new one + mPosition = rhs.mPosition; + mRotationOrigin = rhs.mRotationOrigin; + mScale = rhs.mScale; + mRotation = rhs.mRotation; + mDimensions = rhs.mDimensions; + mLastCalculatedModel = rhs.mLastCalculatedModel; + setPosition(mPosition); + return *this; + } + /** * \brief Determines the point at which the model has its position (0,0,0) */ @@ -100,6 +132,18 @@ class Model */ void showDebugImGui(std::string name = ""); + /** + * \brief TODO: THIS + * \return TODO: THIs + */ + Mesh& mesh(); + + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + const Mesh& mesh() const; + private: /** * \brief Updates the model in the shader @@ -108,10 +152,11 @@ class Model private: Shader mShader; - ObjLoader mObjLoader; std::unique_ptr mMesh; glm::vec3 mPosition{0, 0, 0}; glm::vec3 mRotationOrigin{0, 0, 0}; float mScale{1}; Rotation3D mRotation; + glm::vec3 mDimensions; + glm::mat4 mLastCalculatedModel; }; diff --git a/AimGL/src/Renderer/Graphics/3D/Sprite3D.h b/AimGL/src/Renderer/Graphics/3D/Sprite3D.h index 4b92a4c..edfe426 100644 --- a/AimGL/src/Renderer/Graphics/3D/Sprite3D.h +++ b/AimGL/src/Renderer/Graphics/3D/Sprite3D.h @@ -114,5 +114,5 @@ class Sprite3D glm::vec2 mScale; glm::vec2 mDimensionsNormalized; Rotation3D mRotation; - float mOpacity; + float mOpacity{1}; }; diff --git a/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.cpp b/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.cpp index 3a5061d..b826031 100644 --- a/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.cpp +++ b/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.cpp @@ -87,7 +87,7 @@ Rotation3D& Rotation3D::operator*=(const Rotation3D& rhs) return *this; } -Rotation3D::operator glm::vec<3, float>() +Rotation3D::operator glm::vec<3, float>() const { return mRotation; } diff --git a/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.h b/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.h index d30a77f..75948c3 100644 --- a/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.h +++ b/AimGL/src/Renderer/Graphics/3D/Utils/Rotation3D.h @@ -20,7 +20,7 @@ class Rotation3D Rotation3D& operator-=(const Rotation3D&); Rotation3D& operator*=(const Rotation3D&); friend Rotation3D operator*(const Rotation3D& lhs, float rhs); - explicit operator glm::vec3(); + explicit operator glm::vec3() const; /** * \brief Angles of Euler rotation. diff --git a/AimGL/src/Renderer/Graphics/Texture.cpp b/AimGL/src/Renderer/Graphics/Texture.cpp index fa889ef..8c4c0ca 100644 --- a/AimGL/src/Renderer/Graphics/Texture.cpp +++ b/AimGL/src/Renderer/Graphics/Texture.cpp @@ -63,6 +63,25 @@ Texture::Texture(Texture&& rhs) noexcept mTextureType = rhs.mTextureType; } +Texture& Texture::operator=(Texture&& rhs) noexcept +{ + if (this != &rhs) + { + GLCall(glDeleteTextures(1, &mTextureId)); + + mTextureId = rhs.mTextureId; + rhs.mTextureId = 0; + mFilePath = std::move(rhs.mFilePath); + mAspectRatio = rhs.mAspectRatio; + mWidth = rhs.mWidth; + mHeight = rhs.mHeight; + mNrChannels = rhs.mNrChannels; + mTextureType = rhs.mTextureType; + } + + return *this; +} + void Texture::bind(unsigned int slot) const { GLCall(glActiveTexture(GL_TEXTURE0 + slot)); diff --git a/AimGL/src/Renderer/Graphics/Texture.h b/AimGL/src/Renderer/Graphics/Texture.h index bd2693c..c6ac507 100644 --- a/AimGL/src/Renderer/Graphics/Texture.h +++ b/AimGL/src/Renderer/Graphics/Texture.h @@ -41,6 +41,12 @@ class Texture */ Texture(Texture&& rhs) noexcept; + /** + * \brief Move assignment of texture class + * \param rhs Other r-value texture object + */ + Texture& operator=(Texture&& rhs) noexcept; + /** * \brief Binds a texture for rendering * \param slot Slot to which the texture will be binded (can be obtained from the shader level) diff --git a/AimGL/src/States/CustomStates/GameState.cpp b/AimGL/src/States/CustomStates/GameState.cpp index c9c64c3..30e550a 100644 --- a/AimGL/src/States/CustomStates/GameState.cpp +++ b/AimGL/src/States/CustomStates/GameState.cpp @@ -5,38 +5,26 @@ #include "pch.h" #include +#include GameState::GameState(StateStack& stack, WindowToRender& window) : State(stack) , mWindow(window) , mPlayer(window, mColliderRegister) , mRenderer(mWindow) - , mLogoTexture("resources/Textures/logo_background.png") - , mLogo(mLogoTexture) , mGameBackground(glm::vec2(1280, 720.f), glm::vec4(0.85f, 0.85f, 0.85f, 1.f)) , mPhaseInLogoColor({window.getSize().x, window.getSize().y}, {0.067f, 0.11f, 0.18f, 1.1f}) - , mTree("resources/Models/tree/tree.obj", - {{"resources/Models/tree/tree_combined.png", Texture::Type::Diffuse}}) + , mShootingRange(mColliderRegister, {-2, 0, 5.5}) + , mSidewayMovingTargetsRange(mColliderRegister, {3, 0, 5.5}) + , mWelcomeScreenTexture("resources/Textures/welcome-screen.png") + , mWelcomeScreen(mWelcomeScreenTexture) { Mouse::lockMouseAtCenter(mWindow); - mTree.setScale(0.2f); - mTree.setPosition({4, 0, 4}, Model::Origin::CenterBottom); - mLogo.setHeight(2.f); - mLogo.setPosition(glm::vec3(4, 0, 4), Sprite3D::Origin::LeftBottom); - mLogo.setRotation({225.f, 0.f, 0}); - mLogo.setOpacity(1); + mWelcomeScreen.setScale(2); + mWelcomeScreen.setPosition({0, 1, -2}, Sprite3D::Origin::Center); mGameBackground.setPosition({0, 0}); mPhaseInLogoColor.setPosition({0, 0}); mPhaseInClock.restart(); - - std::vector samplePreviewTargetsPositons = { - {2, 2, 2}, {2, 1, 2}, {2, 3, 2}, {2.5, 2, 2.6}, {3, 3, 3}, - {3, 2, 1}, {1, 2, 3}, {0, 3, 2}, {0, 1, 1}, {0, 2, 4}}; - for (auto& position: samplePreviewTargetsPositons) - { - auto test = std::make_unique(mColliderRegister, position); - mPreviewTargets.push_back(std::move(test)); - } } void GameState::draw(sf::Window& target) const @@ -44,33 +32,27 @@ void GameState::draw(sf::Window& target) const MTR_SCOPE("GameState", "GameState::draw"); mGameBackground.draw(mRenderer); mInfiniteGridFloor.draw(target, mPlayer.camera()); - mTree.draw(mRenderer, mPlayer.camera()); - mLogo.draw(mRenderer, mPlayer.camera()); + mWelcomeScreen.draw(mRenderer, mPlayer.camera()); mPhaseInLogoColor.draw(mRenderer); - - for (auto& previewTarget: mPreviewTargets) - { - previewTarget->draw(mRenderer, mPlayer.camera()); - } + mShootingRange.draw(mRenderer, mPlayer.camera()); + mSidewayMovingTargetsRange.draw(mRenderer, mPlayer.camera()); mPlayer.draw(mRenderer); } bool GameState::fixedUpdate(const float& deltaTime) { MTR_SCOPE("GameState", "GameState::fixedUpdate"); - mPlayer.fixedUpdate(deltaTime); mColliderRegister.updateAllCollisions(); + mPlayer.fixedUpdate(deltaTime); return true; } bool GameState::update(const float& deltaTime) { MTR_SCOPE("GameState", "GameState::update"); - for (auto& previewTarget: mPreviewTargets) - { - previewTarget->update(deltaTime); - } mPlayer.update(deltaTime); + mShootingRange.update(deltaTime); + mSidewayMovingTargetsRange.update(deltaTime); if (mPhaseInLogoColor.opacity() > 0) { @@ -83,23 +65,96 @@ bool GameState::handleEvent(const sf::Event& event) { MTR_SCOPE("GameState", "GameState::handleEvent"); mPlayer.handleEvent(event); + mShootingRange.handleEvent(event); + mSidewayMovingTargetsRange.handleEvent(event); if (event.type == sf::Event::KeyPressed) { switch (event.key.code) { case sf::Keyboard::Escape: Mouse::unlockMouse(mWindow); break; + case sf::Keyboard::F1: switchWireframe(); break; + case sf::Keyboard::F2: switchDrawingColliders(); break; + case sf::Keyboard::F3: switchDrawingImgui(); break; } } Mouse::handleFirstPersonBehaviour(event, mWindow); return true; } +void GameState::switchWireframe() +{ + std::unique_ptr rastMode(new int[2]); + GLCall(glGetIntegerv(GL_POLYGON_MODE, rastMode.get())); + + if (rastMode[1] == GL_FILL) + { + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + } + else + { + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } +} + +void GameState::switchDrawingColliders() +{ +#ifdef _DEBUG + DRAW_COLLIDERS = !DRAW_COLLIDERS; +#endif +} + +void GameState::switchDrawingImgui() +{ + mDrawImgui = !mDrawImgui; +} + +void GameState::updateImguiDebugMenu() +{ + if (ImGui::BeginMenu("Debug menu")) + { + if (ImGui::MenuItem("Switch Wireframe (on/off)")) + { + switchWireframe(); + } + + if (ImGui::MenuItem("Toggle colliders draw")) + { + switchDrawingColliders(); + } + + if (ImGui::MenuItem("Toggle imgui draw")) + { + switchDrawingImgui(); + } + ImGui::EndMenu(); + } +} + +void GameState::updateImGuiDebugInstructionText() +{ + auto windowWidth = ImGui::GetWindowSize().x; + auto debugInfoText = "F1 - Wireframe | F2 - Toggle colliders draw | F3 - Toggle imgui draw"; + auto textWidth = ImGui::CalcTextSize(debugInfoText).x; + auto margin = 10.f; + + ImGui::SetCursorPosX(windowWidth - textWidth - margin); + ImGui::Text(debugInfoText); + ImGui::EndMainMenuBar(); +} + bool GameState::updateImGui(const float& deltaTime) { MTR_SCOPE("GameState", "GameState::updateImGui"); - mInfiniteGridFloor.showDebugImGui(); - mLogo.showDebugImGui("Logo"); - mTree.showDebugImGui("Tree"); + if (mDrawImgui) + { + if (ImGui::BeginMainMenuBar()) + { + updateImguiDebugMenu(); + updateImGuiDebugInstructionText(); + } + mInfiniteGridFloor.showDebugImGui(); + mShootingRange.showDebugImGui("Shooting Range"); + } return true; } diff --git a/AimGL/src/States/CustomStates/GameState.h b/AimGL/src/States/CustomStates/GameState.h index cb1ec6e..2d66b01 100644 --- a/AimGL/src/States/CustomStates/GameState.h +++ b/AimGL/src/States/CustomStates/GameState.h @@ -8,9 +8,9 @@ #include "World/InfiniteGridFloor.h" #include -#include #include -#include +#include +#include class StateStack; @@ -28,7 +28,6 @@ class GameState : public State */ void draw(sf::Window& target) const override; - /** * \brief Updates the state logic at equal intervals independent of the frame rate. * \param deltaTime Time interval @@ -47,6 +46,31 @@ class GameState : public State */ bool handleEvent(const sf::Event& event) override; + /** + * \brief TODO: THIS + */ + void switchWireframe(); + + /** + * \brief TODO: THIS + */ + void switchDrawingColliders(); + + /** + * \brief TODO: THIS + */ + void switchDrawingImgui(); + + /** + * \brief TODO: THIS + */ + void updateImguiDebugMenu(); + + /** + * \brief TODO: THIS + */ + void updateImGuiDebugInstructionText(); + /** * \brief Updates the imgui logic dependent, or independent of time, every rendered frame. * \param deltaTime the time that has passed since the game was last updated. @@ -58,12 +82,13 @@ class GameState : public State ColliderRegister mColliderRegister; Player mPlayer; Renderer mRenderer; - Texture mLogoTexture; - Sprite3D mLogo; Rectangle2D mGameBackground; sf::Clock mPhaseInClock; Rectangle2D mPhaseInLogoColor; InfiniteGridFloor mInfiniteGridFloor; - Model mTree; - std::vector> mPreviewTargets; + ShootingRange mShootingRange; + SidewayMovingTargetsRange mSidewayMovingTargetsRange; + Texture mWelcomeScreenTexture; + Sprite3D mWelcomeScreen; + bool mDrawImgui{true}; }; diff --git a/AimGL/src/States/CustomStates/LogoState.cpp b/AimGL/src/States/CustomStates/LogoState.cpp index 8c58fc5..2711afe 100644 --- a/AimGL/src/States/CustomStates/LogoState.cpp +++ b/AimGL/src/States/CustomStates/LogoState.cpp @@ -67,6 +67,5 @@ bool LogoState::handleEvent(const sf::Event& event) bool LogoState::updateImGui(const float& deltaTime) { MTR_SCOPE("LogoState", "LogoState::updateImGui"); - ImGui::ShowDemoWindow(); return true; } diff --git a/AimGL/src/Utils/Transform.cpp b/AimGL/src/Utils/Transform.cpp new file mode 100644 index 0000000..e60891c --- /dev/null +++ b/AimGL/src/Utils/Transform.cpp @@ -0,0 +1,27 @@ +#include "Transform.h" +#include "pch.h" + +#include + +glm::mat4 Transform::matrix() const +{ + return mTransform; +} + +Transform& Transform::translate(const glm::vec3& vec) +{ + glm::translate(mTransform, vec); + return *this; +} + +Transform& Transform::rotate(const Rotation3D& rotation) +{ + mTransform = rotation.rotate(mTransform); + return *this; +} + +Transform& Transform::operator*=(const Transform& rhs) +{ + mTransform *= rhs.mTransform; + return *this; +} diff --git a/AimGL/src/Utils/Transform.h b/AimGL/src/Utils/Transform.h new file mode 100644 index 0000000..979ff05 --- /dev/null +++ b/AimGL/src/Utils/Transform.h @@ -0,0 +1,17 @@ + +#pragma once + +class Rotation3D; + +class Transform +{ +public: + [[nodiscard]] glm::mat4 matrix() const; + Transform& translate(const glm::vec3& vec); + Transform& rotate(const Rotation3D& rotation); + Transform& operator*=(const Transform& rhs); + + +private: + glm::mat4 mTransform{1}; +}; diff --git a/AimGL/src/World/Physics/Collider.h b/AimGL/src/World/Physics/Collider.h index 92f3c0e..e19a899 100644 --- a/AimGL/src/World/Physics/Collider.h +++ b/AimGL/src/World/Physics/Collider.h @@ -1,10 +1,10 @@ #pragma once +#include "World/Physics/ColliderRegister.h" #include "World/Physics/ColliderTag.h" class SphereCollider; class RectangleCollider; class RayCollider; -class ColliderRegister; /** * \brief Base class for collision detection objects. @@ -17,6 +17,13 @@ class Collider * \param colliderRegister Reference to the collision register for tracking colliders. */ explicit Collider(ColliderRegister& colliderRegister); + Collider(const Collider& rhs) + : mCallback(rhs.mCallback) + , mColliderRegister(rhs.mColliderRegister) + , mColliderTag(rhs.mColliderTag) + { + mColliderRegister.add(*this); + } virtual ~Collider(); /** diff --git a/AimGL/src/World/Physics/ColliderRegister.cpp b/AimGL/src/World/Physics/ColliderRegister.cpp index 5721f62..9fafa78 100644 --- a/AimGL/src/World/Physics/ColliderRegister.cpp +++ b/AimGL/src/World/Physics/ColliderRegister.cpp @@ -50,3 +50,16 @@ void ColliderRegister::updateAllCollisions() } } } + +std::vector ColliderRegister::findCollisions(const Collider& colliderToFound) const +{ + std::vector foundColliders; + for (const auto& collider: mColliders) + { + if (&*collider != &colliderToFound && colliderToFound.checkCollision(*collider)) + { + foundColliders.push_back(collider); + } + } + return foundColliders; +} diff --git a/AimGL/src/World/Physics/ColliderRegister.h b/AimGL/src/World/Physics/ColliderRegister.h index 69c3b46..19b8683 100644 --- a/AimGL/src/World/Physics/ColliderRegister.h +++ b/AimGL/src/World/Physics/ColliderRegister.h @@ -25,6 +25,13 @@ class ColliderRegister */ void updateAllCollisions(); + /** + * \brief TODO: THIS + * \param collider TODO: THIS + * \return TODO: THIS + */ + std::vector findCollisions(const Collider& collider) const; + private: /** * \brief Adds colliders that are queued for addition to the collision system. diff --git a/AimGL/src/World/Physics/Drawable/AABB.cpp b/AimGL/src/World/Physics/Drawable/AABB.cpp index ec0aed0..6b381f6 100644 --- a/AimGL/src/World/Physics/Drawable/AABB.cpp +++ b/AimGL/src/World/Physics/Drawable/AABB.cpp @@ -1,7 +1,8 @@ #include "AABB.h" +#include "Renderer/Renderer.h" #include "pch.h" -#include "Renderer/Renderer.h" +#include void AABB::updateBuffers() { @@ -33,22 +34,125 @@ AABB::AABB(ColliderRegister& colliderRegister, const glm::vec3& min, const glm:: : DrawableCollider(colliderRegister, min, max) , mMin(mCollider.min) , mMax(mCollider.max) + , mOriginalMin(mCollider.min) + , mOriginalMax(mCollider.max) , mShader{{ShaderType::VertexShader, "resources/Shaders/Graphics/Physics/AABB.vs"}, {ShaderType::FragmentShader, "resources/Shaders/Graphics/Physics/AABB.fs"}} + , mPosition(min) + , mColliderRegister(colliderRegister) { mBufferLayout.push(3); updateBuffers(); } +AABB& AABB::operator=(const AABB& rhs) +{ + if (&rhs != this) + { + mMin = rhs.mMin; + mMax = rhs.mMax; + mOriginalMin = rhs.mOriginalMin; + mOriginalMax = rhs.mOriginalMax; + mRotation = rhs.mRotation; + mScale = rhs.mScale; + mPosition = rhs.mPosition; + updateBuffers(); + } + return *this; +} + void AABB::draw(const Renderer& target, const Camera& camera) const { - target.draw3D(mVAO, mEBO, mShader, camera, Renderer::DrawMode::Lines); + if (DRAW_COLLIDERS) + { + target.draw3D(mVAO, mEBO, mShader, camera, Renderer::DrawMode::Lines); + } } void AABB::setPosition(const glm::vec3& position) +{ + mPosition = position; + calculateNewAABB(); +} + +glm::vec3 AABB::dimensions() const +{ + return mMax - mMin; +} + +const Collider& AABB::collider() const +{ + return mCollider; +} + +void AABB::setScale(double scaleRatio) +{ + mScale = scaleRatio; + calculateNewAABB(); +} + +void AABB::setRotation(const Rotation3D& rotation) +{ + mRotation = rotation; + calculateNewAABB(); +} + +void AABB::updateRotation() +{ + auto mOldMin = mMin; + auto mOldMax = mMax; + auto dims = mMax - mMin; + mMin = glm::vec3{0.f, 0.f, 0.f} - dims / 2.f; + mMax = glm::vec3{0.f, 0.f, 0.f} + dims / 2.f; + glm::vec3 originalCenter = (mOldMin + mOldMax) * 0.5f; + auto translation = originalCenter; + + glm::mat4 rotX = + glm::rotate(glm::mat4(1.0f), glm::radians(mRotation.pitch), glm::vec3(1, 0, 0)); + glm::mat4 rotY = glm::rotate(glm::mat4(1.0f), glm::radians(mRotation.yaw), glm::vec3(0, 1, 0)); + glm::mat4 rotZ = glm::rotate(glm::mat4(1.0f), glm::radians(mRotation.roll), glm::vec3(0, 0, 1)); + glm::mat4 rotationMatrix = rotY * rotX * rotZ;// Order can be important! + + // Define all 8 vertices of the original AABB + std::vector vertices = {{mMin.x, mMin.y, mMin.z}, {mMin.x, mMin.y, mMax.z}, + {mMin.x, mMax.y, mMin.z}, {mMin.x, mMax.y, mMax.z}, + {mMax.x, mMin.y, mMin.z}, {mMax.x, mMin.y, mMax.z}, + {mMax.x, mMax.y, mMin.z}, {mMax.x, mMax.y, mMax.z}}; + + glm::vec3 newMin(std::numeric_limits::max()); + glm::vec3 newMax(std::numeric_limits::lowest()); + + // Rotate each vertex and adjust newMin and newMax accordingly + for (auto& vertex: vertices) + {// translateBack * matRotation * translateToOrigin; + glm::vec4 rotated = rotationMatrix * glm::vec4(vertex, 1.0f);// Apply rotation + newMin = glm::min(newMin, glm::vec3(rotated)); + newMax = glm::max(newMax, glm::vec3(rotated)); + } + + mMin = newMin + translation; + mMax = newMax + translation; +} + +void AABB::updatePosition() { auto diff = mMax - mMin; - mMin = position; + mMin += mPosition;// bug there ?? mMax = mMin + diff; +} + +void AABB::updateScale() +{ + mMin *= mScale; + mMax *= mScale; +} + +void AABB::calculateNewAABB() +{ + mMin = mOriginalMin; + mMax = mOriginalMax; + updateScale(); + updateRotation(); + updatePosition(); updateBuffers(); } diff --git a/AimGL/src/World/Physics/Drawable/AABB.h b/AimGL/src/World/Physics/Drawable/AABB.h index a3ce5e5..9f4e722 100644 --- a/AimGL/src/World/Physics/Drawable/AABB.h +++ b/AimGL/src/World/Physics/Drawable/AABB.h @@ -6,10 +6,10 @@ #include "Renderer/Core/VertexArray.h" #include "World/Physics/Drawable/DrawableCollider.h" #include "World/Physics/RectangleCollider.h" +#include class Camera; class Renderer; -class ColliderRegister; /** * \brief Axis-Aligned Bounding Box (AABB) with drawable and collision detection capabilities. @@ -24,7 +24,23 @@ class AABB : public DrawableCollider * \param max The maximum corner point of the AABB in 3D space. */ AABB(ColliderRegister& colliderRegister, const glm::vec3& min, const glm::vec3& max); - AABB(AABB&&) noexcept = default; + AABB(AABB&&) noexcept = delete; + AABB(const AABB& rhs) + : DrawableCollider(rhs) + , mMin(mCollider.min) + , mMax(mCollider.max) + , mOriginalMin(mCollider.min) + , mOriginalMax(mCollider.max) + , mRotation(rhs.mRotation) + , mScale(rhs.mScale) + , mPosition(rhs.mPosition) + , mColliderRegister(rhs.mColliderRegister) + , mShader{rhs.mShader.filePaths()} + { + mBufferLayout.push(3); + updateBuffers(); + } + AABB& operator=(const AABB& rhs); /** * \brief Draws a AABB for a given target @@ -45,6 +61,30 @@ class AABB : public DrawableCollider */ void setPosition(const glm::vec3& position); + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + glm::vec3 dimensions() const; + + /** + * \brief TODO: THIs + * \return TODO: THIS + */ + const Collider& collider() const; + + /** + * \brief TODO: THIS + * \param scaleRatio TODO: THIS + */ + void setScale(double scaleRatio); + + /** + * \brief TODO: THIS + * \param rotation TODO: THIS + */ + void setRotation(const Rotation3D& rotation); + private: /** * \brief Updates buffers (e.g., the position of vertices) @@ -54,9 +94,35 @@ class AABB : public DrawableCollider */ void updateBuffers(); + /** + * \brief TODO: THIS + */ + void updateRotation(); + + /** + * \brief TODO: THIS + */ + void updatePosition(); + + /** + * \brief TODO: THIS + */ + void calculateNewAABB(); + + /** + * \brief TODO: THIS + */ + void updateScale(); + private: glm::vec3& mMin; glm::vec3& mMax; + glm::vec3 mOriginalMin{}; + glm::vec3 mOriginalMax{}; + Rotation3D mRotation{0, 0, 0}; + float mScale{1}; + glm::vec3 mPosition{0, 0, 0}; + ColliderRegister& mColliderRegister; VertexArray mVAO; VertexBuffer mVBO; diff --git a/AimGL/src/World/Physics/Drawable/DrawableCollider.h b/AimGL/src/World/Physics/Drawable/DrawableCollider.h index 5e2f49a..fd5ae5d 100644 --- a/AimGL/src/World/Physics/Drawable/DrawableCollider.h +++ b/AimGL/src/World/Physics/Drawable/DrawableCollider.h @@ -4,8 +4,9 @@ /** - * \brief A template class for colliders that are both drawable and functional in collision - * detection. \tparam ColliderType The type of collider this class is templating (e.g., + * \brief A template class for colliders that are both drawable and + * functional in collision detection. + * \tparam ColliderType The type of collider this class is templating (e.g., * SphereCollider, RectangleCollider). */ template @@ -13,14 +14,18 @@ class DrawableCollider { public: virtual ~DrawableCollider() = default; + DrawableCollider(DrawableCollider&&) noexcept = default; + DrawableCollider(const DrawableCollider&) = default; /** * \brief Constructor that initializes the collider with provided parameters. * \tparam Args The types of arguments to forward to the ColliderType's constructor. * \param params Arguments to forward to the ColliderType's constructor. */ - template - explicit DrawableCollider(Args&&... params); + template< + typename FirstArg, typename... Args, + typename = std::enable_if_t>>> + explicit DrawableCollider(FirstArg&& firstArg, Args&&... params); /** * \brief Sets a callback function to be executed when a collision occurs. @@ -45,9 +50,9 @@ class DrawableCollider }; template -template -DrawableCollider::DrawableCollider(Args&&... params) - : mCollider(std::forward(params)...) +template +DrawableCollider::DrawableCollider(FirstArg&& firstArg, Args&&... params) + : mCollider(std::forward(firstArg), std::forward(params)...) { } diff --git a/AimGL/src/World/Physics/Drawable/Ray.cpp b/AimGL/src/World/Physics/Drawable/Ray.cpp index df9862b..186f41f 100644 --- a/AimGL/src/World/Physics/Drawable/Ray.cpp +++ b/AimGL/src/World/Physics/Drawable/Ray.cpp @@ -3,6 +3,8 @@ #include "Renderer/Renderer.h" +#include + Ray::Ray(ColliderRegister& colliderRegister, const glm::vec3& origin, const glm::vec3& direction, float length) : DrawableCollider(colliderRegister, origin, direction, length) @@ -24,6 +26,9 @@ Ray::Ray(ColliderRegister& colliderRegister, const glm::vec3& origin, const glm: void Ray::draw(const Renderer& target, const Camera& camera) const { - constexpr auto numberOfVertices = 6; - target.draw3D(mVAO, numberOfVertices, mShader, camera, Renderer::DrawMode::Lines); + if (DRAW_COLLIDERS) + { + constexpr auto numberOfVertices = 6; + target.draw3D(mVAO, numberOfVertices, mShader, camera, Renderer::DrawMode::Lines); + } } diff --git a/AimGL/src/World/Physics/Drawable/Ray.h b/AimGL/src/World/Physics/Drawable/Ray.h index 5a8fad8..2280509 100644 --- a/AimGL/src/World/Physics/Drawable/Ray.h +++ b/AimGL/src/World/Physics/Drawable/Ray.h @@ -8,7 +8,6 @@ class Camera; class Renderer; -class ColliderRegister; /** * \brief Represents a ray in 3D space, defined by an origin point, direction vector, and length. diff --git a/AimGL/src/World/Physics/RectangleCollider.h b/AimGL/src/World/Physics/RectangleCollider.h index 26ac0df..c6ff6a8 100644 --- a/AimGL/src/World/Physics/RectangleCollider.h +++ b/AimGL/src/World/Physics/RectangleCollider.h @@ -16,6 +16,9 @@ class RectangleCollider : public Collider RectangleCollider(ColliderRegister& colliderRegister, const glm::vec3& min, const glm::vec3& max); + RectangleCollider(RectangleCollider&&) noexcept = delete; + RectangleCollider(const RectangleCollider&) = default; + /** * \brief Checks for collision with another collider. * \param other The collider to check collision against. diff --git a/AimGL/src/World/Scene/GameObjects/ButtonStand.cpp b/AimGL/src/World/Scene/GameObjects/ButtonStand.cpp new file mode 100644 index 0000000..9936560 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/ButtonStand.cpp @@ -0,0 +1,91 @@ +#include "ButtonStand.h" +#include "pch.h" + +ButtonStand::ButtonStand(ColliderRegister& colliderRegister, const glm::vec3& position) + : mButtonStand("resources/Models/button_stand/button-stand.obj", + {{"resources/Models/button_stand/button-stand.png", Texture::Type::Diffuse}}) + , mColliderRegister(colliderRegister) + , mCollisionBox(mColliderRegister, {0, 0, 0}, mButtonStand.dimensions()) + , mButtonShotTriggerBox( + colliderRegister, {0, 0, 0}, + {mButtonStand.dimensions().x / 2.f, 0.1, mButtonStand.dimensions().z / 2.f}) +{ + mSoundBuffer.loadFromFile("resources/Sounds/button-click.wav"); + mClickSound.setBuffer(mSoundBuffer); + setPosition(position); + mCollisionBox.colliderTag(ColliderTag::Solid); + + mButtonShotTriggerBox.callback( + [this](const Collider& collider) + { + if (collider.colliderTag() == ColliderTag::GunShot) + { + if (not isAnimationBeingPlayed) + { + signalizeButtonClick(); + mOnShotFunction(); + } + } + }); +} + +void ButtonStand::draw(const Renderer& target, const Camera& camera) const +{ + mButtonStand.draw(target, camera); + mCollisionBox.draw(target, camera); + mButtonShotTriggerBox.draw(target, camera); +} + +void ButtonStand::update(const float& deltaTime) +{ + if (isAnimationBeingPlayed) + { + if (mAnimationClock.getElapsedTime() > mTimeOfClickAnimation) + { + isAnimationBeingPlayed = false; + mButtonStand.mesh().setTexture( + {"resources/Models/button_stand/button-stand.png", Texture::Type::Diffuse}); + } + } +} + +void ButtonStand::onClick(std::function onShotFunction) +{ + mOnShotFunction = std::move(onShotFunction); +} + +void ButtonStand::handleEvent(const sf::Event& event) +{ + // TODO: Meh... I think it is unexpected to check + // whether mouse is clicked :/ + + if (event.type == sf::Event::MouseButtonPressed && event.key.code == sf::Mouse::Left && + not isAnimationBeingPlayed) + { + hasNewMouseClickOccured = true; + } +} + +void ButtonStand::setPosition(const glm::vec3& newPosition) +{ + mButtonStand.setPosition(newPosition); + mCollisionBox.setPosition(mButtonStand.position() - mButtonStand.dimensions() / 2.f); + auto shotTriggerBoxPosition = mButtonStand.position(); + shotTriggerBoxPosition.x -= mButtonStand.dimensions().x / 4.f; + shotTriggerBoxPosition.z -= mButtonStand.dimensions().z / 4.f; + shotTriggerBoxPosition.y += (mButtonStand.dimensions().y / 2.f) - 0.1; + mButtonShotTriggerBox.setPosition(shotTriggerBoxPosition); +} + +void ButtonStand::signalizeButtonClick() +{ + if (hasNewMouseClickOccured) + { + isAnimationBeingPlayed = true; + mAnimationClock.restart(); + mButtonStand.mesh().setTexture( + {"resources/Models/button_stand/button-stand-clicked.png", Texture::Type::Diffuse}); + hasNewMouseClickOccured = false; + mClickSound.play(); + } +} diff --git a/AimGL/src/World/Scene/GameObjects/ButtonStand.h b/AimGL/src/World/Scene/GameObjects/ButtonStand.h new file mode 100644 index 0000000..c91f24c --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/ButtonStand.h @@ -0,0 +1,69 @@ +#pragma once +#include +#include + +class ColliderRegister; + +class ButtonStand +{ +public: + /** + * \brief Constructor of Button Stand class + * \param colliderRegister Register in which all collisions on the scene should be located + * \param position + */ + ButtonStand(ColliderRegister& colliderRegister, const glm::vec3& position); + + /** + * \brief Draws a Button Stand to a given target + * \param target The target to which the sprite is drawn + * \param camera TODO: THIS + */ + void draw(const Renderer& target, const Camera& camera) const; + + /** + * Updates the Button Stand logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief TODO: THIS + * \param onShotFunction TODO: THIS + */ + void onClick(std::function onShotFunction); + + /** + * \brief It takes input (event) from the user and interprets it + * \param event user input + */ + void handleEvent(const sf::Event& event); + + /** + * \brief TODO: THIS + * \param newPosition TODO: THIS + */ + void setPosition(const glm::vec3& newPosition); + +private: + /** + * \brief TODO: THIS + */ + void signalizeButtonClick(); + +private: + Model mButtonStand; + sf::SoundBuffer mSoundBuffer; + sf::Sound mClickSound; + ColliderRegister& mColliderRegister; + AABB mCollisionBox; + AABB mButtonShotTriggerBox; + std::function mOnShotFunction = []() + { + }; + + sf::Time mTimeOfClickAnimation = sf::seconds(1); + sf::Clock mAnimationClock; + bool isAnimationBeingPlayed = false; + bool hasNewMouseClickOccured = true; +}; diff --git a/AimGL/src/World/Scene/GameObjects/LongCrate.cpp b/AimGL/src/World/Scene/GameObjects/LongCrate.cpp new file mode 100644 index 0000000..ce91ad2 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/LongCrate.cpp @@ -0,0 +1,60 @@ +#include "LongCrate.h" +#include "pch.h" + +LongCrate::LongCrate(ColliderRegister& colliderRegister, const glm::vec3& position) + : mLongCrate("resources/Models/long-crate/long-crate.obj", + {{"resources/Models/long-crate/diffuse.png", Texture::Type::Diffuse}, + {"resources/Models/long-crate/specular.png", Texture::Type::Specular}}) + , mPosition(position) + , mAABB(colliderRegister, {0, 0, 0}, mLongCrate.dimensions()) +{ + mAABB.colliderTag(ColliderTag::Solid); + setPosition(mPosition); +} + +void LongCrate::draw(const Renderer& target, const Camera& camera) const +{ + mLongCrate.draw(target, camera); + mAABB.draw(target, camera); +} + +void LongCrate::update(const float& deltaTime) +{ +} + +void LongCrate::handleEvent(const sf::Event& event) +{ +} + +void LongCrate::showDebugImGui(std::string name) +{ + name = "[Model] " + name; + ImGui::Begin(name.c_str()); + ImGui::SliderFloat3("Position", &mPosition[0], -50, 50.f); + mRotation.imGuiRotationSlider(); + ImGui::End(); + setPosition(mPosition); + setRotation(mRotation); +} + +void LongCrate::setPosition(const glm::vec3& newPosition) +{ + mLongCrate.setPosition(newPosition); + mAABB.setPosition(mLongCrate.position() - mLongCrate.dimensions() / 2.f); + auto rotation = Rotation3D{90.f, 0, 0}; + // mLongCrate.setRotation(rotation); + // mAABB.setRotation(rotation); +} + +void LongCrate::setScale(double scaleRatio) +{ + mLongCrate.setScale(scaleRatio); + mAABB.setScale(scaleRatio); + // mAABB.setPosition(mLongCrate.position() - mLongCrate.dimensions() / 2.f); +} + +void LongCrate::setRotation(const Rotation3D& rotation) +{ + mLongCrate.setRotation(rotation); + mAABB.setRotation(rotation); +} diff --git a/AimGL/src/World/Scene/GameObjects/LongCrate.h b/AimGL/src/World/Scene/GameObjects/LongCrate.h new file mode 100644 index 0000000..72781de --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/LongCrate.h @@ -0,0 +1,68 @@ +#pragma once +#include +#include + +class Camera; +class Renderer; +class ColliderRegister; + +class LongCrate +{ +public: + /** + * \brief Constructor of ShootingRange class + * \param colliderRegister Register in which all collisions on the scene should be located + * \param position TODO: THIS + */ + LongCrate(ColliderRegister& colliderRegister, const glm::vec3& position); + + /** + * \brief Draws a shooting range to a given target + * \param target The target to which the model is drawn + * \param camera A camera in 3D space that looks at this object + */ + void draw(const Renderer& target, const Camera& camera) const; + + /** + * Updates the Shooting Range logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief It takes input (event) from the user and interprets it + * \param event user input + */ + void handleEvent(const sf::Event& event); + + /** + * \brief Displays a debug ImGui window that allows to change the internal + * variables of the 3d model. + * \param name Optional name of the model (it can be seen in the window name). + */ + void showDebugImGui(std::string name = ""); + + /** + * \brief TODO: THIS + * \param newPosition TODO: THIS + */ + void setPosition(const glm::vec3& newPosition); + + /** + * \brief TODO: THIS + * \param scaleRatio TODO: THIS + */ + void setScale(double scaleRatio); + + /** + * \brief TODO: THIS + * \param rotation TODO: THIS + */ + void setRotation(const Rotation3D& rotation); + +private: + Model mLongCrate; + glm::vec3 mPosition; + Rotation3D mRotation{0, 0, 0}; + AABB mAABB; +}; diff --git a/AimGL/src/World/Scene/GameObjects/PreviewTarget.cpp b/AimGL/src/World/Scene/GameObjects/PreviewTarget.cpp deleted file mode 100644 index fa4e429..0000000 --- a/AimGL/src/World/Scene/GameObjects/PreviewTarget.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "PreviewTarget.h" -#include "World/Physics/ColliderRegister.h" -#include "pch.h" - -PreviewTarget::PreviewTarget(ColliderRegister& colliderRegister, const glm::vec3& position) - : mAABB(colliderRegister, {0, 0, 0}, {0.5, 0.5, 0.5}) - , mSphere("resources/Models/sphere.obj") - , mPosition(position) -{ - mBuffer.loadFromFile("resources/Sounds/target-shot.wav"); - mSound.setBuffer(mBuffer); - mAABB.callback( - [this](const Collider& collider) - { - if (collider.colliderTag() == ColliderTag::GunShot && not mIsAboutToBeDeleted) - { - mSound.play(); - mIsAboutToBeDeleted = true; - } - }); - mSphere.setScale(0.5); - mSphere.setPosition(position); -} - -void PreviewTarget::draw(const Renderer& target, const Camera& camera) const -{ - if (not mIsAboutToBeDeleted) - { - mSphere.draw(target, camera); - mAABB.draw(target, camera); - } -} - -void PreviewTarget::update(const float& deltaTime) -{ - if (not mIsAboutToBeDeleted) - { - mAABB.setPosition(mSphere.position() - mSphere.dimensions() / 2.f); - } -} diff --git a/AimGL/src/World/Scene/GameObjects/PreviewTarget.h b/AimGL/src/World/Scene/GameObjects/PreviewTarget.h deleted file mode 100644 index d96ba1b..0000000 --- a/AimGL/src/World/Scene/GameObjects/PreviewTarget.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once -#include "Renderer/Graphics/3D/Model.h" -#include "World/Physics/Drawable/AABB.h" - -class ColliderRegister; - -/** - * \brief Target possible to shoot down with weapon. - * - * @warning This facility is for illustrative purposes only. - * It will be removed from here. It is not intended for use in the final game - */ -class PreviewTarget -{ -public: - PreviewTarget(ColliderRegister& colliderRegister, const glm::vec3& position); - - /** - * \brief Draws a PreviewTarget for a given target - * \param target The target to which the model is drawn - * \param camera A camera in 3D space that looks at this object - */ - void draw(const Renderer& target, const Camera& camera) const; - - /** - * Updates the PreviewTarget logic dependent, or independent of time, every rendered frame. - * \param deltaTime the time that has passed since the game was last updated. - */ - void update(const float& deltaTime); - -private: - AABB mAABB; - Model mSphere; - glm::vec3 mPosition; - sf::SoundBuffer mBuffer; - sf::Sound mSound; - bool mIsAboutToBeDeleted = false; -}; diff --git a/AimGL/src/World/Scene/GameObjects/Rifle.cpp b/AimGL/src/World/Scene/GameObjects/Rifle.cpp index ba0d474..e69022a 100644 --- a/AimGL/src/World/Scene/GameObjects/Rifle.cpp +++ b/AimGL/src/World/Scene/GameObjects/Rifle.cpp @@ -29,6 +29,10 @@ void Rifle::draw(const Renderer& target) const void Rifle::update(const float& deltaTime) { updateAttachToCamera(deltaTime); + if (mLatelyShotRay.has_value() and mShotRayClock.getElapsedTime() > mShotRayDeleteTime) + { + mLatelyShotRay.reset(); + } } void Rifle::updateAttachToCamera(const float& deltaTime) @@ -67,5 +71,6 @@ void Rifle::handleEvent(const sf::Event& event) mGunShotSound.play(); mLatelyShotRay.emplace(mColliderRegister, mCamera.cameraPosition(), mCamera.direction()); mLatelyShotRay.value().colliderTag(ColliderTag::GunShot); + mShotRayClock.restart(); } } \ No newline at end of file diff --git a/AimGL/src/World/Scene/GameObjects/Rifle.h b/AimGL/src/World/Scene/GameObjects/Rifle.h index 849cedb..2bb4b78 100644 --- a/AimGL/src/World/Scene/GameObjects/Rifle.h +++ b/AimGL/src/World/Scene/GameObjects/Rifle.h @@ -57,4 +57,6 @@ class Rifle std::optional mLatelyShotRay; std::vector> mRaySubscribers; ColliderRegister& mColliderRegister; + sf::Clock mShotRayClock; + sf::Time mShotRayDeleteTime = sf::seconds(0.5); }; \ No newline at end of file diff --git a/AimGL/src/World/Scene/GameObjects/ShootingRange.cpp b/AimGL/src/World/Scene/GameObjects/ShootingRange.cpp new file mode 100644 index 0000000..0749871 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/ShootingRange.cpp @@ -0,0 +1,93 @@ +#include "ShootingRange.h" +#include "pch.h" + +ShootingRange::ShootingRange(ColliderRegister& colliderRegister, const glm::vec3& position) + : mShootingRange("resources/Models/shooting-board/shooting-board.obj", + {{"resources/Models/shooting-board/diffuse.png", Texture::Type::Diffuse}, + {"resources/Models/shooting-board/specular.png", Texture::Type::Specular}}) + , mButtonStand(colliderRegister, position) + , mLargeCrate(colliderRegister, position) + , mMediumCrate(colliderRegister, position) + , mSmallerCrate(colliderRegister, position) + , mPosition(position) + , mAABB(colliderRegister, {0, 0, 0}, mShootingRange.dimensions()) + , mDirectionArrowTexture("resources/Textures/arrow-up.png") + , mDirectionArrow(mDirectionArrowTexture) + , mTargetManager(colliderRegister, {0, 0, -2}, sf::seconds(0.75), sf::seconds(0.75)) +{ + mLargeCrate.setScale(1.5); + mMediumCrate.setScale(1); + mSmallerCrate.setScale(0.5); + mAABB.colliderTag(ColliderTag::Solid); + setPosition(mPosition); + mSmallerCrate.setRotation({90, 0, 0}); + mMediumCrate.setRotation({90, 0, 0}); + mLargeCrate.setRotation({90, 0, 0}); + mDirectionArrow.setRotation({-30, 25, 0}); + mDirectionArrow.setScale(0.6); + auto halfOfShootingRangeDimensions = mShootingRange.dimensions() / 2.f; + mTargetManager.setSpawnRange( + {-halfOfShootingRangeDimensions.x, -halfOfShootingRangeDimensions.y, 0}, + {halfOfShootingRangeDimensions.x, halfOfShootingRangeDimensions.y, 0}); + mButtonStand.onClick( + [this]() + { + if (mIsShootingRangeActive) + { + mTargetManager.stop(); + mIsShootingRangeActive = false; + } + else + { + mTargetManager.start(); + mIsShootingRangeActive = true; + } + }); +} + +void ShootingRange::draw(const Renderer& target, const Camera& camera) const +{ + mShootingRange.draw(target, camera); + mButtonStand.draw(target, camera); + mAABB.draw(target, camera); + mLargeCrate.draw(target, camera); + mMediumCrate.draw(target, camera); + mSmallerCrate.draw(target, camera); + mDirectionArrow.draw(target, camera); + mTargetManager.draw(target, camera); +} + +void ShootingRange::update(const float& deltaTime) +{ + mButtonStand.update(deltaTime); + mTargetManager.update(deltaTime); +} + +void ShootingRange::handleEvent(const sf::Event& event) +{ + mButtonStand.handleEvent(event); +} + +void ShootingRange::showDebugImGui(std::string name) +{ + name = "[Model] " + name; + ImGui::Begin(name.c_str()); + ImGui::SliderFloat3("Position", &mPosition[0], -50, 50.f); + ImGui::End(); + setPosition(mPosition); + // mLargeCrate.showDebugImGui("Large Crate"); + mDirectionArrow.showDebugImGui("Arrow"); +} + +void ShootingRange::setPosition(const glm::vec3& newPosition) +{ + mShootingRange.setPosition(newPosition + glm::vec3{0, 0, BOXES_DISTANCE}); + mTargetManager.setPosition( + newPosition + glm::vec3{0, mShootingRange.dimensions().y / 2.f, BOXES_DISTANCE - 0.25f}); + mButtonStand.setPosition(newPosition + glm::vec3{-1.15, 1.5, 0.45}); + mAABB.setPosition(mShootingRange.position() - mShootingRange.dimensions() / 2.f); + mLargeCrate.setPosition(newPosition + glm::vec3{0, 0, 0}); + mMediumCrate.setPosition(newPosition + glm::vec3{0, 0, -1.25}); + mSmallerCrate.setPosition(newPosition + glm::vec3{0, 0, -2}); + mDirectionArrow.setPosition(newPosition + glm::vec3{1, 0, -2.5}); +} diff --git a/AimGL/src/World/Scene/GameObjects/ShootingRange.h b/AimGL/src/World/Scene/GameObjects/ShootingRange.h new file mode 100644 index 0000000..3cb74d0 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/ShootingRange.h @@ -0,0 +1,63 @@ +#pragma once +#include "ButtonStand.h" +#include "LongCrate.h" +#include "TargetManager.h" + +#include + +class ShootingRange +{ +public: + /** + * \brief Constructor of ShootingRange class + * \param colliderRegister Register in which all collisions on the scene should be located + * \param position TODO: THIS + */ + ShootingRange(ColliderRegister& colliderRegister, const glm::vec3& position); + + /** + * \brief Draws a shooting range to a given target + * \param target The target to which the model is drawn + * \param camera A camera in 3D space that looks at this object + */ + void draw(const Renderer& target, const Camera& camera) const; + + /** + * Updates the Shooting Range logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief It takes input (event) from the user and interprets it + * \param event user input + */ + void handleEvent(const sf::Event& event); + + /** + * \brief Displays a debug ImGui window that allows to change the internal + * variables of the 3d model. + * \param name Optional name of the model (it can be seen in the window name). + */ + void showDebugImGui(std::string name = ""); + + /** + * \brief TODO: THIS + * \param newPosition TODO: THIS + */ + void setPosition(const glm::vec3& newPosition); + +private: + constexpr static auto BOXES_DISTANCE = 10.f; + ButtonStand mButtonStand; + Model mShootingRange; + glm::vec3 mPosition; + AABB mAABB; + LongCrate mSmallerCrate; + LongCrate mMediumCrate; + LongCrate mLargeCrate; + Texture mDirectionArrowTexture; + Sprite3D mDirectionArrow; + TargetManager mTargetManager; + bool mIsShootingRangeActive{false}; +}; diff --git a/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.cpp b/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.cpp new file mode 100644 index 0000000..5464a78 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.cpp @@ -0,0 +1,81 @@ +#include "SidewayMovingTargetsRange.h" +#include "pch.h" + +SidewayMovingTargetsRange::SidewayMovingTargetsRange(ColliderRegister& colliderRegister, + const glm::vec3& position) + : mButtonStand(colliderRegister, position) + , mLargeCrate(colliderRegister, position) + , mMediumCrate(colliderRegister, position) + , mSmallerCrate(colliderRegister, position) + , mPosition(position) + , mDirectionArrowTexture("resources/Textures/arrow-up.png") + , mDirectionArrow(mDirectionArrowTexture) + , mTargetManager(colliderRegister, {0, 0, 0}, sf::seconds(1.5), sf::seconds(5)) +{ + mLargeCrate.setScale(1.5); + mMediumCrate.setScale(1); + mSmallerCrate.setScale(0.5); + setPosition(mPosition); + mSmallerCrate.setRotation({0, 90, 0}); + mMediumCrate.setRotation({0, 90, 0}); + mLargeCrate.setRotation({0, 90, 0}); + mDirectionArrow.setRotation({0, 0, 180}); + mDirectionArrow.setScale(0.2); + mTargetManager.setTargetMovement({1, 0, 0}, 4); + mTargetManager.setSpawnRange({0, 0, 0}, {0, 4, 4}); + mButtonStand.onClick( + [this]() + { + if (mIsShootingRangeActive) + { + mTargetManager.stop(); + mIsShootingRangeActive = false; + } + else + { + mTargetManager.start(); + mIsShootingRangeActive = true; + } + }); +} + +void SidewayMovingTargetsRange::draw(const Renderer& target, const Camera& camera) const +{ + mButtonStand.draw(target, camera); + mLargeCrate.draw(target, camera); + mMediumCrate.draw(target, camera); + mSmallerCrate.draw(target, camera); + mDirectionArrow.draw(target, camera); + mTargetManager.draw(target, camera); +} + +void SidewayMovingTargetsRange::update(const float& deltaTime) +{ + mButtonStand.update(deltaTime); + mTargetManager.update(deltaTime); +} + +void SidewayMovingTargetsRange::handleEvent(const sf::Event& event) +{ + mButtonStand.handleEvent(event); +} + +void SidewayMovingTargetsRange::showDebugImGui(std::string name) +{ + name = "[Model] " + name; + ImGui::Begin(name.c_str()); + ImGui::SliderFloat3("Position", &mPosition[0], -50, 50.f); + ImGui::End(); + setPosition(mPosition); + mDirectionArrow.showDebugImGui("Arrow"); +} + +void SidewayMovingTargetsRange::setPosition(const glm::vec3& newPosition) +{ + mTargetManager.setPosition(newPosition + glm::vec3{0, 0, BOXES_DISTANCE + 2.f}); + mButtonStand.setPosition(newPosition + glm::vec3{0, 0, 0}); + mLargeCrate.setPosition(newPosition + glm::vec3{0, 0.75, BOXES_DISTANCE}); + mMediumCrate.setPosition(newPosition + glm::vec3{2.5, 0.5, BOXES_DISTANCE}); + mSmallerCrate.setPosition(newPosition + glm::vec3{4.5, 0.25, BOXES_DISTANCE}); + mDirectionArrow.setPosition(newPosition + glm::vec3{-0.2, 0.3, 0}); +} diff --git a/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.h b/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.h new file mode 100644 index 0000000..d0f3141 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/SidewayMovingTargetsRange.h @@ -0,0 +1,61 @@ +#pragma once +#include "ButtonStand.h" +#include "LongCrate.h" +#include "TargetManager.h" + +#include + +class SidewayMovingTargetsRange +{ +public: + /** + * \brief Constructor of SidewayMovingTargetsRange class + * \param colliderRegister Register in which all collisions on the scene should be located + * \param position TODO: THIS + */ + SidewayMovingTargetsRange(ColliderRegister& colliderRegister, const glm::vec3& position); + + /** + * \brief Draws a shooting range to a given target + * \param target The target to which the model is drawn + * \param camera A camera in 3D space that looks at this object + */ + void draw(const Renderer& target, const Camera& camera) const; + + /** + * Updates the Shooting Range logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief It takes input (event) from the user and interprets it + * \param event user input + */ + void handleEvent(const sf::Event& event); + + /** + * \brief Displays a debug ImGui window that allows to change the internal + * variables of the 3d model. + * \param name Optional name of the model (it can be seen in the window name). + */ + void showDebugImGui(std::string name = ""); + + /** + * \brief TODO: THIS + * \param newPosition TODO: THIS + */ + void setPosition(const glm::vec3& newPosition); + +private: + constexpr static auto BOXES_DISTANCE = 6.f; + ButtonStand mButtonStand; + glm::vec3 mPosition; + LongCrate mSmallerCrate; + LongCrate mMediumCrate; + LongCrate mLargeCrate; + Texture mDirectionArrowTexture; + Sprite3D mDirectionArrow; + TargetManager mTargetManager; + bool mIsShootingRangeActive{false}; +}; diff --git a/AimGL/src/World/Scene/GameObjects/Target.cpp b/AimGL/src/World/Scene/GameObjects/Target.cpp new file mode 100644 index 0000000..3bc9649 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/Target.cpp @@ -0,0 +1,64 @@ +#include "Target.h" +#include "World/Physics/ColliderRegister.h" +#include "pch.h" + + +Target::Target(ColliderRegister& colliderRegister, const glm::vec3& position) + : mSphere("resources/Models/sphere.obj") + , mAABB(colliderRegister, {0, 0, 0}, mSphere.dimensions()) + , mPosition(position) +{ + setup(position); +} + +Target::Target(ColliderRegister& colliderRegister, const glm::vec3& position, Model model) + : mSphere(std::move(model)) + , mAABB(colliderRegister, {0, 0, 0}, mSphere.dimensions()) + , mPosition(position) +{ + setup(position); +} + +void Target::setup(const glm::vec3& position) +{ + mAABB.colliderTag(ColliderTag::Solid); + mAABB.callback( + [this](const Collider& collider) + { + if (collider.colliderTag() == ColliderTag::GunShot) + { + mHasBeenShot = true; + } + }); + mSphere.setPosition(position); +} + +void Target::draw(const Renderer& target, const Camera& camera) const +{ + if (not mHasBeenShot) + { + mSphere.draw(target, camera); + mAABB.draw(target, camera); + } +} + +void Target::update(const float& deltaTime) +{ + if (not mHasBeenShot) + { + const auto deltaPosition = mDirectionMovement * mSpeed * deltaTime; + mSphere.setPosition(mSphere.position() + deltaPosition, Model::Origin::Center); + mAABB.setPosition(mSphere.position() - mSphere.dimensions() / 2.f); + } +} + +bool Target::hasBeenShot() const +{ + return mHasBeenShot; +} + +void Target::setMovement(const glm::vec3& direction, float speed) +{ + mDirectionMovement = direction; + mSpeed = speed; +} diff --git a/AimGL/src/World/Scene/GameObjects/Target.h b/AimGL/src/World/Scene/GameObjects/Target.h new file mode 100644 index 0000000..5cabb36 --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/Target.h @@ -0,0 +1,69 @@ +#pragma once +#include "Renderer/Graphics/3D/Model.h" +#include "World/Physics/Drawable/AABB.h" + +class ColliderRegister; + +/** + * \brief Target possible to shoot down with weapon. + * + * @warning This facility is for illustrative purposes only. + * It will be removed from here. It is not intended for use in the final game + */ +class Target +{ +public: + Target(ColliderRegister& colliderRegister, const glm::vec3& position); + Target(ColliderRegister& colliderRegister, const glm::vec3& position, Model model); + Target(const Target& rhs) + : mAABB(rhs.mAABB) + , mSphere(rhs.mSphere) + , mPosition(rhs.mPosition) + , mHasBeenShot(rhs.mHasBeenShot) + , mSpeed(rhs.mSpeed) + , mDirectionMovement(rhs.mDirectionMovement) + { + setup(mPosition); + } + + /** + * \brief Draws a PreviewTarget for a given target + * \param target The target to which the model is drawn + * \param camera A camera in 3D space that looks at this object + */ + void draw(const Renderer& target, const Camera& camera) const; + + /** + * Updates the PreviewTarget logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + bool hasBeenShot() const; + + /** + * \brief TODO: THIS + * \param direction TODO: THIS + * \param speed TODO: THIS + */ + void setMovement(const glm::vec3& direction, float speed); + +private: + /** + * \brief TODO: THIS + * \param position TODO: THIS + */ + void setup(const glm::vec3& position); + +private: + Model mSphere; + AABB mAABB; + glm::vec3 mPosition{}; + bool mHasBeenShot = false; + float mSpeed = 0; + glm::vec3 mDirectionMovement = {0, 0, 0}; +}; diff --git a/AimGL/src/World/Scene/GameObjects/TargetManager.cpp b/AimGL/src/World/Scene/GameObjects/TargetManager.cpp new file mode 100644 index 0000000..514240e --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/TargetManager.cpp @@ -0,0 +1,123 @@ +#include "TargetManager.h" +#include "World/Physics/ColliderRegister.h" +#include "pch.h" + +TargetManager::TargetManager(ColliderRegister& colliderRegister, const glm::vec3& position, + const sf::Time& timeToSpawn, const sf::Time& timeToDisappear) + : mColliderRegister(colliderRegister) + , mPosition(position) + , mTimeToSpawn(timeToSpawn) + , mTimeToDisappear(timeToDisappear) + , mSpherePrefab("resources/Models/sphere.obj") +{ + mBuffer.loadFromFile("resources/Sounds/target-shot.wav"); + mSound.setBuffer(mBuffer); + mSpherePrefab.setScale(0.3); +} + +void TargetManager::draw(const Renderer& rendererTarget, const Camera& camera) const +{ + for (const auto& targetWithSpawntime: mTargetsWithSpawntime) + { + targetWithSpawntime.target.draw(rendererTarget, camera); + } +} + +void TargetManager::removeShotTargets() +{ + std::erase_if(mTargetsWithSpawntime, + [this](const auto& targetWithSpawnTime) + { + if (targetWithSpawnTime.target.hasBeenShot()) + { + this->mSound.play(); + return true; + } + return false; + }); +} + +bool TargetManager::shouldNewTargetBeSpawn() +{ + return mNextSpawnClock.getElapsedTime() > mTimeToSpawn; +} + +bool TargetManager::shouldOldTargetBeRemoved() +{ + return (not mTargetsWithSpawntime.empty() and + mTargetsWithSpawntime.front().timeSinceSpawn.getElapsedTime() > mTimeToDisappear); +} + +void TargetManager::spawnNewTarget() +{ + auto targetWithSpawntime = SpawnedTarget( + {mColliderRegister, mPosition + generateNewRandomOffset(), mSpherePrefab}, {}); + mTargetsWithSpawntime.emplace_back(std::move(targetWithSpawntime)); + auto& targetWithSpawnTime = mTargetsWithSpawntime.back(); + targetWithSpawnTime.target.setMovement(mTargetsDirection, mTargetsSpeed); + targetWithSpawnTime.timeSinceSpawn.restart(); + mNextSpawnClock.restart(); +} + +void TargetManager::removeOldTarget() +{ + mTargetsWithSpawntime.pop_front(); +} + +void TargetManager::update(const float& deltaTime) +{ + for (auto& targetWithSpawnTime: mTargetsWithSpawntime) + { + targetWithSpawnTime.target.update(deltaTime); + } + removeShotTargets(); + if (mIsManagerActive) + { + if (shouldNewTargetBeSpawn()) + { + spawnNewTarget(); + } + if (shouldOldTargetBeRemoved()) + { + removeOldTarget(); + } + } +} + +void TargetManager::start() +{ + mNextSpawnClock.restart(); + mIsManagerActive = true; +} + +void TargetManager::stop() +{ + mIsManagerActive = false; +} + +void TargetManager::setPosition(const glm::vec3& newPosition) +{ + mPosition = newPosition; +} + +void TargetManager::setSpawnRange(const glm::vec3& minPadding, const glm::vec3& maxPadding) +{ + mMinPadding = minPadding; + mMaxPadding = maxPadding; +} + +void TargetManager::setTargetMovement(const glm::vec3& direction, float speed) +{ + mTargetsDirection = direction; + mTargetsSpeed = speed; +} + +glm::vec3 TargetManager::generateNewRandomOffset() const +{ + static std::random_device rd; + static std::mt19937 e{rd()}; + std::uniform_real_distribution distX{mMinPadding.x, mMaxPadding.x}; + std::uniform_real_distribution distY{mMinPadding.y, mMaxPadding.y}; + std::uniform_real_distribution distZ{mMinPadding.z, mMaxPadding.z}; + return {distX(e), distY(e), distZ(e)}; +} diff --git a/AimGL/src/World/Scene/GameObjects/TargetManager.h b/AimGL/src/World/Scene/GameObjects/TargetManager.h new file mode 100644 index 0000000..a0db2bf --- /dev/null +++ b/AimGL/src/World/Scene/GameObjects/TargetManager.h @@ -0,0 +1,120 @@ +#pragma once +#include "Renderer/Graphics/3D/Model.h" +#include "World/Physics/Drawable/AABB.h" +#include "World/Scene/GameObjects/Target.h" + +#include + +class ColliderRegister; + + +/** + * \brief TODO: THIS + */ +class TargetManager +{ +public: + TargetManager(ColliderRegister& colliderRegister, const glm::vec3& position, + const sf::Time& timeToSpawn, const sf::Time& timeToDisappear); + + /** + * \brief Draws a Targets for a given target + * \param rendererTarget The target to which the models are drawn + * \param camera A camera in 3D space that looks at this object + */ + void draw(const Renderer& rendererTarget, const Camera& camera) const; + + /** + * Updates the TargetSpawner logic dependent, or independent of time, every rendered frame. + * \param deltaTime the time that has passed since the game was last updated. + */ + void update(const float& deltaTime); + + /** + * \brief TODO: THIS + */ + void start(); + + /** + * \brief TODO: THIS + */ + void stop(); + + /** + * \brief TODO: THIS + * \param newPosition TODO: THIS + */ + void setPosition(const glm::vec3& newPosition); + + /** + * \brief TODO: THIS + * \param minPadding TODO: THIS + * \param maxPadding TODO: THIS + */ + void setSpawnRange(const glm::vec3& minPadding, const glm::vec3& maxPadding); + + /** + * \brief TODO: THIS + * \param direction TODO: THIS + * \param speed TODO: THIS + */ + void setTargetMovement(const glm::vec3& direction, float speed); + +private: + struct SpawnedTarget + { + Target target; + sf::Clock timeSinceSpawn; + }; + + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + glm::vec3 generateNewRandomOffset() const; + + /** + * \brief TODO: THIS + */ + void removeShotTargets(); + + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + bool shouldNewTargetBeSpawn(); + + /** + * \brief TODO: THIS + * \return TODO: THIS + */ + bool shouldOldTargetBeRemoved(); + + /** + * \brief TODO: THIS + */ + void spawnNewTarget(); + + /** + * \brief TODO: THIS + */ + void removeOldTarget(); + +private: + std::list mTargetsWithSpawntime; + sf::SoundBuffer mBuffer; + sf::Sound mSound; + Model mSpherePrefab; + + ColliderRegister& mColliderRegister; + glm::vec3 mPosition; + sf::Time mTimeToSpawn; + sf::Clock mNextSpawnClock; + sf::Time mTimeToDisappear; + bool mIsManagerActive{false}; + glm::vec3 mMinPadding{-1, -1, 0}; + glm::vec3 mMaxPadding{1, 1, 0}; + + glm::vec3 mTargetsDirection = {0, 0, 0}; + float mTargetsSpeed = 0; +}; diff --git a/AimGL/src/World/Scene/Nodes/Node.cpp b/AimGL/src/World/Scene/Nodes/Node.cpp new file mode 100644 index 0000000..1d4b7db --- /dev/null +++ b/AimGL/src/World/Scene/Nodes/Node.cpp @@ -0,0 +1,52 @@ +#include "Node.h" +#include "pch.h" + +void Node::pinNode(NodePtr node) +{ + node->mParent = this; + mPinnedNodes.emplace_back(std::move(node)); +} + +cpp::result Node::unpinNode(const Node& node) +{ + auto foundNode = std::find_if(mPinnedNodes.begin(), mPinnedNodes.end(), + [&node](const NodePtr& containerNode) + { + return containerNode.get() == &node; + }); + if (foundNode == mPinnedNodes.end()) + { + spdlog::critical("Trying to unpin a node that does not exist in Node container!"); + return cpp::fail(Result::NodeNotFound); + } + + auto nodePtr = std::move(*foundNode); + mPinnedNodes.erase(foundNode); + nodePtr->mParent = nullptr; + return nodePtr; +} + +void Node::draw(const Renderer& target) const +{ + drawThis(target, mTransform); + + for (const auto& pinnedNode: mPinnedNodes) + { + pinnedNode->draw(target, mTransform); + } +} + +void Node::drawThis(const Renderer& target, const Transform& transform) const +{ + // Should be implemented +} + +void Node::draw(const Renderer& target, Transform transform) const +{ + transform *= mTransform; + drawThis(target, transform); + for (const auto& pinnedNode: mPinnedNodes) + { + pinnedNode->draw(target, transform); + } +} diff --git a/AimGL/src/World/Scene/Nodes/Node.h b/AimGL/src/World/Scene/Nodes/Node.h new file mode 100644 index 0000000..3133a3c --- /dev/null +++ b/AimGL/src/World/Scene/Nodes/Node.h @@ -0,0 +1,36 @@ +#pragma once +#include +#include + +class Renderer; + +class Node +{ +public: + enum class Result + { + NodeNotFound + }; + + using NodePtr = std::unique_ptr; + virtual ~Node() = default; + + void pinNode(NodePtr node); + cpp::result unpinNode(const Node& node); + void draw(const Renderer& target) const; + void update(const float& deltaTime); + void handleEvent(const sf::Event& event); + +protected: + virtual void drawThis(const Renderer& target, const Transform& transform) const; + virtual void updateThis(const float& deltaTime); + virtual void handleEventThis(const sf::Event& event); + +private: + void draw(const Renderer& target, Transform transform) const; + + std::list mPinnedNodes; + Node* mParent{nullptr}; + glm::vec3 mPosition{0, 0, 0}; + Transform mTransform; +}; diff --git a/AimGL/src/constants.cpp b/AimGL/src/constants.cpp new file mode 100644 index 0000000..7bc3b3a --- /dev/null +++ b/AimGL/src/constants.cpp @@ -0,0 +1,6 @@ +#include "constants.h" +#include "pch.h" + +#ifdef _DEBUG +bool DRAW_COLLIDERS = false; +#endif \ No newline at end of file diff --git a/AimGL/src/constants.h b/AimGL/src/constants.h index daafa8d..4aa7444 100644 --- a/AimGL/src/constants.h +++ b/AimGL/src/constants.h @@ -1,3 +1,5 @@ +#pragma once + #define _CRTDBG_MAP_ALLOC #include #include @@ -7,4 +9,11 @@ #undef MTR_ENABLED #endif -constexpr static auto IS_MINITRACE_COLLECTING_AT_START = false; \ No newline at end of file +constexpr static auto IS_MINITRACE_COLLECTING_AT_START = false; + +// Not a good idea. But run out of time :P +#ifdef _DEBUG +extern bool DRAW_COLLIDERS; +#else +constexpr static auto DRAW_COLLIDERS = false; +#endif \ No newline at end of file diff --git a/AimGL/src/pch.h b/AimGL/src/pch.h index 9f7324f..7ee64ae 100644 --- a/AimGL/src/pch.h +++ b/AimGL/src/pch.h @@ -32,3 +32,6 @@ // Logging #include "minitrace.h" #include "spdlog/spdlog.h" + +// Other +#include \ No newline at end of file