diff --git a/assets/Models/Submarine.obj b/assets/Models/Submarine.obj old mode 100644 new mode 100755 index 28e65c8..14569fc --- a/assets/Models/Submarine.obj +++ b/assets/Models/Submarine.obj @@ -1879,5 +1879,3 @@ f 166/13/239 259/24/24 401/34/255 f 161/12/240 166/13/239 400/32/253 f 163/27/245 161/12/240 399/29/251 f 256/19/19 163/27/245 398/30/30 -l 300 301 -l 299 298 diff --git a/assets/Models/submarine2.mtl b/assets/Models/submarine2.mtl new file mode 100644 index 0000000..211bb03 --- /dev/null +++ b/assets/Models/submarine2.mtl @@ -0,0 +1,12 @@ +# Blender MTL File: 'submarine.blend' +# Material Count: 1 + +newmtl Material +Ns 96.078431 +Ka 0.000000 0.000000 0.000000 +Kd 0.640000 0.640000 0.640000 +Ks 0.500000 0.500000 0.500000 +Ni 1.000000 +d 1.000000 +illum 2 +map_Kd SubmarineTexture.png diff --git a/assets/Models/submarine2.obj b/assets/Models/submarine2.obj new file mode 100644 index 0000000..5796eba --- /dev/null +++ b/assets/Models/submarine2.obj @@ -0,0 +1,1881 @@ +# Blender v2.75 (sub 0) OBJ File: 'submarine.blend' +# www.blender.org +mtllib submarine2.mtl +o Cube +v -0.378953 -0.002680 -0.065172 +v 0.212611 0.044805 -0.044067 +v -0.378243 -0.049219 -0.040454 +v 0.511655 0.005655 -0.004951 +v 0.511655 0.014323 -0.009928 +v -0.378953 0.044805 -0.045251 +v 0.511655 0.021628 -0.004951 +v 0.296392 0.051346 -0.039065 +v 0.296392 -0.051355 -0.038417 +v 0.212611 -0.058696 -0.039270 +v 0.212611 -0.002680 -0.063988 +v 0.296392 -0.004712 -0.055556 +v -0.470020 0.007247 -0.055901 +v -0.470020 -0.033863 -0.039615 +v -0.470020 0.046066 -0.039615 +v -0.504866 0.007576 -0.027580 +v -0.504866 -0.015092 -0.019565 +v -0.504866 0.026681 -0.019565 +v 0.417794 0.035928 -0.027732 +v 0.417862 0.010074 -0.038703 +v 0.418042 -0.020280 -0.027718 +v -0.103707 0.044805 -0.044659 +v -0.095180 -0.059866 -0.039862 +v -0.145284 0.044805 -0.044778 +v -0.103707 -0.002680 -0.064580 +v -0.220059 -0.056313 -0.040098 +v -0.213663 0.044805 -0.044896 +v -0.213663 -0.002680 -0.064817 +v 0.016182 0.044805 -0.044401 +v 0.016182 -0.002680 -0.064322 +v 0.021156 -0.057734 -0.039604 +v -0.103679 -0.128289 -0.020932 +v -0.169800 -0.124081 -0.021745 +v -0.145284 -0.002680 -0.064699 +v -0.144573 -0.059156 -0.039980 +v -0.145256 -0.128299 -0.021050 +v -0.028130 -0.059156 -0.039733 +v -0.025998 0.044805 -0.044530 +v -0.025998 -0.002680 -0.064451 +v -0.028811 -0.126038 -0.021380 +v -0.101004 -0.090373 -0.028531 +v 0.004471 -0.088964 -0.032639 +v -0.179611 -0.092300 -0.029335 +v -0.147840 -0.092530 -0.029340 +v -0.011421 -0.110450 -0.026194 +v 0.438535 -0.016511 -0.025733 +v 0.439229 0.012885 -0.036411 +v 0.438680 0.033157 -0.025848 +v 0.488551 0.025074 -0.012937 +v 0.497469 0.013062 -0.015893 +v 0.493078 -0.000808 -0.010559 +v 0.457621 -0.052215 -0.000328 +v 0.486007 -0.049835 -0.001062 +v 0.489135 -0.011286 -0.003540 +v 0.449628 -0.021564 -0.002397 +v 0.452490 0.010420 -0.032017 +v 0.450888 0.012577 -0.032017 +v 0.452490 0.014448 -0.032017 +v 0.491993 0.014448 -0.019989 +v 0.493187 0.012577 -0.019989 +v 0.491993 0.010420 -0.019989 +v 0.463244 0.010420 -0.061607 +v 0.461409 0.012577 -0.061607 +v 0.463244 0.014448 -0.061607 +v 0.488480 0.014448 -0.059057 +v 0.489673 0.012577 -0.059057 +v 0.488480 0.010420 -0.059057 +v 0.450386 0.041229 -0.002309 +v 0.486995 0.039392 -0.003342 +v 0.457584 0.071526 -0.000278 +v 0.486002 0.068886 -0.001063 +v 0.372582 0.047066 -0.030989 +v 0.372582 0.004185 -0.046120 +v 0.372582 -0.034449 -0.032051 +v 0.511655 0.005655 -0.004951 +v 0.511655 0.014323 -0.009928 +v 0.511655 0.021628 -0.004951 +v 0.525395 0.008758 -0.002746 +v 0.515740 0.008758 -0.002746 +v 0.515740 0.011890 -0.004273 +v 0.515740 0.014988 -0.002825 +v 0.525395 0.011890 -0.004273 +v 0.525395 0.014988 -0.002825 +v -0.050480 -0.059392 -0.039776 +v -0.072830 -0.059629 -0.039819 +v -0.051873 -0.128594 -0.021423 +v -0.077776 -0.128594 -0.021466 +v -0.077804 0.044805 -0.044616 +v -0.051901 0.044805 -0.044573 +v -0.077804 -0.002680 -0.064537 +v -0.051901 -0.002680 -0.064494 +v -0.041517 -0.093350 -0.026237 +v -0.071378 -0.088718 -0.026280 +v -0.120025 -0.131743 -0.012698 +v -0.089441 -0.131743 -0.012647 +v -0.104733 -0.131743 -0.012672 +v -0.110237 -0.131352 -0.005504 +v -0.104733 -0.131352 -0.007784 +v -0.099229 -0.131352 -0.005504 +v -0.110237 -0.146402 -0.005504 +v -0.104733 -0.146402 -0.007784 +v -0.099229 -0.146402 -0.005504 +v -0.110237 -0.309639 -0.005504 +v -0.104733 -0.309639 -0.007784 +v -0.099229 -0.309639 -0.005504 +v -0.145706 -0.318985 -0.005504 +v -0.145706 -0.324489 -0.007784 +v -0.145706 -0.329993 -0.005504 +v -0.115907 -0.329993 -0.005504 +v -0.115907 -0.324489 -0.007784 +v -0.115907 -0.318985 -0.005504 +v -0.103586 -0.323872 -0.005504 +v -0.107478 -0.319980 -0.007784 +v -0.111369 -0.316088 -0.005504 +v -0.145706 -0.319804 -0.004685 +v -0.145706 -0.324489 -0.006626 +v -0.145706 -0.329175 -0.004685 +v -0.120728 -0.328489 -0.004000 +v -0.120728 -0.324489 -0.005656 +v -0.120728 -0.320490 -0.004000 +v -0.102383 -0.109911 -0.026878 +v -0.146509 -0.110962 -0.026891 +v -0.018918 -0.119800 -0.023713 +v -0.176358 -0.112152 -0.025424 +v -0.074675 -0.109265 -0.023799 +v -0.046854 -0.111511 -0.023756 +v -0.106319 -0.101496 -0.028531 +v -0.141797 -0.100168 -0.029340 +v -0.107087 -0.103696 -0.026878 +v -0.140874 -0.104992 -0.026891 +v -0.179464 -0.101651 -0.027380 +v -0.101694 -0.100142 -0.027239 +v -0.147175 -0.101746 -0.028115 +v -0.015169 -0.115125 -0.024953 +v -0.073027 -0.098992 -0.025039 +v -0.044185 -0.102430 -0.024996 +v -0.105455 -0.102694 -0.027239 +v -0.143547 -0.102580 -0.028115 +v -0.106319 -0.101496 -0.062227 +v -0.125329 -0.100168 -0.062227 +v -0.107087 -0.103696 -0.062227 +v -0.124406 -0.104992 -0.062227 +v -0.105455 -0.102694 -0.062227 +v -0.127079 -0.102580 -0.062227 +v -0.107364 -0.101496 -0.065167 +v -0.121148 -0.100168 -0.065167 +v -0.108133 -0.103696 -0.065167 +v -0.120226 -0.104992 -0.065167 +v -0.106501 -0.102694 -0.065167 +v -0.122898 -0.102580 -0.065167 +v 0.012813 -0.073349 -0.036122 +v -0.196426 -0.071466 -0.034717 +v -0.098092 -0.075120 -0.034196 +v -0.146207 -0.075843 -0.034660 +v -0.019775 -0.084803 -0.032963 +v -0.072104 -0.074173 -0.033049 +v -0.045998 -0.076371 -0.033006 +v -0.424131 -0.046842 -0.040035 +v -0.424487 0.002283 -0.060537 +v -0.424487 0.045435 -0.042433 +v -0.378953 -0.002680 0.065172 +v 0.212611 0.044805 0.044067 +v -0.378243 -0.049219 0.040454 +v 0.511655 0.005655 0.004951 +v 0.511655 0.014323 0.009928 +v -0.378953 0.044805 0.045251 +v 0.511655 0.021628 0.004951 +v 0.296392 0.051346 0.039065 +v 0.296392 -0.051355 0.038417 +v 0.212611 -0.058696 0.039270 +v 0.212611 -0.002680 0.063988 +v 0.296392 -0.004712 0.055556 +v -0.470020 0.007247 0.055901 +v -0.470020 -0.033863 0.039615 +v -0.470020 0.046066 0.039615 +v -0.504866 0.007576 0.027580 +v -0.504866 -0.015092 0.019565 +v -0.504866 0.026681 0.019565 +v 0.417794 0.035928 0.027732 +v 0.417862 0.010074 0.038703 +v 0.418042 -0.020280 0.027718 +v -0.103707 0.044805 0.044659 +v -0.095180 -0.059866 0.039862 +v -0.145284 0.044805 0.044778 +v -0.103707 -0.002680 0.064580 +v -0.220059 -0.056313 0.040098 +v -0.213663 0.044805 0.044896 +v -0.213663 -0.002680 0.064817 +v 0.016182 0.044805 0.044401 +v 0.016182 -0.002680 0.064322 +v 0.021156 -0.057734 0.039604 +v -0.103679 -0.128289 0.020933 +v -0.169800 -0.124081 0.021746 +v -0.145284 -0.002680 0.064699 +v -0.144573 -0.059156 0.039980 +v -0.145256 -0.128299 0.021050 +v -0.028130 -0.059156 0.039733 +v -0.025998 0.044805 0.044530 +v -0.025998 -0.002680 0.064451 +v -0.028811 -0.126038 0.021380 +v -0.101004 -0.090373 0.028531 +v 0.004471 -0.088964 0.032639 +v -0.179611 -0.092300 0.029335 +v -0.147840 -0.092530 0.029340 +v -0.011421 -0.110450 0.026194 +v 0.438535 -0.016511 0.025733 +v 0.439229 0.012885 0.036411 +v 0.438680 0.033157 0.025848 +v 0.488551 0.025074 0.012937 +v 0.497469 0.013062 0.015893 +v 0.493078 -0.000808 0.010559 +v 0.457621 -0.052215 0.000328 +v 0.486007 -0.049835 0.001062 +v 0.489135 -0.011286 0.003540 +v 0.449628 -0.021564 0.002397 +v 0.452490 0.010420 0.032017 +v 0.450888 0.012577 0.032017 +v 0.452490 0.014448 0.032017 +v 0.491993 0.014448 0.019989 +v 0.493187 0.012577 0.019989 +v 0.491993 0.010420 0.019989 +v 0.463244 0.010420 0.061607 +v 0.461409 0.012577 0.061607 +v 0.463244 0.014448 0.061607 +v 0.488480 0.014448 0.059057 +v 0.489673 0.012577 0.059057 +v 0.488480 0.010420 0.059057 +v 0.450386 0.041229 0.002309 +v 0.486995 0.039392 0.003342 +v 0.457584 0.071526 0.000278 +v 0.486002 0.068886 0.001063 +v 0.372582 0.047066 0.030989 +v 0.372582 0.004185 0.046120 +v 0.372582 -0.034449 0.032051 +v 0.511655 0.005655 0.004951 +v 0.511655 0.014323 0.009928 +v 0.511655 0.021628 0.004951 +v 0.525395 0.008758 0.002746 +v 0.515740 0.008758 0.002746 +v 0.515740 0.011890 0.004273 +v 0.515740 0.014988 0.002825 +v 0.525395 0.011890 0.004273 +v 0.525395 0.014988 0.002825 +v -0.050480 -0.059392 0.039776 +v -0.072830 -0.059629 0.039819 +v -0.051873 -0.128594 0.021423 +v -0.077776 -0.128594 0.021466 +v -0.077804 0.044805 0.044616 +v -0.051901 0.044805 0.044573 +v -0.077804 -0.002680 0.064537 +v -0.051901 -0.002680 0.064494 +v -0.041517 -0.093350 0.026237 +v -0.071378 -0.088718 0.026280 +v 0.296392 0.072896 -0.000000 +v 0.212611 0.073334 -0.000000 +v -0.378243 -0.071446 0.000000 +v 0.212611 -0.072397 0.000000 +v 0.296392 -0.066926 0.000000 +v -0.378953 0.073334 -0.000000 +v 0.510470 0.002703 -0.000000 +v 0.510470 0.026017 -0.000000 +v -0.470020 -0.049546 0.000000 +v -0.470020 0.069389 -0.000000 +v -0.503090 -0.022810 0.000000 +v -0.503090 0.038159 0.000000 +v -0.513891 0.007675 0.000000 +v 0.415462 -0.032528 -0.000000 +v 0.414729 0.050184 -0.000000 +v -0.103707 0.073334 -0.000000 +v -0.221664 -0.076517 0.000000 +v -0.213663 0.073334 -0.000000 +v 0.016182 0.073334 -0.000000 +v 0.024709 -0.072856 0.000000 +v -0.169800 -0.129750 0.000000 +v 0.438241 0.045372 -0.000000 +v -0.010750 -0.113834 0.000000 +v -0.145284 0.073334 -0.000000 +v -0.145256 -0.134263 0.000000 +v -0.025998 0.073334 -0.000000 +v -0.028811 -0.131707 0.000000 +v 0.004471 -0.093705 0.000000 +v -0.192182 -0.098774 0.000000 +v 0.438373 -0.025623 -0.000000 +v 0.489175 0.028118 -0.000000 +v 0.493179 -0.005666 -0.000000 +v 0.457343 -0.052215 0.000000 +v 0.487158 -0.049835 0.000000 +v 0.447422 -0.024231 -0.000000 +v 0.489644 -0.010979 -0.000000 +v 0.446970 0.041229 -0.000000 +v 0.488729 0.039392 -0.000000 +v 0.457414 0.071526 -0.000000 +v 0.487056 0.068886 -0.000000 +v 0.372582 0.058885 -0.000000 +v 0.372582 -0.048949 0.000000 +v 0.510470 0.002703 -0.000000 +v 0.510470 0.026017 -0.000000 +v 0.515740 0.008758 -0.000000 +v 0.515225 0.008032 -0.000000 +v 0.515740 0.014988 -0.000000 +v 0.515225 0.015781 -0.000000 +v 0.524880 0.008032 -0.000000 +v 0.524880 0.015781 -0.000000 +v 0.527347 0.011810 -0.000000 +v -0.077804 0.073334 -0.000000 +v -0.051901 0.073334 -0.000000 +v -0.051873 -0.134263 0.000000 +v -0.120025 -0.131743 0.012698 +v -0.089441 -0.131743 0.012647 +v -0.104733 -0.131743 0.012672 +v -0.120025 -0.134116 0.000000 +v -0.089441 -0.134116 0.000000 +v -0.096949 -0.133905 0.000000 +v -0.112517 -0.133905 0.000000 +v -0.110237 -0.131352 0.005504 +v -0.104733 -0.131352 0.007784 +v -0.099229 -0.131352 0.005504 +v -0.096949 -0.146402 0.000000 +v -0.112517 -0.146402 0.000000 +v -0.110237 -0.146402 0.005504 +v -0.104733 -0.146402 0.007784 +v -0.099229 -0.146402 0.005504 +v -0.096949 -0.309639 0.000000 +v -0.112517 -0.309639 0.000000 +v -0.110237 -0.309639 0.005504 +v -0.104733 -0.309639 0.007784 +v -0.099229 -0.309639 0.005504 +v -0.145706 -0.318985 0.005504 +v -0.145706 -0.324489 0.007784 +v -0.145706 -0.329993 0.005504 +v -0.145706 -0.332273 0.000000 +v -0.145706 -0.316706 0.000000 +v -0.115907 -0.316706 0.000000 +v -0.115907 -0.332273 0.000000 +v -0.115907 -0.329993 0.005504 +v -0.115907 -0.324489 0.007784 +v -0.115907 -0.318985 0.005504 +v -0.112981 -0.314476 0.000000 +v -0.101974 -0.325484 0.000000 +v -0.103586 -0.323872 0.005504 +v -0.107478 -0.319980 0.007784 +v -0.111369 -0.316088 0.005504 +v -0.077776 -0.133292 0.000000 +v -0.145706 -0.319804 0.004685 +v -0.145706 -0.324489 0.006626 +v -0.145706 -0.329175 0.004685 +v -0.145706 -0.331115 0.000000 +v -0.145706 -0.317863 0.000000 +v -0.120728 -0.330146 0.000000 +v -0.120728 -0.328489 0.004000 +v -0.120728 -0.324489 0.005656 +v -0.120728 -0.320490 0.004000 +v -0.120728 -0.318833 0.000000 +v -0.120728 -0.324489 0.000000 +v -0.102383 -0.109911 0.026878 +v -0.018593 -0.124361 0.000000 +v -0.146509 -0.110962 0.026891 +v -0.018918 -0.119800 0.023713 +v -0.176358 -0.112152 0.025424 +v -0.182451 -0.118212 0.000000 +v -0.074675 -0.109265 0.023799 +v -0.046854 -0.111511 0.023756 +v -0.106319 -0.101496 0.028531 +v -0.141797 -0.100168 0.029340 +v -0.107087 -0.103696 0.026878 +v -0.140874 -0.104992 0.026891 +v -0.014671 -0.119098 0.000000 +v -0.179464 -0.101651 0.027380 +v -0.187317 -0.109068 0.000000 +v -0.101694 -0.100142 0.027239 +v -0.147175 -0.101746 0.028116 +v -0.015169 -0.115125 0.024953 +v -0.073027 -0.098992 0.025039 +v -0.044185 -0.102430 0.024996 +v -0.105455 -0.102694 0.027239 +v -0.143547 -0.102580 0.028116 +v -0.106319 -0.101496 0.062227 +v -0.125329 -0.100168 0.062227 +v -0.107087 -0.103696 0.062227 +v -0.124406 -0.104992 0.062227 +v -0.105455 -0.102694 0.062227 +v -0.127079 -0.102580 0.062227 +v -0.107364 -0.101496 0.065167 +v -0.121148 -0.100168 0.065167 +v -0.108133 -0.103696 0.065167 +v -0.120226 -0.104992 0.065167 +v -0.106501 -0.102694 0.065167 +v -0.122898 -0.102580 0.065167 +v 0.012813 -0.073349 0.036122 +v -0.196426 -0.071466 0.034717 +v -0.203515 -0.084806 0.000000 +v -0.098092 -0.075120 0.034196 +v 0.014590 -0.083280 0.000000 +v -0.146207 -0.075843 0.034660 +v -0.019775 -0.084803 0.032963 +v -0.072104 -0.074173 0.033049 +v -0.045998 -0.076371 0.033006 +v -0.424131 -0.065797 0.000000 +v -0.424131 -0.046842 0.040035 +v -0.424487 0.002283 0.060537 +v -0.424487 0.045435 0.042433 +v -0.424487 0.071361 -0.000000 +vt 0.956699 0.719683 +vt 0.973082 0.719310 +vt 0.974494 0.728254 +vt 0.949748 0.704509 +vt 0.974991 0.711418 +vt 0.958181 0.693076 +vt 0.977042 0.704159 +vt 0.907825 0.773992 +vt 0.887056 0.783358 +vt 0.880780 0.755188 +vt 0.286455 0.752799 +vt 0.137715 0.743003 +vt 0.138655 0.698133 +vt 0.694869 0.800055 +vt 0.769701 0.787194 +vt 0.776890 0.824753 +vt 0.277870 0.810293 +vt 0.267395 0.851549 +vt 0.123009 0.829069 +vt 0.688444 0.648397 +vt 0.767177 0.648892 +vt 0.765769 0.689809 +vt 0.288114 0.704141 +vt 0.135808 0.648392 +vt 0.689264 0.697552 +vt 0.766204 0.742566 +vt 0.131898 0.789275 +vt 0.690402 0.744884 +vt 0.097617 0.777222 +vt 0.084045 0.812811 +vt 0.045082 0.796553 +vt 0.103543 0.736881 +vt 0.063335 0.765169 +vt 0.101905 0.699179 +vt 0.069372 0.730760 +vt 0.093869 0.656193 +vt 0.065156 0.700224 +vt 0.037224 0.728794 +vt 0.032491 0.746804 +vt 0.033494 0.713118 +vt 0.021201 0.695908 +vt 0.017826 0.760292 +vt 0.010998 0.727527 +vt 0.977171 0.704193 +vt 0.975703 0.734427 +vt 0.974615 0.728233 +vt 0.838588 0.769634 +vt 0.835263 0.690651 +vt 0.839009 0.659916 +vt 0.879313 0.668961 +vt 0.835369 0.732184 +vt 0.877743 0.698691 +vt 0.877323 0.725104 +vt 0.415659 0.754567 +vt 0.419670 0.813267 +vt 0.398655 0.813246 +vt 0.415931 0.705907 +vt 0.391538 0.705777 +vt 0.391906 0.656135 +vt 0.391122 0.754382 +vt 0.351927 0.812827 +vt 0.352421 0.705403 +vt 0.289522 0.654422 +vt 0.468309 0.867106 +vt 0.471717 0.863299 +vt 0.483180 0.882615 +vt 0.351716 0.754025 +vt 0.505857 0.754851 +vt 0.504829 0.705273 +vt 0.699604 0.838311 +vt 0.522669 0.854806 +vt 0.503774 0.655536 +vt 0.511306 0.814964 +vt 0.352497 0.879550 +vt 0.351096 0.899092 +vt 0.324099 0.895900 +vt 0.308155 0.883658 +vt 0.323932 0.864809 +vt 0.329413 0.877829 +vt 0.493037 0.837225 +vt 0.500877 0.868485 +vt 0.353163 0.655720 +vt 0.351389 0.862551 +vt 0.442095 0.863398 +vt 0.464902 0.870842 +vt 0.458778 0.877530 +vt 0.897456 0.701066 +vt 0.896868 0.721761 +vt 0.465002 0.754877 +vt 0.464844 0.705847 +vt 0.464449 0.656145 +vt 0.462247 0.814277 +vt 0.466982 0.838788 +vt 0.447123 0.847503 +vt 0.350750 0.829156 +vt 0.349573 0.845485 +vt 0.317535 0.847624 +vt 0.502172 0.826094 +vt 0.280974 0.860490 +vt 0.297702 0.828959 +vt 0.511773 0.861646 +vt 0.395896 0.828442 +vt 0.393138 0.843639 +vt 0.922858 0.260577 +vt 0.925930 0.259385 +vt 0.935654 0.293772 +vt 0.901593 0.674617 +vt 0.899437 0.749902 +vt 0.960525 0.746115 +vt 0.954794 0.735768 +vt 0.912682 0.680414 +vt 0.950788 0.720117 +vt 0.949700 0.718292 +vt 0.909608 0.719599 +vt 0.918396 0.308253 +vt 0.918484 0.307670 +vt 0.934245 0.293888 +vt 0.890558 0.291134 +vt 0.890558 0.296112 +vt 0.917233 0.766853 +vt 0.953478 0.749118 +vt 0.956504 0.750947 +vt 0.708158 0.132508 +vt 0.704332 0.132234 +vt 0.716412 0.089060 +vt 0.773619 0.132508 +vt 0.746105 0.089377 +vt 0.748250 0.086560 +vt 0.909786 0.723528 +vt 0.908195 0.721502 +vt 0.949739 0.722183 +vt 0.782891 0.117603 +vt 0.808955 0.119545 +vt 0.810904 0.121963 +vt 0.719849 0.091084 +vt 0.835681 0.076855 +vt 0.838224 0.078280 +vt 0.771670 0.076855 +vt 0.779742 0.119304 +vt 0.947052 0.231319 +vt 0.942942 0.232366 +vt 0.937691 0.203709 +vt 0.910529 0.677094 +vt 0.948600 0.686253 +vt 0.915767 0.202873 +vt 0.938912 0.202873 +vt 0.902311 0.229152 +vt 0.916150 0.203292 +vt 0.898615 0.227897 +vt 0.847021 0.801607 +vt 0.973236 0.719313 +vt 0.980624 0.721996 +vt 0.975133 0.711453 +vt 0.981902 0.717750 +vt 0.983569 0.714759 +vt 0.992567 0.719520 +vt 0.980571 0.726412 +vt 0.989793 0.725888 +vt 0.990587 0.728388 +vt 0.981204 0.729516 +vt 0.993796 0.724584 +vt 0.989802 0.723612 +vt 0.990759 0.721624 +vt 0.420067 0.828054 +vt 0.420464 0.842841 +vt 0.443942 0.830522 +vt 0.391734 0.861782 +vt 0.417316 0.861560 +vt 0.414702 0.879465 +vt 0.438011 0.878742 +vt 0.463775 0.895049 +vt 0.439829 0.898990 +vt 0.440295 0.754740 +vt 0.440364 0.705938 +vt 0.440263 0.656268 +vt 0.416082 0.656257 +vt 0.440761 0.813541 +vt 0.403951 0.888257 +vt 0.415290 0.900009 +vt 0.390625 0.879851 +vt 0.374799 0.900133 +vt 0.375264 0.888040 +vt 0.384354 0.894908 +vt 0.389584 0.888211 +vt 0.389551 0.892816 +vt 0.394721 0.894985 +vt 0.404220 0.900399 +vt 0.397123 0.900623 +vt 0.201431 0.018740 +vt 0.204459 0.032820 +vt 0.198901 0.034006 +vt 0.185297 0.024764 +vt 0.190322 0.021174 +vt 0.193388 0.035191 +vt 0.207523 0.019904 +vt 0.210089 0.031604 +vt 0.195868 0.019959 +vt 0.242781 0.183629 +vt 0.237075 0.184535 +vt 0.231698 0.186019 +vt 0.226252 0.187508 +vt 0.220586 0.188371 +vt 0.227975 0.203945 +vt 0.232410 0.196081 +vt 0.237446 0.197744 +vt 0.231540 0.208340 +vt 0.242781 0.199409 +vt 0.213511 0.225097 +vt 0.210377 0.221512 +vt 0.235589 0.212241 +vt 0.215991 0.229265 +vt 0.219927 0.195976 +vt 0.221003 0.192874 +vt 0.226787 0.194301 +vt 0.206719 0.218153 +vt 0.224298 0.199339 +vt 0.202150 0.215354 +vt 0.206074 0.218974 +vt 0.209672 0.222170 +vt 0.215115 0.229392 +vt 0.212790 0.225598 +vt 0.140139 0.057135 +vt 0.157845 0.057141 +vt 0.152655 0.069659 +vt 0.198295 0.243393 +vt 0.152664 0.044619 +vt 0.195828 0.240517 +vt 0.193472 0.238001 +vt 0.190979 0.235622 +vt 0.188364 0.233395 +vt 0.874095 0.050219 +vt 0.875908 0.043938 +vt 0.878762 0.051906 +vt 0.418842 0.852187 +vt 0.444506 0.855530 +vt 0.392448 0.852757 +vt 0.350516 0.854102 +vt 0.301302 0.876545 +vt 0.320771 0.856514 +vt 0.473809 0.889187 +vt 0.920749 0.053099 +vt 0.907153 0.084830 +vt 0.895681 0.081984 +vt 0.922440 0.043939 +vt 0.958282 0.098639 +vt 0.954459 0.092451 +vt 0.956155 0.091536 +vt 0.913736 0.098639 +vt 0.918947 0.092696 +vt 0.923698 0.049927 +vt 0.922612 0.052967 +vt 0.915945 0.090531 +vt 0.933466 0.059802 +vt 0.294553 0.869430 +vt 0.912536 0.090359 +vt 0.478530 0.885930 +vt 0.936616 0.060625 +vt 0.937370 0.056797 +vt 0.908205 0.085437 +vt 0.906287 0.087309 +vt 0.949638 0.059539 +vt 0.893472 0.082637 +vt 0.896349 0.085428 +vt 0.898089 0.084370 +vt 0.905592 0.086379 +vt 0.948228 0.057363 +vt 0.939888 0.058329 +vt 0.949667 0.056538 +vt 0.051929 0.663994 +vt 0.975810 0.734403 +vt 0.916076 0.770760 +vt 0.951627 0.684121 +vt 0.381864 0.900481 +vt 0.187840 0.036396 +vt 0.201962 0.216530 +vt 0.875817 0.052307 +vt 0.951387 0.059099 +vt 0.776477 0.130857 +vt 0.768235 0.077013 +vt 0.140133 0.074841 +vt 0.140145 0.039428 +vt 0.960070 0.090264 +vn 0.551200 0.039400 -0.833400 +vn 0.950700 0.181400 0.251500 +vn 0.478000 -0.752000 0.453900 +vn 0.367000 0.671900 -0.643200 +vn 0.274600 0.846900 0.455200 +vn 0.766600 0.642000 0.000000 +vn 0.064600 0.655500 0.752400 +vn 0.258500 -0.966000 0.000000 +vn 0.318600 -0.947900 0.000000 +vn 0.240900 -0.665100 -0.706800 +vn -0.000700 -0.014900 -0.999900 +vn -0.042200 -0.043000 -0.998200 +vn -0.018500 0.642400 -0.766100 +vn 0.030900 -0.736000 -0.676200 +vn 0.141900 -0.694100 -0.705700 +vn 0.154300 -0.988000 0.000000 +vn -0.095700 -0.641800 -0.760800 +vn -0.248600 -0.968600 0.000000 +vn -0.080900 -0.996700 0.000000 +vn -0.012600 0.999900 0.000000 +vn 0.091000 0.995800 0.000000 +vn 0.069900 0.636500 -0.768100 +vn 0.001200 0.645100 -0.764100 +vn -0.016700 0.999800 0.000000 +vn 0.013600 0.626200 -0.779500 +vn 0.102100 -0.035900 -0.994100 +vn -0.044300 -0.706400 -0.706400 +vn 0.043600 -0.001400 -0.999000 +vn -0.145300 -0.709100 -0.689900 +vn -0.206500 -0.978400 0.000000 +vn -0.457000 -0.889400 0.000000 +vn -0.098200 0.004400 -0.995100 +vn -0.403100 -0.630100 -0.663600 +vn -0.040000 0.649700 -0.759100 +vn -0.355300 0.025400 -0.934400 +vn -0.038500 0.999200 0.000000 +vn -0.335300 0.626100 -0.704000 +vn -0.793800 0.020200 -0.607900 +vn -0.795500 -0.449000 -0.406800 +vn -0.797000 0.417400 -0.436500 +vn -0.788900 0.614500 0.000000 +vn -0.771500 -0.636200 0.000000 +vn -0.999900 0.011200 0.000000 +vn 0.424100 0.197000 0.883900 +vn 0.333300 -0.680300 0.652700 +vn 0.619300 -0.491800 0.612000 +vn 0.243400 -0.662900 -0.708000 +vn 0.154900 0.697800 -0.699300 +vn 0.161400 0.986900 0.000000 +vn 0.225000 0.974300 0.000000 +vn 0.154600 -0.005400 -0.987900 +vn 0.166500 0.672400 -0.721200 +vn 0.132100 0.028700 -0.990800 +vn 0.001900 -0.005700 -1.000000 +vn 0.005800 -0.410100 -0.912000 +vn 0.010400 -0.381400 -0.924300 +vn 0.001200 0.643900 -0.765100 +vn 0.001500 0.644200 -0.764800 +vn 0.000200 1.000000 0.000000 +vn 0.001500 -0.006100 -1.000000 +vn -0.004400 -0.358000 -0.933700 +vn 0.001600 0.644500 -0.764500 +vn 0.000300 1.000000 0.000000 +vn 0.444900 -0.536900 -0.716800 +vn 0.453900 -0.563800 -0.690000 +vn 0.797300 -0.603500 0.000000 +vn 0.002300 -0.007600 -0.999900 +vn 0.003800 -0.010800 -0.999900 +vn 0.001600 0.643200 -0.765600 +vn 0.033600 -0.999400 0.000000 +vn 0.435300 -0.900300 0.000000 +vn 0.000400 1.000000 0.000000 +vn 0.157500 -0.582400 -0.797500 +vn -0.065100 -0.732800 -0.677300 +vn -0.103200 -0.994600 0.000000 +vn -0.423100 -0.906000 0.000000 +vn -0.811000 -0.585000 0.000000 +vn -0.528100 -0.388400 -0.755100 +vn -0.377800 -0.687000 -0.620700 +vn 0.508300 -0.510500 -0.693500 +vn 0.759900 -0.650000 0.000000 +vn -0.002900 -0.215900 -0.976400 +vn -0.015900 -0.138400 -0.990200 +vn 0.402800 -0.612300 -0.680300 +vn 0.204100 -0.722500 -0.660500 +vn 0.210700 0.706700 -0.675400 +vn 0.192100 0.068700 -0.978900 +vn 0.002300 -0.007700 -0.999900 +vn 0.001700 0.643500 -0.765400 +vn -0.011000 -0.346500 -0.938000 +vn -0.076300 -0.285500 -0.955300 +vn -0.081100 -0.263600 -0.961200 +vn 0.001800 -0.303300 -0.952900 +vn -0.013700 -0.201500 -0.979400 +vn -0.394000 -0.364600 -0.843700 +vn 0.501500 -0.456800 -0.734700 +vn -0.604900 -0.796200 0.000000 +vn -0.275900 -0.577100 -0.768600 +vn 0.743800 -0.668400 0.000000 +vn 0.037600 -0.357100 -0.933300 +vn 0.070100 -0.224100 -0.972000 +vn 0.640400 -0.441500 -0.628400 +vn 0.940400 -0.340000 0.000000 +vn 0.796300 -0.604800 0.000000 +vn 0.301100 0.953600 0.000000 +vn 0.261800 -0.681400 -0.683400 +vn 0.721400 -0.692500 0.000000 +vn 0.420600 -0.637800 -0.645100 +vn -0.150900 0.650100 -0.744700 +vn 0.873700 0.014200 -0.486300 +vn 0.534800 0.700100 -0.473000 +vn -0.033600 0.716400 -0.696900 +vn -0.682100 -0.731200 0.000000 +vn -0.233300 -0.723400 -0.649700 +vn 0.286900 -0.622500 -0.728100 +vn 0.078600 -0.670900 -0.737400 +vn -0.427200 -0.904100 0.000000 +vn -0.021400 -0.660700 -0.750400 +vn -0.118800 0.000200 -0.992900 +vn -0.682600 0.029300 -0.730200 +vn 0.556800 -0.672800 -0.487000 +vn 0.412400 -0.699600 -0.583500 +vn 0.789700 0.025000 -0.612900 +vn -0.189600 0.676200 -0.711900 +vn 0.391100 0.710400 -0.585100 +vn -0.212000 -0.674900 -0.706800 +vn 0.998400 0.056000 0.000000 +vn 0.591500 0.244800 -0.768200 +vn 0.323400 0.606300 -0.726400 +vn -0.134800 0.990900 0.000000 +vn -0.682200 0.731100 0.000000 +vn 0.818200 0.574900 0.000000 +vn -0.295800 0.710100 -0.638900 +vn 0.297300 -0.954800 0.000000 +vn 0.668300 0.047000 0.742400 +vn 0.479600 -0.078300 -0.874000 +vn 0.697300 0.326500 0.638100 +vn 0.544300 0.656900 -0.521700 +vn 0.586300 0.810100 0.000000 +vn 0.412900 0.910700 0.000000 +vn 0.383600 -0.731600 -0.563600 +vn 0.496300 -0.690100 -0.526700 +vn 0.404600 -0.914500 0.000000 +vn 0.429300 -0.903100 0.000000 +vn 0.999900 -0.010500 0.000000 +vn 0.482200 -0.006100 -0.876000 +vn 0.501100 0.679900 -0.535300 +vn 0.009900 -0.410200 -0.911900 +vn 0.019500 -0.276200 -0.960900 +vn -0.056800 -0.368300 -0.927900 +vn 0.033000 -0.154300 -0.987500 +vn 0.046800 -0.123400 -0.991200 +vn 0.035700 -0.676900 -0.735200 +vn 0.029300 -0.675000 -0.737200 +vn 0.345600 -0.938400 0.000000 +vn 0.036000 -0.999300 0.000000 +vn 0.002200 -0.006800 -1.000000 +vn 0.001200 0.643800 -0.765200 +vn -0.000800 -0.391100 -0.920300 +vn 0.000600 -0.970800 -0.239800 +vn 0.035200 -0.999400 0.000000 +vn -0.005800 -0.680300 -0.732900 +vn 0.065700 -0.997800 0.000000 +vn 0.022600 -0.964400 -0.263300 +vn -0.310500 -0.819400 -0.481800 +vn 0.000300 -0.986300 -0.164700 +vn 0.000000 -0.833700 -0.552200 +vn 0.310600 -0.819400 -0.481800 +vn -0.027400 -0.999600 0.000000 +vn 0.708400 -0.705800 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.000000 -1.000000 +vn -0.708400 -0.705800 0.000000 +vn -0.707100 0.000000 -0.707100 +vn 1.000000 0.000000 0.000000 +vn 0.989500 -0.144100 0.000000 +vn 0.720100 -0.106400 -0.685600 +vn 0.027600 -0.011700 -0.999500 +vn -0.700800 0.053300 -0.711400 +vn -0.998800 0.048400 0.000000 +vn 0.026600 -0.056900 -0.998000 +vn 0.077600 -0.054200 -0.995500 +vn 0.573400 -0.484400 -0.660700 +vn 0.169300 -0.718400 -0.674700 +vn 0.754500 -0.656200 0.000000 +vn -0.630200 -0.549000 -0.549000 +vn -0.630200 0.000000 -0.776400 +vn 0.213600 -0.976900 0.000000 +vn -0.630200 -0.776400 0.000000 +vn -0.324100 0.946000 0.000000 +vn -0.876400 0.481600 0.000000 +vn -0.548000 0.361400 -0.754300 +vn -0.630200 0.549000 -0.549000 +vn -0.187000 0.650000 -0.736600 +vn -0.630200 0.776400 0.000000 +vn -0.814800 -0.409900 0.409900 +vn -0.814800 0.000000 0.579700 +vn -0.814800 0.579700 0.000000 +vn -0.814800 0.409900 0.409900 +vn -1.000000 0.000000 0.000000 +vn -0.644800 0.000000 0.764400 +vn -0.644800 0.540500 0.540500 +vn -0.644800 0.764400 0.000000 +vn -0.644800 -0.540500 0.540500 +vn -0.644800 -0.764400 0.000000 +vn -0.068200 -0.162600 -0.984300 +vn -0.362500 0.291100 -0.885300 +vn 0.035400 -0.126300 -0.991300 +vn -0.031500 -0.127900 -0.991300 +vn 0.167000 -0.134100 -0.976800 +vn -0.900300 -0.435100 0.000000 +vn -0.570800 -0.245100 -0.783600 +vn 0.681800 -0.731600 0.000000 +vn 0.535100 0.423900 -0.730800 +vn 0.519400 0.849600 -0.091400 +vn -0.386500 0.832800 -0.396300 +vn 0.124700 -0.623100 -0.772100 +vn 0.388300 -0.399500 -0.830400 +vn -0.098800 -0.532300 -0.840800 +vn -0.283300 -0.355800 -0.890500 +vn -0.796700 -0.099400 -0.596100 +vn -0.861300 -0.508000 0.000000 +vn 0.799100 -0.601200 0.000000 +vn -0.322400 -0.882300 -0.343000 +vn -0.413900 -0.075400 -0.907200 +vn 0.970600 -0.183300 -0.156000 +vn 0.698000 -0.169200 -0.695800 +vn 0.334100 -0.940700 -0.058700 +vn -0.097300 0.732200 -0.674100 +vn 0.311500 0.663800 -0.679900 +vn 0.200000 -0.689000 -0.696600 +vn -0.062100 -0.741600 -0.668000 +vn 0.223600 -0.351800 0.909000 +vn 0.192200 0.036700 0.980700 +vn 0.551200 0.039400 0.833400 +vn 0.120200 0.370700 0.920900 +vn 0.261800 -0.681400 0.683400 +vn 0.240900 -0.665100 0.706800 +vn -0.018500 0.642400 0.766100 +vn -0.042200 -0.043000 0.998200 +vn -0.000700 -0.014900 0.999900 +vn 0.141900 -0.694100 0.705700 +vn 0.030900 -0.736000 0.676200 +vn -0.095700 -0.641800 0.760800 +vn -0.044300 -0.706400 0.706400 +vn 0.069900 0.636500 0.768100 +vn 0.001200 0.645100 0.764100 +vn 0.102100 -0.035900 0.994100 +vn 0.013600 0.626200 0.779500 +vn 0.043600 -0.001400 0.999000 +vn -0.145300 -0.709100 0.689900 +vn -0.403100 -0.630100 0.663600 +vn -0.098200 0.004400 0.995100 +vn -0.355300 0.025400 0.934400 +vn -0.040000 0.649700 0.759100 +vn -0.335300 0.626100 0.704000 +vn -0.353900 0.935300 0.000000 +vn -0.797000 0.417400 0.436500 +vn -0.793800 0.020200 0.607900 +vn -0.795500 -0.449000 0.406800 +vn 0.538700 0.252200 0.803900 +vn 0.404600 -0.361000 0.840200 +vn 0.403300 -0.320300 0.857100 +vn 0.243400 -0.662900 0.708000 +vn 0.154900 0.697800 0.699300 +vn 0.166500 0.672400 0.721200 +vn 0.154600 -0.005400 0.987900 +vn 0.132100 0.028700 0.990800 +vn 0.001900 -0.005700 1.000000 +vn 0.001500 -0.006100 1.000000 +vn 0.010400 -0.381400 0.924300 +vn 0.001500 0.644200 0.764800 +vn 0.001200 0.643900 0.765100 +vn -0.004400 -0.358000 0.933700 +vn 0.001600 0.644500 0.764500 +vn 0.453900 -0.563800 0.690000 +vn 0.444900 -0.536900 0.716800 +vn 0.002300 -0.007600 0.999900 +vn 0.001600 0.643200 0.765600 +vn 0.003800 -0.010800 0.999900 +vn 0.157500 -0.582400 0.797500 +vn -0.065100 -0.732800 0.677300 +vn -0.377800 -0.687000 0.620700 +vn 0.508300 -0.510500 0.693500 +vn -0.002900 -0.215900 0.976400 +vn -0.015900 -0.138400 0.990200 +vn 0.029300 -0.675000 0.737200 +vn 0.204100 -0.722500 0.660500 +vn 0.192100 0.068700 0.978900 +vn 0.210700 0.706700 0.675400 +vn 0.001700 0.643500 0.765400 +vn 0.002300 -0.007700 0.999900 +vn -0.011000 -0.346500 0.938000 +vn -0.081100 -0.263600 0.961200 +vn -0.076300 -0.285500 0.955300 +vn -0.394000 -0.364600 0.843700 +vn -0.013700 -0.201500 0.979400 +vn 0.001800 -0.303300 0.952900 +vn 0.070100 -0.224100 0.972000 +vn 0.640400 -0.441500 0.628400 +vn 0.286900 -0.622500 0.728100 +vn 0.420600 -0.637800 0.645100 +vn 0.367000 0.671900 0.643200 +vn 0.591500 0.244800 0.768200 +vn -0.150900 0.650100 0.744700 +vn 0.534800 0.700100 0.473000 +vn 0.873700 0.014200 0.486300 +vn -0.118800 0.000200 0.992900 +vn -0.033600 0.716400 0.696900 +vn -0.233300 -0.723400 0.649700 +vn 0.078600 -0.670900 0.737400 +vn -0.021400 -0.660700 0.750400 +vn -0.212000 -0.674900 0.706800 +vn -0.682600 0.029300 0.730200 +vn 0.789700 0.025000 0.612900 +vn 0.412400 -0.699600 0.583500 +vn 0.556800 -0.672800 0.487000 +vn 0.391100 0.710400 0.585100 +vn -0.189600 0.676200 0.711900 +vn 0.323400 0.606300 0.726500 +vn -0.295800 0.710100 0.638900 +vn 0.383600 -0.731600 0.563600 +vn 0.479600 -0.078300 0.874000 +vn 0.363500 0.025600 0.931200 +vn 0.544300 0.656900 0.521700 +vn 0.501100 0.679900 0.535300 +vn 0.496300 -0.690100 0.526700 +vn 0.482200 -0.006100 0.876000 +vn 0.037600 -0.357100 0.933300 +vn 0.019500 -0.276200 0.960900 +vn -0.056800 -0.368300 0.927900 +vn 0.033000 -0.154300 0.987500 +vn -0.005800 -0.680300 0.732900 +vn 0.035700 -0.676900 0.735200 +vn 0.046800 -0.123400 0.991200 +vn 0.001200 0.643800 0.765200 +vn 0.002200 -0.006800 1.000000 +vn -0.000800 -0.391100 0.920300 +vn 0.005800 -0.410100 0.912000 +vn 0.000600 -0.970800 0.239800 +vn 0.000300 -0.986300 0.164700 +vn -0.310500 -0.819400 0.481800 +vn 0.000000 -0.833700 0.552200 +vn 0.310600 -0.819400 0.481800 +vn 0.000000 0.000000 1.000000 +vn 0.707100 0.000000 0.707100 +vn -0.707100 0.000000 0.707100 +vn 0.720100 -0.106400 0.685600 +vn -0.700800 0.053300 0.711400 +vn 0.027600 -0.011700 0.999500 +vn 0.573400 -0.484400 0.660700 +vn 0.077600 -0.054200 0.995500 +vn 0.026600 -0.056900 0.998000 +vn 0.169300 -0.718400 0.674700 +vn -0.630200 0.000000 0.776400 +vn -0.630200 -0.549000 0.549000 +vn -0.548000 0.361400 0.754300 +vn -0.630200 0.549000 0.549000 +vn -0.187000 0.650000 0.736600 +vn 0.022600 -0.964400 0.263300 +vn -0.814800 -0.579700 0.000000 +vn -0.814800 -0.409900 -0.409900 +vn -0.814800 0.000000 -0.579700 +vn -0.814800 0.409900 -0.409900 +vn -0.644800 0.540500 -0.540500 +vn -0.644800 0.000000 -0.764400 +vn -0.644800 -0.540500 -0.540500 +vn -0.068200 -0.162600 0.984300 +vn -0.283300 -0.355800 0.890500 +vn -0.362500 0.291100 0.885300 +vn 0.035400 -0.126300 0.991300 +vn 0.167000 -0.134100 0.976800 +vn -0.031500 -0.127900 0.991300 +vn 0.402800 -0.612300 0.680300 +vn -0.528100 -0.388400 0.755100 +vn -0.386500 0.832800 0.396300 +vn 0.519400 0.849600 0.091400 +vn 0.535100 0.423900 0.730800 +vn 0.388300 -0.399500 0.830400 +vn 0.124700 -0.623100 0.772100 +vn -0.098800 -0.532300 0.840800 +vn -0.322400 -0.882300 0.343000 +vn -0.796700 -0.099400 0.596100 +vn -0.570800 -0.245100 0.783600 +vn -0.062100 -0.741600 0.668000 +vn -0.413900 -0.075400 0.907200 +vn 0.311500 0.663800 0.679900 +vn 0.698000 -0.169200 0.695800 +vn 0.970600 -0.183300 0.156000 +vn 0.334100 -0.940700 0.058700 +vn -0.097300 0.732200 0.674100 +vn 0.200000 -0.689000 0.696600 +vn 0.009900 -0.410200 0.911900 +vn 0.501500 -0.456800 0.734700 +vn -0.275900 -0.577100 0.768600 +usemtl Material +s 1 +f 50/1/1 5/2/2 4/3/3 +f 50/1/1 49/4/4 7/5/5 +f 284/6/6 261/7/7 7/5/5 +f 283/8/8 267/9/9 21/10/10 +f 28/11/11 1/12/12 6/13/13 +f 10/14/14 9/15/15 258/16/16 +f 26/17/17 270/18/18 256/19/19 +f 255/20/20 254/21/21 8/22/22 +f 27/23/23 6/13/13 259/24/24 +f 2/25/25 8/22/22 12/26/26 +f 26/17/17 3/27/27 1/12/12 +f 11/28/28 12/26/26 9/15/15 +f 158/29/29 398/30/30 262/31/31 +f 159/32/32 158/29/29 14/33/33 +f 160/34/34 159/32/32 13/35/35 +f 402/36/36 160/34/34 15/37/37 +f 15/37/37 13/35/35 16/38/38 +f 13/35/35 14/33/33 17/39/39 +f 15/37/37 18/40/40 265/41/41 +f 14/33/33 262/31/31 264/42/42 +f 18/40/40 16/38/38 266/43/43 +f 17/39/39 264/42/42 266/43/43 +f 7/5/5 261/7/7 297/44/44 +f 260/45/45 4/3/3 75/46/46 +f 74/47/47 21/10/10 267/9/9 +f 72/48/48 294/49/49 268/50/50 +f 73/51/51 72/48/48 19/52/52 +f 73/51/51 20/53/53 21/10/10 +f 90/54/54 85/55/55 23/56/56 +f 88/57/57 22/58/58 269/59/59 +f 90/54/54 25/60/60 22/58/58 +f 35/61/61 26/17/17 28/11/11 +f 24/62/62 27/23/23 271/63/63 +f 134/64/64 45/65/65 276/66/66 +f 34/67/67 28/11/11 27/23/23 +f 11/28/28 30/68/68 29/69/69 +f 10/14/14 257/70/70 273/71/71 +f 2/25/25 29/69/69 272/72/72 +f 11/28/28 10/14/14 31/73/73 +f 36/74/74 278/75/75 274/76/76 +f 360/77/77 124/78/78 33/79/79 +f 45/65/65 42/80/80 281/81/81 +f 25/60/60 34/67/67 24/62/62 +f 22/58/58 24/62/62 277/82/72 +f 25/60/60 23/56/56 35/61/61 +f 122/83/82 36/74/74 33/79/79 +f 126/84/83 123/85/84 40/86/85 +f 19/52/52 48/87/86 47/88/87 +f 30/68/68 39/89/88 38/90/89 +f 29/69/69 38/90/89 279/91/72 +f 30/68/68 31/73/73 37/92/90 +f 155/93/91 45/65/65 92/94/92 +f 154/95/93 44/96/94 43/97/95 +f 155/93/91 151/98/96 42/80/80 +f 391/99/97 152/100/98 43/97/95 +f 393/101/99 281/81/81 42/80/80 +f 154/95/93 153/102/100 41/103/101 +f 54/104/102 289/105/103 287/106/104 +f 19/52/52 268/50/50 275/107/105 +f 20/53/53 47/88/87 46/108/106 +f 260/45/45 285/109/107 51/110/108 +f 49/4/4 48/87/86 68/111/109 +f 50/1/1 60/112/110 59/113/111 +f 47/88/87 48/87/86 58/114/112 +f 286/115/113 52/116/114 53/117/115 +f 55/118/116 54/104/102 53/117/115 +f 288/119/117 55/118/116 52/116/114 +f 283/8/8 46/108/106 55/120/116 +f 51/110/108 54/121/102 55/120/116 +f 285/109/107 289/122/103 54/121/102 +f 56/123/118 57/124/119 63/125/120 +f 61/126/121 67/127/122 66/128/123 +f 51/110/108 46/108/106 56/129/118 +f 49/4/4 59/113/111 58/114/112 +f 47/88/87 57/130/119 56/129/118 +f 50/1/1 51/110/108 61/131/121 +f 64/132/124 65/133/125 66/134/123 +f 62/135/126 63/125/120 66/128/123 +f 56/123/118 62/135/126 67/127/122 +f 59/136/111 60/137/110 66/134/123 +f 58/138/112 59/136/111 65/133/125 +f 58/138/112 64/132/124 63/139/120 +f 291/140/127 69/141/128 71/142/129 +f 48/87/86 275/107/105 290/143/130 +f 284/6/6 49/4/4 69/144/128 +f 292/145/131 293/146/132 71/142/129 +f 69/141/128 68/147/109 70/148/133 +f 68/147/109 290/149/130 292/145/131 +f 9/15/15 74/47/47 295/150/134 +f 8/22/22 72/48/48 73/51/51 +f 12/26/26 73/51/51 74/47/47 +f 294/49/49 72/48/48 8/22/22 +f 75/46/46 76/151/135 80/152/136 +f 76/151/135 77/153/137 81/154/138 +f 5/2/2 7/5/5 77/153/137 +f 4/3/3 5/2/2 76/151/135 +f 81/154/138 301/155/139 303/156/140 +f 79/157/141 78/158/142 302/159/143 +f 75/46/46 79/157/141 299/160/144 +f 77/153/137 297/44/44 301/155/139 +f 304/161/145 302/159/143 78/158/142 +f 304/161/145 82/162/146 83/163/147 +f 80/152/136 81/154/138 83/163/147 +f 79/157/141 80/152/136 82/162/146 +f 153/102/100 156/164/148 93/165/149 +f 157/166/150 92/94/92 93/165/149 +f 121/167/151 125/168/152 87/169/153 +f 125/168/152 126/84/83 86/170/154 +f 280/171/155 307/172/156 86/170/154 +f 39/89/88 91/173/157 89/174/158 +f 91/173/157 90/54/54 88/57/57 +f 38/90/89 89/174/158 306/175/59 +f 89/174/158 88/57/57 305/176/59 +f 37/92/90 84/177/159 91/173/157 +f 91/173/157 84/177/159 85/55/55 +f 95/178/160 87/169/153 343/179/161 +f 32/180/162 87/169/153 95/178/160 +f 86/170/154 307/172/156 343/179/161 +f 311/181/163 94/182/164 97/183/165 +f 96/184/166 98/185/167 97/183/165 +f 96/184/166 95/178/160 99/186/168 +f 312/187/169 313/188/170 99/186/168 +f 99/189/168 102/190/171 101/191/172 +f 314/192/173 97/193/165 100/194/174 +f 313/195/170 318/196/175 102/190/171 +f 98/197/167 101/191/172 100/194/174 +f 318/196/175 323/198/176 105/199/177 +f 101/191/172 104/200/178 103/201/179 +f 101/191/172 102/190/171 105/199/177 +f 100/194/174 103/201/179 324/202/180 +f 110/203/181 113/204/182 112/205/183 +f 109/206/184 112/205/183 339/207/185 +f 109/206/184 108/208/186 107/209/187 +f 334/210/188 331/211/189 108/208/186 +f 333/212/190 338/213/191 114/214/192 +f 110/203/181 107/209/187 106/215/193 +f 111/216/194 106/215/193 332/217/195 +f 111/216/194 114/214/192 113/204/182 +f 103/201/179 114/214/192 338/213/191 +f 104/200/178 113/204/182 114/214/192 +f 105/199/177 112/205/183 113/204/182 +f 323/198/176 339/207/185 112/205/183 +f 94/182/164 311/181/163 278/75/75 +f 32/180/162 96/184/166 94/182/164 +f 332/217/195 106/215/193 115/218/196 +f 106/215/193 107/209/187 116/219/197 +f 331/211/189 347/220/198 117/221/199 +f 108/208/186 117/221/199 116/219/197 +f 354/222/200 119/223/201 118/224/202 +f 117/221/199 347/220/198 349/225/203 +f 120/226/204 119/223/201 354/222/200 +f 117/221/199 118/227/202 119/228/201 +f 116/219/197 119/228/201 120/229/204 +f 115/218/196 120/229/204 353/230/205 +f 133/231/206 44/232/94 128/233/207 +f 32/180/162 36/74/74 122/83/82 +f 135/234/208 136/235/209 126/84/83 +f 132/236/210 135/234/208 125/168/152 +f 136/235/209 134/64/64 123/85/84 +f 133/237/206 122/83/82 124/78/78 +f 369/238/211 131/239/212 124/78/78 +f 40/86/85 123/85/84 356/240/213 +f 127/241/214 139/242/215 140/243/216 +f 41/244/101 127/241/214 128/233/207 +f 121/245/151 129/246/217 137/247/218 +f 121/245/151 122/248/82 130/249/219 +f 132/250/210 137/251/218 127/241/214 +f 130/249/219 138/252/220 144/253/221 +f 282/254/222 43/97/95 131/239/212 +f 44/96/94 133/237/206 131/239/212 +f 92/94/92 45/65/65 134/64/64 +f 41/103/101 93/165/149 135/234/208 +f 93/165/149 92/94/92 136/235/209 +f 122/248/82 133/255/206 138/252/220 +f 123/85/84 134/64/64 367/256/223 +f 142/257/224 144/253/221 150/258/225 +f 139/242/215 143/259/226 149/260/227 +f 127/241/214 137/251/218 143/259/226 +f 129/246/217 130/249/219 142/257/224 +f 137/247/218 129/246/217 141/261/228 +f 128/233/207 140/243/216 144/262/221 +f 150/263/225 146/264/229 145/265/230 +f 147/266/231 148/267/232 150/258/225 +f 139/242/215 145/265/230 146/264/229 +f 140/243/216 146/264/229 150/263/225 +f 141/261/228 142/257/224 148/267/232 +f 141/261/228 147/266/231 149/268/227 +f 84/177/159 157/166/150 156/164/148 +f 23/56/56 85/55/55 156/164/148 +f 35/61/61 23/56/56 153/102/100 +f 273/71/71 393/101/99 151/98/96 +f 270/18/18 26/17/17 152/100/98 +f 37/92/90 31/73/73 151/98/96 +f 35/61/61 154/95/93 152/100/98 +f 37/92/90 155/93/91 157/166/150 +f 259/24/24 6/13/13 160/34/34 +f 6/13/13 1/12/12 159/32/32 +f 1/12/12 3/27/27 158/29/29 +f 3/27/27 256/19/19 398/30/30 +f 164/3/233 165/2/234 210/1/235 +f 210/1/235 165/2/234 167/5/236 +f 167/5/236 261/7/7 284/6/6 +f 283/8/8 206/108/237 181/10/238 +f 166/13/239 161/12/240 188/11/241 +f 258/16/16 169/15/242 170/14/243 +f 186/17/244 163/27/245 256/19/19 +f 168/22/246 254/21/21 255/20/20 +f 259/24/24 166/13/239 187/23/247 +f 172/26/248 168/22/246 162/25/249 +f 161/12/240 163/27/245 186/17/244 +f 169/15/242 172/26/248 171/28/250 +f 399/29/251 174/33/252 262/31/31 +f 400/32/253 173/35/254 174/33/252 +f 401/34/255 175/37/256 173/35/254 +f 402/36/36 263/269/257 175/37/256 +f 175/37/256 178/40/258 176/38/259 +f 173/35/254 176/38/259 177/39/260 +f 265/41/41 178/40/258 175/37/256 +f 174/33/252 177/39/260 264/42/42 +f 178/40/258 265/41/41 266/43/43 +f 266/43/43 264/42/42 177/39/260 +f 167/5/236 237/153/261 297/44/44 +f 260/45/45 296/270/262 235/46/263 +f 267/9/9 181/10/238 234/47/264 +f 232/48/265 179/52/266 268/50/50 +f 233/51/267 180/53/268 179/52/266 +f 181/10/238 180/53/268 233/51/267 +f 250/54/269 185/60/270 183/56/271 +f 269/59/59 182/58/272 248/57/273 +f 182/58/272 185/60/270 250/54/269 +f 188/11/241 186/17/244 195/61/274 +f 271/63/63 187/23/247 184/62/275 +f 276/66/66 205/65/276 372/64/277 +f 187/23/247 188/11/241 194/67/278 +f 189/69/279 190/68/280 171/28/250 +f 170/14/243 191/73/281 273/71/71 +f 272/72/72 189/69/279 162/25/249 +f 171/28/250 190/68/280 191/73/281 +f 196/74/282 193/79/283 274/76/76 +f 360/77/77 274/76/76 193/79/283 +f 281/81/81 202/80/284 205/65/276 +f 184/62/275 194/67/278 185/60/270 +f 277/82/72 184/62/275 182/58/272 +f 185/60/270 194/67/278 195/61/274 +f 193/79/283 196/74/282 357/83/285 +f 362/84/286 246/170/287 200/86/288 +f 207/88/289 208/87/290 179/52/266 +f 198/90/291 199/89/292 190/68/280 +f 279/91/72 198/90/291 189/69/279 +f 190/68/280 199/89/292 197/92/293 +f 252/94/294 205/65/276 395/93/295 +f 203/97/296 204/96/297 394/95/298 +f 395/93/295 205/65/276 202/80/284 +f 391/99/97 282/254/222 203/97/296 +f 202/80/284 281/81/81 393/101/99 +f 394/95/298 204/96/297 201/103/299 +f 214/104/300 213/117/301 287/106/104 +f 179/52/266 208/87/290 275/107/105 +f 206/108/237 207/88/289 180/53/268 +f 260/45/45 164/3/233 211/110/302 +f 209/4/303 229/144/304 228/111/305 +f 219/113/306 220/112/307 210/1/235 +f 207/88/289 217/130/308 218/114/309 +f 213/117/301 212/116/310 286/115/113 +f 215/118/311 212/116/310 213/117/301 +f 288/119/117 286/115/113 212/116/310 +f 283/8/8 288/271/117 215/120/311 +f 215/120/311 214/121/300 211/110/302 +f 214/121/300 289/122/103 285/109/107 +f 216/123/312 222/135/313 223/125/314 +f 226/128/315 227/127/316 221/126/317 +f 211/110/302 221/131/317 216/129/312 +f 218/114/309 219/113/306 209/4/303 +f 216/129/312 217/130/308 207/88/289 +f 210/1/235 220/112/307 221/131/317 +f 226/134/315 225/133/318 224/132/319 +f 222/135/313 227/127/316 226/128/315 +f 227/127/316 222/135/313 216/123/312 +f 219/136/306 225/133/318 226/134/315 +f 218/138/309 224/132/319 225/133/318 +f 223/139/314 224/132/319 218/138/309 +f 291/140/127 293/146/132 231/142/320 +f 208/87/290 228/111/305 290/143/130 +f 284/6/6 291/272/127 229/144/304 +f 231/142/320 293/146/132 292/145/131 +f 229/141/304 231/142/320 230/148/321 +f 228/147/305 230/148/321 292/145/131 +f 169/15/242 258/16/16 295/150/134 +f 168/22/246 172/26/248 233/51/267 +f 172/26/248 169/15/242 234/47/264 +f 168/22/246 232/48/265 294/49/49 +f 235/46/263 239/157/322 240/152/323 +f 236/151/324 240/152/323 241/154/325 +f 165/2/234 236/151/324 237/153/261 +f 164/3/233 235/46/263 236/151/324 +f 241/154/325 243/163/326 303/156/140 +f 302/159/143 238/158/327 239/157/322 +f 299/160/144 239/157/322 235/46/263 +f 237/153/261 241/154/325 301/155/139 +f 238/158/327 302/159/143 304/161/145 +f 243/163/326 242/162/328 304/161/145 +f 242/162/328 243/163/326 241/154/325 +f 239/157/322 238/158/327 242/162/328 +f 392/102/329 201/103/299 253/165/330 +f 253/165/330 252/94/294 397/166/331 +f 355/167/332 192/180/333 247/169/334 +f 361/168/335 247/169/334 246/170/287 +f 246/170/287 307/172/156 280/171/155 +f 249/174/336 251/173/337 199/89/292 +f 248/57/273 250/54/269 251/173/337 +f 306/175/59 249/174/336 198/90/291 +f 305/176/59 248/57/273 249/174/336 +f 251/173/337 244/177/338 197/92/293 +f 251/173/337 250/54/269 245/55/339 +f 343/179/161 247/169/334 309/178/340 +f 192/180/333 310/184/341 309/178/340 +f 343/179/161 307/172/156 246/170/287 +f 311/181/163 314/273/173 315/183/342 +f 315/183/342 316/185/343 310/184/341 +f 310/184/341 316/185/343 317/186/344 +f 317/186/344 313/188/170 312/187/169 +f 321/191/345 322/190/346 317/189/344 +f 314/192/173 319/274/200 320/194/347 +f 322/190/346 318/196/175 313/195/170 +f 320/194/347 321/191/345 316/197/343 +f 327/199/348 323/198/176 318/196/175 +f 325/201/349 326/200/350 321/191/345 +f 326/200/350 327/199/348 322/190/346 +f 324/202/180 325/201/349 320/194/347 +f 340/205/351 341/204/352 336/203/353 +f 339/207/185 340/205/351 335/206/354 +f 329/209/355 330/208/356 335/206/354 +f 330/208/356 331/211/189 334/210/188 +f 342/214/357 338/213/191 333/212/190 +f 328/215/358 329/209/355 336/203/353 +f 332/217/195 328/215/358 337/216/359 +f 341/204/352 342/214/357 337/216/359 +f 325/201/349 324/202/180 338/213/191 +f 326/200/350 325/201/349 342/214/357 +f 327/199/348 326/200/350 341/204/352 +f 323/198/176 327/199/348 340/205/351 +f 278/75/75 311/181/163 308/182/360 +f 308/182/360 310/184/341 192/180/333 +f 332/217/195 348/275/361 344/218/362 +f 328/215/358 344/218/362 345/219/363 +f 346/221/364 347/220/198 331/211/189 +f 345/219/363 346/221/364 330/208/356 +f 350/224/365 351/223/366 354/222/200 +f 350/227/365 349/225/203 347/220/198 +f 354/222/200 351/223/366 352/226/367 +f 345/219/363 351/228/366 350/227/365 +f 344/218/362 352/229/367 351/228/366 +f 353/230/205 352/229/367 344/218/362 +f 371/231/368 376/276/369 364/233/370 +f 192/180/333 355/167/332 357/83/285 +f 373/234/371 361/168/335 362/84/286 +f 370/236/372 355/167/332 361/168/335 +f 374/235/373 362/84/286 358/85/374 +f 359/78/375 357/83/285 371/237/368 +f 369/238/211 360/77/77 359/78/375 +f 356/240/213 358/85/374 200/86/288 +f 378/243/376 377/242/377 363/241/378 +f 364/233/370 363/241/378 201/244/299 +f 375/247/379 365/246/380 355/245/332 +f 355/245/332 365/246/380 366/249/381 +f 363/241/378 375/251/379 370/250/372 +f 366/249/381 380/257/382 382/253/383 +f 282/254/222 369/238/211 368/239/384 +f 368/239/384 371/237/368 204/96/297 +f 252/94/294 374/235/373 372/64/277 +f 201/103/299 370/236/372 373/234/371 +f 253/165/330 373/234/371 374/235/373 +f 357/248/285 366/249/381 376/252/369 +f 367/256/223 372/64/277 358/85/374 +f 380/257/382 386/267/385 388/258/386 +f 377/242/377 383/265/387 387/260/388 +f 363/241/378 377/242/377 381/259/389 +f 365/246/380 379/261/390 380/257/382 +f 375/247/379 381/277/389 379/261/390 +f 382/262/383 378/243/376 364/233/370 +f 383/265/387 384/264/391 388/263/386 +f 385/266/392 387/268/388 388/258/386 +f 384/264/391 383/265/387 377/242/377 +f 388/263/386 384/264/391 378/243/376 +f 379/261/390 385/266/392 386/267/385 +f 387/268/388 385/266/392 379/261/390 +f 396/164/393 397/166/331 244/177/338 +f 183/56/271 392/102/329 396/164/393 +f 195/61/274 394/95/298 392/102/329 +f 389/98/394 393/101/99 273/71/71 +f 270/18/18 391/99/97 390/100/395 +f 197/92/293 395/93/295 389/98/394 +f 390/100/395 394/95/298 195/61/274 +f 397/166/331 395/93/295 197/92/293 +f 259/24/24 402/36/36 401/34/255 +f 166/13/239 401/34/255 400/32/253 +f 161/12/240 400/32/253 399/29/251 +f 163/27/245 399/29/251 398/30/30 +f 51/110/108 50/1/1 4/3/3 +f 5/2/2 50/1/1 7/5/5 +f 49/4/4 284/6/6 7/5/5 +f 46/108/106 283/8/8 21/10/10 +f 27/23/23 28/11/11 6/13/13 +f 257/70/70 10/14/14 258/16/16 +f 3/27/27 26/17/17 256/19/19 +f 2/25/25 255/20/20 8/22/22 +f 271/63/63 27/23/23 259/24/24 +f 11/28/28 2/25/25 12/26/26 +f 28/11/11 26/17/17 1/12/12 +f 10/14/14 11/28/28 9/15/15 +f 14/33/33 158/29/29 262/31/31 +f 13/35/35 159/32/32 14/33/33 +f 15/37/37 160/34/34 13/35/35 +f 263/269/257 402/36/36 15/37/37 +f 18/40/40 15/37/37 16/38/38 +f 16/38/38 13/35/35 17/39/39 +f 263/269/257 15/37/37 265/41/41 +f 17/39/39 14/33/33 264/42/42 +f 265/41/41 18/40/40 266/43/43 +f 16/38/38 17/39/39 266/43/43 +f 77/153/137 7/5/5 297/44/44 +f 296/270/262 260/45/45 75/46/46 +f 295/150/134 74/47/47 267/9/9 +f 19/52/52 72/48/48 268/50/50 +f 20/53/53 73/51/51 19/52/52 +f 74/47/47 73/51/51 21/10/10 +f 25/60/60 90/54/54 23/56/56 +f 305/176/59 88/57/57 269/59/59 +f 88/57/57 90/54/54 22/58/58 +f 34/67/67 35/61/61 28/11/11 +f 277/82/72 24/62/62 271/63/63 +f 367/256/223 134/64/64 276/66/66 +f 24/62/62 34/67/67 27/23/23 +f 2/25/25 11/28/28 29/69/69 +f 31/73/73 10/14/14 273/71/71 +f 255/20/20 2/25/25 272/72/72 +f 30/68/68 11/28/28 31/73/73 +f 33/79/79 36/74/74 274/76/76 +f 274/76/76 360/77/77 33/79/79 +f 276/66/66 45/65/65 281/81/81 +f 22/58/58 25/60/60 24/62/62 +f 269/59/59 22/58/58 277/82/72 +f 34/67/67 25/60/60 35/61/61 +f 124/78/78 122/83/82 33/79/79 +f 86/170/154 126/84/83 40/86/85 +f 20/53/53 19/52/52 47/88/87 +f 29/69/69 30/68/68 38/90/89 +f 272/72/72 29/69/69 279/91/72 +f 39/89/88 30/68/68 37/92/90 +f 157/166/150 155/93/91 92/94/92 +f 152/100/98 154/95/93 43/97/95 +f 45/65/65 155/93/91 42/80/80 +f 282/254/222 391/99/97 43/97/95 +f 151/98/96 393/101/99 42/80/80 +f 44/96/94 154/95/93 41/103/101 +f 53/117/115 54/104/102 287/106/104 +f 48/87/86 19/52/52 275/107/105 +f 21/10/10 20/53/53 46/108/106 +f 4/3/3 260/45/45 51/110/108 +f 69/144/128 49/4/4 68/111/109 +f 49/4/4 50/1/1 59/113/111 +f 57/130/119 47/88/87 58/114/112 +f 287/106/104 286/115/113 53/117/115 +f 52/116/114 55/118/116 53/117/115 +f 286/115/113 288/119/117 52/116/114 +f 288/271/117 283/8/8 55/120/116 +f 46/108/106 51/110/108 55/120/116 +f 51/110/108 285/109/107 54/121/102 +f 62/135/126 56/123/118 63/125/120 +f 60/278/110 61/126/121 66/128/123 +f 61/131/121 51/110/108 56/129/118 +f 48/87/86 49/4/4 58/114/112 +f 46/108/106 47/88/87 56/129/118 +f 60/112/110 50/1/1 61/131/121 +f 63/139/120 64/132/124 66/134/123 +f 67/127/122 62/135/126 66/128/123 +f 61/126/121 56/123/118 67/127/122 +f 65/133/125 59/136/111 66/134/123 +f 64/132/124 58/138/112 65/133/125 +f 57/279/119 58/138/112 63/139/120 +f 293/146/132 291/140/127 71/142/129 +f 68/111/109 48/87/86 290/143/130 +f 291/272/127 284/6/6 69/144/128 +f 70/148/133 292/145/131 71/142/129 +f 71/142/129 69/141/128 70/148/133 +f 70/148/133 68/147/109 292/145/131 +f 258/16/16 9/15/15 295/150/134 +f 12/26/26 8/22/22 73/51/51 +f 9/15/15 12/26/26 74/47/47 +f 254/21/21 294/49/49 8/22/22 +f 79/157/141 75/46/46 80/152/136 +f 80/152/136 76/151/135 81/154/138 +f 76/151/135 5/2/2 77/153/137 +f 75/46/46 4/3/3 76/151/135 +f 83/163/147 81/154/138 303/156/140 +f 299/160/144 79/157/141 302/159/143 +f 296/270/262 75/46/46 299/160/144 +f 81/154/138 77/153/137 301/155/139 +f 82/162/146 304/161/145 78/158/142 +f 303/156/140 304/161/145 83/163/147 +f 82/162/146 80/152/136 83/163/147 +f 78/158/142 79/157/141 82/162/146 +f 41/103/101 153/102/100 93/165/149 +f 156/164/148 157/166/150 93/165/149 +f 32/180/162 121/167/151 87/169/153 +f 87/169/153 125/168/152 86/170/154 +f 40/86/85 280/171/155 86/170/154 +f 38/90/89 39/89/88 89/174/158 +f 89/174/158 91/173/157 88/57/57 +f 279/91/72 38/90/89 306/175/59 +f 306/175/59 89/174/158 305/176/59 +f 39/89/88 37/92/90 91/173/157 +f 90/54/54 91/173/157 85/55/55 +f 312/187/169 95/178/160 343/179/161 +f 96/184/166 32/180/162 95/178/160 +f 87/169/153 86/170/154 343/179/161 +f 314/273/173 311/181/163 97/183/165 +f 94/182/164 96/184/166 97/183/165 +f 98/185/167 96/184/166 99/186/168 +f 95/178/160 312/187/169 99/186/168 +f 98/197/167 99/189/168 101/191/172 +f 319/274/200 314/192/173 100/194/174 +f 99/189/168 313/195/170 102/190/171 +f 97/193/165 98/197/167 100/194/174 +f 102/190/171 318/196/175 105/199/177 +f 100/194/174 101/191/172 103/201/179 +f 104/200/178 101/191/172 105/199/177 +f 319/274/200 100/194/174 324/202/180 +f 109/206/184 110/203/181 112/205/183 +f 334/210/188 109/206/184 339/207/185 +f 110/203/181 109/206/184 107/209/187 +f 109/206/184 334/210/188 108/208/186 +f 111/216/194 333/212/190 114/214/192 +f 111/216/194 110/203/181 106/215/193 +f 333/212/190 111/216/194 332/217/195 +f 110/203/181 111/216/194 113/204/182 +f 324/202/180 103/201/179 338/213/191 +f 103/201/179 104/200/178 114/214/192 +f 104/200/178 105/199/177 113/204/182 +f 105/199/177 323/198/176 112/205/183 +f 36/74/74 94/182/164 278/75/75 +f 36/74/74 32/180/162 94/182/164 +f 348/275/361 332/217/195 115/218/196 +f 115/218/196 106/215/193 116/219/197 +f 108/208/186 331/211/189 117/221/199 +f 107/209/187 108/208/186 116/219/197 +f 349/280/203 354/222/200 118/224/202 +f 118/227/202 117/221/199 349/225/203 +f 353/281/205 120/226/204 354/222/200 +f 116/219/197 117/221/199 119/228/201 +f 115/218/196 116/219/197 120/229/204 +f 348/275/361 115/218/196 353/230/205 +f 138/276/220 133/231/206 128/233/207 +f 121/167/151 32/180/162 122/83/82 +f 125/168/152 135/234/208 126/84/83 +f 121/167/151 132/236/210 125/168/152 +f 126/84/83 136/235/209 123/85/84 +f 131/239/212 133/237/206 124/78/78 +f 360/77/77 369/238/211 124/78/78 +f 280/171/155 40/86/85 356/240/213 +f 128/233/207 127/241/214 140/243/216 +f 44/232/94 41/244/101 128/233/207 +f 132/282/210 121/245/151 137/247/218 +f 129/246/217 121/245/151 130/249/219 +f 41/244/101 132/250/210 127/241/214 +f 142/257/224 130/249/219 144/253/221 +f 369/238/211 282/254/222 131/239/212 +f 43/97/95 44/96/94 131/239/212 +f 136/235/209 92/94/92 134/64/64 +f 132/236/210 41/103/101 135/234/208 +f 135/234/208 93/165/149 136/235/209 +f 130/249/219 122/248/82 138/252/220 +f 356/240/213 123/85/84 367/256/223 +f 148/267/232 142/257/224 150/258/225 +f 145/265/230 139/242/215 149/260/227 +f 139/242/215 127/241/214 143/259/226 +f 141/261/228 129/246/217 142/257/224 +f 143/277/226 137/247/218 141/261/228 +f 138/276/220 128/233/207 144/262/221 +f 149/260/227 150/263/225 145/265/230 +f 149/268/227 147/266/231 150/258/225 +f 140/243/216 139/242/215 146/264/229 +f 144/262/221 140/243/216 150/263/225 +f 147/266/231 141/261/228 148/267/232 +f 143/277/226 141/261/228 149/268/227 +f 85/55/55 84/177/159 156/164/148 +f 153/102/100 23/56/56 156/164/148 +f 154/95/93 35/61/61 153/102/100 +f 31/73/73 273/71/71 151/98/96 +f 391/99/97 270/18/18 152/100/98 +f 155/93/91 37/92/90 151/98/96 +f 26/17/17 35/61/61 152/100/98 +f 84/177/159 37/92/90 157/166/150 +f 402/36/36 259/24/24 160/34/34 +f 160/34/34 6/13/13 159/32/32 +f 159/32/32 1/12/12 158/29/29 +f 158/29/29 3/27/27 398/30/30 +f 211/110/302 164/3/233 210/1/235 +f 209/4/303 210/1/235 167/5/236 +f 209/4/303 167/5/236 284/6/6 +f 267/9/9 283/8/8 181/10/238 +f 187/23/247 166/13/239 188/11/241 +f 257/70/70 258/16/16 170/14/243 +f 270/18/18 186/17/244 256/19/19 +f 162/25/249 168/22/246 255/20/20 +f 271/63/63 259/24/24 187/23/247 +f 171/28/250 172/26/248 162/25/249 +f 188/11/241 161/12/240 186/17/244 +f 170/14/243 169/15/242 171/28/250 +f 398/30/30 399/29/251 262/31/31 +f 399/29/251 400/32/253 174/33/252 +f 400/32/253 401/34/255 173/35/254 +f 401/34/255 402/36/36 175/37/256 +f 173/35/254 175/37/256 176/38/259 +f 174/33/252 173/35/254 177/39/260 +f 263/269/257 265/41/41 175/37/256 +f 262/31/31 174/33/252 264/42/42 +f 176/38/259 178/40/258 266/43/43 +f 176/38/259 266/43/43 177/39/260 +f 261/7/7 167/5/236 297/44/44 +f 164/3/233 260/45/45 235/46/263 +f 295/150/134 267/9/9 234/47/264 +f 294/49/49 232/48/265 268/50/50 +f 232/48/265 233/51/267 179/52/266 +f 234/47/264 181/10/238 233/51/267 +f 245/55/339 250/54/269 183/56/271 +f 305/176/59 269/59/59 248/57/273 +f 248/57/273 182/58/272 250/54/269 +f 194/67/278 188/11/241 195/61/274 +f 277/82/72 271/63/63 184/62/275 +f 367/256/223 276/66/66 372/64/277 +f 184/62/275 187/23/247 194/67/278 +f 162/25/249 189/69/279 171/28/250 +f 257/70/70 170/14/243 273/71/71 +f 255/20/20 272/72/72 162/25/249 +f 170/14/243 171/28/250 191/73/281 +f 278/75/75 196/74/282 274/76/76 +f 359/78/375 360/77/77 193/79/283 +f 276/66/66 281/81/81 205/65/276 +f 182/58/272 184/62/275 185/60/270 +f 269/59/59 277/82/72 182/58/272 +f 183/56/271 185/60/270 195/61/274 +f 359/78/375 193/79/283 357/83/285 +f 358/85/374 362/84/286 200/86/288 +f 180/53/268 207/88/289 179/52/266 +f 189/69/279 198/90/291 190/68/280 +f 272/72/72 279/91/72 189/69/279 +f 191/73/281 190/68/280 197/92/293 +f 397/166/331 252/94/294 395/93/295 +f 390/100/395 203/97/296 394/95/298 +f 389/98/394 395/93/295 202/80/284 +f 390/100/395 391/99/97 203/97/296 +f 389/98/394 202/80/284 393/101/99 +f 392/102/329 394/95/298 201/103/299 +f 289/105/103 214/104/300 287/106/104 +f 268/50/50 179/52/266 275/107/105 +f 181/10/238 206/108/237 180/53/268 +f 285/109/107 260/45/45 211/110/302 +f 208/87/290 209/4/303 228/111/305 +f 209/4/303 219/113/306 210/1/235 +f 208/87/290 207/88/289 218/114/309 +f 287/106/104 213/117/301 286/115/113 +f 214/104/300 215/118/311 213/117/301 +f 215/118/311 288/119/117 212/116/310 +f 206/108/237 283/8/8 215/120/311 +f 206/108/237 215/120/311 211/110/302 +f 211/110/302 214/121/300 285/109/107 +f 217/124/308 216/123/312 223/125/314 +f 220/278/307 226/128/315 221/126/317 +f 206/108/237 211/110/302 216/129/312 +f 208/87/290 218/114/309 209/4/303 +f 206/108/237 216/129/312 207/88/289 +f 211/110/302 210/1/235 221/131/317 +f 223/139/314 226/134/315 224/132/319 +f 223/125/314 222/135/313 226/128/315 +f 221/126/317 227/127/316 216/123/312 +f 220/137/307 219/136/306 226/134/315 +f 219/136/306 218/138/309 225/133/318 +f 217/279/308 223/139/314 218/138/309 +f 229/141/304 291/140/127 231/142/320 +f 275/107/105 208/87/290 290/143/130 +f 209/4/303 284/6/6 229/144/304 +f 230/148/321 231/142/320 292/145/131 +f 228/147/305 229/141/304 230/148/321 +f 290/149/130 228/147/305 292/145/131 +f 234/47/264 169/15/242 295/150/134 +f 232/48/265 168/22/246 233/51/267 +f 233/51/267 172/26/248 234/47/264 +f 254/21/21 168/22/246 294/49/49 +f 236/151/324 235/46/263 240/152/323 +f 237/153/261 236/151/324 241/154/325 +f 167/5/236 165/2/234 237/153/261 +f 165/2/234 164/3/233 236/151/324 +f 301/155/139 241/154/325 303/156/140 +f 299/160/144 302/159/143 239/157/322 +f 296/270/262 299/160/144 235/46/263 +f 297/44/44 237/153/261 301/155/139 +f 242/162/328 238/158/327 304/161/145 +f 303/156/140 243/163/326 304/161/145 +f 240/152/323 242/162/328 241/154/325 +f 240/152/323 239/157/322 242/162/328 +f 396/164/393 392/102/329 253/165/330 +f 396/164/393 253/165/330 397/166/331 +f 361/168/335 355/167/332 247/169/334 +f 362/84/286 361/168/335 246/170/287 +f 200/86/288 246/170/287 280/171/155 +f 198/90/291 249/174/336 199/89/292 +f 249/174/336 248/57/273 251/173/337 +f 279/91/72 306/175/59 198/90/291 +f 306/175/59 305/176/59 249/174/336 +f 199/89/292 251/173/337 197/92/293 +f 244/177/338 251/173/337 245/55/339 +f 312/187/169 343/179/161 309/178/340 +f 247/169/334 192/180/333 309/178/340 +f 247/169/334 343/179/161 246/170/287 +f 308/182/360 311/181/163 315/183/342 +f 308/182/360 315/183/342 310/184/341 +f 309/178/340 310/184/341 317/186/344 +f 309/178/340 317/186/344 312/187/169 +f 316/197/343 321/191/345 317/189/344 +f 315/193/342 314/192/173 320/194/347 +f 317/189/344 322/190/346 313/195/170 +f 315/193/342 320/194/347 316/197/343 +f 322/190/346 327/199/348 318/196/175 +f 320/194/347 325/201/349 321/191/345 +f 321/191/345 326/200/350 322/190/346 +f 319/274/200 324/202/180 320/194/347 +f 335/206/354 340/205/351 336/203/353 +f 334/210/188 339/207/185 335/206/354 +f 336/203/353 329/209/355 335/206/354 +f 335/206/354 330/208/356 334/210/188 +f 337/216/359 342/214/357 333/212/190 +f 337/216/359 328/215/358 336/203/353 +f 333/212/190 332/217/195 337/216/359 +f 336/203/353 341/204/352 337/216/359 +f 342/214/357 325/201/349 338/213/191 +f 341/204/352 326/200/350 342/214/357 +f 340/205/351 327/199/348 341/204/352 +f 339/207/185 323/198/176 340/205/351 +f 196/74/282 278/75/75 308/182/360 +f 196/74/282 308/182/360 192/180/333 +f 328/215/358 332/217/195 344/218/362 +f 329/209/355 328/215/358 345/219/363 +f 330/208/356 346/221/364 331/211/189 +f 329/209/355 345/219/363 330/208/356 +f 349/280/203 350/224/365 354/222/200 +f 346/221/364 350/227/365 347/220/198 +f 353/281/205 354/222/200 352/226/367 +f 346/221/364 345/219/363 350/227/365 +f 345/219/363 344/218/362 351/228/366 +f 348/275/361 353/230/205 344/218/362 +f 204/232/297 371/231/368 364/233/370 +f 196/74/282 192/180/333 357/83/285 +f 374/235/373 373/234/371 362/84/286 +f 373/234/371 370/236/372 361/168/335 +f 372/64/277 374/235/373 358/85/374 +f 368/239/384 359/78/375 371/237/368 +f 368/239/384 369/238/211 359/78/375 +f 280/171/155 356/240/213 200/86/288 +f 364/233/370 378/243/376 363/241/378 +f 204/232/297 364/233/370 201/244/299 +f 370/282/372 375/247/379 355/245/332 +f 357/248/285 355/245/332 366/249/381 +f 201/244/299 363/241/378 370/250/372 +f 376/252/369 366/249/381 382/253/383 +f 203/97/296 282/254/222 368/239/384 +f 203/97/296 368/239/384 204/96/297 +f 205/65/276 252/94/294 372/64/277 +f 253/165/330 201/103/299 373/234/371 +f 252/94/294 253/165/330 374/235/373 +f 371/255/368 357/248/285 376/252/369 +f 356/240/213 367/256/223 358/85/374 +f 382/253/383 380/257/382 388/258/386 +f 381/259/389 377/242/377 387/260/388 +f 375/251/379 363/241/378 381/259/389 +f 366/249/381 365/246/380 380/257/382 +f 365/246/380 375/247/379 379/261/390 +f 376/276/369 382/262/383 364/233/370 +f 387/260/388 383/265/387 388/263/386 +f 386/267/385 385/266/392 388/258/386 +f 378/243/376 384/264/391 377/242/377 +f 382/262/383 388/263/386 378/243/376 +f 380/257/382 379/261/390 386/267/385 +f 381/277/389 387/268/388 379/261/390 +f 245/55/339 396/164/393 244/177/338 +f 245/55/339 183/56/271 396/164/393 +f 183/56/271 195/61/274 392/102/329 +f 191/73/281 389/98/394 273/71/71 +f 186/17/244 270/18/18 390/100/395 +f 191/73/281 197/92/293 389/98/394 +f 186/17/244 390/100/395 195/61/274 +f 244/177/338 397/166/331 197/92/293 +f 166/13/239 259/24/24 401/34/255 +f 161/12/240 166/13/239 400/32/253 +f 163/27/245 161/12/240 399/29/251 +f 256/19/19 163/27/245 398/30/30 diff --git a/assets/Textures/Background.png b/assets/Textures/Background.png new file mode 100755 index 0000000..353a610 Binary files /dev/null and b/assets/Textures/Background.png differ diff --git a/assets/Textures/GUI/HUD/LevelIndicatorBG.png b/assets/Textures/GUI/HUD/LevelIndicatorBG.png new file mode 100644 index 0000000..46cc1b3 Binary files /dev/null and b/assets/Textures/GUI/HUD/LevelIndicatorBG.png differ diff --git a/assets/Textures/GUI/HUD/ScoreIndicatorBG.png b/assets/Textures/GUI/HUD/ScoreIndicatorBG.png new file mode 100644 index 0000000..db97909 Binary files /dev/null and b/assets/Textures/GUI/HUD/ScoreIndicatorBG.png differ diff --git a/assets/Textures/GUI/Menu/Background.png b/assets/Textures/GUI/Menu/Background.png new file mode 100644 index 0000000..8b598c3 Binary files /dev/null and b/assets/Textures/GUI/Menu/Background.png differ diff --git a/assets/Textures/GUI/Menu/Left.png b/assets/Textures/GUI/Menu/Left.png new file mode 100644 index 0000000..e7813de Binary files /dev/null and b/assets/Textures/GUI/Menu/Left.png differ diff --git a/assets/Textures/GUI/Menu/MainOptions.png b/assets/Textures/GUI/Menu/MainOptions.png new file mode 100644 index 0000000..a38c916 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainOptions.png differ diff --git a/assets/Textures/GUI/Menu/MainOptionsClick.png b/assets/Textures/GUI/Menu/MainOptionsClick.png new file mode 100644 index 0000000..5a69342 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainOptionsClick.png differ diff --git a/assets/Textures/GUI/Menu/MainOptionsHover.png b/assets/Textures/GUI/Menu/MainOptionsHover.png new file mode 100644 index 0000000..c6e9c02 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainOptionsHover.png differ diff --git a/assets/Textures/GUI/Menu/MainSquidout.png b/assets/Textures/GUI/Menu/MainSquidout.png new file mode 100644 index 0000000..85d8748 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainSquidout.png differ diff --git a/assets/Textures/GUI/Menu/MainSquidoutClick.png b/assets/Textures/GUI/Menu/MainSquidoutClick.png new file mode 100644 index 0000000..f2206a3 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainSquidoutClick.png differ diff --git a/assets/Textures/GUI/Menu/MainSquidoutHover.png b/assets/Textures/GUI/Menu/MainSquidoutHover.png new file mode 100644 index 0000000..8fe33fe Binary files /dev/null and b/assets/Textures/GUI/Menu/MainSquidoutHover.png differ diff --git a/assets/Textures/GUI/Menu/MainTimeAttack.png b/assets/Textures/GUI/Menu/MainTimeAttack.png new file mode 100644 index 0000000..42ff9f3 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainTimeAttack.png differ diff --git a/assets/Textures/GUI/Menu/MainTimeAttackClick.png b/assets/Textures/GUI/Menu/MainTimeAttackClick.png new file mode 100644 index 0000000..3f37dc8 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainTimeAttackClick.png differ diff --git a/assets/Textures/GUI/Menu/MainTimeAttackHover.png b/assets/Textures/GUI/Menu/MainTimeAttackHover.png new file mode 100644 index 0000000..33cfc2d Binary files /dev/null and b/assets/Textures/GUI/Menu/MainTimeAttackHover.png differ diff --git a/assets/Textures/GUI/Menu/MainTitle.png b/assets/Textures/GUI/Menu/MainTitle.png new file mode 100644 index 0000000..9f2d607 Binary files /dev/null and b/assets/Textures/GUI/Menu/MainTitle.png differ diff --git a/assets/Textures/GUI/Menu/OptionsBGMTitle.png b/assets/Textures/GUI/Menu/OptionsBGMTitle.png new file mode 100644 index 0000000..5e35cbb Binary files /dev/null and b/assets/Textures/GUI/Menu/OptionsBGMTitle.png differ diff --git a/assets/Textures/GUI/Menu/OptionsSFXTitle.png b/assets/Textures/GUI/Menu/OptionsSFXTitle.png new file mode 100644 index 0000000..2c7b9b9 Binary files /dev/null and b/assets/Textures/GUI/Menu/OptionsSFXTitle.png differ diff --git a/assets/Textures/GUI/Menu/OptionsTitle.png b/assets/Textures/GUI/Menu/OptionsTitle.png new file mode 100644 index 0000000..08aa3f5 Binary files /dev/null and b/assets/Textures/GUI/Menu/OptionsTitle.png differ diff --git a/assets/Textures/GUI/Menu/SliderBackground.png b/assets/Textures/GUI/Menu/SliderBackground.png new file mode 100644 index 0000000..427e2e3 Binary files /dev/null and b/assets/Textures/GUI/Menu/SliderBackground.png differ diff --git a/assets/Textures/GUI/Menu/SliderHandle.png b/assets/Textures/GUI/Menu/SliderHandle.png new file mode 100644 index 0000000..49004d4 Binary files /dev/null and b/assets/Textures/GUI/Menu/SliderHandle.png differ diff --git a/assets/Textures/GUI/Numbers/N0.png b/assets/Textures/GUI/Numbers/N0.png new file mode 100644 index 0000000..82a7e0f Binary files /dev/null and b/assets/Textures/GUI/Numbers/N0.png differ diff --git a/assets/Textures/GUI/Numbers/N1.png b/assets/Textures/GUI/Numbers/N1.png new file mode 100644 index 0000000..b8c3606 Binary files /dev/null and b/assets/Textures/GUI/Numbers/N1.png differ diff --git a/assets/Textures/GUI/Numbers/N2.png b/assets/Textures/GUI/Numbers/N2.png new file mode 100644 index 0000000..6dfe614 Binary files /dev/null and b/assets/Textures/GUI/Numbers/N2.png differ diff --git a/assets/Textures/GUI/Numbers/N3.png b/assets/Textures/GUI/Numbers/N3.png new file mode 100644 index 0000000..102112a Binary files /dev/null and b/assets/Textures/GUI/Numbers/N3.png differ diff --git a/assets/Textures/GUI/Numbers/N4.png b/assets/Textures/GUI/Numbers/N4.png new file mode 100644 index 0000000..c162544 Binary files /dev/null and b/assets/Textures/GUI/Numbers/N4.png differ diff --git a/assets/Textures/GUI/Numbers/N5.png b/assets/Textures/GUI/Numbers/N5.png new file mode 100644 index 0000000..f4e3fb8 Binary files /dev/null and b/assets/Textures/GUI/Numbers/N5.png differ diff --git a/assets/Textures/GUI/Numbers/N6.png b/assets/Textures/GUI/Numbers/N6.png new file mode 100644 index 0000000..67c9b0d Binary files /dev/null and b/assets/Textures/GUI/Numbers/N6.png differ diff --git a/assets/Textures/GUI/Numbers/N7.png b/assets/Textures/GUI/Numbers/N7.png new file mode 100644 index 0000000..1b348e3 Binary files /dev/null and b/assets/Textures/GUI/Numbers/N7.png differ diff --git a/assets/Textures/GUI/Numbers/N8.png b/assets/Textures/GUI/Numbers/N8.png new file mode 100644 index 0000000..a7ec67a Binary files /dev/null and b/assets/Textures/GUI/Numbers/N8.png differ diff --git a/assets/Textures/GUI/Numbers/N9.png b/assets/Textures/GUI/Numbers/N9.png new file mode 100644 index 0000000..5d2b67a Binary files /dev/null and b/assets/Textures/GUI/Numbers/N9.png differ diff --git a/assets/Textures/Test/Water.png b/assets/Textures/Test/Water.png new file mode 100755 index 0000000..2db8727 Binary files /dev/null and b/assets/Textures/Test/Water.png differ diff --git a/assets/Textures/Test/Water.psd b/assets/Textures/Test/Water.psd new file mode 100755 index 0000000..583db77 Binary files /dev/null and b/assets/Textures/Test/Water.psd differ diff --git a/include/Core/Engine.h b/include/Core/Engine.h index a45467f..f7842ed 100644 --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -49,47 +49,60 @@ #include "Physics/PhysicsSystem.h" #include "Physics/CPhysics.h" -#include "Physics/CBoxShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/ESetImpulse.h" +#include "Physics/CWaterVolume.h" +#include "Game/EGameStart.h" +#include "Sound/EPlaySound.h" + +#include "GUI/Frame.h" +#include "GUI/Button.h" +#include "Game/MainMenu.h" +#include "Game/HUD.h" namespace dd { class Engine { + public: Engine(int argc, char* argv[]) { - m_EventBroker = std::make_shared(); + m_EventBroker = std::make_shared(); - m_Renderer = std::make_shared(); - m_Renderer->SetFullscreen(false); - //m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); - m_Renderer->SetResolution(Rectangle(0, 0, 675, 1080)); + m_Renderer = std::make_shared(); + m_Renderer->SetFullscreen(false); + //m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); + m_Renderer->SetResolution(Rectangle(0, 0, 675, 1080)); m_Renderer->Initialize(); - m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); + m_FrameStack = new GUI::Frame(m_EventBroker.get()); + m_FrameStack->Width = 675; + m_FrameStack->Height = 1080; + auto menu = new GUI::MainMenu(m_FrameStack, "MainMenu"); + + m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); m_World = std::make_shared(m_EventBroker); - - - //TODO: Move this out of engine.h - m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); + //TODO: Move this out of engine.h + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register( + [this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register([this]() { return new Systems::SoundSystem(m_World.get(), m_EventBroker); }); + m_World->SystemFactory.Register( + [this]() { return new Systems::SoundSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); - m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); @@ -98,116 +111,211 @@ public: m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); - m_World->SystemFactory.Register( - [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); - m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); - m_World->SystemFactory.Register([this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); + m_World->SystemFactory.Register( + [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); - m_World->SystemFactory.Register([this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); + m_World->SystemFactory.Register( + [this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); - m_World->SystemFactory.Register([this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); + m_World->SystemFactory.Register( + [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); m_World->AddSystem(); - m_World->ComponentFactory.Register(); - m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); m_World->ComponentFactory.Register(); - m_World->Initialize(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); - //TODO: Remove tobias light-test code. - /*{ - }*/ - //OctoBall - { - auto ent = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(ent); - transform->Position = glm::vec3(-0.f, 0.26f, -10.f); + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(-0.f, 0.26f, -9.f); transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); - - auto model = m_World->AddComponent(ent); + auto model = m_World->AddComponent(ent); model->ModelFile = "Models/Test/Ball/Ballopus.obj"; - - std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr circleShape = m_World->AddComponent(ent); std::shared_ptr ball = m_World->AddComponent(ent); ball->Speed = 5.f; - std::shared_ptr physics = m_World->AddComponent(ent); - physics->Static = false; + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; auto plight = m_World->AddComponent(ent); plight->Radius = 2.f; - m_World->CommitEntity(ent); - - - } + m_World->CommitEntity(ent); + } //PointLightTest { auto t_Light = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_Light); - transform->Position = glm::vec3(2.f, 1.5f, -9.f); + transform->Position = glm::vec3(-3.f, 6.f, -5.f); auto pl = m_World->AddComponent(t_Light); - pl->Radius = 8.f; + pl->Radius = 20.f; + pl->Diffuse = glm::vec3(0.8f, 0.7f, 0.05f); + auto model = m_World->AddComponent(t_Light); + model->ModelFile = "Core/UnitSphere.obj"; + m_World->CommitEntity(t_Light); + } + { + auto t_Light = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_Light); + transform->Position = glm::vec3(3.f, -5.f, -5.f); + auto pl = m_World->AddComponent(t_Light); + pl->Radius = 15.f; + pl->Diffuse = glm::vec3(0.1f, 0.5f, 0.8f); + auto model = m_World->AddComponent(t_Light); + model->ModelFile = "Core/UnitSphere.obj"; + m_World->CommitEntity(t_Light); } //Halfpipe background test model. { auto t_halfPipe = m_World->CreateEntity(); auto transform = m_World->AddComponent(t_halfPipe); - transform->Position = glm::vec3(0.f, 0.f, -13.f); - transform->Scale = glm::vec3(5.f); + transform->Position = glm::vec3(0.f, 0.f, -15.f); + transform->Scale = glm::vec3(6.f, 6.f, 10.f); auto model = m_World->AddComponent(t_halfPipe); model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; + model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); + m_World->CommitEntity(t_halfPipe); } + //Background + { + auto background = m_World->CreateEntity(); + auto transform = m_World->AddComponent(background); + transform->Position = glm::vec3(0.f, 0.f, -30.f); + transform->Scale = glm::vec3(2681.f / 50.f, 1080.f / 50.f, 1.f); + auto sprite = m_World->AddComponent(background); + sprite->SpriteFile = "Textures/Background.png"; + m_World->CommitEntity(background); + } + + //Water test + { + auto t_waterBody = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_waterBody); + transform->Position = glm::vec3(0.f, -5.5f, -10.f); + transform->Scale = glm::vec3(7.f, 1.5f, 1.f); + auto water = m_World->AddComponent(t_waterBody); + auto body = m_World->AddComponent(t_waterBody); + m_World->CommitEntity(t_waterBody); + } + //TODO: Why does the ball not collide with these bricks? + //BottomBox + { + auto topWall = m_World->CreateEntity(); + auto transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(0.f, -6.f, -9.9f); + transform->Scale = glm::vec3(10.f, 0.5f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr boxShape = m_World->AddComponent( + topWall); + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + m_World->CommitEntity(topWall); + } + //SideBox +// { +// auto topWall = m_World->CreateEntity(); +// std::shared_ptr transform = m_World->AddComponent(topWall); +// transform->Position = glm::vec3(3.f, -3.0f, -9.9f); +// transform->Scale = glm::vec3(0.5f, 3.f, 1.f); +// std::shared_ptr sprite = m_World->AddComponent(topWall); +// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; +// std::shared_ptr boxShape = m_World->AddComponent( +// topWall); +// std::shared_ptr physics = m_World->AddComponent(topWall); +// physics->Static = true; +// m_World->CommitEntity(topWall); +// } +// //OtherSideBox +// { +// auto topWall = m_World->CreateEntity(); +// std::shared_ptr transform = m_World->AddComponent(topWall); +// transform->Position = glm::vec3(-4.f, -3.0f, -9.9f); +// transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); +// std::shared_ptr sprite = m_World->AddComponent(topWall); +// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; +// std::shared_ptr boxShape = m_World->AddComponent( +// topWall); +// std::shared_ptr physics = m_World->AddComponent(topWall); +// physics->Static = true; +// m_World->CommitEntity(topWall); +// } + { auto topWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(topWall); + std::shared_ptr transform = m_World->AddComponent( + topWall); transform->Position = glm::vec3(0.f, 6.f, -10.f); transform->Scale = glm::vec3(20.f, 0.5f, 1.f); std::shared_ptr sprite = m_World->AddComponent(topWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent(topWall); + std::shared_ptr boxShape = m_World->AddComponent( + topWall); std::shared_ptr physics = m_World->AddComponent(topWall); physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; m_World->CommitEntity(topWall); } + { auto leftWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(leftWall); + std::shared_ptr transform = m_World->AddComponent( + leftWall); transform->Position = glm::vec3(-4.f, 1.f, -10.f); transform->Scale = glm::vec3(0.5f, 20.f, 1.f); std::shared_ptr sprite = m_World->AddComponent(leftWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent(leftWall); + std::shared_ptr boxShape = m_World->AddComponent( + leftWall); std::shared_ptr physics = m_World->AddComponent(leftWall); physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; m_World->CommitEntity(leftWall); } + { auto rightWall = m_World->CreateEntity(); - std::shared_ptr transform = m_World->AddComponent(rightWall); + std::shared_ptr transform = m_World->AddComponent( + rightWall); transform->Position = glm::vec3(4.f, 1.f, -10.f); transform->Scale = glm::vec3(0.5f, 20.f, 1.f); std::shared_ptr sprite = m_World->AddComponent(rightWall); sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; - std::shared_ptr boxShape = m_World->AddComponent(rightWall); + std::shared_ptr boxShape = m_World->AddComponent( + rightWall); std::shared_ptr physics = m_World->AddComponent(rightWall); physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; m_World->CommitEntity(rightWall); } @@ -216,18 +324,27 @@ public: auto ent = m_World->CreateEntity(); m_World->SetProperty(ent, "Name", "Pad"); auto ctransform = m_World->AddComponent(ent); - ctransform->Position = glm::vec3(0.f, -5.f, -10.f); + ctransform->Position = glm::vec3(0.f, -3.5f, -10.f); ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); auto rectangle = m_World->AddComponent(ent); auto physics = m_World->AddComponent(ent); physics->Static = false; + physics->Category = CollisionLayer::Type::Pad; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; + physics->Calculate = true; auto cModel = m_World->AddComponent(ent); - cModel->ModelFile = "Models/Submarine.obj"; + cModel->ModelFile = "Models/Submarine2.obj"; + auto pad = m_World->AddComponent(ent); m_World->CommitEntity(ent); } - m_LastTime = glfwGetTime(); + + //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); + m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EGameStart); + + m_LastTime = glfwGetTime(); } bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } @@ -238,39 +355,32 @@ public: double dt = currentTime - m_LastTime; m_LastTime = currentTime; - ResourceManager::Update(); - // Update input m_InputManager->Update(dt); + // Swap event queues to get fresh input data in the read queue + //m_EventBroker->Swap(); - m_World->Update(dt); - - -// -// if (glfwGetKey(m_Renderer->Window(), GLFW_KEY_R)) { -// ResourceManager::Reload("Shaders/Deferred/3/Fragment.glsl"); -// } -// - //TODO Fill up the renderQueue with models (Temp fix) -// TEMPAddToRenderQueue(); - - // Render scene - //TODO send renderqueue to draw. -// m_Renderer->Draw(m_RendererQueue); - - if (glfwGetKey(m_Renderer->Window(), GLFW_KEY_R)) { - ResourceManager::Reload("Shaders/Deferred/3/Fragment.glsl"); + ResourceManager::Update(); + if (m_GameIsRunning) { + m_World->Update(dt); } + m_EventBroker->Process(); + m_FrameStack->UpdateLayered(dt); + m_RendererQueue.Clear(); + m_FrameStack->DrawLayered(m_RendererQueue); //TODO Fill up the renderQueue with models (Temp fix) - TEMPAddToRenderQueue(); + if (m_GameIsRunning) { + TEMPAddToRenderQueue(); + } // Render scene //TODO send renderqueue to draw. m_Renderer->Draw(m_RendererQueue); + m_EventBroker->Process(); // Swap event queues - m_EventBroker->Clear(); + m_EventBroker->Swap(); glfwPollEvents(); } @@ -281,12 +391,9 @@ public: //TODO: Get this out of engine.h void TEMPAddToRenderQueue() { - if (!m_TransformSystem) m_TransformSystem = m_World->GetSystem(); - m_RendererQueue.Clear(); - for (auto &pair : *m_World->GetEntities()) { EntityID entity = pair.first; @@ -315,8 +422,6 @@ public: } } - //TODO: Add LightLoadShit - auto pointLightComponent = m_World->GetComponent(entity); if (pointLightComponent) { @@ -327,6 +432,19 @@ public: pointLightComponent->Radius); } + auto parent = m_World->GetEntityParent(entity); + if(parent != 0) { + auto waterParticleComponent = m_World->GetComponent(parent); + if (waterParticleComponent) { + //TODO: Remove hardcoded color. + //TODO: Do i even need modelMatrix? + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) + * glm::scale(absoluteTransform.Scale); + EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix, absoluteTransform.Position.z); + } + } + auto spriteComponent = m_World->GetComponent(entity); if (spriteComponent) @@ -355,7 +473,6 @@ public: } } - m_RendererQueue.Sort(); } //TODO: Get this out of engine.h @@ -374,7 +491,6 @@ public: job.EndIndex = texGroup.EndIndex; job.ModelMatrix = modelMatrix; job.Color = color; - job.fileName = fileName; m_RendererQueue.Deferred.Add(job); } @@ -408,15 +524,46 @@ public: } + void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix, float depth) + { + WaterParticleJob job; + job.Position = position; + job.Color = color; + job.ModelMatrix = modelMatrix; + job.Depth = depth; + + m_RendererQueue.Forward.Add(job); + } + private: - std::shared_ptr m_ResourceManager; std::shared_ptr m_EventBroker; + GUI::Frame* m_FrameStack = nullptr; std::shared_ptr m_Renderer; RenderQueueCollection m_RendererQueue; std::shared_ptr m_InputManager; std::shared_ptr m_World; - + //TODO: Redo + bool m_GameIsRunning = false; + dd::EventRelay m_EGameStart; + bool OnGameStart(const dd::Events::GameStart &event) + { + m_GameIsRunning = true; + //Todo: Move this + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.IsAmbient = true; + m_EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/water-flowing.wav"; + e.Gain = 0.3f; + e.IsAmbient = true; + m_EventBroker->Publish(e); + } + }; double m_LastTime; }; diff --git a/include/Core/Engine.h.orig b/include/Core/Engine.h.orig new file mode 100644 index 0000000..f19102e --- /dev/null +++ b/include/Core/Engine.h.orig @@ -0,0 +1,562 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#include +#include +#include + +#include "ResourceManager.h" +#include "OBJ.h" +#include "Model.h" +#include "Texture.h" +#include "EventBroker.h" +#include "RenderQueue.h" +#include "Renderer.h" +#include "InputManager.h" +//TODO: Remove includes that are only here for the temporary draw solution. +#include "World.h" +#include "CTransform.h" +#include "Core/EventBroker.h" +#include "Rendering/CModel.h" +#include "Rendering/CSprite.h" +#include "CTemplate.h" +#include "Rendering/CPointLight.h" +#include "Transform/TransformSystem.h" +#include "Sound/SoundSystem.h" +#include "Sound/CCollisionSound.h" +#include "Game/LevelSystem.h" +#include "Game/PadSystem.h" +#include "Game/CBall.h" +#include "Game/CPad.h" +#include "Game/CBrick.h" +#include "Game/BallSystem.h" +#include "Game/Bricks/CPowerUpBrick.h" + +#include "Physics/PhysicsSystem.h" +#include "Physics/CPhysics.h" +#include "Physics/CRectangleShape.h" +#include "Physics/ESetImpulse.h" +#include "Physics/CWaterVolume.h" + +#include "Game/EGameStart.h" +#include "Sound/EPlaySound.h" + +#include "GUI/Frame.h" +#include "GUI/Button.h" +#include "Game/MainMenu.h" +#include "Game/HUD.h" + +namespace dd +{ + +class Engine +{ + +public: + Engine(int argc, char* argv[]) { + m_EventBroker = std::make_shared(); + + m_Renderer = std::make_shared(); + m_Renderer->SetFullscreen(false); + //m_Renderer->SetResolution(Rectangle(0, 0, 1920, 1080)); + m_Renderer->SetResolution(Rectangle(0, 0, 675, 1080)); + m_Renderer->Initialize(); + + m_FrameStack = new GUI::Frame(m_EventBroker.get()); + m_FrameStack->Width = 675; + m_FrameStack->Height = 1080; + auto hud = new GUI::HUD(m_FrameStack, "HUD"); + auto menu = new GUI::MainMenu(m_FrameStack, "MainMenu"); + + m_InputManager = std::make_shared(m_Renderer->Window(), m_EventBroker); + + m_World = std::make_shared(m_EventBroker); + + //TODO: Move this out of engine.h + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register( + [this]() { return new Systems::TransformSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + + m_World->ComponentFactory.Register(); + m_World->SystemFactory.Register( + [this]() { return new Systems::SoundSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + + m_World->ComponentFactory.Register(); + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + + m_World->SystemFactory.Register( + [this]() { return new Systems::PhysicsSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + + m_World->SystemFactory.Register( + [this]() { return new Systems::LevelSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::PadSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + m_World->SystemFactory.Register( + [this]() { return new Systems::BallSystem(m_World.get(), m_EventBroker); }); + m_World->AddSystem(); + + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->ComponentFactory.Register(); + m_World->Initialize(); + + + //OctoBall + { + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(-0.f, 0.26f, -9.f); + transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); + transform->Velocity = glm::vec3(0.0f, -10.f, 0.f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr ball = m_World->AddComponent(ent); + ball->Speed = 5.f; +<<<<<<< HEAD + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; +======= + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; +>>>>>>> origin/master + + auto plight = m_World->AddComponent(ent); + plight->Radius = 2.f; + + m_World->CommitEntity(ent); + } + + //PointLightTest + { + auto t_Light = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_Light); + transform->Position = glm::vec3(2.f, 1.5f, -9.f); + auto pl = m_World->AddComponent(t_Light); + pl->Radius = 8.f; + m_World->CommitEntity(t_Light); + } + + //Halfpipe background test model. + { + auto t_halfPipe = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_halfPipe); + transform->Position = glm::vec3(0.f, 0.f, -15.f); + transform->Scale = glm::vec3(15.f); + auto model = m_World->AddComponent(t_halfPipe); + model->ModelFile = "Models/Test/halfpipe/Halfpipe.obj"; + model->Color = glm::vec4(1.f, 1.f, 1.f, 0.3f); + m_World->CommitEntity(t_halfPipe); + } + + //Background + { + auto background = m_World->CreateEntity(); + auto transform = m_World->AddComponent(background); + transform->Position = glm::vec3(0.f, 0.f, -30.f); + transform->Scale = glm::vec3(2681.f / 50.f, 1080.f / 50.f, 1.f); + auto sprite = m_World->AddComponent(background); + sprite->SpriteFile = "Textures/Background.png"; + m_World->CommitEntity(background); + } + + //Water test + { + auto t_waterBody = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_waterBody); + transform->Position = glm::vec3(0.f, -4.5f, -10.f); + transform->Scale = glm::vec3(7.f, 1.5f, 1.f); + auto water = m_World->AddComponent(t_waterBody); + auto body = m_World->AddComponent(t_waterBody); + m_World->CommitEntity(t_waterBody); + } + //TODO: Why does the ball not collide with these bricks? + //BottomBox + { + auto topWall = m_World->CreateEntity(); + auto transform = m_World->AddComponent(topWall); + transform->Position = glm::vec3(0.f, -6.f, -9.9f); + transform->Scale = glm::vec3(10.f, 0.5f, 1.f); + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + std::shared_ptr boxShape = m_World->AddComponent( + topWall); + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + m_World->CommitEntity(topWall); + } + //SideBox +// { +// auto topWall = m_World->CreateEntity(); +// std::shared_ptr transform = m_World->AddComponent(topWall); +// transform->Position = glm::vec3(3.f, -3.0f, -9.9f); +// transform->Scale = glm::vec3(0.5f, 3.f, 1.f); +// std::shared_ptr sprite = m_World->AddComponent(topWall); +// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; +// std::shared_ptr boxShape = m_World->AddComponent( +// topWall); +// std::shared_ptr physics = m_World->AddComponent(topWall); +// physics->Static = true; +// m_World->CommitEntity(topWall); +// } +// //OtherSideBox +// { +// auto topWall = m_World->CreateEntity(); +// std::shared_ptr transform = m_World->AddComponent(topWall); +// transform->Position = glm::vec3(-4.f, -3.0f, -9.9f); +// transform->Scale = glm::vec3(0.5f, 3.0f, 1.f); +// std::shared_ptr sprite = m_World->AddComponent(topWall); +// sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; +// std::shared_ptr boxShape = m_World->AddComponent( +// topWall); +// std::shared_ptr physics = m_World->AddComponent(topWall); +// physics->Static = true; +// m_World->CommitEntity(topWall); +// } + + { + auto topWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent( + topWall); + transform->Position = glm::vec3(0.f, 6.f, -10.f); + transform->Scale = glm::vec3(20.f, 0.5f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(topWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent( + topWall); + + std::shared_ptr physics = m_World->AddComponent(topWall); + physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; + + m_World->CommitEntity(topWall); + } + + { + auto leftWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent( + leftWall); + transform->Position = glm::vec3(-4.f, 1.f, -10.f); + transform->Scale = glm::vec3(0.5f, 20.f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(leftWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent( + leftWall); + + std::shared_ptr physics = m_World->AddComponent(leftWall); + physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; + + m_World->CommitEntity(leftWall); + } + + { + auto rightWall = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent( + rightWall); + transform->Position = glm::vec3(4.f, 1.f, -10.f); + transform->Scale = glm::vec3(0.5f, 20.f, 1.f); + + std::shared_ptr sprite = m_World->AddComponent(rightWall); + sprite->SpriteFile = "Textures/Core/ErrorTexture.png"; + + std::shared_ptr boxShape = m_World->AddComponent( + rightWall); + + std::shared_ptr physics = m_World->AddComponent(rightWall); + physics->Static = true; + physics->Category = CollisionLayer::Type::Wall; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::Brick; + + m_World->CommitEntity(rightWall); + } + + { + auto ent = m_World->CreateEntity(); + m_World->SetProperty(ent, "Name", "Pad"); + auto ctransform = m_World->AddComponent(ent); + ctransform->Position = glm::vec3(0.f, -5.f, -10.f); + ctransform->Scale = glm::vec3(1.0f, 1.0f, 1.f); + auto rectangle = m_World->AddComponent(ent); + auto physics = m_World->AddComponent(ent); + physics->Static = false; + physics->Category = CollisionLayer::Type::Pad; + physics->Mask = CollisionLayer::Type::Ball | CollisionLayer::Type::PowerUp; + physics->Calculate = true; + auto cModel = m_World->AddComponent(ent); + cModel->ModelFile = "Models/Submarine2.obj"; + + auto pad = m_World->AddComponent(ent); + m_World->CommitEntity(ent); + } + + + //EVENT_SUBSCRIBE_MEMBER(m_EGameStart, &Engine::OnGameStart); + m_EGameStart = decltype(m_EGameStart)(std::bind(&Engine::OnGameStart, this, std::placeholders::_1)); + m_EventBroker->Subscribe(m_EGameStart); + + m_LastTime = glfwGetTime(); + } + + bool Running() const { return !glfwWindowShouldClose(m_Renderer->Window()); } + + void Tick() + { + double currentTime = glfwGetTime(); + double dt = currentTime - m_LastTime; + m_LastTime = currentTime; + + // Update input + m_InputManager->Update(dt); + // Swap event queues to get fresh input data in the read queue + //m_EventBroker->Swap(); + + ResourceManager::Update(); + if (m_GameIsRunning) { + m_World->Update(dt); + } + m_EventBroker->Process(); + m_FrameStack->UpdateLayered(dt); + + m_RendererQueue.Clear(); + m_FrameStack->DrawLayered(m_RendererQueue); + //TODO Fill up the renderQueue with models (Temp fix) + if (m_GameIsRunning) { + TEMPAddToRenderQueue(); + } + + // Render scene + //TODO send renderqueue to draw. + m_Renderer->Draw(m_RendererQueue); + + m_EventBroker->Process(); + // Swap event queues + m_EventBroker->Swap(); + + glfwPollEvents(); + } + + std::shared_ptr m_TransformSystem; + std::shared_ptr m_LevelSystem; + + //TODO: Get this out of engine.h + void TEMPAddToRenderQueue() + { + if (!m_TransformSystem) + m_TransformSystem = m_World->GetSystem(); + + for (auto &pair : *m_World->GetEntities()) + { + EntityID entity = pair.first; + + auto templateComponent = m_World->GetComponent(entity); + if (templateComponent) + continue; + + auto transform = m_World->GetComponent(entity); + if (!transform) + continue; + + auto modelComponent = m_World->GetComponent(entity); + if (modelComponent) + { + Model* modelAsset = nullptr; + modelAsset = ResourceManager::Load(modelComponent->ModelFile); + + if (modelAsset) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::mat4 modelMatrix = glm::translate(glm::mat4(), absoluteTransform.Position) + * glm::toMat4(absoluteTransform.Orientation) + * glm::scale(absoluteTransform.Scale); + EnqueueModel(modelAsset, modelMatrix, modelComponent->Transparent, modelComponent->Color, modelComponent->ModelFile); + } + } + + auto pointLightComponent = m_World->GetComponent(entity); + if (pointLightComponent) + { + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + EnqueuePointLight(absoluteTransform.Position, + pointLightComponent->Diffuse, + pointLightComponent->Specular, + pointLightComponent->Radius); + } + + auto parent = m_World->GetEntityParent(entity); + if(parent != 0) { + auto waterParticleComponent = m_World->GetComponent(parent); + if (waterParticleComponent) { + //TODO: Remove hardcoded color. + //TODO: Do i even need modelMatrix? + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) + * glm::scale(absoluteTransform.Scale); + EnqueueWaterParticles(absoluteTransform.Position, glm::vec4(1.f, 1.f, 1.f, 1.f), modelMatrix, absoluteTransform.Position.z); + } + } + + + auto spriteComponent = m_World->GetComponent(entity); + if (spriteComponent) + { + + std::string normal = spriteComponent->NormalTexture; + std::string spec = spriteComponent->SpecularTexture; + + if (normal.empty()) { + normal = "Textures/Core/NeutralNormalMap.png"; + } + if (spec.empty()) { + spec = "Textures/Core/NeutralSpecularMap.png"; + } + auto texturediff = ResourceManager::Load(spriteComponent->SpriteFile); + auto texturenorm = ResourceManager::Load(normal); + auto texturespec = ResourceManager::Load(spec); + + + Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(entity); + glm::quat orientation2D = glm::angleAxis(glm::eulerAngles(absoluteTransform.Orientation).z, glm::vec3(0, 0, -1)); + glm::mat4 modelMatrix = glm::translate(absoluteTransform.Position) + * glm::toMat4(orientation2D) + * glm::scale(absoluteTransform.Scale); + EnqueueSprite(texturediff, texturenorm, texturespec, modelMatrix, spriteComponent->Color, absoluteTransform.Position.z); + } + } + + } + + //TODO: Get this out of engine.h + void EnqueueModel(Model* model, glm::mat4 modelMatrix, float transparent, glm::vec4 color, std::string fileName) + { + for (auto texGroup : model->TextureGroups) + { + ModelJob job; + job.TextureID = (texGroup.Texture) ? texGroup.Texture->ResourceID : 0; + job.DiffuseTexture = (texGroup.Texture) ? *texGroup.Texture : 0; + job.NormalTexture = (texGroup.NormalMap) ? *texGroup.NormalMap : 0; + job.SpecularTexture = (texGroup.SpecularMap) ? *texGroup.SpecularMap : 0; + job.VAO = model->VAO; + job.ElementBuffer = model->ElementBuffer; + job.StartIndex = texGroup.StartIndex; + job.EndIndex = texGroup.EndIndex; + job.ModelMatrix = modelMatrix; + job.Color = color; + + m_RendererQueue.Deferred.Add(job); + } + } + + // TODO: Get this out of engine.h + void EnqueueSprite(Texture* texture, Texture* normalTexture, Texture* specularTexture, glm::mat4 modelMatrix, glm::vec4 color, float depth) + { + SpriteJob job; + job.TextureID = texture->ResourceID; + job.DiffuseTexture = *texture; + job.NormalTexture = *normalTexture; + job.SpecularTexture = *specularTexture; + job.ModelMatrix = modelMatrix; + job.Color = color; + job.Depth = depth; + + + m_RendererQueue.Forward.Add(job); + } + + void EnqueuePointLight(glm::vec3 position, glm::vec3 diffuseColor, glm::vec3 specularColor, float radius) + { + PointLightJob job; + job.Position = position; + job.DiffuseColor = diffuseColor; + job.SpecularColor = specularColor; + job.Radius = radius; + + m_RendererQueue.Lights.Add(job); + + } + + void EnqueueWaterParticles(glm::vec3 position, glm::vec4 color, glm::mat4 modelMatrix, float depth) + { + WaterParticleJob job; + job.Position = position; + job.Color = color; + job.ModelMatrix = modelMatrix; + job.Depth = depth; + + m_RendererQueue.Forward.Add(job); + } + +private: + std::shared_ptr m_EventBroker; + GUI::Frame* m_FrameStack = nullptr; + std::shared_ptr m_Renderer; + RenderQueueCollection m_RendererQueue; + std::shared_ptr m_InputManager; + std::shared_ptr m_World; + + //TODO: Redo + bool m_GameIsRunning = false; + dd::EventRelay m_EGameStart; + bool OnGameStart(const dd::Events::GameStart &event) + { + m_GameIsRunning = true; + //Todo: Move this + { + dd::Events::PlaySound e; + e.path = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.isAmbient = true; + m_EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.path = "Sounds/BGM/water-flowing.wav"; + e.volume = 0.3f; + e.isAmbient = true; + m_EventBroker->Publish(e); + } + }; + double m_LastTime; +}; + +} diff --git a/include/Core/EventBroker.h b/include/Core/EventBroker.h index f19309c..cb5e39c 100644 --- a/include/Core/EventBroker.h +++ b/include/Core/EventBroker.h @@ -119,7 +119,7 @@ public: template int Process(); int Process(std::string contextTypeName); - void Clear(); + void Swap(); void Unsubscribe(BaseEventRelay &relay); private: diff --git a/include/Core/PNG.h b/include/Core/PNG.h index fc99324..994a5bc 100644 --- a/include/Core/PNG.h +++ b/include/Core/PNG.h @@ -33,9 +33,6 @@ class PNG : public Image public: PNG(std::string path); ~PNG(); - -private: - }; } diff --git a/include/Core/RenderQueue.h b/include/Core/RenderQueue.h index 9984770..0319267 100755 --- a/include/Core/RenderQueue.h +++ b/include/Core/RenderQueue.h @@ -22,8 +22,9 @@ #include #include -#include "Texture.h" -#include "Model.h" +#include "Core/Util/Rectangle.h" +#include "Core/Texture.h" +#include "Core/Model.h" namespace dd { @@ -52,8 +53,8 @@ struct ModelJob : RenderJob unsigned int ShaderID; unsigned int TextureID; - std::string fileName; - + glm::mat4 ProjectionMatrix; + glm::mat4 ViewMatrix; glm::mat4 ModelMatrix; GLuint DiffuseTexture; GLuint NormalTexture; @@ -90,6 +91,8 @@ struct SpriteJob : RenderJob unsigned int ShaderID; unsigned int TextureID; + glm::mat4 ProjectionMatrix; + glm::mat4 ViewMatrix; glm::mat4 ModelMatrix; GLuint DiffuseTexture; GLuint NormalTexture; @@ -115,6 +118,30 @@ struct PointLightJob : RenderJob } }; +struct FrameJob : SpriteJob +{ + Rectangle Scissor; + Rectangle Viewport; + std::string Name; + + void CalculateHash() override + { + Hash = 0; + } +}; + +struct WaterParticleJob : RenderJob +{ + glm::vec3 Position; + glm::vec4 Color; + glm::mat4 ModelMatrix; + + void CalculateHash() override + { + Hash = 0; + } +}; + class RenderQueue { public: @@ -122,7 +149,8 @@ public: void Add(T &job) { job.CalculateHash(); - Jobs.push_front(std::shared_ptr(new T(job))); + Jobs.push_back(std::shared_ptr(new T(job))); + m_Size++; } void Sort() @@ -133,19 +161,24 @@ public: void Clear() { Jobs.clear(); + m_Size = 0; } - std::forward_list>::const_iterator begin() + int Size() const { return m_Size; } + std::list>::const_iterator begin() { return Jobs.begin(); } - std::forward_list>::const_iterator end() + std::list>::const_iterator end() { return Jobs.end(); } - std::forward_list> Jobs; + std::list> Jobs; + +private: + int m_Size = 0; }; struct RenderQueueCollection @@ -153,12 +186,14 @@ struct RenderQueueCollection RenderQueue Deferred; RenderQueue Forward; RenderQueue Lights; + RenderQueue GUI; void Clear() { Deferred.Clear(); Forward.Clear(); Lights.Clear(); + GUI.Clear(); } void Sort() @@ -166,6 +201,7 @@ struct RenderQueueCollection Deferred.Sort(); Forward.Sort(); Lights.Sort(); + GUI.Sort(); } }; diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 1b8e078..5a2b03f 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -72,12 +72,15 @@ private: ShaderProgram* m_spDeferred3; ShaderProgram* m_spForward; ShaderProgram* m_spScreen; + ShaderProgram* t_m_spWater; + ShaderProgram* t_m_spWater2; GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; Model* m_UnitQuad = nullptr; Texture* m_StandardNormal; Texture* m_StandardSpecular; + Texture* t_m_WhiteSphereTexture; GLuint m_rbDepthBuffer = 0; GLuint m_fbDeferred1 = 0; @@ -89,11 +92,23 @@ private: GLuint m_tLighting = 0; GLuint m_fbDeferred3 = 0; GLuint m_tFinal = 0; + //Water GTexture + GLuint t_m_Gwater = 0; + //Water blur texture + GLuint t_m_BWater; + GLuint t_m_BWater2; + //WAterpass Framebuffer + GLuint t_m_fbWater; + //Waterpass Framebuffer + GLuint t_m_fbWaterBlur; + GLuint t_m_fbWaterBlur2; + GLuint m_CurrentScreenBuffer = 0; void LoadShaders(); void CreateBuffers(); GLuint CreateQuad(); + GLuint CreateWaterParticleVAO(RenderQueue &particles); static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) { return (i->Depth < j->Depth); } @@ -101,6 +116,8 @@ private: void DrawForward(RenderQueue &objects, RenderQueue &lights); void DrawScene(RenderQueue &objects, ShaderProgram &program); void DrawLightSpheres(RenderQueue &lights); + void DrawWater(RenderQueue &objects); + void DrawGUI(RenderQueue& rq); void DebugKeys(); }; diff --git a/include/Core/Texture.h b/include/Core/Texture.h index 13bd113..f7cfd69 100644 --- a/include/Core/Texture.h +++ b/include/Core/Texture.h @@ -43,6 +43,9 @@ public: operator GLuint() const { return m_Texture; } + unsigned int Width = 0; + unsigned int Height = 0; + private: GLuint m_Texture = 0; }; diff --git a/include/Core/Util/Rectangle.h b/include/Core/Util/Rectangle.h index 6ce0695..c24501f 100644 --- a/include/Core/Util/Rectangle.h +++ b/include/Core/Util/Rectangle.h @@ -44,29 +44,30 @@ struct Rectangle int Height; virtual int Left() const { return X; } - void SetLeft(int left) + virtual void SetLeft(int left) { - Width += X - left; + //Width += X - left; X = left; } virtual int Right() const { return X + Width; } - void SetRight(int right) + virtual void SetRight(int right) { Width = right - X; } virtual int Top() const { return Y; } - void SetTop(int top) + virtual void SetTop(int top) { - Height += Y - top; + //Height += Y - top; Y = top; } virtual int Bottom() const { return Y + Height; } - int SetBottom(int bottom) + virtual void SetBottom(int bottom) { Height = bottom - Y; } - Rectangle& operator+=(const Rectangle &rhs) { + Rectangle& operator+=(const Rectangle &rhs) + { SetLeft(std::min(Left(), rhs.Left())); SetRight(std::max(Right(), rhs.Right())); SetTop(std::min(Top(), rhs.Top())); diff --git a/include/GUI/Button.h b/include/GUI/Button.h new file mode 100644 index 0000000..b2a665d --- /dev/null +++ b/include/GUI/Button.h @@ -0,0 +1,147 @@ +#ifndef GUI_BUTTON_H__ +#define GUI_BUTTON_H__ + +#include "GUI/TextureFrame.h" +#include "GUI/EButtonEnter.h" +#include "GUI/EButtonLeave.h" +#include "GUI/EButtonPress.h" +#include "GUI/EButtonRelease.h" +#include "Core/EMouseMove.h" +#include "Core/EMousePress.h" +#include "Core/EMouseRelease.h" + +namespace dd +{ +namespace GUI +{ + +class Button : public TextureFrame +{ +public: + Button(Frame* parent, std::string name) + : TextureFrame(parent, name) + { + EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &Button::OnMouseMove); + EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &Button::OnMousePress); + EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &Button::OnMouseRelease); + } + + void SetTextureHover(std::string resourceName) + { + m_TextureHover = resourceName; + } + void SetTextureReleased(std::string resourceName) + { + m_TextureReleased = resourceName; + SetTexture(resourceName); + } + void SetTexturePressed(std::string resourceName) + { + m_TexturePressed = resourceName; + } + + void Draw(RenderQueueCollection& rq) override + { + if (m_Texture == nullptr && !m_TextureReleased.empty()) { + SetTexture(m_TextureReleased); + } + + TextureFrame::Draw(rq); + } + + virtual void OnEnter() { } + virtual void OnLeave() { } + virtual void OnPress() { } + virtual void OnRelease() { } + +protected: + bool m_MouseIsOver = false; + bool m_IsDown = false; + + virtual bool OnMouseMove(const Events::MouseMove& event) + { + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); + if (isOver && !m_MouseIsOver) { // Enter + if (!m_IsDown) { + if (!m_TextureHover.empty()) { + SetTexture(m_TextureHover); + } + } + OnEnter(); + Events::ButtonEnter e; + e.FrameName = m_Name; + EventBroker->Publish(e); + } else if (!isOver && m_MouseIsOver) { // Leave + if (!m_IsDown) { + if (!m_TextureReleased.empty()) { + SetTexture(m_TextureReleased); + } + } + OnLeave(); + Events::ButtonLeave e; + e.FrameName = m_Name; + EventBroker->Publish(e); + } + m_MouseIsOver = isOver; + + return true; + } + virtual bool OnMousePress(const Events::MousePress& event) + { + if (!Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1))) { + return false; + } + + if (!m_TexturePressed.empty()) { + SetTexture(m_TexturePressed); + } + + m_IsDown = true; + OnPress(); + Events::ButtonPress e; + e.FrameName = m_Name; + e.Button = this; + EventBroker->Publish(e); + + return true; + } + virtual bool OnMouseRelease(const Events::MouseRelease& event) + { + bool isOver = Rectangle::Intersects(AbsoluteRectangle(), Rectangle(event.X, event.Y, 1, 1)); + if (!isOver && !m_IsDown) { + return false; + } + + if (m_MouseIsOver) { + if (!m_TextureHover.empty()) { + SetTexture(m_TextureHover); + } + } else { + if (!m_TextureReleased.empty()) { + SetTexture(m_TextureReleased); + } + } + + m_IsDown = false; + OnRelease(); + Events::ButtonRelease e; + e.FrameName = m_Name; + e.Button = this; + EventBroker->Publish(e); + + return true; + } + +private: + EventRelay m_EMouseMove; + EventRelay m_EMousePress; + EventRelay m_EMouseRelease; + + std::string m_TextureHover; + std::string m_TexturePressed; + std::string m_TextureReleased; +}; + +} +} +#endif diff --git a/include/GUI/EButtonEnter.h b/include/GUI/EButtonEnter.h new file mode 100644 index 0000000..b2fa352 --- /dev/null +++ b/include/GUI/EButtonEnter.h @@ -0,0 +1,40 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#ifndef Events_ButtonEnter_h__ +#define Events_ButtonEnter_h__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +/** Thrown on GUI button hover. */ +struct ButtonEnter : Event +{ + std::string FrameName; +}; + +} + +} + +#endif // Events_ButtonEnter_h__ \ No newline at end of file diff --git a/include/GUI/EButtonLeave.h b/include/GUI/EButtonLeave.h new file mode 100644 index 0000000..c448190 --- /dev/null +++ b/include/GUI/EButtonLeave.h @@ -0,0 +1,40 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#ifndef Events_ButtonLeave_h__ +#define Events_ButtonLeave_h__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +/** Thrown on GUI button hover. */ +struct ButtonLeave : Event +{ + std::string FrameName; +}; + +} + +} + +#endif // Events_ButtonLeave_h__ \ No newline at end of file diff --git a/include/GUI/EButtonPress.h b/include/GUI/EButtonPress.h new file mode 100644 index 0000000..9e18ece --- /dev/null +++ b/include/GUI/EButtonPress.h @@ -0,0 +1,43 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#ifndef Events_ButtonPress_h__ +#define Events_ButtonPress_h__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace GUI { class Button; } + +namespace Events +{ + +/** Thrown on GUI button press. */ +struct ButtonPress : Event +{ + std::string FrameName; + GUI::Button* Button; +}; + +} + +} + +#endif // Events_ButtonPress_h__ \ No newline at end of file diff --git a/include/GUI/EButtonRelease.h b/include/GUI/EButtonRelease.h new file mode 100644 index 0000000..a596c61 --- /dev/null +++ b/include/GUI/EButtonRelease.h @@ -0,0 +1,43 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#ifndef Events_ButtonRelease_h__ +#define Events_ButtonRelease_h__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace GUI { class Button; } + +namespace Events +{ + +/** Thrown on GUI button release. */ +struct ButtonRelease : Event +{ + std::string FrameName; + GUI::Button* Button; +}; + +} + +} + +#endif // Events_ButtonRelease_h__ \ No newline at end of file diff --git a/include/GUI/ESliderUpdate.h b/include/GUI/ESliderUpdate.h new file mode 100644 index 0000000..b2f3c9b --- /dev/null +++ b/include/GUI/ESliderUpdate.h @@ -0,0 +1,45 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#ifndef Events_SliderUpdate_h__ +#define Events_SliderUpdate_h__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace GUI { class Slider; } + +namespace Events +{ + +/** Thrown when GUI slider is moved. */ +struct SliderUpdate : Event +{ + std::string FrameName; + GUI::Slider* Slider; + float Percentage; + float DeltaPercentage; +}; + +} + +} + +#endif // Events_SliderUpdate_h__ \ No newline at end of file diff --git a/include/GUI/Frame.h b/include/GUI/Frame.h new file mode 100644 index 0000000..f7e302c --- /dev/null +++ b/include/GUI/Frame.h @@ -0,0 +1,264 @@ +#ifndef GUI_Frame_h__ +#define GUI_Frame_h__ + +#include +#include + +#include "Core/Util/Rectangle.h" +#include "Core/EventBroker.h" +#include "Core/EKeyDown.h" +#include "Core/EKeyUp.h" +#include "Core/ResourceManager.h" +#include "Core/Renderer.h" +#include "Core/RenderQueue.h" +#include "Core/Texture.h" +#include "Input/EInputCommand.h" + +namespace dd +{ +namespace GUI +{ + +class Frame : public Rectangle +{ +public: + enum class Anchor + { + Left, + Right, + Top, + Bottom + }; + + static const int BaseWidth = 1280; + static const int BaseHeight = 720; + + // Set up a base frame with an event broker + Frame(dd::EventBroker* eventBroker) + : EventBroker(eventBroker) + , BaseFrame(this) + , Rectangle() { } + + // Create a frame as a child + Frame(Frame* parent, std::string name) + : m_Name(name) + { + SetParent(parent); + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Frame::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Frame::OnKeyUp); + EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Frame::OnCommand); + } + + ~Frame() + { + /*for (auto layer : m_Children) + { + for (auto child : layer.second) + { + delete child.second; + } + } + + if (m_Parent) + { + m_Parent->RemoveChild(this); + }*/ + } + + Frame* Parent() const { return m_Parent; } + + void SetParent(Frame* parent) + { + if (parent == nullptr) { + LOG_ERROR("Failed to parent frame \"%s\": Invalid parent", m_Name.c_str()); + return; + } + + m_Layer = parent->Layer() + 1; + parent->AddChild(this); + m_Parent = parent; + EventBroker = parent->EventBroker; + BaseFrame = parent->BaseFrame; + } + + void AddChild(Frame* child) + { + m_Children[child->m_Layer].insert(std::make_pair(child->Name(), child)); + if (m_Parent) { + m_Parent->AddChild(child); + } + } + + void RemoveChild(Frame* child) + { + auto it = m_Children.find(child->m_Layer); + if (it != m_Children.end()) { + m_Children.erase(it); + } + + if (m_Parent) { + m_Parent->RemoveChild(child); + } + } + + std::string Name() const { return m_Name; } + void SetName(std::string val) { m_Name = val; } + + int Layer() const { return m_Layer; } + + bool Hidden() const + { + if (m_Parent) + return m_Parent->Hidden() || m_Hidden; + else + return m_Hidden; + } + bool Visible() const + { + return !Hidden(); + } + + virtual void Hide() { m_Hidden = true; } + virtual void Show() { m_Hidden = false; } + + int Left() const override + { + if (m_Parent) + return m_Parent->Left() + X; + else + return X; + } + void SetLeft(int absLeft) override + { + if (m_Parent) { + X = absLeft - m_Parent->Left(); + } else { + X = absLeft; + } + } + int Right() const override + { + return Left() + Width; + } + void SetRight(int absRight) override + { + if (m_Parent) { + X = absRight - Width - m_Parent->Left(); + } else { + X = absRight - Width; + } + } + int Top() const override + { + if (m_Parent) + return m_Parent->Top() + Y; + else + return Y; + } + void SetTop(int absTop) override + { + if (m_Parent) { + Y = absTop - m_Parent->Top(); + } else { + Y = absTop; + } + } + int Bottom() const override + { + return Top() + Height; + } + void SetBottom(int absBottom) override + { + if (m_Parent) { + Y = absBottom - Height - m_Parent->Top(); + } else { + Y = absBottom - Height; + } + } + + glm::vec2 Scale() + { + if (m_Parent) + return m_Parent->Scale(); + else + return glm::vec2(Width, Height) / glm::vec2(BaseWidth, BaseHeight); + } + + Rectangle AbsoluteRectangle() + { + int left = Left(); + if (m_Parent) + left = std::max(left, m_Parent->Left()); + int top = Top(); + if (m_Parent) + top = std::max(top, m_Parent->Top()); + int width = Right() - left; + int height = Bottom() - top; + return Rectangle(left, top, width, height); + } + + void UpdateLayered(double dt) + { + // Update ourselves + this->Update(dt); + + // Update children + for (auto& pairLayer : m_Children) { + auto children = pairLayer.second; + for (auto& pairChild : children) { + auto child = pairChild.second; + child->Update(dt); + } + } + } + + virtual void Update(double dt) { } + + void DrawLayered(RenderQueueCollection& rq) + { + if (this->Hidden()) + return; + + // Draw ourselves + this->Draw(rq); + + // Draw children + for (auto& pairLayer : m_Children) { + auto children = pairLayer.second; + for (auto& pairChild : children) { + auto child = pairChild.second; + if (child->Hidden()) + continue; + child->Draw(rq); + } + } + } + + virtual void Draw(RenderQueueCollection& rq) { } + +protected: + dd::EventBroker* EventBroker; + Frame* BaseFrame = nullptr; + + std::string m_Name = "UIParent"; + int m_Layer = 0; + bool m_Hidden = false; + + Frame* m_Parent = nullptr; + typedef std::multimap Children_t; // name -> frame + std::map m_Children; // layer -> Children_t + + virtual bool OnKeyDown(const Events::KeyDown& event) { return false; } + virtual bool OnKeyUp(const Events::KeyUp& event) { return false; } + virtual bool OnCommand(const Events::InputCommand& event) { return false; } + +private: + EventRelay m_EKeyDown; + EventRelay m_EKeyUp; + EventRelay m_EInputCommand; +}; + +} +} + +#endif // GUI_Frame_h__ diff --git a/include/GUI/NumberFrame.h b/include/GUI/NumberFrame.h new file mode 100644 index 0000000..ac51aed --- /dev/null +++ b/include/GUI/NumberFrame.h @@ -0,0 +1,109 @@ +#ifndef GUI_NUMBERFRAME_H__ +#define GUI_NUMBERFRAME_H__ + +#include "GUI/TextureFrame.h" + +namespace dd +{ +namespace GUI +{ + +class NumberFrame : public Frame +{ +public: + NumberFrame(Frame* parent, std::string name) + : Frame(parent, name) + { + m_NumberTextures[0] = "Textures/GUI/Numbers/N0.png"; + m_NumberTextures[1] = "Textures/GUI/Numbers/N1.png"; + m_NumberTextures[2] = "Textures/GUI/Numbers/N2.png"; + m_NumberTextures[3] = "Textures/GUI/Numbers/N3.png"; + m_NumberTextures[4] = "Textures/GUI/Numbers/N4.png"; + m_NumberTextures[5] = "Textures/GUI/Numbers/N5.png"; + m_NumberTextures[6] = "Textures/GUI/Numbers/N6.png"; + m_NumberTextures[7] = "Textures/GUI/Numbers/N7.png"; + m_NumberTextures[8] = "Textures/GUI/Numbers/N8.png"; + m_NumberTextures[9] = "Textures/GUI/Numbers/N9.png"; + + // Create number frame if missing + for (int i = 0; i < 10; i++) { + auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); + frame->SetTexture(m_NumberTextures[0]); + frame->DisableScissor(); + // Position frame based on alignment + if (i > 0) { + frame->X = i * 20; + } + Width += frame->Width; + if (Height < frame->Height) { + Height = frame->Height; + } + m_NumberFrames.push_front(frame); + } + + SetNumber(0); + } + + int Number() const { return m_Number; } + void SetNumber(int number) + { + m_Number = number; + + // Clear number textures + //for (auto& frame : m_NumberFrames) { + // frame->SetTexture(""); + //} + + //Width = 0; + //Height = 0; + + int n = 0; + do { +// // Create number frame if missing +// if (m_NumberFrames.size() <= n) { +// auto frame = new GUI::TextureFrame(this, "NumberFrameDigit"); +// frame->DisableScissor(); +// m_NumberFrames.push_front(frame); +// } + + // Update value + int digit = number % 10; + m_NumberFrames[n]->SetTexture(m_NumberTextures[digit]); + //Width += m_NumberFrames[n]->Width; + //if (Height < m_NumberFrames[n]->Height) { + // Height = m_NumberFrames[n]->Height; + //} +// // Position frame based on alignment +// if (n > 0) { +// if (!m_LeftAligned) { +// m_NumberFrames[n]->SetLeft(m_NumberFrames[n - 1]->Right()); +// } else { +// m_NumberFrames[n]->SetRight(m_NumberFrames[n - 1]->Left()); +// } +// } + + number /= 10; + n++; + } while (number > 0); + } + + void SetLeftAlign() { m_LeftAligned = true; } + void SetRightAlign() { m_LeftAligned = false; } + + virtual void Update(double dt) override + { + + } + +private: + int m_Number = 0; + bool m_LeftAligned = true; + + std::string m_NumberTextures[10]; + std::deque m_NumberFrames; +}; + +} +} +#endif + diff --git a/include/GUI/Slider.h b/include/GUI/Slider.h new file mode 100644 index 0000000..de53245 --- /dev/null +++ b/include/GUI/Slider.h @@ -0,0 +1,124 @@ +#ifndef GUI_SLIDER_H__ +#define GUI_SLIDER_H__ + +#include "GUI/TextureFrame.h" +#include "GUI/Button.h" +#include "GUI/EButtonPress.h" +#include "GUI/EButtonRelease.h" +#include "GUI/ESliderUpdate.h" +#include "Core/EMouseMove.h" + +namespace dd +{ +namespace GUI +{ + +class Slider : public TextureFrame +{ +public: + Slider(Frame* parent, std::string name) + : TextureFrame(parent, name) + { + m_SliderButton = new GUI::Button(this, "SliderButton"); + m_SliderButton->DisableScissor(); + + EVENT_SUBSCRIBE_MEMBER(m_EButtonPress, &Slider::OnButtonPress); + EVENT_SUBSCRIBE_MEMBER(m_EButtonRelease, &Slider::OnButtonRelease); + EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &Slider::OnMouseMove); + } + + float Percentage() const { return m_Percentage; } + void SetPercentage(const float percentage) + { + m_Percentage = percentage; + m_SliderButton->X = percentage * (Width - m_SliderButton->Width); + } + + void SetTextureHover(std::string resourceName) + { + m_SliderButton->SetTextureHover(resourceName); + } + void SetTextureReleased(std::string resourceName) + { + m_SliderButton->SetTextureReleased(resourceName); + } + void SetTexturePressed(std::string resourceName) + { + m_SliderButton->SetTexturePressed(resourceName); + } + + void AlignVertically() + { + m_SliderButton->Y = (Height / 2) - (m_SliderButton->Height / 2); + } + + ~Slider() + { + if (m_SliderButton != nullptr) { + delete m_SliderButton; + m_SliderButton = nullptr; + } + } + + virtual void Update(double dt) override + { + + } + +private: + Button* m_SliderButton = nullptr; + bool m_IsGrabbed = false; + float m_Percentage = 0.f; + + EventRelay m_EButtonPress; + EventRelay m_EButtonRelease; + EventRelay m_EMouseMove; + + virtual bool OnButtonPress(const Events::ButtonPress& event) + { + if (event.Button == m_SliderButton) { + m_IsGrabbed = true; + } + + return true; + } + + virtual bool OnButtonRelease(const Events::ButtonRelease& event) + { + if (event.Button == m_SliderButton) { + m_IsGrabbed = false; + } + + return true; + } + + virtual bool OnMouseMove(const Events::MouseMove& event) + { + if (m_IsGrabbed) { + // Set horizontal position + m_SliderButton->X += event.DeltaX; + if (m_SliderButton->Left() < Left()) { + m_SliderButton->SetLeft(Left()); + } else if (m_SliderButton->Right() > Right()) { + m_SliderButton->SetRight(Right()); + } + + // Update percentage + float newPercentage = m_SliderButton->X / (float)(Width - m_SliderButton->Width); + Events::SliderUpdate e; + e.FrameName = Name(); + e.Slider = this; + e.Percentage = newPercentage; + e.DeltaPercentage = newPercentage - m_Percentage; + EventBroker->Publish(e); + m_Percentage = newPercentage; + } + + return true; + } +}; + +} +} +#endif + diff --git a/include/GUI/TextureFrame.h b/include/GUI/TextureFrame.h new file mode 100644 index 0000000..12f15c0 --- /dev/null +++ b/include/GUI/TextureFrame.h @@ -0,0 +1,111 @@ +#ifndef GUI_TextureFrame_h__ +#define GUI_TextureFrame_h__ + +#include "GUI/Frame.h" +#include "Core/Texture.h" + +namespace dd +{ +namespace GUI +{ + +class TextureFrame : public Frame +{ +public: + TextureFrame(Frame* parent, std::string name) + : Frame(parent, name) { } + + void EnableScissor() { m_ScissorEnabled = true; } + void DisableScissor() { m_ScissorEnabled = false; } + + void Draw(RenderQueueCollection& rq) override + { + if (m_Texture == nullptr) + return; + + // Main texture + { + FrameJob job; + job.Scissor = (m_ScissorEnabled) ? m_Parent->AbsoluteRectangle() : Rectangle(); + job.Viewport = Rectangle(Left(), Top(), Width, Height); + job.TextureID = m_Texture->ResourceID; + job.DiffuseTexture = *m_Texture; + job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a * m_CurrentFade); + job.Name = Name(); + rq.GUI.Add(job); + } + + // Texture while fading + if (m_FadeTexture && m_CurrentFade < 1) { + FrameJob job; + job.Scissor = (m_ScissorEnabled) ? m_Parent->AbsoluteRectangle() : Rectangle(); + job.Viewport = Rectangle(Left(), Top(), Width, Height); + job.TextureID = m_FadeTexture->ResourceID; + job.DiffuseTexture = *m_FadeTexture; + job.Color = glm::vec4(m_Color.r, m_Color.g, m_Color.b, m_Color.a); + job.Name = Name(); + rq.GUI.Add(job); + } + } + + dd::Texture* Texture() const { return m_Texture; } + + void SetTexture(std::string resourceName) + { + if (resourceName.empty()) { + m_Texture = nullptr; + return; + } + + m_Texture = ResourceManager::Load(resourceName); + if (m_Texture == nullptr) { + m_Texture = ResourceManager::Load("Textures/Core/ErrorTexture.png"); + } + SizeToTexture(); + } + + void SizeToTexture() + { + if (m_Texture != nullptr) { + this->Width = m_Texture->Width; + this->Height = m_Texture->Height; + } + } + + void FadeToTexture(std::string resourceName, double duration) + { + m_FadeTexture = m_Texture; + SetTexture(resourceName); + m_FadeDuration = duration; + m_CurrentFade = 0.f; + } + + void Update(double dt) override + { + if (m_CurrentFade < 1) { + m_CurrentFade += dt / m_FadeDuration; + if (m_CurrentFade > 1) { + m_FadeTexture = nullptr; + m_CurrentFade = 1; + m_FadeDuration = 0; + } + } + } + + glm::vec4 Color() const { return m_Color; } + void SetColor(glm::vec4 val) { m_Color = val; } + +protected: + bool m_ScissorEnabled = true; + dd::Texture* m_Texture = nullptr; + dd::Texture* m_FadeTexture = nullptr; + glm::vec4 m_Color = glm::vec4(1.f, 1.f, 1.f, 1.f); + float m_FadeDuration = 0.f; + float m_CurrentFade = 1.f; + +}; + +} +} + +#endif // GUI_TextureFrame_h__ diff --git a/include/Game/EGameStart.h b/include/Game/EGameStart.h new file mode 100644 index 0000000..bfee0fd --- /dev/null +++ b/include/Game/EGameStart.h @@ -0,0 +1,25 @@ +// +// Created by Adam on 2015-09-25. +// + +#ifndef EVENTS_EGAMESTART_H__ +#define EVENTS_EGAMESTART_H__ + +#include "Core/EventBroker.h" + +namespace dd +{ + +namespace Events +{ + +struct GameStart : public Event +{ + +}; + +} + +} + +#endif diff --git a/include/Game/HUD.h b/include/Game/HUD.h new file mode 100644 index 0000000..2a240b3 --- /dev/null +++ b/include/Game/HUD.h @@ -0,0 +1,53 @@ +#ifndef GUI_HUD_H__ +#define GUI_HUD_H__ + +#include "GUI/Frame.h" +#include "GUI/TextureFrame.h" +#include "GUI/NumberFrame.h" +#include "Core/EKeyUp.h" +#include "Game/EScoreEvent.h" + +namespace dd +{ +namespace GUI +{ + +class HUD : public Frame +{ +public: + HUD(Frame* parent, std::string name) + : Frame(parent, name) + { + Width = parent->Width; + Height = parent->Height; + + m_LevelIndicator = new GUI::TextureFrame(this, "HUDLevelIndicator"); + m_LevelIndicator->SetTexture("Textures/GUI/HUD/LevelIndicatorBG.png"); + + m_ScoreIndicator = new GUI::TextureFrame(this, "HUDScoreIndicator"); + m_ScoreIndicator->SetTexture("Textures/GUI/HUD/ScoreIndicatorBG.png"); + m_ScoreIndicator->SetRight(Right()); + m_ScoreNumberFrame = new GUI::NumberFrame(m_ScoreIndicator, "HUDScoreNumberFrame"); + m_ScoreNumberFrame->X = 15; + m_ScoreNumberFrame->Y = 21; + + EVENT_SUBSCRIBE_MEMBER(m_EScore, &HUD::OnScore); + } + +private: + TextureFrame* m_LevelIndicator = nullptr; + TextureFrame* m_ScoreIndicator = nullptr; + NumberFrame* m_ScoreNumberFrame = nullptr; + + EventRelay m_EScore; + + bool OnScore(const Events::ScoreEvent& event) + { + m_ScoreNumberFrame->SetNumber(m_ScoreNumberFrame->Number() + event.Score); + } +}; + +} +} +#endif + diff --git a/include/Game/LevelSystem.h b/include/Game/LevelSystem.h index f7f9170..545d2fb 100755 --- a/include/Game/LevelSystem.h +++ b/include/Game/LevelSystem.h @@ -19,12 +19,12 @@ #include "Game/ELifeLost.h" #include "Game/EResetBall.h" #include "Game/EScoreEvent.h" +#include "Physics/CRectangleShape.h" #include "Game/EMultiBall.h" #include "Game/EGameOver.h" #include "Game/ECreatePowerUp.h" #include "Game/EPowerUpTaken.h" #include "Game/Bricks/CPowerUpBrick.h" -#include "Physics/CBoxShape.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" #include "Physics/ESetImpulse.h" diff --git a/include/Game/MainMenu.h b/include/Game/MainMenu.h new file mode 100644 index 0000000..fa629d3 --- /dev/null +++ b/include/Game/MainMenu.h @@ -0,0 +1,59 @@ +#ifndef GUI_MAINMENU_H__ +#define GUI_MAINMENU_H__ + +#include "GUI/TextureFrame.h" +#include "Game/MainMenuMain.h" +#include "Game/MainMenuOptions.h" +#include "Core/EKeyUp.h" + +namespace dd +{ +namespace GUI +{ + +class MainMenu : public TextureFrame +{ +public: + MainMenu(Frame* parent, std::string name) + : TextureFrame(parent, name) + { + SetTexture("Textures/GUI/Menu/Background.png"); + Width = 675; + Height = 1080; + + m_LeftBanner = new GUI::TextureFrame(this, "MainMenuLeftBanner"); + m_LeftBanner->SetTexture("Textures/GUI/Menu/Left.png"); + m_LeftBanner->Width = 231; + m_LeftBanner->Height = 1080; + + m_MainMenuMain = new GUI::MainMenuMain(this, "MainMenuMain"); + m_MainMenuMain->SetLeft(m_LeftBanner->Right()); + m_MainMenuMain->SetTop(60); + + m_MainMenuOptions = new GUI::MainMenuOptions(this, "MainMenuOptions"); + m_MainMenuOptions->SetLeft(m_LeftBanner->Right()); + m_MainMenuOptions->SetTop(m_MainMenuMain->Bottom()); + + //EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &MainMenu::OnKeyUp); + } + +private: + TextureFrame* m_LeftBanner; + MainMenuMain* m_MainMenuMain; + MainMenuOptions* m_MainMenuOptions; + + //EventRelay m_EKeyUp; + bool OnKeyUp(const Events::KeyUp& event) + { + if (event.KeyCode == GLFW_KEY_ESCAPE) { + Show(); + } + + return true; + } +}; + +} +} +#endif + diff --git a/include/Game/MainMenuMain.h b/include/Game/MainMenuMain.h new file mode 100644 index 0000000..c74027f --- /dev/null +++ b/include/Game/MainMenuMain.h @@ -0,0 +1,72 @@ +#ifndef GUI_MAINMENUMAIN_H__ +#define GUI_MAINMENUMAIN_H__ + +#include "GUI/TextureFrame.h" +#include "GUI/Button.h" +#include "Game/EGameStart.h" +#include "Game/HUD.h" + +namespace dd +{ +namespace GUI +{ + +class MainMenuMain : public TextureFrame +{ +public: + MainMenuMain(Frame* parent, std::string name) + : TextureFrame(parent, name) + { + Width = 409; + Height = 543; + + m_Title = new GUI::TextureFrame(this, "MainMenuMainTitle"); + m_Title->SetTexture("Textures/GUI/Menu/MainTitle.png"); + + m_SquidoutButton = new GUI::Button(this, "MainMenuMainSquidoutButton"); + m_SquidoutButton->SetTop(m_Title->Bottom()); + m_SquidoutButton->SetTextureReleased("Textures/GUI/Menu/MainSquidout.png"); + m_SquidoutButton->SetTextureHover("Textures/GUI/Menu/MainSquidoutHover.png"); + m_SquidoutButton->SetTexturePressed("Textures/GUI/Menu/MainSquidoutClick.png"); + m_SquidoutButton->SizeToTexture(); + + m_TimeAttackButton = new GUI::Button(this, "MainMenuMainTimeAttackButton"); + m_TimeAttackButton->SetTop(m_SquidoutButton->Bottom()); + m_TimeAttackButton->SetTextureReleased("Textures/GUI/Menu/MainTimeAttack.png"); + m_TimeAttackButton->SetTextureHover("Textures/GUI/Menu/MainTimeAttackHover.png"); + m_TimeAttackButton->SetTexturePressed("Textures/GUI/Menu/MainTimeAttackClick.png"); + m_TimeAttackButton->SizeToTexture(); + + m_OptionsButton = new GUI::Button(this, "MainMenuMainOptionsButton"); + m_OptionsButton->SetTop(m_TimeAttackButton->Bottom()); + m_OptionsButton->SetTextureReleased("Textures/GUI/Menu/MainOptions.png"); + m_OptionsButton->SetTextureHover("Textures/GUI/Menu/MainOptionsHover.png"); + m_OptionsButton->SetTexturePressed("Textures/GUI/Menu/MainOptionsClick.png"); + m_OptionsButton->SizeToTexture(); + + EVENT_SUBSCRIBE_MEMBER(m_EButtonRelease, &MainMenuMain::OnButtonRelease); + } + +private: + TextureFrame* m_Title; + Button* m_SquidoutButton; + Button* m_TimeAttackButton; + Button* m_OptionsButton; + + EventRelay m_EButtonRelease; + virtual bool OnButtonRelease(const Events::ButtonRelease& event) + { + if (event.Button == m_SquidoutButton) { + Events::GameStart e; + EventBroker->Publish(e); + m_Parent->Hide(); + auto hud = new GUI::HUD(BaseFrame, "HUD"); + } + + return true; + } +}; + +} +} +#endif diff --git a/include/Game/MainMenuOptions.h b/include/Game/MainMenuOptions.h new file mode 100644 index 0000000..b0771de --- /dev/null +++ b/include/Game/MainMenuOptions.h @@ -0,0 +1,82 @@ +#ifndef GUI_MAINMENUOPTIONS_H__ +#define GUI_MAINMENUOPTIONS_H__ + +#include "GUI/TextureFrame.h" +#include "GUI/Button.h" +#include "GUI/Slider.h" +#include "GUI/ESliderUpdate.h" +#include "Sound/EMasterVolume.h" + +namespace dd +{ +namespace GUI +{ + +class MainMenuOptions : public TextureFrame +{ +public: + MainMenuOptions(Frame* parent, std::string name) + : TextureFrame(parent, name) + { + Width = 409; + Height = 1080; + + m_Title = new GUI::TextureFrame(this, "MainMenuOptionsTitle"); + m_Title->SetTexture("Textures/GUI/Menu/OptionsTitle.png"); + + m_TitleSFX = new GUI::TextureFrame(this, "MainMenuOptionsSFXTitle"); + m_TitleSFX->SetTop(m_Title->Bottom() + 20); + m_TitleSFX->SetTexture("Textures/GUI/Menu/OptionsSFXTitle.png"); + m_SFXSlider = new GUI::Slider(this, "MainMenuOptionsSFXSlider"); + m_SFXSlider->X = 66; + m_SFXSlider->SetTop(m_TitleSFX->Bottom() + 10); + m_SFXSlider->SetTexture("Textures/GUI/Menu/SliderBackground.png"); + m_SFXSlider->SetTextureReleased("Textures/GUI/Menu/SliderHandle.png"); + m_SFXSlider->AlignVertically(); + m_SFXSlider->SetPercentage(1.f); + + m_TitleBGM = new GUI::TextureFrame(this, "MainMenuOptionsBGMTitle"); + m_TitleBGM->SetTop(m_SFXSlider->Bottom() + 20); + m_TitleBGM->SetTexture("Textures/GUI/Menu/OptionsBGMTitle.png"); + m_BGMSlider = new GUI::Slider(this, "MainMenuOptionsBGMSlider"); + m_BGMSlider->X = 66; + m_BGMSlider->SetTop(m_TitleBGM->Bottom() + 10); + m_BGMSlider->SetTexture("Textures/GUI/Menu/SliderBackground.png"); + m_BGMSlider->SetTextureReleased("Textures/GUI/Menu/SliderHandle.png"); + m_BGMSlider->AlignVertically(); + m_BGMSlider->SetPercentage(1.f); + + EVENT_SUBSCRIBE_MEMBER(m_ESliderUpdate, &MainMenuOptions::OnSliderUpdate); + } + +private: + TextureFrame* m_Title = nullptr; + TextureFrame* m_TitleSFX = nullptr; + Slider* m_SFXSlider = nullptr; + Slider* m_BGMSlider = nullptr; + TextureFrame* m_TitleBGM = nullptr; + + EventRelay m_ESliderUpdate; + bool OnSliderUpdate(const Events::SliderUpdate& event) + { + if (event.Slider == m_SFXSlider) { + Events::MasterVolume e; + e.IsAmbient = false; + e.Gain = event.Percentage; + EventBroker->Publish(e); + } + + if (event.Slider == m_BGMSlider) { + Events::MasterVolume e; + e.IsAmbient = true; + e.Gain = event.Percentage; + EventBroker->Publish(e); + } + + return true; + } +}; + +} +} +#endif diff --git a/include/Game/PadSystem.h b/include/Game/PadSystem.h index a4e5f9e..4a53907 100755 --- a/include/Game/PadSystem.h +++ b/include/Game/PadSystem.h @@ -14,7 +14,7 @@ #include "Core/EKeyUp.h" #include "Input/EBindKey.h" #include "Physics/EContact.h" -#include "Physics/CBoxShape.h" +#include "Physics/CRectangleShape.h" #include "Physics/CPhysics.h" #include "Physics/CCircleShape.h" #include "Physics/ESetImpulse.h" diff --git a/include/Physics/CPhysics.h b/include/Physics/CPhysics.h index 8d1f975..73d05cf 100644 --- a/include/Physics/CPhysics.h +++ b/include/Physics/CPhysics.h @@ -4,17 +4,40 @@ namespace dd { + +namespace CollisionLayer +{ +enum Type +{ + Pad = 1 << 0, + Ball = 1 << 1, + Brick = 1 << 2, + Water = 1 << 3, + PowerUp = 1 << 4, + Other = 1 << 5, + Wall = 1 << 6 +}; +} namespace Components { struct Physics: public Component { - //idk if anything should be here :) bool Static = true; + bool Calculate = false; + float GravityScale = 0.f; + CollisionLayer::Type Category = CollisionLayer::Type::Other; + CollisionLayer::Type Mask = + CollisionLayer::Type::Pad | + CollisionLayer::Type::Ball | + CollisionLayer::Type::Brick | + CollisionLayer::Type::Water | + CollisionLayer::Type::PowerUp | + CollisionLayer::Type::Wall | + CollisionLayer::Type::Other; }; } - } #endif //DAYDREAM_CPHYSICS_H diff --git a/include/Physics/CBoxShape.h b/include/Physics/CRectangleShape.h similarity index 100% rename from include/Physics/CBoxShape.h rename to include/Physics/CRectangleShape.h diff --git a/include/Physics/CWaterVolume.h b/include/Physics/CWaterVolume.h new file mode 100755 index 0000000..33adcae --- /dev/null +++ b/include/Physics/CWaterVolume.h @@ -0,0 +1,19 @@ +#ifndef CWATERVOLUME_H +#define CWATERVOLUME_H +#include "Core/Component.h" + +namespace dd +{ +namespace Components +{ + +struct WaterVolume : public Component +{ + +}; + +} + +} + +#endif \ No newline at end of file diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h index 3c456ce..eaaf49e 100644 --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -5,7 +5,7 @@ #include "Core/System.h" #include "Core/World.h" -#include "Physics/CBoxShape.h" +#include "CRectangleShape.h" #include "Physics/CPhysics.h" #include #include "Core/CTransform.h" @@ -15,6 +15,9 @@ #include "Physics/CCircleShape.h" #include "Core/EventBroker.h" #include "Game/CPad.h" +#include "Physics/CWaterVolume.h" +#include "Game/CBall.h" +#include "Rendering/CSprite.h" namespace dd @@ -64,6 +67,15 @@ private: void CreateBody(EntityID entity); + b2ParticleSystem *m_ParticleSystem; + b2ParticleGroup* t_watergroup; + + std::unordered_map m_EntitiesToParticleHandle; + std::unordered_map m_ParticleHandleToEntities; + + void InitializeWater(); + void SyncWater(); //TODO: Probably remove this + void CreateParticleGroup(EntityID entity); struct Impulse { @@ -102,16 +114,19 @@ private: void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; - EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); - if (physicsComponentA != nullptr || physicsComponentB != nullptr) { - // Turn of collisions - contact->SetEnabled(false); + if (physicsComponentA != nullptr && physicsComponentB != nullptr) { + if (physicsComponentA->Calculate || physicsComponentB->Calculate) { + // Turn of collisions + contact->SetEnabled(false); + } } + } void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) { diff --git a/include/Physics/PhysicsSystem.h.orig b/include/Physics/PhysicsSystem.h.orig new file mode 100755 index 0000000..f1465aa --- /dev/null +++ b/include/Physics/PhysicsSystem.h.orig @@ -0,0 +1,149 @@ +#ifndef DAYDREAM_PHYSICSSYSTEM_H +#define DAYDREAM_PHYSICSSYSTEM_H + +#include + +#include "Core/System.h" +#include "Core/World.h" +#include "CRectangleShape.h" +#include "Physics/CPhysics.h" +#include +#include "Core/CTransform.h" +#include "Transform/TransformSystem.h" +#include "Physics/EContact.h" +#include "Physics/ESetImpulse.h" +#include "Physics/CCircleShape.h" +#include "Core/EventBroker.h" +#include "Game/CPad.h" +<<<<<<< HEAD +#include "Game/CBall.h" +======= +#include "Physics/CWaterVolume.h" +#include "Rendering/CSprite.h" +>>>>>>> origin/master + + +namespace dd +{ + +namespace Systems +{ + + +class PhysicsSystem : public System +{ + friend class ContractListener; + +public: + PhysicsSystem(World* world, std::shared_ptr eventBroker) + : System(world, eventBroker) {} + + ~PhysicsSystem(); + + EventRelay m_SetImpulse; + bool SetImpulse(const Events::SetImpulse &event); + + void RegisterComponents(ComponentFactory* cf) override; + void Initialize() override; + + // Called once per system every tick + void Update(double dt) override; + // Called once for every entity in the world every tick + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + // Called when components are committed to an entity + void OnEntityCommit(EntityID entity) override; + + // Called when an entity is removed + void OnEntityRemoved(EntityID entity) override; + +private: + b2Vec2 m_Gravity; + b2World* m_PhysicsWorld; + float m_TimeStep; + float m_Accumulator; + + int m_VelocityIterations, m_PositionIterations; + + std::unordered_map m_EntitiesToBodies; + std::unordered_map m_BodiesToEntities; + + void CreateBody(EntityID entity); + + b2ParticleSystem *m_ParticleSystem; + b2ParticleGroup* t_watergroup; + + std::unordered_map m_EntitiesToParticleHandle; + std::unordered_map m_ParticleHandleToEntities; + + void InitializeWater(); + void SyncWater(); //TODO: Probably remove this + void CreateParticleGroup(EntityID entity); + + struct Impulse + { + b2Body* Body; + b2Vec2 Impulse; + b2Vec2 Point; + }; + std::list m_Impulses; + + + + class ContactListener : public b2ContactListener + { + public: + ContactListener(PhysicsSystem* physicsSystem) + : m_PhysicsSystem(physicsSystem) { } + + void BeginContact(b2Contact* contact) + { + b2WorldManifold worldManifold; + + contact->GetWorldManifold(&worldManifold); + + Events::Contact e; + e.Entity1 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + e.Entity2 = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; + e.Normal = glm::normalize(glm::vec2(contact->GetManifold()->localNormal.x, contact->GetManifold()->localNormal.y)); + e.SignificantNormal = glm::normalize((glm::abs(e.Normal.x) > glm::abs(e.Normal.y)) ? glm::vec2(e.Normal.x, 0) : glm::vec2(0, e.Normal.y)); + + m_PhysicsSystem->EventBroker->Publish(e); + } + void EndContact(b2Contact* contact) + { + + } + void PreSolve(b2Contact* contact, const b2Manifold* oldManifold) + { + EntityID entityA = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureA()->GetBody()]; + EntityID entityB = m_PhysicsSystem->m_BodiesToEntities[contact->GetFixtureB()->GetBody()]; + + auto physicsComponentA = m_PhysicsSystem->m_World->GetComponent(entityA); + auto physicsComponentB = m_PhysicsSystem->m_World->GetComponent(entityB); + + if (physicsComponentA != nullptr && physicsComponentB != nullptr) { + if (physicsComponentA->Calculate || physicsComponentB->Calculate) { + // Turn of collisions + contact->SetEnabled(false); + } + } + + + } + void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse) + { + + } + + private: + PhysicsSystem* m_PhysicsSystem; + }; + + ContactListener* m_ContactListener; +}; + +} +} + +#endif //DAYDREAM_PHYSICSSYSTEM_H diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index a63eb23..6834897 100755 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -79,6 +79,12 @@ file(GLOB SOURCE_FILES_Sound ) source_group(Sound FILES ${SOURCE_FILES_Sound}) +file(GLOB SOURCE_FILES_GUI + "${INCLUDE_PATH}/GUI/*.h" + "GUI/*.cpp" +) +source_group(GUI FILES ${SOURCE_FILES_GUI}) + set(SOURCE_FILES ${SOURCE_FILES_Core} ${SOURCE_FILES_Core_Util} @@ -87,11 +93,14 @@ set(SOURCE_FILES ${SOURCE_FILES_Transform} ${SOURCE_FILES_Physics} ${SOURCE_FILES_Game} - ${SOURCE_FILES_Sound} ../../include/Game/EGameOver.h ../../include/Game/Bricks/CPowerUpBrick.h ../../include/Game/CPowerUp.h ../../include/Game/ECreatePowerUp.h ../../include/Game/EPowerUpTaken.h) + ${SOURCE_FILES_Sound} + ${SOURCE_FILES_GUI} +) if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") - set(STATIC_LIBRARY_FLAGS "${STATIC_LIBRARY_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") + set(STATIC_LIBRARY_FLAGS "${STATIC_LIBRARY_FLAGS}") endif() add_library(game ${SOURCE_FILES}) diff --git a/src/game/CMakeLists.txt.game b/src/game/CMakeLists.txt.game deleted file mode 100644 index 5e236f1..0000000 --- a/src/game/CMakeLists.txt.game +++ /dev/null @@ -1,38 +0,0 @@ -project(game) - -find_package(OpenGL REQUIRED) -find_package(GLEW REQUIRED) -find_package(GLFW REQUIRED) -find_package(Boost REQUIRED) -find_package(assimp REQUIRED) -find_package(ZLIB REQUIRED) -find_package(PNG REQUIRED) - -include_directories( - ${CMAKE_SOURCE_DIR}/include/dd - ${OPENGL_INCLUDE_DIR} - ${GLEW_INCLUDE_DIRS} - ${GLFW_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS} - ${assimp_INCLUDE_DIRS} - ${PNG_INCLUDE_DIRS} -) - -set(SOURCE_FILES - main.cpp -) - -if(CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") -endif() - -add_executable(game ${SOURCE_FILES}) -target_link_libraries(game - daydream - ${OPENGL_LIBRARIES} - ${GLEW_LIBRARIES} - ${GLFW_LIBRARIES} - ${Boost_LIBRARIES} - ${assimp_LIBRARIES} - ${PNG_LIBRARIES} -) \ No newline at end of file diff --git a/src/game/Core/EventBroker.cpp b/src/game/Core/EventBroker.cpp index f24b073..2c68fd0 100644 --- a/src/game/Core/EventBroker.cpp +++ b/src/game/Core/EventBroker.cpp @@ -79,7 +79,7 @@ int dd::EventBroker::Process(std::string contextTypeName) return eventsProcessed; } -void dd::EventBroker::Clear() +void dd::EventBroker::Swap() { std::swap(m_EventQueueRead, m_EventQueueWrite); m_EventQueueWrite->clear(); diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 6534db1..2226ba2 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -91,6 +91,12 @@ void dd::Renderer::LoadShaders() //glBindFragDataLocation(m_SPDeferred2, 0, "FragmentLighting"); m_spDeferred2->Link(); + //Water Pass + t_m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); + t_m_spWater->Link(); + t_m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); + t_m_spWater2->Link(); + // Pass #3: Combining into final image m_spDeferred3 = ResourceManager::Load("Shaders/Deferred/3/"); m_spDeferred3->Link(); @@ -110,11 +116,13 @@ void dd::Renderer::LoadShaders() void dd::Renderer::CreateBuffers() { + //TODO: Make the most common cases of texture create and FBO create into a function so it's not so cluttered in here. m_ScreenQuad = CreateQuad(); m_UnitQuad = ResourceManager::Load("Models/Core/UnitQuad.obj"); m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); m_StandardNormal = ResourceManager::Load("Textures/Core/NeutralNormalMap.png"); m_StandardSpecular = ResourceManager::Load("Textures/Core/NeutralSpecularMap.png"); + t_m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); glGenRenderbuffers(1, &m_rbDepthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthBuffer); @@ -149,6 +157,13 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glGenTextures(1, &t_m_Gwater); + glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_FLOAT, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Create first pass framebuffer glGenFramebuffers(1, &m_fbDeferred1); @@ -185,14 +200,75 @@ void dd::Renderer::CreateBuffers() exit(EXIT_FAILURE); } + //Fill Water Texture + glGenTextures(1, &t_m_Gwater); + glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + //Fill water pass + glGenFramebuffers(1, &t_m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_Gwater, 0); + GLenum waterPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, waterPassDrawBuffers); + if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + exit(EXIT_FAILURE); + } + + //water Blur texture + glGenTextures(1, &t_m_BWater); + glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + //Fill waterBlur pass + glGenFramebuffers(1, &t_m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater, 0); + GLenum waterBlurDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, waterBlurDrawBuffers); + if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + exit(EXIT_FAILURE); + } + + //water Blur texture2 + glGenTextures(1, &t_m_BWater2); + glBindTexture(GL_TEXTURE_2D, t_m_BWater2); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + //Fill waterBlur pass2 + glGenFramebuffers(1, &t_m_fbWaterBlur2); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater2, 0); + GLenum waterBlur2DrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, waterBlur2DrawBuffers); + if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + LOG_ERROR("m_fbDeferred2 incomplete: 0x%x\n", fbStatus); + exit(EXIT_FAILURE); + } + // Generate final deferred texture glGenTextures(1, &m_tFinal); glBindTexture(GL_TEXTURE_2D, m_tFinal); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // Create third pass framebuffer glGenFramebuffers(1, &m_fbDeferred3); @@ -209,13 +285,13 @@ void dd::Renderer::CreateBuffers() void dd::Renderer::Draw(RenderQueueCollection& rq) { - - DrawDeferred(rq.Deferred, rq.Lights); rq.Forward.Jobs.sort(dd::Renderer::DepthSort); + DrawDeferred(rq.Deferred, rq.Lights); DrawForward(rq.Forward, rq.Lights); + DrawGUI(rq.GUI); // Finally: Draw the deferred+forward combined texture to the screen - glCullFace(GL_BACK); + glDisable(GL_CULL_FACE); glDepthMask(GL_FALSE); glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); @@ -257,7 +333,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glBlendFunc(GL_ONE, GL_ONE); glDepthMask(GL_FALSE); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred2); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred2->Bind(); DrawLightSpheres(lights); @@ -266,7 +342,7 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) glCullFace(GL_BACK); glDisable(GL_BLEND); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - glClearColor(0, 0, 0, 1); + glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); m_spDeferred3->Bind(); glUniform3fv(glGetUniformLocation(*m_spDeferred3, "La"), 1, glm::value_ptr(glm::vec3(0.5f))); @@ -280,7 +356,6 @@ void dd::Renderer::DrawDeferred(RenderQueue &objects, RenderQueue &lights) void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) { - // Forward-render semi-transparent objects on top of the current framebuffer glDisable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -296,6 +371,19 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) m_spForward->Bind(); DrawScene(objects, *m_spForward); + + //WaterPass + glDisable(GL_CULL_FACE); + glCullFace(GL_BACK); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + t_m_spWater->Bind(); + DrawWater(objects); } void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) @@ -311,6 +399,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) if (modelJob) { glm::mat4 modelMatrix = modelJob->ModelMatrix; MVP = PV * modelMatrix; + glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); @@ -318,7 +407,6 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniform3fv(glGetUniformLocation(shaderProgramHandle, "LightSpecular"), 1, glm::value_ptr(glm::vec3(1.f))); glUniform3fv(glGetUniformLocation(shaderProgramHandle, "LightDiffuse"), 1, glm::value_ptr(glm::vec3(1.f))); glUniform1f(glGetUniformLocation(shaderProgramHandle, "LightRadius"), 40.0f); - glUniform1f(glGetUniformLocation(shaderProgramHandle, "MaterialShininess"), modelJob->Shininess); glActiveTexture(GL_TEXTURE0); @@ -339,7 +427,6 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glBindTexture(GL_TEXTURE_2D, *m_StandardSpecular); } - glBindVertexArray(modelJob->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->ElementBuffer); glDrawElementsBaseVertex(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, 0, modelJob->StartIndex); @@ -355,6 +442,7 @@ void dd::Renderer::DrawScene(RenderQueue &objects, ShaderProgram &program) glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + glUniform4fv(glGetUniformLocation(shaderProgramHandle, "Color"), 1, glm::value_ptr(modelJob->Color)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, spriteJob->DiffuseTexture); @@ -409,6 +497,112 @@ void dd::Renderer::DrawLightSpheres(RenderQueue &lights) } } +void dd::Renderer::DrawWater(RenderQueue &rq) +{ + GLuint shaderProgramHandle = *t_m_spWater; + + glm::mat4 projectionMatrix = m_Camera->ProjectionMatrix(); + glm::mat4 viewMatrix = m_Camera->ViewMatrix(); + glm::mat4 PV = projectionMatrix * viewMatrix; + glm::mat4 MVP; + for ( auto &job : rq ) { + auto waterJob = std::dynamic_pointer_cast(job); + if (waterJob) { + glm::mat4 modelMatrix = waterJob->ModelMatrix; + MVP = PV * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "M"), 1, GL_FALSE, + glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(shaderProgramHandle, "V"), 1, GL_FALSE, + glm::value_ptr(viewMatrix)); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, *t_m_WhiteSphereTexture); + + glBindVertexArray(m_UnitQuad->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_UnitQuad->ElementBuffer); + glDrawElementsBaseVertex(GL_TRIANGLES, m_UnitQuad->m_Indices.size(), GL_UNSIGNED_INT, 0, 0); + } + } + + + + //blur1 + shaderProgramHandle = *t_m_spWater2; + glDisable(GL_CULL_FACE); + glDepthMask(GL_FALSE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); + glClearColor(0, 0, 0, 0); + glClear(GL_COLOR_BUFFER_BIT); + t_m_spWater2->Bind(); + float radius = 3.f; + + glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(1.0f, 0.0f))); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Width); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glBindVertexArray(m_ScreenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + + //blur2 + shaderProgramHandle = *t_m_spWater2; + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDepthMask(GL_FALSE); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); + t_m_spWater2->Bind(); + + glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(0.0f, 1.0f))); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); + glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glBindVertexArray(m_ScreenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); +} + + + +GLuint dd::Renderer::CreateWaterParticleVAO(RenderQueue &particles) +{ + float waterVerts[particles.Size()]; + int i = 0; + + for ( auto &job : particles ) { + auto waterJob = std::dynamic_pointer_cast(job); + if (!waterJob) + continue; + waterVerts[i ] = waterJob->Position.x; + waterVerts[i+1] = waterJob->Position.y; + waterVerts[i+2] = waterJob->Position.z; + i+3; + } + + GLuint vbo[1], vao; + glGenBuffers(1, vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); + glBufferData(GL_ARRAY_BUFFER, 3 * particles.Size() * sizeof(float), waterVerts, GL_STATIC_DRAW); + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); + glEnableVertexAttribArray(0); + + glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + return vao; +} + GLuint dd::Renderer::CreateQuad() { float quadVertices[] = @@ -472,4 +666,64 @@ void dd::Renderer::DebugKeys() if (glfwGetKey(m_Window, GLFW_KEY_F6)) { m_CurrentScreenBuffer = m_tLighting; } + if (glfwGetKey(m_Window, GLFW_KEY_F7)) { + m_CurrentScreenBuffer = t_m_Gwater; + } + if (glfwGetKey(m_Window, GLFW_KEY_F8)) { + m_CurrentScreenBuffer = t_m_BWater; + } +} + +void dd::Renderer::DrawGUI(dd::RenderQueue& rq) +{ + glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); + glDisable(GL_CULL_FACE); + glCullFace(GL_BACK); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + //glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); + + m_spScreen->Bind(); + + glm::mat4 MVP; + + for (auto &job : rq) { + auto frameJob = std::dynamic_pointer_cast(job); + if (frameJob) { + FrameJob jobCopy = *(frameJob.get()); + glm::mat4 viewMatrix = glm::mat4(1); //frameJob->ViewMatrix; + glm::mat4 PV = glm::mat4(1); //frameJob->ProjectionMatrix * viewMatrix; + glm::mat4 modelMatrix = glm::mat4(1); //frameJob->ModelMatrix; + MVP = PV * modelMatrix; + glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "MVP"), 1, GL_FALSE, glm::value_ptr(MVP)); + glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "M"), 1, GL_FALSE, glm::value_ptr(modelMatrix)); + glUniformMatrix4fv(glGetUniformLocation(*m_spScreen, "V"), 1, GL_FALSE, glm::value_ptr(viewMatrix)); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, frameJob->DiffuseTexture); + //glActiveTexture(GL_TEXTURE1); + //glBindTexture(GL_TEXTURE_2D, frameJob->NormalTexture); + //glActiveTexture(GL_TEXTURE2); + //glBindTexture(GL_TEXTURE_2D, frameJob->SpecularTexture); + + Rectangle& vp = frameJob->Viewport; + glViewport(vp.X, m_Resolution.Height - vp.Y - vp.Height, vp.Width, vp.Height); + Rectangle& sc = frameJob->Scissor; + if (sc == Rectangle()) { + glDisable(GL_SCISSOR_TEST); + } else { + glEnable(GL_SCISSOR_TEST); + glScissor(sc.X, m_Resolution.Height - sc.Y - sc.Height, sc.Width, sc.Height); + } + + glBindVertexArray(m_ScreenQuad); + glDrawArrays(GL_TRIANGLES, 0, 6); + + continue; + } + } + + glDisable(GL_SCISSOR_TEST); + glViewport(0, 0, m_Resolution.Width, m_Resolution.Height); } diff --git a/src/game/Core/Shaders/Deferred/1/Fragment.glsl b/src/game/Core/Shaders/Deferred/1/Fragment.glsl old mode 100644 new mode 100755 index 927a681..8f7dbed --- a/src/game/Core/Shaders/Deferred/1/Fragment.glsl +++ b/src/game/Core/Shaders/Deferred/1/Fragment.glsl @@ -24,6 +24,7 @@ layout (binding = 2) uniform sampler2D SpecularMap; uniform mat4 V; uniform float MaterialShininess; +uniform vec4 Color; in VertexData { @@ -49,6 +50,7 @@ void main() { // Diffuse Texture GDiffuse = texture(DiffuseTexture, Input.TextureCoord) * Input.DiffuseColor; + GDiffuse = GDiffuse * Color; // G-buffer Position GPosition = vec4(Input.Position.xyz, 1.0); diff --git a/src/game/Core/Shaders/Deferred/water/Fragment.glsl b/src/game/Core/Shaders/Deferred/water/Fragment.glsl new file mode 100755 index 0000000..dc9d544 --- /dev/null +++ b/src/game/Core/Shaders/Deferred/water/Fragment.glsl @@ -0,0 +1,90 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#version 440 + +layout (binding=0) uniform sampler2D DiffuseTexture; +layout (binding=1) uniform sampler2D NormalMap; +layout (binding=2) uniform sampler2D SpecularMap; + +uniform mat4 MVP; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; +uniform vec3 LightPosition; +uniform float LightRadius; +uniform vec3 LightSpecular; +uniform vec3 LightDiffuse; + +in VertexData +{ + vec3 Position; + vec3 Normal; + vec3 Tangent; + vec3 BiTangent; + vec2 TextureCoord; + vec4 DiffuseColor; + vec4 SpecularColor; + vec4 BoneIndices1; + vec4 BoneIndices2; + vec4 BoneWeights1; + vec4 BoneWeights2; +} Input; + +out vec4 frag_Diffuse; + +vec4 phong(vec3 position, vec3 normal, vec3 specular, float specularExponent) +{ + // Diffuse + vec3 lightPos = vec3(V * vec4(LightPosition, 1.0)); + vec3 distanceToLight = lightPos - position; + vec3 directionToLight = normalize(distanceToLight); + float dotProd = dot(directionToLight, normal); + dotProd = max(dotProd, 0.0); + vec3 Idiffuse = LightDiffuse * dotProd; + + // Specular + //vec3 reflection = reflect(-directionToLight, normal); + vec3 surfaceToViewer = normalize(-position); + vec3 halfWay = normalize(surfaceToViewer + directionToLight); + float dotSpecular = max(dot(halfWay, normal), 0.0); + float specularFactor = pow(dotSpecular, specularExponent); + vec3 Ispecular = specular * LightSpecular * specularFactor; + + //Attenuation + float dist = distance(lightPos, position); + //float attenuation = 1.0 - pow(dist / LightRadius, 2); + float attenuation = pow(max(0.0f, 1.0 - (dist / LightRadius)), 2); + + return vec4((Idiffuse + Ispecular) * attenuation, 1.0); +} + +void main() +{ + vec4 normalTexel = texture(NormalMap, Input.TextureCoord); + mat3 TBN = mat3(Input.Tangent, Input.BiTangent, Input.Normal); + vec3 normal = normalize(vec4(TBN * normalTexel.xyz, 0.0).xyz); + + vec4 specularTexel = texture(SpecularMap, Input.TextureCoord); + + vec4 diffuseTexel = texture(DiffuseTexture, Input.TextureCoord); + vec4 La = vec4(0.3, 0.3, 0.3, 1.0); + vec4 light = phong(Input.Position, normalize(normal), specularTexel.rgb, specularTexel.a); + //frag_Diffuse = light; + frag_Diffuse = diffuseTexel; +} \ No newline at end of file diff --git a/src/game/Core/Shaders/Deferred/water/Vertex.glsl b/src/game/Core/Shaders/Deferred/water/Vertex.glsl new file mode 100755 index 0000000..64a9e26 --- /dev/null +++ b/src/game/Core/Shaders/Deferred/water/Vertex.glsl @@ -0,0 +1,83 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#version 440 + +uniform mat4 MVP; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; +uniform mat4 Bones[100]; + +layout (location = 0) in vec3 Position; +layout (location = 1) in vec3 Normal; +layout (location = 2) in vec3 Tangent; +layout (location = 3) in vec3 BiTangent; +layout (location = 4) in vec2 TextureCoord; +layout (location = 5) in vec4 DiffuseColor; +layout (location = 6) in vec4 SpecularColor; +layout (location = 7) in vec4 BoneIndices1; +layout (location = 8) in vec4 BoneIndices2; +layout (location = 9) in vec4 BoneWeights1; +layout (location = 10) in vec4 BoneWeights2; + +out VertexData +{ + vec3 Position; + vec3 Normal; + vec3 Tangent; + vec3 BiTangent; + vec2 TextureCoord; + vec4 DiffuseColor; + vec4 SpecularColor; + vec4 BoneIndices1; + vec4 BoneIndices2; + vec4 BoneWeights1; + vec4 BoneWeights2; +} Output; + +void main() +{ + mat4 boneTransform = mat4(1); + if (length(BoneWeights1 + BoneWeights2) > 0) { + boneTransform = BoneWeights1[0] * Bones[int(BoneIndices1[0])] + + BoneWeights1[1] * Bones[int(BoneIndices1[1])] + + BoneWeights1[2] * Bones[int(BoneIndices1[2])] + + BoneWeights1[3] * Bones[int(BoneIndices1[3])] + + BoneWeights2[0] * Bones[int(BoneIndices2[0])] + + BoneWeights2[1] * Bones[int(BoneIndices2[1])] + + BoneWeights2[2] * Bones[int(BoneIndices2[2])] + + BoneWeights2[3] * Bones[int(BoneIndices2[3])]; + } + + //gl_Position = MVP * boneTransform * vec4(Position, 1.0); + gl_Position = MVP * vec4(Position, 1.0); + + //TODO: Make sure that boneTransform works here. + Output.Position = (V * M * boneTransform * vec4(Position, 1.0)).xyz; + Output.Normal = (inverse(transpose(V * M)) * boneTransform * vec4(Normal, 0.0)).xyz; + Output.Tangent = Tangent; + Output.BiTangent = BiTangent; + Output.TextureCoord = TextureCoord; + Output.DiffuseColor = DiffuseColor; + Output.SpecularColor = SpecularColor; + Output.BoneIndices1 = BoneIndices1; + Output.BoneIndices2 = BoneIndices2; + Output.BoneWeights1 = BoneWeights1; + Output.BoneWeights2 = BoneWeights2; +} \ No newline at end of file diff --git a/src/game/Core/Shaders/Deferred/water2/Fragment.glsl b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl new file mode 100755 index 0000000..b82af8f --- /dev/null +++ b/src/game/Core/Shaders/Deferred/water2/Fragment.glsl @@ -0,0 +1,70 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#version 440 + +uniform vec2 dir; +uniform float res; +uniform float radius; + +layout (binding=0) uniform sampler2D WaterTexture; + +in VertexData +{ + vec3 Position; + vec2 TextureCoord; +} Input; + +out vec4 frag_Diffuse; + +void main() +{ + vec4 WaterTexel = texture(WaterTexture, Input.TextureCoord); + + vec4 sum = vec4(0.0); + vec2 tc = Input.TextureCoord; + + //How much blur, 1 = blur by one pixel. + float blur = radius/res; + + float hstep = dir.x; + float vstep = dir.y; + + float Threshhold = 0.1; + + //apply filter using a 9 tap filter with predefined gaussian weights + + sum += texture(WaterTexture, vec2(tc.x - 4.0*blur*hstep, tc.y - 4.0*blur*vstep)) * 0.0162162162; + sum += texture(WaterTexture, vec2(tc.x - 3.0*blur*hstep, tc.y - 3.0*blur*vstep)) * 0.0540540541; + sum += texture(WaterTexture, vec2(tc.x - 2.0*blur*hstep, tc.y - 2.0*blur*vstep)) * 0.1216216216; + sum += texture(WaterTexture, vec2(tc.x - 1.0*blur*hstep, tc.y - 1.0*blur*vstep)) * 0.1945945946; + + sum += texture(WaterTexture, vec2(tc.x, tc.y)) * 0.2270270270; + + sum += texture(WaterTexture, vec2(tc.x + 1.0*blur*hstep, tc.y + 1.0*blur*vstep)) * 0.1945945946; + sum += texture(WaterTexture, vec2(tc.x + 2.0*blur*hstep, tc.y + 2.0*blur*vstep)) * 0.1216216216; + sum += texture(WaterTexture, vec2(tc.x + 3.0*blur*hstep, tc.y + 3.0*blur*vstep)) * 0.0540540541; + sum += texture(WaterTexture, vec2(tc.x + 4.0*blur*hstep, tc.y + 4.0*blur*vstep)) * 0.0162162162; + + frag_Diffuse = vec4(sum.rgb, 1.0) * vec4(0.0, 0.6, 1.5, 1.0); + float avgColor = frag_Diffuse.r + frag_Diffuse.g + frag_Diffuse.b; + avgColor = avgColor/3; + if ( avgColor*dir.y > Threshhold ){ + frag_Diffuse = vec4(0.0, 0.3, 1.0, 1.0); + } +} \ No newline at end of file diff --git a/src/game/Core/Shaders/Deferred/water2/Vertex.glsl b/src/game/Core/Shaders/Deferred/water2/Vertex.glsl new file mode 100755 index 0000000..08bb198 --- /dev/null +++ b/src/game/Core/Shaders/Deferred/water2/Vertex.glsl @@ -0,0 +1,34 @@ +/* + This file is part of Daydream Engine. + Copyright 2014 Adam Byléhn, Tobias Dahl, Simon Holmberg, Viktor Ljung + + Daydream Engine is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Daydream Engine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Daydream Engine. If not, see . +*/ + +#version 440 + +layout (location = 0) in vec3 Position; + +out VertexData +{ + vec3 Position; + vec2 TextureCoord; +} Output; + +void main() +{ + gl_Position = vec4(Position, 1.0); + Output.Position = Position; + Output.TextureCoord = (vec2(Position) + 1) / 2; +} \ No newline at end of file diff --git a/src/game/Core/Texture.cpp b/src/game/Core/Texture.cpp index f9ba46e..8fb8b33 100755 --- a/src/game/Core/Texture.cpp +++ b/src/game/Core/Texture.cpp @@ -31,6 +31,9 @@ dd::Texture::Texture(std::string path) } } + this->Width = image->Width; + this->Height = image->Height; + GLint format; switch (image->Format) { case Image::ImageFormat::RGB: diff --git a/src/game/Game/BallSystem.cpp b/src/game/Game/BallSystem.cpp index 97958ca..37df50a 100644 --- a/src/game/Game/BallSystem.cpp +++ b/src/game/Game/BallSystem.cpp @@ -60,9 +60,10 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) return false; } - //Which is the ball? + EntityID ballEntity, otherEntitiy; + //Which is the ball? if (ballComponent1 != nullptr) { ballEntity = event.Entity1; otherEntitiy = event.Entity2; @@ -78,6 +79,8 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) //TODO: Add support for power-up collisions } + //if this is a brick thats dead do not collide :) + auto ballTransform = m_World->GetComponent(ballEntity); glm::vec2 ballVelocity = glm::vec2(ballTransform->Velocity.x, ballTransform->Velocity.y); @@ -85,7 +88,6 @@ bool dd::Systems::BallSystem::Contact(const Events::Contact &event) auto padTransform = m_World->GetComponent(otherEntitiy); float x = ballTransform->Position.x - padTransform->Position.x; - float movementMultiplier = 5.0f; float y = glm::cos((abs(x) / (1.6f)) * glm::pi() / 2.f) + 1.f; ballTransform->Velocity = glm::normalize(glm::vec3(x, y ,0.f)) * ballComponent->Speed; diff --git a/src/game/Game/LevelSystem.cpp b/src/game/Game/LevelSystem.cpp index 86451b3..4f28c01 100755 --- a/src/game/Game/LevelSystem.cpp +++ b/src/game/Game/LevelSystem.cpp @@ -72,10 +72,10 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID if (transformBall->Position.y < -EdgeY() - 4) { if (MultiBalls() != 0) { SetMultiBalls(MultiBalls() - 1); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); } else if (Lives() == PastLives()) { Events::ResetBall be; @@ -107,8 +107,8 @@ void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID auto life = m_World->GetComponent(entity); if (life != nullptr) { if (life->Number + 1 == PastLives()) { - m_World->RemoveComponent(entity); - m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); m_World->RemoveEntity(entity); SetPastLives(Lives()); } @@ -170,11 +170,15 @@ void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBe { auto brick = m_World->CreateEntity(); std::shared_ptr transform = m_World->AddComponent(brick); - //std::shared_ptr sprite = m_World->AddComponent(brick); auto model = m_World->AddComponent(brick); std::shared_ptr cBrick = m_World->AddComponent(brick); std::shared_ptr cRec = m_World->AddComponent(brick); std::shared_ptr cPhys = m_World->AddComponent(brick); + cPhys->Static = false; + cPhys->GravityScale = 0.f; + cPhys->Category = CollisionLayer::Type::Brick; + cPhys->Mask = CollisionLayer::Type::Ball; + std::string fileName = "Textures/Bricks/"; fileName.append(std::to_string(num)); fileName.append(".png"); @@ -261,11 +265,29 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) if (ball != nullptr && Restarting() == false) { auto ballTransform = m_World->GetComponent(entityBall); - m_World->RemoveComponent(entityBrick); - m_World->RemoveComponent(entityBrick); - m_World->RemoveComponent(entityBrick); - m_World->RemoveComponent(entityBrick); - m_World->RemoveEntity(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveEntity(entityBrick); + + auto physicsComponent = m_World->GetComponent(entityBrick); + physicsComponent->GravityScale = 1.f; + physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; + + auto transformComponentBrick = m_World->GetComponent(entityBrick); + auto transformComponentBall = m_World->GetComponent(entityBall); + + Events::SetImpulse e; + e.Entity = entityBrick; + + glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentBall->Position.x - transformComponentBrick->Position.x )/4), + transformComponentBrick->Position.y + ((transformComponentBall->Position.y - transformComponentBrick->Position.y)/4)); + + e.Impulse = glm::normalize(point)*5.f;///2.f; + e.Point = point; + EventBroker->Publish(e); + //TODO: Bricks dont collide with walls D= SetNumberOfBricks(NumberOfBricks() - 1); if (NumberOfBricks() <= 0) { @@ -275,7 +297,7 @@ bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) es.Score = brick->Score; EventBroker->Publish(es); - //std::cout << NumberOfBricks() << std::endl; + // std::cout << NumberOfBricks() << std::endl; //std::cout << "Score: " << Score() << std::endl; } @@ -309,8 +331,12 @@ bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp & auto model = m_World->AddComponent(powerUp); std::shared_ptr cRec = m_World->AddComponent(powerUp); std::shared_ptr cPhys = m_World->AddComponent(powerUp); - std::shared_ptr cPow = m_World->AddComponent(powerUp); cPhys->Static = false; + cPhys->Category = CollisionLayer::Type::PowerUp; + cPhys->Mask = CollisionLayer::Type::Pad; + + std::shared_ptr cPow = m_World->AddComponent(powerUp); + transform->Position = event.Position; transform->Scale = glm::vec3(0.2, 0.2, 0.2); diff --git a/src/game/Game/LevelSystem.cpp.orig b/src/game/Game/LevelSystem.cpp.orig new file mode 100644 index 0000000..b1d1139 --- /dev/null +++ b/src/game/Game/LevelSystem.cpp.orig @@ -0,0 +1,372 @@ +// +// Created by Adniklastrator on 2015-09-09. +// + + +#include "PrecompiledHeader.h" +#include "Game/LevelSystem.h" + + +void dd::Systems::LevelSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EContact, LevelSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_ELifeLost, LevelSystem::OnLifeLost); + EVENT_SUBSCRIBE_MEMBER(m_EScoreEvent, LevelSystem::OnScoreEvent); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, LevelSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_ECreatePowerUp, LevelSystem::OnCreatePowerUp); + EVENT_SUBSCRIBE_MEMBER(m_EPowerUpTaken, LevelSystem::OnPowerUpTaken); + EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, LevelSystem::OnStageCleared); + + for (int i = 0; i < Lives(); i++) { + CreateLife(i); + } + + return; +} + +void dd::Systems::LevelSystem::CreateLife(int number) +{ + auto life = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(life); + transform->Position = glm::vec3(-1.5f + number * 0.15f, -2.f, -5.f); + transform->Scale = glm::vec3(0.1f, 0.1f, 0.1f); + + std::shared_ptr lifeNr = m_World->AddComponent(life); + lifeNr->Number = number; + + auto model = m_World->AddComponent(life); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + + + m_World->CommitEntity(life); +} + +void dd::Systems::LevelSystem::Update(double dt) +{ + if (!m_Initialized) { + CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + m_Initialized = true; + } + + if (Lives() < 0) + { + SetLives(3); + Events::GameOver e; + EventBroker->Publish(e); + } +} + +void dd::Systems::LevelSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto ball = m_World->GetComponent(entity); + + if (ball != nullptr) { + auto transformBall = m_World->GetComponent(entity); + if (glm::abs(transformBall->Velocity.y) < 2) { + if (transformBall->Velocity.y > 0) { + transformBall->Velocity.y = 2; + } else { + transformBall->Velocity.y = -2; + } + } + if (transformBall->Position.y < -EdgeY() - 4) { + if (MultiBalls() != 0) { + SetMultiBalls(MultiBalls() - 1); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + } else if (Lives() == PastLives()) { + Events::ResetBall be; + EventBroker->Publish(be); + Events::LifeLost e; + e.Entity = entity; + EventBroker->Publish(e); + return; + } + } else if (transformBall->Position.x > EdgeX()) { + if (transformBall->Velocity.x > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.x < -EdgeX()) { + if (transformBall->Velocity.x < 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(-1, 0)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } else if (transformBall->Position.y > EdgeY()) { + if (transformBall->Velocity.y > 0) { + glm::vec2 reflectedVelocity = glm::reflect(glm::vec2(transformBall->Velocity.x, transformBall->Velocity.y), glm::vec2(0, 1)); + transformBall->Velocity = glm::vec3(reflectedVelocity, 0.f); + } + } + } + + if (Lives() != PastLives()) { + auto life = m_World->GetComponent(entity); + if (life != nullptr) { + if (life->Number + 1 == PastLives()) { +// m_World->RemoveComponent(entity); +// m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + SetPastLives(Lives()); + } + } + } + if (NumberOfBricks() <= 0) { + /*SetRestarting(true); + if (MultiBalls() <= 0 && PowerUps() <= 0) { + Events::ResetBall e; + EventBroker->Publish(e); + Events::ScoreEvent es; + es.Score = 500; + EventBroker->Publish(es); + Events::StageCleared ec; + EventBroker->Publish(ec); + CreateBasicLevel(Rows(), Lines(), SpaceBetweenBricks(), SpaceToEdge()); + } else { + if (ball != nullptr && MultiBalls() > 0) { + SetMultiBalls(MultiBalls() - 1); + m_World->RemoveComponent(entity); + m_World->RemoveComponent(entity); + m_World->RemoveComponent(entity); + m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + auto transformBall = m_World->GetComponent(entity); + } else { + auto powerUp = m_World->GetComponent(entity); + if (powerUp != nullptr) { + SetPowerUps(PowerUps() - 1); + m_World->RemoveComponent(entity); + m_World->RemoveComponent(entity); + m_World->RemoveEntity(entity); + } + } + }*/ + } +} + +void dd::Systems::LevelSystem::CreateBasicLevel(int rows, int lines, glm::vec2 spacesBetweenBricks, float spaceToEdge) +{ + SetNumberOfBricks(rows * lines); + std::cout << "You're only doing this once, right?" << std::endl; + int num = 0; + for (int i = 0; i < rows; i++) { + num++; + for (int j = 0; j < Lines(); j++) { + CreateBrick(i, j, spacesBetweenBricks, spaceToEdge, num); + } + if (num == 7) + num = 0; + } + + SetNumberOfBricks(rows * lines); + SetRestarting(false); + return; +} + +void dd::Systems::LevelSystem::CreateBrick(int row, int line, glm::vec2 spacesBetweenBricks, float spaceToEdge, int num) +{ + auto brick = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(brick); + auto model = m_World->AddComponent(brick); + std::shared_ptr cBrick = m_World->AddComponent(brick); + std::shared_ptr cRec = m_World->AddComponent(brick); + std::shared_ptr cPhys = m_World->AddComponent(brick); + cPhys->Static = false; + cPhys->GravityScale = 0.f; + cPhys->Category = CollisionLayer::Type::Brick; + cPhys->Mask = CollisionLayer::Type::Ball; + + std::string fileName = "Textures/Bricks/"; + fileName.append(std::to_string(num)); + fileName.append(".png"); + //sprite->SpriteFile = fileName; + model->ModelFile = "Models/Test/Brick/Brick.obj"; + if ((line == 1 && row == 4) || (line == 3 && row == 2) || (line == 6 && row == 6)) { + std::shared_ptr cPow = m_World->AddComponent(brick); + } + float x = line * spacesBetweenBricks.x; + float y = row * spacesBetweenBricks.y; + transform->Scale = glm::vec3(0.8, 0.2, 0.2); + transform->Position = glm::vec3(x - 3, 5 - spaceToEdge - y , -10.f); + cBrick->Score = 10 * num; + + //sound + auto collisionSound = m_World->AddComponent(brick); + collisionSound->filePath = "Sounds/Brick/shortbrickbreak.wav"; + + m_World->CommitEntity(brick); + return; +} + +void dd::Systems::LevelSystem::ProcessCollision() +{ + // Like, go into brick component and check what it does upon collision. Maybe not done here? + return; +} + +void dd::Systems::LevelSystem::OnEntityRemoved(EntityID entity) +{ + auto brick = m_World->GetComponent(entity); + if (brick != nullptr) { + SetNumberOfBricks(NumberOfBricks() - 1); + Events::ScoreEvent es; + es.Score = brick->Score; + EventBroker->Publish(es); + /*if (numberOfBricks < 1) { + EndLevel(); + }*/ + } + return; +} + +bool dd::Systems::LevelSystem::OnContact(const dd::Events::Contact &event) +{ + EntityID entityBrick; + EntityID entityBall; + auto ball = m_World->GetComponent(event.Entity2); + auto brick = m_World->GetComponent(event.Entity1); + if (brick != nullptr) { + entityBrick = event.Entity1; + } else { + brick = m_World->GetComponent(event.Entity2); + if (brick != nullptr) { + entityBrick = event.Entity2; + } else { + return false; + } + } + if (ball != nullptr) { + entityBall = event.Entity2; + } else { + ball = m_World->GetComponent(event.Entity1); + if (ball != nullptr) { + entityBall = event.Entity1; + } else { + return false; + } + } + + brick = m_World->GetComponent(entityBrick); + if (brick == nullptr) { + return false; + } + + auto power = m_World->GetComponent(entityBrick); + if (power != nullptr) { + Events::CreatePowerUp e; + auto transform = m_World->GetComponent(entityBrick); + e.Position = transform->Position; + EventBroker->Publish(e); + } + + if (ball != nullptr && Restarting() == false) { + auto ballTransform = m_World->GetComponent(entityBall); + +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveComponent(entityBrick); +// m_World->RemoveEntity(entityBrick); + + auto physicsComponent = m_World->GetComponent(entityBrick); + physicsComponent->GravityScale = 1.f; + physicsComponent->Mask = CollisionLayer::Type::Water | CollisionLayer::Type::Wall; + + auto transformComponentBrick = m_World->GetComponent(entityBrick); + auto transformComponentBall = m_World->GetComponent(entityBall); + + Events::SetImpulse e; + e.Entity = entityBrick; + + glm::vec2 point = glm::vec2(transformComponentBrick->Position.x + ((transformComponentBrick->Position.x - transformComponentBall->Position.x)/4), transformComponentBrick->Position.y + ((transformComponentBrick->Position.y - transformComponentBall->Position.y )/4)); + + e.Impulse = glm::normalize(point)/2.f; + e.Point = point; + EventBroker->Publish(e); + //TODO: Bricks dont collide with walls D= + + SetNumberOfBricks(NumberOfBricks() - 1); + if (NumberOfBricks() <= 0) { + SetMultiBalls(MultiBalls() + 1); + } + Events::ScoreEvent es; + es.Score = brick->Score; + EventBroker->Publish(es); + +<<<<<<< HEAD + // std::cout << NumberOfBricks() << std::endl; +======= + //std::cout << NumberOfBricks() << std::endl; +>>>>>>> origin/master + //std::cout << "Score: " << Score() << std::endl; + } + + return true; +} + +bool dd::Systems::LevelSystem::OnLifeLost(const dd::Events::LifeLost &event) +{ + SetLives(Lives() - 1); + + return true; +} + +bool dd::Systems::LevelSystem::OnScoreEvent(const dd::Events::ScoreEvent &event) +{ + SetScore(Score() += event.Score); + + return true; +} + +bool dd::Systems::LevelSystem::OnMultiBall(const dd::Events::MultiBall &event) +{ + SetMultiBalls(MultiBalls()+2); +} + +bool dd::Systems::LevelSystem::OnCreatePowerUp(const dd::Events::CreatePowerUp &event) +{ + SetPowerUps(PowerUps() + 1); + auto powerUp = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(powerUp); + auto model = m_World->AddComponent(powerUp); + std::shared_ptr cRec = m_World->AddComponent(powerUp); + std::shared_ptr cPhys = m_World->AddComponent(powerUp); + cPhys->Static = false; + cPhys->Category = CollisionLayer::Type::PowerUp; + cPhys->Mask = CollisionLayer::Type::Pad; + + std::shared_ptr cPow = m_World->AddComponent(powerUp); + + + transform->Position = event.Position; + transform->Scale = glm::vec3(0.2, 0.2, 0.2); + transform->Velocity = glm::vec3(0, -4, 0); + + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + + m_World->CommitEntity(powerUp); + + return true; +} + +bool dd::Systems::LevelSystem::OnPowerUpTaken(const dd::Events::PowerUpTaken &event) +{ + SetPowerUps(PowerUps() - 1); + return true; +} + +bool dd::Systems::LevelSystem::OnStageCleared(const dd::Events::StageCleared &event) +{ + return true; +} + +void dd::Systems::LevelSystem::EndLevel() +{ + Events::StageCleared e; + EventBroker->Publish(e); + return; +} + diff --git a/src/game/Game/PadSystem.cpp b/src/game/Game/PadSystem.cpp index 0b3b252..3241b28 100755 --- a/src/game/Game/PadSystem.cpp +++ b/src/game/Game/PadSystem.cpp @@ -72,6 +72,7 @@ void dd::Systems::PadSystem::Update(double dt) transform->Velocity += acceleration * (float)dt; transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; + if (Left()) { acceleration.x = -pad->AccelerationSpeed; } else if (Right()) { @@ -108,7 +109,9 @@ EntityID dd::Systems::PadSystem::CreateBall() std::shared_ptr cball = m_World->AddComponent(ent); std::shared_ptr physics = m_World->AddComponent(ent); physics->Static = false; - + physics->Category = CollisionLayer::Type::Ball; + physics->Mask = CollisionLayer::Type::Pad | CollisionLayer::Type::Brick | CollisionLayer::Type::Wall; + physics->Calculate = true; cball->Speed = 5.f; m_World->CommitEntity(ent); @@ -188,10 +191,9 @@ bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2)+ 0.2; - //std::cout << movementX << " " << movementY << std::endl; - float len = glm::length(transformBall->Velocity); + //auto pointlight = m_World->AddComponent(ent); transformBall->Velocity += glm::vec3(transformPad->Velocity.x, 0, 0); @@ -234,9 +236,9 @@ bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) return false; } - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); - m_World->RemoveComponent(entityPower); +// m_World->RemoveComponent(entityPower); +// m_World->RemoveComponent(entityPower); +// m_World->RemoveComponent(entityPower); m_World->RemoveEntity(entityPower); Events::PowerUpTaken ep; ep.Name = "Something"; diff --git a/src/game/Game/PadSystem.cpp.orig b/src/game/Game/PadSystem.cpp.orig new file mode 100755 index 0000000..7d21606 --- /dev/null +++ b/src/game/Game/PadSystem.cpp.orig @@ -0,0 +1,313 @@ +// +// Created by Adniklastrator on 2015-09-10. +// + +#include "PrecompiledHeader.h" +#include "Game/PadSystem.h" +#include "Core/World.h" +#include +#include +#include + + +void dd::Systems::PadSystem::Initialize() +{ + Events::BindKey r; + r.KeyCode = GLFW_KEY_RIGHT; + r.Command = "right"; + EventBroker->Publish(r); + + Events::BindKey l; + l.KeyCode = GLFW_KEY_LEFT; + l.Command = "left"; + EventBroker->Publish(l); + + EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &PadSystem::OnKeyDown); + EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &PadSystem::OnKeyUp); + EVENT_SUBSCRIBE_MEMBER(m_EContact, &PadSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_EContactPowerUp, &PadSystem::OnContactPowerUp); + EVENT_SUBSCRIBE_MEMBER(m_EResetBall, &PadSystem::OnResetBall); + EVENT_SUBSCRIBE_MEMBER(m_EMultiBall, &PadSystem::OnMultiBall); + EVENT_SUBSCRIBE_MEMBER(m_EStageCleared, &PadSystem::OnStageCleared); +} + +void dd::Systems::PadSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto ball = m_World->GetComponent(entity); + if (ball != nullptr) { + if (ReplaceBall() == true) { + SetReplaceBall(false); + + auto transform = m_World->GetComponent(entity); + transform->Position = glm::vec3(0.0f, 0.26f, -10.f); + transform->Velocity = glm::vec3(0.0f, -ball->Speed, 0.f); + } + } +} + +void dd::Systems::PadSystem::Update(double dt) +{ + if (Entity() == 0) { + for (auto it = m_World->GetEntities()->begin(); it != m_World->GetEntities()->end(); it++) { + if (m_World->GetProperty(it->first, "Name") == "Pad") { + SetEntity(it->first); + SetTransform(m_World->GetComponent(Entity())); + SetPad(m_World->GetComponent(Entity())); + break; + } + } + } + + auto transform = Transform(); + auto pad = Pad(); + auto acceleration = Acceleration(); + + if (transform->Velocity.x < -pad->MaxSpeed) { + transform->Velocity.x = -pad->MaxSpeed; + } + else if (transform->Velocity.x > pad->MaxSpeed) { + transform->Velocity.x = pad->MaxSpeed; + } + transform->Position += transform->Velocity * (float)dt; + transform->Velocity += acceleration * (float)dt; + transform->Velocity -= transform->Velocity * pad->SlowdownModifier * (float)dt; + + + if (Left()) { + acceleration.x = -pad->AccelerationSpeed; +<<<<<<< HEAD + } + else if (Right()) { +======= + } else if (Right()) { +>>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db + acceleration.x = pad->AccelerationSpeed; + } else { + acceleration.x = 0.f; + } + + SetTransform(transform); + SetPad(pad); + SetAcceleration(acceleration); + + if (MultiBall() == true) { + SetMultiBall(false); + + Events::MultiBall e; + e.padTransform = transform; + EventBroker->Publish(e); + } + + return; +} + +EntityID dd::Systems::PadSystem::CreateBall() +{ + auto ent = m_World->CreateEntity(); + std::shared_ptr transform = m_World->AddComponent(ent); + transform->Position = glm::vec3(0.5f, 0.26f, -10.f); + transform->Scale = glm::vec3(0.5f, 0.5f, 0.5f); + auto model = m_World->AddComponent(ent); + model->ModelFile = "Models/Test/Ball/Ballopus.obj"; + //auto pointlight = m_World->AddComponent(ent); + std::shared_ptr circleShape = m_World->AddComponent(ent); + std::shared_ptr cball = m_World->AddComponent(ent); + std::shared_ptr physics = m_World->AddComponent(ent); + physics->Static = false; + + cball->Speed = 10; + + m_World->CommitEntity(ent); + + return ent; +} + +bool dd::Systems::PadSystem::OnKeyDown(const dd::Events::KeyDown &event) +{ + int val = event.KeyCode; + if (val == GLFW_KEY_UP) { + //std::cout << "Up!" << std::endl; + } else if (val == GLFW_KEY_DOWN) { + //std::cout << "Down!" << std::endl; + } else if (val == GLFW_KEY_LEFT) { + //std::cout << "Left!" << std::endl; + //acceleration.x = -0.01f; + SetLeft(true); + } else if (val == GLFW_KEY_RIGHT) { + //std::cout << "Right!" << std::endl; + //acceleration.x = 0.01f; + SetRight(true); + } else if (val == GLFW_KEY_R) { + SetReplaceBall(true); + } else if (val == GLFW_KEY_M) { + SetMultiBall(true); + } else if (val == GLFW_KEY_D) { + return false; + } + return true; +} + +bool dd::Systems::PadSystem::OnKeyUp(const dd::Events::KeyUp &event) +{ + int val = event.KeyCode; + if (val == GLFW_KEY_UP) { + + } else if (val == GLFW_KEY_DOWN) { + + } else if (val == GLFW_KEY_LEFT) { + SetLeft(false); + } else if (val == GLFW_KEY_RIGHT) { + SetRight(false); + } + return true; +} + +bool dd::Systems::PadSystem::OnContact(const dd::Events::Contact &event) +{ + /* + EntityID entityBall = event.Entity2; + auto ball = m_World->GetComponent(entityBall); + if (ball == NULL) { + return false; + } + EntityID entityPad = event.Entity1; + auto pad = m_World->GetComponent(entityPad); + if (pad == NULL) { + return false; + } + auto transformBall = m_World->GetComponent(entityBall); + auto transformPad = m_World->GetComponent(entityPad); + + float movementMultiplier = 0.5f; + + //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; + //float movementY = glm::cos((abs(movementX) / (3.2f * movementMultiplier)) * 3.14159265359f / 2) * 2.f; + if (whatX > 0) { + movementX = movementMultiplier * whatX; + //std::cout << "Right!" << std::endl; + } else { + movementX = movementMultiplier * whatX; + //std::cout << "Left!" << std::endl; + } + + // std::cout << movementX << " " << movementY << std::endl; + + //float movementX = (event.ContactPoint.x - transformPad->Position.x) * movementMultiplier; +<<<<<<< HEAD + float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2) + 1; +======= + float movementY = glm::cos((abs(movementX) / ((1.6f) * movementMultiplier)) * 3.14159265359f / 2)+ 0.2; +>>>>>>> 72413dc0a93bd3a2f6ab9fa7e19bbc3b846232db + + //std::cout << movementX << " " << movementY << std::endl; + + float len = glm::length(transformBall->Velocity); + //auto pointlight = m_World->AddComponent(ent); + + + transformBall->Velocity += glm::vec3(transformPad->Velocity.x, 0, 0); + transformBall->Velocity = glm::normalize(transformBall->Velocity) * len; + + + //transform->Velocity = glm::vec3(movementX, movementY, 0.f); + */ +} + +bool dd::Systems::PadSystem::OnContactPowerUp(const dd::Events::Contact &event) +{ + EntityID entityPower; + EntityID entityPad; + auto powerUp = m_World->GetComponent(event.Entity1); + auto pad = m_World->GetComponent(event.Entity2); + if (powerUp != nullptr) { + entityPower = event.Entity1; + } else { + powerUp = m_World->GetComponent(event.Entity2); + if (powerUp != nullptr) { + entityPower = event.Entity2; + } + } + if (pad != nullptr) { + entityPad = event.Entity2; + } else { + pad = m_World->GetComponent(event.Entity1); + if (pad != nullptr) { + entityPad = event.Entity1; + } + } + + if (entityPower == NULL || entityPad == NULL) { + return false; + } + + pad = m_World->GetComponent(entityPad); + if (pad == nullptr) { + return false; + } + + m_World->RemoveComponent(entityPower); + m_World->RemoveComponent(entityPower); + m_World->RemoveComponent(entityPower); + m_World->RemoveEntity(entityPower); + Events::PowerUpTaken ep; + ep.Name = "Something"; + EventBroker->Publish(ep); + + Events::MultiBall e; + auto transform = m_World->GetComponent(entityPad); + e.padTransform = transform; + EventBroker->Publish(e); + return true; +} + +bool dd::Systems::PadSystem::OnResetBall(const dd::Events::ResetBall &event) +{ + SetReplaceBall(true); + return true; +} + +bool dd::Systems::PadSystem::OnMultiBall(const dd::Events::MultiBall &event) +{ + auto ent1 = CreateBall(); + auto ent2 = CreateBall(); + auto transform1 = m_World->GetComponent(ent1); + auto transform2 = m_World->GetComponent(ent2); + auto ball1 = m_World->GetComponent(ent1); + auto ball2 = m_World->GetComponent(ent2); + auto padTransform = event.padTransform; + float x1 = padTransform->Position.x - 2, x2 = padTransform->Position.x + 2; + if (x1 < -3.1) { + x1 = 3; + } + if (x2 > 3.1) { + x2 = -3; + } + transform1->Position = glm::vec3(x1, -5.5, -10); + transform2->Position = glm::vec3(x2, -5.5, -10); + + transform1->Velocity = glm::normalize(glm::vec3(5, 5 ,0.f)) * ball1->Speed; + transform2->Velocity = glm::normalize(glm::vec3(-5, 5 ,0.f)) * ball2->Speed; + + return true; +} + +bool dd::Systems::PadSystem::OnStageCleared(const dd::Events::StageCleared &event) +{ + auto entity = CreateBall(); + return true; +} + +bool dd::Systems::PadSystem::PadSteeringInputController::OnCommand(const Events::InputCommand &event) +{ + std::string command = event.Command; + + std::cout << "Command!" << std::endl; + + if (command == "right") { + std::cout << "Right!" << std::endl; + } else if (command == "left") { + std::cout << "Left!" << std::endl; + } + + return true; +} \ No newline at end of file diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp index 2a868f6..7d23110 100644 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -12,7 +12,7 @@ void dd::Systems::PhysicsSystem::Initialize() { m_ContactListener = new ContactListener(this); - m_Gravity = b2Vec2(0.f, 0.f); + m_Gravity = b2Vec2(0.f, -9.82f); m_PhysicsWorld = new b2World(m_Gravity); m_TimeStep = 1.f/60.f; @@ -22,9 +22,19 @@ void dd::Systems::PhysicsSystem::Initialize() m_PhysicsWorld->SetContactListener(m_ContactListener); + InitializeWater(); + EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); } +void dd::Systems::PhysicsSystem::InitializeWater() +{ + b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.radius = 0.13f; + + m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); +} + bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) { b2Body* body = m_EntitiesToBodies[event.Entity]; @@ -50,75 +60,111 @@ bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) void dd::Systems::PhysicsSystem::Update(double dt) { - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - - if (body == nullptr) { - //LOG_ERROR("This body should not exist"); - continue; - } - - if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too - b2Vec2 position; - position.x = transformComponent->Position.x; - position.y = transformComponent->Position.y; - - float angle = -glm::eulerAngles(transformComponent->Orientation).z; - - body->SetTransform(position, angle); - - body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); - - - } - } - - for (auto i : m_Impulses) { - i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); - } - m_Impulses.clear(); - m_Accumulator += dt; while(m_Accumulator >= m_TimeStep) { + + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; + + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) { + continue; + LOG_ERROR("RigidBody with no TransformComponent"); + } + auto physicsComponent = m_World->GetComponent(entity); + if (! physicsComponent) { + continue; + LOG_ERROR("RigidBody with no PhysicsComponent"); + } + + + if (body == nullptr) { + LOG_ERROR("This body should not exist"); + continue; + } + + if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too + b2Vec2 position; + position.x = transformComponent->Position.x; + position.y = transformComponent->Position.y; + float angle = glm::eulerAngles(transformComponent->Orientation).z; + body->SetTransform(position, angle); + body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); + body->SetGravityScale(physicsComponent->GravityScale); + + b2Filter filter; + filter.categoryBits = physicsComponent->Category; + filter.maskBits = physicsComponent->Mask; + body->GetFixtureList()->SetFilterData(filter); + } + } + + for (auto i : m_Impulses) { + i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); + } + m_Impulses.clear(); + + m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); - m_Accumulator -= dt; + + + + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; + + if (body == nullptr) { + LOG_ERROR("This body should not exist"); + continue; + } + + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) + continue; + auto parent = m_World->GetEntityParent(entity); + if (parent == 0) { + + auto physicsComponent = m_World->GetComponent(entity); + if (physicsComponent->Calculate) { //TODO: REPLACE THIS WITH PARTICLE COLLISION FILTERS + transformComponent->Position.x = transformComponent->Position.x + (transformComponent->Velocity.x * m_TimeStep); + transformComponent->Position.y = transformComponent->Position.y + (transformComponent->Velocity.y * m_TimeStep); + } + else { + b2Vec2 position = body->GetPosition(); + transformComponent->Position.x = position.x; + transformComponent->Position.y = position.y; + + float angle = body->GetAngle(); + transformComponent->Orientation = glm::quat(glm::vec3(0, 0, angle)); + + b2Vec2 velocity = body->GetLinearVelocity(); + transformComponent->Velocity.x = velocity.x; + transformComponent->Velocity.y = velocity.y; + } + } + + } + + b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); + for (auto i : m_EntitiesToParticleHandle) { + EntityID entity = i.first; + b2ParticleHandle* particleH = i.second; + + b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; + glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); + + + EntityID entityParent = m_World->GetEntityParent(entity); + auto transform = m_World->GetComponent(entity); + auto transformParent = m_World->GetComponent(entityParent); + + transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; } - - for (auto i : m_EntitiesToBodies) { - EntityID entity = i.first; - b2Body* body = i.second; - - if (body == nullptr) { - //LOG_ERROR("This body should not exist"); - continue; - } - - auto transformComponent = m_World->GetComponent(entity); - if (! transformComponent) - continue; - if (m_World->GetEntityParent(entity) == 0) { - b2Vec2 position = body->GetPosition(); - transformComponent->Position.x = position.x; - transformComponent->Position.y = position.y; - - float angle = body->GetAngle(); - - - transformComponent->Orientation = glm::quat(glm::vec3(0, 0, -angle)); - - b2Vec2 velocity = body->GetLinearVelocity(); - transformComponent->Velocity.x = velocity.x; - transformComponent->Velocity.y = velocity.y; - - } + m_Accumulator -= dt; } } @@ -127,18 +173,30 @@ void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, Entity } - void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) { auto physicsComponent = m_World->GetComponent(entity); - if(physicsComponent) { + auto waterComponent = m_World->GetComponent(entity); + + if (physicsComponent && waterComponent) { + LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); + return; + } + if (physicsComponent) { CreateBody(entity); + } else if (waterComponent) { + CreateParticleGroup(entity); } } void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) { + auto physics = m_World->GetComponent(entity); + if (physics == nullptr) { + return; + } + b2Body* body = m_EntitiesToBodies[entity]; if (body != nullptr) { @@ -170,8 +228,6 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) b2BodyDef bodyDef; bodyDef.position.Set(absoluteTransform.Position.x, absoluteTransform.Position.y); - - bodyDef.angle = -glm::eulerAngles(absoluteTransform.Orientation).z; if (physicsComponent->Static) { @@ -181,7 +237,6 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) } - b2Body* body = m_PhysicsWorld->CreateBody(&bodyDef); b2Shape* pShape; @@ -189,7 +244,7 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) auto boxComponent = m_World->GetComponent(entity); if (boxComponent) { b2PolygonShape* bShape = new b2PolygonShape(); - bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); //TODO: THIS SUCKS DUDE 4?!?!?!? + bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); pShape = bShape; } else { auto circleComponent = m_World->GetComponent(entity); @@ -201,19 +256,23 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { LOG_WARNING("Circles has to be of uniform scale."); } - pShape->m_radius = absoluteTransform.Scale.x/2; //TODO: THIS ALSO SUCKS 4 WTH + pShape->m_radius = absoluteTransform.Scale.x/2; } } + b2FixtureDef fixtureDef; + fixtureDef.shape = pShape; + fixtureDef.filter.categoryBits = physicsComponent->Category; + fixtureDef.filter.maskBits = physicsComponent->Mask; + + if(physicsComponent->Static) { - body->CreateFixture(pShape, 0); //Density kanske ska vara 0 på statiska kroppar + body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 på statiska kroppar } else { - //TODO: FIX THIS SHIT INTO COMPONENTS - b2FixtureDef fixtureDef; fixtureDef.shape = pShape; - fixtureDef.density = 1.f; + fixtureDef.density = 10.f; fixtureDef.restitution = 1.0f; fixtureDef.friction = 0.0f; body->CreateFixture(&fixtureDef); @@ -222,10 +281,50 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) delete pShape; + + body->SetGravityScale(physicsComponent->GravityScale); m_EntitiesToBodies.insert(std::make_pair(entity, body)); m_BodiesToEntities.insert(std::make_pair(body, entity)); } +void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) +{ + //TODO: Lägg alla pd i en lista + auto transform = m_World->GetComponent(e); + if (!transform) { + LOG_ERROR("No Transform component in CreateParticleGroup"); + return; + } + + b2ParticleGroupDef pd; + b2PolygonShape shape; + + shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); + pd.shape = &shape; + pd.flags = b2_tensileParticle; + pd.position.Set(transform->Position.x, transform->Position.y); + //TODO: PUT IN LIST + t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); + b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); + for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ + { + auto t_waterparticle = m_World->CreateEntity(e); + auto transformChild = m_World->AddComponent(t_waterparticle); + //auto sprite = m_World->AddComponent(t_waterparticle); + + transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); + transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; + //sprite->SpriteFile = "Textures/Ball.png"; + m_World->CommitEntity(t_waterparticle); + + m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); + m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); + } + + } + LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); +} + dd::Systems::PhysicsSystem::~PhysicsSystem() { if (m_ContactListener != nullptr) { diff --git a/src/game/Physics/PhysicsSystem.cpp.orig b/src/game/Physics/PhysicsSystem.cpp.orig new file mode 100755 index 0000000..7fb8bc1 --- /dev/null +++ b/src/game/Physics/PhysicsSystem.cpp.orig @@ -0,0 +1,363 @@ +#include "PrecompiledHeader.h" +#include "Physics/PhysicsSystem.h" + + + +void dd::Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) +{ + cf->Register(); +} + +void dd::Systems::PhysicsSystem::Initialize() +{ + m_ContactListener = new ContactListener(this); + + m_Gravity = b2Vec2(0.f, -9.82f); + m_PhysicsWorld = new b2World(m_Gravity); + + m_TimeStep = 1.f/60.f; + m_VelocityIterations = 6; + m_PositionIterations = 2; + m_Accumulator = 0.f; + + m_PhysicsWorld->SetContactListener(m_ContactListener); + + InitializeWater(); + + EVENT_SUBSCRIBE_MEMBER(m_SetImpulse, PhysicsSystem::SetImpulse); +} + +void dd::Systems::PhysicsSystem::InitializeWater() +{ + b2ParticleSystemDef m_ParticleSystemDef; + m_ParticleSystemDef.radius = 0.13f; + + m_ParticleSystem = m_PhysicsWorld->CreateParticleSystem(&m_ParticleSystemDef); +} + +bool dd::Systems::PhysicsSystem::SetImpulse(const Events::SetImpulse &event) +{ + b2Body* body = m_EntitiesToBodies[event.Entity]; + + b2Vec2 impulse; + impulse.x = event.Impulse.x; + impulse.y = event.Impulse.y; + + b2Vec2 point; + point.x = event.Point.x; + point.y = event.Point.y; + + + Impulse i; + i.Body = body; + i.Impulse = impulse; + i.Point = point; + + m_Impulses.push_back(i); + + return true; +} + +void dd::Systems::PhysicsSystem::Update(double dt) +{ + + m_Accumulator += dt; + while(m_Accumulator >= m_TimeStep) + { + + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; + + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) { + continue; + LOG_ERROR("RigidBody with no TransformComponent"); + } + auto physicsComponent = m_World->GetComponent(entity); + if (! physicsComponent) { + continue; + LOG_ERROR("RigidBody with no PhysicsComponent"); + } + + + if (body == nullptr) { + LOG_ERROR("This body should not exist"); + continue; + } + + if (m_World->GetEntityParent(entity) == 0) { //TODO: Make this work with childs too + b2Vec2 position; + position.x = transformComponent->Position.x; + position.y = transformComponent->Position.y; + float angle = -glm::eulerAngles(transformComponent->Orientation).z; + body->SetTransform(position, angle); + body->SetLinearVelocity(b2Vec2(transformComponent->Velocity.x, transformComponent->Velocity.y)); + + body->SetGravityScale(physicsComponent->GravityScale); + +<<<<<<< HEAD + + b2Filter filter; + filter.categoryBits = physicsComponent->Category; + filter.maskBits = physicsComponent->Mask; + body->GetFixtureList()->SetFilterData(filter); + } + } + + for (auto i : m_Impulses) { + i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); +======= +>>>>>>> origin/master + } + m_Impulses.clear(); + + +<<<<<<< HEAD + + +======= + for (auto i : m_Impulses) { + i.Body->ApplyLinearImpulse(i.Impulse, i.Point, true); + } + m_Impulses.clear(); + m_Accumulator += dt; + while(m_Accumulator >= m_TimeStep) + { +>>>>>>> origin/master + m_PhysicsWorld->Step(m_TimeStep, m_VelocityIterations, m_PositionIterations); + m_Accumulator -= dt; + +<<<<<<< HEAD + +======= + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; +>>>>>>> origin/master + + for (auto i : m_EntitiesToBodies) { + EntityID entity = i.first; + b2Body* body = i.second; + + if (body == nullptr) { + LOG_ERROR("This body should not exist"); + continue; + } + +<<<<<<< HEAD + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) + continue; + if (m_World->GetEntityParent(entity) == 0) { + b2Vec2 position = body->GetPosition(); + transformComponent->Position.x = position.x; + transformComponent->Position.y = position.y; +======= + auto transformComponent = m_World->GetComponent(entity); + if (! transformComponent) + continue; + auto parent = m_World->GetEntityParent(entity); + if (parent == 0) { + b2Vec2 position = body->GetPosition(); + transformComponent->Position.x = position.x; + transformComponent->Position.y = position.y; +>>>>>>> origin/master + + float angle = body->GetAngle(); + + + transformComponent->Orientation = glm::quat(glm::vec3(0, 0, -angle)); + +<<<<<<< HEAD + b2Vec2 velocity = body->GetLinearVelocity(); + transformComponent->Velocity.x = velocity.x; + transformComponent->Velocity.y = velocity.y; + + } +======= +>>>>>>> origin/master + } + } + + b2Vec2* positionBuffer = m_ParticleSystem->GetPositionBuffer(); + for (auto i : m_EntitiesToParticleHandle) { + EntityID entity = i.first; + b2ParticleHandle* particleH = i.second; + + b2Vec2 positionB2 = positionBuffer[particleH->GetIndex()]; + glm::vec2 position = glm::vec2(positionB2.x, positionB2.y); + + + EntityID entityParent = m_World->GetEntityParent(entity); + auto transform = m_World->GetComponent(entity); + auto transformParent = m_World->GetComponent(entityParent); + + transform->Position = glm::vec3(position.x, position.y, -10) - transformParent->Position; + } +} + +void dd::Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + +} + +void dd::Systems::PhysicsSystem::OnEntityCommit(EntityID entity) +{ + auto physicsComponent = m_World->GetComponent(entity); + auto waterComponent = m_World->GetComponent(entity); + + if (physicsComponent && waterComponent) { + LOG_ERROR("Entity has both water and physics component, this is illegal. The police has been alerted."); + return; + } + if (physicsComponent) { + CreateBody(entity); + } else if (waterComponent) { + CreateParticleGroup(entity); + } +} + + +void dd::Systems::PhysicsSystem::OnEntityRemoved(EntityID entity) +{ + auto physics = m_World->GetComponent(entity); + if (physics == nullptr) { + return; + } + + b2Body* body = m_EntitiesToBodies[entity]; + + if (body != nullptr) { + m_EntitiesToBodies.erase(entity); + m_BodiesToEntities.erase(body); + + m_PhysicsWorld->DestroyBody(body); + } + +} + + +void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) +{ + auto physicsComponent = m_World->GetComponent(entity); + if(!physicsComponent){ + LOG_ERROR("No PhysicsComponent in CreateBody"); + return; + } + + + auto transformComponent = m_World->GetComponent(entity); + if(!transformComponent) { + LOG_ERROR("No TransformComponent in CreateBody"); + return; + } + + auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); + + b2BodyDef bodyDef; + bodyDef.position.Set(absoluteTransform.Position.x, absoluteTransform.Position.y); + bodyDef.angle = -glm::eulerAngles(absoluteTransform.Orientation).z; + + if (physicsComponent->Static) { + bodyDef.type = b2_staticBody; + } else { + bodyDef.type = b2_dynamicBody; + + } + + b2Body* body = m_PhysicsWorld->CreateBody(&bodyDef); + + b2Shape* pShape; + + auto boxComponent = m_World->GetComponent(entity); + if (boxComponent) { + b2PolygonShape* bShape = new b2PolygonShape(); + bShape->SetAsBox(absoluteTransform.Scale.x/2, absoluteTransform.Scale.y/2); + pShape = bShape; + } else { + auto circleComponent = m_World->GetComponent(entity); + if (circleComponent) { + pShape = new b2CircleShape(); + pShape->m_radius = absoluteTransform.Scale.x; + + + if (absoluteTransform.Scale.x != absoluteTransform.Scale.y && absoluteTransform.Scale.y != absoluteTransform.Scale.z) { + LOG_WARNING("Circles has to be of uniform scale."); + } + pShape->m_radius = absoluteTransform.Scale.x/2; + + } + } + + b2FixtureDef fixtureDef; + fixtureDef.shape = pShape; + fixtureDef.filter.categoryBits = physicsComponent->Category; + fixtureDef.filter.maskBits = physicsComponent->Mask; + + + if(physicsComponent->Static) { + body->CreateFixture(&fixtureDef); //Density kanske ska vara 0 på statiska kroppar + } + else { + fixtureDef.shape = pShape; + fixtureDef.density = 1.f; + fixtureDef.restitution = 1.0f; + fixtureDef.friction = 0.0f; + body->CreateFixture(&fixtureDef); + + } + + delete pShape; + + + body->SetGravityScale(physicsComponent->GravityScale); + m_EntitiesToBodies.insert(std::make_pair(entity, body)); + m_BodiesToEntities.insert(std::make_pair(body, entity)); +} + +void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) +{ + //TODO: Lägg alla pd i en lista + auto transform = m_World->GetComponent(e); + if (!transform) { + LOG_ERROR("No Transform component in CreateParticleGroup"); + return; + } + + b2ParticleGroupDef pd; + b2PolygonShape shape; + + shape.SetAsBox(transform->Scale.x/2.f, transform->Scale.y/2.f); + pd.shape = &shape; + pd.flags = b2_tensileParticle; + pd.position.Set(transform->Position.x, transform->Position.y); + //TODO: PUT IN LIST + t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); + b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); + for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ + { + auto t_waterparticle = m_World->CreateEntity(e); + auto transformChild = m_World->AddComponent(t_waterparticle); + //auto sprite = m_World->AddComponent(t_waterparticle); + + transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); + transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; + //sprite->SpriteFile = "Textures/Ball.png"; + m_World->CommitEntity(t_waterparticle); + + m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); + m_ParticleHandleToEntities.insert(std::make_pair( m_ParticleSystem->GetParticleHandleFromIndex(i), t_waterparticle)); + } + + } + LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); +} + +dd::Systems::PhysicsSystem::~PhysicsSystem() +{ + if (m_ContactListener != nullptr) { + delete m_ContactListener; + m_ContactListener = nullptr; + } +} diff --git a/src/game/Sound/SoundSystem.cpp.orig b/src/game/Sound/SoundSystem.cpp.orig new file mode 100644 index 0000000..bc7e9b3 --- /dev/null +++ b/src/game/Sound/SoundSystem.cpp.orig @@ -0,0 +1,183 @@ +#include "PrecompiledHeader.h" +#include "Sound/SoundSystem.h" + +dd::Systems::SoundSystem::~SoundSystem() +{ + alcCloseDevice(m_Device); +}; + +void dd::Systems::SoundSystem::Initialize() +{ + //initialize OpenAL + m_Device = alcOpenDevice(NULL); + ALCcontext* context; + + if (m_Device) { + context = alcCreateContext(m_Device, NULL); + alcMakeContextCurrent(context); + } + else { + LOG_ERROR("OpenAL failed to initialize."); + } + alGetError(); + + //Subscribe to events + EVENT_SUBSCRIBE_MEMBER(m_EContact, &SoundSystem::OnContact); + EVENT_SUBSCRIBE_MEMBER(m_EPlaySFX, &SoundSystem::OnPlaySound); + EVENT_SUBSCRIBE_MEMBER(m_EStopSound, &SoundSystem::OnStopSound); + EVENT_SUBSCRIBE_MEMBER(m_EMasterVolume, &SoundSystem::OnMasterVolume); + +<<<<<<< HEAD + //Todo: Move this + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/under-the-sea-instrumental.wav"; + e.IsAmbient = true; + EventBroker->Publish(e); + } + { + dd::Events::PlaySound e; + e.FilePath = "Sounds/BGM/water-flowing.wav"; + e.Gain = 0.3f; + e.IsAmbient = true; + EventBroker->Publish(e); + } +======= + + +>>>>>>> origin/master +} + +void dd::Systems::SoundSystem::Update(double dt) +{ + //Clean up none-active sources + //Only used for SFX's. BGM's are handled on stop sound. + std::vector deleteList; + for (auto& item : m_SFXSourcesToBuffers) { + ALint sourceState; + alGetSourcei(item.first, AL_SOURCE_STATE, &sourceState); + if (sourceState == AL_STOPPED) { + deleteList.push_back(item.first); + } + } + + for (int i = 0; i < deleteList.size(); i++) { + alDeleteSources(1, &deleteList[i]); + //alDeleteBuffers(1, &m_SourcesToBuffers[deleteList[i]]); + m_SFXSourcesToBuffers.erase(deleteList[i]); + } +} + +ALuint dd::Systems::SoundSystem::CreateSource() +{ + ALuint source; + alGenSources((ALuint)1, &source); + + return source; +} + +bool dd::Systems::SoundSystem::OnPlaySound(const dd::Events::PlaySound &event) +{ + //Loading and binding sound buffer to source + Sound *sound = ResourceManager::Load(event.FilePath); + if (sound == nullptr) { + return false; + } + ALuint source = CreateSource(); + ALuint buffer = sound->Buffer(); + alSourcei(source, AL_BUFFER, buffer); + + //Sound settings + float relativeVolume = 1.f; + if (event.IsAmbient) { + alSourcei(source, AL_LOOPING, AL_TRUE); + relativeVolume = m_BGMMasterVolume; + m_BGMSourcesToBuffers[source] = sound; + + } + else if (!event.IsAmbient) + { + m_SFXSourcesToBuffers[source] = sound; + alSourcei(source, AL_LOOPING, AL_FALSE); + relativeVolume = m_SFXMasterVolume; + } + + alSourcef(source, AL_GAIN, (event.Gain * relativeVolume)); + alSourcef(source, AL_PITCH, event.Pitch); + + + //Play + alSourcePlay(source); + return true; +} + +bool dd::Systems::SoundSystem::OnStopSound(const dd::Events::StopSound &event) +{ + ALuint itemToDeleted; + for (auto& item : m_BGMSourcesToBuffers) + { + if (item.second->Path() == event.FilePath) { + itemToDeleted = item.first; + break; + } + } + alSourceStop(itemToDeleted); + alDeleteSources(1, &itemToDeleted); + m_BGMSourcesToBuffers.erase(itemToDeleted); + + //Should not happen because SFX's should be very short. + for (auto item : m_SFXSourcesToBuffers) + { + if (item.second->Path() == event.FilePath) { + alSourceStop(item.first); + return true; + } + } + return false; +} + +bool dd::Systems::SoundSystem::OnMasterVolume(const dd::Events::MasterVolume &event) +{ + //TODO: Make the Gain depend on the value given when stored. + //TODO: .. now it ONLY uses the master Gain + if (event.IsAmbient) { + m_BGMMasterVolume = event.Gain; + for (auto& item : m_BGMSourcesToBuffers) + { + alSourcef(item.first, AL_GAIN, event.Gain); + } + return true; + } + else if (!event.IsAmbient) { + m_SFXMasterVolume = event.Gain; + for (auto& item : m_SFXSourcesToBuffers) + { + alSourcef(item.first, AL_GAIN, event.Gain); + } + return true; + } + return false; +} + +bool dd::Systems::SoundSystem::OnContact(const dd::Events::Contact &event) +{ + //Check which entity has the collisionSound component. + auto collisionSound = m_World->GetComponent(event.Entity1); + if (collisionSound == nullptr) { + collisionSound = m_World->GetComponent(event.Entity2); + if (collisionSound == nullptr) { + //None of the entities had a collisionSound component. + return false; + } + } + + //Send play-sound event + dd::Events::PlaySound e; + e.FilePath = collisionSound->FilePath; + e.IsAmbient = false; + EventBroker->Publish(e); + return true; +} + + + diff --git a/tools/StyleGuide.h b/tools/StyleGuide.h index f43b57c..99c152c 100755 --- a/tools/StyleGuide.h +++ b/tools/StyleGuide.h @@ -1,6 +1,12 @@ #ifndef NAMESPACE_FILENAME_H__ #define NAMESPACE_FILENAME_H__ +#include + +#include + +#include "Internal/Header.h" + namespace dd {