Compare commits
1000 Commits
20a07a65d7
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 101502103a | |||
| 20dd4641c8 | |||
| fc843dc557 | |||
| 9103f6e055 | |||
| ced84333a9 | |||
| 05f42aa119 | |||
| a1e84caa8c | |||
| ddb827fb6f | |||
| 0a4583ca54 | |||
| 6a701b2679 | |||
| aa2884bd78 | |||
| f27f2d097f | |||
| e4baf682ab | |||
| 8516750975 | |||
| 3212becc91 | |||
| b9446863d7 | |||
| 13f9112d8c | |||
| f16fb065ea | |||
| 66392fe0ae | |||
| 720dd22491 | |||
| ca578b8b08 | |||
| 4b760091da | |||
| 6d562e5e87 | |||
| 7553e9d586 | |||
| 80ad96acc2 | |||
| 7a5e8aa3a5 | |||
| 1c94e94873 | |||
| 33adda1983 | |||
| f031b2f4f4 | |||
| 1c7240a01d | |||
| cf0d6fc664 | |||
| 615fc36eeb | |||
| cbe31759ab | |||
| d74556d35c | |||
| 8d246fdaff | |||
| a0fd5ab1d9 | |||
| 9a337f3b3b | |||
| 5025009860 | |||
| 6f5cabf60c | |||
| c96669e123 | |||
| 9c04b1de82 | |||
| b465b4e2ea | |||
| 2853b28d6d | |||
| 8fa5f1fe2c | |||
| 6f7cd3a9ab | |||
| ae438e804e | |||
| 2a566544d4 | |||
| 71a35f661e | |||
| 2d8e346945 | |||
| f3f02b3e17 | |||
| dad93abcf8 | |||
| 5e8118daf2 | |||
| bc2057345b | |||
| f2a900a60d | |||
| 3adfde42f7 | |||
| 91ac3cc707 | |||
| 19a1683641 | |||
| be6007be93 | |||
| efeccfef61 | |||
| 366300aafe | |||
| 215ad78d5b | |||
| 8115b7e922 | |||
| fd8830948e | |||
| f9899a7182 | |||
| 561cc27403 | |||
| 983efae3e4 | |||
| 95c4efd7a3 | |||
| 68befcc64f | |||
| b1f8cde329 | |||
| 78a81bf407 | |||
| 944567651c | |||
| 1bbc8682f4 | |||
| ed5da45203 | |||
| d3addad9a7 | |||
| d13314fe1c | |||
| 3ba186f2c1 | |||
| 4d9df337a7 | |||
| 4724f7cf1b | |||
| a568506265 | |||
| 6a048b7afe | |||
| ebce9fa97a | |||
| 78661a4ee0 | |||
| 18e1ec504f | |||
| 9f567e6ee4 | |||
| e273aaea1e | |||
| 1ac1309b24 | |||
| c991f9e89f | |||
| 8f3cabcf76 | |||
| 2b051afb29 | |||
| 3d9129e3b4 | |||
| 80ed6eadb8 | |||
| a7ce14ee95 | |||
| 47a8b554bc | |||
| fc8049a039 | |||
| bd36610f91 | |||
| 7e3d6cbfa8 | |||
| 17dc2bb474 | |||
| aaa893f668 | |||
| e1b9857b14 | |||
| cf5e84c3c4 | |||
| f1719480e0 | |||
| 84737a9fc1 | |||
| 727a90c5d1 | |||
| 6c3ef8d9b4 | |||
| 97707d7a6b | |||
| 12cce1766f | |||
| dddc94dc7a | |||
| c22b1d84d5 | |||
| 6820ff61f1 | |||
| 4ad9e09bb2 | |||
| 90af210712 | |||
| 0747e9b5c1 | |||
| c6f4c8e3e0 | |||
| c0179288ba | |||
| 8161475c28 | |||
| 30cd36a8a9 | |||
| ba65bd7f99 | |||
| 67f24b3b41 | |||
| 29173a4978 | |||
| 49868b356f | |||
| 8fcd99c8dd | |||
| 646e814baf | |||
| 5aee9f9d50 | |||
| 282c4b0eab | |||
| 1f7f9ab22b | |||
| ee3d65cbc9 | |||
| 82ad486e6b | |||
| d26435703f | |||
| 0b9f463e64 | |||
| bd21d74914 | |||
| 4cef89cf04 | |||
| 63fb407dc5 | |||
| 80e164fa04 | |||
| e1d5adb326 | |||
| 43bd2b1e18 | |||
| 313659d37d | |||
| a6976b1930 | |||
| 39e39216f6 | |||
| 5fdf178969 | |||
| e3738c1b17 | |||
| d56371ce85 | |||
| 265fa7833c | |||
| f21c1cc6ae | |||
| ec828071ef | |||
| 33cee1146c | |||
| 8081d2bd07 | |||
| 2453977d59 | |||
| e2233acdb0 | |||
| 3f92c396a0 | |||
| d5e8ee77b1 | |||
| f51204821a | |||
| a24e65d8e1 | |||
| f75682f5c9 | |||
| 57e22d5fa0 | |||
| 1b6303b900 | |||
| 83a167ca3f | |||
| 48496e2307 | |||
| e6ef99275a | |||
| c7c6aaf156 | |||
| 06958c91d0 | |||
| 46ca641ec5 | |||
| f3393b8fd8 | |||
| 8455f9d088 | |||
| 95d58ed988 | |||
| 5da90172ac | |||
| 6f4f4cc508 | |||
| e062e3835e | |||
| dcc9e96148 | |||
| 6993bc7337 | |||
| a4a6812d68 | |||
| 9efe127f5d | |||
| 4caba49658 | |||
| 86e00bde65 | |||
| 95a8977e33 | |||
| f531ee2d8f | |||
| b18f547d8f | |||
| be9a24e68c | |||
| bbba3d0802 | |||
| cde917c63c | |||
| a590126351 | |||
| 063986fdae | |||
| a235cd6a18 | |||
| ab463ac89b | |||
| 9fe3f7ca14 | |||
| d26b17f320 | |||
| 6756e9d3d7 | |||
| 06589d3350 | |||
| 596d3bcb7e | |||
| 5c2747e3a8 | |||
| 470a326588 | |||
| 74f7112614 | |||
| d29112fb1f | |||
| 75ae4d347a | |||
| d06c820a44 | |||
| 3e3453d54e | |||
| 4dca02daa5 | |||
| c059ece2a4 | |||
| b5caef1ffb | |||
| 6dcd4cd564 | |||
| 80b6b7fc2a | |||
| d172a24bb0 | |||
| 9c73b0eb37 | |||
| 4dbe04b250 | |||
| 8ae2c9cf5f | |||
| 7f82da0031 | |||
| fcaea5b1a1 | |||
| 4e8b087ffe | |||
| 78faf6a120 | |||
| d8601121da | |||
| ee2999b3e0 | |||
| f76e371436 | |||
| 0b4815b8fe | |||
| d7a7eda959 | |||
| 2a324ace27 | |||
| 8b3ea995f9 | |||
| d8da443604 | |||
| 4ff296bf0b | |||
| ad17af57e9 | |||
| af57c8854f | |||
| eacbc8bd61 | |||
| a66b6c998a | |||
| 4883813bbb | |||
| c24f5ac412 | |||
| 6adb1c2704 | |||
| 9ff87b38b8 | |||
| 3843f771fb | |||
| 12ce106661 | |||
| 48c1619d20 | |||
| e92832fc6d | |||
| cfb43fa999 | |||
| ed68a4fcce | |||
| 91addeb889 | |||
| ee3be5799a | |||
| 87d49262f8 | |||
| 81004135a4 | |||
| cc83b2bd8e | |||
| 46e8343a30 | |||
| 3cf3b309c6 | |||
| 5fbf67a630 | |||
| 0246621210 | |||
| dfc94f64d1 | |||
| bca54047f9 | |||
| b2d455400c | |||
| 127cc1c79e | |||
| 3389c80f49 | |||
| f16d5ce1dd | |||
| cbff0fa22c | |||
| bf5c00f7e0 | |||
| a844a943b5 | |||
| f106301d46 | |||
| 78870335e6 | |||
| 93a21c7e13 | |||
| f4ed8fc50e | |||
| 3b6a68ba69 | |||
| f163209cf2 | |||
| 5db5c9b4a1 | |||
| 9aaf120bbe | |||
| aae2c4b355 | |||
| 5338e39124 | |||
| a0f3f07bdc | |||
| fdc500756d | |||
| cf9a0619ca | |||
| a6dd08fb71 | |||
| 0bbe302e72 | |||
| 6a5b7fb3f8 | |||
| 40594f3ec0 | |||
| 70f4911698 | |||
| 0fbc4272d0 | |||
| cb58ca63d4 | |||
| e244cf297a | |||
| a818508158 | |||
| 1c20b5588d | |||
| e501dfad60 | |||
| a25d11ad1a | |||
| 6f101f4011 | |||
| efe62f0e0d | |||
| 79fd6be008 | |||
| dbcc508196 | |||
| 4bb8c89084 | |||
| 39242dba23 | |||
| 12dc0d6675 | |||
| 93c5dc3b5f | |||
| 04930c5132 | |||
| 780a7df760 | |||
| 428421f21a | |||
| 1b5a14e516 | |||
| 99ed814615 | |||
| 77b9214575 | |||
| ec06f9be37 | |||
| 3c5b3f1c17 | |||
| 79b7cd6b9b | |||
| 1664204291 | |||
| ec3cb7045f | |||
| 74f2a899d9 | |||
| 8604085b6e | |||
| 5aeedb4899 | |||
| 7ae3eb5d3a | |||
| de8575b16e | |||
| aeafce5db4 | |||
| 9ef3448193 | |||
| 085f933b17 | |||
| ab4831911a | |||
| cd0d693a56 | |||
| 7995f8d1b3 | |||
| ed8c4c1b9b | |||
| 4099218f1a | |||
| ffc405325f | |||
| 9c1216699d | |||
| 0c97c95f6c | |||
| bb910bb0b8 | |||
| 153401810a | |||
| 9ed785c2e1 | |||
| 311f6243e3 | |||
| 601ff4f02e | |||
| 4256be5608 | |||
| 087aa1bc3f | |||
| 484cc0e255 | |||
| c6f9f76afb | |||
| af068ec020 | |||
| 8e052b81b4 | |||
| 4ba92f8962 | |||
| 2a04317cff | |||
| 1c45776bb7 | |||
| b020bed2b3 | |||
| fd28db53ad | |||
| 1c39d47b5b | |||
| 047c9d2052 | |||
| 7383de3dea | |||
| 21404d958e | |||
| d2acf06779 | |||
| af11859906 | |||
| 1f65a17274 | |||
| 18e4d1d44f | |||
| adfe2c1704 | |||
| 17bc628fd9 | |||
| 7191749d66 | |||
| e3a562ab57 | |||
| aaf4c1d3ae | |||
| 2d7b66dd37 | |||
| 9f831428e6 | |||
| c80726511c | |||
| 767df4cf52 | |||
| 04a1a0293e | |||
| f62565dc72 | |||
| 6f584464b6 | |||
| 9bf7699624 | |||
| 4cfae99a74 | |||
| 5dd97ecf2f | |||
| ca664cb023 | |||
| b99a6cc6bd | |||
| b067b0b878 | |||
| 59c3fcc23a | |||
| a683dd9615 | |||
| de50402dd5 | |||
| b9e7cb64c5 | |||
| d4ca9f9213 | |||
| 1937fedf08 | |||
| 07aafdd585 | |||
| d7a83a1111 | |||
| f0ffdb33f4 | |||
| e7d27e5b80 | |||
| 7b5c597da5 | |||
| 02b3e44f88 | |||
| 718a841cfb | |||
| 8670e6e1b9 | |||
| 29a7996402 | |||
| 301df440bd | |||
| 7e6f38ad29 | |||
| 78a79a8523 | |||
| 2ea18f7c88 | |||
| 7e3b7cd349 | |||
| 36d3c8acfb | |||
| 377853bb32 | |||
| a0a0d4d5ad | |||
| 8494d76c93 | |||
| 5d9c11e165 | |||
| de20076d36 | |||
| a5a5d3f347 | |||
| 1cdf1dcbbe | |||
| 452cac33b8 | |||
| 14a0a4d0c4 | |||
| 6f1077737e | |||
| f680776941 | |||
| e5f809f534 | |||
| 6ed61e107b | |||
| 8932ba0b0a | |||
| 6966ad5717 | |||
| 3f30533f1c | |||
| a553fbd0c7 | |||
| 0e2e8ce225 | |||
| 5d9352a0a1 | |||
| 56e32f2c3e | |||
| 37149082e8 | |||
| 0e57a572b4 | |||
| beabb1300d | |||
| 218a806ec2 | |||
| 317c1eaeeb | |||
| 3da2fc1bf8 | |||
| 43c81d216c | |||
| 584bc14929 | |||
| 6d9e17594b | |||
| f76666af3f | |||
| e5e684a5ca | |||
| c551fb7118 | |||
| 7d780d18b5 | |||
| a2a22e5e48 | |||
| 4767841b71 | |||
| f36c8ddc56 | |||
| 4cd131cf29 | |||
| 070c7894c6 | |||
| e79603d501 | |||
| 06cfda6ff9 | |||
| 87f758f9b4 | |||
| f6c07099af | |||
| 2724f07c9a | |||
| fe8c83b57d | |||
| 15d234b79d | |||
| 3f6d67c61c | |||
| 07033cff90 | |||
| 2554dcba9b | |||
| 4f9b933b34 | |||
| ca33d495b3 | |||
| 085391e788 | |||
| fbae395e85 | |||
| 78a607b778 | |||
| bb28d7fd0e | |||
| 363855ec3e | |||
| 8ada37d967 | |||
| e7cfd3d4a3 | |||
| 95cb0cbf67 | |||
| 47576e4e10 | |||
| 1161286d51 | |||
| f0674676b6 | |||
| ff8333435a | |||
| 1c3f9fa135 | |||
| 9268b0d029 | |||
| e81fc8d21a | |||
| 23e0898c65 | |||
| 97e214fc68 | |||
| c264c86ee0 | |||
| bd6065a4fd | |||
| dc1632c17a | |||
| 7729727752 | |||
| a15651f4fe | |||
| fbdf5e4fd2 | |||
| ed8f1a22d1 | |||
| 96fb4851ce | |||
| 068978d5b3 | |||
| c1615aaac4 | |||
| b281101001 | |||
| c9b1f2ce54 | |||
| 9931ddd27a | |||
| 36ad7127c2 | |||
| 36824b6c0a | |||
| 865b3310f8 | |||
| 161cab24da | |||
| 6f01f3c06d | |||
| b8420d4821 | |||
| 3148206758 | |||
| f711c98bd6 | |||
| adac5f7770 | |||
| bb0c78476c | |||
| 6cf38b6292 | |||
| 8d48a12306 | |||
| 28ce99b539 | |||
| 71321d179b | |||
| 7db5f56e81 | |||
| 8d3a4b8dd5 | |||
| d0c39db6c2 | |||
| 5a54fc12a2 | |||
| 8a1468c0c7 | |||
| 2550a45821 | |||
| 109b3b2d2e | |||
| 9e14faffcc | |||
| ffe74658ab | |||
| 84e2cbccc4 | |||
| a42eb2f79b | |||
| 866e7238bf | |||
| 698d37c57a | |||
| 1b9aa0bcf3 | |||
| f4250da042 | |||
| f6ae596a1d | |||
| 0da5bc1e17 | |||
| 4447868c60 | |||
| adb078128b | |||
| 28c5d16000 | |||
| 811ec4fb1e | |||
| ef0dd5f774 | |||
| c7f8843200 | |||
| 851bb3120d | |||
| adda398e65 | |||
| 5ac0539481 | |||
| 84baaa6ee7 | |||
| ede4547015 | |||
| d8f3b51a3f | |||
| 4a23ed698f | |||
| f4f3325e1e | |||
| 11ca32493a | |||
| 07070b81e8 | |||
| 6afc608477 | |||
| 4cf4c6645e | |||
| 14bef50464 | |||
| ab3e99fd30 | |||
| 463d069eff | |||
| b67e7ffc44 | |||
| 16fbca2e8b | |||
| 266b8efbd6 | |||
| 688cf680c0 | |||
| 25f4e544d1 | |||
| 4020885c35 | |||
| 8544020023 | |||
| 5373ede25c | |||
| e1dfb4cd4e | |||
| 1bbd4c3566 | |||
| c0234e5e3d | |||
| 02d004274c | |||
| 2d19abb2cf | |||
| e5cef3c0d8 | |||
| 68a678a549 | |||
| 16a0b966c3 | |||
| 4af48fba74 | |||
| 446f015ac5 | |||
| b2684a9c38 | |||
| 86ec1c08c2 | |||
| bd810368b0 | |||
| eb816898e5 | |||
| 84e606b8c7 | |||
| 1d4d8da3e9 | |||
| 3e59797a68 | |||
| 424cdebda5 | |||
| b5e25916fc | |||
| 47bdfb91a2 | |||
| 8e52aee853 | |||
| 389800fd34 | |||
| 43305c4865 | |||
| d980642421 | |||
| 51aa8776bb | |||
| 55a1c58b64 | |||
| 0203a47bf9 | |||
| 8116ebd9bb | |||
| a51cb7fe30 | |||
| 91bc8d9b10 | |||
| 7646d08751 | |||
| fb42819eab | |||
| d418704c0b | |||
| 293477e2b5 | |||
| 6d7dd43c13 | |||
| e21093d434 | |||
| c17f82a78c | |||
| d97e0a8ac7 | |||
| 427b0d2653 | |||
| 5f9465d569 | |||
| d79f294af0 | |||
| 41dee9e9f9 | |||
| 3cbe911613 | |||
| b17936de22 | |||
| 3659eee994 | |||
| ba046a5d60 | |||
| f9e6c85cce | |||
| 9b99c5b04e | |||
| 64641c6a01 | |||
| dd0587e12a | |||
| 2e376c6f5b | |||
| 48eac60171 | |||
| 2a295210fb | |||
| 1008066644 | |||
| a7e62e73d8 | |||
| 5cbe013273 | |||
| d8ee8a45c4 | |||
| 33327760f1 | |||
| 785ad4015c | |||
| cadd28e5a0 | |||
| 2cb387b50a | |||
| f53cd449ce | |||
| b7eda8159c | |||
| 64d6a90d48 | |||
| 3a0c8009af | |||
| d1768d387c | |||
| c579eef4b7 | |||
| 1fa3c15942 | |||
| 4e8d08523f | |||
| cb6a64843c | |||
| 4fa8e23efc | |||
| 1dfff2252d | |||
| cf61a8b888 | |||
| bcd46fb36b | |||
| 9fab2c8a13 | |||
| 0fd5a1a3f5 | |||
| d5ea6a87d9 | |||
| 17d9927a4f | |||
| b16d14f5ed | |||
| 29ce5d8aa9 | |||
| aa475b1046 | |||
| 8b3c68f8b5 | |||
| 8f32c502a7 | |||
| b6ae380260 | |||
| 864459cbd2 | |||
| e18d167c8f | |||
| 1777da9056 | |||
| 6226abb0d3 | |||
| 708c1539e4 | |||
| 917533224f | |||
| 0a92c863c4 | |||
| 12ce72c32d | |||
| 998a18b641 | |||
| 223feca13a | |||
| 7d07d21ee5 | |||
| 82d65e110a | |||
| f61c2c504d | |||
| ecf032fe4f | |||
| d7f82aa7ae | |||
| edce3d41b2 | |||
| f2adb0272d | |||
| ecedf40da6 | |||
| fce888c0c0 | |||
| d9cb078299 | |||
| 0d29d8d4b1 | |||
| bbf884d7b3 | |||
| f0e49787cd | |||
| 0e73e0ea64 | |||
| 507c85900f | |||
| 03617e0bdd | |||
| 481daf2423 | |||
| 4a4997c615 | |||
| 7103703313 | |||
| d2f6c4924c | |||
| ed3b5b2649 | |||
| 42abcb9492 | |||
| a72b4b177b | |||
| a67b49498f | |||
| 3b16a72302 | |||
| 6343251857 | |||
| 60ac8f2a86 | |||
| 47db1da9ea | |||
| 8b68d548c9 | |||
| b04a94d1e1 | |||
| f9af011965 | |||
| 99c4d4b597 | |||
| 79497e1c88 | |||
| 2e95cdb2b5 | |||
| c9564c0de8 | |||
| e796b00eb0 | |||
| 04a3ab0ca7 | |||
| 52980c947d | |||
| 4d0c3affaa | |||
| 0e5837fb86 | |||
| f60333d9b2 | |||
| 785965fcef | |||
| d0e6f60ef3 | |||
| 6c4f220e89 | |||
| c95630b7d0 | |||
| e9f655d002 | |||
| 41211b0c8c | |||
| d320a029c8 | |||
| f83c5cb6e1 | |||
| 69021939e6 | |||
| 9cc9f3bbbe | |||
| 3c9c66e72b | |||
| c6d7694286 | |||
| 11bf3996cf | |||
| a7aeb2f2b5 | |||
| 500494f791 | |||
| 1d17be6c1c | |||
| ce1cd0d7e6 | |||
| 566eb34ff8 | |||
| 8b0cbb6f47 | |||
| ce8bcb332b | |||
| fc082edccc | |||
| 4e71e91a4a | |||
| 18c50bb01b | |||
| 09bd2df17b | |||
| 0aa5e8169d | |||
| 5d9c8c365e | |||
| 2deae294c6 | |||
| 238163c6ca | |||
| 99cb82a82c | |||
| c3c33e9654 | |||
| a99649b455 | |||
| df200b942c | |||
| cb05945e76 | |||
| 5b88e4fe5f | |||
| 15baf176b2 | |||
| d9392b94c4 | |||
| 572230c8ad | |||
| fd44c26584 | |||
| 0658abc64c | |||
| 8ba4ff2143 | |||
| 25d00130a8 | |||
| 01c68d7e75 | |||
| 291042352b | |||
| 44207b293e | |||
| 8562841c63 | |||
| f1796ff143 | |||
| 4492707e0e | |||
| e3d714ae41 | |||
| df886a8abb | |||
| 915c02adf3 | |||
| f0471aaddb | |||
| e38e7a8141 | |||
| df1244688e | |||
| 87d3066428 | |||
| 8bc9f30d87 | |||
| e9b1bb25ab | |||
| 304045c63a | |||
| a3da39cd81 | |||
| 87731e3db4 | |||
| cf1217f5c1 | |||
| a338b9694c | |||
| 1098f41885 | |||
| b1f6ab38b5 | |||
| 595befec40 | |||
| 0a513e6fbe | |||
| 60b46062c6 | |||
| 6bf8249f75 | |||
| a8dfd9db76 | |||
| 8772b0287c | |||
| 284d9ddd89 | |||
| dcd012e00f | |||
| 24d1d64417 | |||
| 6da0a180e6 | |||
| 16bd18070f | |||
| 0dc4ba53dc | |||
| e4dfb6dbb5 | |||
| 2e652bbef1 | |||
| 5236b2420a | |||
| 73950befca | |||
| d1b535c7b8 | |||
| ed06cdbbe4 | |||
| 81615a91a6 | |||
| 6252d92f79 | |||
| a65bdd6cca | |||
| afdc7972d6 | |||
| 3ef5ee878c | |||
| 28b804a6ba | |||
| 7037f131dc | |||
| a9970484f3 | |||
| be974bb67e | |||
| eae1296b08 | |||
| 59c979a59d | |||
| 93f86fa074 | |||
| 3c9d3d9bef | |||
| f0131f6ee6 | |||
| b17f00b6d9 | |||
| ddebf5d7ac | |||
| a7e66df56d | |||
| 800be084b6 | |||
| ef81145776 | |||
| 74339d2008 | |||
| 8c7b3b7323 | |||
| 601091b69e | |||
| 388bc5075e | |||
| b7265c3df1 | |||
| cd1c206676 | |||
| 76284f1a16 | |||
| dd19b8d2c2 | |||
| 195b968b86 | |||
| 95e4494cfe | |||
| c4414fa1ed | |||
| bab234a160 | |||
| db2abfb9be | |||
| 13e384ce71 | |||
| 9aa1b86fdf | |||
| 503e6d8bb5 | |||
| 9b598f6bcf | |||
| 8dae39fbda | |||
| 00f7121b1c | |||
| 705ce45a33 | |||
| 9ff8862826 | |||
| 71b7734ce4 | |||
| e17e0933af | |||
| 27d7e61f28 | |||
| 9582d25217 | |||
| 852c51343d | |||
| 7bc22f71bd | |||
| 60826855c4 | |||
| 5daeffd91b | |||
| e11bf1c978 | |||
| c6241b91a2 | |||
| f73b04c42c | |||
| d6f9988e82 | |||
| c2f2878575 | |||
| c25e9f641d | |||
| 17aec580f8 | |||
| c6171d339c | |||
| df40357f19 | |||
| 570082deba | |||
| 6792e6e2dd | |||
| 2365ac8def | |||
| 54473e2c2b | |||
| 47d1cc200d | |||
| 8da4887c2d | |||
| ea3932949c | |||
| a06962ee38 | |||
| c19c6fc6e0 | |||
| 948b48430d | |||
| 881c68e323 | |||
| ca61b8d555 | |||
| f0889a74fe | |||
| 9f07cfe0b7 | |||
| f02c7fca8a | |||
| d45b00b191 | |||
| 7e597dd574 | |||
| 9003cd32ba | |||
| 366887b863 | |||
| 64fbf07e7b | |||
| 5d4a233f52 | |||
| fd79b44920 | |||
| 5eacc872c7 | |||
| 1fadc67fb3 | |||
| ff1087480c | |||
| c91c185221 | |||
| 89e6ed2697 | |||
| fa5560881e | |||
| 36dc70443a | |||
| 1c2ecfd6ab | |||
| 5dc304b5a7 | |||
| a6f29e4f19 | |||
| b3513e4719 | |||
| c3a4217148 | |||
| 533f06109d | |||
| c6f8f06f7e | |||
| f64d405ef3 | |||
| c477c68419 | |||
| 2878f7db22 | |||
| 8bc1d62e88 | |||
| 59546eb54a | |||
| c95fd5a803 | |||
| c3cad65d30 | |||
| 095319602c | |||
| 68a1190bf2 | |||
| 64921e2d8a | |||
| 81eb48cad8 | |||
| f306685469 | |||
| 99a43457e8 | |||
| 90cf6a18da | |||
| 1f2b5d6282 | |||
| 7b93591676 | |||
| 02992ce63b | |||
| b683af298c | |||
| cdbe9d75ef | |||
| 7267c1c8a1 | |||
| e09c9ce281 | |||
| 945f1410d2 | |||
| f5e95029b1 | |||
| 47c186dd87 | |||
| cdfb9d7a0b | |||
| a436d935f1 | |||
| 1293461f5e | |||
| a457ab154e | |||
| 1f5fec851d | |||
| bc0f93baea | |||
| e130775e0d | |||
| 80dd72ce12 | |||
| d8952958db | |||
| 72de562542 | |||
| d43470a3d4 | |||
| d182ae7837 | |||
| b11d089202 | |||
| d194b8d503 | |||
| 8f8a5ada60 | |||
| b4ecfb648d | |||
| 603219d6d6 | |||
| c146be16cb | |||
| 6ddc9251c2 | |||
| 73baaeeb2e | |||
| 361e730f83 | |||
| ffe76a4b67 | |||
| 1948453394 | |||
| b044b52955 | |||
| 528ad4964d | |||
| e76c5f7d64 | |||
| 0533987f80 | |||
| e01f3f158e | |||
| 42619ea2df | |||
| c60763d19e | |||
| 1c8eef9b0b | |||
| d3fe9e5036 | |||
| 159a9eac4a | |||
| c4d733e864 | |||
| bf536d68e1 | |||
| b01c8a7a90 | |||
| a36905607c | |||
| 3e65b23f89 | |||
| 8adccfd521 | |||
| fde3166e6a | |||
| 9477838193 | |||
| cb91c02bea | |||
| a872de82ed | |||
| 9d07be6bde | |||
| 234f4b2b10 | |||
| 10079e4e65 | |||
| 6b0174d034 | |||
| 9fa53aac6f | |||
| 43bc00379c | |||
| ba798e9155 | |||
| 121c996c6e | |||
| e7bd177826 | |||
| 65e3d67eb9 | |||
| 58e3c8604a | |||
| e0b58b7eee | |||
| d88f27f08d | |||
| 4b2654f851 | |||
| 968385b5f4 | |||
| 38ff5d00a0 | |||
| 11ccf11814 | |||
| 305c7a2ef9 | |||
| b273ba930b | |||
| 756203581e | |||
| 50acba3ce8 | |||
| 18ae6a377c | |||
| e662ac80d5 | |||
| 12f0943bd9 | |||
| b40e53f11c | |||
| 414235dd17 | |||
| 37104195b4 | |||
| 138010c1eb | |||
| 5ca6bff8ca | |||
| 70daf39eaf | |||
| 47df461047 | |||
| b230720842 | |||
| 1da6b281de | |||
| 1fc0b4955f | |||
| eb7f8912f8 | |||
| 8343aed4f6 | |||
| c9f9219fa6 | |||
| 5c680739bd | |||
| 86d9afc10c | |||
| 715e174d13 | |||
| 7262be85fd | |||
| 4da399141a | |||
| d7893141f3 | |||
| 94d8d7133b | |||
| 32960af1dc | |||
| 9a042bc9ad | |||
| d6a897e551 | |||
| dfa21c2d1f | |||
| 5434ae1100 | |||
| 10fadd9185 | |||
| b6ae5af4e3 | |||
| 8a0ab163d3 | |||
| f3854cb406 | |||
| f1714a6234 | |||
| 7b017b60d9 | |||
| dedf382f64 | |||
| 36364192d5 | |||
| 9b6c09c32f | |||
| 0b125a5fd7 | |||
| 0b7dda8ab1 | |||
| 3d93b30262 | |||
| 78a06990c7 | |||
| 82b80a6998 | |||
| 71b302846a | |||
| 8823aba9df | |||
| 6b9a685bae | |||
| 14582a9f06 | |||
| 093e5200d0 | |||
| 0405de794a | |||
| d03ac97eff | |||
| 34af70866c | |||
| e00c5eb8b1 | |||
| cbea2ff502 | |||
| 3320a2c837 | |||
| 8388160c32 | |||
| e7c043529c | |||
| 85bf04c7bf | |||
| 44ebf32389 | |||
| 901afadbf1 | |||
| f34e240688 | |||
| fce3102f1c | |||
| 9f03d7c426 | |||
| 0c69c43c3a | |||
| 9e908e4a76 | |||
| 32026ca78b | |||
| 86d2db2aa9 | |||
| 9a578dbce0 | |||
| a94feef6d0 | |||
| 897a8fbc9f | |||
| 510dc763e9 | |||
| 5b182139ae | |||
| de62be0ec5 | |||
| ed022e89e5 | |||
| f6b7168ed4 | |||
| fa9653d179 | |||
| fca2317640 | |||
| a2cf878190 | |||
| 4233544670 | |||
| 4d5a56a5f8 | |||
| eee9dd8c94 | |||
| 060bd787b1 | |||
| f7fe8b88cb | |||
| 8ef6473d33 | |||
| cf2099f18a | |||
| 358917ffc3 | |||
| d0d42e78ea | |||
| b618d7b35b | |||
| 53cbd3cb11 | |||
| 0d86084709 | |||
| 4184a5b251 | |||
| 5d7e8010a5 | |||
| 99a9ecfaac |
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# You may wish to alter this file to override the set of languages analyzed,
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
# or to provide custom queries or build logic.
|
# or to provide custom queries or build logic.
|
||||||
name: "CodeQL"
|
name: Analyze raylib with CodeQL
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -71,7 +71,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@ -90,7 +90,7 @@ jobs:
|
|||||||
cmake --build . --config $BUILD_TYPE
|
cmake --build . --config $BUILD_TYPE
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
upload: false
|
upload: false
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Android
|
name: Build raylib - Android
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: CMakeBuilds
|
name: Build raylib CMake - Windows+Linux
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Linux Examples
|
name: Build raylib examples - Linux
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Windows Examples
|
name: Build raylib examples - Windows
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Linux
|
name: Build raylib - Linux
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -22,22 +22,28 @@ jobs:
|
|||||||
build:
|
build:
|
||||||
permissions:
|
permissions:
|
||||||
contents: write # for actions/upload-release-asset to upload release asset
|
contents: write # for actions/upload-release-asset to upload release asset
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
max-parallel: 1
|
max-parallel: 1
|
||||||
matrix:
|
matrix:
|
||||||
bits: [32, 64]
|
|
||||||
include:
|
include:
|
||||||
- bits: 32
|
- bits: 32
|
||||||
ARCH: "i386"
|
ARCH: "i386"
|
||||||
ARCH_NAME: "i386"
|
ARCH_NAME: "i386"
|
||||||
COMPILER_PATH: "/user/bin"
|
COMPILER_PATH: "/usr/bin"
|
||||||
|
runner: "ubuntu-latest"
|
||||||
- bits: 64
|
- bits: 64
|
||||||
ARCH: "x86_64"
|
ARCH: "x86_64"
|
||||||
ARCH_NAME: "amd64"
|
ARCH_NAME: "amd64"
|
||||||
COMPILER_PATH: "/user/bin"
|
COMPILER_PATH: "/usr/bin"
|
||||||
|
runner: "ubuntu-latest"
|
||||||
|
- bits: 64
|
||||||
|
ARCH: "aarch64"
|
||||||
|
ARCH_NAME: "arm64"
|
||||||
|
COMPILER_PATH: "/usr/bin"
|
||||||
|
runner: "ubuntu-24.04-arm"
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.runner }}
|
||||||
env:
|
env:
|
||||||
RELEASE_NAME: raylib-dev_linux_${{ matrix.ARCH_NAME }}
|
RELEASE_NAME: raylib-dev_linux_${{ matrix.ARCH_NAME }}
|
||||||
|
|
||||||
@ -54,7 +60,6 @@ jobs:
|
|||||||
- name: Setup Environment
|
- name: Setup Environment
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -qq
|
sudo apt-get update -qq
|
||||||
sudo apt-get install gcc-multilib
|
|
||||||
sudo apt-get install -y --no-install-recommends libglfw3 libglfw3-dev libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libxext-dev libxfixes-dev libwayland-dev libxkbcommon-dev
|
sudo apt-get install -y --no-install-recommends libglfw3 libglfw3-dev libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libxext-dev libxfixes-dev libwayland-dev libxkbcommon-dev
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
@ -65,8 +70,13 @@ jobs:
|
|||||||
cd ../../../raylib
|
cd ../../../raylib
|
||||||
# ${{ matrix.ARCH }}-linux-gnu-gcc -v
|
# ${{ matrix.ARCH }}-linux-gnu-gcc -v
|
||||||
|
|
||||||
|
- name: Setup Environment (x86)
|
||||||
|
run : |
|
||||||
|
sudo apt-get install gcc-multilib
|
||||||
|
if: matrix.bits == 32 && matrix.ARCH == 'i386'
|
||||||
|
|
||||||
# TODO: Support 32bit (i386) static/shared library building
|
# TODO: Support 32bit (i386) static/shared library building
|
||||||
- name: Build Library
|
- name: Build Library (32-bit)
|
||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=STATIC RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" CUSTOM_CFLAGS="-m32" -B
|
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=STATIC RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" CUSTOM_CFLAGS="-m32" -B
|
||||||
@ -74,13 +84,21 @@ jobs:
|
|||||||
cd ..
|
cd ..
|
||||||
if: matrix.bits == 32
|
if: matrix.bits == 32
|
||||||
|
|
||||||
- name: Build Library
|
- name: Build Library (64-bit x86)
|
||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=STATIC RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=STATIC RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
||||||
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=SHARED RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=SHARED RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
||||||
cd ..
|
cd ..
|
||||||
if: matrix.bits == 64
|
if: matrix.bits == 64 && matrix.ARCH == 'x86_64'
|
||||||
|
|
||||||
|
- name: Build Library (64-bit ARM)
|
||||||
|
run: |
|
||||||
|
cd src
|
||||||
|
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=STATIC RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
||||||
|
make PLATFORM=PLATFORM_DESKTOP CC=gcc RAYLIB_LIBTYPE=SHARED RAYLIB_RELEASE_PATH="../build/${{ env.RELEASE_NAME }}/lib" -B
|
||||||
|
cd ..
|
||||||
|
if: matrix.bits == 64 && matrix.ARCH == 'aarch64'
|
||||||
|
|
||||||
- name: Generate Artifacts
|
- name: Generate Artifacts
|
||||||
run: |
|
run: |
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: macOS
|
name: Build raylib - macOS
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: WebAssembly
|
name: Build raylib - WebAssembly
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Windows
|
name: Build raylib - Windows
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -54,7 +54,6 @@ jobs:
|
|||||||
- compiler: mingw-w64
|
- compiler: mingw-w64
|
||||||
ziptarget: winarm64 # We don't build arm64 with mingw-w64 yet
|
ziptarget: winarm64 # We don't build arm64 with mingw-w64 yet
|
||||||
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RELEASE_NAME: raylib-dev_${{ matrix.ziptarget }}_${{ matrix.compiler }}
|
RELEASE_NAME: raylib-dev_${{ matrix.ziptarget }}_${{ matrix.compiler }}
|
||||||
GNUTARGET: default
|
GNUTARGET: default
|
||||||
@ -1,4 +1,4 @@
|
|||||||
name: Parse raylib_api
|
name: Parse raylib API
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
@ -14,7 +14,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Update parse files
|
- name: Update parse files
|
||||||
working-directory: parser
|
working-directory: tools/rlparser
|
||||||
run: |
|
run: |
|
||||||
make raylib_api
|
make raylib_api
|
||||||
mv raylib_api.* output
|
mv raylib_api.* output
|
||||||
@ -22,7 +22,7 @@ jobs:
|
|||||||
- name: Diff parse files
|
- name: Diff parse files
|
||||||
id: diff
|
id: diff
|
||||||
run: |
|
run: |
|
||||||
git add -N parser
|
git add -N tools/rlparser/output
|
||||||
git diff --name-only --exit-code
|
git diff --name-only --exit-code
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
@ -30,8 +30,8 @@ jobs:
|
|||||||
if: steps.diff.outcome == 'failure'
|
if: steps.diff.outcome == 'failure'
|
||||||
run: |
|
run: |
|
||||||
set -x
|
set -x
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git config user.name "github-actions[bot]"
|
git config user.name "github-actions[bot]"
|
||||||
git add parser
|
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
git commit -m "Update raylib_api.* by CI"
|
git add tools/rlparser/output
|
||||||
|
git commit -m "rlparser: update raylib_api.* by CI"
|
||||||
git push
|
git push
|
||||||
73
.github/workflows/update_examples.yml
vendored
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
name: Update examples collection
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'examples/**'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'examples/**'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup emsdk
|
||||||
|
uses: mymindstorm/setup-emsdk@v14
|
||||||
|
with:
|
||||||
|
version: 'latest'
|
||||||
|
actions-cache-folder: 'emsdk-cache'
|
||||||
|
|
||||||
|
- name: Clone raylib.com repo to update files
|
||||||
|
run: |
|
||||||
|
git clone https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/raysan5/raylib.com.git
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Build and run rexm tool (requires GNU Makefile)
|
||||||
|
# "rexm validate" validates examples collection, looking for inconsistencies, it does not rebuild examples
|
||||||
|
# "rexm update" validates and updates all examples with inconsistencies, pushing fixes to raylib and raylib.com repos
|
||||||
|
# note that rexm calls examples/Makefile.Web internally, so it requires [make] tool available
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && sudo apt-get install -y libopengl0 libglu1-mesa libx11-dev libxrandr-dev libxcursor-dev libxi-dev libxinerama-dev libgl1-mesa-dev libglu1-mesa-dev
|
||||||
|
cd "${{ github.workspace }}/src"
|
||||||
|
make PLATFORM=PLATFORM_DESKTOP
|
||||||
|
sudo make install
|
||||||
|
make clean
|
||||||
|
make PLATFORM=PLATFORM_WEB
|
||||||
|
cd ../tools/rexm/
|
||||||
|
make
|
||||||
|
export REXM_EXAMPLES_BASE_PATH="${{ github.workspace }}/examples"
|
||||||
|
export REXM_EXAMPLES_WEB_PATH="${{ github.workspace }}/raylib.com/examples"
|
||||||
|
export REXM_EXAMPLES_TEMPLATE_FILE_PATH="${{ github.workspace }}/examples/examples_template.c"
|
||||||
|
export REXM_EXAMPLES_TEMPLATE_SCREENSHOT_PATH="${{ github.workspace }}/examples/examples_template.png"
|
||||||
|
export REXM_EXAMPLES_COLLECTION_FILE_PATH="${{ github.workspace }}/examples/examples_list.txt"
|
||||||
|
export REXM_EXAMPLES_VS2022_SLN_FILE="${{ github.workspace }}/projects/VS2022/raylib.sln"
|
||||||
|
export EMSDK_PATH="${{ github.workspace }}/emsdk-cache/emsdk-main"
|
||||||
|
./rexm validate
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Commit changes to raylib repo (DISABLED)
|
||||||
|
if: github.event_name == 'push' && false
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
git config --global user.name "github-actions[bot]"
|
||||||
|
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git add -A
|
||||||
|
git commit -m "Update examples collection" || echo "git exited with code 1, nothing changed"
|
||||||
|
git push
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Push changes to raylib.com repo (DISABLED)
|
||||||
|
if: github.event_name == 'push' && false
|
||||||
|
run: |
|
||||||
|
cd raylib.com
|
||||||
|
git add -A
|
||||||
|
git commit -m "Update web examples" || echo "git exited with code 1, nothing changed"
|
||||||
|
git push origin
|
||||||
|
shell: bash
|
||||||
23
.gitignore
vendored
@ -55,15 +55,26 @@ packages/
|
|||||||
*.so
|
*.so
|
||||||
*.so.*
|
*.so.*
|
||||||
*.dll
|
*.dll
|
||||||
|
*.h.pch
|
||||||
|
./*.obj
|
||||||
|
|
||||||
|
# Ignore SDL libs for testing
|
||||||
|
src/external/SDL2
|
||||||
|
src/external/SDL3
|
||||||
|
|
||||||
# Emscripten
|
# Emscripten
|
||||||
emsdk
|
emsdk
|
||||||
|
|
||||||
# Ignore wasm data in examples/
|
# Ignore wasm data in examples/
|
||||||
|
examples/**/*
|
||||||
|
!examples/**/*.*
|
||||||
|
!examples/**/*/
|
||||||
|
examples/**/*.exe
|
||||||
examples/**/*.wasm
|
examples/**/*.wasm
|
||||||
examples/**/*.data
|
examples/**/*.data
|
||||||
examples/**/*.js
|
examples/**/*.js
|
||||||
examples/**/*.html
|
examples/**/*.html
|
||||||
|
examples/**/logs/*
|
||||||
|
|
||||||
# Ignore files build by xcode
|
# Ignore files build by xcode
|
||||||
*.mode*v*
|
*.mode*v*
|
||||||
@ -81,6 +92,7 @@ DerivedData/
|
|||||||
|
|
||||||
# VSCode project
|
# VSCode project
|
||||||
.vscode
|
.vscode
|
||||||
|
.clangd
|
||||||
|
|
||||||
# Jetbrains project
|
# Jetbrains project
|
||||||
.idea/
|
.idea/
|
||||||
@ -111,5 +123,12 @@ build/
|
|||||||
build-*/
|
build-*/
|
||||||
docgen_tmp/
|
docgen_tmp/
|
||||||
|
|
||||||
# Parser stuff
|
# Tools stuff
|
||||||
parser/raylib_parser
|
tools/parser/rlparser.exe
|
||||||
|
tools/parser/rlparser
|
||||||
|
tools/rexm/rexm.exe
|
||||||
|
tools/rexm/rexm
|
||||||
|
|
||||||
|
# CI
|
||||||
|
emsdk-cache/
|
||||||
|
raylib.com/
|
||||||
|
|||||||
@ -7,6 +7,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
|||||||
| Name | raylib Version | Language | License |
|
| Name | raylib Version | Language | License |
|
||||||
| :--------------------------------------------------------------------------------------- | :--------------: | :------------------------------------------------------------------: | :------------------: |
|
| :--------------------------------------------------------------------------------------- | :--------------: | :------------------------------------------------------------------: | :------------------: |
|
||||||
| [raylib](https://github.com/raysan5/raylib) | **5.5** | [C/C++](https://en.wikipedia.org/wiki/C_(programming_language)) | Zlib |
|
| [raylib](https://github.com/raysan5/raylib) | **5.5** | [C/C++](https://en.wikipedia.org/wiki/C_(programming_language)) | Zlib |
|
||||||
|
| [raylib-ada](https://github.com/Fabien-Chouteau/raylib-ada) | **5.5** | [Ada](https://en.wikipedia.org/wiki/Ada_(programming_language)) | MIT |
|
||||||
| [raylib-beef](https://github.com/Starpelly/raylib-beef) | **5.5** | [Beef](https://www.beeflang.org) | MIT |
|
| [raylib-beef](https://github.com/Starpelly/raylib-beef) | **5.5** | [Beef](https://www.beeflang.org) | MIT |
|
||||||
| [raybit](https://github.com/Alex-Velez/raybit) | **5.0** | [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck) | MIT |
|
| [raybit](https://github.com/Alex-Velez/raybit) | **5.0** | [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck) | MIT |
|
||||||
| [raylib-c3](https://github.com/c3lang/vendor/tree/main/libraries/raylib55.c3l) | **5.5** | [C3](https://c3-lang.org) | MIT |
|
| [raylib-c3](https://github.com/c3lang/vendor/tree/main/libraries/raylib55.c3l) | **5.5** | [C3](https://c3-lang.org) | MIT |
|
||||||
@ -28,8 +29,10 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
|||||||
| [dray](https://github.com/redthing1/dray) | **5.0** | [D](https://dlang.org) | Apache-2.0 |
|
| [dray](https://github.com/redthing1/dray) | **5.0** | [D](https://dlang.org) | Apache-2.0 |
|
||||||
| [raylib-d](https://github.com/schveiguy/raylib-d) | **5.5** | [D](https://dlang.org) | Zlib |
|
| [raylib-d](https://github.com/schveiguy/raylib-d) | **5.5** | [D](https://dlang.org) | Zlib |
|
||||||
| [rayex](https://github.com/shiryel/rayex) | 3.7 | [elixir](https://elixir-lang.org) | Apache-2.0 |
|
| [rayex](https://github.com/shiryel/rayex) | 3.7 | [elixir](https://elixir-lang.org) | Apache-2.0 |
|
||||||
|
| [raylib-elle](https://github.com/acquitelol/elle/blob/rewrite/std/raylib.le) | **5.5** | [Elle](https://github.com/acquitelol/elle) | GPL-3.0 |
|
||||||
| [raylib-factor](https://github.com/factor/factor/blob/master/extra/raylib/raylib.factor) | 4.5 | [Factor](https://factorcode.org) | BSD |
|
| [raylib-factor](https://github.com/factor/factor/blob/master/extra/raylib/raylib.factor) | 4.5 | [Factor](https://factorcode.org) | BSD |
|
||||||
| [raylib-freebasic](https://github.com/WIITD/raylib-freebasic) | **5.0** | [FreeBASIC](https://www.freebasic.net) | MIT |
|
| [raylib-freebasic](https://github.com/WIITD/raylib-freebasic) | **5.0** | [FreeBASIC](https://www.freebasic.net) | MIT |
|
||||||
|
| [raylib.f](https://github.com/cthulhuology/raylib.f) | **5.5** | [Forth](https://forth.com) | Zlib |
|
||||||
| [fortran-raylib](https://github.com/interkosmos/fortran-raylib) | **5.5** | [Fortran](https://fortran-lang.org) | ISC |
|
| [fortran-raylib](https://github.com/interkosmos/fortran-raylib) | **5.5** | [Fortran](https://fortran-lang.org) | ISC |
|
||||||
| [raylib-go](https://github.com/gen2brain/raylib-go) | **5.5** | [Go](https://golang.org) | Zlib |
|
| [raylib-go](https://github.com/gen2brain/raylib-go) | **5.5** | [Go](https://golang.org) | Zlib |
|
||||||
| [raylib-guile](https://github.com/petelliott/raylib-guile) | **auto** | [Guile](https://www.gnu.org/software/guile) | Zlib |
|
| [raylib-guile](https://github.com/petelliott/raylib-guile) | **auto** | [Guile](https://www.gnu.org/software/guile) | Zlib |
|
||||||
@ -73,6 +76,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
|||||||
| [raylib-rs](https://github.com/raylib-rs/raylib-rs) | **5.5** | [Rust](https://www.rust-lang.org) | Zlib |
|
| [raylib-rs](https://github.com/raylib-rs/raylib-rs) | **5.5** | [Rust](https://www.rust-lang.org) | Zlib |
|
||||||
| [raylib-ruby](https://github.com/wilsonsilva/raylib-ruby) | 4.5 | [Ruby](https://www.ruby-lang.org) | Zlib |
|
| [raylib-ruby](https://github.com/wilsonsilva/raylib-ruby) | 4.5 | [Ruby](https://www.ruby-lang.org) | Zlib |
|
||||||
| [Relib](https://github.com/RedCubeDev-ByteSpace/Relib) | 3.5 | [ReCT](https://github.com/RedCubeDev-ByteSpace/ReCT) | **???** |
|
| [Relib](https://github.com/RedCubeDev-ByteSpace/Relib) | 3.5 | [ReCT](https://github.com/RedCubeDev-ByteSpace/ReCT) | **???** |
|
||||||
|
| [ringraylib5](https://github.com/ring-lang/ring/tree/master/extensions/ringraylib5) | **5.0** | [Ring](https://ring-lang.github.io/) | **???** |
|
||||||
| [racket-raylib](https://github.com/eutro/racket-raylib) | **5.5** | [Racket](https://racket-lang.org) | MIT/Apache-2.0 |
|
| [racket-raylib](https://github.com/eutro/racket-raylib) | **5.5** | [Racket](https://racket-lang.org) | MIT/Apache-2.0 |
|
||||||
| [raylib-swift](https://github.com/STREGAsGate/Raylib) | 4.0 | [Swift](https://swift.org) | MIT |
|
| [raylib-swift](https://github.com/STREGAsGate/Raylib) | 4.0 | [Swift](https://swift.org) | MIT |
|
||||||
| [raylib-scopes](https://github.com/salotz/raylib-scopes) | auto | [Scopes](http://scopes.rocks) | MIT |
|
| [raylib-scopes](https://github.com/salotz/raylib-scopes) | auto | [Scopes](http://scopes.rocks) | MIT |
|
||||||
@ -82,7 +86,7 @@ Some people ported raylib to other languages in the form of bindings or wrappers
|
|||||||
| [raylib.v](https://github.com/irishgreencitrus/raylib.v) | 4.2 | [V](https://vlang.io) | Zlib |
|
| [raylib.v](https://github.com/irishgreencitrus/raylib.v) | 4.2 | [V](https://vlang.io) | Zlib |
|
||||||
| [raylib-vapi](https://github.com/lxmcf/raylib-vapi) | **5.0** | [Vala](https://vala.dev) | Zlib |
|
| [raylib-vapi](https://github.com/lxmcf/raylib-vapi) | **5.0** | [Vala](https://vala.dev) | Zlib |
|
||||||
| [raylib-wren](https://github.com/TSnake41/raylib-wren) | 4.5 | [Wren](http://wren.io) | ISC |
|
| [raylib-wren](https://github.com/TSnake41/raylib-wren) | 4.5 | [Wren](http://wren.io) | ISC |
|
||||||
| [raylib-zig](https://github.com/Not-Nik/raylib-zig) | **5.5** | [Zig](https://ziglang.org) | MIT |
|
| [raylib-zig](https://github.com/raylib-zig/raylib-zig) | **5.6-dev** | [Zig](https://ziglang.org) | MIT |
|
||||||
| [raylib.zig](https://github.com/ryupold/raylib.zig) | **5.1-dev** | [Zig](https://ziglang.org) | MIT |
|
| [raylib.zig](https://github.com/ryupold/raylib.zig) | **5.1-dev** | [Zig](https://ziglang.org) | MIT |
|
||||||
| [raylib-zig-bindings](https://github.com/L-Briand/raylib-zig-bindings) | **5.0** | [Zig](https://ziglang.org) | Zlib |
|
| [raylib-zig-bindings](https://github.com/L-Briand/raylib-zig-bindings) | **5.0** | [Zig](https://ziglang.org) | Zlib |
|
||||||
| [hare-raylib](https://git.sr.ht/~evantj/hare-raylib) | **auto** | [Hare](https://harelang.org) | Zlib |
|
| [hare-raylib](https://git.sr.ht/~evantj/hare-raylib) | **auto** | [Hare](https://harelang.org) | Zlib |
|
||||||
@ -145,7 +149,6 @@ These are older raylib bindings that are more than 2 versions old or have not be
|
|||||||
| [clj-raylib](https://github.com/lsevero/clj-raylib) | 3.0 | [Clojure](https://clojure.org) |
|
| [clj-raylib](https://github.com/lsevero/clj-raylib) | 3.0 | [Clojure](https://clojure.org) |
|
||||||
| [QuickJS-raylib](https://github.com/sntg-p/QuickJS-raylib) | 3.0 | [QuickJS](https://bellard.org/quickjs) |
|
| [QuickJS-raylib](https://github.com/sntg-p/QuickJS-raylib) | 3.0 | [QuickJS](https://bellard.org/quickjs) |
|
||||||
| [raylib-duktape](https://github.com/RobLoach/raylib-duktape) | 2.6 | [JavaScript (Duktape)](https://en.wikipedia.org/wiki/JavaScript) |
|
| [raylib-duktape](https://github.com/RobLoach/raylib-duktape) | 2.6 | [JavaScript (Duktape)](https://en.wikipedia.org/wiki/JavaScript) |
|
||||||
| [raylib-v7](https://github.com/Rabios/raylib-v7) | 3.5 | [JavaScript (v7)](https://en.wikipedia.org/wiki/JavaScript) |
|
|
||||||
| [raylib-chaiscript](https://github.com/RobLoach/raylib-chaiscript) | 2.6 | [ChaiScript](http://chaiscript.com) |
|
| [raylib-chaiscript](https://github.com/RobLoach/raylib-chaiscript) | 2.6 | [ChaiScript](http://chaiscript.com) |
|
||||||
| [raylib-squirrel](https://github.com/RobLoach/raylib-squirrel) | 2.5 | [Squirrel](http://www.squirrel-lang.org) |
|
| [raylib-squirrel](https://github.com/RobLoach/raylib-squirrel) | 2.5 | [Squirrel](http://www.squirrel-lang.org) |
|
||||||
| [racket-raylib-2d](https://github.com/arvyy/racket-raylib-2d) | 2.5 | [Racket](https://racket-lang.org) |
|
| [racket-raylib-2d](https://github.com/arvyy/racket-raylib-2d) | 2.5 | [Racket](https://racket-lang.org) |
|
||||||
|
|||||||
@ -565,7 +565,7 @@ Detailed changes:
|
|||||||
[rtext] ADDED: SetTextLineSpacing() to define line breaks text drawing spacing by @raysan5
|
[rtext] ADDED: SetTextLineSpacing() to define line breaks text drawing spacing by @raysan5
|
||||||
[rtext] RENAMED: LoadFont*() parameter names for consistency and coherence by @raysan5
|
[rtext] RENAMED: LoadFont*() parameter names for consistency and coherence by @raysan5
|
||||||
[rtext] REVIEWED: GetCodepointCount(), ignore unused return value of GetCodepointNext by @ashn-dot-dev
|
[rtext] REVIEWED: GetCodepointCount(), ignore unused return value of GetCodepointNext by @ashn-dot-dev
|
||||||
[rtext] REVIEWED: TextFormat() warn user if buffer overflow occured (#3399) by @Murlocohol
|
[rtext] REVIEWED: TextFormat() warn user if buffer overflow occurred (#3399) by @Murlocohol
|
||||||
[rtext] REVIEWED: TextFormat(), added "..." for truncation (#3366) by @raysan5
|
[rtext] REVIEWED: TextFormat(), added "..." for truncation (#3366) by @raysan5
|
||||||
[rtext] REVIEWED: GetGlyphIndex() (#3000) by @raysan5
|
[rtext] REVIEWED: GetGlyphIndex() (#3000) by @raysan5
|
||||||
[rtext] REVIEWED: GetCodepointNext() to return default value by @chocolate42
|
[rtext] REVIEWED: GetCodepointNext() to return default value by @chocolate42
|
||||||
|
|||||||
@ -29,9 +29,9 @@ include(CompilerFlags)
|
|||||||
# Registers build options that are exposed to cmake
|
# Registers build options that are exposed to cmake
|
||||||
include(CMakeOptions.txt)
|
include(CMakeOptions.txt)
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE AND NOT "${PLATFORM}" MATCHES "DRM")
|
if (UNIX AND NOT APPLE AND NOT "${PLATFORM}" MATCHES "DRM" AND NOT "${PLATFORM}" MATCHES "Web")
|
||||||
if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11)
|
if (NOT GLFW_BUILD_WAYLAND AND NOT GLFW_BUILD_X11)
|
||||||
MESSAGE(FATAL_ERROR "Cannot disable both Wayland and X11")
|
message(FATAL_ERROR "Cannot disable both Wayland and X11")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ if(NOT TARGET uninstall AND PROJECT_IS_TOP_LEVEL)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (${BUILD_EXAMPLES})
|
if (${BUILD_EXAMPLES})
|
||||||
MESSAGE(STATUS "Building examples is enabled")
|
message(STATUS "Building examples is enabled")
|
||||||
add_subdirectory(examples)
|
add_subdirectory(examples)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@ -6,9 +6,9 @@ if(EMSCRIPTEN)
|
|||||||
# When configuring web builds with "emcmake cmake -B build -S .", set PLATFORM to Web by default
|
# When configuring web builds with "emcmake cmake -B build -S .", set PLATFORM to Web by default
|
||||||
SET(PLATFORM Web CACHE STRING "Platform to build for.")
|
SET(PLATFORM Web CACHE STRING "Platform to build for.")
|
||||||
endif()
|
endif()
|
||||||
enum_option(PLATFORM "Desktop;Web;Android;Raspberry Pi;DRM;SDL" "Platform to build for.")
|
enum_option(PLATFORM "Desktop;Web;Android;Raspberry Pi;DRM;SDL;RGFW" "Platform to build for.")
|
||||||
|
|
||||||
enum_option(OPENGL_VERSION "OFF;4.3;3.3;2.1;1.1;ES 2.0;ES 3.0" "Force a specific OpenGL Version?")
|
enum_option(OPENGL_VERSION "OFF;4.3;3.3;2.1;1.1;ES 2.0;ES 3.0;Software" "Force a specific OpenGL Version?")
|
||||||
|
|
||||||
# Configuration options
|
# Configuration options
|
||||||
option(BUILD_EXAMPLES "Build the examples." ${PROJECT_IS_TOP_LEVEL})
|
option(BUILD_EXAMPLES "Build the examples." ${PROJECT_IS_TOP_LEVEL})
|
||||||
|
|||||||
@ -69,8 +69,8 @@ If you have any doubt, don't hesitate to [contact me](mailto:ray@raylib.com)!.
|
|||||||
You can write me a direct mail but you can also contact me on the following networks:
|
You can write me a direct mail but you can also contact me on the following networks:
|
||||||
|
|
||||||
- [raylib Discord](https://discord.gg/raylib) - A direct communication channel for project discussions.
|
- [raylib Discord](https://discord.gg/raylib) - A direct communication channel for project discussions.
|
||||||
- [raylib twitter](https://twitter.com/raysan5) - My personal twitter account, I usually post about raylib, you can send me PMs.
|
|
||||||
- [raylib reddit](https://www.reddit.com/r/raylib/) - A good place for discussions or to ask for help.
|
- [raylib reddit](https://www.reddit.com/r/raylib/) - A good place for discussions or to ask for help.
|
||||||
- [raylib web](http://www.raylib.com/) - On top-right corner there is a bunch of networks where you can find me.
|
- [raylib web](http://www.raylib.com/) - On top-right corner there is a bunch of networks where you can find me.
|
||||||
|
- [raylib X](https://x.com/raysan5) - My personal X account, I usually post about raylib, you can send me PMs.
|
||||||
|
|
||||||
Thank you very much for your time! :)
|
Thank you very much for your time! :)
|
||||||
|
|||||||
@ -11,7 +11,7 @@ Local variables | lowerCase | `Vector2 playerPosition = { 0 };`
|
|||||||
Global variables | lowerCase | `bool windowReady = false;`
|
Global variables | lowerCase | `bool windowReady = false;`
|
||||||
Constants | lowerCase | `const int maxValue = 8;`
|
Constants | lowerCase | `const int maxValue = 8;`
|
||||||
Pointers | MyType *pointer | `Texture2D *array = NULL;`
|
Pointers | MyType *pointer | `Texture2D *array = NULL;`
|
||||||
float values | always x.xf | `float gravity = 10.0f`
|
float values | always x.xf | `float gravity = 10.0f` (avoid `10.f`)
|
||||||
Operators | value1*value2 | `int product = value*6;`
|
Operators | value1*value2 | `int product = value*6;`
|
||||||
Operators | value1/value2 | `int division = value/4;`
|
Operators | value1/value2 | `int division = value/4;`
|
||||||
Operators | value1 + value2 | `int sum = value + 10;`
|
Operators | value1 + value2 | `int sum = value + 10;`
|
||||||
@ -28,6 +28,10 @@ Some other conventions to follow:
|
|||||||
- **ALWAYS** initialize all defined variables.
|
- **ALWAYS** initialize all defined variables.
|
||||||
- **Do not use TABS**, use 4 spaces instead.
|
- **Do not use TABS**, use 4 spaces instead.
|
||||||
- Avoid trailing spaces, please, avoid them
|
- Avoid trailing spaces, please, avoid them
|
||||||
|
- Comments always start with space + capital letter and never end with a '.', place them **before** the line(s) they refer to
|
||||||
|
```c
|
||||||
|
// This is a comment in raylib or raylib examples
|
||||||
|
```
|
||||||
- Control flow statements always are followed **by a space**:
|
- Control flow statements always are followed **by a space**:
|
||||||
```c
|
```c
|
||||||
if (condition) value = 0;
|
if (condition) value = 0;
|
||||||
@ -37,6 +41,7 @@ while (!WindowShouldClose())
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Always use accumulators as `x++` instead of `++x`
|
||||||
for (int i = 0; i < NUM_VALUES; i++) printf("%i", i);
|
for (int i = 0; i < NUM_VALUES; i++) printf("%i", i);
|
||||||
|
|
||||||
// Be careful with the switch formatting!
|
// Be careful with the switch formatting!
|
||||||
|
|||||||
16
README.md
@ -24,14 +24,14 @@ Ready to learn? Jump to [code examples!](https://www.raylib.com/examples.html)
|
|||||||
[](https://www.youtube.com/c/raylib)
|
[](https://www.youtube.com/c/raylib)
|
||||||
[](https://www.twitch.tv/raysan5)
|
[](https://www.twitch.tv/raysan5)
|
||||||
|
|
||||||
[](https://github.com/raysan5/raylib/actions?query=workflow%3AWindows)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_windows.yml)
|
||||||
[](https://github.com/raysan5/raylib/actions?query=workflow%3ALinux)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_linux.yml)
|
||||||
[](https://github.com/raysan5/raylib/actions?query=workflow%3AmacOS)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_macos.yml)
|
||||||
[](https://github.com/raysan5/raylib/actions?query=workflow%3AWebAssembly)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_webassembly.yml)
|
||||||
|
|
||||||
[](https://github.com/raysan5/raylib/actions?query=workflow%3ACMakeBuilds)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_cmake.yml)
|
||||||
[](https://github.com/raysan5/raylib/actions/workflows/windows_examples.yml)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_examples_windows.yml)
|
||||||
[](https://github.com/raysan5/raylib/actions/workflows/linux_examples.yml)
|
[](https://github.com/raysan5/raylib/actions/workflows/build_examples_linux.yml)
|
||||||
|
|
||||||
features
|
features
|
||||||
--------
|
--------
|
||||||
@ -129,7 +129,7 @@ raylib is present in several networks and raylib community is growing everyday.
|
|||||||
|
|
||||||
- Webpage: [https://www.raylib.com](https://www.raylib.com)
|
- Webpage: [https://www.raylib.com](https://www.raylib.com)
|
||||||
- Discord: [https://discord.gg/raylib](https://discord.gg/raylib)
|
- Discord: [https://discord.gg/raylib](https://discord.gg/raylib)
|
||||||
- Twitter: [https://www.twitter.com/raysan5](https://www.twitter.com/raysan5)
|
- X: [https://x.com/raysan5](https://x.com/raysan5)
|
||||||
- BlueSky: [https://bsky.app/profile/raysan5](https://bsky.app/profile/raysan5.bsky.social)
|
- BlueSky: [https://bsky.app/profile/raysan5](https://bsky.app/profile/raysan5.bsky.social)
|
||||||
- Twitch: [https://www.twitch.tv/raysan5](https://www.twitch.tv/raysan5)
|
- Twitch: [https://www.twitch.tv/raysan5](https://www.twitch.tv/raysan5)
|
||||||
- Reddit: [https://www.reddit.com/r/raylib](https://www.reddit.com/r/raylib)
|
- Reddit: [https://www.reddit.com/r/raylib](https://www.reddit.com/r/raylib)
|
||||||
|
|||||||
18
SECURITY.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Most considerations of errors and defects can be handled using the project Issues and/or Discussions.
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
| ------- | ------------------ |
|
||||||
|
| 6.0.x | :white_check_mark: |
|
||||||
|
| < 5.5 | :x: |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Discovered vulnerability can be directly reported using the project Issues and/or Discussions.
|
||||||
|
|
||||||
|
_TODO: Tell them where to go, how often they can expect to get an update on a
|
||||||
|
reported vulnerability, what to expect if the vulnerability is accepted or
|
||||||
|
declined, etc._
|
||||||
659
build.zig
@ -2,7 +2,7 @@ const std = @import("std");
|
|||||||
const builtin = @import("builtin");
|
const builtin = @import("builtin");
|
||||||
|
|
||||||
/// Minimum supported version of Zig
|
/// Minimum supported version of Zig
|
||||||
const min_ver = "0.13.0";
|
const min_ver = "0.15.1";
|
||||||
|
|
||||||
const emccOutputDir = "zig-out" ++ std.fs.path.sep_str ++ "htmlout" ++ std.fs.path.sep_str;
|
const emccOutputDir = "zig-out" ++ std.fs.path.sep_str ++ "htmlout" ++ std.fs.path.sep_str;
|
||||||
const emccOutputFile = "index.html";
|
const emccOutputFile = "index.html";
|
||||||
@ -14,6 +14,72 @@ comptime {
|
|||||||
@compileError("Raylib requires zig version " ++ min_ver);
|
@compileError("Raylib requires zig version " ++ min_ver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const emsdk = struct {
|
||||||
|
const zemscripten = @import("zemscripten");
|
||||||
|
|
||||||
|
pub fn shell(b: *std.Build) std.Build.LazyPath {
|
||||||
|
return b.dependency("raylib", .{}).path("src/shell.html");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const FlagsOptions = struct {
|
||||||
|
optimize: std.builtin.OptimizeMode,
|
||||||
|
asyncify: bool = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn emccDefaultFlags(allocator: std.mem.Allocator, options: FlagsOptions) zemscripten.EmccFlags {
|
||||||
|
var emcc_flags = zemscripten.emccDefaultFlags(allocator, .{
|
||||||
|
.optimize = options.optimize,
|
||||||
|
.fsanitize = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.asyncify)
|
||||||
|
emcc_flags.put("-sASYNCIFY", {}) catch unreachable;
|
||||||
|
|
||||||
|
return emcc_flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const SettingsOptions = struct {
|
||||||
|
optimize: std.builtin.OptimizeMode,
|
||||||
|
es3: bool = true,
|
||||||
|
emsdk_allocator: zemscripten.EmsdkAllocator = .emmalloc,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn emccDefaultSettings(allocator: std.mem.Allocator, options: SettingsOptions) zemscripten.EmccSettings {
|
||||||
|
var emcc_settings = zemscripten.emccDefaultSettings(allocator, .{
|
||||||
|
.optimize = options.optimize,
|
||||||
|
.emsdk_allocator = options.emsdk_allocator,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (options.es3)
|
||||||
|
emcc_settings.put("FULL_ES3", "1") catch unreachable;
|
||||||
|
emcc_settings.put("USE_GLFW", "3") catch unreachable;
|
||||||
|
emcc_settings.put("EXPORTED_RUNTIME_METHODS", "['requestFullscreen']") catch unreachable;
|
||||||
|
|
||||||
|
return emcc_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn emccStep(b: *std.Build, raylib: *std.Build.Step.Compile, wasm: *std.Build.Step.Compile, options: zemscripten.StepOptions) *std.Build.Step {
|
||||||
|
const activate_emsdk_step = zemscripten.activateEmsdkStep(b);
|
||||||
|
|
||||||
|
const emsdk_dep = b.dependency("emsdk", .{});
|
||||||
|
raylib.root_module.addIncludePath(emsdk_dep.path("upstream/emscripten/cache/sysroot/include"));
|
||||||
|
wasm.root_module.addIncludePath(emsdk_dep.path("upstream/emscripten/cache/sysroot/include"));
|
||||||
|
|
||||||
|
const emcc_step = zemscripten.emccStep(b, wasm, options);
|
||||||
|
emcc_step.dependOn(activate_emsdk_step);
|
||||||
|
|
||||||
|
return emcc_step;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn emrunStep(
|
||||||
|
b: *std.Build,
|
||||||
|
html_path: []const u8,
|
||||||
|
extra_args: []const []const u8,
|
||||||
|
) *std.Build.Step {
|
||||||
|
return zemscripten.emrunStep(b, html_path, extra_args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
fn setDesktopPlatform(raylib: *std.Build.Step.Compile, platform: PlatformBackend) void {
|
fn setDesktopPlatform(raylib: *std.Build.Step.Compile, platform: PlatformBackend) void {
|
||||||
switch (platform) {
|
switch (platform) {
|
||||||
.glfw => raylib.root_module.addCMacro("PLATFORM_DESKTOP_GLFW", ""),
|
.glfw => raylib.root_module.addCMacro("PLATFORM_DESKTOP_GLFW", ""),
|
||||||
@ -24,50 +90,6 @@ fn setDesktopPlatform(raylib: *std.Build.Step.Compile, platform: PlatformBackend
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn createEmsdkStep(b: *std.Build, emsdk: *std.Build.Dependency) *std.Build.Step.Run {
|
|
||||||
if (builtin.os.tag == .windows) {
|
|
||||||
return b.addSystemCommand(&.{emsdk.path("emsdk.bat").getPath(b)});
|
|
||||||
} else {
|
|
||||||
return b.addSystemCommand(&.{emsdk.path("emsdk").getPath(b)});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn emSdkSetupStep(b: *std.Build, emsdk: *std.Build.Dependency) !?*std.Build.Step.Run {
|
|
||||||
const dot_emsc_path = emsdk.path(".emscripten").getPath(b);
|
|
||||||
const dot_emsc_exists = !std.meta.isError(std.fs.accessAbsolute(dot_emsc_path, .{}));
|
|
||||||
|
|
||||||
if (!dot_emsc_exists) {
|
|
||||||
const emsdk_install = createEmsdkStep(b, emsdk);
|
|
||||||
emsdk_install.addArgs(&.{ "install", "latest" });
|
|
||||||
const emsdk_activate = createEmsdkStep(b, emsdk);
|
|
||||||
emsdk_activate.addArgs(&.{ "activate", "latest" });
|
|
||||||
emsdk_activate.step.dependOn(&emsdk_install.step);
|
|
||||||
return emsdk_activate;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adapted from Not-Nik/raylib-zig
|
|
||||||
fn emscriptenRunStep(b: *std.Build, emsdk: *std.Build.Dependency, examplePath: []const u8) !*std.Build.Step.Run {
|
|
||||||
const dot_emsc_path = emsdk.path("upstream/emscripten/cache/sysroot/include").getPath(b);
|
|
||||||
// If compiling on windows , use emrun.bat.
|
|
||||||
const emrunExe = switch (builtin.os.tag) {
|
|
||||||
.windows => "emrun.bat",
|
|
||||||
else => "emrun",
|
|
||||||
};
|
|
||||||
var emrun_run_arg = try b.allocator.alloc(u8, dot_emsc_path.len + emrunExe.len + 1);
|
|
||||||
defer b.allocator.free(emrun_run_arg);
|
|
||||||
|
|
||||||
if (b.sysroot == null) {
|
|
||||||
emrun_run_arg = try std.fmt.bufPrint(emrun_run_arg, "{s}" ++ std.fs.path.sep_str ++ "{s}", .{ emsdk.path("upstream/emscripten").getPath(b), emrunExe });
|
|
||||||
} else {
|
|
||||||
emrun_run_arg = try std.fmt.bufPrint(emrun_run_arg, "{s}" ++ std.fs.path.sep_str ++ "{s}", .{ dot_emsc_path, emrunExe });
|
|
||||||
}
|
|
||||||
const run_cmd = b.addSystemCommand(&.{ emrun_run_arg, examplePath });
|
|
||||||
return run_cmd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A list of all flags from `src/config.h` that one may override
|
/// A list of all flags from `src/config.h` that one may override
|
||||||
const config_h_flags = outer: {
|
const config_h_flags = outer: {
|
||||||
// Set this value higher if compile errors happen as `src/config.h` gets larger
|
// Set this value higher if compile errors happen as `src/config.h` gets larger
|
||||||
@ -84,9 +106,9 @@ const config_h_flags = outer: {
|
|||||||
if (std.mem.startsWith(u8, line, "//")) continue;
|
if (std.mem.startsWith(u8, line, "//")) continue;
|
||||||
if (std.mem.startsWith(u8, line, "#if")) continue;
|
if (std.mem.startsWith(u8, line, "#if")) continue;
|
||||||
|
|
||||||
var flag = std.mem.trimLeft(u8, line, " \t"); // Trim whitespace
|
var flag = std.mem.trimStart(u8, line, " \t"); // Trim whitespace
|
||||||
flag = flag["#define ".len - 1 ..]; // Remove #define
|
flag = flag["#define ".len - 1 ..]; // Remove #define
|
||||||
flag = std.mem.trimLeft(u8, flag, " \t"); // Trim whitespace
|
flag = std.mem.trimStart(u8, flag, " \t"); // Trim whitespace
|
||||||
flag = flag[0 .. std.mem.indexOf(u8, flag, " ") orelse continue]; // Flag is only one word, so capture till space
|
flag = flag[0 .. std.mem.indexOf(u8, flag, " ") orelse continue]; // Flag is only one word, so capture till space
|
||||||
flag = "-D" ++ flag; // Prepend with -D
|
flag = "-D" ++ flag; // Prepend with -D
|
||||||
|
|
||||||
@ -100,26 +122,42 @@ const config_h_flags = outer: {
|
|||||||
};
|
};
|
||||||
|
|
||||||
fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, options: Options) !*std.Build.Step.Compile {
|
fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, options: Options) !*std.Build.Step.Compile {
|
||||||
var raylib_flags_arr = std.ArrayList([]const u8).init(b.allocator);
|
var raylib_flags_arr: std.ArrayList([]const u8) = .empty;
|
||||||
defer raylib_flags_arr.deinit();
|
defer raylib_flags_arr.deinit(b.allocator);
|
||||||
|
|
||||||
try raylib_flags_arr.appendSlice(&[_][]const u8{
|
const raylib = b.addLibrary(.{
|
||||||
"-std=gnu99",
|
.name = "raylib",
|
||||||
"-D_GNU_SOURCE",
|
.linkage = options.linkage,
|
||||||
"-DGL_SILENCE_DEPRECATION=199309L",
|
.root_module = b.createModule(.{
|
||||||
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
|
.optimize = optimize,
|
||||||
|
.target = target,
|
||||||
|
.link_libc = true,
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (options.shared) {
|
try raylib_flags_arr.appendSlice(
|
||||||
try raylib_flags_arr.appendSlice(&[_][]const u8{
|
b.allocator,
|
||||||
"-fPIC",
|
&[_][]const u8{
|
||||||
"-DBUILD_LIBTYPE_SHARED",
|
"-std=gnu99",
|
||||||
});
|
"-D_GNU_SOURCE",
|
||||||
|
"-DGL_SILENCE_DEPRECATION=199309L",
|
||||||
|
"-fno-sanitize=undefined", // https://github.com/raysan5/raylib/issues/3674
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (options.linkage == .dynamic) {
|
||||||
|
try raylib_flags_arr.appendSlice(
|
||||||
|
b.allocator,
|
||||||
|
&[_][]const u8{
|
||||||
|
"-fPIC",
|
||||||
|
"-DBUILD_LIBTYPE_SHARED",
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets a flag indiciating the use of a custom `config.h`
|
|
||||||
try raylib_flags_arr.append("-DEXTERNAL_CONFIG_FLAGS");
|
|
||||||
if (options.config.len > 0) {
|
if (options.config.len > 0) {
|
||||||
|
// Sets a flag indicating the use of a custom `config.h`
|
||||||
|
try raylib_flags_arr.append(b.allocator, "-DEXTERNAL_CONFIG_FLAGS");
|
||||||
// Splits a space-separated list of config flags into multiple flags
|
// Splits a space-separated list of config flags into multiple flags
|
||||||
//
|
//
|
||||||
// Note: This means certain flags like `-x c++` won't be processed properly.
|
// Note: This means certain flags like `-x c++` won't be processed properly.
|
||||||
@ -128,7 +166,7 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
|
|
||||||
// Apply config flags supplied by the user
|
// Apply config flags supplied by the user
|
||||||
while (config_iter.next()) |config_flag|
|
while (config_iter.next()) |config_flag|
|
||||||
try raylib_flags_arr.append(config_flag);
|
try raylib_flags_arr.append(b.allocator, config_flag);
|
||||||
|
|
||||||
// Apply all relevant configs from `src/config.h` *except* the user-specified ones
|
// Apply all relevant configs from `src/config.h` *except* the user-specified ones
|
||||||
//
|
//
|
||||||
@ -146,84 +184,70 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Otherwise, append default value from config.h to compile flags
|
// Otherwise, append default value from config.h to compile flags
|
||||||
try raylib_flags_arr.append(flag);
|
try raylib_flags_arr.append(b.allocator, flag);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Set default config if no custome config got set
|
// Set default config if no custom config got set
|
||||||
try raylib_flags_arr.appendSlice(&config_h_flags);
|
try raylib_flags_arr.appendSlice(b.allocator, &config_h_flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
const raylib = if (options.shared)
|
|
||||||
b.addSharedLibrary(.{
|
|
||||||
.name = "raylib",
|
|
||||||
.target = target,
|
|
||||||
.optimize = optimize,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
b.addStaticLibrary(.{
|
|
||||||
.name = "raylib",
|
|
||||||
.target = target,
|
|
||||||
.optimize = optimize,
|
|
||||||
});
|
|
||||||
raylib.linkLibC();
|
|
||||||
|
|
||||||
// No GLFW required on PLATFORM_DRM
|
// No GLFW required on PLATFORM_DRM
|
||||||
if (options.platform != .drm) {
|
if (options.platform != .drm) {
|
||||||
raylib.addIncludePath(b.path("src/external/glfw/include"));
|
raylib.root_module.addIncludePath(b.path("src/external/glfw/include"));
|
||||||
}
|
}
|
||||||
|
|
||||||
var c_source_files = try std.ArrayList([]const u8).initCapacity(b.allocator, 2);
|
var c_source_files: std.ArrayList([]const u8) = try .initCapacity(b.allocator, 2);
|
||||||
c_source_files.appendSliceAssumeCapacity(&.{ "src/rcore.c", "src/utils.c" });
|
c_source_files.appendSliceAssumeCapacity(&.{ "src/rcore.c", "src/utils.c" });
|
||||||
|
|
||||||
if (options.rshapes) {
|
if (options.rshapes) {
|
||||||
try c_source_files.append("src/rshapes.c");
|
try c_source_files.append(b.allocator, "src/rshapes.c");
|
||||||
try raylib_flags_arr.append("-DSUPPORT_MODULE_RSHAPES");
|
try raylib_flags_arr.append(b.allocator, "-DSUPPORT_MODULE_RSHAPES");
|
||||||
}
|
}
|
||||||
if (options.rtextures) {
|
if (options.rtextures) {
|
||||||
try c_source_files.append("src/rtextures.c");
|
try c_source_files.append(b.allocator, "src/rtextures.c");
|
||||||
try raylib_flags_arr.append("-DSUPPORT_MODULE_RTEXTURES");
|
try raylib_flags_arr.append(b.allocator, "-DSUPPORT_MODULE_RTEXTURES");
|
||||||
}
|
}
|
||||||
if (options.rtext) {
|
if (options.rtext) {
|
||||||
try c_source_files.append("src/rtext.c");
|
try c_source_files.append(b.allocator, "src/rtext.c");
|
||||||
try raylib_flags_arr.append("-DSUPPORT_MODULE_RTEXT");
|
try raylib_flags_arr.append(b.allocator, "-DSUPPORT_MODULE_RTEXT");
|
||||||
}
|
}
|
||||||
if (options.rmodels) {
|
if (options.rmodels) {
|
||||||
try c_source_files.append("src/rmodels.c");
|
try c_source_files.append(b.allocator, "src/rmodels.c");
|
||||||
try raylib_flags_arr.append("-DSUPPORT_MODULE_RMODELS");
|
try raylib_flags_arr.append(b.allocator, "-DSUPPORT_MODULE_RMODELS");
|
||||||
}
|
}
|
||||||
if (options.raudio) {
|
if (options.raudio) {
|
||||||
try c_source_files.append("src/raudio.c");
|
try c_source_files.append(b.allocator, "src/raudio.c");
|
||||||
try raylib_flags_arr.append("-DSUPPORT_MODULE_RAUDIO");
|
try raylib_flags_arr.append(b.allocator, "-DSUPPORT_MODULE_RAUDIO");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.opengl_version != .auto) {
|
if (options.opengl_version != .auto) {
|
||||||
raylib.root_module.addCMacro(options.opengl_version.toCMacroStr(), "");
|
raylib.root_module.addCMacro(options.opengl_version.toCMacroStr(), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
raylib.addIncludePath(b.path("src/platforms"));
|
raylib.root_module.addIncludePath(b.path("src/platforms"));
|
||||||
switch (target.result.os.tag) {
|
switch (target.result.os.tag) {
|
||||||
.windows => {
|
.windows => {
|
||||||
switch (options.platform) {
|
switch (options.platform) {
|
||||||
.glfw => try c_source_files.append("src/rglfw.c"),
|
.glfw => try c_source_files.append(b.allocator, "src/rglfw.c"),
|
||||||
.rgfw, .sdl, .drm, .android => {},
|
.rgfw, .sdl, .drm, .android => {},
|
||||||
}
|
}
|
||||||
|
|
||||||
raylib.linkSystemLibrary("winmm");
|
raylib.root_module.linkSystemLibrary("winmm", .{});
|
||||||
raylib.linkSystemLibrary("gdi32");
|
raylib.root_module.linkSystemLibrary("gdi32", .{});
|
||||||
raylib.linkSystemLibrary("opengl32");
|
raylib.root_module.linkSystemLibrary("opengl32", .{});
|
||||||
|
|
||||||
setDesktopPlatform(raylib, options.platform);
|
setDesktopPlatform(raylib, options.platform);
|
||||||
},
|
},
|
||||||
.linux => {
|
.linux => {
|
||||||
if (options.platform == .drm) {
|
if (options.platform == .drm) {
|
||||||
if (options.opengl_version == .auto) {
|
if (options.opengl_version == .auto) {
|
||||||
raylib.linkSystemLibrary("GLESv2");
|
raylib.root_module.linkSystemLibrary("GLESv2", .{});
|
||||||
raylib.root_module.addCMacro("GRAPHICS_API_OPENGL_ES2", "");
|
raylib.root_module.addCMacro("GRAPHICS_API_OPENGL_ES2", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
raylib.linkSystemLibrary("EGL");
|
raylib.root_module.linkSystemLibrary("EGL", .{});
|
||||||
raylib.linkSystemLibrary("gbm");
|
raylib.root_module.linkSystemLibrary("gbm", .{});
|
||||||
raylib.linkSystemLibrary2("libdrm", .{ .use_pkg_config = .force });
|
raylib.root_module.linkSystemLibrary("libdrm", .{ .use_pkg_config = .force });
|
||||||
|
|
||||||
raylib.root_module.addCMacro("PLATFORM_DRM", "");
|
raylib.root_module.addCMacro("PLATFORM_DRM", "");
|
||||||
raylib.root_module.addCMacro("EGL_NO_X11", "");
|
raylib.root_module.addCMacro("EGL_NO_X11", "");
|
||||||
@ -258,21 +282,21 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
const androidAsmPath = try std.fs.path.join(b.allocator, &.{ androidIncludePath, "/asm-generic" });
|
const androidAsmPath = try std.fs.path.join(b.allocator, &.{ androidIncludePath, "/asm-generic" });
|
||||||
const androidGluePath = try std.fs.path.join(b.allocator, &.{ androidNdkPathString, "/sources/android/native_app_glue/" });
|
const androidGluePath = try std.fs.path.join(b.allocator, &.{ androidNdkPathString, "/sources/android/native_app_glue/" });
|
||||||
|
|
||||||
raylib.addLibraryPath(.{ .cwd_relative = androidLibPath });
|
raylib.root_module.addLibraryPath(.{ .cwd_relative = androidLibPath });
|
||||||
raylib.root_module.addLibraryPath(.{ .cwd_relative = androidApiSpecificPath });
|
raylib.root_module.addLibraryPath(.{ .cwd_relative = androidApiSpecificPath });
|
||||||
raylib.addSystemIncludePath(.{ .cwd_relative = androidIncludePath });
|
raylib.root_module.addSystemIncludePath(.{ .cwd_relative = androidIncludePath });
|
||||||
raylib.addSystemIncludePath(.{ .cwd_relative = androidArchIncludePath });
|
raylib.root_module.addSystemIncludePath(.{ .cwd_relative = androidArchIncludePath });
|
||||||
raylib.addSystemIncludePath(.{ .cwd_relative = androidAsmPath });
|
raylib.root_module.addSystemIncludePath(.{ .cwd_relative = androidAsmPath });
|
||||||
raylib.addSystemIncludePath(.{ .cwd_relative = androidGluePath });
|
raylib.root_module.addSystemIncludePath(.{ .cwd_relative = androidGluePath });
|
||||||
|
|
||||||
var libcData = std.ArrayList(u8).init(b.allocator);
|
var libcData: std.ArrayList(u8) = .empty;
|
||||||
const writer = libcData.writer();
|
var aw: std.Io.Writer.Allocating = .fromArrayList(b.allocator, &libcData);
|
||||||
try (std.zig.LibCInstallation{
|
try (std.zig.LibCInstallation{
|
||||||
.include_dir = androidIncludePath,
|
.include_dir = androidIncludePath,
|
||||||
.sys_include_dir = androidIncludePath,
|
.sys_include_dir = androidIncludePath,
|
||||||
.crt_dir = androidApiSpecificPath,
|
.crt_dir = androidApiSpecificPath,
|
||||||
}).render(writer);
|
}).render(&aw.writer);
|
||||||
const libcFile = b.addWriteFiles().add("android-libc.txt", try libcData.toOwnedSlice());
|
const libcFile = b.addWriteFiles().add("android-libc.txt", try libcData.toOwnedSlice(b.allocator));
|
||||||
raylib.setLibCFile(libcFile);
|
raylib.setLibCFile(libcFile);
|
||||||
|
|
||||||
if (options.opengl_version == .auto) {
|
if (options.opengl_version == .auto) {
|
||||||
@ -283,19 +307,19 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
|
|
||||||
setDesktopPlatform(raylib, .android);
|
setDesktopPlatform(raylib, .android);
|
||||||
} else {
|
} else {
|
||||||
try c_source_files.append("src/rglfw.c");
|
try c_source_files.append(b.allocator, "src/rglfw.c");
|
||||||
|
|
||||||
if (options.linux_display_backend == .X11 or options.linux_display_backend == .Both) {
|
if (options.linux_display_backend == .X11 or options.linux_display_backend == .Both) {
|
||||||
raylib.root_module.addCMacro("_GLFW_X11", "");
|
raylib.root_module.addCMacro("_GLFW_X11", "");
|
||||||
raylib.linkSystemLibrary("GLX");
|
raylib.root_module.linkSystemLibrary("GLX", .{});
|
||||||
raylib.linkSystemLibrary("X11");
|
raylib.root_module.linkSystemLibrary("X11", .{});
|
||||||
raylib.linkSystemLibrary("Xcursor");
|
raylib.root_module.linkSystemLibrary("Xcursor", .{});
|
||||||
raylib.linkSystemLibrary("Xext");
|
raylib.root_module.linkSystemLibrary("Xext", .{});
|
||||||
raylib.linkSystemLibrary("Xfixes");
|
raylib.root_module.linkSystemLibrary("Xfixes", .{});
|
||||||
raylib.linkSystemLibrary("Xi");
|
raylib.root_module.linkSystemLibrary("Xi", .{});
|
||||||
raylib.linkSystemLibrary("Xinerama");
|
raylib.root_module.linkSystemLibrary("Xinerama", .{});
|
||||||
raylib.linkSystemLibrary("Xrandr");
|
raylib.root_module.linkSystemLibrary("Xrandr", .{});
|
||||||
raylib.linkSystemLibrary("Xrender");
|
raylib.root_module.linkSystemLibrary("Xrender", .{});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.linux_display_backend == .Wayland or options.linux_display_backend == .Both) {
|
if (options.linux_display_backend == .Wayland or options.linux_display_backend == .Both) {
|
||||||
@ -307,9 +331,9 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
@panic("`wayland-scanner` not found");
|
@panic("`wayland-scanner` not found");
|
||||||
};
|
};
|
||||||
raylib.root_module.addCMacro("_GLFW_WAYLAND", "");
|
raylib.root_module.addCMacro("_GLFW_WAYLAND", "");
|
||||||
raylib.linkSystemLibrary("EGL");
|
raylib.root_module.linkSystemLibrary("EGL", .{});
|
||||||
raylib.linkSystemLibrary("wayland-client");
|
raylib.root_module.linkSystemLibrary("wayland-client", .{});
|
||||||
raylib.linkSystemLibrary("xkbcommon");
|
raylib.root_module.linkSystemLibrary("xkbcommon", .{});
|
||||||
waylandGenerate(b, raylib, "wayland.xml", "wayland-client-protocol");
|
waylandGenerate(b, raylib, "wayland.xml", "wayland-client-protocol");
|
||||||
waylandGenerate(b, raylib, "xdg-shell.xml", "xdg-shell-client-protocol");
|
waylandGenerate(b, raylib, "xdg-shell.xml", "xdg-shell-client-protocol");
|
||||||
waylandGenerate(b, raylib, "xdg-decoration-unstable-v1.xml", "xdg-decoration-unstable-v1-client-protocol");
|
waylandGenerate(b, raylib, "xdg-decoration-unstable-v1.xml", "xdg-decoration-unstable-v1-client-protocol");
|
||||||
@ -324,55 +348,49 @@ fn compileRaylib(b: *std.Build, target: std.Build.ResolvedTarget, optimize: std.
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
.freebsd, .openbsd, .netbsd, .dragonfly => {
|
.freebsd, .openbsd, .netbsd, .dragonfly => {
|
||||||
try c_source_files.append("rglfw.c");
|
try c_source_files.append(b.allocator, "rglfw.c");
|
||||||
raylib.linkSystemLibrary("GL");
|
raylib.root_module.linkSystemLibrary("GL", .{});
|
||||||
raylib.linkSystemLibrary("rt");
|
raylib.root_module.linkSystemLibrary("rt", .{});
|
||||||
raylib.linkSystemLibrary("dl");
|
raylib.root_module.linkSystemLibrary("dl", .{});
|
||||||
raylib.linkSystemLibrary("m");
|
raylib.root_module.linkSystemLibrary("m", .{});
|
||||||
raylib.linkSystemLibrary("X11");
|
raylib.root_module.linkSystemLibrary("X11", .{});
|
||||||
raylib.linkSystemLibrary("Xrandr");
|
raylib.root_module.linkSystemLibrary("Xrandr", .{});
|
||||||
raylib.linkSystemLibrary("Xinerama");
|
raylib.root_module.linkSystemLibrary("Xinerama", .{});
|
||||||
raylib.linkSystemLibrary("Xi");
|
raylib.root_module.linkSystemLibrary("Xi", .{});
|
||||||
raylib.linkSystemLibrary("Xxf86vm");
|
raylib.root_module.linkSystemLibrary("Xxf86vm", .{});
|
||||||
raylib.linkSystemLibrary("Xcursor");
|
raylib.root_module.linkSystemLibrary("Xcursor", .{});
|
||||||
|
|
||||||
setDesktopPlatform(raylib, options.platform);
|
setDesktopPlatform(raylib, options.platform);
|
||||||
},
|
},
|
||||||
.macos => {
|
.macos => {
|
||||||
// Include xcode_frameworks for cross compilation
|
// Include xcode_frameworks for cross compilation
|
||||||
if (b.lazyDependency("xcode_frameworks", .{})) |dep| {
|
if (b.lazyDependency("xcode_frameworks", .{})) |dep| {
|
||||||
raylib.addSystemFrameworkPath(dep.path("Frameworks"));
|
raylib.root_module.addSystemFrameworkPath(dep.path("Frameworks"));
|
||||||
raylib.addSystemIncludePath(dep.path("include"));
|
raylib.root_module.addSystemIncludePath(dep.path("include"));
|
||||||
raylib.addLibraryPath(dep.path("lib"));
|
raylib.root_module.addLibraryPath(dep.path("lib"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// On macos rglfw.c include Objective-C files.
|
// On macos rglfw.c include Objective-C files.
|
||||||
try raylib_flags_arr.append("-ObjC");
|
try raylib_flags_arr.append(b.allocator, "-ObjC");
|
||||||
raylib.root_module.addCSourceFile(.{
|
raylib.root_module.addCSourceFile(.{
|
||||||
.file = b.path("src/rglfw.c"),
|
.file = b.path("src/rglfw.c"),
|
||||||
.flags = raylib_flags_arr.items,
|
.flags = raylib_flags_arr.items,
|
||||||
});
|
});
|
||||||
_ = raylib_flags_arr.pop();
|
_ = raylib_flags_arr.pop();
|
||||||
raylib.linkFramework("Foundation");
|
raylib.root_module.linkFramework("Foundation", .{});
|
||||||
raylib.linkFramework("CoreServices");
|
raylib.root_module.linkFramework("CoreServices", .{});
|
||||||
raylib.linkFramework("CoreGraphics");
|
raylib.root_module.linkFramework("CoreGraphics", .{});
|
||||||
raylib.linkFramework("AppKit");
|
raylib.root_module.linkFramework("AppKit", .{});
|
||||||
raylib.linkFramework("IOKit");
|
raylib.root_module.linkFramework("IOKit", .{});
|
||||||
|
|
||||||
setDesktopPlatform(raylib, options.platform);
|
setDesktopPlatform(raylib, options.platform);
|
||||||
},
|
},
|
||||||
.emscripten => {
|
.emscripten => {
|
||||||
if (b.lazyDependency("emsdk", .{})) |dep| {
|
const activate_emsdk_step = emsdk.zemscripten.activateEmsdkStep(b);
|
||||||
if (try emSdkSetupStep(b, dep)) |emSdkStep| {
|
raylib.step.dependOn(activate_emsdk_step);
|
||||||
raylib.step.dependOn(&emSdkStep.step);
|
|
||||||
}
|
|
||||||
|
|
||||||
raylib.addIncludePath(dep.path("upstream/emscripten/cache/sysroot/include"));
|
|
||||||
}
|
|
||||||
|
|
||||||
raylib.root_module.addCMacro("PLATFORM_WEB", "");
|
raylib.root_module.addCMacro("PLATFORM_WEB", "");
|
||||||
if (options.opengl_version == .auto) {
|
if (options.opengl_version == .auto) {
|
||||||
raylib.root_module.addCMacro("GRAPHICS_API_OPENGL_ES2", "");
|
raylib.root_module.addCMacro("GRAPHICS_API_OPENGL_ES3", "");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
@ -394,9 +412,9 @@ pub fn addRaygui(b: *std.Build, raylib: *std.Build.Step.Compile, raygui_dep: *st
|
|||||||
raylib.step.dependOn(&gen_step.step);
|
raylib.step.dependOn(&gen_step.step);
|
||||||
|
|
||||||
const raygui_c_path = gen_step.add("raygui.c", "#define RAYGUI_IMPLEMENTATION\n#include \"raygui.h\"\n");
|
const raygui_c_path = gen_step.add("raygui.c", "#define RAYGUI_IMPLEMENTATION\n#include \"raygui.h\"\n");
|
||||||
raylib.addCSourceFile(.{ .file = raygui_c_path });
|
raylib.root_module.addCSourceFile(.{ .file = raygui_c_path });
|
||||||
raylib.addIncludePath(raygui_dep.path("src"));
|
raylib.root_module.addIncludePath(raygui_dep.path("src"));
|
||||||
raylib.addIncludePath(raylib_dep.path("src"));
|
raylib.root_module.addIncludePath(raylib_dep.path("src"));
|
||||||
|
|
||||||
raylib.installHeader(raygui_dep.path("src/raygui.h"), "raygui.h");
|
raylib.installHeader(raygui_dep.path("src/raygui.h"), "raygui.h");
|
||||||
}
|
}
|
||||||
@ -408,8 +426,8 @@ pub const Options = struct {
|
|||||||
rtext: bool = true,
|
rtext: bool = true,
|
||||||
rtextures: bool = true,
|
rtextures: bool = true,
|
||||||
platform: PlatformBackend = .glfw,
|
platform: PlatformBackend = .glfw,
|
||||||
shared: bool = false,
|
linkage: std.builtin.LinkMode = .static,
|
||||||
linux_display_backend: LinuxDisplayBackend = .Both,
|
linux_display_backend: LinuxDisplayBackend = .X11,
|
||||||
opengl_version: OpenglVersion = .auto,
|
opengl_version: OpenglVersion = .auto,
|
||||||
android_ndk: []const u8 = "",
|
android_ndk: []const u8 = "",
|
||||||
android_api_version: []const u8 = "35",
|
android_api_version: []const u8 = "35",
|
||||||
@ -420,13 +438,13 @@ pub const Options = struct {
|
|||||||
|
|
||||||
pub fn getOptions(b: *std.Build) Options {
|
pub fn getOptions(b: *std.Build) Options {
|
||||||
return .{
|
return .{
|
||||||
.platform = b.option(PlatformBackend, "platform", "Choose the platform backedn for desktop target") orelse defaults.platform,
|
.platform = b.option(PlatformBackend, "platform", "Choose the platform backend for desktop target") orelse defaults.platform,
|
||||||
.raudio = b.option(bool, "raudio", "Compile with audio support") orelse defaults.raudio,
|
.raudio = b.option(bool, "raudio", "Compile with audio support") orelse defaults.raudio,
|
||||||
.rmodels = b.option(bool, "rmodels", "Compile with models support") orelse defaults.rmodels,
|
.rmodels = b.option(bool, "rmodels", "Compile with models support") orelse defaults.rmodels,
|
||||||
.rtext = b.option(bool, "rtext", "Compile with text support") orelse defaults.rtext,
|
.rtext = b.option(bool, "rtext", "Compile with text support") orelse defaults.rtext,
|
||||||
.rtextures = b.option(bool, "rtextures", "Compile with textures support") orelse defaults.rtextures,
|
.rtextures = b.option(bool, "rtextures", "Compile with textures support") orelse defaults.rtextures,
|
||||||
.rshapes = b.option(bool, "rshapes", "Compile with shapes support") orelse defaults.rshapes,
|
.rshapes = b.option(bool, "rshapes", "Compile with shapes support") orelse defaults.rshapes,
|
||||||
.shared = b.option(bool, "shared", "Compile as shared library") orelse defaults.shared,
|
.linkage = b.option(std.builtin.LinkMode, "linkage", "Compile as shared or static library") orelse defaults.linkage,
|
||||||
.linux_display_backend = b.option(LinuxDisplayBackend, "linux_display_backend", "Linux display backend to use") orelse defaults.linux_display_backend,
|
.linux_display_backend = b.option(LinuxDisplayBackend, "linux_display_backend", "Linux display backend to use") orelse defaults.linux_display_backend,
|
||||||
.opengl_version = b.option(OpenglVersion, "opengl_version", "OpenGL version to use") orelse defaults.opengl_version,
|
.opengl_version = b.option(OpenglVersion, "opengl_version", "OpenGL version to use") orelse defaults.opengl_version,
|
||||||
.config = b.option([]const u8, "config", "Compile with custom define macros overriding config.h") orelse &.{},
|
.config = b.option([]const u8, "config", "Compile with custom define macros overriding config.h") orelse &.{},
|
||||||
@ -473,14 +491,7 @@ pub const PlatformBackend = enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
pub fn build(b: *std.Build) !void {
|
pub fn build(b: *std.Build) !void {
|
||||||
// Standard target options allows the person running `zig build` to choose
|
|
||||||
// what target to build for. Here we do not override the defaults, which
|
|
||||||
// means any target is allowed, and the default is native. Other options
|
|
||||||
// for restricting supported target set are available.
|
|
||||||
const target = b.standardTargetOptions(.{});
|
const target = b.standardTargetOptions(.{});
|
||||||
// Standard optimization options allow the person running `zig build` to select
|
|
||||||
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
|
|
||||||
// set a preferred release mode, allowing the user to decide how to optimize.
|
|
||||||
const optimize = b.standardOptimizeOption(.{});
|
const optimize = b.standardOptimizeOption(.{});
|
||||||
|
|
||||||
const lib = try compileRaylib(b, target, optimize, Options.getOptions(b));
|
const lib = try compileRaylib(b, target, optimize, Options.getOptions(b));
|
||||||
@ -503,6 +514,145 @@ pub fn build(b: *std.Build) !void {
|
|||||||
examples.dependOn(try addExamples("textures", b, target, optimize, lib));
|
examples.dependOn(try addExamples("textures", b, target, optimize, lib));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn addExamples(
|
||||||
|
comptime module: []const u8,
|
||||||
|
b: *std.Build,
|
||||||
|
target: std.Build.ResolvedTarget,
|
||||||
|
optimize: std.builtin.OptimizeMode,
|
||||||
|
raylib: *std.Build.Step.Compile,
|
||||||
|
) !*std.Build.Step {
|
||||||
|
const all = b.step(module, "All " ++ module ++ " examples");
|
||||||
|
const module_subpath = b.pathJoin(&.{ "examples", module });
|
||||||
|
var dir = try std.fs.cwd().openDir(b.pathFromRoot(module_subpath), .{ .iterate = true });
|
||||||
|
defer dir.close();
|
||||||
|
|
||||||
|
var iter = dir.iterate();
|
||||||
|
while (try iter.next()) |entry| {
|
||||||
|
if (entry.kind != .file) continue;
|
||||||
|
const extension_idx = std.mem.lastIndexOf(u8, entry.name, ".c") orelse continue;
|
||||||
|
const name = entry.name[0..extension_idx];
|
||||||
|
const path = b.pathJoin(&.{ module_subpath, entry.name });
|
||||||
|
|
||||||
|
// zig's mingw headers do not include pthread.h
|
||||||
|
if (std.mem.eql(u8, "core_loading_thread", name) and target.result.os.tag == .windows) continue;
|
||||||
|
|
||||||
|
const exe_mod = b.createModule(.{
|
||||||
|
.target = target,
|
||||||
|
.optimize = optimize,
|
||||||
|
});
|
||||||
|
exe_mod.addCSourceFile(.{ .file = b.path(path), .flags = &.{} });
|
||||||
|
exe_mod.linkLibrary(raylib);
|
||||||
|
|
||||||
|
const run_step = b.step(name, name);
|
||||||
|
|
||||||
|
if (target.result.os.tag == .emscripten) {
|
||||||
|
const wasm = b.addLibrary(.{
|
||||||
|
.name = name,
|
||||||
|
.linkage = .static,
|
||||||
|
.root_module = exe_mod,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (std.mem.eql(u8, name, "rlgl_standalone")) {
|
||||||
|
//TODO: Make rlgl_standalone example work
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (std.mem.eql(u8, name, "raylib_opengl_interop")) {
|
||||||
|
//TODO: Make raylib_opengl_interop example work
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const emcc_flags = emsdk.emccDefaultFlags(b.allocator, .{ .optimize = optimize });
|
||||||
|
const emcc_settings = emsdk.emccDefaultSettings(b.allocator, .{ .optimize = optimize });
|
||||||
|
|
||||||
|
const install_dir: std.Build.InstallDir = .{ .custom = "htmlout" };
|
||||||
|
const emcc_step = emsdk.emccStep(b, raylib, wasm, .{
|
||||||
|
.optimize = optimize,
|
||||||
|
.flags = emcc_flags,
|
||||||
|
.settings = emcc_settings,
|
||||||
|
.shell_file_path = b.path("src/shell.html"),
|
||||||
|
.embed_paths = &.{
|
||||||
|
.{
|
||||||
|
.src_path = b.pathJoin(&.{ module_subpath, "resources" }),
|
||||||
|
.virtual_path = "resources",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.install_dir = install_dir,
|
||||||
|
});
|
||||||
|
|
||||||
|
const html_filename = try std.fmt.allocPrint(b.allocator, "{s}.html", .{wasm.name});
|
||||||
|
const emrun_step = emsdk.emrunStep(
|
||||||
|
b,
|
||||||
|
b.getInstallPath(install_dir, html_filename),
|
||||||
|
&.{"--no_browser"},
|
||||||
|
);
|
||||||
|
emrun_step.dependOn(emcc_step);
|
||||||
|
|
||||||
|
run_step.dependOn(emrun_step);
|
||||||
|
all.dependOn(emcc_step);
|
||||||
|
} else {
|
||||||
|
// special examples that test using these external dependencies directly
|
||||||
|
// alongside raylib
|
||||||
|
if (std.mem.eql(u8, name, "rlgl_standalone")) {
|
||||||
|
exe_mod.addIncludePath(b.path("src"));
|
||||||
|
exe_mod.addIncludePath(b.path("src/external/glfw/include"));
|
||||||
|
if (!hasCSource(raylib.root_module, "rglfw.c")) {
|
||||||
|
exe_mod.addCSourceFile(.{ .file = b.path("src/rglfw.c"), .flags = &.{} });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (std.mem.eql(u8, name, "raylib_opengl_interop")) {
|
||||||
|
exe_mod.addIncludePath(b.path("src/external"));
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (target.result.os.tag) {
|
||||||
|
.windows => {
|
||||||
|
exe_mod.linkSystemLibrary("winmm", .{});
|
||||||
|
exe_mod.linkSystemLibrary("gdi32", .{});
|
||||||
|
exe_mod.linkSystemLibrary("opengl32", .{});
|
||||||
|
|
||||||
|
exe_mod.addCMacro("PLATFORM_DESKTOP", "");
|
||||||
|
},
|
||||||
|
.linux => {
|
||||||
|
exe_mod.linkSystemLibrary("GL", .{});
|
||||||
|
exe_mod.linkSystemLibrary("rt", .{});
|
||||||
|
exe_mod.linkSystemLibrary("dl", .{});
|
||||||
|
exe_mod.linkSystemLibrary("m", .{});
|
||||||
|
exe_mod.linkSystemLibrary("X11", .{});
|
||||||
|
|
||||||
|
exe_mod.addCMacro("PLATFORM_DESKTOP", "");
|
||||||
|
},
|
||||||
|
.macos => {
|
||||||
|
exe_mod.linkFramework("Foundation", .{});
|
||||||
|
exe_mod.linkFramework("Cocoa", .{});
|
||||||
|
exe_mod.linkFramework("OpenGL", .{});
|
||||||
|
exe_mod.linkFramework("CoreAudio", .{});
|
||||||
|
exe_mod.linkFramework("CoreVideo", .{});
|
||||||
|
exe_mod.linkFramework("IOKit", .{});
|
||||||
|
|
||||||
|
exe_mod.addCMacro("PLATFORM_DESKTOP", "");
|
||||||
|
},
|
||||||
|
else => {
|
||||||
|
@panic("Unsupported OS");
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const exe = b.addExecutable(.{
|
||||||
|
.name = name,
|
||||||
|
.root_module = exe_mod,
|
||||||
|
});
|
||||||
|
|
||||||
|
const install_cmd = b.addInstallArtifact(exe, .{});
|
||||||
|
|
||||||
|
const run_cmd = b.addRunArtifact(exe);
|
||||||
|
run_cmd.cwd = b.path(module_subpath);
|
||||||
|
run_cmd.step.dependOn(&install_cmd.step);
|
||||||
|
|
||||||
|
run_step.dependOn(&run_cmd.step);
|
||||||
|
all.dependOn(&install_cmd.step);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return all;
|
||||||
|
}
|
||||||
|
|
||||||
fn waylandGenerate(
|
fn waylandGenerate(
|
||||||
b: *std.Build,
|
b: *std.Build,
|
||||||
raylib: *std.Build.Step.Compile,
|
raylib: *std.Build.Step.Compile,
|
||||||
@ -516,191 +666,16 @@ fn waylandGenerate(
|
|||||||
|
|
||||||
const client_step = b.addSystemCommand(&.{ "wayland-scanner", "client-header" });
|
const client_step = b.addSystemCommand(&.{ "wayland-scanner", "client-header" });
|
||||||
client_step.addFileArg(b.path(protocolDir));
|
client_step.addFileArg(b.path(protocolDir));
|
||||||
raylib.addIncludePath(client_step.addOutputFileArg(clientHeader).dirname());
|
raylib.root_module.addIncludePath(client_step.addOutputFileArg(clientHeader).dirname());
|
||||||
|
|
||||||
const private_step = b.addSystemCommand(&.{ "wayland-scanner", "private-code" });
|
const private_step = b.addSystemCommand(&.{ "wayland-scanner", "private-code" });
|
||||||
private_step.addFileArg(b.path(protocolDir));
|
private_step.addFileArg(b.path(protocolDir));
|
||||||
raylib.addIncludePath(private_step.addOutputFileArg(privateCode).dirname());
|
raylib.root_module.addIncludePath(private_step.addOutputFileArg(privateCode).dirname());
|
||||||
|
|
||||||
raylib.step.dependOn(&client_step.step);
|
raylib.step.dependOn(&client_step.step);
|
||||||
raylib.step.dependOn(&private_step.step);
|
raylib.step.dependOn(&private_step.step);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn addExamples(
|
|
||||||
comptime module: []const u8,
|
|
||||||
b: *std.Build,
|
|
||||||
target: std.Build.ResolvedTarget,
|
|
||||||
optimize: std.builtin.OptimizeMode,
|
|
||||||
raylib: *std.Build.Step.Compile,
|
|
||||||
) !*std.Build.Step {
|
|
||||||
const all = b.step(module, "All " ++ module ++ " examples");
|
|
||||||
const module_subpath = b.pathJoin(&.{ "examples", module });
|
|
||||||
const module_resources = b.pathJoin(&.{ module_subpath, "resources@resources" });
|
|
||||||
var dir = try std.fs.cwd().openDir(b.pathFromRoot(module_subpath), .{ .iterate = true });
|
|
||||||
defer if (comptime builtin.zig_version.minor >= 12) dir.close();
|
|
||||||
|
|
||||||
var iter = dir.iterate();
|
|
||||||
while (try iter.next()) |entry| {
|
|
||||||
if (entry.kind != .file) continue;
|
|
||||||
const extension_idx = std.mem.lastIndexOf(u8, entry.name, ".c") orelse continue;
|
|
||||||
const name = entry.name[0..extension_idx];
|
|
||||||
const path = b.pathJoin(&.{ module_subpath, entry.name });
|
|
||||||
|
|
||||||
// zig's mingw headers do not include pthread.h
|
|
||||||
if (std.mem.eql(u8, "core_loading_thread", name) and target.result.os.tag == .windows) continue;
|
|
||||||
|
|
||||||
if (target.result.os.tag == .emscripten) {
|
|
||||||
const exe_lib = b.addStaticLibrary(.{
|
|
||||||
.name = name,
|
|
||||||
.target = target,
|
|
||||||
.optimize = optimize,
|
|
||||||
});
|
|
||||||
exe_lib.addCSourceFile(.{
|
|
||||||
.file = b.path(path),
|
|
||||||
.flags = &.{},
|
|
||||||
});
|
|
||||||
exe_lib.linkLibC();
|
|
||||||
|
|
||||||
if (std.mem.eql(u8, name, "rlgl_standalone")) {
|
|
||||||
//TODO: Make rlgl_standalone example work
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (std.mem.eql(u8, name, "raylib_opengl_interop")) {
|
|
||||||
//TODO: Make raylib_opengl_interop example work
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
exe_lib.linkLibrary(raylib);
|
|
||||||
|
|
||||||
// Include emscripten for cross compilation
|
|
||||||
if (b.lazyDependency("emsdk", .{})) |emsdk_dep| {
|
|
||||||
if (try emSdkSetupStep(b, emsdk_dep)) |emSdkStep| {
|
|
||||||
exe_lib.step.dependOn(&emSdkStep.step);
|
|
||||||
}
|
|
||||||
|
|
||||||
exe_lib.addIncludePath(emsdk_dep.path("upstream/emscripten/cache/sysroot/include"));
|
|
||||||
|
|
||||||
// Create the output directory because emcc can't do it.
|
|
||||||
const emccOutputDirExample = b.pathJoin(&.{ emccOutputDir, name, std.fs.path.sep_str });
|
|
||||||
const mkdir_command = switch (builtin.os.tag) {
|
|
||||||
.windows => b.addSystemCommand(&.{ "cmd.exe", "/c", "if", "not", "exist", emccOutputDirExample, "mkdir", emccOutputDirExample }),
|
|
||||||
else => b.addSystemCommand(&.{ "mkdir", "-p", emccOutputDirExample }),
|
|
||||||
};
|
|
||||||
|
|
||||||
const emcc_exe = switch (builtin.os.tag) {
|
|
||||||
.windows => "emcc.bat",
|
|
||||||
else => "emcc",
|
|
||||||
};
|
|
||||||
|
|
||||||
const emcc_exe_path = b.pathJoin(&.{ emsdk_dep.path("upstream/emscripten").getPath(b), emcc_exe });
|
|
||||||
const emcc_command = b.addSystemCommand(&[_][]const u8{emcc_exe_path});
|
|
||||||
emcc_command.step.dependOn(&mkdir_command.step);
|
|
||||||
const emccOutputDirExampleWithFile = b.pathJoin(&.{ emccOutputDir, name, std.fs.path.sep_str, emccOutputFile });
|
|
||||||
emcc_command.addArgs(&[_][]const u8{
|
|
||||||
"-o",
|
|
||||||
emccOutputDirExampleWithFile,
|
|
||||||
"-sFULL-ES3=1",
|
|
||||||
"-sUSE_GLFW=3",
|
|
||||||
"-sSTACK_OVERFLOW_CHECK=1",
|
|
||||||
"-sEXPORTED_RUNTIME_METHODS=['requestFullscreen']",
|
|
||||||
"-sASYNCIFY",
|
|
||||||
"-O0",
|
|
||||||
"--emrun",
|
|
||||||
"--preload-file",
|
|
||||||
module_resources,
|
|
||||||
"--shell-file",
|
|
||||||
b.path("src/shell.html").getPath(b),
|
|
||||||
});
|
|
||||||
|
|
||||||
const link_items: []const *std.Build.Step.Compile = &.{
|
|
||||||
raylib,
|
|
||||||
exe_lib,
|
|
||||||
};
|
|
||||||
for (link_items) |item| {
|
|
||||||
emcc_command.addFileArg(item.getEmittedBin());
|
|
||||||
emcc_command.step.dependOn(&item.step);
|
|
||||||
}
|
|
||||||
|
|
||||||
const run_step = try emscriptenRunStep(b, emsdk_dep, emccOutputDirExampleWithFile);
|
|
||||||
run_step.step.dependOn(&emcc_command.step);
|
|
||||||
run_step.addArg("--no_browser");
|
|
||||||
const run_option = b.step(name, name);
|
|
||||||
|
|
||||||
run_option.dependOn(&run_step.step);
|
|
||||||
|
|
||||||
all.dependOn(&emcc_command.step);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const exe = b.addExecutable(.{
|
|
||||||
.name = name,
|
|
||||||
.target = target,
|
|
||||||
.optimize = optimize,
|
|
||||||
});
|
|
||||||
exe.addCSourceFile(.{ .file = b.path(path), .flags = &.{} });
|
|
||||||
exe.linkLibC();
|
|
||||||
|
|
||||||
// special examples that test using these external dependencies directly
|
|
||||||
// alongside raylib
|
|
||||||
if (std.mem.eql(u8, name, "rlgl_standalone")) {
|
|
||||||
exe.addIncludePath(b.path("src"));
|
|
||||||
exe.addIncludePath(b.path("src/external/glfw/include"));
|
|
||||||
if (!hasCSource(raylib.root_module, "rglfw.c")) {
|
|
||||||
exe.addCSourceFile(.{ .file = b.path("src/rglfw.c"), .flags = &.{} });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (std.mem.eql(u8, name, "raylib_opengl_interop")) {
|
|
||||||
exe.addIncludePath(b.path("src/external"));
|
|
||||||
}
|
|
||||||
|
|
||||||
exe.linkLibrary(raylib);
|
|
||||||
|
|
||||||
switch (target.result.os.tag) {
|
|
||||||
.windows => {
|
|
||||||
exe.linkSystemLibrary("winmm");
|
|
||||||
exe.linkSystemLibrary("gdi32");
|
|
||||||
exe.linkSystemLibrary("opengl32");
|
|
||||||
|
|
||||||
exe.root_module.addCMacro("PLATFORM_DESKTOP", "");
|
|
||||||
},
|
|
||||||
.linux => {
|
|
||||||
exe.linkSystemLibrary("GL");
|
|
||||||
exe.linkSystemLibrary("rt");
|
|
||||||
exe.linkSystemLibrary("dl");
|
|
||||||
exe.linkSystemLibrary("m");
|
|
||||||
exe.linkSystemLibrary("X11");
|
|
||||||
|
|
||||||
exe.root_module.addCMacro("PLATFORM_DESKTOP", "");
|
|
||||||
},
|
|
||||||
.macos => {
|
|
||||||
exe.linkFramework("Foundation");
|
|
||||||
exe.linkFramework("Cocoa");
|
|
||||||
exe.linkFramework("OpenGL");
|
|
||||||
exe.linkFramework("CoreAudio");
|
|
||||||
exe.linkFramework("CoreVideo");
|
|
||||||
exe.linkFramework("IOKit");
|
|
||||||
|
|
||||||
exe.root_module.addCMacro("PLATFORM_DESKTOP", "");
|
|
||||||
},
|
|
||||||
else => {
|
|
||||||
@panic("Unsupported OS");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
const install_cmd = b.addInstallArtifact(exe, .{});
|
|
||||||
|
|
||||||
const run_cmd = b.addRunArtifact(exe);
|
|
||||||
run_cmd.cwd = b.path(module_subpath);
|
|
||||||
run_cmd.step.dependOn(&install_cmd.step);
|
|
||||||
|
|
||||||
const run_step = b.step(name, name);
|
|
||||||
run_step.dependOn(&run_cmd.step);
|
|
||||||
|
|
||||||
all.dependOn(&install_cmd.step);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return all;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn hasCSource(module: *std.Build.Module, name: []const u8) bool {
|
fn hasCSource(module: *std.Build.Module, name: []const u8) bool {
|
||||||
for (module.link_objects.items) |o| switch (o) {
|
for (module.link_objects.items) |o| switch (o) {
|
||||||
.c_source_file => |c| if (switch (c.file) {
|
.c_source_file => |c| if (switch (c.file) {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
.{
|
.{
|
||||||
.name = .raylib,
|
.name = .raylib,
|
||||||
.version = "5.5.0",
|
.version = "5.6.0-dev",
|
||||||
.minimum_zig_version = "0.14.0",
|
.minimum_zig_version = "0.15.1",
|
||||||
|
|
||||||
.fingerprint = 0x13035e5cb8bc1ac2, // Changing this has security and trust implications.
|
.fingerprint = 0x13035e5cb8bc1ac2, // Changing this has security and trust implications.
|
||||||
|
|
||||||
@ -14,7 +14,10 @@
|
|||||||
.emsdk = .{
|
.emsdk = .{
|
||||||
.url = "git+https://github.com/emscripten-core/emsdk#4.0.9",
|
.url = "git+https://github.com/emscripten-core/emsdk#4.0.9",
|
||||||
.hash = "N-V-__8AAJl1DwBezhYo_VE6f53mPVm00R-Fk28NPW7P14EQ",
|
.hash = "N-V-__8AAJl1DwBezhYo_VE6f53mPVm00R-Fk28NPW7P14EQ",
|
||||||
.lazy = true,
|
},
|
||||||
|
.zemscripten = .{
|
||||||
|
.url = "git+https://github.com/zig-gamedev/zemscripten#3fa4b778852226c7346bdcc3c1486e875a9a6d02",
|
||||||
|
.hash = "zemscripten-0.2.0-dev-sRlDqApRAACspTbAZnuNKWIzfWzSYgYkb2nWAXZ-tqqt",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -19,9 +19,18 @@ join_paths(libdir_for_pc_file "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}")
|
|||||||
join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
|
join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}")
|
||||||
configure_file(../raylib.pc.in raylib.pc @ONLY)
|
configure_file(../raylib.pc.in raylib.pc @ONLY)
|
||||||
configure_file(../cmake/raylib-config-version.cmake raylib-config-version.cmake @ONLY)
|
configure_file(../cmake/raylib-config-version.cmake raylib-config-version.cmake @ONLY)
|
||||||
|
configure_file(../cmake/raylib-config.cmake raylib-config.cmake @ONLY)
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/raylib.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/raylib.pc DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/raylib-config-version.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raylib")
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/raylib-config-version.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raylib")
|
||||||
install(FILES ${PROJECT_SOURCE_DIR}/../cmake/raylib-config.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raylib")
|
install(FILES
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/raylib-config-version.cmake"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/raylib-config.cmake"
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/raylib
|
||||||
|
)
|
||||||
|
install(EXPORT raylib-targets
|
||||||
|
FILE raylib-targets.cmake
|
||||||
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/raylib
|
||||||
|
)
|
||||||
|
|
||||||
# populates raylib_{FOUND, INCLUDE_DIRS, LIBRARIES, LDFLAGS, DEFINITIONS}
|
# populates raylib_{FOUND, INCLUDE_DIRS, LIBRARIES, LDFLAGS, DEFINITIONS}
|
||||||
include(PopulateConfigVariablesLocally)
|
include(PopulateConfigVariablesLocally)
|
||||||
|
|||||||
@ -7,6 +7,8 @@ if(POLICY CMP0072)
|
|||||||
cmake_policy(SET CMP0072 NEW)
|
cmake_policy(SET CMP0072 NEW)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(RAYLIB_DEPENDENCIES "include(CMakeFindDependencyMacro)")
|
||||||
|
|
||||||
if (${PLATFORM} MATCHES "Desktop")
|
if (${PLATFORM} MATCHES "Desktop")
|
||||||
set(PLATFORM_CPP "PLATFORM_DESKTOP")
|
set(PLATFORM_CPP "PLATFORM_DESKTOP")
|
||||||
|
|
||||||
@ -36,7 +38,8 @@ if (${PLATFORM} MATCHES "Desktop")
|
|||||||
find_library(OSS_LIBRARY ossaudio)
|
find_library(OSS_LIBRARY ossaudio)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(LIBS_PRIVATE m pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
|
set(LIBS_PRIVATE pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
|
||||||
|
set(LIBS_PUBLIC m)
|
||||||
else ()
|
else ()
|
||||||
find_library(pthread NAMES pthread)
|
find_library(pthread NAMES pthread)
|
||||||
find_package(OpenGL QUIET)
|
find_package(OpenGL QUIET)
|
||||||
@ -44,11 +47,13 @@ if (${PLATFORM} MATCHES "Desktop")
|
|||||||
set(OPENGL_LIBRARIES "GL")
|
set(OPENGL_LIBRARIES "GL")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(LIBS_PRIVATE m atomic pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
|
set(LIBS_PRIVATE pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
|
||||||
|
set(LIBS_PUBLIC m)
|
||||||
|
|
||||||
if ("${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD")
|
if ("${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD")
|
||||||
find_library(OSS_LIBRARY ossaudio)
|
find_library(OSS_LIBRARY ossaudio)
|
||||||
set(LIBS_PRIVATE m pthread ${OPENGL_LIBRARIES} ${OSS_LIBRARY})
|
else ()
|
||||||
|
set(LIBS_PRIVATE ${LIBS_PRIVATE} atomic)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (NOT "${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD" AND USE_AUDIO)
|
if (NOT "${CMAKE_SYSTEM_NAME}" MATCHES "(Net|Open)BSD" AND USE_AUDIO)
|
||||||
@ -80,7 +85,8 @@ elseif (${PLATFORM} MATCHES "Android")
|
|||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -u ANativeActivity_onCreate -Wl,-undefined,dynamic_lookup")
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libatomic.a -Wl,--build-id -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -u ANativeActivity_onCreate -Wl,-undefined,dynamic_lookup")
|
||||||
|
|
||||||
find_library(OPENGL_LIBRARY OpenGL)
|
find_library(OPENGL_LIBRARY OpenGL)
|
||||||
set(LIBS_PRIVATE m log android EGL GLESv2 OpenSLES atomic c)
|
set(LIBS_PRIVATE log android EGL GLESv2 OpenSLES atomic c)
|
||||||
|
set(LIBS_PUBLIC m)
|
||||||
|
|
||||||
elseif ("${PLATFORM}" MATCHES "DRM")
|
elseif ("${PLATFORM}" MATCHES "DRM")
|
||||||
set(PLATFORM_CPP "PLATFORM_DRM")
|
set(PLATFORM_CPP "PLATFORM_DRM")
|
||||||
@ -98,13 +104,45 @@ elseif ("${PLATFORM}" MATCHES "DRM")
|
|||||||
if (NOT CMAKE_CROSSCOMPILING OR NOT CMAKE_SYSROOT)
|
if (NOT CMAKE_CROSSCOMPILING OR NOT CMAKE_SYSROOT)
|
||||||
include_directories(/usr/include/libdrm)
|
include_directories(/usr/include/libdrm)
|
||||||
endif ()
|
endif ()
|
||||||
set(LIBS_PRIVATE ${GLESV2} ${EGL} ${DRM} ${GBM} atomic pthread m dl)
|
set(LIBS_PRIVATE ${GLESV2} ${EGL} ${DRM} ${GBM} atomic pthread dl)
|
||||||
|
set(LIBS_PUBLIC m)
|
||||||
|
|
||||||
elseif ("${PLATFORM}" MATCHES "SDL")
|
elseif ("${PLATFORM}" MATCHES "SDL")
|
||||||
find_package(SDL2 REQUIRED)
|
# First, check if SDL is included as a subdirectory
|
||||||
set(PLATFORM_CPP "PLATFORM_DESKTOP_SDL")
|
if(TARGET SDL3::SDL3)
|
||||||
set(LIBS_PRIVATE SDL2::SDL2)
|
message(STATUS "Using SDL3 from subdirectory")
|
||||||
|
set(PLATFORM_CPP "PLATFORM_DESKTOP_SDL")
|
||||||
|
set(LIBS_PRIVATE SDL3::SDL3)
|
||||||
|
add_compile_definitions(USING_SDL3_PROJECT)
|
||||||
|
elseif(TARGET SDL2::SDL2)
|
||||||
|
message(STATUS "Using SDL2 from subdirectory")
|
||||||
|
set(PLATFORM_CPP "PLATFORM_DESKTOP_SDL")
|
||||||
|
set(LIBS_PRIVATE SDL2::SDL2)
|
||||||
|
add_compile_definitions(USING_SDL2_PROJECT)
|
||||||
|
else()
|
||||||
|
# No SDL added via add_subdirectory(), try find_package()
|
||||||
|
message(STATUS "No SDL target from subdirectory, searching via find_package()...")
|
||||||
|
|
||||||
|
# First try SDL3
|
||||||
|
find_package(SDL3 QUIET)
|
||||||
|
if(SDL3_FOUND)
|
||||||
|
message(STATUS "Found SDL3 via find_package()")
|
||||||
|
set(LIBS_PUBLIC SDL3::SDL3)
|
||||||
|
set(RAYLIB_DEPENDENCIES "${RAYLIB_DEPENDENCIES}\nfind_dependency(SDL3 REQUIRED)")
|
||||||
|
set(PLATFORM_CPP "PLATFORM_DESKTOP_SDL")
|
||||||
|
add_compile_definitions(USING_SDL3_PACKAGE)
|
||||||
|
else()
|
||||||
|
# Fallback to SDL2
|
||||||
|
find_package(SDL2 REQUIRED)
|
||||||
|
message(STATUS "Found SDL2 via find_package()")
|
||||||
|
set(PLATFORM_CPP "PLATFORM_DESKTOP_SDL")
|
||||||
|
set(LIBS_PUBLIC SDL2::SDL2)
|
||||||
|
set(RAYLIB_DEPENDENCIES "${RAYLIB_DEPENDENCIES}\nfind_dependency(SDL3 REQUIRED)")
|
||||||
|
add_compile_definitions(USING_SDL2_PACKAGE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
elseif ("${PLATFORM}" MATCHES "RGFW")
|
||||||
|
set(PLATFORM_CPP "PLATFORM_DESKTOP_RGFW")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (NOT ${OPENGL_VERSION} MATCHES "OFF")
|
if (NOT ${OPENGL_VERSION} MATCHES "OFF")
|
||||||
@ -122,6 +160,8 @@ if (NOT ${OPENGL_VERSION} MATCHES "OFF")
|
|||||||
set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
|
set(GRAPHICS "GRAPHICS_API_OPENGL_ES2")
|
||||||
elseif (${OPENGL_VERSION} MATCHES "ES 3.0")
|
elseif (${OPENGL_VERSION} MATCHES "ES 3.0")
|
||||||
set(GRAPHICS "GRAPHICS_API_OPENGL_ES3")
|
set(GRAPHICS "GRAPHICS_API_OPENGL_ES3")
|
||||||
|
elseif (${OPENGL_VERSION} MATCHES "Software")
|
||||||
|
set(GRAPHICS "GRAPHICS_API_OPENGL_11_SOFTWARE")
|
||||||
endif ()
|
endif ()
|
||||||
if (NOT "${SUGGESTED_GRAPHICS}" STREQUAL "" AND NOT "${SUGGESTED_GRAPHICS}" STREQUAL "${GRAPHICS}")
|
if (NOT "${SUGGESTED_GRAPHICS}" STREQUAL "" AND NOT "${SUGGESTED_GRAPHICS}" STREQUAL "${GRAPHICS}")
|
||||||
message(WARNING "You are overriding the suggested GRAPHICS=${SUGGESTED_GRAPHICS} with ${GRAPHICS}! This may fail.")
|
message(WARNING "You are overriding the suggested GRAPHICS=${SUGGESTED_GRAPHICS} with ${GRAPHICS}! This may fail.")
|
||||||
|
|||||||
@ -1,81 +1,4 @@
|
|||||||
# - Try to find raylib
|
@PACKAGE_INIT@
|
||||||
# Options:
|
@RAYLIB_DEPENDENCIES@
|
||||||
# raylib_USE_STATIC_LIBS - ON by default
|
|
||||||
# raylib_VERBOSE - OFF by default
|
|
||||||
# Once done, this defines a raylib target that can be passed to
|
|
||||||
# target_link_libraries as well as following variables:
|
|
||||||
#
|
|
||||||
# raylib_FOUND - System has raylib installed
|
|
||||||
# raylib_INCLUDE_DIRS - The include directories for the raylib header(s)
|
|
||||||
# raylib_LIBRARIES - The libraries needed to use raylib
|
|
||||||
# raylib_LDFLAGS - The linker flags needed with raylib
|
|
||||||
# raylib_DEFINITIONS - Compiler switches required for using raylib
|
|
||||||
|
|
||||||
option(raylib_USE_STATIC_LIBS "Use static libs" ON)
|
include("${CMAKE_CURRENT_LIST_DIR}/raylib-targets.cmake")
|
||||||
option(raylib_VERBOSE "Show raylib verbose messages" OFF)
|
|
||||||
|
|
||||||
if (NOT TARGET raylib)
|
|
||||||
set(XPREFIX PC_RAYLIB)
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
pkg_check_modules(${XPREFIX} QUIET raylib)
|
|
||||||
|
|
||||||
if (raylib_USE_STATIC_LIBS)
|
|
||||||
set(XPREFIX ${XPREFIX}_STATIC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(raylib_DEFINITIONS ${${XPREFIX}_CFLAGS})
|
|
||||||
|
|
||||||
find_path(raylib_INCLUDE_DIR
|
|
||||||
NAMES raylib.h
|
|
||||||
HINTS ${${XPREFIX}_INCLUDE_DIRS} ${raylib_DIR}/../../../include/
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (raylib_USE_STATIC_LIBS)
|
|
||||||
set(RAYLIB_NAMES libraylib.a raylib.lib)
|
|
||||||
else ()
|
|
||||||
set(RAYLIB_NAMES raylib)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
find_library(raylib_LIBRARY
|
|
||||||
NAMES ${RAYLIB_NAMES}
|
|
||||||
HINTS ${${XPREFIX}_LIBRARY_DIRS} ${raylib_DIR}/../../
|
|
||||||
)
|
|
||||||
|
|
||||||
set(raylib_LIBRARIES ${raylib_LIBRARY})
|
|
||||||
set(raylib_INCLUDE_DIRS ${raylib_INCLUDE_DIR})
|
|
||||||
set(raylib_LDFLAGS ${${XPREFIX}_LDFLAGS})
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(raylib DEFAULT_MSG
|
|
||||||
raylib_LIBRARY
|
|
||||||
raylib_INCLUDE_DIR
|
|
||||||
)
|
|
||||||
|
|
||||||
mark_as_advanced(raylib_LIBRARY raylib_INCLUDE_DIR)
|
|
||||||
|
|
||||||
if (raylib_USE_STATIC_LIBS)
|
|
||||||
add_library(raylib STATIC IMPORTED GLOBAL)
|
|
||||||
else()
|
|
||||||
add_library(raylib SHARED IMPORTED GLOBAL)
|
|
||||||
endif()
|
|
||||||
string (REPLACE ";" " " raylib_LDFLAGS "${raylib_LDFLAGS}")
|
|
||||||
|
|
||||||
set_target_properties(raylib
|
|
||||||
PROPERTIES
|
|
||||||
IMPORTED_LOCATION "${raylib_LIBRARIES}"
|
|
||||||
IMPORTED_IMPLIB "${raylib_LIBRARIES}"
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${raylib_INCLUDE_DIRS}"
|
|
||||||
INTERFACE_LINK_LIBRARIES "${raylib_LDFLAGS}"
|
|
||||||
INTERFACE_COMPILE_OPTIONS "${raylib_DEFINITIONS}"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (raylib_VERBOSE)
|
|
||||||
message(STATUS "raylib_FOUND: ${raylib_FOUND}")
|
|
||||||
message(STATUS "raylib_INCLUDE_DIRS: ${raylib_INCLUDE_DIRS}")
|
|
||||||
message(STATUS "raylib_LIBRARIES: ${raylib_LIBRARIES}")
|
|
||||||
message(STATUS "raylib_LDFLAGS: ${raylib_LDFLAGS}")
|
|
||||||
message(STATUS "raylib_DEFINITIONS: ${raylib_DEFINITIONS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|||||||
@ -97,22 +97,18 @@ if (${PLATFORM} MATCHES "Android")
|
|||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_basic_lighting.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/shaders/shaders_basic_lighting.c)
|
||||||
|
|
||||||
elseif (${PLATFORM} MATCHES "Web")
|
elseif (${PLATFORM} MATCHES "Web")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os")
|
set(example_sources) # clear example_sources
|
||||||
# Since WASM is used, ALLOW_MEMORY_GROWTH has no extra overheads
|
list(APPEND example_sources others/web_basic_window.c)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s WASM=1 -s ASYNCIFY -s ALLOW_MEMORY_GROWTH=1 --shell-file ${CMAKE_SOURCE_DIR}/src/shell.html")
|
list(APPEND example_sources core/core_input_gestures_testbed.c)
|
||||||
set(CMAKE_EXECUTABLE_SUFFIX ".html")
|
|
||||||
|
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/raylib_opengl_interop.c)
|
|
||||||
|
|
||||||
# Remove the -rdynamic flag because otherwise emscripten
|
|
||||||
# does not generate HTML+JS+WASM files, only a non-working
|
|
||||||
# and fat HTML
|
|
||||||
string(REPLACE "-rdynamic" "" CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS}")
|
|
||||||
|
|
||||||
elseif ("${PLATFORM}" STREQUAL "DRM")
|
elseif ("${PLATFORM}" STREQUAL "DRM")
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/rlgl_standalone.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/rlgl_standalone.c)
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/raylib_opengl_interop.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/raylib_opengl_interop.c)
|
||||||
|
|
||||||
|
elseif ("${OPENGL_VERSION}" STREQUAL "Software")
|
||||||
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/rlgl_standalone.c)
|
||||||
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/others/raylib_opengl_interop.c)
|
||||||
|
|
||||||
elseif (NOT SUPPORT_GESTURES_SYSTEM)
|
elseif (NOT SUPPORT_GESTURES_SYSTEM)
|
||||||
# Items requiring gestures system
|
# Items requiring gestures system
|
||||||
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/textures/textures_mouse_painting.c)
|
list(REMOVE_ITEM example_sources ${CMAKE_CURRENT_SOURCE_DIR}/textures/textures_mouse_painting.c)
|
||||||
@ -165,10 +161,34 @@ foreach (example_source ${example_sources})
|
|||||||
string(REGEX MATCH ".*/.*/" resources_dir ${example_source})
|
string(REGEX MATCH ".*/.*/" resources_dir ${example_source})
|
||||||
string(APPEND resources_dir "resources")
|
string(APPEND resources_dir "resources")
|
||||||
|
|
||||||
if (${PLATFORM} MATCHES "Web" AND EXISTS ${resources_dir})
|
if (${PLATFORM} MATCHES "Web")
|
||||||
# The local resources path needs to be mapped to /resources virtual path
|
target_compile_options(${example_name} PRIVATE -Os)
|
||||||
string(APPEND resources_dir "@resources")
|
target_link_options(${example_name} PRIVATE
|
||||||
set_target_properties(${example_name} PROPERTIES LINK_FLAGS "--preload-file ${resources_dir}")
|
-sALLOW_MEMORY_GROWTH=1
|
||||||
|
-sEXPORTED_RUNTIME_METHODS=[requestFullscreen]
|
||||||
|
-sUSE_GLFW=3
|
||||||
|
--shell-file "${CMAKE_SOURCE_DIR}/src/shell.html"
|
||||||
|
)
|
||||||
|
set_target_properties(${example_name} PROPERTIES SUFFIX ".html")
|
||||||
|
|
||||||
|
if (EXISTS ${resources_dir})
|
||||||
|
# The local resources path needs to be mapped to /resources virtual path
|
||||||
|
string(APPEND resources_dir "@resources")
|
||||||
|
set_target_properties(${example_name} PROPERTIES LINK_FLAGS "--preload-file ${resources_dir}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if(${GRAPHICS} MATCHES "GRAPHICS_API_OPENGL_ES3")
|
||||||
|
target_link_options(${example_name} PUBLIC "-sMIN_WEBGL_VERSION=2")
|
||||||
|
target_link_options(${example_name} PUBLIC "-sMAX_WEBGL_VERSION=2")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Checks if OSX and links appropriate frameworks (Only required on MacOS)
|
||||||
|
if (APPLE)
|
||||||
|
target_link_libraries(${example_name} "-framework IOKit")
|
||||||
|
target_link_libraries(${example_name} "-framework Cocoa")
|
||||||
|
target_link_libraries(${example_name} "-framework OpenGL")
|
||||||
|
endif()
|
||||||
|
|
||||||
endif ()
|
endif ()
|
||||||
endforeach ()
|
endforeach ()
|
||||||
|
|
||||||
|
|||||||
@ -77,7 +77,7 @@ RAYLIB_SRC_PATH ?= ../src
|
|||||||
|
|
||||||
# Locations of raylib.h and libraylib.a/libraylib.so
|
# Locations of raylib.h and libraylib.a/libraylib.so
|
||||||
# NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD
|
# NOTE: Those variables are only used for PLATFORM_OS: LINUX, BSD
|
||||||
DESTDIR ?= /usr/local
|
DESTDIR ?= /usr/local
|
||||||
RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include
|
RAYLIB_INCLUDE_PATH ?= $(DESTDIR)/include
|
||||||
RAYLIB_LIB_PATH ?= $(DESTDIR)/lib
|
RAYLIB_LIB_PATH ?= $(DESTDIR)/lib
|
||||||
|
|
||||||
@ -106,6 +106,9 @@ BUILD_WEB_SHELL ?= $(RAYLIB_PATH)/src/minshell.html
|
|||||||
BUILD_WEB_HEAP_SIZE ?= 134217728
|
BUILD_WEB_HEAP_SIZE ?= 134217728
|
||||||
BUILD_WEB_RESOURCES ?= TRUE
|
BUILD_WEB_RESOURCES ?= TRUE
|
||||||
BUILD_WEB_RESOURCES_PATH ?= $(dir $<)resources@resources
|
BUILD_WEB_RESOURCES_PATH ?= $(dir $<)resources@resources
|
||||||
|
# Use WebGL2 backend (OpenGL 3.0)
|
||||||
|
# WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3
|
||||||
|
BUILD_WEB_WEBGL2 ?= FALSE
|
||||||
|
|
||||||
# Determine PLATFORM_OS when required
|
# Determine PLATFORM_OS when required
|
||||||
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_WEB PLATFORM_WEB_RGFW))
|
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW PLATFORM_DESKTOP_SDL PLATFORM_DESKTOP_RGFW PLATFORM_WEB PLATFORM_WEB_RGFW))
|
||||||
@ -186,7 +189,7 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
|
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
|
||||||
# HTML5 emscripten compiler
|
# HTML5 emscripten compiler
|
||||||
# WARNING: To compile to HTML5, code must be redesigned
|
# WARNING: To compile to HTML5, code must be redesigned
|
||||||
# to use emscripten.h and emscripten_set_main_loop()
|
# to use emscripten.h and emscripten_set_main_loop()
|
||||||
CC = emcc
|
CC = emcc
|
||||||
@ -228,7 +231,7 @@ endif
|
|||||||
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
|
# -Wno-missing-braces ignore invalid warning (GCC bug 53119)
|
||||||
# -Wno-unused-value ignore unused return values of some functions (i.e. fread())
|
# -Wno-unused-value ignore unused return values of some functions (i.e. fread())
|
||||||
# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
|
# -D_DEFAULT_SOURCE use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
|
||||||
CFLAGS = -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces -Wunused-result
|
CFLAGS = -Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces -Wno-unused-result
|
||||||
|
|
||||||
ifeq ($(BUILD_MODE),DEBUG)
|
ifeq ($(BUILD_MODE),DEBUG)
|
||||||
CFLAGS += -g -D_DEBUG
|
CFLAGS += -g -D_DEBUG
|
||||||
@ -269,8 +272,8 @@ endif
|
|||||||
# NOTE: Some external/extras libraries could be required (stb, easings...)
|
# NOTE: Some external/extras libraries could be required (stb, easings...)
|
||||||
#------------------------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------------------------
|
||||||
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external $(EXTRA_INCLUDE_PATHS)
|
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external $(EXTRA_INCLUDE_PATHS)
|
||||||
# Define additional directories containing required header files
|
|
||||||
|
|
||||||
|
# Define additional directories containing required header files
|
||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_GLFW)
|
||||||
ifeq ($(PLATFORM_OS),BSD)
|
ifeq ($(PLATFORM_OS),BSD)
|
||||||
INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH) -I/usr/pkg/include -I/usr/X11R7/include
|
INCLUDE_PATHS += -I$(RAYLIB_INCLUDE_PATH) -I/usr/pkg/include -I/usr/X11R7/include
|
||||||
@ -287,11 +290,6 @@ ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
|
|||||||
INCLUDE_PATHS += -I/usr/include/libdrm
|
INCLUDE_PATHS += -I/usr/include/libdrm
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Include GLFW required for examples/others/rlgl_standalone.c
|
|
||||||
ifeq ($(USE_EXTERNAL_GLFW),FALSE)
|
|
||||||
all others: INCLUDE_PATHS += -I$(RAYLIB_PATH)/src/external/glfw/include
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Define library paths containing required libs: LDFLAGS
|
# Define library paths containing required libs: LDFLAGS
|
||||||
#------------------------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------------------------
|
||||||
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
|
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src
|
||||||
@ -340,18 +338,24 @@ ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_R
|
|||||||
# --preload-file resources # specify a resources folder for data compilation
|
# --preload-file resources # specify a resources folder for data compilation
|
||||||
# --source-map-base # allow debugging in browser with source map
|
# --source-map-base # allow debugging in browser with source map
|
||||||
# --shell-file shell.html # define a custom shell .html and output extension
|
# --shell-file shell.html # define a custom shell .html and output extension
|
||||||
LDFLAGS += -sTOTAL_MEMORY=$(BUILD_WEB_HEAP_SIZE) -sFORCE_FILESYSTEM=1 -sMINIFY_HTML=0
|
LDFLAGS += -sTOTAL_MEMORY=$(BUILD_WEB_HEAP_SIZE) -sFORCE_FILESYSTEM=1 -sEXPORTED_RUNTIME_METHODS=ccall -sMINIFY_HTML=0
|
||||||
|
|
||||||
# Using GLFW3 library (instead of RGFW)
|
# Using GLFW3 library (instead of RGFW)
|
||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_WEB)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_WEB)
|
||||||
LDFLAGS += -sUSE_GLFW=3
|
LDFLAGS += -sUSE_GLFW=3
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Build using asyncify
|
# Build using asyncify
|
||||||
ifeq ($(BUILD_WEB_ASYNCIFY),TRUE)
|
ifeq ($(BUILD_WEB_ASYNCIFY),TRUE)
|
||||||
LDFLAGS += -sASYNCIFY
|
LDFLAGS += -sASYNCIFY
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# NOTE: Flags required for WebGL 2.0 (OpenGL ES 3.0)
|
||||||
|
# WARNING: Requires raylib compiled with GRAPHICS_API_OPENGL_ES3
|
||||||
|
ifeq ($(BUILD_WEB_WEBGL2),TRUE)
|
||||||
|
LDFLAGS += -sMIN_WEBGL_VERSION=2 -sMAX_WEBGL_VERSION=2
|
||||||
|
endif
|
||||||
|
|
||||||
# Add resources building if required
|
# Add resources building if required
|
||||||
ifeq ($(BUILD_WEB_RESOURCES),TRUE)
|
ifeq ($(BUILD_WEB_RESOURCES),TRUE)
|
||||||
LDFLAGS += --preload-file $(BUILD_WEB_RESOURCES_PATH)
|
LDFLAGS += --preload-file $(BUILD_WEB_RESOURCES_PATH)
|
||||||
@ -482,21 +486,37 @@ endif
|
|||||||
ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DRM)
|
||||||
# Libraries for DRM compiling
|
# Libraries for DRM compiling
|
||||||
# NOTE: Required packages: libasound2-dev (ALSA)
|
# NOTE: Required packages: libasound2-dev (ALSA)
|
||||||
LDLIBS = -lraylib -lGLESv2 -lEGL -lpthread -lrt -lm -lgbm -ldrm -ldl -latomic
|
LDLIBS = -lraylib -lGLESv2 -lEGL -ldrm -lgbm -lpthread -lrt -lm -ldl -latomic
|
||||||
|
# TODO: Examples compilation does not define GRAPHICS, is it required?
|
||||||
|
#ifeq ($(GRAPHICS),GRAPHICS_API_OPENGL_ES2)
|
||||||
|
# LDLIBS += -lGLESv2 -lEGL
|
||||||
|
#endif
|
||||||
|
endif
|
||||||
|
ifeq ($(TARGET_PLATFORM),PLATFORM_DESKTOP_WIN32)
|
||||||
|
# Libraries for Windows desktop compilation
|
||||||
|
LDFLAGS += -L..\src
|
||||||
|
LDLIBS = -lraylib -lgdi32 -lwinmm -lshcore
|
||||||
|
ifneq ($(GRAPHICS),GRAPHICS_API_OPENGL_11_SOFTWARE)
|
||||||
|
LDLIBS += -lopengl32
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
|
ifeq ($(TARGET_PLATFORM),$(filter $(TARGET_PLATFORM),PLATFORM_WEB PLATFORM_WEB_RGFW))
|
||||||
# Libraries for web (HTML5) compiling
|
# Libraries for web (HTML5) compiling
|
||||||
LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.web.a
|
LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.web.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST))
|
||||||
|
|
||||||
# Define source code object files required
|
# Define source code object files required
|
||||||
#------------------------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------------------------
|
||||||
|
#EXAMPLES_LIST_START
|
||||||
CORE = \
|
CORE = \
|
||||||
core/core_2d_camera \
|
core/core_2d_camera \
|
||||||
core/core_2d_camera_mouse_zoom \
|
core/core_2d_camera_mouse_zoom \
|
||||||
core/core_2d_camera_platformer \
|
core/core_2d_camera_platformer \
|
||||||
core/core_2d_camera_split_screen \
|
core/core_2d_camera_split_screen \
|
||||||
core/core_3d_camera_first_person \
|
core/core_3d_camera_first_person \
|
||||||
|
core/core_3d_camera_fps \
|
||||||
core/core_3d_camera_free \
|
core/core_3d_camera_free \
|
||||||
core/core_3d_camera_mode \
|
core/core_3d_camera_mode \
|
||||||
core/core_3d_camera_split_screen \
|
core/core_3d_camera_split_screen \
|
||||||
@ -504,25 +524,35 @@ CORE = \
|
|||||||
core/core_automation_events \
|
core/core_automation_events \
|
||||||
core/core_basic_screen_manager \
|
core/core_basic_screen_manager \
|
||||||
core/core_basic_window \
|
core/core_basic_window \
|
||||||
core/core_basic_window_web \
|
core/core_clipboard_text \
|
||||||
|
core/core_compute_hash \
|
||||||
core/core_custom_frame_control \
|
core/core_custom_frame_control \
|
||||||
core/core_custom_logging \
|
core/core_custom_logging \
|
||||||
|
core/core_delta_time \
|
||||||
|
core/core_directory_files \
|
||||||
core/core_drop_files \
|
core/core_drop_files \
|
||||||
core/core_high_dpi \
|
core/core_highdpi_demo \
|
||||||
|
core/core_highdpi_testbed \
|
||||||
|
core/core_input_actions \
|
||||||
core/core_input_gamepad \
|
core/core_input_gamepad \
|
||||||
core/core_input_gestures \
|
core/core_input_gestures \
|
||||||
core/core_input_gestures_web \
|
core/core_input_gestures_testbed \
|
||||||
core/core_input_keys \
|
core/core_input_keys \
|
||||||
core/core_input_mouse \
|
core/core_input_mouse \
|
||||||
core/core_input_mouse_wheel \
|
core/core_input_mouse_wheel \
|
||||||
core/core_input_multitouch \
|
core/core_input_multitouch \
|
||||||
core/core_input_virtual_controls \
|
core/core_input_virtual_controls \
|
||||||
core/core_loading_thread \
|
core/core_monitor_detector \
|
||||||
core/core_random_sequence \
|
core/core_random_sequence \
|
||||||
core/core_random_values \
|
core/core_random_values \
|
||||||
|
core/core_render_texture \
|
||||||
core/core_scissor_test \
|
core/core_scissor_test \
|
||||||
|
core/core_screen_recording \
|
||||||
core/core_smooth_pixelperfect \
|
core/core_smooth_pixelperfect \
|
||||||
core/core_storage_values \
|
core/core_storage_values \
|
||||||
|
core/core_text_file_loading \
|
||||||
|
core/core_undo_redo \
|
||||||
|
core/core_viewport_scaling \
|
||||||
core/core_vr_simulator \
|
core/core_vr_simulator \
|
||||||
core/core_window_flags \
|
core/core_window_flags \
|
||||||
core/core_window_letterbox \
|
core/core_window_letterbox \
|
||||||
@ -530,31 +560,50 @@ CORE = \
|
|||||||
core/core_world_screen
|
core/core_world_screen
|
||||||
|
|
||||||
SHAPES = \
|
SHAPES = \
|
||||||
|
shapes/shapes_ball_physics \
|
||||||
shapes/shapes_basic_shapes \
|
shapes/shapes_basic_shapes \
|
||||||
shapes/shapes_bouncing_ball \
|
shapes/shapes_bouncing_ball \
|
||||||
|
shapes/shapes_bullet_hell \
|
||||||
|
shapes/shapes_circle_sector_drawing \
|
||||||
|
shapes/shapes_clock_of_clocks \
|
||||||
shapes/shapes_collision_area \
|
shapes/shapes_collision_area \
|
||||||
shapes/shapes_colors_palette \
|
shapes/shapes_colors_palette \
|
||||||
shapes/shapes_draw_circle_sector \
|
shapes/shapes_dashed_line \
|
||||||
shapes/shapes_draw_rectangle_rounded \
|
shapes/shapes_digital_clock \
|
||||||
shapes/shapes_draw_ring \
|
shapes/shapes_double_pendulum \
|
||||||
shapes/shapes_easings_ball_anim \
|
shapes/shapes_easings_ball \
|
||||||
shapes/shapes_easings_box_anim \
|
shapes/shapes_easings_box \
|
||||||
shapes/shapes_easings_rectangle_array \
|
shapes/shapes_easings_rectangles \
|
||||||
shapes/shapes_following_eyes \
|
shapes/shapes_following_eyes \
|
||||||
|
shapes/shapes_kaleidoscope \
|
||||||
shapes/shapes_lines_bezier \
|
shapes/shapes_lines_bezier \
|
||||||
|
shapes/shapes_lines_drawing \
|
||||||
shapes/shapes_logo_raylib \
|
shapes/shapes_logo_raylib \
|
||||||
shapes/shapes_logo_raylib_anim \
|
shapes/shapes_logo_raylib_anim \
|
||||||
|
shapes/shapes_math_angle_rotation \
|
||||||
|
shapes/shapes_math_sine_cosine \
|
||||||
|
shapes/shapes_mouse_trail \
|
||||||
|
shapes/shapes_penrose_tile \
|
||||||
|
shapes/shapes_pie_chart \
|
||||||
shapes/shapes_rectangle_advanced \
|
shapes/shapes_rectangle_advanced \
|
||||||
shapes/shapes_rectangle_scaling \
|
shapes/shapes_rectangle_scaling \
|
||||||
|
shapes/shapes_recursive_tree \
|
||||||
|
shapes/shapes_ring_drawing \
|
||||||
|
shapes/shapes_rlgl_color_wheel \
|
||||||
|
shapes/shapes_rlgl_triangle \
|
||||||
|
shapes/shapes_rounded_rectangle_drawing \
|
||||||
|
shapes/shapes_simple_particles \
|
||||||
shapes/shapes_splines_drawing \
|
shapes/shapes_splines_drawing \
|
||||||
|
shapes/shapes_starfield_effect \
|
||||||
shapes/shapes_top_down_lights \
|
shapes/shapes_top_down_lights \
|
||||||
shapes/shapes_digital_clock
|
shapes/shapes_triangle_strip \
|
||||||
|
shapes/shapes_vector_angle
|
||||||
|
|
||||||
TEXTURES = \
|
TEXTURES = \
|
||||||
textures/textures_background_scrolling \
|
textures/textures_background_scrolling \
|
||||||
textures/textures_blend_modes \
|
textures/textures_blend_modes \
|
||||||
textures/textures_bunnymark \
|
textures/textures_bunnymark \
|
||||||
textures/textures_draw_tiled \
|
textures/textures_cellular_automata \
|
||||||
textures/textures_fog_of_war \
|
textures/textures_fog_of_war \
|
||||||
textures/textures_gif_player \
|
textures/textures_gif_player \
|
||||||
textures/textures_image_channel \
|
textures/textures_image_channel \
|
||||||
@ -569,40 +618,49 @@ TEXTURES = \
|
|||||||
textures/textures_mouse_painting \
|
textures/textures_mouse_painting \
|
||||||
textures/textures_npatch_drawing \
|
textures/textures_npatch_drawing \
|
||||||
textures/textures_particles_blending \
|
textures/textures_particles_blending \
|
||||||
textures/textures_polygon \
|
textures/textures_polygon_drawing \
|
||||||
textures/textures_raw_data \
|
textures/textures_raw_data \
|
||||||
textures/textures_sprite_anim \
|
textures/textures_screen_buffer \
|
||||||
|
textures/textures_sprite_animation \
|
||||||
textures/textures_sprite_button \
|
textures/textures_sprite_button \
|
||||||
textures/textures_sprite_explosion \
|
textures/textures_sprite_explosion \
|
||||||
|
textures/textures_sprite_stacking \
|
||||||
textures/textures_srcrec_dstrec \
|
textures/textures_srcrec_dstrec \
|
||||||
textures/textures_textured_curve \
|
textures/textures_textured_curve \
|
||||||
|
textures/textures_tiled_drawing \
|
||||||
textures/textures_to_image
|
textures/textures_to_image
|
||||||
|
|
||||||
TEXT = \
|
TEXT = \
|
||||||
|
text/text_3d_drawing \
|
||||||
text/text_codepoints_loading \
|
text/text_codepoints_loading \
|
||||||
text/text_draw_3d \
|
|
||||||
text/text_font_filters \
|
text/text_font_filters \
|
||||||
text/text_font_loading \
|
text/text_font_loading \
|
||||||
text/text_font_sdf \
|
text/text_font_sdf \
|
||||||
text/text_font_spritefont \
|
text/text_font_spritefont \
|
||||||
text/text_format_text \
|
text/text_format_text \
|
||||||
|
text/text_inline_styling \
|
||||||
text/text_input_box \
|
text/text_input_box \
|
||||||
text/text_raylib_fonts \
|
|
||||||
text/text_rectangle_bounds \
|
text/text_rectangle_bounds \
|
||||||
text/text_unicode \
|
text/text_sprite_fonts \
|
||||||
|
text/text_strings_management \
|
||||||
|
text/text_unicode_emojis \
|
||||||
|
text/text_unicode_ranges \
|
||||||
|
text/text_words_alignment \
|
||||||
text/text_writing_anim
|
text/text_writing_anim
|
||||||
|
|
||||||
MODELS = \
|
MODELS = \
|
||||||
models/models_animation \
|
models/models_animation_gpu_skinning \
|
||||||
models/models_billboard \
|
models/models_animation_playing \
|
||||||
|
models/models_basic_voxel \
|
||||||
|
models/models_billboard_rendering \
|
||||||
models/models_bone_socket \
|
models/models_bone_socket \
|
||||||
models/models_box_collisions \
|
models/models_box_collisions \
|
||||||
models/models_cubicmap \
|
models/models_cubicmap_rendering \
|
||||||
models/models_draw_cube_texture \
|
models/models_decals \
|
||||||
|
models/models_directional_billboard \
|
||||||
models/models_first_person_maze \
|
models/models_first_person_maze \
|
||||||
models/models_geometric_shapes \
|
models/models_geometric_shapes \
|
||||||
models/models_gpu_skinning \
|
models/models_heightmap_rendering \
|
||||||
models/models_heightmap \
|
|
||||||
models/models_loading \
|
models/models_loading \
|
||||||
models/models_loading_gltf \
|
models/models_loading_gltf \
|
||||||
models/models_loading_m3d \
|
models/models_loading_m3d \
|
||||||
@ -612,39 +670,46 @@ MODELS = \
|
|||||||
models/models_orthographic_projection \
|
models/models_orthographic_projection \
|
||||||
models/models_point_rendering \
|
models/models_point_rendering \
|
||||||
models/models_rlgl_solar_system \
|
models/models_rlgl_solar_system \
|
||||||
models/models_skybox \
|
models/models_rotating_cube \
|
||||||
|
models/models_skybox_rendering \
|
||||||
models/models_tesseract_view \
|
models/models_tesseract_view \
|
||||||
|
models/models_textured_cube \
|
||||||
models/models_waving_cubes \
|
models/models_waving_cubes \
|
||||||
models/models_yaw_pitch_roll
|
models/models_yaw_pitch_roll
|
||||||
|
|
||||||
SHADERS = \
|
SHADERS = \
|
||||||
|
shaders/shaders_ascii_rendering \
|
||||||
shaders/shaders_basic_lighting \
|
shaders/shaders_basic_lighting \
|
||||||
shaders/shaders_basic_pbr \
|
shaders/shaders_basic_pbr \
|
||||||
|
shaders/shaders_color_correction \
|
||||||
shaders/shaders_custom_uniform \
|
shaders/shaders_custom_uniform \
|
||||||
shaders/shaders_deferred_render \
|
shaders/shaders_deferred_rendering \
|
||||||
shaders/shaders_eratosthenes \
|
shaders/shaders_depth_rendering \
|
||||||
shaders/shaders_fog \
|
shaders/shaders_depth_writing \
|
||||||
|
shaders/shaders_eratosthenes_sieve \
|
||||||
|
shaders/shaders_fog_rendering \
|
||||||
|
shaders/shaders_game_of_life \
|
||||||
shaders/shaders_hot_reloading \
|
shaders/shaders_hot_reloading \
|
||||||
shaders/shaders_hybrid_render \
|
shaders/shaders_hybrid_rendering \
|
||||||
shaders/shaders_julia_set \
|
shaders/shaders_julia_set \
|
||||||
shaders/shaders_lightmap \
|
shaders/shaders_lightmap_rendering \
|
||||||
|
shaders/shaders_mandelbrot_set \
|
||||||
shaders/shaders_mesh_instancing \
|
shaders/shaders_mesh_instancing \
|
||||||
shaders/shaders_model_shader \
|
shaders/shaders_model_shader \
|
||||||
shaders/shaders_multi_sample2d \
|
shaders/shaders_multi_sample2d \
|
||||||
|
shaders/shaders_normalmap_rendering \
|
||||||
shaders/shaders_palette_switch \
|
shaders/shaders_palette_switch \
|
||||||
shaders/shaders_postprocessing \
|
shaders/shaders_postprocessing \
|
||||||
shaders/shaders_raymarching \
|
shaders/shaders_raymarching_rendering \
|
||||||
shaders/shaders_rounded_rectangle \
|
shaders/shaders_rounded_rectangle \
|
||||||
shaders/shaders_shadowmap \
|
shaders/shaders_shadowmap_rendering \
|
||||||
shaders/shaders_shapes_textures \
|
shaders/shaders_shapes_textures \
|
||||||
shaders/shaders_simple_mask \
|
shaders/shaders_simple_mask \
|
||||||
shaders/shaders_spotlight \
|
shaders/shaders_spotlight_rendering \
|
||||||
shaders/shaders_texture_drawing \
|
|
||||||
shaders/shaders_texture_outline \
|
shaders/shaders_texture_outline \
|
||||||
|
shaders/shaders_texture_rendering \
|
||||||
shaders/shaders_texture_tiling \
|
shaders/shaders_texture_tiling \
|
||||||
shaders/shaders_texture_waves \
|
shaders/shaders_texture_waves \
|
||||||
shaders/shaders_view_depth \
|
|
||||||
shaders/shaders_write_depth \
|
|
||||||
shaders/shaders_vertex_displacement
|
shaders/shaders_vertex_displacement
|
||||||
|
|
||||||
AUDIO = \
|
AUDIO = \
|
||||||
@ -655,25 +720,22 @@ AUDIO = \
|
|||||||
audio/audio_sound_loading \
|
audio/audio_sound_loading \
|
||||||
audio/audio_sound_multi \
|
audio/audio_sound_multi \
|
||||||
audio/audio_sound_positioning \
|
audio/audio_sound_positioning \
|
||||||
|
audio/audio_spectrum_visualizer \
|
||||||
audio/audio_stream_effects
|
audio/audio_stream_effects
|
||||||
|
|
||||||
OTHERS = \
|
OTHERS = \
|
||||||
others/easings_testbed \
|
others/easings_testbed \
|
||||||
others/embedded_files_loading \
|
others/embedded_files_loading \
|
||||||
others/raylib_opengl_interop \
|
others/raylib_opengl_interop \
|
||||||
others/raymath_vector_angle \
|
others/rlgl_compute_shader \
|
||||||
others/rlgl_compute_shader
|
others/rlgl_standalone \
|
||||||
|
others/web_basic_window
|
||||||
ifeq ($(TARGET_PLATFORM), PLATFORM_DESKTOP_GFLW)
|
#EXAMPLES_LIST_END
|
||||||
OTHERS += others/rlgl_standalone
|
|
||||||
endif
|
|
||||||
|
|
||||||
CURRENT_MAKEFILE = $(lastword $(MAKEFILE_LIST))
|
|
||||||
|
|
||||||
# Define processes to execute
|
# Define processes to execute
|
||||||
#------------------------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------------------------
|
||||||
# Default target entry
|
# Default target entry
|
||||||
all: $(CORE) $(SHAPES) $(TEXT) $(TEXTURES) $(MODELS) $(SHADERS) $(AUDIO) $(OTHERS)
|
all: $(CORE) $(SHAPES) $(TEXT) $(TEXTURES) $(MODELS) $(SHADERS) $(AUDIO)
|
||||||
|
|
||||||
core: $(CORE)
|
core: $(CORE)
|
||||||
shapes: $(SHAPES)
|
shapes: $(SHAPES)
|
||||||
@ -682,7 +744,6 @@ text: $(TEXT)
|
|||||||
models: $(MODELS)
|
models: $(MODELS)
|
||||||
shaders: $(SHADERS)
|
shaders: $(SHADERS)
|
||||||
audio: $(AUDIO)
|
audio: $(AUDIO)
|
||||||
others: $(OTHERS)
|
|
||||||
|
|
||||||
# Generic compilation pattern
|
# Generic compilation pattern
|
||||||
# NOTE: Examples must be ready for Android compilation!
|
# NOTE: Examples must be ready for Android compilation!
|
||||||
|
|||||||
@ -130,7 +130,7 @@ ifeq ($(ANDROID_ARCH),ARM)
|
|||||||
CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
|
CFLAGS = -std=c99 -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16
|
||||||
endif
|
endif
|
||||||
ifeq ($(ANDROID_ARCH),ARM64)
|
ifeq ($(ANDROID_ARCH),ARM64)
|
||||||
CFLAGS = -std=c99 -target aarch64 -mfix-cortex-a53-835769
|
CFLAGS = -std=c99 -mfix-cortex-a53-835769
|
||||||
endif
|
endif
|
||||||
# Compilation functions attributes options
|
# Compilation functions attributes options
|
||||||
CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC
|
CFLAGS += -ffunction-sections -funwind-tables -fstack-protector-strong -fPIC
|
||||||
|
|||||||
@ -6,6 +6,7 @@ The examples assume you have already built the `raylib` library in `../src`.
|
|||||||
|
|
||||||
- `make` builds all examples
|
- `make` builds all examples
|
||||||
- `make [module]` builds all examples for a particular module (e.g `make core`)
|
- `make [module]` builds all examples for a particular module (e.g `make core`)
|
||||||
|
- `make [module]/[name]` builds one examples for a particular module (e.g `make core/core_basic_window`)
|
||||||
|
|
||||||
### With Zig
|
### With Zig
|
||||||
|
|
||||||
@ -16,219 +17,268 @@ You may find it easier to use than other toolchains, especially when it comes to
|
|||||||
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
|
- `zig build [module]` to compile all examples for a module (e.g. `zig build core`)
|
||||||
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
|
- `zig build [example]` to compile _and run_ a particular example (e.g. `zig build core_basic_window`)
|
||||||
|
|
||||||
## EXAMPLES LIST
|
## EXAMPLES COLLECTION [TOTAL: 205]
|
||||||
|
|
||||||
### category: core
|
### category: core [47]
|
||||||
|
|
||||||
Examples using raylib core platform functionality like window creation, inputs, drawing modes and system functionality.
|
Examples using raylib [core](../src/rcore.c) module platform functionality: window creation, inputs, drawing modes and system functionality.
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
| 01 | [core_basic_window](core/core_basic_window.c) | <img src="core/core_basic_window.png" alt="core_basic_window" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
| [core_basic_window](core/core_basic_window.c) | <img src="core/core_basic_window.png" alt="core_basic_window" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 02 | [core_input_keys](core/core_input_keys.c) | <img src="core/core_input_keys.png" alt="core_input_keys" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
| [core_delta_time](core/core_delta_time.c) | <img src="core/core_delta_time.png" alt="core_delta_time" width="80"> | ⭐☆☆☆ | 5.5 | 5.6-dev | [Robin](https://github.com/RobinsAviary) |
|
||||||
| 03 | [core_input_mouse](core/core_input_mouse.c) | <img src="core/core_input_mouse.png" alt="core_input_mouse" width="80"> | ⭐️☆☆☆ | 1.0 | 5.5 | [Ray](https://github.com/raysan5) |
|
| [core_input_keys](core/core_input_keys.c) | <img src="core/core_input_keys.png" alt="core_input_keys" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 04 | [core_input_mouse_wheel](core/core_input_mouse_wheel.c) | <img src="core/core_input_mouse_wheel.png" alt="core_input_mouse_wheel" width="80"> | ⭐️☆☆☆ | 1.1 | 1.3 | [Ray](https://github.com/raysan5) |
|
| [core_input_mouse](core/core_input_mouse.c) | <img src="core/core_input_mouse.png" alt="core_input_mouse" width="80"> | ⭐☆☆☆ | 1.0 | 5.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 05 | [core_input_gamepad](core/core_input_gamepad.c) | <img src="core/core_input_gamepad.png" alt="core_input_gamepad" width="80"> | ⭐️☆☆☆ | 1.1 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [core_input_mouse_wheel](core/core_input_mouse_wheel.c) | <img src="core/core_input_mouse_wheel.png" alt="core_input_mouse_wheel" width="80"> | ⭐☆☆☆ | 1.1 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 06 | [core_input_multitouch](core/core_input_multitouch.c) | <img src="core/core_input_multitouch.png" alt="core_input_multitouch" width="80"> | ⭐️☆☆☆ | 2.1 | 2.5 | [Berni](https://github.com/Berni8k) |
|
| [core_input_gamepad](core/core_input_gamepad.c) | <img src="core/core_input_gamepad.png" alt="core_input_gamepad" width="80"> | ⭐☆☆☆ | 1.1 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 07 | [core_input_gestures](core/core_input_gestures.c) | <img src="core/core_input_gestures.png" alt="core_input_gestures" width="80"> | ⭐️⭐️☆☆ | 1.4 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [core_input_multitouch](core/core_input_multitouch.c) | <img src="core/core_input_multitouch.png" alt="core_input_multitouch" width="80"> | ⭐☆☆☆ | 2.1 | 2.5 | [Berni](https://github.com/Berni8k) |
|
||||||
| 08 | [core_input_virtual_controls](core/core_input_virtual_controls.c) | <img src="core/core_input_virtual_controls.png" alt="core_input_virtual_controls" width="80"> | ⭐️⭐️☆☆ | 5.0 | 5.0 | [oblerion](https://github.com/oblerion) |
|
| [core_input_gestures](core/core_input_gestures.c) | <img src="core/core_input_gestures.png" alt="core_input_gestures" width="80"> | ⭐⭐☆☆ | 1.4 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 09 | [core_2d_camera](core/core_2d_camera.c) | <img src="core/core_2d_camera.png" alt="core_2d_camera" width="80"> | ⭐️⭐️☆☆ | 1.5 | 3.0 | [Ray](https://github.com/raysan5) |
|
| [core_input_gestures_testbed](core/core_input_gestures_testbed.c) | <img src="core/core_input_gestures_testbed.png" alt="core_input_gestures_testbed" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.6-dev | [ubkp](https://github.com/ubkp) |
|
||||||
| 10 | [core_2d_camera_mouse_zoom](core/core_2d_camera_mouse_zoom.c) | <img src="core/core_2d_camera_mouse_zoom.png" alt="core_2d_camera_mouse_zoom" width="80"> | ⭐️⭐️☆☆ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
|
| [core_input_virtual_controls](core/core_input_virtual_controls.c) | <img src="core/core_input_virtual_controls.png" alt="core_input_virtual_controls" width="80"> | ⭐⭐☆☆ | 5.0 | 5.0 | [GreenSnakeLinux](https://github.com/GreenSnakeLinux) |
|
||||||
| 11 | [core_2d_camera_platformer](core/core_2d_camera_platformer.c) | <img src="core/core_2d_camera_platformer.png" alt="core_2d_camera_platformer" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [arvyy](https://github.com/arvyy) |
|
| [core_2d_camera](core/core_2d_camera.c) | <img src="core/core_2d_camera.png" alt="core_2d_camera" width="80"> | ⭐⭐☆☆ | 1.5 | 3.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 12 | [core_2d_camera_split_screen](core/core_2d_camera_split_screen.c) | <img src="core/core_2d_camera_split_screen.png" alt="core_2d_camera_split_screen" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Gabriel dos Santos Sanches](https://github.com/gabrielssanches) |
|
| [core_2d_camera_mouse_zoom](core/core_2d_camera_mouse_zoom.c) | <img src="core/core_2d_camera_mouse_zoom.png" alt="core_2d_camera_mouse_zoom" width="80"> | ⭐⭐☆☆ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
| 13 | [core_3d_camera_mode](core/core_3d_camera_mode.c) | <img src="core/core_3d_camera_mode.png" alt="core_3d_camera_mode" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
| [core_2d_camera_platformer](core/core_2d_camera_platformer.c) | <img src="core/core_2d_camera_platformer.png" alt="core_2d_camera_platformer" width="80"> | ⭐⭐⭐☆ | 2.5 | 3.0 | [arvyy](https://github.com/arvyy) |
|
||||||
| 14 | [core_3d_camera_free](core/core_3d_camera_free.c) | <img src="core/core_3d_camera_free.png" alt="core_3d_camera_free" width="80"> | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
| [core_2d_camera_split_screen](core/core_2d_camera_split_screen.c) | <img src="core/core_2d_camera_split_screen.png" alt="core_2d_camera_split_screen" width="80"> | ⭐⭐⭐⭐️ | 4.5 | 4.5 | [Gabriel dos Santos Sanches](https://github.com/gabrielssanches) |
|
||||||
| 15 | [core_3d_camera_first_person](core/core_3d_camera_first_person.c) | <img src="core/core_3d_camera_first_person.png" alt="core_3d_camera_first_person" width="80"> | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
| [core_3d_camera_mode](core/core_3d_camera_mode.c) | <img src="core/core_3d_camera_mode.png" alt="core_3d_camera_mode" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 16 | [core_3d_camera_split_screen](core/core_3d_camera_split_screen.c) | <img src="core/core_3d_camera_split_screen.png" alt="core_3d_camera_split_screen" width="80"> | ⭐️⭐️⭐️☆ | 3.7 | 4.0 | [Jeffery Myers](https://github.com/JeffM2501) |
|
| [core_3d_camera_free](core/core_3d_camera_free.c) | <img src="core/core_3d_camera_free.png" alt="core_3d_camera_free" width="80"> | ⭐☆☆☆ | 1.3 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 17 | [core_3d_picking](core/core_3d_picking.c) | <img src="core/core_3d_picking.png" alt="core_3d_picking" width="80"> | ⭐️⭐️☆☆ | 1.3 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [core_3d_camera_first_person](core/core_3d_camera_first_person.c) | <img src="core/core_3d_camera_first_person.png" alt="core_3d_camera_first_person" width="80"> | ⭐⭐☆☆ | 1.3 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 18 | [core_world_screen](core/core_world_screen.c) | <img src="core/core_world_screen.png" alt="core_world_screen" width="80"> | ⭐️⭐️☆☆ | 1.3 | 1.4 | [Ray](https://github.com/raysan5) |
|
| [core_3d_camera_split_screen](core/core_3d_camera_split_screen.c) | <img src="core/core_3d_camera_split_screen.png" alt="core_3d_camera_split_screen" width="80"> | ⭐⭐⭐☆ | 3.7 | 4.0 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
| 19 | [core_custom_logging](core/core_custom_logging.c) | <img src="core/core_custom_logging.png" alt="core_custom_logging" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Pablo Marcos Oltra](https://github.com/pamarcos) |
|
| [core_3d_camera_fps](core/core_3d_camera_fps.c) | <img src="core/core_3d_camera_fps.png" alt="core_3d_camera_fps" width="80"> | ⭐⭐⭐☆ | 5.5 | 5.5 | [Agnis Aldiņš](https://github.com/nezvers) |
|
||||||
| 20 | [core_window_flags](core/core_window_flags.c) | <img src="core/core_window_flags.png" alt="core_window_flags" width="80"> | ⭐️⭐️⭐️☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
| [core_3d_picking](core/core_3d_picking.c) | <img src="core/core_3d_picking.png" alt="core_3d_picking" width="80"> | ⭐⭐☆☆ | 1.3 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 21 | [core_window_letterbox](core/core_window_letterbox.c) | <img src="core/core_window_letterbox.png" alt="core_window_letterbox" width="80"> | ⭐️⭐️☆☆ | 2.5 | 4.0 | [Anata](https://github.com/anatagawa) |
|
| [core_world_screen](core/core_world_screen.c) | <img src="core/core_world_screen.png" alt="core_world_screen" width="80"> | ⭐⭐☆☆ | 1.3 | 1.4 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 22 | [core_window_should_close](core/core_window_should_close.c) | <img src="core/core_window_should_close.png" alt="core_window_should_close" width="80"> | ⭐️☆☆☆ | 4.2 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [core_window_flags](core/core_window_flags.c) | <img src="core/core_window_flags.png" alt="core_window_flags" width="80"> | ⭐⭐⭐☆ | 3.5 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 23 | [core_drop_files](core/core_drop_files.c) | <img src="core/core_drop_files.png" alt="core_drop_files" width="80"> | ⭐️⭐️☆☆ | 1.3 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [core_window_letterbox](core/core_window_letterbox.c) | <img src="core/core_window_letterbox.png" alt="core_window_letterbox" width="80"> | ⭐⭐☆☆ | 2.5 | 4.0 | [Anata](https://github.com/anatagawa) |
|
||||||
| 24 | [core_random_values](core/core_random_values.c) | <img src="core/core_random_values.png" alt="core_random_values" width="80"> | ⭐️☆☆☆ | 1.1 | 1.1 | [Ray](https://github.com/raysan5) |
|
| [core_window_should_close](core/core_window_should_close.c) | <img src="core/core_window_should_close.png" alt="core_window_should_close" width="80"> | ⭐☆☆☆ | 4.2 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 25 | [core_storage_values](core/core_storage_values.c) | <img src="core/core_storage_values.png" alt="core_storage_values" width="80"> | ⭐️⭐️☆☆ | 1.4 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [core_monitor_detector](core/core_monitor_detector.c) | <img src="core/core_monitor_detector.png" alt="core_monitor_detector" width="80"> | ⭐☆☆☆ | 5.5 | 5.6 | [Maicon Santana](https://github.com/maiconpintoabreu) |
|
||||||
| 26 | [core_vr_simulator](core/core_vr_simulator.c) | <img src="core/core_vr_simulator.png" alt="core_vr_simulator" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [core_custom_logging](core/core_custom_logging.c) | <img src="core/core_custom_logging.png" alt="core_custom_logging" width="80"> | ⭐⭐⭐☆ | 2.5 | 2.5 | [Pablo Marcos Oltra](https://github.com/pamarcos) |
|
||||||
| 27 | [core_loading_thread](core/core_loading_thread.c) | <img src="core/core_loading_thread.png" alt="core_loading_thread" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Ray](https://github.com/raysan5) |
|
| [core_drop_files](core/core_drop_files.c) | <img src="core/core_drop_files.png" alt="core_drop_files" width="80"> | ⭐⭐☆☆ | 1.3 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 28 | [core_scissor_test](core/core_scissor_test.c) | <img src="core/core_scissor_test.png" alt="core_scissor_test" width="80"> | ⭐️☆☆☆ | 2.5 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) |
|
| [core_random_values](core/core_random_values.c) | <img src="core/core_random_values.png" alt="core_random_values" width="80"> | ⭐☆☆☆ | 1.1 | 1.1 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 29 | [core_basic_screen_manager](core/core_basic_screen_manager.c) | <img src="core/core_basic_screen_manager.png" alt="core_basic_screen_manager" width="80"> | ⭐️☆☆☆ | 4.0 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [core_storage_values](core/core_storage_values.c) | <img src="core/core_storage_values.png" alt="core_storage_values" width="80"> | ⭐⭐☆☆ | 1.4 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 30 | [core_custom_frame_control](core/core_custom_frame_control.c) | <img src="core/core_custom_frame_control.png" alt="core_custom_frame_control" width="80"> | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [core_vr_simulator](core/core_vr_simulator.c) | <img src="core/core_vr_simulator.png" alt="core_vr_simulator" width="80"> | ⭐⭐⭐☆ | 2.5 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 31 | [core_smooth_pixelperfect](core/core_smooth_pixelperfect.c) | <img src="core/core_smooth_pixelperfect.png" alt="core_smooth_pixelperfect" width="80"> | ⭐️⭐️⭐️☆ | 3.7 | 4.0 | [Giancamillo Alessandroni](https://github.com/NotManyIdeasDev) |
|
| [core_scissor_test](core/core_scissor_test.c) | <img src="core/core_scissor_test.png" alt="core_scissor_test" width="80"> | ⭐☆☆☆ | 2.5 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) |
|
||||||
| 32 | [core_random_sequence](core/core_random_sequence.c) | <img src="core/core_random_sequence.png" alt="core_random_sequence" width="80"> | ⭐️☆☆☆ | 5.0 | 5.0 | [Dalton Overmyer](https://github.com/REDl3east) |
|
| [core_basic_screen_manager](core/core_basic_screen_manager.c) | <img src="core/core_basic_screen_manager.png" alt="core_basic_screen_manager" width="80"> | ⭐☆☆☆ | 4.0 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 33 | [core_basic_window_web](core/core_basic_window_web.c) | <img src="core/core_basic_window_web.png" alt="core_basic_window_web" width="80"> | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
| [core_custom_frame_control](core/core_custom_frame_control.c) | <img src="core/core_custom_frame_control.png" alt="core_custom_frame_control" width="80"> | ⭐⭐⭐⭐️ | 4.0 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 34 | [core_input_gestures_web](core/core_input_gestures_web.c) | <img src="core/core_input_gestures_web.png" alt="core_input_gestures_web" width="80"> | ⭐️⭐️☆☆ | 4.6-dev | 4.6-dev | [ubkp](https://github.com/ubkp) |
|
| [core_smooth_pixelperfect](core/core_smooth_pixelperfect.c) | <img src="core/core_smooth_pixelperfect.png" alt="core_smooth_pixelperfect" width="80"> | ⭐⭐⭐☆ | 3.7 | 4.0 | [Giancamillo Alessandroni](https://github.com/NotManyIdeasDev) |
|
||||||
| 35 | [core_automation_events](core/core_automation_events.c) | <img src="core/core_automation_events.png" alt="core_automation_events" width="80"> | ⭐️⭐️⭐️☆ | 5.0 | 5.0 | [Ray](https://github.com/raysan5) |
|
| [core_random_sequence](core/core_random_sequence.c) | <img src="core/core_random_sequence.png" alt="core_random_sequence" width="80"> | ⭐☆☆☆ | 5.0 | 5.0 | [Dalton Overmyer](https://github.com/REDl3east) |
|
||||||
| 36 | [core_high_dpi](core/core_high_dpi.c) | <img src="core/core_high_dpi.png" alt="core_high_dpi" width="80"> | ⭐️☆☆☆ | 5.0 | 5.0 | [Jonathan Marler](https://github.com/marler8997) |
|
| [core_automation_events](core/core_automation_events.c) | <img src="core/core_automation_events.png" alt="core_automation_events" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [core_highdpi_demo](core/core_highdpi_demo.c) | <img src="core/core_highdpi_demo.png" alt="core_highdpi_demo" width="80"> | ⭐⭐☆☆ | 5.0 | 5.5 | [Jonathan Marler](https://github.com/marler8997) |
|
||||||
|
| [core_render_texture](core/core_render_texture.c) | <img src="core/core_render_texture.png" alt="core_render_texture" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [core_undo_redo](core/core_undo_redo.c) | <img src="core/core_undo_redo.png" alt="core_undo_redo" width="80"> | ⭐⭐⭐☆ | 5.5 | 5.6 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [core_viewport_scaling](core/core_viewport_scaling.c) | <img src="core/core_viewport_scaling.png" alt="core_viewport_scaling" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Agnis Aldiņš](https://github.com/nezvers) |
|
||||||
|
| [core_input_actions](core/core_input_actions.c) | <img src="core/core_input_actions.png" alt="core_input_actions" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6 | [Jett](https://github.com/JettMonstersGoBoom) |
|
||||||
|
| [core_directory_files](core/core_directory_files.c) | <img src="core/core_directory_files.png" alt="core_directory_files" width="80"> | ⭐☆☆☆ | 5.5 | 5.6 | [Hugo ARNAL](https://github.com/hugoarnal) |
|
||||||
|
| [core_highdpi_testbed](core/core_highdpi_testbed.c) | <img src="core/core_highdpi_testbed.png" alt="core_highdpi_testbed" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [core_screen_recording](core/core_screen_recording.c) | <img src="core/core_screen_recording.png" alt="core_screen_recording" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [core_clipboard_text](core/core_clipboard_text.c) | <img src="core/core_clipboard_text.png" alt="core_clipboard_text" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [Ananth S](https://github.com/Ananth1839) |
|
||||||
|
| [core_text_file_loading](core/core_text_file_loading.c) | <img src="core/core_text_file_loading.png" alt="core_text_file_loading" width="80"> | ⭐☆☆☆ | 5.5 | 5.6 | [Aanjishnu Bhattacharyya](https://github.com/NimComPoo-04) |
|
||||||
|
| [core_compute_hash](core/core_compute_hash.c) | <img src="core/core_compute_hash.png" alt="core_compute_hash" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
|
||||||
### category: shapes
|
### category: shapes [38]
|
||||||
|
|
||||||
Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/shapes.c) module.
|
Examples using raylib shapes drawing functionality, provided by raylib [shapes](../src/rshapes.c) module.
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
| 36 | [shapes_basic_shapes](shapes/shapes_basic_shapes.c) | <img src="shapes/shapes_basic_shapes.png" alt="shapes_basic_shapes" width="80"> | ⭐️☆☆☆ | 1.0 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [shapes_basic_shapes](shapes/shapes_basic_shapes.c) | <img src="shapes/shapes_basic_shapes.png" alt="shapes_basic_shapes" width="80"> | ⭐☆☆☆ | 1.0 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 37 | [shapes_bouncing_ball](shapes/shapes_bouncing_ball.c) | <img src="shapes/shapes_bouncing_ball.png" alt="shapes_bouncing_ball" width="80"> | ⭐️☆☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_bouncing_ball](shapes/shapes_bouncing_ball.c) | <img src="shapes/shapes_bouncing_ball.png" alt="shapes_bouncing_ball" width="80"> | ⭐☆☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 38 | [shapes_colors_palette](shapes/shapes_colors_palette.c) | <img src="shapes/shapes_colors_palette.png" alt="shapes_colors_palette" width="80"> | ⭐️⭐️☆☆ | 1.0 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_bullet_hell](shapes/shapes_bullet_hell.c) | <img src="shapes/shapes_bullet_hell.png" alt="shapes_bullet_hell" width="80"> | ⭐☆☆☆ | 5.6 | 5.6 | [Zero](https://github.com/zerohorsepower) |
|
||||||
| 39 | [shapes_logo_raylib](shapes/shapes_logo_raylib.c) | <img src="shapes/shapes_logo_raylib.png" alt="shapes_logo_raylib" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
| [shapes_colors_palette](shapes/shapes_colors_palette.c) | <img src="shapes/shapes_colors_palette.png" alt="shapes_colors_palette" width="80"> | ⭐⭐☆☆ | 1.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 40 | [shapes_logo_raylib_anim](shapes/shapes_logo_raylib_anim.c) | <img src="shapes/shapes_logo_raylib_anim.png" alt="shapes_logo_raylib_anim" width="80"> | ⭐️⭐️☆☆ | 2.5 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [shapes_logo_raylib](shapes/shapes_logo_raylib.c) | <img src="shapes/shapes_logo_raylib.png" alt="shapes_logo_raylib" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 41 | [shapes_rectangle_scaling](shapes/shapes_rectangle_scaling.c) | <img src="shapes/shapes_rectangle_scaling.png" alt="shapes_rectangle_scaling" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
| [shapes_logo_raylib_anim](shapes/shapes_logo_raylib_anim.c) | <img src="shapes/shapes_logo_raylib_anim.png" alt="shapes_logo_raylib_anim" width="80"> | ⭐⭐☆☆ | 2.5 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 42 | [shapes_lines_bezier](shapes/shapes_lines_bezier.c) | <img src="shapes/shapes_lines_bezier.png" alt="shapes_lines_bezier" width="80"> | ⭐️☆☆☆ | 1.7 | 1.7 | [Ray](https://github.com/raysan5) |
|
| [shapes_rectangle_scaling](shapes/shapes_rectangle_scaling.c) | <img src="shapes/shapes_rectangle_scaling.png" alt="shapes_rectangle_scaling" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
| 43 | [shapes_collision_area](shapes/shapes_collision_area.c) | <img src="shapes/shapes_collision_area.png" alt="shapes_collision_area" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_lines_bezier](shapes/shapes_lines_bezier.c) | <img src="shapes/shapes_lines_bezier.png" alt="shapes_lines_bezier" width="80"> | ⭐☆☆☆ | 1.7 | 1.7 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 44 | [shapes_following_eyes](shapes/shapes_following_eyes.c) | <img src="shapes/shapes_following_eyes.png" alt="shapes_following_eyes" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_collision_area](shapes/shapes_collision_area.c) | <img src="shapes/shapes_collision_area.png" alt="shapes_collision_area" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 45 | [shapes_easings_ball_anim](shapes/shapes_easings_ball_anim.c) | <img src="shapes/shapes_easings_ball_anim.png" alt="shapes_easings_ball_anim" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_following_eyes](shapes/shapes_following_eyes.c) | <img src="shapes/shapes_following_eyes.png" alt="shapes_following_eyes" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 46 | [shapes_easings_box_anim](shapes/shapes_easings_box_anim.c) | <img src="shapes/shapes_easings_box_anim.png" alt="shapes_easings_box_anim" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_easings_ball](shapes/shapes_easings_ball.c) | <img src="shapes/shapes_easings_ball.png" alt="shapes_easings_ball" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 47 | [shapes_easings_rectangle_array](shapes/shapes_easings_rectangle_array.c) | <img src="shapes/shapes_easings_rectangle_array.png" alt="shapes_easings_rectangle_array" width="80"> | ⭐️⭐️⭐️☆ | 2.0 | 2.5 | [Ray](https://github.com/raysan5) |
|
| [shapes_easings_box](shapes/shapes_easings_box.c) | <img src="shapes/shapes_easings_box.png" alt="shapes_easings_box" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 48 | [shapes_draw_ring](shapes/shapes_draw_ring.c) | <img src="shapes/shapes_draw_ring.png" alt="shapes_draw_ring" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
| [shapes_easings_rectangles](shapes/shapes_easings_rectangles.c) | <img src="shapes/shapes_easings_rectangles.png" alt="shapes_easings_rectangles" width="80"> | ⭐⭐⭐☆ | 2.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 49 | [shapes_draw_circle_sector](shapes/shapes_draw_circle_sector.c) | <img src="shapes/shapes_draw_circle_sector.png" alt="shapes_draw_circle_sector" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
| [shapes_recursive_tree](shapes/shapes_recursive_tree.c) | <img src="shapes/shapes_recursive_tree.png" alt="shapes_recursive_tree" width="80"> | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
|
||||||
| 50 | [shapes_draw_rectangle_rounded](shapes/shapes_draw_rectangle_rounded.c) | <img src="shapes/shapes_draw_rectangle_rounded.png" alt="shapes_draw_rectangle_rounded" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
| [shapes_ring_drawing](shapes/shapes_ring_drawing.c) | <img src="shapes/shapes_ring_drawing.png" alt="shapes_ring_drawing" width="80"> | ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
| 51 | [shapes_top_down_lights](shapes/shapes_top_down_lights.c) | <img src="shapes/shapes_top_down_lights.png" alt="shapes_top_down_lights" width="80"> | ⭐️⭐️⭐️⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
|
| [shapes_circle_sector_drawing](shapes/shapes_circle_sector_drawing.c) | <img src="shapes/shapes_circle_sector_drawing.png" alt="shapes_circle_sector_drawing" width="80"> | ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
| 52 | [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) | <img src="shapes/shapes_rectangle_advanced.png" alt="shapes_rectangle_advanced" width="80"> | ⭐️⭐️⭐️⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
|
| [shapes_rounded_rectangle_drawing](shapes/shapes_rounded_rectangle_drawing.c) | <img src="shapes/shapes_rounded_rectangle_drawing.png" alt="shapes_rounded_rectangle_drawing" width="80"> | ⭐⭐⭐☆ | 2.5 | 2.5 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
| 53 | [shapes_splines_drawing](shapes/shapes_splines_drawing.c) | <img src="shapes/shapes_splines_drawing.png" alt="shapes_splines_drawing" width="80"> | ⭐️⭐️⭐️☆ | 5.0 | 5.0 | [Ray](https://github.com/raysan5) |
|
| [shapes_top_down_lights](shapes/shapes_top_down_lights.c) | <img src="shapes/shapes_top_down_lights.png" alt="shapes_top_down_lights" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
| 54 | [shapes_digital_clock](shapes/shapes_digital_clock.c) | <img src="shapes/shapes_digital_clock.png" alt="shapes_digital_clock" width="80"> | ⭐️⭐️☆☆ | 5.5 | 5.5 | [Hamza RAHAL](https://github.com/rhmz-rhl) |
|
| [shapes_rectangle_advanced](shapes/shapes_rectangle_advanced.c) | <img src="shapes/shapes_rectangle_advanced.png" alt="shapes_rectangle_advanced" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.5 | [Everton Jr.](https://github.com/evertonse) |
|
||||||
### category: textures
|
| [shapes_splines_drawing](shapes/shapes_splines_drawing.c) | <img src="shapes/shapes_splines_drawing.png" alt="shapes_splines_drawing" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [shapes_digital_clock](shapes/shapes_digital_clock.c) | <img src="shapes/shapes_digital_clock.png" alt="shapes_digital_clock" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Hamza RAHAL](https://github.com/hmz-rhl) |
|
||||||
|
| [shapes_double_pendulum](shapes/shapes_double_pendulum.c) | <img src="shapes/shapes_double_pendulum.png" alt="shapes_double_pendulum" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [JoeCheong](https://github.com/Joecheong2006) |
|
||||||
|
| [shapes_dashed_line](shapes/shapes_dashed_line.c) | <img src="shapes/shapes_dashed_line.png" alt="shapes_dashed_line" width="80"> | ⭐☆☆☆ | 5.5 | 5.5 | [Luís Almeida](https://github.com/luis605) |
|
||||||
|
| [shapes_triangle_strip](shapes/shapes_triangle_strip.c) | <img src="shapes/shapes_triangle_strip.png" alt="shapes_triangle_strip" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
|
||||||
|
| [shapes_vector_angle](shapes/shapes_vector_angle.c) | <img src="shapes/shapes_vector_angle.png" alt="shapes_vector_angle" width="80"> | ⭐⭐☆☆ | 1.0 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [shapes_pie_chart](shapes/shapes_pie_chart.c) | <img src="shapes/shapes_pie_chart.png" alt="shapes_pie_chart" width="80"> | ⭐⭐⭐☆ | 5.5 | 5.6 | [Gideon Serfontein](https://github.com/GideonSerf) |
|
||||||
|
| [shapes_kaleidoscope](shapes/shapes_kaleidoscope.c) | <img src="shapes/shapes_kaleidoscope.png" alt="shapes_kaleidoscope" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6 | [Hugo ARNAL](https://github.com/hugoarnal) |
|
||||||
|
| [shapes_clock_of_clocks](shapes/shapes_clock_of_clocks.c) | <img src="shapes/shapes_clock_of_clocks.png" alt="shapes_clock_of_clocks" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6-dev | [JP Mortiboys](https://github.com/themushroompirates) |
|
||||||
|
| [shapes_math_sine_cosine](shapes/shapes_math_sine_cosine.c) | <img src="shapes/shapes_math_sine_cosine.png" alt="shapes_math_sine_cosine" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
|
||||||
|
| [shapes_mouse_trail](shapes/shapes_mouse_trail.c) | <img src="shapes/shapes_mouse_trail.png" alt="shapes_mouse_trail" width="80"> | ⭐☆☆☆ | 5.6 | 5.6-dev | [Balamurugan R](https://github.com/Bala050814) |
|
||||||
|
| [shapes_simple_particles](shapes/shapes_simple_particles.c) | <img src="shapes/shapes_simple_particles.png" alt="shapes_simple_particles" width="80"> | ⭐⭐☆☆ | 5.6 | 5.6 | [Jordi Santonja](https://github.com/JordSant) |
|
||||||
|
| [shapes_starfield_effect](shapes/shapes_starfield_effect.c) | <img src="shapes/shapes_starfield_effect.png" alt="shapes_starfield_effect" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6-dev | [JP Mortiboys](https://github.com/themushroompirates) |
|
||||||
|
| [shapes_lines_drawing](shapes/shapes_lines_drawing.c) | <img src="shapes/shapes_lines_drawing.png" alt="shapes_lines_drawing" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Robin](https://github.com/RobinsAviary) |
|
||||||
|
| [shapes_math_angle_rotation](shapes/shapes_math_angle_rotation.c) | <img src="shapes/shapes_math_angle_rotation.png" alt="shapes_math_angle_rotation" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6 | [Kris](https://github.com/krispy-snacc) |
|
||||||
|
| [shapes_rlgl_color_wheel](shapes/shapes_rlgl_color_wheel.c) | <img src="shapes/shapes_rlgl_color_wheel.png" alt="shapes_rlgl_color_wheel" width="80"> | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Robin](https://github.com/RobinsAviary) |
|
||||||
|
| [shapes_rlgl_triangle](shapes/shapes_rlgl_triangle.c) | <img src="shapes/shapes_rlgl_triangle.png" alt="shapes_rlgl_triangle" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Robin](https://github.com/RobinsAviary) |
|
||||||
|
| [shapes_ball_physics](shapes/shapes_ball_physics.c) | <img src="shapes/shapes_ball_physics.png" alt="shapes_ball_physics" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [David Buzatto](https://github.com/davidbuzatto) |
|
||||||
|
| [shapes_penrose_tile](shapes/shapes_penrose_tile.c) | <img src="shapes/shapes_penrose_tile.png" alt="shapes_penrose_tile" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.6-dev | [David Buzatto](https://github.com/davidbuzatto) |
|
||||||
|
|
||||||
Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/textures.c) modul
|
### category: textures [29]
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
Examples using raylib textures functionality, including image/textures loading/generation and drawing, provided by raylib [textures](../src/rtextures.c) module.
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|
||||||
| 55 | [textures_logo_raylib](textures/textures_logo_raylib.c) | <img src="textures/textures_logo_raylib.png" alt="textures_logo_raylib" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 56 | [textures_srcrec_dstrec](textures/textures_srcrec_dstrec.c) | <img src="textures/textures_srcrec_dstrec.png" alt="textures_srcrec_dstrec" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 57 | [textures_image_drawing](textures/textures_image_drawing.c) | <img src="textures/textures_image_drawing.png" alt="textures_image_drawing" width="80"> | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 58 | [textures_image_generation](textures/textures_image_generation.c) | <img src="textures/textures_image_generation.png" alt="textures_image_generation" width="80"> | ⭐️⭐️☆☆ | 1.8 | 1.8 | [Wilhem Barbier](https://github.com/nounoursheureux) |
|
|
||||||
| 59 | [textures_image_loading](textures/textures_image_loading.c) | <img src="textures/textures_image_loading.png" alt="textures_image_loading" width="80"> | ⭐️☆☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 60 | [textures_image_processing](textures/textures_image_processing.c) | <img src="textures/textures_image_processing.png" alt="textures_image_processing" width="80"> | ⭐️⭐️⭐️☆ | 1.4 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 61 | [textures_image_text](textures/textures_image_text.c) | <img src="textures/textures_image_text.png" alt="textures_image_text" width="80"> | ⭐️⭐️☆☆ | 1.8 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 62 | [textures_to_image](textures/textures_to_image.c) | <img src="textures/textures_to_image.png" alt="textures_to_image" width="80"> | ⭐️☆☆☆ | 1.3 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 63 | [textures_raw_data](textures/textures_raw_data.c) | <img src="textures/textures_raw_data.png" alt="textures_raw_data" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 64 | [textures_particles_blending](textures/textures_particles_blending.c) | <img src="textures/textures_particles_blending.png" alt="textures_particles_blending" width="80"> | ⭐️☆☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 65 | [textures_npatch_drawing](textures/textures_npatch_drawing.c) | <img src="textures/textures_npatch_drawing.png" alt="textures_npatch_drawing" width="80"> | ⭐️⭐️⭐️☆ | 2.0 | 2.5 | [Jorge A. Gomes](https://github.com/overdev) |
|
|
||||||
| 66 | [textures_background_scrolling](textures/textures_background_scrolling.c) | <img src="textures/textures_background_scrolling.png" alt="textures_background_scrolling" width="80"> | ⭐️☆☆☆ | 2.0 | 2.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 67 | [textures_sprite_anim](textures/textures_sprite_anim.c) | <img src="textures/textures_sprite_anim.png" alt="textures_sprite_anim" width="80"> | ⭐️⭐️☆☆ | 1.3 | 1.3 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 68 | [textures_sprite_button](textures/textures_sprite_button.c) | <img src="textures/textures_sprite_button.png" alt="textures_sprite_button" width="80"> | ⭐️⭐️☆☆ | 2.5 | 2.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 69 | [textures_sprite_explosion](textures/textures_sprite_explosion.c) | <img src="textures/textures_sprite_explosion.png" alt="textures_sprite_explosion" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 70 | [textures_bunnymark](textures/textures_bunnymark.c) | <img src="textures/textures_bunnymark.png" alt="textures_bunnymark" width="80"> | ⭐️⭐️⭐️☆ | 1.6 | 2.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 71 | [textures_mouse_painting](textures/textures_mouse_painting.c) | <img src="textures/textures_mouse_painting.png" alt="textures_mouse_painting" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) |
|
|
||||||
| 72 | [textures_blend_modes](textures/textures_blend_modes.c) | <img src="textures/textures_blend_modes.png" alt="textures_blend_modes" width="80"> | ⭐️☆☆☆ | 3.5 | 3.5 | [Karlo Licudine](https://github.com/accidentalrebel) |
|
|
||||||
| 73 | [textures_draw_tiled](textures/textures_draw_tiled.c) | <img src="textures/textures_draw_tiled.png" alt="textures_draw_tiled" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 4.2 | [Vlad Adrian](https://github.com/demizdor) |
|
|
||||||
| 74 | [textures_polygon](textures/textures_polygon.c) | <img src="textures/textures_polygon.png" alt="textures_polygon" width="80"> | ⭐️☆☆☆ | 3.7 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
|
||||||
| 75 | [textures_fog_of_war](textures/textures_fog_of_war.c) | <img src="textures/textures_fog_of_war.png" alt="textures_fog_of_war" width="80"> | ⭐️⭐️⭐️☆ | 4.2 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 76 | [textures_gif_player](textures/textures_gif_player.c) | <img src="textures/textures_gif_player.png" alt="textures_gif_player" width="80"> | ⭐️⭐️⭐️☆ | 4.2 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 77 | [textures_image_kernel](textures/textures_image_kernel.c) | <img src="textures/textures_image_kernel.png" alt="textures_image_kernel" width="80"> | ⭐️⭐️⭐️⭐️ | 1.3 | 1.3 | [Karim Salem](https://github.com/kimo-s) |
|
|
||||||
| 78 | [textures_image_channel](textures/textures_image_channel.c) | <img src="textures/textures_image_channel.png" alt="textures_image_channel" width="80"> | ⭐️⭐️☆☆ | 5.1-dev | 5.1-dev | [Bruno Cabral](https://github.com/brccabral) |
|
|
||||||
| 79 | [textures_image_rotate](textures/textures_image_rotate.c) | <img src="textures/textures_image_rotate.png" alt="textures_image_rotate" width="80"> | ⭐️⭐️☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 80 | [textures_textured_curve](textures/textures_textured_curve.c) | <img src="textures/textures_textured_curve.png" alt="textures_textured_curve" width="80"> | ⭐️⭐️⭐️☆ | 4.5 | 4.5 | [Jeffery Myers](https://github.com/JeffM2501) |
|
|
||||||
|
|
||||||
### category: text
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
|
| [textures_logo_raylib](textures/textures_logo_raylib.c) | <img src="textures/textures_logo_raylib.png" alt="textures_logo_raylib" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_srcrec_dstrec](textures/textures_srcrec_dstrec.c) | <img src="textures/textures_srcrec_dstrec.png" alt="textures_srcrec_dstrec" width="80"> | ⭐⭐⭐☆ | 1.3 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_image_drawing](textures/textures_image_drawing.c) | <img src="textures/textures_image_drawing.png" alt="textures_image_drawing" width="80"> | ⭐⭐☆☆ | 1.4 | 1.4 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_image_generation](textures/textures_image_generation.c) | <img src="textures/textures_image_generation.png" alt="textures_image_generation" width="80"> | ⭐⭐☆☆ | 1.8 | 1.8 | [Wilhem Barbier](https://github.com/nounoursheureux) |
|
||||||
|
| [textures_image_loading](textures/textures_image_loading.c) | <img src="textures/textures_image_loading.png" alt="textures_image_loading" width="80"> | ⭐☆☆☆ | 1.3 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_image_processing](textures/textures_image_processing.c) | <img src="textures/textures_image_processing.png" alt="textures_image_processing" width="80"> | ⭐⭐⭐☆ | 1.4 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_image_text](textures/textures_image_text.c) | <img src="textures/textures_image_text.png" alt="textures_image_text" width="80"> | ⭐⭐☆☆ | 1.8 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_to_image](textures/textures_to_image.c) | <img src="textures/textures_to_image.png" alt="textures_to_image" width="80"> | ⭐☆☆☆ | 1.3 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_raw_data](textures/textures_raw_data.c) | <img src="textures/textures_raw_data.png" alt="textures_raw_data" width="80"> | ⭐⭐⭐☆ | 1.3 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_particles_blending](textures/textures_particles_blending.c) | <img src="textures/textures_particles_blending.png" alt="textures_particles_blending" width="80"> | ⭐☆☆☆ | 1.7 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_npatch_drawing](textures/textures_npatch_drawing.c) | <img src="textures/textures_npatch_drawing.png" alt="textures_npatch_drawing" width="80"> | ⭐⭐⭐☆ | 2.0 | 2.5 | [Jorge A. Gomes](https://github.com/overdev) |
|
||||||
|
| [textures_background_scrolling](textures/textures_background_scrolling.c) | <img src="textures/textures_background_scrolling.png" alt="textures_background_scrolling" width="80"> | ⭐☆☆☆ | 2.0 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_sprite_animation](textures/textures_sprite_animation.c) | <img src="textures/textures_sprite_animation.png" alt="textures_sprite_animation" width="80"> | ⭐⭐☆☆ | 1.3 | 1.3 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_sprite_button](textures/textures_sprite_button.c) | <img src="textures/textures_sprite_button.png" alt="textures_sprite_button" width="80"> | ⭐⭐☆☆ | 2.5 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_sprite_explosion](textures/textures_sprite_explosion.c) | <img src="textures/textures_sprite_explosion.png" alt="textures_sprite_explosion" width="80"> | ⭐⭐☆☆ | 2.5 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_bunnymark](textures/textures_bunnymark.c) | <img src="textures/textures_bunnymark.png" alt="textures_bunnymark" width="80"> | ⭐⭐⭐☆ | 1.6 | 2.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_mouse_painting](textures/textures_mouse_painting.c) | <img src="textures/textures_mouse_painting.png" alt="textures_mouse_painting" width="80"> | ⭐⭐⭐☆ | 3.0 | 3.0 | [Chris Dill](https://github.com/MysteriousSpace) |
|
||||||
|
| [textures_blend_modes](textures/textures_blend_modes.c) | <img src="textures/textures_blend_modes.png" alt="textures_blend_modes" width="80"> | ⭐☆☆☆ | 3.5 | 3.5 | [Karlo Licudine](https://github.com/accidentalrebel) |
|
||||||
|
| [textures_tiled_drawing](textures/textures_tiled_drawing.c) | <img src="textures/textures_tiled_drawing.png" alt="textures_tiled_drawing" width="80"> | ⭐⭐⭐☆ | 3.0 | 4.2 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
|
| [textures_polygon_drawing](textures/textures_polygon_drawing.c) | <img src="textures/textures_polygon_drawing.png" alt="textures_polygon_drawing" width="80"> | ⭐☆☆☆ | 3.7 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
||||||
|
| [textures_fog_of_war](textures/textures_fog_of_war.c) | <img src="textures/textures_fog_of_war.png" alt="textures_fog_of_war" width="80"> | ⭐⭐⭐☆ | 4.2 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_gif_player](textures/textures_gif_player.c) | <img src="textures/textures_gif_player.png" alt="textures_gif_player" width="80"> | ⭐⭐⭐☆ | 4.2 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_image_kernel](textures/textures_image_kernel.c) | <img src="textures/textures_image_kernel.png" alt="textures_image_kernel" width="80"> | ⭐⭐⭐⭐️ | 1.3 | 1.3 | [Karim Salem](https://github.com/kimo-s) |
|
||||||
|
| [textures_image_channel](textures/textures_image_channel.c) | <img src="textures/textures_image_channel.png" alt="textures_image_channel" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Bruno Cabral](https://github.com/brccabral) |
|
||||||
|
| [textures_image_rotate](textures/textures_image_rotate.c) | <img src="textures/textures_image_rotate.png" alt="textures_image_rotate" width="80"> | ⭐⭐☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [textures_screen_buffer](textures/textures_screen_buffer.c) | <img src="textures/textures_screen_buffer.png" alt="textures_screen_buffer" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Agnis Aldiņš](https://github.com/nezvers) |
|
||||||
|
| [textures_textured_curve](textures/textures_textured_curve.c) | <img src="textures/textures_textured_curve.png" alt="textures_textured_curve" width="80"> | ⭐⭐⭐☆ | 4.5 | 4.5 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
|
| [textures_sprite_stacking](textures/textures_sprite_stacking.c) | <img src="textures/textures_sprite_stacking.png" alt="textures_sprite_stacking" width="80"> | ⭐⭐☆☆ | 5.6-dev | 6.0 | [Robin](https://github.com/RobinsAviary) |
|
||||||
|
| [textures_cellular_automata](textures/textures_cellular_automata.c) | <img src="textures/textures_cellular_automata.png" alt="textures_cellular_automata" width="80"> | ⭐⭐☆☆ | 5.6 | 5.6 | [Jordi Santonja](https://github.com/JordSant) |
|
||||||
|
|
||||||
Examples using raylib text functionality, including sprite fonts loading/generation and text drawing, provided by raylib [text](../src/text.c) module.
|
### category: text [16]
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
Examples using raylib text functionality, including sprite fonts loading/generation and text drawing, provided by raylib [text](../src/rtext.c) module.
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|
||||||
| 81 | [text_raylib_fonts](text/text_raylib_fonts.c) | <img src="text/text_raylib_fonts.png" alt="text_raylib_fonts" width="80"> | ⭐️☆☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 82 | [text_font_spritefont](text/text_font_spritefont.c) | <img src="text/text_font_spritefont.png" alt="text_font_spritefont" width="80"> | ⭐️☆☆☆ | 1.0 | 1.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 83 | [text_font_filters](text/text_font_filters.c) | <img src="text/text_font_filters.png" alt="text_font_filters" width="80"> | ⭐️⭐️☆☆ | 1.3 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 84 | [text_font_loading](text/text_font_loading.c) | <img src="text/text_font_loading.png" alt="text_font_loading" width="80"> | ⭐️☆☆☆ | 1.4 | 3.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 85 | [text_font_sdf](text/text_font_sdf.c) | <img src="text/text_font_sdf.png" alt="text_font_sdf" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 86 | [text_format_text](text/text_format_text.c) | <img src="text/text_format_text.png" alt="text_format_text" width="80"> | ⭐️☆☆☆ | 1.1 | 3.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 87 | [text_input_box](text/text_input_box.c) | <img src="text/text_input_box.png" alt="text_input_box" width="80"> | ⭐️⭐️☆☆ | 1.7 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 88 | [text_writing_anim](text/text_writing_anim.c) | <img src="text/text_writing_anim.png" alt="text_writing_anim" width="80"> | ⭐️⭐️☆☆ | 1.4 | 1.4 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 89 | [text_rectangle_bounds](text/text_rectangle_bounds.c) | <img src="text/text_rectangle_bounds.png" alt="text_rectangle_bounds" width="80"> | ⭐️⭐️⭐️⭐️ | 2.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
|
||||||
| 90 | [text_unicode](text/text_unicode.c) | <img src="text/text_unicode.png" alt="text_unicode" width="80"> | ⭐️⭐️⭐️⭐️ | 2.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
|
||||||
| 91 | [text_draw_3d](text/text_draw_3d.c) | <img src="text/text_draw_3d.png" alt="text_draw_3d" width="80"> | ⭐️⭐️⭐️⭐️ | 3.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
|
||||||
| 92 | [text_codepoints_loading](text/text_codepoints_loading.c) | <img src="text/text_codepoints_loading.png" alt="text_codepoints_loading" width="80"> | ⭐️⭐️⭐️☆ | 4.2 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
|
|
||||||
### category: models
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
|
| [text_sprite_fonts](text/text_sprite_fonts.c) | <img src="text/text_sprite_fonts.png" alt="text_sprite_fonts" width="80"> | ⭐☆☆☆ | 1.7 | 3.7 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_font_spritefont](text/text_font_spritefont.c) | <img src="text/text_font_spritefont.png" alt="text_font_spritefont" width="80"> | ⭐☆☆☆ | 1.0 | 1.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_font_filters](text/text_font_filters.c) | <img src="text/text_font_filters.png" alt="text_font_filters" width="80"> | ⭐⭐☆☆ | 1.3 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_font_loading](text/text_font_loading.c) | <img src="text/text_font_loading.png" alt="text_font_loading" width="80"> | ⭐☆☆☆ | 1.4 | 3.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_font_sdf](text/text_font_sdf.c) | <img src="text/text_font_sdf.png" alt="text_font_sdf" width="80"> | ⭐⭐⭐☆ | 1.3 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_format_text](text/text_format_text.c) | <img src="text/text_format_text.png" alt="text_format_text" width="80"> | ⭐☆☆☆ | 1.1 | 3.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_input_box](text/text_input_box.c) | <img src="text/text_input_box.png" alt="text_input_box" width="80"> | ⭐⭐☆☆ | 1.7 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_writing_anim](text/text_writing_anim.c) | <img src="text/text_writing_anim.png" alt="text_writing_anim" width="80"> | ⭐⭐☆☆ | 1.4 | 1.4 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_rectangle_bounds](text/text_rectangle_bounds.c) | <img src="text/text_rectangle_bounds.png" alt="text_rectangle_bounds" width="80"> | ⭐⭐⭐⭐️ | 2.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
|
| [text_unicode_emojis](text/text_unicode_emojis.c) | <img src="text/text_unicode_emojis.png" alt="text_unicode_emojis" width="80"> | ⭐⭐⭐⭐️ | 2.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
|
| [text_unicode_ranges](text/text_unicode_ranges.c) | <img src="text/text_unicode_ranges.png" alt="text_unicode_ranges" width="80"> | ⭐⭐⭐⭐️ | 5.5 | 5.6 | [Vadim Gunko](https://github.com/GuvaCode) |
|
||||||
|
| [text_3d_drawing](text/text_3d_drawing.c) | <img src="text/text_3d_drawing.png" alt="text_3d_drawing" width="80"> | ⭐⭐⭐⭐️ | 3.5 | 4.0 | [Vlad Adrian](https://github.com/demizdor) |
|
||||||
|
| [text_codepoints_loading](text/text_codepoints_loading.c) | <img src="text/text_codepoints_loading.png" alt="text_codepoints_loading" width="80"> | ⭐⭐⭐☆ | 4.2 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [text_inline_styling](text/text_inline_styling.c) | <img src="text/text_inline_styling.png" alt="text_inline_styling" width="80"> | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Wagner Barongello](https://github.com/SultansOfCode) |
|
||||||
|
| [text_words_alignment](text/text_words_alignment.c) | <img src="text/text_words_alignment.png" alt="text_words_alignment" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [JP Mortiboys](https://github.com/themushroompirates) |
|
||||||
|
| [text_strings_management](text/text_strings_management.c) | <img src="text/text_strings_management.png" alt="text_strings_management" width="80"> | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [David Buzatto](https://github.com/davidbuzatto) |
|
||||||
|
|
||||||
Examples using raylib models functionality, including models loading/generation and drawing, provided by raylib [models](../src/models.c) module.
|
### category: models [27]
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
Examples using raylib models functionality, including models loading/generation and drawing, provided by raylib [models](../src/rmodels.c) module.
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|
||||||
| 93 | [models_animation](models/models_animation.c) | <img src="models/models_animation.png" alt="models_animation" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Culacant](https://github.com/culacant) |
|
|
||||||
| 94 | [models_billboard](models/models_billboard.c) | <img src="models/models_billboard.png" alt="models_billboard" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 95 | [models_box_collisions](models/models_box_collisions.c) | <img src="models/models_box_collisions.png" alt="models_box_collisions" width="80"> | ⭐️☆☆☆ | 1.3 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 96 | [models_cubicmap](models/models_cubicmap.c) | <img src="models/models_cubicmap.png" alt="models_cubicmap" width="80"> | ⭐️⭐️☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 97 | [models_first_person_maze](models/models_first_person_maze.c) | <img src="models/models_first_person_maze.png" alt="models_first_person_maze" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 98 | [models_geometric_shapes](models/models_geometric_shapes.c) | <img src="models/models_geometric_shapes.png" alt="models_geometric_shapes" width="80"> | ⭐️☆☆☆ | 1.0 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 99 | [models_mesh_generation](models/models_mesh_generation.c) | <img src="models/models_mesh_generation.png" alt="models_mesh_generation" width="80"> | ⭐️⭐️☆☆ | 1.8 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 100 | [models_mesh_picking](models/models_mesh_picking.c) | <img src="models/models_mesh_picking.png" alt="models_mesh_picking" width="80"> | ⭐️⭐️⭐️☆ | 1.7 | 4.0 | [Joel Davis](https://github.com/joeld42) |
|
|
||||||
| 101 | [models_loading](models/models_loading.c) | <img src="models/models_loading.png" alt="models_loading" width="80"> | ⭐️☆☆☆ | 2.0 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 102 | [models_loading_gltf](models/models_loading_gltf.c) | <img src="models/models_loading_gltf.png" alt="models_loading_gltf" width="80"> | ⭐️☆☆☆ | 3.7 | 4.2 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 103 | [models_loading_vox](models/models_loading_vox.c) | <img src="models/models_loading_vox.png" alt="models_loading_vox" width="80"> | ⭐️☆☆☆ | 4.0 | 4.0 | [Johann Nadalutti](https://github.com/procfxgen) |
|
|
||||||
| 104 | [models_loading_m3d](models/models_loading_m3d.c) | <img src="models/models_loading_m3d.png" alt="models_loading_m3d" width="80"> | ⭐️⭐️☆☆ | 4.5 | 4.5 | [bzt](https://bztsrc.gitlab.io/model3d) |
|
|
||||||
| 105 | [models_orthographic_projection](models/models_orthographic_projection.c) | <img src="models/models_orthographic_projection.png" alt="models_orthographic_projection" width="80"> | ⭐️☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) |
|
|
||||||
| 106 | [models_point_rendering](models/models_point_rendering.c) | <img src="models/models_point_rendering.png" alt="models_point_rendering" width="80"> | ⭐️⭐️⭐️☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) |
|
|
||||||
| 107 | [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | <img src="models/models_rlgl_solar_system.png" alt="models_rlgl_solar_system" width="80"> | ⭐️⭐️⭐️⭐️ | 2.5 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 108 | [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | <img src="models/models_yaw_pitch_roll.png" alt="models_yaw_pitch_roll" width="80"> | ⭐️⭐️☆☆ | 1.8 | 4.0 | [Berni](https://github.com/Berni8k) |
|
|
||||||
| 109 | [models_waving_cubes](models/models_waving_cubes.c) | <img src="models/models_waving_cubes.png" alt="models_waving_cubes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Codecat](https://github.com/codecat) |
|
|
||||||
| 110 | [models_heightmap](models/models_heightmap.c) | <img src="models/models_heightmap.png" alt="models_heightmap" width="80"> | ⭐️☆☆☆ | 1.8 | 3.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 111 | [models_skybox](models/models_skybox.c) | <img src="models/models_skybox.png" alt="models_skybox" width="80"> | ⭐️⭐️☆☆ | 1.8 | 4.0 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 112 | [models_draw_cube_texture](models/models_draw_cube_texture.c) | <img src="models/models_draw_cube_texture.png" alt="models_draw_cube_texture" width="80"> | ⭐️⭐️☆☆ | 4.5 | 4.5 | [Ray](https://github.com/raysan5) |
|
|
||||||
| 113 | [models_gpu_skinning](models/models_gpu_skinning.c) | <img src="models/models_gpu_skinning.png" alt="models_gpu_skinning" width="80"> | ⭐️⭐️⭐️☆ | 4.5 | 4.5 | [Daniel Holden](https://github.com/orangeduck) |
|
|
||||||
| 114 | [models_bone_socket](models/models_bone_socket.c) | <img src="models/models_bone_socket.png" alt="models_bone_socket" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [iP](https://github.com/ipzaur) |
|
|
||||||
| 115 | [models_tesseract_view](models/models_tesseract_view.c) | <img src="models/models_tesseract_view.png" alt="models_tesseract_view" width="80"> | ⭐️⭐️☆☆ | 5.6-dev | 5.6-dev | [Timothy van der Valk](https://github.com/arceryz) |
|
|
||||||
|
|
||||||
### category: shaders
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
|
| [models_animation_playing](models/models_animation_playing.c) | <img src="models/models_animation_playing.png" alt="models_animation_playing" width="80"> | ⭐⭐☆☆ | 2.5 | 3.5 | [Culacant](https://github.com/culacant) |
|
||||||
|
| [models_billboard_rendering](models/models_billboard_rendering.c) | <img src="models/models_billboard_rendering.png" alt="models_billboard_rendering" width="80"> | ⭐⭐⭐☆ | 1.3 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_box_collisions](models/models_box_collisions.c) | <img src="models/models_box_collisions.png" alt="models_box_collisions" width="80"> | ⭐☆☆☆ | 1.3 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_cubicmap_rendering](models/models_cubicmap_rendering.c) | <img src="models/models_cubicmap_rendering.png" alt="models_cubicmap_rendering" width="80"> | ⭐⭐☆☆ | 1.8 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_first_person_maze](models/models_first_person_maze.c) | <img src="models/models_first_person_maze.png" alt="models_first_person_maze" width="80"> | ⭐⭐☆☆ | 2.5 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_geometric_shapes](models/models_geometric_shapes.c) | <img src="models/models_geometric_shapes.png" alt="models_geometric_shapes" width="80"> | ⭐☆☆☆ | 1.0 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_mesh_generation](models/models_mesh_generation.c) | <img src="models/models_mesh_generation.png" alt="models_mesh_generation" width="80"> | ⭐⭐☆☆ | 1.8 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_mesh_picking](models/models_mesh_picking.c) | <img src="models/models_mesh_picking.png" alt="models_mesh_picking" width="80"> | ⭐⭐⭐☆ | 1.7 | 4.0 | [Joel Davis](https://github.com/joeld42) |
|
||||||
|
| [models_loading](models/models_loading.c) | <img src="models/models_loading.png" alt="models_loading" width="80"> | ⭐☆☆☆ | 2.0 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_loading_gltf](models/models_loading_gltf.c) | <img src="models/models_loading_gltf.png" alt="models_loading_gltf" width="80"> | ⭐☆☆☆ | 3.7 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_loading_vox](models/models_loading_vox.c) | <img src="models/models_loading_vox.png" alt="models_loading_vox" width="80"> | ⭐☆☆☆ | 4.0 | 4.0 | [Johann Nadalutti](https://github.com/procfxgen) |
|
||||||
|
| [models_loading_m3d](models/models_loading_m3d.c) | <img src="models/models_loading_m3d.png" alt="models_loading_m3d" width="80"> | ⭐⭐☆☆ | 4.5 | 4.5 | [bzt](https://github.com/bztsrc) |
|
||||||
|
| [models_orthographic_projection](models/models_orthographic_projection.c) | <img src="models/models_orthographic_projection.png" alt="models_orthographic_projection" width="80"> | ⭐☆☆☆ | 2.0 | 3.7 | [Max Danielsson](https://github.com/autious) |
|
||||||
|
| [models_point_rendering](models/models_point_rendering.c) | <img src="models/models_point_rendering.png" alt="models_point_rendering" width="80"> | ⭐⭐⭐☆ | 5.0 | 5.0 | [Reese Gallagher](https://github.com/satchelfrost) |
|
||||||
|
| [models_rlgl_solar_system](models/models_rlgl_solar_system.c) | <img src="models/models_rlgl_solar_system.png" alt="models_rlgl_solar_system" width="80"> | ⭐⭐⭐⭐️ | 2.5 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_yaw_pitch_roll](models/models_yaw_pitch_roll.c) | <img src="models/models_yaw_pitch_roll.png" alt="models_yaw_pitch_roll" width="80"> | ⭐⭐☆☆ | 1.8 | 4.0 | [Berni](https://github.com/Berni8k) |
|
||||||
|
| [models_waving_cubes](models/models_waving_cubes.c) | <img src="models/models_waving_cubes.png" alt="models_waving_cubes" width="80"> | ⭐⭐⭐☆ | 2.5 | 3.7 | [Codecat](https://github.com/codecat) |
|
||||||
|
| [models_heightmap_rendering](models/models_heightmap_rendering.c) | <img src="models/models_heightmap_rendering.png" alt="models_heightmap_rendering" width="80"> | ⭐☆☆☆ | 1.8 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_skybox_rendering](models/models_skybox_rendering.c) | <img src="models/models_skybox_rendering.png" alt="models_skybox_rendering" width="80"> | ⭐⭐☆☆ | 1.8 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_textured_cube](models/models_textured_cube.c) | <img src="models/models_textured_cube.png" alt="models_textured_cube" width="80"> | ⭐⭐☆☆ | 4.5 | 4.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
| [models_animation_gpu_skinning](models/models_animation_gpu_skinning.c) | <img src="models/models_animation_gpu_skinning.png" alt="models_animation_gpu_skinning" width="80"> | ⭐⭐⭐☆ | 4.5 | 4.5 | [Daniel Holden](https://github.com/orangeduck) |
|
||||||
|
| [models_bone_socket](models/models_bone_socket.c) | <img src="models/models_bone_socket.png" alt="models_bone_socket" width="80"> | ⭐⭐⭐⭐️ | 4.5 | 4.5 | [iP](https://github.com/ipzaur) |
|
||||||
|
| [models_tesseract_view](models/models_tesseract_view.c) | <img src="models/models_tesseract_view.png" alt="models_tesseract_view" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6-dev | [Timothy van der Valk](https://github.com/arceryz) |
|
||||||
|
| [models_basic_voxel](models/models_basic_voxel.c) | <img src="models/models_basic_voxel.png" alt="models_basic_voxel" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Tim Little](https://github.com/timlittle) |
|
||||||
|
| [models_rotating_cube](models/models_rotating_cube.c) | <img src="models/models_rotating_cube.png" alt="models_rotating_cube" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [Jopestpe](https://github.com/jopestpe) |
|
||||||
|
| [models_decals](models/models_decals.c) | <img src="models/models_decals.png" alt="models_decals" width="80"> | ⭐⭐⭐⭐️ | 5.6-dev | 5.6-dev | [JP Mortiboys](https://github.com/themushroompirates) |
|
||||||
|
| [models_directional_billboard](models/models_directional_billboard.c) | <img src="models/models_directional_billboard.png" alt="models_directional_billboard" width="80"> | ⭐⭐☆☆ | 5.6-dev | 5.6 | [Robin](https://github.com/RobinsAviary) |
|
||||||
|
|
||||||
|
### category: shaders [33]
|
||||||
|
|
||||||
Examples using raylib shaders functionality, including shaders loading, parameters configuration and drawing using them (model shaders and postprocessing shaders). This functionality is directly provided by raylib [rlgl](../src/rlgl.c) module.
|
Examples using raylib shaders functionality, including shaders loading, parameters configuration and drawing using them (model shaders and postprocessing shaders). This functionality is directly provided by raylib [rlgl](../src/rlgl.c) module.
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
| 116 | [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | <img src="shaders/shaders_basic_lighting.png" alt="shaders_basic_lighting" width="80"> | ⭐️⭐️⭐️⭐️ | 3.0 | 4.2 | [Chris Camacho](https://github.com/chriscamacho) |
|
| [shaders_ascii_rendering](shaders/shaders_ascii_rendering.c) | <img src="shaders/shaders_ascii_rendering.png" alt="shaders_ascii_rendering" width="80"> | ⭐⭐☆☆ | 5.5 | 5.6 | [Maicon Santana](https://github.com/maiconpintoabreu) |
|
||||||
| 117 | [shaders_model_shader](shaders/shaders_model_shader.c) | <img src="shaders/shaders_model_shader.png" alt="shaders_model_shader" width="80"> | ⭐️⭐️☆☆ | 1.3 | 3.7 | [Ray](https://github.com/raysan5) |
|
| [shaders_basic_lighting](shaders/shaders_basic_lighting.c) | <img src="shaders/shaders_basic_lighting.png" alt="shaders_basic_lighting" width="80"> | ⭐⭐⭐⭐️ | 3.0 | 4.2 | [Chris Camacho](https://github.com/chriscamacho) |
|
||||||
| 118 | [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | <img src="shaders/shaders_shapes_textures.png" alt="shaders_shapes_textures" width="80"> | ⭐️⭐️☆☆ | 1.7 | 3.7 | [Ray](https://github.com/raysan5) |
|
| [shaders_model_shader](shaders/shaders_model_shader.c) | <img src="shaders/shaders_model_shader.png" alt="shaders_model_shader" width="80"> | ⭐⭐☆☆ | 1.3 | 3.7 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 119 | [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | <img src="shaders/shaders_custom_uniform.png" alt="shaders_custom_uniform" width="80"> | ⭐️⭐️☆☆ | 1.3 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [shaders_shapes_textures](shaders/shaders_shapes_textures.c) | <img src="shaders/shaders_shapes_textures.png" alt="shaders_shapes_textures" width="80"> | ⭐⭐☆☆ | 1.7 | 3.7 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 120 | [shaders_postprocessing](shaders/shaders_postprocessing.c) | <img src="shaders/shaders_postprocessing.png" alt="shaders_postprocessing" width="80"> | ⭐️⭐️⭐️☆ | 1.3 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [shaders_custom_uniform](shaders/shaders_custom_uniform.c) | <img src="shaders/shaders_custom_uniform.png" alt="shaders_custom_uniform" width="80"> | ⭐⭐☆☆ | 1.3 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 121 | [shaders_palette_switch](shaders/shaders_palette_switch.c) | <img src="shaders/shaders_palette_switch.png" alt="shaders_palette_switch" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) |
|
| [shaders_postprocessing](shaders/shaders_postprocessing.c) | <img src="shaders/shaders_postprocessing.png" alt="shaders_postprocessing" width="80"> | ⭐⭐⭐☆ | 1.3 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 122 | [shaders_raymarching](shaders/shaders_raymarching.c) | <img src="shaders/shaders_raymarching.png" alt="shaders_raymarching" width="80"> | ⭐️⭐️⭐️⭐️ | 2.0 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [shaders_palette_switch](shaders/shaders_palette_switch.c) | <img src="shaders/shaders_palette_switch.png" alt="shaders_palette_switch" width="80"> | ⭐⭐⭐☆ | 2.5 | 3.7 | [Marco Lizza](https://github.com/MarcoLizza) |
|
||||||
| 123 | [shaders_texture_drawing](shaders/shaders_texture_drawing.c) | <img src="shaders/shaders_texture_drawing.png" alt="shaders_texture_drawing" width="80"> | ⭐️⭐️☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/ciessielski) |
|
| [shaders_raymarching_rendering](shaders/shaders_raymarching_rendering.c) | <img src="shaders/shaders_raymarching_rendering.png" alt="shaders_raymarching_rendering" width="80"> | ⭐⭐⭐⭐️ | 2.0 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 124 | [shaders_texture_outline](shaders/shaders_texture_outline.c) | <img src="shaders/shaders_texture_outline.png" alt="shaders_texture_outline" width="80"> | ⭐️⭐️⭐️☆ | 4.0 | 4.0 | [Samuel Skiff](https://github.com/GoldenThumbs) |
|
| [shaders_texture_rendering](shaders/shaders_texture_rendering.c) | <img src="shaders/shaders_texture_rendering.png" alt="shaders_texture_rendering" width="80"> | ⭐⭐☆☆ | 2.0 | 3.7 | [Michał Ciesielski](https://github.com/ciessielski) |
|
||||||
| 125 | [shaders_texture_waves](shaders/shaders_texture_waves.c) | <img src="shaders/shaders_texture_waves.png" alt="shaders_texture_waves" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) |
|
| [shaders_texture_outline](shaders/shaders_texture_outline.c) | <img src="shaders/shaders_texture_outline.png" alt="shaders_texture_outline" width="80"> | ⭐⭐⭐☆ | 4.0 | 4.0 | [Serenity Skiff](https://github.com/GoldenThumbs) |
|
||||||
| 126 | [shaders_julia_set](shaders/shaders_julia_set.c) | <img src="shaders/shaders_julia_set.png" alt="shaders_julia_set" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 4.0 | [Josh Colclough](https://github.com/joshcol9232) |
|
| [shaders_texture_waves](shaders/shaders_texture_waves.c) | <img src="shaders/shaders_texture_waves.png" alt="shaders_texture_waves" width="80"> | ⭐⭐☆☆ | 2.5 | 3.7 | [Anata](https://github.com/anatagawa) |
|
||||||
| 127 | [shaders_eratosthenes](shaders/shaders_eratosthenes.c) | <img src="shaders/shaders_eratosthenes.png" alt="shaders_eratosthenes" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 4.0 | [ProfJski](https://github.com/ProfJski) |
|
| [shaders_julia_set](shaders/shaders_julia_set.c) | <img src="shaders/shaders_julia_set.png" alt="shaders_julia_set" width="80"> | ⭐⭐⭐☆ | 2.5 | 4.0 | [Josh Colclough](https://github.com/joshcol9232) |
|
||||||
| 128 | [shaders_fog](shaders/shaders_fog.c) | <img src="shaders/shaders_fog.png" alt="shaders_fog" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
| [shaders_mandelbrot_set](shaders/shaders_mandelbrot_set.c) | <img src="shaders/shaders_mandelbrot_set.png" alt="shaders_mandelbrot_set" width="80"> | ⭐⭐⭐☆ | 5.6 | 5.6 | [Jordi Santonja](https://github.com/JordSant) |
|
||||||
| 129 | [shaders_simple_mask](shaders/shaders_simple_mask.c) | <img src="shaders/shaders_simple_mask.png" alt="shaders_simple_mask" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
| [shaders_color_correction](shaders/shaders_color_correction.c) | <img src="shaders/shaders_color_correction.png" alt="shaders_color_correction" width="80"> | ⭐⭐☆☆ | 5.6 | 5.6 | [Jordi Santonja](https://github.com/JordSant) |
|
||||||
| 130 | [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | <img src="shaders/shaders_hot_reloading.png" alt="shaders_hot_reloading" width="80"> | ⭐️⭐️⭐️☆ | 3.0 | 3.5 | [Ray](https://github.com/raysan5) |
|
| [shaders_eratosthenes_sieve](shaders/shaders_eratosthenes_sieve.c) | <img src="shaders/shaders_eratosthenes_sieve.png" alt="shaders_eratosthenes_sieve" width="80"> | ⭐⭐⭐☆ | 2.5 | 4.0 | [ProfJski](https://github.com/ProfJski) |
|
||||||
| 131 | [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | <img src="shaders/shaders_mesh_instancing.png" alt="shaders_mesh_instancing" width="80"> | ⭐️⭐️⭐️⭐️ | 3.7 | 4.2 | [seanpringle](https://github.com/seanpringle) |
|
| [shaders_fog_rendering](shaders/shaders_fog_rendering.c) | <img src="shaders/shaders_fog_rendering.png" alt="shaders_fog_rendering" width="80"> | ⭐⭐⭐☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
||||||
| 132 | [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐️⭐️☆☆ | 3.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
| [shaders_simple_mask](shaders/shaders_simple_mask.c) | <img src="shaders/shaders_simple_mask.png" alt="shaders_simple_mask" width="80"> | ⭐⭐☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
||||||
| 133 | [shaders_spotlight](shaders/shaders_spotlight.c) | <img src="shaders/shaders_spotlight.png" alt="shaders_spotlight" width="80"> | ⭐️⭐️☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
| [shaders_hot_reloading](shaders/shaders_hot_reloading.c) | <img src="shaders/shaders_hot_reloading.png" alt="shaders_hot_reloading" width="80"> | ⭐⭐⭐☆ | 3.0 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 134 | [shaders_deferred_render](shaders/shaders_deferred_render.c) | <img src="shaders/shaders_deferred_render.png" alt="shaders_deferred_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
|
| [shaders_mesh_instancing](shaders/shaders_mesh_instancing.c) | <img src="shaders/shaders_mesh_instancing.png" alt="shaders_mesh_instancing" width="80"> | ⭐⭐⭐⭐️ | 3.7 | 4.2 | [seanpringle](https://github.com/seanpringle) |
|
||||||
| 135 | [shaders_hybrid_render](shaders/shaders_hybrid_render.c) | <img src="shaders/shaders_hybrid_render.png" alt="shaders_hybrid_render" width="80"> | ⭐️⭐️⭐️⭐️ | 4.2 | 4.2 | [Buğra Alptekin Sarı](https://github.com/BugraAlptekinSari) |
|
| [shaders_multi_sample2d](shaders/shaders_multi_sample2d.c) | <img src="shaders/shaders_multi_sample2d.png" alt="shaders_multi_sample2d" width="80"> | ⭐⭐☆☆ | 3.5 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 136 | [shaders_texture_tiling](shaders/shaders_texture_tiling.c) | <img src="shaders/shaders_texture_tiling.png" alt="shaders_texture_tiling" width="80"> | ⭐️⭐️☆☆ | 4.5 | 4.5 | [Luis Almeida](https://github.com/luis605) |
|
| [shaders_normalmap_rendering](shaders/shaders_normalmap_rendering.c) | <img src="shaders/shaders_normalmap_rendering.png" alt="shaders_normalmap_rendering" width="80"> | ⭐⭐⭐⭐️ | 5.6 | 5.6 | [Jeremy Montgomery](https://github.com/Sir_Irk) |
|
||||||
| 137 | [shaders_shadowmap](shaders/shaders_shadowmap.c) | <img src="shaders/shaders_shadowmap.png" alt="shaders_shadowmap" width="80"> | ⭐️⭐️⭐️⭐️ | 5.0 | 5.0 | [TheManTheMythTheGameDev](https://github.com/TheManTheMythTheGameDev) |
|
| [shaders_spotlight_rendering](shaders/shaders_spotlight_rendering.c) | <img src="shaders/shaders_spotlight_rendering.png" alt="shaders_spotlight_rendering" width="80"> | ⭐⭐☆☆ | 2.5 | 3.7 | [Chris Camacho](https://github.com/chriscamacho) |
|
||||||
| 138 | [shaders_vertex_displacement](shaders/shaders_vertex_displacement.c) | <img src="shaders/shaders_vertex_displacement.png" alt="shaders_vertex_displacement" width="80"> | ⭐️⭐️⭐️☆ | 5.0 | 4.5 | [Alex ZH](https://github.com/ZzzhHe) |
|
| [shaders_deferred_rendering](shaders/shaders_deferred_rendering.c) | <img src="shaders/shaders_deferred_rendering.png" alt="shaders_deferred_rendering" width="80"> | ⭐⭐⭐⭐️ | 4.5 | 4.5 | [Justin Andreas Lacoste](https://github.com/27justin) |
|
||||||
| 139 | [shaders_write_depth](shaders/shaders_write_depth.c) | <img src="shaders/shaders_write_depth.png" alt="shaders_write_depth" width="80"> | ⭐️⭐️☆☆ | 4.2 | 4.2 | [Buğra Alptekin Sarı](https://github.com/BugraAlptekinSari) |
|
| [shaders_hybrid_rendering](shaders/shaders_hybrid_rendering.c) | <img src="shaders/shaders_hybrid_rendering.png" alt="shaders_hybrid_rendering" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 4.2 | [Buğra Alptekin Sarı](https://github.com/BugraAlptekinSari) |
|
||||||
| 140 | [shaders_basic_pbr](shaders/shaders_basic_pbr.c) | <img src="shaders/shaders_basic_pbr.png" alt="shaders_basic_pbr" width="80"> | ⭐️⭐️⭐️⭐️ | 5.0 | 5.1-dev | [Afan OLOVCIC](https://github.com/_DevDad) |
|
| [shaders_texture_tiling](shaders/shaders_texture_tiling.c) | <img src="shaders/shaders_texture_tiling.png" alt="shaders_texture_tiling" width="80"> | ⭐⭐☆☆ | 4.5 | 4.5 | [Luis Almeida](https://github.com/luis605) |
|
||||||
| 141 | [shaders_lightmap](shaders/shaders_lightmap.c) | <img src="shaders/shaders_lightmap.png" alt="shaders_lightmap" width="80"> | ⭐️⭐️⭐️☆ | 4.5 | 4.5 | [Jussi Viitala](https://github.com/nullstare) |
|
| [shaders_shadowmap_rendering](shaders/shaders_shadowmap_rendering.c) | <img src="shaders/shaders_shadowmap_rendering.png" alt="shaders_shadowmap_rendering" width="80"> | ⭐⭐⭐⭐️ | 5.0 | 5.0 | [TheManTheMythTheGameDev](https://github.com/TheManTheMythTheGameDev) |
|
||||||
| 142 | [shaders_rounded_rectangle](shaders/shaders_rounded_rectangle.c) | <img src="shaders/shaders_rounded_rectangle.png" alt="shaders_rounded_rectangle" width=80> | ⭐️⭐️⭐️☆ | 5.5 | 5.5 | [Anstro Pleuton](https://github.com/anstropleuton) |
|
| [shaders_vertex_displacement](shaders/shaders_vertex_displacement.c) | <img src="shaders/shaders_vertex_displacement.png" alt="shaders_vertex_displacement" width="80"> | ⭐⭐⭐☆ | 5.0 | 4.5 | [Alex ZH](https://github.com/ZzzhHe) |
|
||||||
| 143 | [shaders_view_depth](shaders/shaders_view_depth.c) | <img src="shaders/shaders_view_depth.png" alt="shaders_view_depth" width="80"> | ⭐️⭐️⭐️☆ | 5.6-dev | 5.6-dev | [Luís Almeida](https://github.com/luis605) |
|
| [shaders_depth_writing](shaders/shaders_depth_writing.c) | <img src="shaders/shaders_depth_writing.png" alt="shaders_depth_writing" width="80"> | ⭐⭐☆☆ | 4.2 | 4.2 | [Buğra Alptekin Sarı](https://github.com/BugraAlptekinSari) |
|
||||||
|
| [shaders_basic_pbr](shaders/shaders_basic_pbr.c) | <img src="shaders/shaders_basic_pbr.png" alt="shaders_basic_pbr" width="80"> | ⭐⭐⭐⭐️ | 5.0 | 5.5 | [Afan OLOVCIC](https://github.com/_DevDad) |
|
||||||
|
| [shaders_lightmap_rendering](shaders/shaders_lightmap_rendering.c) | <img src="shaders/shaders_lightmap_rendering.png" alt="shaders_lightmap_rendering" width="80"> | ⭐⭐⭐☆ | 4.5 | 4.5 | [Jussi Viitala](https://github.com/nullstare) |
|
||||||
|
| [shaders_rounded_rectangle](shaders/shaders_rounded_rectangle.c) | <img src="shaders/shaders_rounded_rectangle.png" alt="shaders_rounded_rectangle" width="80"> | ⭐⭐⭐☆ | 5.5 | 5.5 | [Anstro Pleuton](https://github.com/anstropleuton) |
|
||||||
|
| [shaders_depth_rendering](shaders/shaders_depth_rendering.c) | <img src="shaders/shaders_depth_rendering.png" alt="shaders_depth_rendering" width="80"> | ⭐⭐⭐☆ | 5.6-dev | 5.6-dev | [Luís Almeida](https://github.com/luis605) |
|
||||||
|
| [shaders_game_of_life](shaders/shaders_game_of_life.c) | <img src="shaders/shaders_game_of_life.png" alt="shaders_game_of_life" width="80"> | ⭐⭐⭐☆ | 5.6 | 5.6 | [Jordi Santonja](https://github.com/JordSant) |
|
||||||
|
|
||||||
### category: audio
|
### category: audio [9]
|
||||||
|
|
||||||
Examples using raylib audio functionality, including sound/music loading and playing. This functionality is provided by raylib [raudio](../src/raudio.c) module. Note this module can be used standalone independently of raylib, check [raudio_standalone](others/raudio_standalone.c) example.
|
Examples using raylib audio functionality, including sound/music loading and playing. This functionality is provided by raylib [raudio](../src/raudio.c) module. Note this module can be used standalone independently of raylib.
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
| 144 | [audio_module_playing](audio/audio_module_playing.c) | <img src="audio/audio_module_playing.png" alt="audio_module_playing" width="80"> | ⭐️☆☆☆ | 1.5 | 3.5 | [Ray](https://github.com/raysan5) |
|
| [audio_module_playing](audio/audio_module_playing.c) | <img src="audio/audio_module_playing.png" alt="audio_module_playing" width="80"> | ⭐☆☆☆ | 1.5 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 145 | [audio_music_stream](audio/audio_music_stream.c) | <img src="audio/audio_music_stream.png" alt="audio_music_stream" width="80"> | ⭐️☆☆☆ | 1.3 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [audio_music_stream](audio/audio_music_stream.c) | <img src="audio/audio_music_stream.png" alt="audio_music_stream" width="80"> | ⭐☆☆☆ | 1.3 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 146 | [audio_raw_stream](audio/audio_raw_stream.c) | <img src="audio/audio_raw_stream.png" alt="audio_raw_stream" width="80"> | ⭐️⭐️⭐️☆ | 1.6 | 4.2 | [Ray](https://github.com/raysan5) |
|
| [audio_raw_stream](audio/audio_raw_stream.c) | <img src="audio/audio_raw_stream.png" alt="audio_raw_stream" width="80"> | ⭐⭐⭐☆ | 1.6 | 4.2 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 147 | [audio_sound_loading](audio/audio_sound_loading.c) | <img src="audio/audio_sound_loading.png" alt="audio_sound_loading" width="80"> | ⭐️☆☆☆ | 1.1 | 3.5 | [Ray](https://github.com/raysan5) |
|
| [audio_sound_loading](audio/audio_sound_loading.c) | <img src="audio/audio_sound_loading.png" alt="audio_sound_loading" width="80"> | ⭐☆☆☆ | 1.1 | 3.5 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 148 | [audio_mixed_processor](audio/audio_mixed_processor.c) | <img src="audio/audio_mixed_processor.png" alt="audio_mixed_processor" width="80"> | ⭐️⭐️⭐️⭐️ | 4.2 | 4.2 | [hkc](https://github.com/hatkidchan) |
|
| [audio_mixed_processor](audio/audio_mixed_processor.c) | <img src="audio/audio_mixed_processor.png" alt="audio_mixed_processor" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 4.2 | [hkc](https://github.com/hatkidchan) |
|
||||||
| 149 | [audio_stream_effects](audio/audio_stream_effects.c) | <img src="audio/audio_stream_effects.png" alt="audio_stream_effects" width="80"> | ⭐️⭐️⭐️⭐️ | 4.2 | 5.0 | [Ray](https://github.com/raysan5) |
|
| [audio_stream_effects](audio/audio_stream_effects.c) | <img src="audio/audio_stream_effects.png" alt="audio_stream_effects" width="80"> | ⭐⭐⭐⭐️ | 4.2 | 5.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 150 [audio_sound_multi](audio/audio_sound_multi.c) | <img src="audio/audio_sound_multi.png" alt="audio_sound_multi" width="80"> | ⭐️⭐️☆☆ | 4.6 | 4.6 | [Jeffery Myers](https://github.com/JeffM2501) |
|
| [audio_sound_multi](audio/audio_sound_multi.c) | <img src="audio/audio_sound_multi.png" alt="audio_sound_multi" width="80"> | ⭐⭐☆☆ | 5.0 | 5.0 | [Jeffery Myers](https://github.com/JeffM2501) |
|
||||||
| 151 | [audio_sound_positioning](audio/audio_sound_positioning.c) | <img src="audio/audio_sound_positioning.png" alt="audio_sound_positioning" width="80"> | ⭐️⭐️☆☆ | 5.5 | 5.5 | [Le Juez Victor](https://github.com/Bigfoot71) |
|
| [audio_sound_positioning](audio/audio_sound_positioning.c) | <img src="audio/audio_sound_positioning.png" alt="audio_sound_positioning" width="80"> | ⭐⭐☆☆ | 5.5 | 5.5 | [Le Juez Victor](https://github.com/Bigfoot71) |
|
||||||
|
| [audio_spectrum_visualizer](audio/audio_spectrum_visualizer.c) | <img src="audio/audio_spectrum_visualizer.png" alt="audio_spectrum_visualizer" width="80"> | ⭐⭐⭐☆ | 6.0 | 5.6-dev | [IANN](https://github.com/meisei4) |
|
||||||
|
|
||||||
### category: others
|
### category: others [6]
|
||||||
|
|
||||||
Ex150amples showing raylib misc functionality that does not fit in other categories, like standalone modules usage or examples integrating external libraries.
|
Examples showing raylib misc functionality that does not fit in other categories, like standalone modules usage or examples integrating external libraries.
|
||||||
|
|
||||||
| ## | example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
| example | image | difficulty<br>level | version<br>created | last version<br>updated | original<br>developer |
|
||||||
|----|----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
|-----------|--------|:-------------------:|:------------------:|:-----------------------:|:----------------------|
|
||||||
| 152 | [rlgl_standalone](others/rlgl_standalone.c) | <img src="others/rlgl_standalone.png" alt="rlgl_standalone" width="80"> | ⭐️⭐️⭐️⭐️ | 1.6 | 4.0 | [Ray](https://github.com/raysan5) |
|
| [rlgl_standalone](others/rlgl_standalone.c) | <img src="others/rlgl_standalone.png" alt="rlgl_standalone" width="80"> | ⭐⭐⭐⭐️ | 1.6 | 4.0 | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
| 153 | [rlgl_compute_shader](others/rlgl_compute_shader.c) | <img src="others/rlgl_compute_shader.png" alt="rlgl_compute_shader" width="80"> | ⭐️⭐️⭐️⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) |
|
| [rlgl_compute_shader](others/rlgl_compute_shader.c) | <img src="others/rlgl_compute_shader.png" alt="rlgl_compute_shader" width="80"> | ⭐⭐⭐⭐️ | 4.0 | 4.0 | [Teddy Astie](https://github.com/tsnake41) |
|
||||||
| 154 | [easings_testbed](others/easings_testbed.c) | <img src="others/easings_testbed.png" alt="easings_testbed" width="80"> | ⭐️⭐️⭐️☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) |
|
| [easings_testbed](others/easings_testbed.c) | <img src="others/easings_testbed.png" alt="easings_testbed" width="80"> | ⭐⭐⭐☆ | 2.5 | 3.0 | [Juan Miguel López](https://github.com/flashback-fx) |
|
||||||
| 155 | [raylib_opengl_interop](others/raylib_opengl_interop.c) | <img src="others/raylib_opengl_interop.png" alt="raylib_opengl_interop" width="80"> | ⭐️⭐️⭐️⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) |
|
| [raylib_opengl_interop](others/raylib_opengl_interop.c) | <img src="others/raylib_opengl_interop.png" alt="raylib_opengl_interop" width="80"> | ⭐⭐⭐⭐️ | 3.8 | 4.0 | [Stephan Soller](https://github.com/arkanis) |
|
||||||
| 156 | [embedded_files_loading](others/embedded_files_loading.c) | <img src="others/embedded_files_loading.png" alt="embedded_files_loading" width="80"> | ⭐️⭐️☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) |
|
| [embedded_files_loading](others/embedded_files_loading.c) | <img src="others/embedded_files_loading.png" alt="embedded_files_loading" width="80"> | ⭐⭐☆☆ | 3.0 | 3.5 | [Kristian Holmgren](https://github.com/defutura) |
|
||||||
| 157 | [raymath_vector_angle](others/raymath_vector_angle.c) | <img src="others/raymath_vector_angle.png" alt="raymath_vector_angle" width="80"> | ⭐️⭐️☆☆ | 1.0 | 4.6 | [Ray](https://github.com/raysan5) |
|
| [web_basic_window](others/web_basic_window.c) | <img src="others/web_basic_window.png" alt="web_basic_window" width="80"> | ⭐☆☆☆ | 5.6-dev | 5.6-dev | [Ramon Santamaria](https://github.com/raysan5) |
|
||||||
|
|
||||||
As always contributions are welcome, feel free to send new examples! Here is an [examples template](examples_template.c) to start with!
|
Some example missing? As always, contributions are welcome, feel free to send new examples!
|
||||||
|
Here is an [examples template](examples_template.c) with instructions to start with!
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Mixed audio processing
|
* raylib [audio] example - mixed processor
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★★] 4/4
|
* Example complexity rating: [★★★★] 4/4
|
||||||
*
|
*
|
||||||
@ -30,13 +30,13 @@ void ProcessAudio(void *buffer, unsigned int frames)
|
|||||||
|
|
||||||
for (unsigned int frame = 0; frame < frames; frame++)
|
for (unsigned int frame = 0; frame < frames; frame++)
|
||||||
{
|
{
|
||||||
float *left = &samples[frame * 2 + 0], *right = &samples[frame * 2 + 1];
|
float *left = &samples[frame*2 + 0], *right = &samples[frame*2 + 1];
|
||||||
|
|
||||||
*left = powf(fabsf(*left), exponent) * ( (*left < 0.0f)? -1.0f : 1.0f );
|
*left = powf(fabsf(*left), exponent)*( (*left < 0.0f)? -1.0f : 1.0f );
|
||||||
*right = powf(fabsf(*right), exponent) * ( (*right < 0.0f)? -1.0f : 1.0f );
|
*right = powf(fabsf(*right), exponent)*( (*right < 0.0f)? -1.0f : 1.0f );
|
||||||
|
|
||||||
average += fabsf(*left) / frames; // accumulating average volume
|
average += fabsf(*left)/frames; // accumulating average volume
|
||||||
average += fabsf(*right) / frames;
|
average += fabsf(*right)/frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Moving history to the left
|
// Moving history to the left
|
||||||
@ -55,7 +55,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - processing mixed output");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - mixed processor");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ int main(void)
|
|||||||
DrawRectangle(199, 199, 402, 34, LIGHTGRAY);
|
DrawRectangle(199, 199, 402, 34, LIGHTGRAY);
|
||||||
for (int i = 0; i < 400; i++)
|
for (int i = 0; i < 400; i++)
|
||||||
{
|
{
|
||||||
DrawLine(201 + i, 232 - (int)(averageVolume[i] * 32), 201 + i, 232, MAROON);
|
DrawLine(201 + i, 232 - (int)(averageVolume[i]*32), 201 + i, 232, MAROON);
|
||||||
}
|
}
|
||||||
DrawRectangleLines(199, 199, 402, 34, GRAY);
|
DrawRectangleLines(199, 199, 402, 34, GRAY);
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Module playing (streaming)
|
* raylib [audio] example - module playing
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -37,7 +37,7 @@ int main(void)
|
|||||||
|
|
||||||
SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X
|
SetConfigFlags(FLAG_MSAA_4X_HINT); // NOTE: Try to enable MSAA 4X
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing (streaming)");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - module playing");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Music playing (streaming)
|
* raylib [audio] example - music stream
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
* Example originally created with raylib 1.3, last time updated with raylib 4.0
|
* Example originally created with raylib 1.3, last time updated with raylib 4.2
|
||||||
*
|
*
|
||||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
* BSD-like license that allows static linking with closed source software
|
* BSD-like license that allows static linking with closed source software
|
||||||
@ -25,7 +25,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - music playing (streaming)");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - music stream");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
@ -36,6 +36,12 @@ int main(void)
|
|||||||
float timePlayed = 0.0f; // Time played normalized [0.0f..1.0f]
|
float timePlayed = 0.0f; // Time played normalized [0.0f..1.0f]
|
||||||
bool pause = false; // Music playing paused
|
bool pause = false; // Music playing paused
|
||||||
|
|
||||||
|
float pan = 0.0f; // Default audio pan center [-1.0f..1.0f]
|
||||||
|
SetMusicPan(music, pan);
|
||||||
|
|
||||||
|
float volume = 0.8f; // Default audio volume [0.0f..1.0f]
|
||||||
|
SetMusicVolume(music, volume);
|
||||||
|
|
||||||
SetTargetFPS(30); // Set our game to run at 30 frames-per-second
|
SetTargetFPS(30); // Set our game to run at 30 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -62,6 +68,34 @@ int main(void)
|
|||||||
else ResumeMusicStream(music);
|
else ResumeMusicStream(music);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set audio pan
|
||||||
|
if (IsKeyDown(KEY_LEFT))
|
||||||
|
{
|
||||||
|
pan -= 0.05f;
|
||||||
|
if (pan < -1.0f) pan = -1.0f;
|
||||||
|
SetMusicPan(music, pan);
|
||||||
|
}
|
||||||
|
else if (IsKeyDown(KEY_RIGHT))
|
||||||
|
{
|
||||||
|
pan += 0.05f;
|
||||||
|
if (pan > 1.0f) pan = 1.0f;
|
||||||
|
SetMusicPan(music, pan);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set audio volume
|
||||||
|
if (IsKeyDown(KEY_DOWN))
|
||||||
|
{
|
||||||
|
volume -= 0.05f;
|
||||||
|
if (volume < 0.0f) volume = 0.0f;
|
||||||
|
SetMusicVolume(music, volume);
|
||||||
|
}
|
||||||
|
else if (IsKeyDown(KEY_UP))
|
||||||
|
{
|
||||||
|
volume += 0.05f;
|
||||||
|
if (volume > 1.0f) volume = 1.0f;
|
||||||
|
SetMusicVolume(music, volume);
|
||||||
|
}
|
||||||
|
|
||||||
// Get normalized time played for current music stream
|
// Get normalized time played for current music stream
|
||||||
timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music);
|
timePlayed = GetMusicTimePlayed(music)/GetMusicTimeLength(music);
|
||||||
|
|
||||||
@ -76,6 +110,11 @@ int main(void)
|
|||||||
|
|
||||||
DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY);
|
DrawText("MUSIC SHOULD BE PLAYING!", 255, 150, 20, LIGHTGRAY);
|
||||||
|
|
||||||
|
DrawText("LEFT-RIGHT for PAN CONTROL", 320, 74, 10, DARKBLUE);
|
||||||
|
DrawRectangle(300, 100, 200, 12, LIGHTGRAY);
|
||||||
|
DrawRectangleLines(300, 100, 200, 12, GRAY);
|
||||||
|
DrawRectangle(300 + (pan + 1.0)/2.0f*200 - 5, 92, 10, 28, DARKGRAY);
|
||||||
|
|
||||||
DrawRectangle(200, 200, 400, 12, LIGHTGRAY);
|
DrawRectangle(200, 200, 400, 12, LIGHTGRAY);
|
||||||
DrawRectangle(200, 200, (int)(timePlayed*400.0f), 12, MAROON);
|
DrawRectangle(200, 200, (int)(timePlayed*400.0f), 12, MAROON);
|
||||||
DrawRectangleLines(200, 200, 400, 12, GRAY);
|
DrawRectangleLines(200, 200, 400, 12, GRAY);
|
||||||
@ -83,6 +122,11 @@ int main(void)
|
|||||||
DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, LIGHTGRAY);
|
DrawText("PRESS SPACE TO RESTART MUSIC", 215, 250, 20, LIGHTGRAY);
|
||||||
DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, LIGHTGRAY);
|
DrawText("PRESS P TO PAUSE/RESUME MUSIC", 208, 280, 20, LIGHTGRAY);
|
||||||
|
|
||||||
|
DrawText("UP-DOWN for VOLUME CONTROL", 320, 334, 10, DARKGREEN);
|
||||||
|
DrawRectangle(300, 360, 200, 12, LIGHTGRAY);
|
||||||
|
DrawRectangleLines(300, 360, 200, 12, GRAY);
|
||||||
|
DrawRectangle(300 + volume*200 - 5, 352, 10, 28, DARKGRAY);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Raw audio streaming
|
* raylib [audio] example - raw stream
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
*
|
*
|
||||||
@ -62,7 +62,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - raw audio streaming");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - raw stream");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
@ -108,8 +108,6 @@ int main(void)
|
|||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Sample mouse input.
|
|
||||||
mousePosition = GetMousePosition();
|
mousePosition = GetMousePosition();
|
||||||
|
|
||||||
if (IsMouseButtonDown(MOUSE_BUTTON_LEFT))
|
if (IsMouseButtonDown(MOUSE_BUTTON_LEFT))
|
||||||
@ -117,7 +115,7 @@ int main(void)
|
|||||||
float fp = (float)(mousePosition.y);
|
float fp = (float)(mousePosition.y);
|
||||||
frequency = 40.0f + (float)(fp);
|
frequency = 40.0f + (float)(fp);
|
||||||
|
|
||||||
float pan = (float)(mousePosition.x) / (float)screenWidth;
|
float pan = (float)(mousePosition.x)/(float)screenWidth;
|
||||||
SetAudioStreamPan(stream, pan);
|
SetAudioStreamPan(stream, pan);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +123,7 @@ int main(void)
|
|||||||
// Compute two cycles to allow the buffer padding, simplifying any modulation, resampling, etc.
|
// Compute two cycles to allow the buffer padding, simplifying any modulation, resampling, etc.
|
||||||
if (frequency != oldFrequency)
|
if (frequency != oldFrequency)
|
||||||
{
|
{
|
||||||
// Compute wavelength. Limit size in both directions.
|
// Compute wavelength. Limit size in both directions
|
||||||
//int oldWavelength = waveLength;
|
//int oldWavelength = waveLength;
|
||||||
waveLength = (int)(22050/frequency);
|
waveLength = (int)(22050/frequency);
|
||||||
if (waveLength > MAX_SAMPLES/2) waveLength = MAX_SAMPLES/2;
|
if (waveLength > MAX_SAMPLES/2) waveLength = MAX_SAMPLES/2;
|
||||||
@ -143,7 +141,7 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Scale read cursor's position to minimize transition artifacts
|
// Scale read cursor's position to minimize transition artifacts
|
||||||
//readCursor = (int)(readCursor * ((float)waveLength / (float)oldWavelength));
|
//readCursor = (int)(readCursor*((float)waveLength/(float)oldWavelength));
|
||||||
oldFrequency = frequency;
|
oldFrequency = frequency;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,7 +166,7 @@ int main(void)
|
|||||||
memcpy(writeBuf + writeCursor, data + readCursor, writeLength*sizeof(short));
|
memcpy(writeBuf + writeCursor, data + readCursor, writeLength*sizeof(short));
|
||||||
|
|
||||||
// Update cursors and loop audio
|
// Update cursors and loop audio
|
||||||
readCursor = (readCursor + writeLength) % waveLength;
|
readCursor = (readCursor + writeLength)%waveLength;
|
||||||
|
|
||||||
writeCursor += writeLength;
|
writeCursor += writeLength;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Sound loading and playing
|
* raylib [audio] example - sound loading
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -25,7 +25,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - sound loading and playing");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - sound loading");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Playing sound multiple times
|
* raylib [audio] example - sound multi
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
* Example originally created with raylib 4.6, last time updated with raylib 4.6
|
* Example originally created with raylib 5.0, last time updated with raylib 5.0
|
||||||
*
|
*
|
||||||
* Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5)
|
* Example contributed by Jeffery Myers (@JeffM2501) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
*
|
*
|
||||||
@ -31,18 +31,18 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - playing sound multiple times");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - sound multi");
|
||||||
|
|
||||||
InitAudioDevice(); // Initialize audio device
|
InitAudioDevice(); // Initialize audio device
|
||||||
|
|
||||||
// load the sound list
|
// Load audio file into the first slot as the 'source' sound,
|
||||||
soundArray[0] = LoadSound("resources/sound.wav"); // Load WAV audio file into the first slot as the 'source' sound
|
// this sound owns the sample data
|
||||||
// this sound owns the sample data
|
soundArray[0] = LoadSound("resources/sound.wav");
|
||||||
for (int i = 1; i < MAX_SOUNDS; i++)
|
|
||||||
{
|
// Load an alias of the sound into slots 1-9. These do not own the sound data, but can be played
|
||||||
soundArray[i] = LoadSoundAlias(soundArray[0]); // Load an alias of the sound into slots 1-9. These do not own the sound data, but can be played
|
for (int i = 1; i < MAX_SOUNDS; i++) soundArray[i] = LoadSoundAlias(soundArray[0]);
|
||||||
}
|
|
||||||
currentSound = 0; // set the sound list to the start
|
currentSound = 0; // Set the sound list to the start
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
@ -54,14 +54,15 @@ int main(void)
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
if (IsKeyPressed(KEY_SPACE))
|
if (IsKeyPressed(KEY_SPACE))
|
||||||
{
|
{
|
||||||
PlaySound(soundArray[currentSound]); // play the next open sound slot
|
PlaySound(soundArray[currentSound]); // Play the next open sound slot
|
||||||
currentSound++; // increment the sound slot
|
currentSound++; // Increment the sound slot
|
||||||
if (currentSound >= MAX_SOUNDS) // if the sound slot is out of bounds, go back to 0
|
|
||||||
currentSound = 0;
|
|
||||||
|
|
||||||
// Note: a better way would be to look at the list for the first sound that is not playing and use that slot
|
// If the sound slot is out of bounds, go back to 0
|
||||||
|
if (currentSound >= MAX_SOUNDS) currentSound = 0;
|
||||||
|
|
||||||
|
// NOTE: Another approach would be to look at the list for the first sound
|
||||||
|
// that is not playing and use that slot
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
@ -78,9 +79,8 @@ int main(void)
|
|||||||
|
|
||||||
// De-Initialization
|
// De-Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
for (int i = 1; i < MAX_SOUNDS; i++)
|
for (int i = 1; i < MAX_SOUNDS; i++) UnloadSoundAlias(soundArray[i]); // Unload sound aliases
|
||||||
UnloadSoundAlias(soundArray[i]); // Unload sound aliases
|
UnloadSound(soundArray[0]); // Unload source sound data
|
||||||
UnloadSound(soundArray[0]); // Unload source sound data
|
|
||||||
|
|
||||||
CloseAudioDevice(); // Close audio device
|
CloseAudioDevice(); // Close audio device
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Playing spatialized 3D sound
|
* raylib [audio] example - sound positioning
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
@ -19,7 +19,9 @@
|
|||||||
|
|
||||||
#include "raymath.h"
|
#include "raymath.h"
|
||||||
|
|
||||||
// Sound positioning function
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist);
|
static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
@ -32,7 +34,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [audio] example - Playing spatialized 3D sound");
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - sound positioning");
|
||||||
|
|
||||||
InitAudioDevice();
|
InitAudioDevice();
|
||||||
|
|
||||||
@ -58,7 +60,7 @@ int main(void)
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
UpdateCamera(&camera, CAMERA_FREE);
|
UpdateCamera(&camera, CAMERA_FREE);
|
||||||
|
|
||||||
float th = GetTime();
|
float th = (float)GetTime();
|
||||||
|
|
||||||
Vector3 spherePos = {
|
Vector3 spherePos = {
|
||||||
.x = 5.0f*cosf(th),
|
.x = 5.0f*cosf(th),
|
||||||
@ -67,6 +69,7 @@ int main(void)
|
|||||||
};
|
};
|
||||||
|
|
||||||
SetSoundPosition(camera, sound, spherePos, 20.0f);
|
SetSoundPosition(camera, sound, spherePos, 20.0f);
|
||||||
|
|
||||||
if (!IsSoundPlaying(sound)) PlaySound(sound);
|
if (!IsSoundPlaying(sound)) PlaySound(sound);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -92,9 +95,14 @@ int main(void)
|
|||||||
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sound positioning function
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Set sound 3d position
|
||||||
static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist)
|
static void SetSoundPosition(Camera listener, Sound sound, Vector3 position, float maxDist)
|
||||||
{
|
{
|
||||||
// Calculate direction vector and distance between listener and sound source
|
// Calculate direction vector and distance between listener and sound source
|
||||||
|
|||||||
285
examples/audio/audio_spectrum_visualizer.c
Normal file
@ -0,0 +1,285 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [audio] example - spectrum visualizer
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 6.0, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Inspired by Inigo Quilez's https://www.shadertoy.com/
|
||||||
|
* Resources/specification: https://gist.github.com/soulthreads/2efe50da4be1fb5f7ab60ff14ca434b8
|
||||||
|
*
|
||||||
|
* Example created by created by IANN (@meisei4) reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 IANN (@meisei4)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include "raymath.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#if defined(PLATFORM_DESKTOP)
|
||||||
|
#define GLSL_VERSION 330
|
||||||
|
#else // PLATFORM_ANDROID, PLATFORM_WEB
|
||||||
|
#define GLSL_VERSION 100
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MONO 1
|
||||||
|
#define SAMPLE_RATE 44100
|
||||||
|
#define SAMPLE_RATE_F 44100.0f
|
||||||
|
#define FFT_WINDOW_SIZE 1024
|
||||||
|
#define BUFFER_SIZE 512
|
||||||
|
#define PER_SAMPLE_BIT_DEPTH 16
|
||||||
|
#define AUDIO_STREAM_RING_BUFFER_SIZE (FFT_WINDOW_SIZE*2)
|
||||||
|
#define EFFECTIVE_SAMPLE_RATE (SAMPLE_RATE_F*0.5f)
|
||||||
|
#define WINDOW_TIME ((double)FFT_WINDOW_SIZE/(double)EFFECTIVE_SAMPLE_RATE)
|
||||||
|
#define FFT_HISTORICAL_SMOOTHING_DUR 2.0f
|
||||||
|
#define MIN_DECIBELS (-100.0f) // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/minDecibels
|
||||||
|
#define MAX_DECIBELS (-30.0f) // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/maxDecibels
|
||||||
|
#define INVERSE_DECIBEL_RANGE (1.0f/(MAX_DECIBELS - MIN_DECIBELS))
|
||||||
|
#define DB_TO_LINEAR_SCALE (20.0f/2.302585092994046f)
|
||||||
|
#define SMOOTHING_TIME_CONSTANT 0.8f // https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/smoothingTimeConstant
|
||||||
|
#define TEXTURE_HEIGHT 1
|
||||||
|
#define FFT_ROW 0
|
||||||
|
#define UNUSED_CHANNEL 0.0f
|
||||||
|
|
||||||
|
typedef struct FFTComplex { float real, imaginary; } FFTComplex;
|
||||||
|
|
||||||
|
typedef struct FFTData {
|
||||||
|
FFTComplex *spectrum;
|
||||||
|
FFTComplex *workBuffer;
|
||||||
|
float *prevMagnitudes;
|
||||||
|
float (*fftHistory)[BUFFER_SIZE];
|
||||||
|
int fftHistoryLen;
|
||||||
|
int historyPos;
|
||||||
|
double lastFftTime;
|
||||||
|
float tapbackPos;
|
||||||
|
} FFTData;
|
||||||
|
|
||||||
|
static void CaptureFrame(FFTData *fftData, const float *audioSamples);
|
||||||
|
static void RenderFrame(const FFTData *fftData, Image *fftImage);
|
||||||
|
static void CooleyTukeyFFTSlow(FFTComplex *spectrum, int n);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//----------------------------------------------------------------------------------- ---
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [audio] example - spectrum visualizer");
|
||||||
|
|
||||||
|
Image fftImage = GenImageColor(BUFFER_SIZE, TEXTURE_HEIGHT, WHITE);
|
||||||
|
Texture2D fftTexture = LoadTextureFromImage(fftImage);
|
||||||
|
RenderTexture2D bufferA = LoadRenderTexture(screenWidth, screenHeight);
|
||||||
|
Vector2 iResolution = { (float)screenWidth, (float)screenHeight };
|
||||||
|
|
||||||
|
Shader shader = LoadShader(0, TextFormat("resources/shaders/glsl%i/fft.fs", GLSL_VERSION));
|
||||||
|
|
||||||
|
int iResolutionLocation = GetShaderLocation(shader, "iResolution");
|
||||||
|
int iChannel0Location = GetShaderLocation(shader, "iChannel0");
|
||||||
|
SetShaderValue(shader, iResolutionLocation, &iResolution, SHADER_UNIFORM_VEC2);
|
||||||
|
SetShaderValueTexture(shader, iChannel0Location, fftTexture);
|
||||||
|
|
||||||
|
InitAudioDevice();
|
||||||
|
SetAudioStreamBufferSizeDefault(AUDIO_STREAM_RING_BUFFER_SIZE);
|
||||||
|
|
||||||
|
// WARNING: Memory out-of-bounds on PLATFORM_WEB
|
||||||
|
Wave wav = LoadWave("resources/country.mp3");
|
||||||
|
WaveFormat(&wav, SAMPLE_RATE, PER_SAMPLE_BIT_DEPTH, MONO);
|
||||||
|
|
||||||
|
AudioStream audioStream = LoadAudioStream(SAMPLE_RATE, PER_SAMPLE_BIT_DEPTH, MONO);
|
||||||
|
PlayAudioStream(audioStream);
|
||||||
|
|
||||||
|
int fftHistoryLen = (int)ceilf(FFT_HISTORICAL_SMOOTHING_DUR/WINDOW_TIME) + 1;
|
||||||
|
|
||||||
|
FFTData fft = {
|
||||||
|
.spectrum = RL_CALLOC(sizeof(FFTComplex), FFT_WINDOW_SIZE),
|
||||||
|
.workBuffer = RL_CALLOC(sizeof(FFTComplex), FFT_WINDOW_SIZE),
|
||||||
|
.prevMagnitudes = RL_CALLOC(BUFFER_SIZE, sizeof(float)),
|
||||||
|
.fftHistory = RL_CALLOC(fftHistoryLen, sizeof(float[BUFFER_SIZE])),
|
||||||
|
.fftHistoryLen = fftHistoryLen,
|
||||||
|
.historyPos = 0,
|
||||||
|
.lastFftTime = 0.0,
|
||||||
|
.tapbackPos = 0.01f
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t wavCursor = 0;
|
||||||
|
const short *wavPCM16 = wav.data;
|
||||||
|
|
||||||
|
short chunkSamples[AUDIO_STREAM_RING_BUFFER_SIZE] = { 0 };
|
||||||
|
float audioSamples[FFT_WINDOW_SIZE] = { 0 };
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
while (IsAudioStreamProcessed(audioStream))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < AUDIO_STREAM_RING_BUFFER_SIZE; i++)
|
||||||
|
{
|
||||||
|
int left = (wav.channels == 2)? wavPCM16[wavCursor*2 + 0] : wavPCM16[wavCursor];
|
||||||
|
int right = (wav.channels == 2)? wavPCM16[wavCursor*2 + 1] : left;
|
||||||
|
chunkSamples[i] = (short)((left + right)/2);
|
||||||
|
|
||||||
|
if (++wavCursor >= wav.frameCount) wavCursor = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateAudioStream(audioStream, chunkSamples, AUDIO_STREAM_RING_BUFFER_SIZE);
|
||||||
|
|
||||||
|
for (int i = 0; i < FFT_WINDOW_SIZE; i++) audioSamples[i] = (chunkSamples[i*2] + chunkSamples[i*2 + 1])*0.5f/32767.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CaptureFrame(&fft, audioSamples);
|
||||||
|
RenderFrame(&fft, &fftImage);
|
||||||
|
UpdateTexture(fftTexture, fftImage.data);
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
BeginShaderMode(shader);
|
||||||
|
SetShaderValueTexture(shader, iChannel0Location, fftTexture);
|
||||||
|
DrawTextureRec(bufferA.texture,
|
||||||
|
(Rectangle){ 0, 0, (float)screenWidth, (float)-screenHeight },
|
||||||
|
(Vector2){ 0, 0 }, WHITE);
|
||||||
|
EndShaderMode();
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
UnloadShader(shader);
|
||||||
|
UnloadRenderTexture(bufferA);
|
||||||
|
UnloadTexture(fftTexture);
|
||||||
|
UnloadImage(fftImage);
|
||||||
|
UnloadAudioStream(audioStream);
|
||||||
|
UnloadWave(wav);
|
||||||
|
CloseAudioDevice();
|
||||||
|
|
||||||
|
RL_FREE(fft.spectrum);
|
||||||
|
RL_FREE(fft.workBuffer);
|
||||||
|
RL_FREE(fft.prevMagnitudes);
|
||||||
|
RL_FREE(fft.fftHistory);
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cooley–Tukey FFT https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm#Data_reordering,_bit_reversal,_and_in-place_algorithms
|
||||||
|
static void CooleyTukeyFFTSlow(FFTComplex *spectrum, int n)
|
||||||
|
{
|
||||||
|
int j = 0;
|
||||||
|
for (int i = 1; i < n - 1; i++)
|
||||||
|
{
|
||||||
|
int bit = n >> 1;
|
||||||
|
while (j >= bit)
|
||||||
|
{
|
||||||
|
j -= bit;
|
||||||
|
bit >>= 1;
|
||||||
|
}
|
||||||
|
j += bit;
|
||||||
|
if (i < j)
|
||||||
|
{
|
||||||
|
FFTComplex temp = spectrum[i];
|
||||||
|
spectrum[i] = spectrum[j];
|
||||||
|
spectrum[j] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int len = 2; len <= n; len <<= 1)
|
||||||
|
{
|
||||||
|
float angle = -2.0f*PI/len;
|
||||||
|
FFTComplex twiddleUnit = { cosf(angle), sinf(angle) };
|
||||||
|
for (int i = 0; i < n; i += len)
|
||||||
|
{
|
||||||
|
FFTComplex twiddleCurrent = { 1.0f, 0.0f };
|
||||||
|
for (int j = 0; j < len/2; j++)
|
||||||
|
{
|
||||||
|
FFTComplex even = spectrum[i + j];
|
||||||
|
FFTComplex odd = spectrum[i + j + len/2];
|
||||||
|
FFTComplex twiddledOdd = {
|
||||||
|
odd.real*twiddleCurrent.real - odd.imaginary*twiddleCurrent.imaginary,
|
||||||
|
odd.real*twiddleCurrent.imaginary + odd.imaginary*twiddleCurrent.real
|
||||||
|
};
|
||||||
|
|
||||||
|
spectrum[i + j].real = even.real + twiddledOdd.real;
|
||||||
|
spectrum[i + j].imaginary = even.imaginary + twiddledOdd.imaginary;
|
||||||
|
spectrum[i + j + len/2].real = even.real - twiddledOdd.real;
|
||||||
|
spectrum[i + j + len/2].imaginary = even.imaginary - twiddledOdd.imaginary;
|
||||||
|
|
||||||
|
float twiddleRealNext = twiddleCurrent.real*twiddleUnit.real - twiddleCurrent.imaginary*twiddleUnit.imaginary;
|
||||||
|
twiddleCurrent.imaginary = twiddleCurrent.real*twiddleUnit.imaginary + twiddleCurrent.imaginary*twiddleUnit.real;
|
||||||
|
twiddleCurrent.real = twiddleRealNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CaptureFrame(FFTData *fftData, const float *audioSamples)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < FFT_WINDOW_SIZE; i++)
|
||||||
|
{
|
||||||
|
float x = (2.0f*PI*i)/(FFT_WINDOW_SIZE - 1.0f);
|
||||||
|
float blackmanWeight = 0.42f - 0.5f*cosf(x) + 0.08f*cosf(2.0f*x); // https://en.wikipedia.org/wiki/Window_function#Blackman_window
|
||||||
|
fftData->workBuffer[i].real = audioSamples[i]*blackmanWeight;
|
||||||
|
fftData->workBuffer[i].imaginary = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
CooleyTukeyFFTSlow(fftData->workBuffer, FFT_WINDOW_SIZE);
|
||||||
|
memcpy(fftData->spectrum, fftData->workBuffer, sizeof(FFTComplex)*FFT_WINDOW_SIZE);
|
||||||
|
|
||||||
|
float smoothedSpectrum[BUFFER_SIZE];
|
||||||
|
|
||||||
|
for (int bin = 0; bin < BUFFER_SIZE; bin++)
|
||||||
|
{
|
||||||
|
float re = fftData->workBuffer[bin].real;
|
||||||
|
float im = fftData->workBuffer[bin].imaginary;
|
||||||
|
float linearMagnitude = sqrtf(re*re + im*im)/FFT_WINDOW_SIZE;
|
||||||
|
|
||||||
|
float smoothedMagnitude = SMOOTHING_TIME_CONSTANT*fftData->prevMagnitudes[bin] + (1.0f - SMOOTHING_TIME_CONSTANT)*linearMagnitude;
|
||||||
|
fftData->prevMagnitudes[bin] = smoothedMagnitude;
|
||||||
|
|
||||||
|
float db = logf(fmaxf(smoothedMagnitude, 1e-40f))*DB_TO_LINEAR_SCALE;
|
||||||
|
float normalized = (db - MIN_DECIBELS)*INVERSE_DECIBEL_RANGE;
|
||||||
|
smoothedSpectrum[bin] = Clamp(normalized, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
fftData->lastFftTime = GetTime();
|
||||||
|
memcpy(fftData->fftHistory[fftData->historyPos], smoothedSpectrum, sizeof(smoothedSpectrum));
|
||||||
|
fftData->historyPos = (fftData->historyPos + 1)%fftData->fftHistoryLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RenderFrame(const FFTData *fftData, Image *fftImage)
|
||||||
|
{
|
||||||
|
double framesSinceTapback = floor(fftData->tapbackPos/WINDOW_TIME);
|
||||||
|
framesSinceTapback = Clamp(framesSinceTapback, 0.0, fftData->fftHistoryLen - 1);
|
||||||
|
|
||||||
|
int historyPosition = (fftData->historyPos - 1 - (int)framesSinceTapback)%fftData->fftHistoryLen;
|
||||||
|
if (historyPosition < 0) historyPosition += fftData->fftHistoryLen;
|
||||||
|
|
||||||
|
const float *amplitude = fftData->fftHistory[historyPosition];
|
||||||
|
for (int bin = 0; bin < BUFFER_SIZE; bin++) ImageDrawPixel(fftImage, bin, FFT_ROW, ColorFromNormalized((Vector4){ amplitude[bin], UNUSED_CHANNEL, UNUSED_CHANNEL, UNUSED_CHANNEL }));
|
||||||
|
}
|
||||||
BIN
examples/audio/audio_spectrum_visualizer.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [audio] example - Music stream processing effects
|
* raylib [audio] example - stream effects
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★★] 4/4
|
* Example complexity rating: [★★★★] 4/4
|
||||||
*
|
*
|
||||||
@ -17,7 +17,9 @@
|
|||||||
|
|
||||||
#include <stdlib.h> // Required for: NULL
|
#include <stdlib.h> // Required for: NULL
|
||||||
|
|
||||||
// Required delay effect variables
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
static float *delayBuffer = NULL;
|
static float *delayBuffer = NULL;
|
||||||
static unsigned int delayBufferSize = 0;
|
static unsigned int delayBufferSize = 0;
|
||||||
static unsigned int delayReadIndex = 2;
|
static unsigned int delayReadIndex = 2;
|
||||||
@ -148,8 +150,8 @@ int main(void)
|
|||||||
static void AudioProcessEffectLPF(void *buffer, unsigned int frames)
|
static void AudioProcessEffectLPF(void *buffer, unsigned int frames)
|
||||||
{
|
{
|
||||||
static float low[2] = { 0.0f, 0.0f };
|
static float low[2] = { 0.0f, 0.0f };
|
||||||
static const float cutoff = 70.0f / 44100.0f; // 70 Hz lowpass filter
|
static const float cutoff = 70.0f/44100.0f; // 70 Hz lowpass filter
|
||||||
const float k = cutoff / (cutoff + 0.1591549431f); // RC filter formula
|
const float k = cutoff/(cutoff + 0.1591549431f); // RC filter formula
|
||||||
|
|
||||||
// Converts the buffer data before using it
|
// Converts the buffer data before using it
|
||||||
float *bufferData = (float *)buffer;
|
float *bufferData = (float *)buffer;
|
||||||
@ -158,8 +160,8 @@ static void AudioProcessEffectLPF(void *buffer, unsigned int frames)
|
|||||||
const float l = bufferData[i];
|
const float l = bufferData[i];
|
||||||
const float r = bufferData[i + 1];
|
const float r = bufferData[i + 1];
|
||||||
|
|
||||||
low[0] += k * (l - low[0]);
|
low[0] += k*(l - low[0]);
|
||||||
low[1] += k * (r - low[1]);
|
low[1] += k*(r - low[1]);
|
||||||
bufferData[i] = low[0];
|
bufferData[i] = low[0];
|
||||||
bufferData[i + 1] = low[1];
|
bufferData[i + 1] = low[1];
|
||||||
}
|
}
|
||||||
|
|||||||
37
examples/audio/resources/shaders/glsl100/fft.fs
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#version 100
|
||||||
|
|
||||||
|
precision mediump float;
|
||||||
|
|
||||||
|
// Input vertex attributes (from vertex shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec4 fragColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform vec2 iResolution;
|
||||||
|
uniform sampler2D iChannel0;
|
||||||
|
|
||||||
|
const vec4 BLACK = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
const vec4 WHITE = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
const float FFT_ROW = 0.0;
|
||||||
|
const float NUM_OF_BINS = 512.0;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 fragCoord = fragTexCoord*iResolution;
|
||||||
|
float cellWidth = iResolution.x/NUM_OF_BINS;
|
||||||
|
float binIndex = floor(fragCoord.x/cellWidth);
|
||||||
|
float localX = mod(fragCoord.x, cellWidth);
|
||||||
|
float barWidth = cellWidth - 1.0;
|
||||||
|
vec4 color = WHITE;
|
||||||
|
|
||||||
|
if (localX <= barWidth)
|
||||||
|
{
|
||||||
|
float sampleX = (binIndex + 0.5)/NUM_OF_BINS;
|
||||||
|
vec2 sampleCoord = vec2(sampleX, FFT_ROW);
|
||||||
|
float amplitude = texture2D(iChannel0, sampleCoord).r; // Only filled the red channel, all channels left open for alternative use
|
||||||
|
|
||||||
|
if (fragTexCoord.y < amplitude) color = BLACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_FragColor = color;
|
||||||
|
}
|
||||||
35
examples/audio/resources/shaders/glsl120/fft.fs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#version 120
|
||||||
|
|
||||||
|
// Input vertex attributes (from vertex shader)
|
||||||
|
varying vec2 fragTexCoord;
|
||||||
|
varying vec4 fragColor;
|
||||||
|
|
||||||
|
// Input uniform values
|
||||||
|
uniform vec2 iResolution;
|
||||||
|
uniform sampler2D iChannel0;
|
||||||
|
|
||||||
|
const vec4 BLACK = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
const vec4 WHITE = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
const float FFT_ROW = 0.0;
|
||||||
|
const float NUM_OF_BINS = 512.0;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 fragCoord = fragTexCoord*iResolution;
|
||||||
|
float cellWidth = iResolution.x/NUM_OF_BINS;
|
||||||
|
float binIndex = floor(fragCoord.x/cellWidth);
|
||||||
|
float localX = mod(fragCoord.x, cellWidth);
|
||||||
|
float barWidth = cellWidth - 1.0;
|
||||||
|
vec4 color = WHITE;
|
||||||
|
|
||||||
|
if (localX <= barWidth)
|
||||||
|
{
|
||||||
|
float sampleX = (binIndex + 0.5)/NUM_OF_BINS;
|
||||||
|
vec2 sampleCoord = vec2(sampleX, FFT_ROW);
|
||||||
|
float amplitude = texture2D(iChannel0, sampleCoord).r; // Only filled the red channel, all channels left open for alternative use
|
||||||
|
|
||||||
|
if (fragTexCoord.y < amplitude) color = BLACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_FragColor = color;
|
||||||
|
}
|
||||||
35
examples/audio/resources/shaders/glsl330/fft.fs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#version 330
|
||||||
|
|
||||||
|
in vec2 fragTexCoord;
|
||||||
|
in vec4 fragColor;
|
||||||
|
|
||||||
|
out vec4 finalColor;
|
||||||
|
|
||||||
|
uniform vec2 iResolution;
|
||||||
|
uniform sampler2D iChannel0;
|
||||||
|
|
||||||
|
const vec4 BLACK = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
const vec4 WHITE = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
const float FFT_ROW = 0.0;
|
||||||
|
const float NUM_OF_BINS = 512.0;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 fragCoord = fragTexCoord*iResolution;
|
||||||
|
float cellWidth = iResolution.x/NUM_OF_BINS;
|
||||||
|
float binIndex = floor(fragCoord.x/cellWidth);
|
||||||
|
float localX = mod(fragCoord.x, cellWidth);
|
||||||
|
float barWidth = cellWidth - 1.0;
|
||||||
|
vec4 color = WHITE;
|
||||||
|
|
||||||
|
if (localX <= barWidth)
|
||||||
|
{
|
||||||
|
float sampleX = (binIndex + 0.5)/NUM_OF_BINS;
|
||||||
|
vec2 sampleCoord = vec2(sampleX, FFT_ROW);
|
||||||
|
float amplitude = texture(iChannel0, sampleCoord).r; // Only filled the red channel, all channels left open for alternative use
|
||||||
|
|
||||||
|
if (fragTexCoord.y < amplitude) color = BLACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
finalColor = color;
|
||||||
|
}
|
||||||
44
examples/build_example_web.bat
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
::@echo off
|
||||||
|
:: .
|
||||||
|
:: Compile your examples for web using: build_example_web.bat <example_category>/<example_name>
|
||||||
|
:: .
|
||||||
|
SET "INPUT_FILE=%1"
|
||||||
|
:: Change delimiter for the FOR loop
|
||||||
|
FOR /f "tokens=1-10 delims=/" %%a IN ("%INPUT_FILE%") DO (
|
||||||
|
SET CATEGORY=%%a
|
||||||
|
SET FILENAME=%%b
|
||||||
|
)
|
||||||
|
:: > SETup required Environment
|
||||||
|
:: -------------------------------------
|
||||||
|
SET RAYLIB_PATH=C:\GitHub\raylib
|
||||||
|
SET EMSDK_PATH=C:\raylib\emsdk
|
||||||
|
SET COMPILER_PATH=C:\raylib\w64devkit\bin
|
||||||
|
ENV_SET PATH=%COMPILER_PATH%
|
||||||
|
SET MAKE=mingw32-make
|
||||||
|
echo
|
||||||
|
:: Set required web compilation options
|
||||||
|
:: -------------------------------------
|
||||||
|
::SET CC=%EMSDK_PATH%\upstream\emscripten\emcc
|
||||||
|
::SET CFLAGS=-Wall -std=c99 -D_DEFAULT_SOURCE -Wno-missing-braces -Wunused-result -O3 -I. -Iexternal -I%RAYLIB_PATH%\src -I%RAYLIB_PATH%\external -DPLATFORM_WEB
|
||||||
|
::SET LDFLAGS=-L. -L$(RAYLIB_PATH)\src -sUSE_GLFW=3 -sEXPORTED_RUNTIME_METHODS=ccall -sASYNCIFY --shell-file %RAYLIB_PATH%\src\shell.html
|
||||||
|
::SET LDLIBS=%RAYLIB_PATH%\src\libraylib.web.a
|
||||||
|
echo
|
||||||
|
:: Clean latest build
|
||||||
|
:: ------------------------
|
||||||
|
cmd /c if exist %FILENAME%.html del /F %FILENAME%.html
|
||||||
|
cmd /c if exist %FILENAME%.wasm del /F %FILENAME%.wasm
|
||||||
|
cmd /c if exist %FILENAME%.js del /F %FILENAME%.js
|
||||||
|
cmd /c if exist %FILENAME%.data del /F %FILENAME%.data
|
||||||
|
echo
|
||||||
|
:: Setup emsdk environment
|
||||||
|
:: --------------------------
|
||||||
|
call %EMSDK_PATH%\emsdk_env.bat
|
||||||
|
echo on
|
||||||
|
:: Compile program
|
||||||
|
:: -----------------------
|
||||||
|
C:
|
||||||
|
cd %RAYLIB_PATH%\examples
|
||||||
|
%MAKE% -f Makefile.Web %CATEGORY%/%FILENAME% PLATFORM=PLATFORM_WEB -B
|
||||||
|
::%CC% -o %FILENAME%.html %FILENAME%.c %CFLAGS% %LDFLAGS% %LDLIBS% %RESOURCES%
|
||||||
|
cd ..
|
||||||
|
echo
|
||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - 2D Camera system
|
* raylib [core] example - 2d camera
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
@ -125,8 +125,8 @@ int main(void)
|
|||||||
DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f));
|
DrawRectangle( 10, 10, 250, 113, Fade(SKYBLUE, 0.5f));
|
||||||
DrawRectangleLines( 10, 10, 250, 113, BLUE);
|
DrawRectangleLines( 10, 10, 250, 113, BLUE);
|
||||||
|
|
||||||
DrawText("Free 2d camera controls:", 20, 20, 10, BLACK);
|
DrawText("Free 2D camera controls:", 20, 20, 10, BLACK);
|
||||||
DrawText("- Right/Left to move Offset", 40, 40, 10, DARKGRAY);
|
DrawText("- Right/Left to move player", 40, 40, 10, DARKGRAY);
|
||||||
DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY);
|
DrawText("- Mouse Wheel to Zoom in-out", 40, 60, 10, DARKGRAY);
|
||||||
DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY);
|
DrawText("- A / S to Rotate", 40, 80, 10, DARKGRAY);
|
||||||
DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY);
|
DrawText("- R to reset Zoom and Rotation", 40, 100, 10, DARKGRAY);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 8.3 KiB |
@ -23,7 +23,7 @@
|
|||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
int main ()
|
int main(void)
|
||||||
{
|
{
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
@ -35,9 +35,9 @@ int main ()
|
|||||||
Camera2D camera = { 0 };
|
Camera2D camera = { 0 };
|
||||||
camera.zoom = 1.0f;
|
camera.zoom = 1.0f;
|
||||||
|
|
||||||
int zoomMode = 0; // 0-Mouse Wheel, 1-Mouse Move
|
int zoomMode = 0; // 0-Mouse Wheel, 1-Mouse Move
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
@ -93,6 +93,7 @@ int main ()
|
|||||||
// under the cursor to the screen space point under the cursor at any zoom
|
// under the cursor to the screen space point under the cursor at any zoom
|
||||||
camera.target = mouseWorldPos;
|
camera.target = mouseWorldPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
||||||
{
|
{
|
||||||
// Zoom increment
|
// Zoom increment
|
||||||
@ -110,7 +111,6 @@ int main ()
|
|||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
BeginMode2D(camera);
|
BeginMode2D(camera);
|
||||||
|
|
||||||
// Draw the 3d grid, rotated 90 degrees and centered around 0,0
|
// Draw the 3d grid, rotated 90 degrees and centered around 0,0
|
||||||
// just so we have something in the XY plane
|
// just so we have something in the XY plane
|
||||||
rlPushMatrix();
|
rlPushMatrix();
|
||||||
@ -121,7 +121,6 @@ int main ()
|
|||||||
|
|
||||||
// Draw a reference circle
|
// Draw a reference circle
|
||||||
DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 50, MAROON);
|
DrawCircle(GetScreenWidth()/2, GetScreenHeight()/2, 50, MAROON);
|
||||||
|
|
||||||
EndMode2D();
|
EndMode2D();
|
||||||
|
|
||||||
// Draw mouse reference
|
// Draw mouse reference
|
||||||
@ -142,5 +141,6 @@ int main ()
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - 2D Camera platformer
|
* raylib [core] example - 2d camera platformer
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
*
|
*
|
||||||
@ -22,6 +22,9 @@
|
|||||||
#define PLAYER_JUMP_SPD 350.0f
|
#define PLAYER_JUMP_SPD 350.0f
|
||||||
#define PLAYER_HOR_SPD 200.0f
|
#define PLAYER_HOR_SPD 200.0f
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
typedef struct Player {
|
typedef struct Player {
|
||||||
Vector2 position;
|
Vector2 position;
|
||||||
float speed;
|
float speed;
|
||||||
@ -35,7 +38,7 @@ typedef struct EnvItem {
|
|||||||
} EnvItem;
|
} EnvItem;
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// Module functions declaration
|
// Module Functions Declaration
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta);
|
void UpdatePlayer(Player *player, EnvItem *envItems, int envItemsLength, float delta);
|
||||||
void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
|
void UpdateCameraCenter(Camera2D *camera, Player *player, EnvItem *envItems, int envItemsLength, float delta, int width, int height);
|
||||||
@ -54,7 +57,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - 2d camera platformer");
|
||||||
|
|
||||||
Player player = { 0 };
|
Player player = { 0 };
|
||||||
player.position = (Vector2){ 400, 280 };
|
player.position = (Vector2){ 400, 280 };
|
||||||
@ -294,7 +297,7 @@ void UpdateCameraPlayerBoundsPush(Camera2D *camera, Player *player, EnvItem *env
|
|||||||
|
|
||||||
Vector2 bboxWorldMin = GetScreenToWorld2D((Vector2){ (1 - bbox.x)*0.5f*width, (1 - bbox.y)*0.5f*height }, *camera);
|
Vector2 bboxWorldMin = GetScreenToWorld2D((Vector2){ (1 - bbox.x)*0.5f*width, (1 - bbox.y)*0.5f*height }, *camera);
|
||||||
Vector2 bboxWorldMax = GetScreenToWorld2D((Vector2){ (1 + bbox.x)*0.5f*width, (1 + bbox.y)*0.5f*height }, *camera);
|
Vector2 bboxWorldMax = GetScreenToWorld2D((Vector2){ (1 + bbox.x)*0.5f*width, (1 + bbox.y)*0.5f*height }, *camera);
|
||||||
camera->offset = (Vector2){ (1 - bbox.x)*0.5f * width, (1 - bbox.y)*0.5f*height };
|
camera->offset = (Vector2){ (1 - bbox.x)*0.5f*width, (1 - bbox.y)*0.5f*height };
|
||||||
|
|
||||||
if (player->position.x < bboxWorldMin.x) camera->target.x = player->position.x;
|
if (player->position.x < bboxWorldMin.x) camera->target.x = player->position.x;
|
||||||
if (player->position.y < bboxWorldMin.y) camera->target.y = player->position.y;
|
if (player->position.y < bboxWorldMin.y) camera->target.y = player->position.y;
|
||||||
|
|||||||
@ -100,8 +100,8 @@ int main(void)
|
|||||||
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
|
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f };
|
||||||
camera.projection = CAMERA_ORTHOGRAPHIC;
|
camera.projection = CAMERA_ORTHOGRAPHIC;
|
||||||
camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC
|
camera.fovy = 20.0f; // near plane width in CAMERA_ORTHOGRAPHIC
|
||||||
CameraYaw(&camera, -135 * DEG2RAD, true);
|
CameraYaw(&camera, -135*DEG2RAD, true);
|
||||||
CameraPitch(&camera, -45 * DEG2RAD, true, true, false);
|
CameraPitch(&camera, -45*DEG2RAD, true, true, false);
|
||||||
}
|
}
|
||||||
else if (camera.projection == CAMERA_ORTHOGRAPHIC)
|
else if (camera.projection == CAMERA_ORTHOGRAPHIC)
|
||||||
{
|
{
|
||||||
@ -119,7 +119,6 @@ int main(void)
|
|||||||
// Some default standard keyboard/mouse inputs are hardcoded to simplify use
|
// Some default standard keyboard/mouse inputs are hardcoded to simplify use
|
||||||
// For advanced camera controls, it's recommended to compute camera movement manually
|
// For advanced camera controls, it's recommended to compute camera movement manually
|
||||||
UpdateCamera(&camera, cameraMode); // Update camera
|
UpdateCamera(&camera, cameraMode); // Update camera
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// Camera PRO usage example (EXPERIMENTAL)
|
// Camera PRO usage example (EXPERIMENTAL)
|
||||||
// This new camera function allows custom movement/rotation values to be directly provided
|
// This new camera function allows custom movement/rotation values to be directly provided
|
||||||
|
|||||||
329
examples/core/core_3d_camera_fps.c
Normal file
@ -0,0 +1,329 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - 3d camera fps
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.5
|
||||||
|
*
|
||||||
|
* Example contributed by Agnis Aldiņš (@nezvers) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Agnis Aldiņš (@nezvers)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include "raymath.h"
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Defines and Macros
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Movement constants
|
||||||
|
#define GRAVITY 32.0f
|
||||||
|
#define MAX_SPEED 20.0f
|
||||||
|
#define CROUCH_SPEED 5.0f
|
||||||
|
#define JUMP_FORCE 12.0f
|
||||||
|
#define MAX_ACCEL 150.0f
|
||||||
|
// Grounded drag
|
||||||
|
#define FRICTION 0.86f
|
||||||
|
// Increasing air drag, increases strafing speed
|
||||||
|
#define AIR_DRAG 0.98f
|
||||||
|
// Responsiveness for turning movement direction to looked direction
|
||||||
|
#define CONTROL 15.0f
|
||||||
|
#define CROUCH_HEIGHT 0.0f
|
||||||
|
#define STAND_HEIGHT 1.0f
|
||||||
|
#define BOTTOM_HEIGHT 0.5f
|
||||||
|
|
||||||
|
#define NORMALIZE_INPUT 0
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Body structure
|
||||||
|
typedef struct {
|
||||||
|
Vector3 position;
|
||||||
|
Vector3 velocity;
|
||||||
|
Vector3 dir;
|
||||||
|
bool isGrounded;
|
||||||
|
} Body;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static Vector2 sensitivity = { 0.001f, 0.001f };
|
||||||
|
|
||||||
|
static Body player = { 0 };
|
||||||
|
static Vector2 lookRotation = { 0 };
|
||||||
|
static float headTimer = 0.0f;
|
||||||
|
static float walkLerp = 0.0f;
|
||||||
|
static float headLerp = STAND_HEIGHT;
|
||||||
|
static Vector2 lean = { 0 };
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static void DrawLevel(void);
|
||||||
|
static void UpdateCameraFPS(Camera *camera);
|
||||||
|
static void UpdateBody(Body *body, float rot, char side, char forward, bool jumpPressed, bool crouchHold);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - 3d camera fps");
|
||||||
|
|
||||||
|
// Initialize camera variables
|
||||||
|
// NOTE: UpdateCameraFPS() takes care of the rest
|
||||||
|
Camera camera = { 0 };
|
||||||
|
camera.fovy = 60.0f;
|
||||||
|
camera.projection = CAMERA_PERSPECTIVE;
|
||||||
|
camera.position = (Vector3){
|
||||||
|
player.position.x,
|
||||||
|
player.position.y + (BOTTOM_HEIGHT + headLerp),
|
||||||
|
player.position.z,
|
||||||
|
};
|
||||||
|
|
||||||
|
UpdateCameraFPS(&camera); // Update camera parameters
|
||||||
|
|
||||||
|
DisableCursor(); // Limit cursor to relative movement inside the window
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
Vector2 mouseDelta = GetMouseDelta();
|
||||||
|
lookRotation.x -= mouseDelta.x*sensitivity.x;
|
||||||
|
lookRotation.y += mouseDelta.y*sensitivity.y;
|
||||||
|
|
||||||
|
char sideway = (IsKeyDown(KEY_D) - IsKeyDown(KEY_A));
|
||||||
|
char forward = (IsKeyDown(KEY_W) - IsKeyDown(KEY_S));
|
||||||
|
bool crouching = IsKeyDown(KEY_LEFT_CONTROL);
|
||||||
|
UpdateBody(&player, lookRotation.x, sideway, forward, IsKeyPressed(KEY_SPACE), crouching);
|
||||||
|
|
||||||
|
float delta = GetFrameTime();
|
||||||
|
headLerp = Lerp(headLerp, (crouching ? CROUCH_HEIGHT : STAND_HEIGHT), 20.0f*delta);
|
||||||
|
camera.position = (Vector3){
|
||||||
|
player.position.x,
|
||||||
|
player.position.y + (BOTTOM_HEIGHT + headLerp),
|
||||||
|
player.position.z,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (player.isGrounded && ((forward != 0) || (sideway != 0)))
|
||||||
|
{
|
||||||
|
headTimer += delta*3.0f;
|
||||||
|
walkLerp = Lerp(walkLerp, 1.0f, 10.0f*delta);
|
||||||
|
camera.fovy = Lerp(camera.fovy, 55.0f, 5.0f*delta);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
walkLerp = Lerp(walkLerp, 0.0f, 10.0f*delta);
|
||||||
|
camera.fovy = Lerp(camera.fovy, 60.0f, 5.0f*delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
lean.x = Lerp(lean.x, sideway*0.02f, 10.0f*delta);
|
||||||
|
lean.y = Lerp(lean.y, forward*0.015f, 10.0f*delta);
|
||||||
|
|
||||||
|
UpdateCameraFPS(&camera);
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
BeginMode3D(camera);
|
||||||
|
DrawLevel();
|
||||||
|
EndMode3D();
|
||||||
|
|
||||||
|
// Draw info box
|
||||||
|
DrawRectangle(5, 5, 330, 75, Fade(SKYBLUE, 0.5f));
|
||||||
|
DrawRectangleLines(5, 5, 330, 75, BLUE);
|
||||||
|
|
||||||
|
DrawText("Camera controls:", 15, 15, 10, BLACK);
|
||||||
|
DrawText("- Move keys: W, A, S, D, Space, Left-Ctrl", 15, 30, 10, BLACK);
|
||||||
|
DrawText("- Look around: arrow keys or mouse", 15, 45, 10, BLACK);
|
||||||
|
DrawText(TextFormat("- Velocity Len: (%06.3f)", Vector2Length((Vector2){ player.velocity.x, player.velocity.z })), 15, 60, 10, BLACK);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Update body considering current world state
|
||||||
|
void UpdateBody(Body *body, float rot, char side, char forward, bool jumpPressed, bool crouchHold)
|
||||||
|
{
|
||||||
|
Vector2 input = (Vector2){ (float)side, (float)-forward };
|
||||||
|
|
||||||
|
#if defined(NORMALIZE_INPUT)
|
||||||
|
// Slow down diagonal movement
|
||||||
|
if ((side != 0) && (forward != 0)) input = Vector2Normalize(input);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
float delta = GetFrameTime();
|
||||||
|
|
||||||
|
if (!body->isGrounded) body->velocity.y -= GRAVITY*delta;
|
||||||
|
|
||||||
|
if (body->isGrounded && jumpPressed)
|
||||||
|
{
|
||||||
|
body->velocity.y = JUMP_FORCE;
|
||||||
|
body->isGrounded = false;
|
||||||
|
|
||||||
|
// Sound can be played at this moment
|
||||||
|
//SetSoundPitch(fxJump, 1.0f + (GetRandomValue(-100, 100)*0.001));
|
||||||
|
//PlaySound(fxJump);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 front = (Vector3){ sinf(rot), 0.f, cosf(rot) };
|
||||||
|
Vector3 right = (Vector3){ cosf(-rot), 0.f, sinf(-rot) };
|
||||||
|
|
||||||
|
Vector3 desiredDir = (Vector3){ input.x*right.x + input.y*front.x, 0.0f, input.x*right.z + input.y*front.z, };
|
||||||
|
body->dir = Vector3Lerp(body->dir, desiredDir, CONTROL*delta);
|
||||||
|
|
||||||
|
float decel = (body->isGrounded ? FRICTION : AIR_DRAG);
|
||||||
|
Vector3 hvel = (Vector3){ body->velocity.x*decel, 0.0f, body->velocity.z*decel };
|
||||||
|
|
||||||
|
float hvelLength = Vector3Length(hvel); // Magnitude
|
||||||
|
if (hvelLength < (MAX_SPEED*0.01f)) hvel = (Vector3){ 0 };
|
||||||
|
|
||||||
|
// This is what creates strafing
|
||||||
|
float speed = Vector3DotProduct(hvel, body->dir);
|
||||||
|
|
||||||
|
// Whenever the amount of acceleration to add is clamped by the maximum acceleration constant,
|
||||||
|
// a Player can make the speed faster by bringing the direction closer to horizontal velocity angle
|
||||||
|
// More info here: https://youtu.be/v3zT3Z5apaM?t=165
|
||||||
|
float maxSpeed = (crouchHold? CROUCH_SPEED : MAX_SPEED);
|
||||||
|
float accel = Clamp(maxSpeed - speed, 0.f, MAX_ACCEL*delta);
|
||||||
|
hvel.x += body->dir.x*accel;
|
||||||
|
hvel.z += body->dir.z*accel;
|
||||||
|
|
||||||
|
body->velocity.x = hvel.x;
|
||||||
|
body->velocity.z = hvel.z;
|
||||||
|
|
||||||
|
body->position.x += body->velocity.x*delta;
|
||||||
|
body->position.y += body->velocity.y*delta;
|
||||||
|
body->position.z += body->velocity.z*delta;
|
||||||
|
|
||||||
|
// Fancy collision system against the floor
|
||||||
|
if (body->position.y <= 0.0f)
|
||||||
|
{
|
||||||
|
body->position.y = 0.0f;
|
||||||
|
body->velocity.y = 0.0f;
|
||||||
|
body->isGrounded = true; // Enable jumping
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update camera for FPS behaviour
|
||||||
|
static void UpdateCameraFPS(Camera *camera)
|
||||||
|
{
|
||||||
|
const Vector3 up = (Vector3){ 0.0f, 1.0f, 0.0f };
|
||||||
|
const Vector3 targetOffset = (Vector3){ 0.0f, 0.0f, -1.0f };
|
||||||
|
|
||||||
|
// Left and right
|
||||||
|
Vector3 yaw = Vector3RotateByAxisAngle(targetOffset, up, lookRotation.x);
|
||||||
|
|
||||||
|
// Clamp view up
|
||||||
|
float maxAngleUp = Vector3Angle(up, yaw);
|
||||||
|
maxAngleUp -= 0.001f; // Avoid numerical errors
|
||||||
|
if ( -(lookRotation.y) > maxAngleUp) { lookRotation.y = -maxAngleUp; }
|
||||||
|
|
||||||
|
// Clamp view down
|
||||||
|
float maxAngleDown = Vector3Angle(Vector3Negate(up), yaw);
|
||||||
|
maxAngleDown *= -1.0f; // Downwards angle is negative
|
||||||
|
maxAngleDown += 0.001f; // Avoid numerical errors
|
||||||
|
if ( -(lookRotation.y) < maxAngleDown) { lookRotation.y = -maxAngleDown; }
|
||||||
|
|
||||||
|
// Up and down
|
||||||
|
Vector3 right = Vector3Normalize(Vector3CrossProduct(yaw, up));
|
||||||
|
|
||||||
|
// Rotate view vector around right axis
|
||||||
|
float pitchAngle = -lookRotation.y - lean.y;
|
||||||
|
pitchAngle = Clamp(pitchAngle, -PI/2 + 0.0001f, PI/2 - 0.0001f); // Clamp angle so it doesn't go past straight up or straight down
|
||||||
|
Vector3 pitch = Vector3RotateByAxisAngle(yaw, right, pitchAngle);
|
||||||
|
|
||||||
|
// Head animation
|
||||||
|
// Rotate up direction around forward axis
|
||||||
|
float headSin = sinf(headTimer*PI);
|
||||||
|
float headCos = cosf(headTimer*PI);
|
||||||
|
const float stepRotation = 0.01f;
|
||||||
|
camera->up = Vector3RotateByAxisAngle(up, pitch, headSin*stepRotation + lean.x);
|
||||||
|
|
||||||
|
// Camera BOB
|
||||||
|
const float bobSide = 0.1f;
|
||||||
|
const float bobUp = 0.15f;
|
||||||
|
Vector3 bobbing = Vector3Scale(right, headSin*bobSide);
|
||||||
|
bobbing.y = fabsf(headCos*bobUp);
|
||||||
|
|
||||||
|
camera->position = Vector3Add(camera->position, Vector3Scale(bobbing, walkLerp));
|
||||||
|
camera->target = Vector3Add(camera->position, pitch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw game level
|
||||||
|
static void DrawLevel(void)
|
||||||
|
{
|
||||||
|
const int floorExtent = 25;
|
||||||
|
const float tileSize = 5.0f;
|
||||||
|
const Color tileColor1 = (Color){ 150, 200, 200, 255 };
|
||||||
|
|
||||||
|
// Floor tiles
|
||||||
|
for (int y = -floorExtent; y < floorExtent; y++)
|
||||||
|
{
|
||||||
|
for (int x = -floorExtent; x < floorExtent; x++)
|
||||||
|
{
|
||||||
|
if ((y & 1) && (x & 1))
|
||||||
|
{
|
||||||
|
DrawPlane((Vector3){ x*tileSize, 0.0f, y*tileSize}, (Vector2){ tileSize, tileSize }, tileColor1);
|
||||||
|
}
|
||||||
|
else if (!(y & 1) && !(x & 1))
|
||||||
|
{
|
||||||
|
DrawPlane((Vector3){ x*tileSize, 0.0f, y*tileSize}, (Vector2){ tileSize, tileSize }, LIGHTGRAY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const Vector3 towerSize = (Vector3){ 16.0f, 32.0f, 16.0f };
|
||||||
|
const Color towerColor = (Color){ 150, 200, 200, 255 };
|
||||||
|
|
||||||
|
Vector3 towerPos = (Vector3){ 16.0f, 16.0f, 16.0f };
|
||||||
|
DrawCubeV(towerPos, towerSize, towerColor);
|
||||||
|
DrawCubeWiresV(towerPos, towerSize, DARKBLUE);
|
||||||
|
|
||||||
|
towerPos.x *= -1;
|
||||||
|
DrawCubeV(towerPos, towerSize, towerColor);
|
||||||
|
DrawCubeWiresV(towerPos, towerSize, DARKBLUE);
|
||||||
|
|
||||||
|
towerPos.z *= -1;
|
||||||
|
DrawCubeV(towerPos, towerSize, towerColor);
|
||||||
|
DrawCubeWiresV(towerPos, towerSize, DARKBLUE);
|
||||||
|
|
||||||
|
towerPos.x *= -1;
|
||||||
|
DrawCubeV(towerPos, towerSize, towerColor);
|
||||||
|
DrawCubeWiresV(towerPos, towerSize, DARKBLUE);
|
||||||
|
|
||||||
|
// Red sun
|
||||||
|
DrawSphere((Vector3){ 300.0f, 300.0f, 0.0f }, 100.0f, (Color){ 255, 0, 0, 255 });
|
||||||
|
}
|
||||||
BIN
examples/core/core_3d_camera_fps.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Initialize 3d camera free
|
* raylib [core] example - 3d camera free
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -49,7 +49,7 @@ int main(void)
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
UpdateCamera(&camera, CAMERA_FREE);
|
UpdateCamera(&camera, CAMERA_FREE);
|
||||||
|
|
||||||
if (IsKeyPressed('Z')) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
|
if (IsKeyPressed(KEY_Z)) camera.target = (Vector3){ 0.0f, 0.0f, 0.0f };
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Initialize 3d camera mode
|
* raylib [core] example - 3d camera mode
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - 3d cmaera split screen
|
* raylib [core] example - 3d camera split screen
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
*
|
*
|
||||||
@ -47,7 +47,7 @@ int main(void)
|
|||||||
cameraPlayer2.position.x = -3.0f;
|
cameraPlayer2.position.x = -3.0f;
|
||||||
cameraPlayer2.position.y = 3.0f;
|
cameraPlayer2.position.y = 3.0f;
|
||||||
|
|
||||||
RenderTexture screenPlayer2 = LoadRenderTexture(screenWidth / 2, screenHeight);
|
RenderTexture screenPlayer2 = LoadRenderTexture(screenWidth/2, screenHeight);
|
||||||
|
|
||||||
// Build a flipped rectangle the size of the split view to use for drawing later
|
// Build a flipped rectangle the size of the split view to use for drawing later
|
||||||
Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenPlayer1.texture.width, (float)-screenPlayer1.texture.height };
|
Rectangle splitScreenRect = { 0.0f, 0.0f, (float)screenPlayer1.texture.width, (float)-screenPlayer1.texture.height };
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Picking in 3d mode
|
* raylib [core] example - 3d picking
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
@ -101,7 +101,7 @@ int main(void)
|
|||||||
|
|
||||||
DrawText("Try clicking on the box with your mouse!", 240, 10, 20, DARKGRAY);
|
DrawText("Try clicking on the box with your mouse!", 240, 10, 20, DARKGRAY);
|
||||||
|
|
||||||
if (collision.hit) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30)) / 2, (int)(screenHeight * 0.1f), 30, GREEN);
|
if (collision.hit) DrawText("BOX SELECTED", (screenWidth - MeasureText("BOX SELECTED", 30))/2, (int)(screenHeight*0.1f), 30, GREEN);
|
||||||
|
|
||||||
DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY);
|
DrawText("Right click mouse to toggle camera controls", 10, 430, 10, GRAY);
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,9 @@
|
|||||||
|
|
||||||
#define MAX_ENVIRONMENT_ELEMENTS 5
|
#define MAX_ENVIRONMENT_ELEMENTS 5
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
typedef struct Player {
|
typedef struct Player {
|
||||||
Vector2 position;
|
Vector2 position;
|
||||||
float speed;
|
float speed;
|
||||||
@ -36,7 +39,6 @@ typedef struct EnvElement {
|
|||||||
Color color;
|
Color color;
|
||||||
} EnvElement;
|
} EnvElement;
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] examples - basic screen manager
|
* raylib [core] example - basic screen manager
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Basic window
|
* raylib [core] example - basic window
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
|
|||||||
164
examples/core/core_clipboard_text.c
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - clipboard text
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example contributed by Ananth S (@Ananth1839) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Ananth S (@Ananth1839)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#define RAYGUI_IMPLEMENTATION
|
||||||
|
#include "raygui.h"
|
||||||
|
|
||||||
|
#define MAX_TEXT_SAMPLES 5
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - clipboard text");
|
||||||
|
|
||||||
|
// Define some sample texts
|
||||||
|
const char *sampleTexts[MAX_TEXT_SAMPLES] = {
|
||||||
|
"Hello from raylib!",
|
||||||
|
"The quick brown fox jumps over the lazy dog",
|
||||||
|
"Clipboard operations are useful!",
|
||||||
|
"raylib is a simple and easy-to-use library",
|
||||||
|
"Copy and paste me!"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *clipboardText = NULL;
|
||||||
|
char inputBuffer[256] = "Hello from raylib!"; // Random initial string
|
||||||
|
|
||||||
|
// UI required variables
|
||||||
|
bool textBoxEditMode = false;
|
||||||
|
|
||||||
|
bool btnCutPressed = false;
|
||||||
|
bool btnCopyPressed = false;
|
||||||
|
bool btnPastePressed = false;
|
||||||
|
bool btnClearPressed = false;
|
||||||
|
bool btnRandomPressed = false;
|
||||||
|
|
||||||
|
// Set UI style
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SIZE, 20);
|
||||||
|
GuiSetIconScale(2);
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Handle button interactions
|
||||||
|
if (btnCutPressed)
|
||||||
|
{
|
||||||
|
SetClipboardText(inputBuffer);
|
||||||
|
clipboardText = GetClipboardText();
|
||||||
|
inputBuffer[0] = '\0'; // Quick solution to clear text
|
||||||
|
//memset(inputBuffer, 0, 256); // Clear full buffer properly
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnCopyPressed)
|
||||||
|
{
|
||||||
|
SetClipboardText(inputBuffer); // Copy text to clipboard
|
||||||
|
clipboardText = GetClipboardText(); // Get text from clipboard
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnPastePressed)
|
||||||
|
{
|
||||||
|
// Paste text from clipboard
|
||||||
|
clipboardText = GetClipboardText();
|
||||||
|
if (clipboardText != NULL) TextCopy(inputBuffer, clipboardText);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnClearPressed)
|
||||||
|
{
|
||||||
|
inputBuffer[0] = '\0'; // Quick solution to clear text
|
||||||
|
//memset(inputBuffer, 0, 256); // Clear full buffer properly
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnRandomPressed)
|
||||||
|
{
|
||||||
|
// Get random text from sample list
|
||||||
|
TextCopy(inputBuffer, sampleTexts[GetRandomValue(0, MAX_TEXT_SAMPLES - 1)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Quick cut/copy/paste with keyboard shortcuts
|
||||||
|
if (IsKeyDown(KEY_LEFT_CONTROL) || IsKeyDown(KEY_RIGHT_CONTROL))
|
||||||
|
{
|
||||||
|
if (IsKeyPressed(KEY_X))
|
||||||
|
{
|
||||||
|
SetClipboardText(inputBuffer);
|
||||||
|
inputBuffer[0] = '\0'; // Quick solution to clear text
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsKeyPressed(KEY_C)) SetClipboardText(inputBuffer);
|
||||||
|
|
||||||
|
if (IsKeyPressed(KEY_V))
|
||||||
|
{
|
||||||
|
clipboardText = GetClipboardText();
|
||||||
|
if (clipboardText != NULL) TextCopy(inputBuffer, clipboardText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw instructions
|
||||||
|
GuiLabel((Rectangle){ 50, 20, 700, 36 }, "Use the BUTTONS or KEY SHORTCUTS:");
|
||||||
|
DrawText("[CTRL+X] - CUT | [CTRL+C] COPY | [CTRL+V] | PASTE", 50, 60, 20, MAROON);
|
||||||
|
|
||||||
|
// Draw text box
|
||||||
|
if (GuiTextBox((Rectangle){ 50, 120, 652, 40 }, inputBuffer, 256, textBoxEditMode)) textBoxEditMode = !textBoxEditMode;
|
||||||
|
|
||||||
|
// Random text button
|
||||||
|
btnRandomPressed = GuiButton((Rectangle){ 50 + 652 + 8, 120, 40, 40 }, "#77#");
|
||||||
|
|
||||||
|
// Draw buttons
|
||||||
|
btnCutPressed = GuiButton((Rectangle){ 50, 180, 158, 40 }, "#17#CUT");
|
||||||
|
btnCopyPressed = GuiButton((Rectangle){ 50 + 165, 180, 158, 40 }, "#16#COPY");
|
||||||
|
btnPastePressed = GuiButton((Rectangle){ 50 + 165*2, 180, 158, 40 }, "#18#PASTE");
|
||||||
|
btnClearPressed = GuiButton((Rectangle){ 50 + 165*3, 180, 158, 40 }, "#143#CLEAR");
|
||||||
|
|
||||||
|
// Draw clipboard status
|
||||||
|
GuiSetState(STATE_DISABLED);
|
||||||
|
GuiLabel((Rectangle){ 50, 260, 700, 40 }, "Clipboard current text data:");
|
||||||
|
GuiSetStyle(TEXTBOX, TEXT_READONLY, 1);
|
||||||
|
GuiTextBox((Rectangle){ 50, 300, 700, 40 }, (char *)clipboardText, 256, false);
|
||||||
|
GuiSetStyle(TEXTBOX, TEXT_READONLY, 0);
|
||||||
|
GuiLabel((Rectangle){ 50, 360, 700, 40 }, "Try copying text from other applications and pasting here!");
|
||||||
|
GuiSetState(STATE_NORMAL);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_clipboard_text.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
143
examples/core/core_compute_hash.c
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - compute hash
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#define RAYGUI_IMPLEMENTATION
|
||||||
|
#include "raygui.h"
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static char *GetDataAsHexText(const unsigned int *data, int dataSize);
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - compute hash");
|
||||||
|
|
||||||
|
// UI controls variables
|
||||||
|
char textInput[96] = "The quick brown fox jumps over the lazy dog.";
|
||||||
|
bool textBoxEditMode = false;
|
||||||
|
bool btnComputeHashes = false;
|
||||||
|
|
||||||
|
// Data hash values
|
||||||
|
unsigned int hashCRC32 = 0;
|
||||||
|
unsigned int *hashMD5 = NULL;
|
||||||
|
unsigned int *hashSHA1 = NULL;
|
||||||
|
unsigned int *hashSHA256 = NULL;
|
||||||
|
|
||||||
|
// Base64 encoded data
|
||||||
|
char *base64Text = NULL;
|
||||||
|
int base64TextSize = 0;
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
if (btnComputeHashes)
|
||||||
|
{
|
||||||
|
int textInputLen = strlen(textInput);
|
||||||
|
|
||||||
|
// Encode data to Base64 string (includes NULL terminator), memory must be MemFree()
|
||||||
|
base64Text = EncodeDataBase64((unsigned char *)textInput, textInputLen, &base64TextSize);
|
||||||
|
|
||||||
|
hashCRC32 = ComputeCRC32((unsigned char *)textInput, textInputLen); // Compute CRC32 hash code (4 bytes)
|
||||||
|
hashMD5 = ComputeMD5((unsigned char *)textInput, textInputLen); // Compute MD5 hash code, returns static int[4] (16 bytes)
|
||||||
|
hashSHA1 = ComputeSHA1((unsigned char *)textInput, textInputLen); // Compute SHA1 hash code, returns static int[5] (20 bytes)
|
||||||
|
hashSHA256 = ComputeSHA256((unsigned char *)textInput, textInputLen); // Compute SHA256 hash code, returns static int[8] (32 bytes)
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SIZE, 20);
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SPACING, 2);
|
||||||
|
GuiLabel((Rectangle){ 40, 26, 720, 32 }, "INPUT DATA (TEXT):");
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SPACING, 1);
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SIZE, 10);
|
||||||
|
|
||||||
|
if (GuiTextBox((Rectangle){ 40, 64, 720, 32 }, textInput, 95, textBoxEditMode)) textBoxEditMode = !textBoxEditMode;
|
||||||
|
|
||||||
|
btnComputeHashes = GuiButton((Rectangle){ 40, 64 + 40, 720, 32 }, "COMPUTE INPUT DATA HASHES");
|
||||||
|
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SIZE, 20);
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SPACING, 2);
|
||||||
|
GuiLabel((Rectangle){ 40, 160, 720, 32 }, "INPUT DATA HASH VALUES:");
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SPACING, 1);
|
||||||
|
GuiSetStyle(DEFAULT, TEXT_SIZE, 10);
|
||||||
|
|
||||||
|
GuiSetStyle(TEXTBOX, TEXT_READONLY, 1);
|
||||||
|
GuiLabel((Rectangle){ 40, 200, 120, 32 }, "CRC32 [32 bit]:");
|
||||||
|
GuiTextBox((Rectangle){ 40 + 120, 200, 720 - 120, 32 }, GetDataAsHexText(&hashCRC32, 1), 120, false);
|
||||||
|
GuiLabel((Rectangle){ 40, 200 + 36, 120, 32 }, "MD5 [128 bit]:");
|
||||||
|
GuiTextBox((Rectangle){ 40 + 120, 200 + 36, 720 - 120, 32 }, GetDataAsHexText(hashMD5, 4), 120, false);
|
||||||
|
GuiLabel((Rectangle){ 40, 200 + 36*2, 120, 32 }, "SHA1 [160 bit]:");
|
||||||
|
GuiTextBox((Rectangle){ 40 + 120, 200 + 36*2, 720 - 120, 32 }, GetDataAsHexText(hashSHA1, 5), 120, false);
|
||||||
|
GuiLabel((Rectangle){ 40, 200 + 36*3, 120, 32 }, "SHA256 [256 bit]:");
|
||||||
|
GuiTextBox((Rectangle){ 40 + 120, 200 + 36*3, 720 - 120, 32 }, GetDataAsHexText(hashSHA256, 8), 120, false);
|
||||||
|
|
||||||
|
GuiSetState(STATE_FOCUSED);
|
||||||
|
GuiLabel((Rectangle){ 40, 200 + 36*5 - 30, 320, 32 }, "BONUS - BAS64 ENCODED STRING:");
|
||||||
|
GuiSetState(STATE_NORMAL);
|
||||||
|
GuiLabel((Rectangle){ 40, 200 + 36*5, 120, 32 }, "BASE64 ENCODING:");
|
||||||
|
GuiTextBox((Rectangle){ 40 + 120, 200 + 36*5, 720 - 120, 32 }, base64Text, 120, false);
|
||||||
|
GuiSetStyle(TEXTBOX, TEXT_READONLY, 0);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
MemFree(base64Text); // Free Base64 text data
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static char *GetDataAsHexText(const unsigned int *data, int dataSize)
|
||||||
|
{
|
||||||
|
static char text[128] = { 0 };
|
||||||
|
memset(text, 0, 128);
|
||||||
|
|
||||||
|
if ((data != NULL) && (dataSize > 0) && (dataSize < ((128/8) - 1)))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < dataSize; i++) TextCopy(text + i*8, TextFormat("%08X", data[i]));
|
||||||
|
}
|
||||||
|
else TextCopy(text, "00000000");
|
||||||
|
|
||||||
|
return text;
|
||||||
|
}
|
||||||
BIN
examples/core/core_compute_hash.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
@ -12,7 +12,7 @@
|
|||||||
* 4. PollInputEvents()
|
* 4. PollInputEvents()
|
||||||
*
|
*
|
||||||
* To avoid steps 2, 3 and 4, flag SUPPORT_CUSTOM_FRAME_CONTROL can be enabled in
|
* To avoid steps 2, 3 and 4, flag SUPPORT_CUSTOM_FRAME_CONTROL can be enabled in
|
||||||
* config.h (it requires recompiling raylib). This way those steps are up to the user.
|
* config.h (it requires recompiling raylib). This way those steps are up to the user
|
||||||
*
|
*
|
||||||
* Note that enabling this flag invalidates some functions:
|
* Note that enabling this flag invalidates some functions:
|
||||||
* - GetFrameTime()
|
* - GetFrameTime()
|
||||||
@ -61,7 +61,9 @@ int main(void)
|
|||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
|
#ifndef PLATFORM_WEB // NOTE: On non web platforms the PollInputEvents just works before the inputs checks
|
||||||
|
PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
|
||||||
|
#endif
|
||||||
|
|
||||||
if (IsKeyPressed(KEY_SPACE)) pause = !pause;
|
if (IsKeyPressed(KEY_SPACE)) pause = !pause;
|
||||||
|
|
||||||
@ -76,6 +78,10 @@ int main(void)
|
|||||||
if (position >= GetScreenWidth()) position = 0;
|
if (position >= GetScreenWidth()) position = 0;
|
||||||
timeCounter += deltaTime; // We count time (seconds)
|
timeCounter += deltaTime; // We count time (seconds)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PLATFORM_WEB // NOTE: On web platform for some reason the PollInputEvents only works after the inputs check, so just call it after check all your inputs (on web)
|
||||||
|
PollInputEvents(); // Poll input events (SUPPORT_CUSTOM_FRAME_CONTROL)
|
||||||
|
#endif
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Custom logging
|
* raylib [core] example - custom logging
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
*
|
*
|
||||||
@ -17,11 +17,11 @@
|
|||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
#include <stdio.h> // Required for: fopen(), fclose(), fputc(), fwrite(), printf(), fprintf(), funopen()
|
#include <stdio.h> // Required for: printf(), vprintf(), fprintf()
|
||||||
#include <time.h> // Required for: time_t, tm, time(), localtime(), strftime()
|
#include <time.h> // Required for: time_t, tm, time(), localtime(), strftime()
|
||||||
|
|
||||||
// Custom logging function
|
// Custom logging function
|
||||||
void CustomLog(int msgType, const char *text, va_list args)
|
void CustomTraceLog(int msgType, const char *text, va_list args)
|
||||||
{
|
{
|
||||||
char timeStr[64] = { 0 };
|
char timeStr[64] = { 0 };
|
||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
@ -54,7 +54,7 @@ int main(void)
|
|||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
// Set custom logger
|
// Set custom logger
|
||||||
SetTraceLogCallback(CustomLog);
|
SetTraceLogCallback(CustomTraceLog);
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - custom logging");
|
||||||
|
|
||||||
|
|||||||
112
examples/core/core_delta_time.c
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - delta time
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example contributed by Robin (@RobinsAviary) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Robin (@RobinsAviary)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - delta time");
|
||||||
|
|
||||||
|
int currentFps = 60;
|
||||||
|
|
||||||
|
// Store the position for the both of the circles
|
||||||
|
Vector2 deltaCircle = { 0, (float)screenHeight/3.0f };
|
||||||
|
Vector2 frameCircle = { 0, (float)screenHeight*(2.0f/3.0f) };
|
||||||
|
|
||||||
|
// The speed applied to both circles
|
||||||
|
const float speed = 10.0f;
|
||||||
|
const float circleRadius = 32.0f;
|
||||||
|
|
||||||
|
SetTargetFPS(currentFps);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Adjust the FPS target based on the mouse wheel
|
||||||
|
float mouseWheel = GetMouseWheelMove();
|
||||||
|
if (mouseWheel != 0)
|
||||||
|
{
|
||||||
|
currentFps += (int)mouseWheel;
|
||||||
|
if (currentFps < 0) currentFps = 0;
|
||||||
|
SetTargetFPS(currentFps);
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetFrameTime() returns the time it took to draw the last frame, in seconds (usually called delta time)
|
||||||
|
// Uses the delta time to make the circle look like it's moving at a "consistent" speed regardless of FPS
|
||||||
|
|
||||||
|
// Multiply by 6.0 (an arbitrary value) in order to make the speed
|
||||||
|
// visually closer to the other circle (at 60 fps), for comparison
|
||||||
|
deltaCircle.x += GetFrameTime()*6.0f*speed;
|
||||||
|
// This circle can move faster or slower visually depending on the FPS
|
||||||
|
frameCircle.x += 0.1f*speed;
|
||||||
|
|
||||||
|
// If either circle is off the screen, reset it back to the start
|
||||||
|
if (deltaCircle.x > screenWidth) deltaCircle.x = 0;
|
||||||
|
if (frameCircle.x > screenWidth) frameCircle.x = 0;
|
||||||
|
|
||||||
|
// Reset both circles positions
|
||||||
|
if (IsKeyPressed(KEY_R))
|
||||||
|
{
|
||||||
|
deltaCircle.x = 0;
|
||||||
|
frameCircle.x = 0;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw both circles to the screen
|
||||||
|
DrawCircleV(deltaCircle, circleRadius, RED);
|
||||||
|
DrawCircleV(frameCircle, circleRadius, BLUE);
|
||||||
|
|
||||||
|
// Draw the help text
|
||||||
|
// Determine what help text to show depending on the current FPS target
|
||||||
|
const char *fpsText = 0;
|
||||||
|
if (currentFps <= 0) fpsText = TextFormat("FPS: unlimited (%i)", GetFPS());
|
||||||
|
else fpsText = TextFormat("FPS: %i (target: %i)", GetFPS(), currentFps);
|
||||||
|
DrawText(fpsText, 10, 10, 20, DARKGRAY);
|
||||||
|
DrawText(TextFormat("Frame time: %02.02f ms", GetFrameTime()), 10, 30, 20, DARKGRAY);
|
||||||
|
DrawText("Use the scroll wheel to change the fps limit, r to reset", 10, 50, 20, DARKGRAY);
|
||||||
|
|
||||||
|
// Draw the text above the circles
|
||||||
|
DrawText("FUNC: x += GetFrameTime()*speed", 10, 90, 20, RED);
|
||||||
|
DrawText("FUNC: x += speed", 10, 240, 20, BLUE);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_delta_time.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
100
examples/core/core_directory_files.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - directory files
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6
|
||||||
|
*
|
||||||
|
* Example contributed by Hugo ARNAL (@hugoarnal) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Hugo ARNAL (@hugoarnal)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#define RAYGUI_IMPLEMENTATION
|
||||||
|
#include "raygui.h" // Required for GUI controls
|
||||||
|
|
||||||
|
#define MAX_FILEPATH_SIZE 1024
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - directory files");
|
||||||
|
|
||||||
|
char directory[MAX_FILEPATH_SIZE] = { 0 };
|
||||||
|
strcpy(directory, GetWorkingDirectory());
|
||||||
|
|
||||||
|
FilePathList files = LoadDirectoryFiles(directory);
|
||||||
|
|
||||||
|
int btnBackPressed = false;
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
if (btnBackPressed)
|
||||||
|
{
|
||||||
|
TextCopy(directory, GetPrevDirectoryPath(directory));
|
||||||
|
UnloadDirectoryFiles(files);
|
||||||
|
files = LoadDirectoryFiles(directory);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
DrawText(directory, 100, 40, 20, DARKGRAY);
|
||||||
|
|
||||||
|
btnBackPressed = GuiButton((Rectangle){ 40.0f, 38.0f, 48, 24 }, "<");
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)files.count; i++)
|
||||||
|
{
|
||||||
|
Color color = Fade(LIGHTGRAY, 0.3f);
|
||||||
|
|
||||||
|
if (!IsPathFile(files.paths[i]) && DirectoryExists(files.paths[i]))
|
||||||
|
{
|
||||||
|
if (GuiButton((Rectangle){0.0f, 85.0f + 40.0f*(float)i, screenWidth, 40}, ""))
|
||||||
|
{
|
||||||
|
TextCopy(directory, files.paths[i]);
|
||||||
|
UnloadDirectoryFiles(files);
|
||||||
|
files = LoadDirectoryFiles(directory);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawRectangle(0, 85 + 40*i, screenWidth, 40, color);
|
||||||
|
DrawText(GetFileName(files.paths[i]), 120, 100 + 40*i, 10, GRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
UnloadDirectoryFiles(files);
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_directory_files.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Windows drop files
|
* raylib [core] example - drop files
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,24 +1,26 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - HighDPI
|
* raylib [core] example - highdpi demo
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] e/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.0, last time updated with raylib 5.5
|
||||||
|
*
|
||||||
|
* Example contributed by Jonathan Marler (@marler8997) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
*
|
*
|
||||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
* BSD-like license that allows static linking with closed source software
|
* BSD-like license that allows static linking with closed source software
|
||||||
*
|
*
|
||||||
* Copyright (c) 2013-2025 Ramon Santamaria (@raysan5)
|
* Copyright (c) 2025 Jonathan Marler (@marler8997)
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
static void DrawTextCenter(const char *text, int x, int y, int fontSize, Color color)
|
//------------------------------------------------------------------------------------
|
||||||
{
|
// Module Functions Declaration
|
||||||
Vector2 size = MeasureTextEx(GetFontDefault(), text, (float)fontSize, 3);
|
//------------------------------------------------------------------------------------
|
||||||
Vector2 pos = (Vector2){x - size.x/2, y - size.y/2 };
|
static void DrawTextCenter(const char *text, int x, int y, int fontSize, Color color);
|
||||||
DrawTextEx(GetFontDefault(), text, pos, (float)fontSize, 3, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
@ -31,10 +33,20 @@ int main(void)
|
|||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
SetConfigFlags(FLAG_WINDOW_HIGHDPI | FLAG_WINDOW_RESIZABLE);
|
SetConfigFlags(FLAG_WINDOW_HIGHDPI | FLAG_WINDOW_RESIZABLE);
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - highdpi demo");
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - highdpi");
|
|
||||||
SetWindowMinSize(450, 450);
|
SetWindowMinSize(450, 450);
|
||||||
|
|
||||||
|
int logicalGridDescY = 120;
|
||||||
|
int logicalGridLabelY = logicalGridDescY + 30;
|
||||||
|
int logicalGridTop = logicalGridLabelY + 30;
|
||||||
|
int logicalGridBottom = logicalGridTop + 80;
|
||||||
|
int pixelGridTop = logicalGridBottom - 20;
|
||||||
|
int pixelGridBottom = pixelGridTop + 80;
|
||||||
|
int pixelGridLabelY = pixelGridBottom + 30;
|
||||||
|
int pixelGridDescY = pixelGridLabelY + 30;
|
||||||
|
int cellSize = 50;
|
||||||
|
float cellSizePx = (float)cellSize;
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -44,67 +56,60 @@ int main(void)
|
|||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
int monitorCount = GetMonitorCount();
|
int monitorCount = GetMonitorCount();
|
||||||
if (monitorCount > 1 && IsKeyPressed(KEY_N)) {
|
|
||||||
SetWindowMonitor((GetCurrentMonitor() + 1) % monitorCount);
|
if ((monitorCount > 1) && IsKeyPressed(KEY_N))
|
||||||
|
{
|
||||||
|
SetWindowMonitor((GetCurrentMonitor() + 1)%monitorCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
int currentMonitor = GetCurrentMonitor();
|
int currentMonitor = GetCurrentMonitor();
|
||||||
|
Vector2 dpiScale = GetWindowScaleDPI();
|
||||||
|
cellSizePx = ((float)cellSize)/dpiScale.x;
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
BeginDrawing();
|
BeginDrawing();
|
||||||
|
|
||||||
Vector2 dpiScale = GetWindowScaleDPI();
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
int windowCenter = GetScreenWidth() / 2;
|
int windowCenter = GetScreenWidth()/2;
|
||||||
DrawTextCenter(TextFormat("Dpi Scale: %f", dpiScale.x), windowCenter, 30, 40, DARKGRAY);
|
DrawTextCenter(TextFormat("Dpi Scale: %f", dpiScale.x), windowCenter, 30, 40, DARKGRAY);
|
||||||
DrawTextCenter(TextFormat("Monitor: %d/%d ([N] next monitor)", currentMonitor+1, monitorCount), windowCenter, 70, 16, LIGHTGRAY);
|
DrawTextCenter(TextFormat("Monitor: %d/%d ([N] next monitor)", currentMonitor+1, monitorCount), windowCenter, 70, 20, LIGHTGRAY);
|
||||||
|
|
||||||
const int logicalGridDescY = 120;
|
|
||||||
const int logicalGridLabelY = logicalGridDescY + 30;
|
|
||||||
const int logicalGridTop = logicalGridLabelY + 30;
|
|
||||||
const int logicalGridBottom = logicalGridTop + 80;
|
|
||||||
const int pixelGridTop = logicalGridBottom - 20;
|
|
||||||
const int pixelGridBottom = pixelGridTop + 80;
|
|
||||||
const int pixelGridLabelY = pixelGridBottom + 30;
|
|
||||||
const int pixelGridDescY = pixelGridLabelY + 30;
|
|
||||||
|
|
||||||
const int cellSize = 50;
|
|
||||||
const float cellSizePx = ((float)cellSize) / dpiScale.x;
|
|
||||||
|
|
||||||
DrawTextCenter(TextFormat("Window is %d \"logical points\" wide", GetScreenWidth()), windowCenter, logicalGridDescY, 20, ORANGE);
|
DrawTextCenter(TextFormat("Window is %d \"logical points\" wide", GetScreenWidth()), windowCenter, logicalGridDescY, 20, ORANGE);
|
||||||
|
|
||||||
bool odd = true;
|
bool odd = true;
|
||||||
for (int i = cellSize; i < GetScreenWidth(); i += cellSize, odd = !odd) {
|
for (int i = cellSize; i < GetScreenWidth(); i += cellSize, odd = !odd)
|
||||||
if (odd) {
|
{
|
||||||
DrawRectangle(i, logicalGridTop, cellSize, logicalGridBottom-logicalGridTop, ORANGE);
|
if (odd) DrawRectangle(i, logicalGridTop, cellSize, logicalGridBottom-logicalGridTop, ORANGE);
|
||||||
}
|
|
||||||
DrawTextCenter(TextFormat("%d", i), i, logicalGridLabelY, 12, LIGHTGRAY);
|
DrawTextCenter(TextFormat("%d", i), i, logicalGridLabelY, 10, LIGHTGRAY);
|
||||||
DrawLine(i, logicalGridLabelY + 10, i, logicalGridBottom, GRAY);
|
DrawLine(i, logicalGridLabelY + 10, i, logicalGridBottom, GRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
odd = true;
|
odd = true;
|
||||||
const int minTextSpace = 30;
|
const int minTextSpace = 30;
|
||||||
int last_text_x = -minTextSpace;
|
int lastTextX = -minTextSpace;
|
||||||
for (int i = cellSize; i < GetRenderWidth(); i += cellSize, odd = !odd) {
|
for (int i = cellSize; i < GetRenderWidth(); i += cellSize, odd = !odd)
|
||||||
int x = (int)(((float)i) / dpiScale.x);
|
{
|
||||||
if (odd) {
|
int x = (int)(((float)i)/dpiScale.x);
|
||||||
DrawRectangle(x, pixelGridTop, (int)cellSizePx, pixelGridBottom-pixelGridTop, CLITERAL(Color){ 0, 121, 241, 100 });
|
if (odd) DrawRectangle(x, pixelGridTop, (int)cellSizePx, pixelGridBottom - pixelGridTop, CLITERAL(Color){ 0, 121, 241, 100 });
|
||||||
}
|
|
||||||
DrawLine(x, pixelGridTop, (int)(((float)i) / dpiScale.x), pixelGridLabelY - 10, GRAY);
|
DrawLine(x, pixelGridTop, (int)(((float)i)/dpiScale.x), pixelGridLabelY - 10, GRAY);
|
||||||
if (x - last_text_x >= minTextSpace) {
|
|
||||||
DrawTextCenter(TextFormat("%d", i), x, pixelGridLabelY, 12, LIGHTGRAY);
|
if ((x - lastTextX) >= minTextSpace)
|
||||||
last_text_x = x;
|
{
|
||||||
|
DrawTextCenter(TextFormat("%d", i), x, pixelGridLabelY, 10, LIGHTGRAY);
|
||||||
|
lastTextX = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawTextCenter(TextFormat("Window is %d \"physical pixels\" wide", GetRenderWidth()), windowCenter, pixelGridDescY, 20, BLUE);
|
DrawTextCenter(TextFormat("Window is %d \"physical pixels\" wide", GetRenderWidth()), windowCenter, pixelGridDescY, 20, BLUE);
|
||||||
|
|
||||||
{
|
const char *text = "Can you see this?";
|
||||||
const char *text = "Can you see this?";
|
Vector2 size = MeasureTextEx(GetFontDefault(), text, 20, 3);
|
||||||
Vector2 size = MeasureTextEx(GetFontDefault(), text, 16, 3);
|
Vector2 pos = (Vector2){ GetScreenWidth() - size.x - 5, GetScreenHeight() - size.y - 5 };
|
||||||
Vector2 pos = (Vector2){GetScreenWidth() - size.x - 5, GetScreenHeight() - size.y - 5};
|
DrawTextEx(GetFontDefault(), text, pos, 20, 3, LIGHTGRAY);
|
||||||
DrawTextEx(GetFontDefault(), text, pos, 16, 3, LIGHTGRAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
@ -117,3 +122,13 @@ int main(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
static void DrawTextCenter(const char *text, int x, int y, int fontSize, Color color)
|
||||||
|
{
|
||||||
|
Vector2 size = MeasureTextEx(GetFontDefault(), text, (float)fontSize, 3);
|
||||||
|
Vector2 pos = (Vector2){ x - size.x/2, y - size.y/2 };
|
||||||
|
DrawTextEx(GetFontDefault(), text, pos, (float)fontSize, 3, color);
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
99
examples/core/core_highdpi_testbed.c
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - highdpi testbed
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example contributed by Ramon Santamaria (@raysan5) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_WINDOW_HIGHDPI);
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - highdpi testbed");
|
||||||
|
|
||||||
|
Vector2 scaleDpi = GetWindowScaleDPI();
|
||||||
|
Vector2 mousePos = GetMousePosition();
|
||||||
|
int currentMonitor = GetCurrentMonitor();
|
||||||
|
|
||||||
|
int gridSpacing = 40; // Grid spacing in pixels
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
mousePos = GetMousePosition();
|
||||||
|
currentMonitor = GetCurrentMonitor();
|
||||||
|
scaleDpi = GetWindowScaleDPI();
|
||||||
|
|
||||||
|
if (IsKeyPressed(KEY_SPACE)) ToggleBorderlessWindowed();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw grid
|
||||||
|
for (int h = 0; h < 20; h++)
|
||||||
|
{
|
||||||
|
DrawText(TextFormat("%02i", h*gridSpacing), 4, h*gridSpacing - 4, 10, GRAY);
|
||||||
|
DrawLine(24, h*gridSpacing, GetScreenWidth(), h*gridSpacing, LIGHTGRAY);
|
||||||
|
}
|
||||||
|
for (int v = 0; v < 40; v++)
|
||||||
|
{
|
||||||
|
DrawText(TextFormat("%02i", v*gridSpacing), v*gridSpacing - 10, 4, 10, GRAY);
|
||||||
|
DrawLine(v*gridSpacing, 20, v*gridSpacing, GetScreenHeight(), LIGHTGRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw UI info
|
||||||
|
DrawText(TextFormat("CURRENT MONITOR: %i/%i (%ix%i)", currentMonitor + 1, GetMonitorCount(),
|
||||||
|
GetMonitorWidth(currentMonitor), GetMonitorHeight(currentMonitor)), 50, 50, 20, DARKGRAY);
|
||||||
|
DrawText(TextFormat("SCREEN SIZE: %ix%i", GetScreenWidth(), GetScreenHeight()), 50, 90, 20, DARKGRAY);
|
||||||
|
DrawText(TextFormat("RENDER SIZE: %ix%i", GetRenderWidth(), GetRenderHeight()), 50, 130, 20, DARKGRAY);
|
||||||
|
DrawText(TextFormat("SCALE FACTOR: %.1fx%.1f", scaleDpi.x, scaleDpi.y), 50, 170, 20, GRAY);
|
||||||
|
|
||||||
|
// Draw mouse position
|
||||||
|
DrawCircleV(GetMousePosition(), 20, MAROON);
|
||||||
|
DrawRectangle(mousePos.x - 25, mousePos.y, 50, 2, BLACK);
|
||||||
|
DrawRectangle(mousePos.x, mousePos.y - 25, 2, 50, BLACK);
|
||||||
|
DrawText(TextFormat("[%i,%i]", GetMouseX(), GetMouseY()), mousePos.x - 44,
|
||||||
|
(mousePos.y > GetScreenHeight() - 60)? mousePos.y - 46 : mousePos.y + 30, 20, BLACK);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// TODO: Unload all loaded resources at this point
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_highdpi_testbed.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
203
examples/core/core_input_actions.c
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - input actions
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6
|
||||||
|
*
|
||||||
|
* Example contributed by Jett (@JettMonstersGoBoom) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Jett (@JettMonstersGoBoom)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
// Simple example for decoding input as actions, allowing remapping of input to different keys or gamepad buttons
|
||||||
|
// For example instead of using `IsKeyDown(KEY_LEFT)`, you can use `IsActionDown(ACTION_LEFT)`
|
||||||
|
// which can be reassigned to e.g. KEY_A and also assigned to a gamepad button. the action will trigger with either gamepad or keys
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
typedef enum ActionType {
|
||||||
|
NO_ACTION = 0,
|
||||||
|
ACTION_UP,
|
||||||
|
ACTION_DOWN,
|
||||||
|
ACTION_LEFT,
|
||||||
|
ACTION_RIGHT,
|
||||||
|
ACTION_FIRE,
|
||||||
|
MAX_ACTION
|
||||||
|
} ActionType;
|
||||||
|
|
||||||
|
// Key and button inputs
|
||||||
|
typedef struct ActionInput {
|
||||||
|
int key;
|
||||||
|
int button;
|
||||||
|
} ActionInput;
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Global Variables Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static int gamepadIndex = 0; // Gamepad default index
|
||||||
|
static ActionInput actionInputs[MAX_ACTION] = { 0 };
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
static bool IsActionPressed(int action); // Check action key/button pressed
|
||||||
|
static bool IsActionReleased(int action); // Check action key/button released
|
||||||
|
static bool IsActionDown(int action); // Check action key/button down
|
||||||
|
|
||||||
|
static void SetActionsDefault(void); // Set the "default" keyset
|
||||||
|
static void SetActionsCursor(void); // Set the "alternate" keyset
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - input actions");
|
||||||
|
|
||||||
|
// Set default actions
|
||||||
|
char actionSet = 0;
|
||||||
|
SetActionsDefault();
|
||||||
|
bool releaseAction = false;
|
||||||
|
|
||||||
|
Vector2 position = (Vector2){ 400.0f, 200.0f };
|
||||||
|
Vector2 size = (Vector2){ 40.0f, 40.0f };
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
gamepadIndex = 0; // Set gamepad being checked
|
||||||
|
|
||||||
|
if (IsActionDown(ACTION_UP)) position.y -= 2;
|
||||||
|
if (IsActionDown(ACTION_DOWN)) position.y += 2;
|
||||||
|
if (IsActionDown(ACTION_LEFT)) position.x -= 2;
|
||||||
|
if (IsActionDown(ACTION_RIGHT)) position.x += 2;
|
||||||
|
if (IsActionPressed(ACTION_FIRE))
|
||||||
|
{
|
||||||
|
position.x = (screenWidth-size.x)/2;
|
||||||
|
position.y = (screenHeight-size.y)/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register release action for one frame
|
||||||
|
releaseAction = false;
|
||||||
|
if (IsActionReleased(ACTION_FIRE)) releaseAction = true;
|
||||||
|
|
||||||
|
// Switch control scheme by pressing TAB
|
||||||
|
if (IsKeyPressed(KEY_TAB))
|
||||||
|
{
|
||||||
|
actionSet = !actionSet;
|
||||||
|
if (actionSet == 0) SetActionsDefault();
|
||||||
|
else SetActionsCursor();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(GRAY);
|
||||||
|
|
||||||
|
DrawRectangleV(position, size, releaseAction? BLUE : RED);
|
||||||
|
|
||||||
|
DrawText((actionSet == 0)? "Current input set: WASD (default)" : "Current input set: Cursor", 10, 10, 20, WHITE);
|
||||||
|
DrawText("Use TAB key to toggles Actions keyset", 10, 50, 20, GREEN);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Check action key/button pressed
|
||||||
|
// NOTE: Combines key pressed and gamepad button pressed in one action
|
||||||
|
static bool IsActionPressed(int action)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (action < MAX_ACTION) result = (IsKeyPressed(actionInputs[action].key) || IsGamepadButtonPressed(gamepadIndex, actionInputs[action].button));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check action key/button released
|
||||||
|
// NOTE: Combines key released and gamepad button released in one action
|
||||||
|
static bool IsActionReleased(int action)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (action < MAX_ACTION) result = (IsKeyReleased(actionInputs[action].key) || IsGamepadButtonReleased(gamepadIndex, actionInputs[action].button));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check action key/button down
|
||||||
|
// NOTE: Combines key down and gamepad button down in one action
|
||||||
|
static bool IsActionDown(int action)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
|
||||||
|
if (action < MAX_ACTION) result = (IsKeyDown(actionInputs[action].key) || IsGamepadButtonDown(gamepadIndex, actionInputs[action].button));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the "default" keyset
|
||||||
|
// NOTE: Here WASD and gamepad buttons on the left side for movement
|
||||||
|
static void SetActionsDefault(void)
|
||||||
|
{
|
||||||
|
actionInputs[ACTION_UP].key = KEY_W;
|
||||||
|
actionInputs[ACTION_DOWN].key = KEY_S;
|
||||||
|
actionInputs[ACTION_LEFT].key = KEY_A;
|
||||||
|
actionInputs[ACTION_RIGHT].key = KEY_D;
|
||||||
|
actionInputs[ACTION_FIRE].key = KEY_SPACE;
|
||||||
|
|
||||||
|
actionInputs[ACTION_UP].button = GAMEPAD_BUTTON_LEFT_FACE_UP;
|
||||||
|
actionInputs[ACTION_DOWN].button = GAMEPAD_BUTTON_LEFT_FACE_DOWN;
|
||||||
|
actionInputs[ACTION_LEFT].button = GAMEPAD_BUTTON_LEFT_FACE_LEFT;
|
||||||
|
actionInputs[ACTION_RIGHT].button = GAMEPAD_BUTTON_LEFT_FACE_RIGHT;
|
||||||
|
actionInputs[ACTION_FIRE].button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the "alternate" keyset
|
||||||
|
// NOTE: Here cursor keys and gamepad buttons on the right side for movement
|
||||||
|
static void SetActionsCursor(void)
|
||||||
|
{
|
||||||
|
actionInputs[ACTION_UP].key = KEY_UP;
|
||||||
|
actionInputs[ACTION_DOWN].key = KEY_DOWN;
|
||||||
|
actionInputs[ACTION_LEFT].key = KEY_LEFT;
|
||||||
|
actionInputs[ACTION_RIGHT].key = KEY_RIGHT;
|
||||||
|
actionInputs[ACTION_FIRE].key = KEY_SPACE;
|
||||||
|
|
||||||
|
actionInputs[ACTION_UP].button = GAMEPAD_BUTTON_RIGHT_FACE_UP;
|
||||||
|
actionInputs[ACTION_DOWN].button = GAMEPAD_BUTTON_RIGHT_FACE_DOWN;
|
||||||
|
actionInputs[ACTION_LEFT].button = GAMEPAD_BUTTON_RIGHT_FACE_LEFT;
|
||||||
|
actionInputs[ACTION_RIGHT].button = GAMEPAD_BUTTON_RIGHT_FACE_RIGHT;
|
||||||
|
actionInputs[ACTION_FIRE].button = GAMEPAD_BUTTON_LEFT_FACE_DOWN;
|
||||||
|
}
|
||||||
BIN
examples/core/core_input_actions.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Gamepad input
|
* raylib [core] example - input gamepad
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -38,7 +38,7 @@ int main(void)
|
|||||||
|
|
||||||
SetConfigFlags(FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation
|
SetConfigFlags(FLAG_MSAA_4X_HINT); // Set MSAA 4X hint before windows creation
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - gamepad input");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - input gamepad");
|
||||||
|
|
||||||
Texture2D texPs3Pad = LoadTexture("resources/ps3.png");
|
Texture2D texPs3Pad = LoadTexture("resources/ps3.png");
|
||||||
Texture2D texXboxPad = LoadTexture("resources/xbox.png");
|
Texture2D texXboxPad = LoadTexture("resources/xbox.png");
|
||||||
@ -51,6 +51,8 @@ int main(void)
|
|||||||
const float leftTriggerDeadzone = -0.9f;
|
const float leftTriggerDeadzone = -0.9f;
|
||||||
const float rightTriggerDeadzone = -0.9f;
|
const float rightTriggerDeadzone = -0.9f;
|
||||||
|
|
||||||
|
Rectangle vibrateButton = { 0 };
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -61,7 +63,12 @@ int main(void)
|
|||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// ...
|
if (IsKeyPressed(KEY_LEFT) && gamepad > 0) gamepad--;
|
||||||
|
if (IsKeyPressed(KEY_RIGHT)) gamepad++;
|
||||||
|
Vector2 mousePosition = GetMousePosition();
|
||||||
|
|
||||||
|
vibrateButton = (Rectangle){ 10, 70 + 20*GetGamepadAxisCount(gamepad) + 20, 75, 24 };
|
||||||
|
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && CheckCollisionPointRec(mousePosition, vibrateButton)) SetGamepadVibration(gamepad, 1.0, 1.0, 1.0);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
@ -70,9 +77,6 @@ int main(void)
|
|||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
if (IsKeyPressed(KEY_LEFT) && gamepad > 0) gamepad--;
|
|
||||||
if (IsKeyPressed(KEY_RIGHT)) gamepad++;
|
|
||||||
|
|
||||||
if (IsGamepadAvailable(gamepad))
|
if (IsGamepadAvailable(gamepad))
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("GP%d: %s", gamepad, GetGamepadName(gamepad)), 10, 10, 10, BLACK);
|
DrawText(TextFormat("GP%d: %s", gamepad, GetGamepadName(gamepad)), 10, 10, 10, BLACK);
|
||||||
@ -93,7 +97,8 @@ int main(void)
|
|||||||
if (leftTrigger < leftTriggerDeadzone) leftTrigger = -1.0f;
|
if (leftTrigger < leftTriggerDeadzone) leftTrigger = -1.0f;
|
||||||
if (rightTrigger < rightTriggerDeadzone) rightTrigger = -1.0f;
|
if (rightTrigger < rightTriggerDeadzone) rightTrigger = -1.0f;
|
||||||
|
|
||||||
if (TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_1) > -1 || TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_2) > -1)
|
if ((TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_1) > -1) ||
|
||||||
|
(TextFindIndex(TextToLower(GetGamepadName(gamepad)), XBOX_ALIAS_2) > -1))
|
||||||
{
|
{
|
||||||
DrawTexture(texXboxPad, 0, 0, DARKGRAY);
|
DrawTexture(texXboxPad, 0, 0, DARKGRAY);
|
||||||
|
|
||||||
@ -125,16 +130,14 @@ int main(void)
|
|||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
||||||
DrawCircle(259, 152, 39, BLACK);
|
DrawCircle(259, 152, 39, BLACK);
|
||||||
DrawCircle(259, 152, 34, LIGHTGRAY);
|
DrawCircle(259, 152, 34, LIGHTGRAY);
|
||||||
DrawCircle(259 + (int)(leftStickX*20),
|
DrawCircle(259 + (int)(leftStickX*20), 152 + (int)(leftStickY*20), 25, leftGamepadColor);
|
||||||
152 + (int)(leftStickY*20), 25, leftGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: right joystick
|
// Draw axis: right joystick
|
||||||
Color rightGamepadColor = BLACK;
|
Color rightGamepadColor = BLACK;
|
||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
||||||
DrawCircle(461, 237, 38, BLACK);
|
DrawCircle(461, 237, 38, BLACK);
|
||||||
DrawCircle(461, 237, 33, LIGHTGRAY);
|
DrawCircle(461, 237, 33, LIGHTGRAY);
|
||||||
DrawCircle(461 + (int)(rightStickX*20),
|
DrawCircle(461 + (int)(rightStickX*20), 237 + (int)(rightStickY*20), 25, rightGamepadColor);
|
||||||
237 + (int)(rightStickY*20), 25, rightGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: left-right triggers
|
// Draw axis: left-right triggers
|
||||||
DrawRectangle(170, 30, 15, 70, GRAY);
|
DrawRectangle(170, 30, 15, 70, GRAY);
|
||||||
@ -177,16 +180,14 @@ int main(void)
|
|||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
||||||
DrawCircle(319, 255, 35, BLACK);
|
DrawCircle(319, 255, 35, BLACK);
|
||||||
DrawCircle(319, 255, 31, LIGHTGRAY);
|
DrawCircle(319, 255, 31, LIGHTGRAY);
|
||||||
DrawCircle(319 + (int)(leftStickX*20),
|
DrawCircle(319 + (int)(leftStickX*20), 255 + (int)(leftStickY*20), 25, leftGamepadColor);
|
||||||
255 + (int)(leftStickY*20), 25, leftGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: right joystick
|
// Draw axis: right joystick
|
||||||
Color rightGamepadColor = BLACK;
|
Color rightGamepadColor = BLACK;
|
||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
||||||
DrawCircle(475, 255, 35, BLACK);
|
DrawCircle(475, 255, 35, BLACK);
|
||||||
DrawCircle(475, 255, 31, LIGHTGRAY);
|
DrawCircle(475, 255, 31, LIGHTGRAY);
|
||||||
DrawCircle(475 + (int)(rightStickX*20),
|
DrawCircle(475 + (int)(rightStickX*20), 255 + (int)(rightStickY*20), 25, rightGamepadColor);
|
||||||
255 + (int)(rightStickY*20), 25, rightGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: left-right triggers
|
// Draw axis: left-right triggers
|
||||||
DrawRectangle(169, 48, 15, 70, GRAY);
|
DrawRectangle(169, 48, 15, 70, GRAY);
|
||||||
@ -196,7 +197,6 @@ int main(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
// Draw background: generic
|
// Draw background: generic
|
||||||
DrawRectangleRounded((Rectangle){ 175, 110, 460, 220}, 0.3f, 16, DARKGRAY);
|
DrawRectangleRounded((Rectangle){ 175, 110, 460, 220}, 0.3f, 16, DARKGRAY);
|
||||||
|
|
||||||
@ -237,39 +237,39 @@ int main(void)
|
|||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_LEFT_THUMB)) leftGamepadColor = RED;
|
||||||
DrawCircle(345, 260, 40, BLACK);
|
DrawCircle(345, 260, 40, BLACK);
|
||||||
DrawCircle(345, 260, 35, LIGHTGRAY);
|
DrawCircle(345, 260, 35, LIGHTGRAY);
|
||||||
DrawCircle(345 + (int)(leftStickX*20),
|
DrawCircle(345 + (int)(leftStickX*20), 260 + (int)(leftStickY*20), 25, leftGamepadColor);
|
||||||
260 + (int)(leftStickY*20), 25, leftGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: right joystick
|
// Draw axis: right joystick
|
||||||
Color rightGamepadColor = BLACK;
|
Color rightGamepadColor = BLACK;
|
||||||
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
if (IsGamepadButtonDown(gamepad, GAMEPAD_BUTTON_RIGHT_THUMB)) rightGamepadColor = RED;
|
||||||
DrawCircle(465, 260, 40, BLACK);
|
DrawCircle(465, 260, 40, BLACK);
|
||||||
DrawCircle(465, 260, 35, LIGHTGRAY);
|
DrawCircle(465, 260, 35, LIGHTGRAY);
|
||||||
DrawCircle(465 + (int)(rightStickX*20),
|
DrawCircle(465 + (int)(rightStickX*20), 260 + (int)(rightStickY*20), 25, rightGamepadColor);
|
||||||
260 + (int)(rightStickY*20), 25, rightGamepadColor);
|
|
||||||
|
|
||||||
// Draw axis: left-right triggers
|
// Draw axis: left-right triggers
|
||||||
DrawRectangle(151, 110, 15, 70, GRAY);
|
DrawRectangle(151, 110, 15, 70, GRAY);
|
||||||
DrawRectangle(644, 110, 15, 70, GRAY);
|
DrawRectangle(644, 110, 15, 70, GRAY);
|
||||||
DrawRectangle(151, 110, 15, (int)(((1 + leftTrigger)/2)*70), RED);
|
DrawRectangle(151, 110, 15, (int)(((1 + leftTrigger)/2)*70), RED);
|
||||||
DrawRectangle(644, 110, 15, (int)(((1 + rightTrigger)/2)*70), RED);
|
DrawRectangle(644, 110, 15, (int)(((1 + rightTrigger)/2)*70), RED);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawText(TextFormat("DETECTED AXIS [%i]:", GetGamepadAxisCount(0)), 10, 50, 10, MAROON);
|
DrawText(TextFormat("DETECTED AXIS [%i]:", GetGamepadAxisCount(gamepad)), 10, 50, 10, MAROON);
|
||||||
|
|
||||||
for (int i = 0; i < GetGamepadAxisCount(0); i++)
|
for (int i = 0; i < GetGamepadAxisCount(gamepad); i++)
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("AXIS %i: %.02f", i, GetGamepadAxisMovement(0, i)), 20, 70 + 20*i, 10, DARKGRAY);
|
DrawText(TextFormat("AXIS %i: %.02f", i, GetGamepadAxisMovement(gamepad, i)), 20, 70 + 20*i, 10, DARKGRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Draw vibrate button
|
||||||
|
DrawRectangleRec(vibrateButton, SKYBLUE);
|
||||||
|
DrawText("VIBRATE", vibrateButton.x + 14, vibrateButton.y + 1, 10, DARKGRAY);
|
||||||
|
|
||||||
if (GetGamepadButtonPressed() != GAMEPAD_BUTTON_UNKNOWN) DrawText(TextFormat("DETECTED BUTTON: %i", GetGamepadButtonPressed()), 10, 430, 10, RED);
|
if (GetGamepadButtonPressed() != GAMEPAD_BUTTON_UNKNOWN) DrawText(TextFormat("DETECTED BUTTON: %i", GetGamepadButtonPressed()), 10, 430, 10, RED);
|
||||||
else DrawText("DETECTED BUTTON: NONE", 10, 430, 10, GRAY);
|
else DrawText("DETECTED BUTTON: NONE", 10, 430, 10, GRAY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DrawText(TextFormat("GP%d: NOT DETECTED", gamepad), 10, 10, 10, GRAY);
|
DrawText(TextFormat("GP%d: NOT DETECTED", gamepad), 10, 10, 10, GRAY);
|
||||||
|
|
||||||
DrawTexture(texXboxPad, 0, 0, LIGHTGRAY);
|
DrawTexture(texXboxPad, 0, 0, LIGHTGRAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Input Gestures Detection
|
* raylib [core] example - input gestures
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
@ -118,4 +118,6 @@ int main(void)
|
|||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
CloseWindow(); // Close window and OpenGL context
|
CloseWindow(); // Close window and OpenGL context
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
315
examples/core/core_input_gestures_testbed.c
Normal file
@ -0,0 +1,315 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - input gestures testbed
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.0, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example contributed by ubkp (@ubkp) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2023-2025 ubkp (@ubkp)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include <math.h> // Required for the protractor angle graphic drawing
|
||||||
|
|
||||||
|
#define GESTURE_LOG_SIZE 20
|
||||||
|
#define MAX_TOUCH_COUNT 32
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
static char const *GetGestureName(int gesture); // Get text string for gesture value
|
||||||
|
static Color GetGestureColor(int gesture); // Get color for gesture value
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures testbed");
|
||||||
|
|
||||||
|
Vector2 messagePosition = { 160, 7 };
|
||||||
|
|
||||||
|
// Last gesture variables definitions
|
||||||
|
int lastGesture = 0;
|
||||||
|
Vector2 lastGesturePosition = { 165, 130 };
|
||||||
|
|
||||||
|
// Gesture log variables definitions
|
||||||
|
// NOTE: The gesture log uses an array (as an inverted circular queue) to store the performed gestures
|
||||||
|
char gestureLog[GESTURE_LOG_SIZE][12] = { "" };
|
||||||
|
// NOTE: The index for the inverted circular queue (moving from last to first direction, then looping around)
|
||||||
|
int gestureLogIndex = GESTURE_LOG_SIZE;
|
||||||
|
int previousGesture = 0;
|
||||||
|
|
||||||
|
// Log mode values:
|
||||||
|
// - 0 shows repeated events
|
||||||
|
// - 1 hides repeated events
|
||||||
|
// - 2 shows repeated events but hide hold events
|
||||||
|
// - 3 hides repeated events and hide hold events
|
||||||
|
int logMode = 1;
|
||||||
|
|
||||||
|
Color gestureColor = { 0, 0, 0, 255 };
|
||||||
|
Rectangle logButton1 = { 53, 7, 48, 26 };
|
||||||
|
Rectangle logButton2 = { 108, 7, 36, 26 };
|
||||||
|
Vector2 gestureLogPosition = { 10, 10 };
|
||||||
|
|
||||||
|
// Protractor variables definitions
|
||||||
|
float angleLength = 90.0f;
|
||||||
|
float currentAngleDegrees = 0.0f;
|
||||||
|
Vector2 finalVector = { 0.0f, 0.0f };
|
||||||
|
Vector2 protractorPosition = { 266.0f, 315.0f };
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
// Handle common gestures data
|
||||||
|
int i, ii; // Iterators that will be reused by all for loops
|
||||||
|
const int currentGesture = GetGestureDetected();
|
||||||
|
const float currentDragDegrees = GetGestureDragAngle();
|
||||||
|
const float currentPitchDegrees = GetGesturePinchAngle();
|
||||||
|
const int touchCount = GetTouchPointCount();
|
||||||
|
|
||||||
|
// Handle last gesture
|
||||||
|
if ((currentGesture != 0) && (currentGesture != 4) && (currentGesture != previousGesture))
|
||||||
|
lastGesture = currentGesture; // Filter the meaningful gestures (1, 2, 8 to 512) for the display
|
||||||
|
|
||||||
|
// Handle gesture log
|
||||||
|
if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT))
|
||||||
|
{
|
||||||
|
if (CheckCollisionPointRec(GetMousePosition(), logButton1))
|
||||||
|
{
|
||||||
|
switch (logMode)
|
||||||
|
{
|
||||||
|
case 3: logMode = 2; break;
|
||||||
|
case 2: logMode = 3; break;
|
||||||
|
case 1: logMode = 0; break;
|
||||||
|
default: logMode = 1; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (CheckCollisionPointRec(GetMousePosition(), logButton2))
|
||||||
|
{
|
||||||
|
switch (logMode)
|
||||||
|
{
|
||||||
|
case 3: logMode = 1; break;
|
||||||
|
case 2: logMode = 0; break;
|
||||||
|
case 1: logMode = 3; break;
|
||||||
|
default: logMode = 2; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int fillLog = 0; // Gate variable to be used to allow or not the gesture log to be filled
|
||||||
|
if (currentGesture !=0)
|
||||||
|
{
|
||||||
|
if (logMode == 3) // 3 hides repeated events and hide hold events
|
||||||
|
{
|
||||||
|
if (((currentGesture != 4) && (currentGesture != previousGesture)) || (currentGesture < 3)) fillLog = 1;
|
||||||
|
}
|
||||||
|
else if (logMode == 2) // 2 shows repeated events but hide hold events
|
||||||
|
{
|
||||||
|
if (currentGesture != 4) fillLog = 1;
|
||||||
|
}
|
||||||
|
else if (logMode == 1) // 1 hides repeated events
|
||||||
|
{
|
||||||
|
if (currentGesture != previousGesture) fillLog = 1;
|
||||||
|
}
|
||||||
|
else // 0 shows repeated events
|
||||||
|
{
|
||||||
|
fillLog = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fillLog) // If one of the conditions from logMode was met, fill the gesture log
|
||||||
|
{
|
||||||
|
previousGesture = currentGesture;
|
||||||
|
gestureColor = GetGestureColor(currentGesture);
|
||||||
|
if (gestureLogIndex <= 0) gestureLogIndex = GESTURE_LOG_SIZE;
|
||||||
|
gestureLogIndex--;
|
||||||
|
|
||||||
|
// Copy the gesture respective name to the gesture log array
|
||||||
|
TextCopy(gestureLog[gestureLogIndex], GetGestureName(currentGesture));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle protractor
|
||||||
|
if (currentGesture > 255) currentAngleDegrees = currentPitchDegrees; // Pinch In and Pinch Out
|
||||||
|
else if (currentGesture > 15) currentAngleDegrees = currentDragDegrees; // Swipe Right, Swipe Left, Swipe Up and Swipe Down
|
||||||
|
else if (currentGesture > 0) currentAngleDegrees = 0.0f; // Tap, Doubletap, Hold and Grab
|
||||||
|
|
||||||
|
float currentAngleRadians = ((currentAngleDegrees + 90.0f)*PI/180); // Convert the current angle to Radians
|
||||||
|
// Calculate the final vector for display
|
||||||
|
finalVector = (Vector2){ (angleLength*sinf(currentAngleRadians)) + protractorPosition.x,
|
||||||
|
(angleLength*cosf(currentAngleRadians)) + protractorPosition.y };
|
||||||
|
|
||||||
|
// Handle touch and mouse pointer points
|
||||||
|
Vector2 touchPosition[MAX_TOUCH_COUNT] = { 0 };
|
||||||
|
Vector2 mousePosition = { 0 };
|
||||||
|
if (currentGesture != GESTURE_NONE)
|
||||||
|
{
|
||||||
|
if (touchCount != 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < touchCount; i++) touchPosition[i] = GetTouchPosition(i); // Fill the touch positions
|
||||||
|
}
|
||||||
|
else mousePosition = GetMousePosition();
|
||||||
|
}
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw common elements
|
||||||
|
DrawText("*", (int)messagePosition.x + 5, (int)messagePosition.y + 5, 10, BLACK);
|
||||||
|
DrawText("Example optimized for Web/HTML5\non Smartphones with Touch Screen.", (int)messagePosition.x + 15, (int)messagePosition.y + 5, 10, BLACK);
|
||||||
|
DrawText("*", (int)messagePosition.x + 5, (int)messagePosition.y + 35, 10, BLACK);
|
||||||
|
DrawText("While running on Desktop Web Browsers,\ninspect and turn on Touch Emulation.", (int)messagePosition.x + 15, (int)messagePosition.y + 35, 10, BLACK);
|
||||||
|
|
||||||
|
// Draw last gesture
|
||||||
|
DrawText("Last gesture", (int)lastGesturePosition.x + 33, (int)lastGesturePosition.y - 47, 20, BLACK);
|
||||||
|
DrawText("Swipe Tap Pinch Touch", (int)lastGesturePosition.x + 17, (int)lastGesturePosition.y - 18, 10, BLACK);
|
||||||
|
DrawRectangle((int)lastGesturePosition.x + 20, (int)lastGesturePosition.y, 20, 20, lastGesture == GESTURE_SWIPE_UP ? RED : LIGHTGRAY);
|
||||||
|
DrawRectangle((int)lastGesturePosition.x, (int)lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_LEFT ? RED : LIGHTGRAY);
|
||||||
|
DrawRectangle((int)lastGesturePosition.x + 40, (int)lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_RIGHT ? RED : LIGHTGRAY);
|
||||||
|
DrawRectangle((int)lastGesturePosition.x + 20, (int)lastGesturePosition.y + 40, 20, 20, lastGesture == GESTURE_SWIPE_DOWN ? RED : LIGHTGRAY);
|
||||||
|
DrawCircle((int)lastGesturePosition.x + 80, (int)lastGesturePosition.y + 16, 10, lastGesture == GESTURE_TAP ? BLUE : LIGHTGRAY);
|
||||||
|
DrawRing( (Vector2){lastGesturePosition.x + 103, lastGesturePosition.y + 16}, 6.0f, 11.0f, 0.0f, 360.0f, 0, lastGesture == GESTURE_DRAG ? LIME : LIGHTGRAY);
|
||||||
|
DrawCircle((int)lastGesturePosition.x + 80, (int)lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
|
||||||
|
DrawCircle((int)lastGesturePosition.x + 103, (int)lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
|
||||||
|
DrawTriangle((Vector2){ lastGesturePosition.x + 122, lastGesturePosition.y + 16 }, (Vector2){ lastGesturePosition.x + 137, lastGesturePosition.y + 26 }, (Vector2){lastGesturePosition.x + 137, lastGesturePosition.y + 6 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
|
||||||
|
DrawTriangle((Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 6 }, (Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 26 }, (Vector2){ lastGesturePosition.x + 162, lastGesturePosition.y + 16 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
|
||||||
|
DrawTriangle((Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 33 }, (Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 140, lastGesturePosition.y + 43 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
|
||||||
|
DrawTriangle((Vector2){ lastGesturePosition.x + 144, lastGesturePosition.y + 43 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 33 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
|
||||||
|
for (i = 0; i < 4; i++) DrawCircle((int)lastGesturePosition.x + 180, (int)lastGesturePosition.y + 7 + i*15, 5, touchCount <= i? LIGHTGRAY : gestureColor);
|
||||||
|
|
||||||
|
// Draw gesture log
|
||||||
|
DrawText("Log", (int)gestureLogPosition.x, (int)gestureLogPosition.y, 20, BLACK);
|
||||||
|
|
||||||
|
// Loop in both directions to print the gesture log array in the inverted order (and looping around if the index started somewhere in the middle)
|
||||||
|
for (i = 0, ii = gestureLogIndex; i < GESTURE_LOG_SIZE; i++, ii = (ii + 1)%GESTURE_LOG_SIZE) DrawText(gestureLog[ii], (int)gestureLogPosition.x, (int)gestureLogPosition.y + 410 - i*20, 20, (i == 0 ? gestureColor : LIGHTGRAY));
|
||||||
|
Color logButton1Color, logButton2Color;
|
||||||
|
switch (logMode)
|
||||||
|
{
|
||||||
|
case 3: logButton1Color=MAROON; logButton2Color=MAROON; break;
|
||||||
|
case 2: logButton1Color=GRAY; logButton2Color=MAROON; break;
|
||||||
|
case 1: logButton1Color=MAROON; logButton2Color=GRAY; break;
|
||||||
|
default: logButton1Color=GRAY; logButton2Color=GRAY; break;
|
||||||
|
}
|
||||||
|
DrawRectangleRec(logButton1, logButton1Color);
|
||||||
|
DrawText("Hide", (int)logButton1.x + 7, (int)logButton1.y + 3, 10, WHITE);
|
||||||
|
DrawText("Repeat", (int)logButton1.x + 7, (int)logButton1.y + 13, 10, WHITE);
|
||||||
|
DrawRectangleRec(logButton2, logButton2Color);
|
||||||
|
DrawText("Hide", (int)logButton1.x + 62, (int)logButton1.y + 3, 10, WHITE);
|
||||||
|
DrawText("Hold", (int)logButton1.x + 62, (int)logButton1.y + 13, 10, WHITE);
|
||||||
|
|
||||||
|
// Draw protractor
|
||||||
|
DrawText("Angle", (int)protractorPosition.x + 55, (int)protractorPosition.y + 76, 10, BLACK);
|
||||||
|
const char *angleString = TextFormat("%f", currentAngleDegrees);
|
||||||
|
const int angleStringDot = TextFindIndex(angleString, ".");
|
||||||
|
const char *angleStringTrim = TextSubtext(angleString, 0, angleStringDot + 3);
|
||||||
|
DrawText( angleStringTrim, (int)protractorPosition.x + 55, (int)protractorPosition.y + 92, 20, gestureColor);
|
||||||
|
DrawCircleV(protractorPosition, 80.0f, WHITE);
|
||||||
|
DrawLineEx((Vector2){ protractorPosition.x - 90, protractorPosition.y }, (Vector2){ protractorPosition.x + 90, protractorPosition.y }, 3.0f, LIGHTGRAY);
|
||||||
|
DrawLineEx((Vector2){ protractorPosition.x, protractorPosition.y - 90 }, (Vector2){ protractorPosition.x, protractorPosition.y + 90 }, 3.0f, LIGHTGRAY);
|
||||||
|
DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y - 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y + 45 }, 3.0f, GREEN);
|
||||||
|
DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y + 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y - 45 }, 3.0f, GREEN);
|
||||||
|
DrawText("0", (int)protractorPosition.x + 96, (int)protractorPosition.y - 9, 20, BLACK);
|
||||||
|
DrawText("30", (int)protractorPosition.x + 74, (int)protractorPosition.y - 68, 20, BLACK);
|
||||||
|
DrawText("90", (int)protractorPosition.x - 11, (int)protractorPosition.y - 110, 20, BLACK);
|
||||||
|
DrawText("150", (int)protractorPosition.x - 100, (int)protractorPosition.y - 68, 20, BLACK);
|
||||||
|
DrawText("180", (int)protractorPosition.x - 124, (int)protractorPosition.y - 9, 20, BLACK);
|
||||||
|
DrawText("210", (int)protractorPosition.x - 100, (int)protractorPosition.y + 50, 20, BLACK);
|
||||||
|
DrawText("270", (int)protractorPosition.x - 18, (int)protractorPosition.y + 92, 20, BLACK);
|
||||||
|
DrawText("330", (int)protractorPosition.x + 72, (int)protractorPosition.y + 50, 20, BLACK);
|
||||||
|
if (currentAngleDegrees != 0.0f) DrawLineEx(protractorPosition, finalVector, 3.0f, gestureColor);
|
||||||
|
|
||||||
|
// Draw touch and mouse pointer points
|
||||||
|
if (currentGesture != GESTURE_NONE)
|
||||||
|
{
|
||||||
|
if ( touchCount != 0 )
|
||||||
|
{
|
||||||
|
for (i = 0; i < touchCount; i++)
|
||||||
|
{
|
||||||
|
DrawCircleV(touchPosition[i], 50.0f, Fade(gestureColor, 0.5f));
|
||||||
|
DrawCircleV(touchPosition[i], 5.0f, gestureColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (touchCount == 2) DrawLineEx(touchPosition[0], touchPosition[1], ((currentGesture == 512)? 8.0f : 12.0f), gestureColor);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DrawCircleV(mousePosition, 35.0f, Fade(gestureColor, 0.5f));
|
||||||
|
DrawCircleV(mousePosition, 5.0f, gestureColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Module Functions Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Get text string for gesture value
|
||||||
|
static char const *GetGestureName(int gesture)
|
||||||
|
{
|
||||||
|
switch (gesture)
|
||||||
|
{
|
||||||
|
case 0: return "None"; break;
|
||||||
|
case 1: return "Tap"; break;
|
||||||
|
case 2: return "Double Tap"; break;
|
||||||
|
case 4: return "Hold"; break;
|
||||||
|
case 8: return "Drag"; break;
|
||||||
|
case 16: return "Swipe Right"; break;
|
||||||
|
case 32: return "Swipe Left"; break;
|
||||||
|
case 64: return "Swipe Up"; break;
|
||||||
|
case 128: return "Swipe Down"; break;
|
||||||
|
case 256: return "Pinch In"; break;
|
||||||
|
case 512: return "Pinch Out"; break;
|
||||||
|
default: return "Unknown"; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get color for gesture value
|
||||||
|
static Color GetGestureColor(int gesture)
|
||||||
|
{
|
||||||
|
switch (gesture)
|
||||||
|
{
|
||||||
|
case 0: return BLACK; break;
|
||||||
|
case 1: return BLUE; break;
|
||||||
|
case 2: return SKYBLUE; break;
|
||||||
|
case 4: return BLACK; break;
|
||||||
|
case 8: return LIME; break;
|
||||||
|
case 16: return RED; break;
|
||||||
|
case 32: return RED; break;
|
||||||
|
case 64: return RED; break;
|
||||||
|
case 128: return RED; break;
|
||||||
|
case 256: return VIOLET; break;
|
||||||
|
case 512: return ORANGE; break;
|
||||||
|
default: return BLACK; break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
@ -1,332 +0,0 @@
|
|||||||
/*******************************************************************************************
|
|
||||||
*
|
|
||||||
* raylib [core] example - Input Gestures for Web
|
|
||||||
*
|
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
|
||||||
*
|
|
||||||
* Example originally created with raylib 4.6-dev, last time updated with raylib 4.6-dev
|
|
||||||
*
|
|
||||||
* Example contributed by ubkp (@ubkp) and reviewed by Ramon Santamaria (@raysan5)
|
|
||||||
*
|
|
||||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
|
||||||
* BSD-like license that allows static linking with closed source software
|
|
||||||
*
|
|
||||||
* Copyright (c) 2023-2025 ubkp (@ubkp)
|
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
#include "raylib.h"
|
|
||||||
|
|
||||||
#include "math.h" // Required for the protractor angle graphic drawing
|
|
||||||
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
#include <emscripten/emscripten.h> // Required for the Web/HTML5
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
// Global definitions and declarations
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Common variables definitions
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
int screenWidth = 800; // Update depending on web canvas
|
|
||||||
const int screenHeight = 450;
|
|
||||||
Vector2 messagePosition = { 160, 7 };
|
|
||||||
|
|
||||||
// Last gesture variables definitions
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
int lastGesture = 0;
|
|
||||||
Vector2 lastGesturePosition = { 165, 130 };
|
|
||||||
|
|
||||||
// Gesture log variables definitions and functions declarations
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
#define GESTURE_LOG_SIZE 20
|
|
||||||
char gestureLog[GESTURE_LOG_SIZE][12] = { "" }; // The gesture log uses an array (as an inverted circular queue) to store the performed gestures
|
|
||||||
int gestureLogIndex = GESTURE_LOG_SIZE; // The index for the inverted circular queue (moving from last to first direction, then looping around)
|
|
||||||
int previousGesture = 0;
|
|
||||||
|
|
||||||
char const *GetGestureName(int i)
|
|
||||||
{
|
|
||||||
switch (i) {
|
|
||||||
case 0: return "None"; break;
|
|
||||||
case 1: return "Tap"; break;
|
|
||||||
case 2: return "Double Tap"; break;
|
|
||||||
case 4: return "Hold"; break;
|
|
||||||
case 8: return "Drag"; break;
|
|
||||||
case 16: return "Swipe Right"; break;
|
|
||||||
case 32: return "Swipe Left"; break;
|
|
||||||
case 64: return "Swipe Up"; break;
|
|
||||||
case 128: return "Swipe Down"; break;
|
|
||||||
case 256: return "Pinch In"; break;
|
|
||||||
case 512: return "Pinch Out"; break;
|
|
||||||
default: return "Unknown"; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Color GetGestureColor(int i)
|
|
||||||
{
|
|
||||||
switch (i) {
|
|
||||||
case 0: return BLACK; break;
|
|
||||||
case 1: return BLUE; break;
|
|
||||||
case 2: return SKYBLUE; break;
|
|
||||||
case 4: return BLACK; break;
|
|
||||||
case 8: return LIME; break;
|
|
||||||
case 16: return RED; break;
|
|
||||||
case 32: return RED; break;
|
|
||||||
case 64: return RED; break;
|
|
||||||
case 128: return RED; break;
|
|
||||||
case 256: return VIOLET; break;
|
|
||||||
case 512: return ORANGE; break;
|
|
||||||
default: return BLACK; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int logMode = 1; // Log mode values: 0 shows repeated events; 1 hides repeated events; 2 shows repeated events but hide hold events; 3 hides repeated events and hide hold events
|
|
||||||
|
|
||||||
Color gestureColor = { 0, 0, 0, 255 };
|
|
||||||
Rectangle logButton1 = { 53, 7, 48, 26 };
|
|
||||||
Rectangle logButton2 = { 108, 7, 36, 26 };
|
|
||||||
Vector2 gestureLogPosition = { 10, 10 };
|
|
||||||
|
|
||||||
// Protractor variables definitions
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
float angleLength = 90.0f;
|
|
||||||
float currentAngleDegrees = 0.0f;
|
|
||||||
Vector2 finalVector = { 0.0f, 0.0f };
|
|
||||||
char currentAngleStr[7] = "";
|
|
||||||
Vector2 protractorPosition = { 266.0f, 315.0f };
|
|
||||||
|
|
||||||
// Update
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
void Update(void)
|
|
||||||
{
|
|
||||||
// Handle common
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
int i, ii; // Iterators that will be reused by all for loops
|
|
||||||
const int currentGesture = GetGestureDetected();
|
|
||||||
const float currentDragDegrees = GetGestureDragAngle();
|
|
||||||
const float currentPitchDegrees = GetGesturePinchAngle();
|
|
||||||
const int touchCount = GetTouchPointCount();
|
|
||||||
|
|
||||||
// Handle last gesture
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
if ((currentGesture != 0) && (currentGesture != 4) && (currentGesture != previousGesture)) lastGesture = currentGesture; // Filter the meaningful gestures (1, 2, 8 to 512) for the display
|
|
||||||
|
|
||||||
// Handle gesture log
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT))
|
|
||||||
{
|
|
||||||
if (CheckCollisionPointRec(GetMousePosition(), logButton1))
|
|
||||||
{
|
|
||||||
switch (logMode)
|
|
||||||
{
|
|
||||||
case 3: logMode=2; break;
|
|
||||||
case 2: logMode=3; break;
|
|
||||||
case 1: logMode=0; break;
|
|
||||||
default: logMode=1; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (CheckCollisionPointRec(GetMousePosition(), logButton2))
|
|
||||||
{
|
|
||||||
switch (logMode)
|
|
||||||
{
|
|
||||||
case 3: logMode=1; break;
|
|
||||||
case 2: logMode=0; break;
|
|
||||||
case 1: logMode=3; break;
|
|
||||||
default: logMode=2; break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int fillLog = 0; // Gate variable to be used to allow or not the gesture log to be filled
|
|
||||||
if (currentGesture !=0)
|
|
||||||
{
|
|
||||||
if (logMode == 3) // 3 hides repeated events and hide hold events
|
|
||||||
{
|
|
||||||
if (((currentGesture != 4) && (currentGesture != previousGesture)) || (currentGesture < 3)) fillLog = 1;
|
|
||||||
}
|
|
||||||
else if (logMode == 2) // 2 shows repeated events but hide hold events
|
|
||||||
{
|
|
||||||
if (currentGesture != 4) fillLog = 1;
|
|
||||||
}
|
|
||||||
else if (logMode == 1) // 1 hides repeated events
|
|
||||||
{
|
|
||||||
if (currentGesture != previousGesture) fillLog = 1;
|
|
||||||
}
|
|
||||||
else // 0 shows repeated events
|
|
||||||
{
|
|
||||||
fillLog = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fillLog) // If one of the conditions from logMode was met, fill the gesture log
|
|
||||||
{
|
|
||||||
previousGesture = currentGesture;
|
|
||||||
gestureColor = GetGestureColor(currentGesture);
|
|
||||||
if (gestureLogIndex <= 0) gestureLogIndex = GESTURE_LOG_SIZE;
|
|
||||||
gestureLogIndex--;
|
|
||||||
|
|
||||||
// Copy the gesture respective name to the gesture log array
|
|
||||||
TextCopy(gestureLog[gestureLogIndex], GetGestureName(currentGesture));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle protractor
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
if (currentGesture > 255) // aka Pinch In and Pinch Out
|
|
||||||
{
|
|
||||||
currentAngleDegrees = currentPitchDegrees;
|
|
||||||
}
|
|
||||||
else if (currentGesture > 15) // aka Swipe Right, Swipe Left, Swipe Up and Swipe Down
|
|
||||||
{
|
|
||||||
currentAngleDegrees = currentDragDegrees;
|
|
||||||
}
|
|
||||||
else if (currentGesture > 0) // aka Tap, Doubletap, Hold and Grab
|
|
||||||
{
|
|
||||||
currentAngleDegrees = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float currentAngleRadians = ((currentAngleDegrees +90.0f)*PI/180); // Convert the current angle to Radians
|
|
||||||
finalVector = (Vector2){ (angleLength*sinf(currentAngleRadians)) + protractorPosition.x, (angleLength*cosf(currentAngleRadians)) + protractorPosition.y }; // Calculate the final vector for display
|
|
||||||
|
|
||||||
// Handle touch and mouse pointer points
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
#define MAX_TOUCH_COUNT 32
|
|
||||||
|
|
||||||
Vector2 touchPosition[MAX_TOUCH_COUNT] = { 0 };
|
|
||||||
Vector2 mousePosition = {0, 0};
|
|
||||||
if (currentGesture != GESTURE_NONE)
|
|
||||||
{
|
|
||||||
if (touchCount != 0)
|
|
||||||
{
|
|
||||||
for (i = 0; i < touchCount; i++) touchPosition[i] = GetTouchPosition(i); // Fill the touch positions
|
|
||||||
}
|
|
||||||
else mousePosition = GetMousePosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
// Draw common
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
DrawText("*", messagePosition.x + 5, messagePosition.y + 5, 10, BLACK);
|
|
||||||
DrawText("Example optimized for Web/HTML5\non Smartphones with Touch Screen.", messagePosition.x + 15, messagePosition.y + 5, 10, BLACK);
|
|
||||||
DrawText("*", messagePosition.x + 5, messagePosition.y + 35, 10, BLACK);
|
|
||||||
DrawText("While running on Desktop Web Browsers,\ninspect and turn on Touch Emulation.", messagePosition.x + 15, messagePosition.y + 35, 10, BLACK);
|
|
||||||
|
|
||||||
// Draw last gesture
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
DrawText("Last gesture", lastGesturePosition.x + 33, lastGesturePosition.y - 47, 20, BLACK);
|
|
||||||
DrawText("Swipe Tap Pinch Touch", lastGesturePosition.x + 17, lastGesturePosition.y - 18, 10, BLACK);
|
|
||||||
DrawRectangle(lastGesturePosition.x + 20, lastGesturePosition.y, 20, 20, lastGesture == GESTURE_SWIPE_UP ? RED : LIGHTGRAY);
|
|
||||||
DrawRectangle(lastGesturePosition.x, lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_LEFT ? RED : LIGHTGRAY);
|
|
||||||
DrawRectangle(lastGesturePosition.x + 40, lastGesturePosition.y + 20, 20, 20, lastGesture == GESTURE_SWIPE_RIGHT ? RED : LIGHTGRAY);
|
|
||||||
DrawRectangle(lastGesturePosition.x + 20, lastGesturePosition.y + 40, 20, 20, lastGesture == GESTURE_SWIPE_DOWN ? RED : LIGHTGRAY);
|
|
||||||
DrawCircle(lastGesturePosition.x + 80, lastGesturePosition.y + 16, 10, lastGesture == GESTURE_TAP ? BLUE : LIGHTGRAY);
|
|
||||||
DrawRing( (Vector2){lastGesturePosition.x + 103, lastGesturePosition.y + 16}, 6.0f, 11.0f, 0.0f, 360.0f, 0, lastGesture == GESTURE_DRAG ? LIME : LIGHTGRAY);
|
|
||||||
DrawCircle(lastGesturePosition.x + 80, lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
|
|
||||||
DrawCircle(lastGesturePosition.x + 103, lastGesturePosition.y + 43, 10, lastGesture == GESTURE_DOUBLETAP ? SKYBLUE : LIGHTGRAY);
|
|
||||||
DrawTriangle((Vector2){ lastGesturePosition.x + 122, lastGesturePosition.y + 16 }, (Vector2){ lastGesturePosition.x + 137, lastGesturePosition.y + 26 }, (Vector2){ lastGesturePosition.x + 137, lastGesturePosition.y + 6 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
|
|
||||||
DrawTriangle((Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 6 }, (Vector2){ lastGesturePosition.x + 147, lastGesturePosition.y + 26 }, (Vector2){ lastGesturePosition.x + 162, lastGesturePosition.y + 16 }, lastGesture == GESTURE_PINCH_OUT? ORANGE : LIGHTGRAY);
|
|
||||||
DrawTriangle((Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 33 }, (Vector2){ lastGesturePosition.x + 125, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 140, lastGesturePosition.y + 43 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
|
|
||||||
DrawTriangle((Vector2){ lastGesturePosition.x + 144, lastGesturePosition.y + 43 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 53 }, (Vector2){ lastGesturePosition.x + 159, lastGesturePosition.y + 33 }, lastGesture == GESTURE_PINCH_IN? VIOLET : LIGHTGRAY);
|
|
||||||
for (i = 0; i < 4; i++) DrawCircle(lastGesturePosition.x + 180, lastGesturePosition.y + 7 + i*15, 5, touchCount <= i? LIGHTGRAY : gestureColor);
|
|
||||||
|
|
||||||
// Draw gesture log
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
DrawText("Log", gestureLogPosition.x, gestureLogPosition.y, 20, BLACK);
|
|
||||||
|
|
||||||
// Loop in both directions to print the gesture log array in the inverted order (and looping around if the index started somewhere in the middle)
|
|
||||||
for (i = 0, ii = gestureLogIndex; i < GESTURE_LOG_SIZE; i++, ii = (ii + 1) % GESTURE_LOG_SIZE) DrawText(gestureLog[ii], gestureLogPosition.x, gestureLogPosition.y + 410 - i*20, 20, (i == 0 ? gestureColor : LIGHTGRAY));
|
|
||||||
Color logButton1Color, logButton2Color;
|
|
||||||
switch (logMode)
|
|
||||||
{
|
|
||||||
case 3: logButton1Color=MAROON; logButton2Color=MAROON; break;
|
|
||||||
case 2: logButton1Color=GRAY; logButton2Color=MAROON; break;
|
|
||||||
case 1: logButton1Color=MAROON; logButton2Color=GRAY; break;
|
|
||||||
default: logButton1Color=GRAY; logButton2Color=GRAY; break;
|
|
||||||
}
|
|
||||||
DrawRectangleRec(logButton1, logButton1Color);
|
|
||||||
DrawText("Hide", logButton1.x + 7, logButton1.y + 3, 10, WHITE);
|
|
||||||
DrawText("Repeat", logButton1.x + 7, logButton1.y + 13, 10, WHITE);
|
|
||||||
DrawRectangleRec(logButton2, logButton2Color);
|
|
||||||
DrawText("Hide", logButton1.x + 62, logButton1.y + 3, 10, WHITE);
|
|
||||||
DrawText("Hold", logButton1.x + 62, logButton1.y + 13, 10, WHITE);
|
|
||||||
|
|
||||||
// Draw protractor
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
DrawText("Angle", protractorPosition.x + 55, protractorPosition.y + 76, 10, BLACK);
|
|
||||||
const char *angleString = TextFormat("%f", currentAngleDegrees);
|
|
||||||
const int angleStringDot = TextFindIndex(angleString, ".");
|
|
||||||
const char *angleStringTrim = TextSubtext(angleString, 0, angleStringDot + 3);
|
|
||||||
DrawText( angleStringTrim, protractorPosition.x + 55, protractorPosition.y + 92, 20, gestureColor);
|
|
||||||
DrawCircle(protractorPosition.x, protractorPosition.y, 80.0f, WHITE);
|
|
||||||
DrawLineEx((Vector2){ protractorPosition.x - 90, protractorPosition.y }, (Vector2){ protractorPosition.x + 90, protractorPosition.y }, 3.0f, LIGHTGRAY);
|
|
||||||
DrawLineEx((Vector2){ protractorPosition.x, protractorPosition.y - 90 }, (Vector2){ protractorPosition.x, protractorPosition.y + 90 }, 3.0f, LIGHTGRAY);
|
|
||||||
DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y - 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y + 45 }, 3.0f, GREEN);
|
|
||||||
DrawLineEx((Vector2){ protractorPosition.x - 80, protractorPosition.y + 45 }, (Vector2){ protractorPosition.x + 80, protractorPosition.y - 45 }, 3.0f, GREEN);
|
|
||||||
DrawText("0", protractorPosition.x + 96, protractorPosition.y - 9, 20, BLACK);
|
|
||||||
DrawText("30", protractorPosition.x + 74, protractorPosition.y - 68, 20, BLACK);
|
|
||||||
DrawText("90", protractorPosition.x - 11, protractorPosition.y - 110, 20, BLACK);
|
|
||||||
DrawText("150", protractorPosition.x - 100, protractorPosition.y - 68, 20, BLACK);
|
|
||||||
DrawText("180", protractorPosition.x - 124, protractorPosition.y - 9, 20, BLACK);
|
|
||||||
DrawText("210", protractorPosition.x - 100, protractorPosition.y + 50, 20, BLACK);
|
|
||||||
DrawText("270", protractorPosition.x - 18, protractorPosition.y + 92, 20, BLACK);
|
|
||||||
DrawText("330", protractorPosition.x + 72, protractorPosition.y + 50, 20, BLACK);
|
|
||||||
if (currentAngleDegrees != 0.0f) DrawLineEx(protractorPosition, finalVector, 3.0f, gestureColor);
|
|
||||||
|
|
||||||
// Draw touch and mouse pointer points
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
if (currentGesture != GESTURE_NONE)
|
|
||||||
{
|
|
||||||
if ( touchCount != 0 )
|
|
||||||
{
|
|
||||||
for (i = 0; i < touchCount; i++)
|
|
||||||
{
|
|
||||||
DrawCircleV(touchPosition[i], 50.0f, Fade(gestureColor, 0.5f));
|
|
||||||
DrawCircleV(touchPosition[i], 5.0f, gestureColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (touchCount == 2) DrawLineEx(touchPosition[0], touchPosition[1], ((currentGesture == 512)? 8 : 12), gestureColor);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DrawCircleV(mousePosition, 35.0f, Fade(gestureColor, 0.5f));
|
|
||||||
DrawCircleV(mousePosition, 5.0f, gestureColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Program main entry point
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - input gestures web");
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Main game loop
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
#if defined(PLATFORM_WEB)
|
|
||||||
emscripten_set_main_loop(Update, 0, 1);
|
|
||||||
#else
|
|
||||||
SetTargetFPS(60);
|
|
||||||
while (!WindowShouldClose()) Update(); // Detect window close button or ESC key
|
|
||||||
#endif
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// De-Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Keyboard input
|
* raylib [core] example - input keys
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -25,7 +25,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - keyboard input");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - input keys");
|
||||||
|
|
||||||
Vector2 ballPosition = { (float)screenWidth/2, (float)screenHeight/2 };
|
Vector2 ballPosition = { (float)screenWidth/2, (float)screenHeight/2 };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Mouse input
|
* raylib [core] example - input mouse
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -25,11 +25,10 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - mouse input");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - input mouse");
|
||||||
|
|
||||||
Vector2 ballPosition = { -100.0f, -100.0f };
|
Vector2 ballPosition = { -100.0f, -100.0f };
|
||||||
Color ballColor = DARKBLUE;
|
Color ballColor = DARKBLUE;
|
||||||
int isCursorHidden = 0;
|
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//---------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------
|
||||||
@ -41,16 +40,8 @@ int main(void)
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
if (IsKeyPressed(KEY_H))
|
if (IsKeyPressed(KEY_H))
|
||||||
{
|
{
|
||||||
if (isCursorHidden == 0)
|
if (IsCursorHidden()) ShowCursor();
|
||||||
{
|
else HideCursor();
|
||||||
HideCursor();
|
|
||||||
isCursorHidden = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ShowCursor();
|
|
||||||
isCursorHidden = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ballPosition = GetMousePosition();
|
ballPosition = GetMousePosition();
|
||||||
@ -75,7 +66,7 @@ int main(void)
|
|||||||
DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, DARKGRAY);
|
DrawText("move ball with mouse and click mouse button to change color", 10, 10, 20, DARKGRAY);
|
||||||
DrawText("Press 'H' to toggle cursor visibility", 10, 30, 20, DARKGRAY);
|
DrawText("Press 'H' to toggle cursor visibility", 10, 30, 20, DARKGRAY);
|
||||||
|
|
||||||
if (isCursorHidden == 1) DrawText("CURSOR HIDDEN", 20, 60, 20, RED);
|
if (IsCursorHidden()) DrawText("CURSOR HIDDEN", 20, 60, 20, RED);
|
||||||
else DrawText("CURSOR VISIBLE", 20, 60, 20, LIME);
|
else DrawText("CURSOR VISIBLE", 20, 60, 20, LIME);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] examples - Mouse wheel input
|
* raylib [core] example - input mouse wheel
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Input multitouch
|
* raylib [core] example - input multitouch
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -46,7 +46,7 @@ int main(void)
|
|||||||
// Clamp touch points available ( set the maximum touch points allowed )
|
// Clamp touch points available ( set the maximum touch points allowed )
|
||||||
if (tCount > MAX_TOUCH_POINTS) tCount = MAX_TOUCH_POINTS;
|
if (tCount > MAX_TOUCH_POINTS) tCount = MAX_TOUCH_POINTS;
|
||||||
// Get touch points positions
|
// Get touch points positions
|
||||||
for (int i = 0; i < tCount; ++i) touchPositions[i] = GetTouchPosition(i);
|
for (int i = 0; i < tCount; i++) touchPositions[i] = GetTouchPosition(i);
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
@ -55,7 +55,7 @@ int main(void)
|
|||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
for (int i = 0; i < tCount; ++i)
|
for (int i = 0; i < tCount; i++)
|
||||||
{
|
{
|
||||||
// Make sure point is not (0, 0) as this means there is no touch for it
|
// Make sure point is not (0, 0) as this means there is no touch for it
|
||||||
if ((touchPositions[i].x > 0) && (touchPositions[i].y > 0))
|
if ((touchPositions[i].x > 0) && (touchPositions[i].y > 0))
|
||||||
|
|||||||
@ -2,23 +2,22 @@
|
|||||||
*
|
*
|
||||||
* raylib [core] example - input virtual controls
|
* raylib [core] example - input virtual controls
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
* Example originally created with raylib 5.0, last time updated with raylib 5.0
|
* Example originally created with raylib 5.0, last time updated with raylib 5.0
|
||||||
*
|
*
|
||||||
* Example create by GreenSnakeLinux (@GreenSnakeLinux),
|
* Example contributed by GreenSnakeLinux (@GreenSnakeLinux),
|
||||||
* lighter by oblerion (@oblerion) and
|
* reviewed by Ramon Santamaria (@raysan5), oblerion (@oblerion) and danilwhale (@danilwhale)
|
||||||
* reviewed by Ramon Santamaria (@raysan5) and
|
|
||||||
* improved by danilwhale (@danilwhale)
|
|
||||||
*
|
*
|
||||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
* BSD-like license that allows static linking with closed source software
|
* BSD-like license that allows static linking with closed source software
|
||||||
*
|
*
|
||||||
* Copyright (c) 2024-2025 oblerion (@oblerion) and Ramon Santamaria (@raysan5)
|
* Copyright (c) 2024-2025 GreenSnakeLinux (@GreenSnakeLinux) and Ramon Santamaria (@raysan5)
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -45,24 +44,21 @@ int main(void)
|
|||||||
Vector2 padPosition = { 100, 350 };
|
Vector2 padPosition = { 100, 350 };
|
||||||
float buttonRadius = 30;
|
float buttonRadius = 30;
|
||||||
|
|
||||||
Vector2 buttonPositions[BUTTON_MAX] =
|
Vector2 buttonPositions[BUTTON_MAX] = {
|
||||||
{
|
|
||||||
{ padPosition.x,padPosition.y - buttonRadius*1.5f }, // Up
|
{ padPosition.x,padPosition.y - buttonRadius*1.5f }, // Up
|
||||||
{ padPosition.x - buttonRadius*1.5f, padPosition.y }, // Left
|
{ padPosition.x - buttonRadius*1.5f, padPosition.y }, // Left
|
||||||
{ padPosition.x + buttonRadius*1.5f, padPosition.y }, // Right
|
{ padPosition.x + buttonRadius*1.5f, padPosition.y }, // Right
|
||||||
{ padPosition.x, padPosition.y + buttonRadius*1.5f } // Down
|
{ padPosition.x, padPosition.y + buttonRadius*1.5f } // Down
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *buttonLabels[BUTTON_MAX] =
|
const char *buttonLabels[BUTTON_MAX] = {
|
||||||
{
|
|
||||||
"Y", // Up
|
"Y", // Up
|
||||||
"X", // Left
|
"X", // Left
|
||||||
"B", // Right
|
"B", // Right
|
||||||
"A" // Down
|
"A" // Down
|
||||||
};
|
};
|
||||||
|
|
||||||
Color buttonLabelColors[BUTTON_MAX] =
|
Color buttonLabelColors[BUTTON_MAX] = {
|
||||||
{
|
|
||||||
YELLOW, // Up
|
YELLOW, // Up
|
||||||
BLUE, // Left
|
BLUE, // Left
|
||||||
RED, // Right
|
RED, // Right
|
||||||
@ -83,22 +79,15 @@ int main(void)
|
|||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
if ((GetTouchPointCount() > 0))
|
if ((GetTouchPointCount() > 0)) inputPosition = GetTouchPosition(0); // Use touch position
|
||||||
{
|
else inputPosition = GetMousePosition(); // Use mouse position
|
||||||
// Use touch position
|
|
||||||
inputPosition = GetTouchPosition(0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Use mouse position
|
|
||||||
inputPosition = GetMousePosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset pressed button to none
|
// Reset pressed button to none
|
||||||
pressedButton = BUTTON_NONE;
|
pressedButton = BUTTON_NONE;
|
||||||
|
|
||||||
// Make sure user is pressing left mouse button if they're from desktop
|
// Make sure user is pressing left mouse button if they're from desktop
|
||||||
if ((GetTouchPointCount() > 0) || ((GetTouchPointCount() == 0) && IsMouseButtonDown(MOUSE_BUTTON_LEFT)))
|
if ((GetTouchPointCount() > 0) ||
|
||||||
|
((GetTouchPointCount() == 0) && IsMouseButtonDown(MOUSE_BUTTON_LEFT)))
|
||||||
{
|
{
|
||||||
// Find nearest D-Pad button to the input position
|
// Find nearest D-Pad button to the input position
|
||||||
for (int i = 0; i < BUTTON_MAX; i++)
|
for (int i = 0; i < BUTTON_MAX; i++)
|
||||||
@ -123,8 +112,8 @@ int main(void)
|
|||||||
case BUTTON_DOWN: playerPosition.y += playerSpeed*GetFrameTime(); break;
|
case BUTTON_DOWN: playerPosition.y += playerSpeed*GetFrameTime(); break;
|
||||||
default: break;
|
default: break;
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
BeginDrawing();
|
BeginDrawing();
|
||||||
@ -157,4 +146,3 @@ int main(void)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,158 +0,0 @@
|
|||||||
/*******************************************************************************************
|
|
||||||
*
|
|
||||||
* raylib [core] example - loading thread
|
|
||||||
*
|
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
|
||||||
*
|
|
||||||
* NOTE: This example requires linking with pthreads library on MinGW,
|
|
||||||
* it can be accomplished passing -static parameter to compiler
|
|
||||||
*
|
|
||||||
* Example originally created with raylib 2.5, last time updated with raylib 3.0
|
|
||||||
*
|
|
||||||
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
|
||||||
*
|
|
||||||
* Copyright (c) 2014-2025 Ramon Santamaria (@raysan5)
|
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
#include "raylib.h"
|
|
||||||
|
|
||||||
// WARNING: This example does not build on Windows with MSVC compiler
|
|
||||||
#include "pthread.h" // POSIX style threads management
|
|
||||||
|
|
||||||
#include <stdatomic.h> // C11 atomic data types
|
|
||||||
|
|
||||||
#include <time.h> // Required for: clock()
|
|
||||||
|
|
||||||
// Using C11 atomics for synchronization
|
|
||||||
// NOTE: A plain bool (or any plain data type for that matter) can't be used for inter-thread synchronization
|
|
||||||
static atomic_bool dataLoaded = false; // Data Loaded completion indicator
|
|
||||||
static void *LoadDataThread(void *arg); // Loading data thread function declaration
|
|
||||||
|
|
||||||
static atomic_int dataProgress = 0; // Data progress accumulator
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
// Program main entry point
|
|
||||||
//------------------------------------------------------------------------------------
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
const int screenWidth = 800;
|
|
||||||
const int screenHeight = 450;
|
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - loading thread");
|
|
||||||
|
|
||||||
pthread_t threadId = { 0 }; // Loading data thread id
|
|
||||||
|
|
||||||
enum { STATE_WAITING, STATE_LOADING, STATE_FINISHED } state = STATE_WAITING;
|
|
||||||
int framesCounter = 0;
|
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Main game loop
|
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
|
||||||
{
|
|
||||||
// Update
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case STATE_WAITING:
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
int error = pthread_create(&threadId, NULL, &LoadDataThread, NULL);
|
|
||||||
if (error != 0) TraceLog(LOG_ERROR, "Error creating loading thread");
|
|
||||||
else TraceLog(LOG_INFO, "Loading thread initialized successfully");
|
|
||||||
|
|
||||||
state = STATE_LOADING;
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case STATE_LOADING:
|
|
||||||
{
|
|
||||||
framesCounter++;
|
|
||||||
if (atomic_load_explicit(&dataLoaded, memory_order_relaxed))
|
|
||||||
{
|
|
||||||
framesCounter = 0;
|
|
||||||
int error = pthread_join(threadId, NULL);
|
|
||||||
if (error != 0) TraceLog(LOG_ERROR, "Error joining loading thread");
|
|
||||||
else TraceLog(LOG_INFO, "Loading thread terminated successfully");
|
|
||||||
|
|
||||||
state = STATE_FINISHED;
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case STATE_FINISHED:
|
|
||||||
{
|
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
|
||||||
{
|
|
||||||
// Reset everything to launch again
|
|
||||||
atomic_store_explicit(&dataLoaded, false, memory_order_relaxed);
|
|
||||||
atomic_store_explicit(&dataProgress, 0, memory_order_relaxed);
|
|
||||||
state = STATE_WAITING;
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// Draw
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
BeginDrawing();
|
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
|
||||||
|
|
||||||
switch (state)
|
|
||||||
{
|
|
||||||
case STATE_WAITING: DrawText("PRESS ENTER to START LOADING DATA", 150, 170, 20, DARKGRAY); break;
|
|
||||||
case STATE_LOADING:
|
|
||||||
{
|
|
||||||
DrawRectangle(150, 200, atomic_load_explicit(&dataProgress, memory_order_relaxed), 60, SKYBLUE);
|
|
||||||
if ((framesCounter/15)%2) DrawText("LOADING DATA...", 240, 210, 40, DARKBLUE);
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case STATE_FINISHED:
|
|
||||||
{
|
|
||||||
DrawRectangle(150, 200, 500, 60, LIME);
|
|
||||||
DrawText("DATA LOADED!", 250, 210, 40, GREEN);
|
|
||||||
|
|
||||||
} break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawRectangleLines(150, 200, 500, 60, DARKGRAY);
|
|
||||||
|
|
||||||
EndDrawing();
|
|
||||||
//----------------------------------------------------------------------------------
|
|
||||||
}
|
|
||||||
|
|
||||||
// De-Initialization
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
CloseWindow(); // Close window and OpenGL context
|
|
||||||
//--------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loading data thread function definition
|
|
||||||
static void *LoadDataThread(void *arg)
|
|
||||||
{
|
|
||||||
int timeCounter = 0; // Time counted in ms
|
|
||||||
clock_t prevTime = clock(); // Previous time
|
|
||||||
|
|
||||||
// We simulate data loading with a time counter for 5 seconds
|
|
||||||
while (timeCounter < 5000)
|
|
||||||
{
|
|
||||||
clock_t currentTime = clock() - prevTime;
|
|
||||||
timeCounter = currentTime*1000/CLOCKS_PER_SEC;
|
|
||||||
|
|
||||||
// We accumulate time over a global variable to be used in
|
|
||||||
// main thread as a progress bar
|
|
||||||
atomic_store_explicit(&dataProgress, timeCounter/10, memory_order_relaxed);
|
|
||||||
}
|
|
||||||
|
|
||||||
// When data has finished loading, we set global variable
|
|
||||||
atomic_store_explicit(&dataLoaded, true, memory_order_relaxed);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 15 KiB |
160
examples/core/core_monitor_detector.c
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - monitor detector
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6
|
||||||
|
*
|
||||||
|
* Example contributed by Maicon Santana (@maiconpintoabreu) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Maicon Santana (@maiconpintoabreu)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#define MAX_MONITORS 10
|
||||||
|
|
||||||
|
// Monitor info
|
||||||
|
typedef struct MonitorInfo {
|
||||||
|
Vector2 position;
|
||||||
|
const char *name;
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int physicalWidth;
|
||||||
|
int physicalHeight;
|
||||||
|
int refreshRate;
|
||||||
|
} MonitorInfo;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - monitor detector");
|
||||||
|
|
||||||
|
MonitorInfo monitors[MAX_MONITORS] = { 0 };
|
||||||
|
int currentMonitorIndex = GetCurrentMonitor();
|
||||||
|
int monitorCount = 0;
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Variables to find the max x and Y to calculate the scale
|
||||||
|
int maxWidth = 1;
|
||||||
|
int maxHeight = 1;
|
||||||
|
|
||||||
|
// Monitor offset is to fix when monitor position x is negative
|
||||||
|
int monitorOffsetX = 0;
|
||||||
|
|
||||||
|
// Rebuild monitors array every frame
|
||||||
|
monitorCount = GetMonitorCount();
|
||||||
|
for (int i = 0; i < monitorCount; i++)
|
||||||
|
{
|
||||||
|
monitors[i] = (MonitorInfo){
|
||||||
|
GetMonitorPosition(i),
|
||||||
|
GetMonitorName(i),
|
||||||
|
GetMonitorWidth(i),
|
||||||
|
GetMonitorHeight(i),
|
||||||
|
GetMonitorPhysicalWidth(i),
|
||||||
|
GetMonitorPhysicalHeight(i),
|
||||||
|
GetMonitorRefreshRate(i)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (monitors[i].position.x < monitorOffsetX) monitorOffsetX = -(int)monitors[i].position.x;
|
||||||
|
|
||||||
|
const int width = (int)monitors[i].position.x + monitors[i].width;
|
||||||
|
const int height = (int)monitors[i].position.y + monitors[i].height;
|
||||||
|
|
||||||
|
if (maxWidth < width) maxWidth = width;
|
||||||
|
if (maxHeight < height) maxHeight = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsKeyPressed(KEY_ENTER) && (monitorCount > 1))
|
||||||
|
{
|
||||||
|
currentMonitorIndex += 1;
|
||||||
|
|
||||||
|
// Set index to 0 if the last one
|
||||||
|
if (currentMonitorIndex == monitorCount) currentMonitorIndex = 0;
|
||||||
|
|
||||||
|
SetWindowMonitor(currentMonitorIndex); // Move window to currentMonitorIndex
|
||||||
|
}
|
||||||
|
else currentMonitorIndex = GetCurrentMonitor(); // Get currentMonitorIndex if manually moved
|
||||||
|
|
||||||
|
float monitorScale = 0.6f;
|
||||||
|
|
||||||
|
if (maxHeight > (maxWidth + monitorOffsetX)) monitorScale *= ((float)screenHeight/(float)maxHeight);
|
||||||
|
else monitorScale *= ((float)screenWidth/(float)(maxWidth + monitorOffsetX));
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
DrawText("Press [Enter] to move window to next monitor available", 20, 20, 20, DARKGRAY);
|
||||||
|
|
||||||
|
DrawRectangleLines(20, 60, screenWidth - 40, screenHeight - 100, DARKGRAY);
|
||||||
|
|
||||||
|
// Draw Monitor Rectangles with information inside
|
||||||
|
for (int i = 0; i < monitorCount; i++)
|
||||||
|
{
|
||||||
|
// Calculate retangle position and size using monitorScale
|
||||||
|
const Rectangle rec = (Rectangle){
|
||||||
|
(monitors[i].position.x + monitorOffsetX)*monitorScale + 140,
|
||||||
|
monitors[i].position.y*monitorScale + 80,
|
||||||
|
monitors[i].width*monitorScale,
|
||||||
|
monitors[i].height*monitorScale
|
||||||
|
};
|
||||||
|
|
||||||
|
// Draw monitor name and information inside the rectangle
|
||||||
|
DrawText(TextFormat("[%i] %s", i, monitors[i].name), (int)rec.x + 10, (int)rec.y + (int)(100*monitorScale), (int)(120*monitorScale), BLUE);
|
||||||
|
DrawText(
|
||||||
|
TextFormat("Resolution: [%ipx x %ipx]\nRefreshRate: [%ihz]\nPhysical Size: [%imm x %imm]\nPosition: %3.0f x %3.0f",
|
||||||
|
monitors[i].width,
|
||||||
|
monitors[i].height,
|
||||||
|
monitors[i].refreshRate,
|
||||||
|
monitors[i].physicalWidth,
|
||||||
|
monitors[i].physicalHeight,
|
||||||
|
monitors[i].position.x,
|
||||||
|
monitors[i].position.y
|
||||||
|
), (int)rec.x + 10, (int)rec.y + (int)(200*monitorScale), (int)(120*monitorScale), DARKGRAY);
|
||||||
|
|
||||||
|
// Highlight current monitor
|
||||||
|
if (i == currentMonitorIndex)
|
||||||
|
{
|
||||||
|
DrawRectangleLinesEx(rec, 5, RED);
|
||||||
|
Vector2 windowPosition = (Vector2){ (GetWindowPosition().x + monitorOffsetX)*monitorScale + 140, GetWindowPosition().y*monitorScale + 80 };
|
||||||
|
|
||||||
|
// Draw window position based on monitors
|
||||||
|
DrawRectangleV(windowPosition, (Vector2){screenWidth*monitorScale, screenHeight*monitorScale}, Fade(GREEN, 0.5));
|
||||||
|
}
|
||||||
|
else DrawRectangleLinesEx(rec, 5, GRAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_monitor_detector.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Generates a random sequence
|
* raylib [core] example - random sequence
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -16,22 +16,25 @@
|
|||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
#include "raymath.h"
|
#include "raymath.h"
|
||||||
|
|
||||||
#include <stdlib.h> // Required for: malloc() and free()
|
#include <stdlib.h> // Required for: malloc(), free()
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Types and Structures Definition
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
typedef struct ColorRect {
|
typedef struct ColorRect {
|
||||||
Color c;
|
Color color;
|
||||||
Rectangle r;
|
Rectangle rect;
|
||||||
} ColorRect;
|
} ColorRect;
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Module functions declaration
|
// Module Functions Declaration
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
static Color GenerateRandomColor();
|
static Color GenerateRandomColor(void);
|
||||||
static ColorRect *GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight);
|
static ColorRect *GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight);
|
||||||
static void ShuffleColorRectSequence(ColorRect *rectangles, int rectCount);
|
static void ShuffleColorRectSequence(ColorRect *rectangles, int rectCount);
|
||||||
static void DrawTextCenterKeyHelp(const char *key, const char *text, int posX, int posY, int fontSize, Color color);
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
@ -43,7 +46,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - Generates a random sequence");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - random sequence");
|
||||||
|
|
||||||
int rectCount = 20;
|
int rectCount = 20;
|
||||||
float rectSize = (float)screenWidth/rectCount;
|
float rectSize = (float)screenWidth/rectCount;
|
||||||
@ -63,7 +66,9 @@ int main(void)
|
|||||||
{
|
{
|
||||||
rectCount++;
|
rectCount++;
|
||||||
rectSize = (float)screenWidth/rectCount;
|
rectSize = (float)screenWidth/rectCount;
|
||||||
free(rectangles);
|
RL_FREE(rectangles);
|
||||||
|
|
||||||
|
// Re-generate random sequence with new count
|
||||||
rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f*screenHeight);
|
rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f*screenHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +78,9 @@ int main(void)
|
|||||||
{
|
{
|
||||||
rectCount--;
|
rectCount--;
|
||||||
rectSize = (float)screenWidth/rectCount;
|
rectSize = (float)screenWidth/rectCount;
|
||||||
free(rectangles);
|
RL_FREE(rectangles);
|
||||||
|
|
||||||
|
// Re-generate random sequence with new count
|
||||||
rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f*screenHeight);
|
rectangles = GenerateRandomColorRectSequence((float)rectCount, rectSize, (float)screenWidth, 0.75f*screenHeight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,20 +92,20 @@ int main(void)
|
|||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
int fontSize = 20;
|
|
||||||
for (int i = 0; i < rectCount; i++)
|
for (int i = 0; i < rectCount; i++)
|
||||||
{
|
{
|
||||||
DrawRectangleRec(rectangles[i].r, rectangles[i].c);
|
DrawRectangleRec(rectangles[i].rect, rectangles[i].color);
|
||||||
DrawTextCenterKeyHelp("SPACE", "to shuffle the sequence.", 10, screenHeight - 96, fontSize, BLACK);
|
|
||||||
DrawTextCenterKeyHelp("UP", "to add a rectangle and generate a new sequence.", 10, screenHeight - 64, fontSize, BLACK);
|
DrawText("Press SPACE to shuffle the sequence", 10, screenHeight - 96, 20, BLACK);
|
||||||
DrawTextCenterKeyHelp("DOWN", "to remove a rectangle and generate a new sequence.", 10, screenHeight - 32, fontSize, BLACK);
|
|
||||||
|
DrawText("Press SPACE to shuffle the current sequence", 10, screenHeight - 96, 20, BLACK);
|
||||||
|
DrawText("Press UP to add a rectangle and generate a new sequence", 10, screenHeight - 64, 20, BLACK);
|
||||||
|
DrawText("Press DOWN to remove a rectangle and generate a new sequence", 10, screenHeight - 32, 20, BLACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *rectCountText = TextFormat("%d rectangles", rectCount);
|
DrawText(TextFormat("Count: %d rectangles", rectCount), 10, 10, 20, MAROON);
|
||||||
int rectCountTextSize = MeasureText(rectCountText, fontSize);
|
|
||||||
DrawText(rectCountText, screenWidth - rectCountTextSize - 10, 10, fontSize, BLACK);
|
|
||||||
|
|
||||||
DrawFPS(10, 10);
|
DrawFPS(screenWidth - 80, 10);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
@ -114,9 +121,9 @@ int main(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Module functions definition
|
// Module Functions Definition
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
static Color GenerateRandomColor()
|
static Color GenerateRandomColor(void)
|
||||||
{
|
{
|
||||||
Color color = {
|
Color color = {
|
||||||
GetRandomValue(0, 255),
|
GetRandomValue(0, 255),
|
||||||
@ -130,7 +137,8 @@ static Color GenerateRandomColor()
|
|||||||
|
|
||||||
static ColorRect *GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight)
|
static ColorRect *GenerateRandomColorRectSequence(float rectCount, float rectWidth, float screenWidth, float screenHeight)
|
||||||
{
|
{
|
||||||
ColorRect *rectangles = (ColorRect *)malloc((int)rectCount*sizeof(ColorRect));
|
ColorRect *rectangles = (ColorRect *)RL_CALLOC((int)rectCount, sizeof(ColorRect));
|
||||||
|
|
||||||
int *seq = LoadRandomSequence((unsigned int)rectCount, 0, (unsigned int)rectCount - 1);
|
int *seq = LoadRandomSequence((unsigned int)rectCount, 0, (unsigned int)rectCount - 1);
|
||||||
float rectSeqWidth = rectCount*rectWidth;
|
float rectSeqWidth = rectCount*rectWidth;
|
||||||
float startX = (screenWidth - rectSeqWidth)*0.5f;
|
float startX = (screenWidth - rectSeqWidth)*0.5f;
|
||||||
@ -139,8 +147,8 @@ static ColorRect *GenerateRandomColorRectSequence(float rectCount, float rectWid
|
|||||||
{
|
{
|
||||||
int rectHeight = (int)Remap((float)seq[i], 0, rectCount - 1, 0, screenHeight);
|
int rectHeight = (int)Remap((float)seq[i], 0, rectCount - 1, 0, screenHeight);
|
||||||
|
|
||||||
rectangles[i].c = GenerateRandomColor();
|
rectangles[i].color = GenerateRandomColor();
|
||||||
rectangles[i].r = CLITERAL(Rectangle){ startX + i*rectWidth, screenHeight - rectHeight, rectWidth, (float)rectHeight };
|
rectangles[i].rect = CLITERAL(Rectangle){ startX + i*rectWidth, screenHeight - rectHeight, rectWidth, (float)rectHeight };
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadRandomSequence(seq);
|
UnloadRandomSequence(seq);
|
||||||
@ -159,29 +167,13 @@ static void ShuffleColorRectSequence(ColorRect *rectangles, int rectCount)
|
|||||||
|
|
||||||
// Swap only the color and height
|
// Swap only the color and height
|
||||||
ColorRect tmp = *r1;
|
ColorRect tmp = *r1;
|
||||||
r1->c = r2->c;
|
r1->color = r2->color;
|
||||||
r1->r.height = r2->r.height;
|
r1->rect.height = r2->rect.height;
|
||||||
r1->r.y = r2->r.y;
|
r1->rect.y = r2->rect.y;
|
||||||
r2->c = tmp.c;
|
r2->color = tmp.color;
|
||||||
r2->r.height = tmp.r.height;
|
r2->rect.height = tmp.rect.height;
|
||||||
r2->r.y = tmp.r.y;
|
r2->rect.y = tmp.rect.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnloadRandomSequence(seq);
|
UnloadRandomSequence(seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DrawTextCenterKeyHelp(const char *key, const char *text, int posX, int posY, int fontSize, Color color)
|
|
||||||
{
|
|
||||||
int spaceSize = MeasureText(" ", fontSize);
|
|
||||||
int pressSize = MeasureText("Press", fontSize);
|
|
||||||
int keySize = MeasureText(key, fontSize);
|
|
||||||
int textSize = MeasureText(text, fontSize);
|
|
||||||
int textSizeCurrent = 0;
|
|
||||||
|
|
||||||
DrawText("Press", posX, posY, fontSize, color);
|
|
||||||
textSizeCurrent += pressSize + 2*spaceSize;
|
|
||||||
DrawText(key, posX + textSizeCurrent, posY, fontSize, RED);
|
|
||||||
DrawRectangle(posX + textSizeCurrent, posY + fontSize, keySize, 3, RED);
|
|
||||||
textSizeCurrent += keySize + 2*spaceSize;
|
|
||||||
DrawText(text, posX + textSizeCurrent, posY, fontSize, color);
|
|
||||||
}
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Generate random values
|
* raylib [core] example - random values
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
@ -25,7 +25,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - generate random values");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - random values");
|
||||||
|
|
||||||
// SetRandomSeed(0xaabbccff); // Set a custom random seed if desired, by default: "time(NULL)"
|
// SetRandomSeed(0xaabbccff); // Set a custom random seed if desired, by default: "time(NULL)"
|
||||||
|
|
||||||
|
|||||||
101
examples/core/core_render_texture.c
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - render texture
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//---------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - render texture");
|
||||||
|
|
||||||
|
// Define a render texture to render
|
||||||
|
int renderTextureWidth = 300;
|
||||||
|
int renderTextureHeight = 300;
|
||||||
|
RenderTexture2D target = LoadRenderTexture(renderTextureWidth, renderTextureHeight);
|
||||||
|
|
||||||
|
Vector2 ballPosition = { renderTextureWidth/2.0f, renderTextureHeight/2.0f };
|
||||||
|
Vector2 ballSpeed = { 5.0f, 4.0f };
|
||||||
|
int ballRadius = 20;
|
||||||
|
|
||||||
|
float rotation = 0.0f;
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// Ball movement logic
|
||||||
|
ballPosition.x += ballSpeed.x;
|
||||||
|
ballPosition.y += ballSpeed.y;
|
||||||
|
|
||||||
|
// Check walls collision for bouncing
|
||||||
|
if ((ballPosition.x >= (renderTextureWidth - ballRadius)) || (ballPosition.x <= ballRadius)) ballSpeed.x *= -1.0f;
|
||||||
|
if ((ballPosition.y >= (renderTextureHeight - ballRadius)) || (ballPosition.y <= ballRadius)) ballSpeed.y *= -1.0f;
|
||||||
|
|
||||||
|
// Render texture rotation
|
||||||
|
rotation += 0.5f;
|
||||||
|
//-----------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//-----------------------------------------------------
|
||||||
|
// Draw our scene to the render texture
|
||||||
|
BeginTextureMode(target);
|
||||||
|
|
||||||
|
ClearBackground(SKYBLUE);
|
||||||
|
|
||||||
|
DrawRectangle(0, 0, 20, 20, RED);
|
||||||
|
DrawCircleV(ballPosition, (float)ballRadius, MAROON);
|
||||||
|
|
||||||
|
EndTextureMode();
|
||||||
|
|
||||||
|
// Draw render texture to main framebuffer
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
// Draw our render texture with rotation applied
|
||||||
|
// NOTE 1: We set the origin of the texture to the center of the render texture
|
||||||
|
// NOTE 2: We flip vertically the texture setting negative source rectangle height
|
||||||
|
DrawTexturePro(target.texture,
|
||||||
|
(Rectangle){ 0, 0, (float)target.texture.width, (float)-target.texture.height },
|
||||||
|
(Rectangle){ screenWidth/2.0f, screenHeight/2.0f, (float)target.texture.width, (float)target.texture.height },
|
||||||
|
(Vector2){ target.texture.width/2.0f, target.texture.height/2.0f }, rotation, WHITE);
|
||||||
|
|
||||||
|
DrawText("DRAWING BOUNCING BALL INSIDE RENDER TEXTURE!", 10, screenHeight - 40, 20, BLACK);
|
||||||
|
|
||||||
|
|
||||||
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//-----------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//---------------------------------------------------------
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_render_texture.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Scissor test
|
* raylib [core] example - scissor test
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★☆☆☆] 1/4
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
*
|
*
|
||||||
|
|||||||
166
examples/core/core_screen_recording.c
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - screen recording
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.6-dev, last time updated with raylib 5.6-dev
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
// Using msf_gif library to record frames into GIF
|
||||||
|
#define MSF_GIF_IMPL
|
||||||
|
#include "msf_gif.h" // GIF recording functionality
|
||||||
|
|
||||||
|
#include <math.h> // Required for: sinf()
|
||||||
|
|
||||||
|
#define GIF_RECORD_FRAMERATE 5 // Record framerate, we get a frame every N frames
|
||||||
|
|
||||||
|
#define MAX_SINEWAVE_POINTS 256
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - screen recording");
|
||||||
|
|
||||||
|
bool gifRecording = false; // GIF recording state
|
||||||
|
unsigned int gifFrameCounter = 0; // GIF frames counter
|
||||||
|
MsfGifState gifState = { 0 }; // MSGIF context state
|
||||||
|
|
||||||
|
Vector2 circlePosition = { 0.0f, screenHeight/2.0f };
|
||||||
|
float timeCounter = 0.0f;
|
||||||
|
|
||||||
|
// Get sine wave points for line drawing
|
||||||
|
Vector2 sinePoints[MAX_SINEWAVE_POINTS] = { 0 };
|
||||||
|
for (int i = 0; i < MAX_SINEWAVE_POINTS; i++)
|
||||||
|
{
|
||||||
|
sinePoints[i].x = i*GetScreenWidth()/180.0f;
|
||||||
|
sinePoints[i].y = screenHeight/2.0f + 150*sinf((2*PI/1.5f)*(1.0f/60.0f)*(float)i); // Calculate for 60 fps
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
// Update circle sinusoidal movement
|
||||||
|
timeCounter += GetFrameTime();
|
||||||
|
circlePosition.x += GetScreenWidth()/180.0f;
|
||||||
|
circlePosition.y = screenHeight/2.0f + 150*sinf((2*PI/1.5f)*timeCounter);
|
||||||
|
if (circlePosition.x > screenWidth)
|
||||||
|
{
|
||||||
|
circlePosition.x = 0.0f;
|
||||||
|
circlePosition.y = screenHeight/2.0f;
|
||||||
|
timeCounter = 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start-Stop GIF recording on CTRL+R
|
||||||
|
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_R))
|
||||||
|
{
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
// Stop current recording and save file
|
||||||
|
gifRecording = false;
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
SaveFileData(TextFormat("%s/screenrecording.gif", GetApplicationDirectory()), result.data, (unsigned int)result.dataSize);
|
||||||
|
msf_gif_free(result);
|
||||||
|
|
||||||
|
TraceLog(LOG_INFO, "Finish animated GIF recording");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Start a new recording
|
||||||
|
gifRecording = true;
|
||||||
|
gifFrameCounter = 0;
|
||||||
|
msf_gif_begin(&gifState, GetRenderWidth(), GetRenderHeight());
|
||||||
|
|
||||||
|
TraceLog(LOG_INFO, "Start animated GIF recording");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
gifFrameCounter++;
|
||||||
|
|
||||||
|
// NOTE: We record one gif frame depending on the desired gif framerate
|
||||||
|
if (gifFrameCounter > GIF_RECORD_FRAMERATE)
|
||||||
|
{
|
||||||
|
// Get image data for the current frame (from backbuffer)
|
||||||
|
// WARNING: This process is quite slow, it can generate stuttering
|
||||||
|
Image imScreen = LoadImageFromScreen();
|
||||||
|
|
||||||
|
// Add the frame to the gif recording, providing and "estimated" time for display in centiseconds
|
||||||
|
msf_gif_frame(&gifState, imScreen.data, (int)((1.0f/60.0f)*GIF_RECORD_FRAMERATE)/10, 16, imScreen.width*4);
|
||||||
|
gifFrameCounter = 0;
|
||||||
|
|
||||||
|
UnloadImage(imScreen); // Free image data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
for (int i = 0; i < (MAX_SINEWAVE_POINTS - 1); i++)
|
||||||
|
{
|
||||||
|
DrawLineV(sinePoints[i], sinePoints[i + 1], MAROON);
|
||||||
|
DrawCircleV(sinePoints[i], 3, MAROON);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawCircleV(circlePosition, 30, RED);
|
||||||
|
|
||||||
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Draw record indicator
|
||||||
|
// WARNING: If drawn here, it will appear in the recorded image,
|
||||||
|
// use a render texture instead for the recording and LoadImageFromTexture(rt.texture)
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
// Display the recording indicator every half-second
|
||||||
|
if ((int)(GetTime()/0.5)%2 == 1)
|
||||||
|
{
|
||||||
|
DrawCircle(30, GetScreenHeight() - 20, 10, MAROON);
|
||||||
|
DrawText("GIF RECORDING", 50, GetScreenHeight() - 25, 10, RED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
// If still recording a GIF on close window, just finish
|
||||||
|
if (gifRecording)
|
||||||
|
{
|
||||||
|
MsfGifResult result = msf_gif_end(&gifState);
|
||||||
|
msf_gif_free(result);
|
||||||
|
gifRecording = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_screen_recording.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Smooth Pixel-perfect camera
|
* raylib [core] example - smooth pixelperfect
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★★☆] 3/4
|
* Example complexity rating: [★★★☆] 3/4
|
||||||
*
|
*
|
||||||
@ -35,7 +35,7 @@ int main(void)
|
|||||||
|
|
||||||
const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth;
|
const float virtualRatio = (float)screenWidth/(float)virtualScreenWidth;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixel-perfect camera");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - smooth pixelperfect");
|
||||||
|
|
||||||
Camera2D worldSpaceCamera = { 0 }; // Game world camera
|
Camera2D worldSpaceCamera = { 0 }; // Game world camera
|
||||||
worldSpaceCamera.zoom = 1.0f;
|
worldSpaceCamera.zoom = 1.0f;
|
||||||
@ -43,7 +43,8 @@ int main(void)
|
|||||||
Camera2D screenSpaceCamera = { 0 }; // Smoothing camera
|
Camera2D screenSpaceCamera = { 0 }; // Smoothing camera
|
||||||
screenSpaceCamera.zoom = 1.0f;
|
screenSpaceCamera.zoom = 1.0f;
|
||||||
|
|
||||||
RenderTexture2D target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); // This is where we'll draw all our objects.
|
// Load render texture to draw all our objects
|
||||||
|
RenderTexture2D target = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight);
|
||||||
|
|
||||||
Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f };
|
Rectangle rec01 = { 70.0f, 35.0f, 20.0f, 20.0f };
|
||||||
Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f };
|
Rectangle rec02 = { 90.0f, 55.0f, 30.0f, 10.0f };
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*******************************************************************************************
|
/*******************************************************************************************
|
||||||
*
|
*
|
||||||
* raylib [core] example - Storage save/load values
|
* raylib [core] example - storage values
|
||||||
*
|
*
|
||||||
* Example complexity rating: [★★☆☆] 2/4
|
* Example complexity rating: [★★☆☆] 2/4
|
||||||
*
|
*
|
||||||
@ -25,7 +25,9 @@ typedef enum {
|
|||||||
STORAGE_POSITION_HISCORE = 1
|
STORAGE_POSITION_HISCORE = 1
|
||||||
} StorageData;
|
} StorageData;
|
||||||
|
|
||||||
// Persistent storage functions
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
static bool SaveStorageValue(unsigned int position, int value);
|
static bool SaveStorageValue(unsigned int position, int value);
|
||||||
static int LoadStorageValue(unsigned int position);
|
static int LoadStorageValue(unsigned int position);
|
||||||
|
|
||||||
@ -39,7 +41,7 @@ int main(void)
|
|||||||
const int screenWidth = 800;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 450;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [core] example - storage save/load values");
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - storage values");
|
||||||
|
|
||||||
int score = 0;
|
int score = 0;
|
||||||
int hiscore = 0;
|
int hiscore = 0;
|
||||||
@ -101,6 +103,9 @@ int main(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Module Functions Declaration
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
// Save integer value to storage file (to defined position)
|
// Save integer value to storage file (to defined position)
|
||||||
// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
|
// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
|
||||||
bool SaveStorageValue(unsigned int position, int value)
|
bool SaveStorageValue(unsigned int position, int value)
|
||||||
|
|||||||
173
examples/core/core_text_file_loading.c
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*******************************************************************************************
|
||||||
|
*
|
||||||
|
* raylib [core] example - text file loading
|
||||||
|
*
|
||||||
|
* Example complexity rating: [★☆☆☆] 1/4
|
||||||
|
*
|
||||||
|
* Example originally created with raylib 5.5, last time updated with raylib 5.6
|
||||||
|
*
|
||||||
|
* Example contributed by Aanjishnu Bhattacharyya (@NimComPoo-04) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Example licensed under an unmodified zlib/libpng license, which is an OSI-certified,
|
||||||
|
* BSD-like license that allows static linking with closed source software
|
||||||
|
*
|
||||||
|
* Copyright (c) 0 Aanjishnu Bhattacharyya (@NimComPoo-04)
|
||||||
|
*
|
||||||
|
********************************************************************************************/
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
|
#include "raymath.h" // Required for: Lerp()
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
// Program main entry point
|
||||||
|
//------------------------------------------------------------------------------------
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [core] example - text file loading");
|
||||||
|
|
||||||
|
// Setting up the camera
|
||||||
|
Camera2D cam = {
|
||||||
|
.offset = {0, 0},
|
||||||
|
.target = {0, 0},
|
||||||
|
.rotation = 0,
|
||||||
|
.zoom = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
// Loading text file from resources/text_file.txt
|
||||||
|
const char *fileName = "resources/text_file.txt";
|
||||||
|
char *text = LoadFileText(fileName);
|
||||||
|
|
||||||
|
// Loading all the text lines
|
||||||
|
int lineCount = 0;
|
||||||
|
char **lines = LoadTextLines(text, &lineCount);
|
||||||
|
|
||||||
|
// Stylistic choises
|
||||||
|
int fontSize = 20;
|
||||||
|
int textTop = 25 + fontSize; // Top of the screen from where the text is rendered
|
||||||
|
int wrapWidth = screenWidth - 20;
|
||||||
|
|
||||||
|
// Wrap the lines as needed
|
||||||
|
for (int i = 0; i < lineCount; i++)
|
||||||
|
{
|
||||||
|
int j = 0;
|
||||||
|
int lastSpace = 0; // Keeping track of last valid space to insert '\n'
|
||||||
|
int lastWrapStart = 0; // Keeping track of the start of this wrapped line.
|
||||||
|
|
||||||
|
while (j <= strlen(lines[i]))
|
||||||
|
{
|
||||||
|
if (lines[i][j] == ' ' || lines[i][j] == '\0')
|
||||||
|
{
|
||||||
|
char before = lines[i][j];
|
||||||
|
// Making a C Style string by adding a '\0' at the required location so that we can use the MeasureText function
|
||||||
|
lines[i][j] = '\0';
|
||||||
|
|
||||||
|
// Checking if the text has crossed the wrapWidth, then going back and inserting a newline
|
||||||
|
if (MeasureText(lines[i] + lastWrapStart, fontSize) > wrapWidth)
|
||||||
|
{
|
||||||
|
lines[i][lastSpace] = '\n';
|
||||||
|
|
||||||
|
// Since we added a newline the place of wrap changed so we update our lastWrapStart
|
||||||
|
lastWrapStart = lastSpace + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(before != '\0') lines[i][j] = ' '; // Resetting the space back
|
||||||
|
lastSpace = j; // Since we encountered a new space we update our last encountered space location
|
||||||
|
}
|
||||||
|
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculating the total height so that we can show a scrollbar
|
||||||
|
int textHeight = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < lineCount; i++)
|
||||||
|
{
|
||||||
|
Vector2 size = MeasureTextEx(GetFontDefault(), lines[i], (float)fontSize, 2);
|
||||||
|
textHeight += (int)size.y + 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
// A simple scrollbar on the side to show how far we have read into the file
|
||||||
|
Rectangle scrollBar = {
|
||||||
|
.x = (float)screenWidth - 5,
|
||||||
|
.y = 0,
|
||||||
|
.width = 5,
|
||||||
|
.height = screenHeight*100.0f/(textHeight - screenHeight) // Scrollbar height is just a percentage
|
||||||
|
};
|
||||||
|
|
||||||
|
SetTargetFPS(60);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
float scroll = GetMouseWheelMove();
|
||||||
|
cam.target.y -= scroll*fontSize*1.5f; // Choosing an arbitrary speed for scroll
|
||||||
|
|
||||||
|
if (cam.target.y < 0) cam.target.y = 0; // Snapping to 0 if we go too far back
|
||||||
|
|
||||||
|
// Ensuring that the camera does not scroll past all text
|
||||||
|
if (cam.target.y > textHeight - screenHeight + textTop)
|
||||||
|
cam.target.y = (float)textHeight - screenHeight + textTop;
|
||||||
|
|
||||||
|
// Computing the position of the scrollBar depending on the percentage of text covered
|
||||||
|
scrollBar.y = Lerp((float)textTop, (float)screenHeight - scrollBar.height, (float)(cam.target.y - textTop)/(textHeight - screenHeight));
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
BeginMode2D(cam);
|
||||||
|
// Going through all the read lines
|
||||||
|
for (int i = 0, t = textTop; i < lineCount; i++)
|
||||||
|
{
|
||||||
|
// Each time we go through and calculate the height of the text to move the cursor appropriately
|
||||||
|
Vector2 size;
|
||||||
|
if(strcmp(lines[i], "")){
|
||||||
|
// Fix for empty line in the text file
|
||||||
|
size = MeasureTextEx( GetFontDefault(), lines[i], (float)fontSize, 2);
|
||||||
|
}else{
|
||||||
|
size = MeasureTextEx( GetFontDefault(), " ", (float)fontSize, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawText(lines[i], 10, t, fontSize, RED);
|
||||||
|
|
||||||
|
// Inserting extra space for real newlines,
|
||||||
|
// wrapped lines are rendered closer together
|
||||||
|
t += (int)size.y + 10;
|
||||||
|
}
|
||||||
|
EndMode2D();
|
||||||
|
|
||||||
|
// Header displaying which file is being read currently
|
||||||
|
DrawRectangle(0, 0, screenWidth, textTop - 10, BEIGE);
|
||||||
|
DrawText(TextFormat("File: %s", fileName), 10, 10, fontSize, MAROON);
|
||||||
|
|
||||||
|
DrawRectangleRec(scrollBar, MAROON);
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
UnloadTextLines(lines, lineCount);
|
||||||
|
UnloadFileText(text);
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
BIN
examples/core/core_text_file_loading.png
Normal file
|
After Width: | Height: | Size: 23 KiB |