322 Commits

Author SHA1 Message Date
RuiFPB 88d6e25f1a Update format check workflow
PR build check / Build (pull_request) Has been cancelled
PR C++ format check / Check clang format (pull_request) Failing after 3s
2026-06-11 01:10:41 +01:00
RuiFPB 3b2f25c6c4 Template as submodule
PR C++ format check / Check clang format (push) Failing after 22s
PR build check / Build (pull_request) Successful in 8m16s
PR C++ format check / Check clang format (pull_request) Failing after 4s
2026-06-11 01:02:28 +01:00
RuiFPB c1d4f7b9db Add linux config to template folder
Official build / Build (push) Successful in 8m24s
2026-06-11 00:47:22 +01:00
RuiFPB a5e3fc57b3 Remove CUSTOM_PCSX2_PATH setup from script.
Official build / Build (push) Successful in 8m30s
Now setting the environment variable before should work
2026-06-11 00:24:47 +01:00
RuiFPB 92c58f28b8 Fix TZData setup on dependency install of actions workflow
Official build / Build (push) Successful in 8m6s
2026-05-24 21:58:56 +01:00
RuiFPB d4dc1ac4c5 Fix dependency install on actions scripts.
Official build / Build (push) Has been cancelled
(Generated by Gemini 3.5 Flash)
2026-05-24 21:56:09 +01:00
RuiFPB bf1c41f3e1 Adding bash scripts to the project.
Official build / Build (push) Failing after 1m20s
(Scripts generated by Antigravity with Gemini Flash 3.5)
2026-05-24 21:42:26 +01:00
Sandro Sobczyński 92734168a2 Update README.MD 2025-07-23 18:34:49 +02:00
Sandro Sobczyński c0f5f06eb4 Update README.MD 2025-07-23 18:34:34 +02:00
Sandro Sobczyński b7bc5f2f0a Merge pull request #199 from GDQR/Texture-Buffer
Fix: width of texture buffer for pallete color
2024-10-01 19:33:18 +02:00
Guido Diego Quispe Robles e8c0cfce1f Fix: width of texture buffer for pallete color 2024-09-01 18:54:42 -03:00
Sandro Sobczyński 1e396fb1a3 Update README.MD 2024-02-12 00:55:51 +01:00
Sandro Sobczyński 2b5839a4a8 Merge pull request #185 from h4570/178-vcl-problem-link
Dockerfile fix
2024-02-12 00:46:45 +01:00
h4570 0810f12949 Dockerfile fix 2024-02-12 00:45:59 +01:00
Sandro Sobczyński 04d105ca0e Merge pull request #183 from h4570/182-glitched-texture-on-skybox
Fix glitched textures
2024-02-12 00:21:22 +01:00
h4570 93e7aa5e19 Remove debug code 2024-02-12 00:14:33 +01:00
h4570 3c2ad09870 Docs changes 2024-02-12 00:10:59 +01:00
h4570 1dbd2d6a5a Fix glitched texture 2024-02-12 00:10:40 +01:00
Sandro Sobczyński 4f21626136 Merge pull request #181 from h4570/new-rel
new-rel -> master
2024-02-11 14:14:49 +01:00
Sandro Sobczyński 50a9070d2d Merge pull request #180 from Wellinator/feature/texture_wraping
Adds support for texture region repeat
2024-02-11 13:38:20 +01:00
Sandro Sobczyński 8ed34abb83 Merge pull request #175 from GuidoDQR/texture-generation-id
Texture generation id
2024-02-11 13:36:18 +01:00
Sandro Sobczyński f6ebd079f5 Merge pull request #174 from GuidoDQR/fix-load-sprite
Fix sprite loading
2024-02-11 13:35:29 +01:00
Wellinator 0f7083aa5b chore: fix cppcheck validation 2024-02-01 10:30:13 -03:00
Wellinator 9baad8199a Merge branch 'master' into feature/texture_wraping 2024-01-31 18:28:19 -03:00
Wellinator 5eafc0bdba chore: add tutorial 11, texture region repeat 2024-01-31 18:27:34 -03:00
Wellinator c3c649dcdc chore: add tutorial 11 ignore files 2024-01-31 18:15:36 -03:00
Wellinator 1c4a84dffa chore: implements updateTextureInfo for texture packet update 2024-01-31 17:57:19 -03:00
Wellinator f727dae150 refactore: change method from private to public 2024-01-31 17:53:20 -03:00
Wellinator 9b24ea3bb6 feat: allow changing the texture wrap settings 2024-01-31 14:27:48 -03:00
Guido Diego Quispe Robles 586180764e Update png_loader.cpp
optimization
2024-01-25 01:33:15 -03:00
Guido Diego Quispe Robles a329ea73cc new namespace 2024-01-24 12:13:01 -03:00
Guido Diego Quispe Robles 5418e28b73 Update texture.cpp
initial texturecounter is 0 because texture buffer can't be 0.
if id is 0 always create a texture buffer.
2024-01-18 22:27:03 -03:00
Guido Diego Quispe Robles d773173ece id generation texture 2024-01-18 21:53:38 -03:00
Guido Diego Quispe Robles aa21baaaf2 change core width and clut width 2024-01-04 22:11:10 -03:00
Sandro Sobczyński 0c0fcd697f Merge pull request #173 from GuidoDQR/rsync
Fixed rsync warning from copy source code to docker volume
2024-01-02 21:10:17 +01:00
Guido Diego Quispe Robles e07cfc502a Update tasks.json
fixes rsync issue and prevents files from disappearing:
rsync warning: some files vanished before they could be transferred (code 24)
2023-12-28 09:16:44 -03:00
Sandro Sobczyński ab08a385a6 Merge pull request #172 from h4570/support-new-pcsx2
Add support for new PCSX2
2023-11-25 16:55:36 +01:00
h4570 8642959d70 run in background 2023-11-25 16:36:08 +01:00
h4570 19ae6de1c7 add support for new pcsx2 2023-11-25 16:12:55 +01:00
h4570 c40558bd54 move vcl from my server to github repo 2023-11-25 14:12:42 +01:00
Sandro Sobczyński 700e878e61 Merge pull request #170 from h4570/misc-cleanup-wolf
Minor fixes
2023-11-13 20:15:10 +01:00
h4570 9ee1df81e6 Merge branch 'master' into misc-cleanup-wolf 2023-11-13 20:08:33 +01:00
Sandro Sobczyński 22ecaffe1b Merge pull request #155 from Wolf3s/Cleanup
misc cleanup
2023-11-13 19:53:02 +01:00
h4570 26285c54e9 add israpps to readme 2023-11-13 19:46:44 +01:00
h4570 a52e2bec0e move assets to github repo 2023-11-13 19:40:19 +01:00
Sandro Sobczyński 5583c7bc92 remove sha step 2023-11-13 19:12:39 +01:00
Sandro Sobczyński b8e5309119 rename artifacts 2023-11-13 19:11:05 +01:00
Sandro Sobczyński fdc5450181 Merge pull request #169 from h4570/github-actions
Github Actions refactor
2023-11-13 19:02:22 +01:00
Sandro Sobczyński 39a962c59b github actions bugfixes 2023-11-13 18:53:35 +01:00
Sandro Sobczyński b84bd99059 fix job name 2023-11-13 18:29:46 +01:00
Sandro Sobczyński caa0fd4db3 refactor github actions 2023-11-13 18:27:38 +01:00
Sandro Sobczyński daee3b4971 Merge pull request #168 from israpps/patch-5
add continous integration
2023-11-13 17:57:50 +01:00
Matías Israelson 02a23cd415 add continous integration 2023-11-13 10:23:57 -03:00
André Guilherme c2e653c059 Merge branch 'h4570:master' into Cleanup 2023-11-12 09:57:00 -03:00
Sandro Sobczyński 676ac34ec3 Merge pull request #151 from Wellinator/feature/posix-drivers
Feature posix drivers loading
2023-11-11 17:37:41 +01:00
Wellinator e229b34ad3 refactore: rename loadPOSIX to loadIO 2023-11-11 13:34:50 -03:00
Wellinator 67f70f80d8 Merge branch 'master' into feature/posix-drivers 2023-11-11 12:35:19 -03:00
Wellinator 1e046d9dda merge: merge changes from upstream master 2023-11-11 12:32:04 -03:00
Sandro Sobczyński 383cdb3675 Merge pull request #166 from israpps/patch-4
Compact IRX externs
2023-11-11 11:34:28 +01:00
israpps 795910de69 Update irx_loader.cpp 2023-11-10 14:45:57 -03:00
Matías Israelson b344fd4141 Compact IRX externs 2023-11-10 13:09:28 -03:00
Sandro Sobczyński b3ff38af06 Merge pull request #162 from GuidoDQR/screenDebug
Screen debug
2023-11-08 22:53:16 +01:00
Guido Diego Quispe Robles 19c673767c Debug Update
Screen debug for errors
2023-11-08 16:07:37 -03:00
Sandro Sobczyński 15a2dbb854 Merge pull request #161 from GuidoDQR/master
Fixed writeLogsToFile
2023-11-05 14:47:23 +01:00
Guido Diego Quispe Robles f4f527b877 Update debug.hpp
clang format
2023-11-04 23:28:09 -03:00
Guido Diego Quispe Robles ce4e2f663f optimization code
created writeInLogFile function

tested in real PS2 and emulator
2023-11-04 23:27:16 -03:00
Guido Diego Quispe Robles 7736f00d71 Update debug.hpp
formatted with clang
2023-11-04 22:40:13 -03:00
Guido Diego Quispe Robles 878adf5dbb Fix writeLogsToFile
Deleted logFile smart pointer and getLogFile function.
logfile created inside of the statics functions.
Debug.cpp can be deleted.
2023-11-04 22:35:13 -03:00
Sandro Sobczyński d2da130771 Update README.MD 2023-10-19 21:22:56 +02:00
Sandro Sobczyński 588f45e870 Update README.MD 2023-10-19 21:22:20 +02:00
André Guilherme b19d4f42f5 Merge branch 'h4570:master' into Cleanup 2023-07-27 10:10:31 -03:00
André Guilherme ea5849095e Update README.MD 2023-07-25 23:25:28 -03:00
Sandro Sobczyński e2790d93b6 Merge pull request #158 from freebytego/master
Fix music going too fast for first few seconds
2023-07-25 21:21:58 +02:00
freebytego 7401926202 Fix music going too fast for first few seconds 2023-07-25 08:51:43 +06:00
Wellinator 200a68e219 fix: accelerated audio 2023-07-24 14:43:21 -03:00
Wolf3s 699e5f0ff5 misc cleanup 2023-06-04 09:36:57 -03:00
Sandro Sobczyński e63ae14792 Merge pull request #154 from GuidoDQR/sprite-offset
* Added offset to 2D sprite (Guido Diego Quispe Robles)
* Added tutorial with font and texture atlas (Guido Diego Quispe Robles)
2023-05-29 18:59:48 +02:00
h4570 87b983153a change tyra version 2023-05-29 18:53:30 +02:00
h4570 cab934763f minor adjustments 2023-05-28 22:55:42 +02:00
Guido Diego Quispe Robles 20d2291a88 Update Tyra copyright 2023-05-28 16:46:32 -03:00
Guido Diego Quispe Robles 4f6e55c0b0 new Tutorial
tutorial with sprite offset, sprite sheet and texture filtering
2023-05-28 13:47:48 -03:00
Guido Diego Quispe Robles fbcb38d37a tutorial 10 2023-05-26 18:04:23 -03:00
Sandro Sobczyński a25594b95c Merge pull request #153 from nicholas477/master
Updated tyra install directions to include downloading assets
2023-04-22 23:38:26 +02:00
Nicholas 86c0ab74f1 Updated tyra install directions to include downloading assets 2023-04-14 12:52:42 -04:00
Wellinator 17d2d93d45 fix: irx loading order 2023-01-23 14:54:20 -03:00
Wellinator f546604ba3 fix: redefinition of ret 2023-01-23 10:27:55 -03:00
Wellinator d196290a3f fix: extern variables names 2023-01-23 10:24:24 -03:00
Wellinator 481ccd0cf9 feat: load fileXio and iomanX iop drivers 2023-01-23 10:19:18 -03:00
Declan Hopkins e3726600fd fix memory leak (#150) 2022-12-23 23:20:09 +01:00
Sandro Sobczyński 8b8500a1c9 Update README.MD 2022-09-05 00:08:38 +02:00
Sandro Sobczyński 789c795c14 Update README.MD 2022-09-04 22:59:11 +02:00
h4570 a0be9022ff Merge branch 'master' of https://github.com/h4570/tyra 2022-09-02 17:44:24 +02:00
h4570 77c6702f80 remove duplicated comments 2022-09-02 17:44:15 +02:00
Sandro Sobczyński d54cba9e58 Update README.MD 2022-09-02 11:21:56 +02:00
Wolf3s 958ddb4ab7 add some missing links on credits (#142) 2022-09-01 08:54:12 +02:00
Sandro Sobczyński edff3a85d5 Update README.MD 2022-08-31 09:37:42 +02:00
Sandro Sobczyński 165cc4221e Update README.MD 2022-08-31 09:36:42 +02:00
Wolf3s cc42bbf56b Update readme (#139) 2022-08-31 09:32:12 +02:00
Wolf3s a340540d55 Fix version (#138) 2022-08-30 22:40:04 +02:00
Sandro Sobczyński d790349ab9 Update README.MD 2022-08-30 11:26:12 +02:00
Wolf3s 0cecbf0a7d add ci cpp-check and clang format on tutorial_08.hpp (#137)
* Create check-format.yml

* Fix
2022-08-29 23:13:23 +02:00
Sandro Sobczyński f46b058ecf Update README.MD 2022-08-29 20:24:27 +02:00
Sandro Sobczyński c833f93db2 Update README.MD 2022-08-29 19:19:40 +02:00
Sandro Sobczyński 6dc73982f9 Update README.MD 2022-08-29 19:19:29 +02:00
Sandro Sobczyński 1fe12962b8 Merge pull request #136 from h4570/135-obj-get-texture-names-from-mtl-file-instead-of-material-name
Fix for obj loader and dynamic pipeline
2022-08-29 19:06:22 +02:00
h4570 e359bcbe2b patch 1 2022-08-29 19:00:47 +02:00
Sandro Sobczyński 13f4b5e626 Update README.MD 2022-08-29 17:16:45 +02:00
Sandro Sobczyński 2ae1ccd761 Update README.MD 2022-08-28 18:48:59 +02:00
h4570 d7013f302b Merge branch 'master' of https://github.com/h4570/tyra 2022-08-28 17:45:55 +02:00
h4570 b3fe92c996 Merge branch 'master' of https://github.com/h4570/tyra 2022-08-28 17:21:13 +02:00
h4570 822663f95e true fix 2022-08-28 17:21:10 +02:00
h4570 3f9bb33177 rename game setting 2022-08-28 17:11:12 +02:00
Sandro Sobczyński fa173f1e87 Update README.MD 2022-08-28 16:51:46 +02:00
h4570 f08da7b358 update extensions.json 2022-08-28 15:31:18 +02:00
h4570 945b9c462b fix template includes 2022-08-28 15:15:24 +02:00
h4570 c9535412a7 info about tutorials 2022-08-28 15:07:58 +02:00
Sandro Sobczyński 2c41930cb2 Update README.MD 2022-08-28 14:26:09 +02:00
h4570 2a4e2a2109 Merge branch 'master' of https://github.com/h4570/tyra 2022-08-28 13:50:34 +02:00
h4570 286b9e43a7 fix far plane 2022-08-28 13:50:32 +02:00
Sandro Sobczyński f62eaff37b Update README.MD 2022-08-27 15:37:32 +02:00
Sandro Sobczyński 48fa642cef Update README.MD 2022-08-25 00:03:34 +02:00
Sandro Sobczyński cad720a399 Update README.MD 2022-08-25 00:01:56 +02:00
Sandro Sobczyński cf3f5b3443 Update README.MD 2022-08-25 00:00:04 +02:00
Sandro Sobczyński 48a0eec86b Update README.MD 2022-08-24 23:42:02 +02:00
Sandro Sobczyński 6a9f3c6683 Update README.MD 2022-08-24 23:40:23 +02:00
Sandro Sobczyński 325fea1a8b Update README.MD 2022-08-24 23:36:00 +02:00
Sandro Sobczyński ce00f58b89 Update README.MD 2022-08-24 23:21:02 +02:00
h4570 5d4d2b0f06 remove roadmap text file 2022-08-24 23:20:16 +02:00
Sandro Sobczyński ca25a6de03 Update README.MD 2022-08-24 23:14:37 +02:00
Sandro Sobczyński a6c8eb5bce Update README.MD 2022-08-24 23:00:48 +02:00
Sandro Sobczyński 73b0cd90b4 Update README.MD 2022-08-24 23:00:01 +02:00
Sandro Sobczyński b69504c9b0 Merge pull request #125 from h4570/tyrav2-develop
Tyrav2 -> master
2022-08-24 22:54:58 +02:00
h4570 293113c4d0 fixed readme 2022-08-24 22:52:50 +02:00
h4570 ac335baa75 typo fix 2022-08-24 20:49:56 +02:00
h4570 0fd2478049 demo fixes 2022-08-24 19:50:11 +02:00
h4570 a21bcee671 finished tutorial 9 2022-08-24 19:27:16 +02:00
h4570 5c375dd24f finish 8 tutorial 2022-08-24 18:51:46 +02:00
h4570 b5147bba3a bbox fixes 2022-08-24 00:05:45 +02:00
h4570 989d2702e8 finished tutorial 7 2022-08-23 22:31:07 +02:00
h4570 9f831c7a6f finished 5 tutorial 2022-08-23 22:18:53 +02:00
h4570 3bbf3202ac tutorial templates 2022-08-23 09:57:34 +02:00
h4570 d469e78747 tutorial 04 2022-08-22 23:23:51 +02:00
h4570 4fa65fc535 overloads, tutorial 04 init 2022-08-21 19:44:47 +02:00
h4570 409ee294eb finished tutorial 03 2022-08-21 16:40:26 +02:00
h4570 4303cc2c97 add tutorial 2 comments 2022-08-20 21:44:00 +02:00
h4570 b4b48ae479 tutorial 1 and 2 2022-08-20 18:53:27 +02:00
h4570 d251df8704 irx, nullptr, threading patch 2022-08-20 16:38:44 +02:00
h4570 57767eee72 demo finish 2022-08-20 00:34:43 +02:00
h4570 405d5afd35 demo update 2022-08-20 00:10:07 +02:00
h4570 8eb01d34da ray bugfix 2022-08-19 20:19:05 +02:00
h4570 1456a79135 uncommented code 2022-08-18 23:55:23 +02:00
h4570 3817eadc14 render reorder 2022-08-18 23:09:35 +02:00
h4570 385849e3b2 fixed problem with compiler overoptimization 2022-08-18 23:06:07 +02:00
h4570 1ba2cb55b7 frustum check refactor 2022-08-18 09:51:13 +02:00
h4570 b9cde6346f roadmap update 2022-08-17 21:03:30 +02:00
h4570 a464fac9dc add hotfix 2022-08-17 13:37:54 +02:00
h4570 36098c9b62 add asm version of vec4 divide 2022-08-17 13:25:51 +02:00
h4570 2e41332dca small cleanup 2022-08-17 01:02:57 +02:00
h4570 fea2398699 utility functions 2022-08-17 00:19:23 +02:00
h4570 4fb0ab3b6c memory leak hotfix 2022-08-15 10:58:17 +02:00
h4570 2c3055c5a2 fixed typo in assert 2022-08-15 01:38:28 +02:00
h4570 60e3804c15 initial drawLine() 2022-08-15 01:37:24 +02:00
h4570 3af2493068 cleanup in vec4 2022-08-15 01:36:43 +02:00
Sandro Sobczyński ae0d5c52fd Merge pull request #124 from Wellinator/tyrav2-develop
refactor: improves ray box collision accuracy
2022-08-14 22:39:38 +02:00
Wellinator 83f07f4789 refactor: apply std min/max 2022-08-14 17:37:55 -03:00
Wellinator 0d15d0c7c8 feat: add vec4 division operator 2022-08-14 17:23:47 -03:00
Wellinator 0558dd7612 fix: MIN MAX definitions;
refactor: reduce t variables to Vec4
2022-08-14 17:20:33 -03:00
Wellinator 7a4ca89b14 refactor: implroves ray box collision accuracy 2022-08-14 16:52:06 -03:00
h4570 74c684fff8 mockup of utility functions 2022-08-14 21:07:16 +02:00
h4570 d0085e834e add getNormalized() 2022-08-14 20:59:59 +02:00
h4570 26596fa2c3 add basic shoot on enemy 2022-08-14 20:48:10 +02:00
h4570 37257b253a fix bbox const 2022-08-14 20:34:02 +02:00
h4570 d5261dbb0c change distance to output distance pointer 2022-08-14 20:29:56 +02:00
h4570 156973714b added missing const 2022-08-14 20:26:41 +02:00
h4570 65f40091db shoot action in demo 2022-08-14 20:20:56 +02:00
h4570 6e5b75e39b add print to ray 2022-08-14 20:20:03 +02:00
h4570 5c2ae9770e demo headers refactor 2022-08-14 20:11:57 +02:00
h4570 7ef0e73543 ray class api change 2022-08-14 20:01:49 +02:00
h4570 a78f430a6e add ship 2022-08-14 19:41:44 +02:00
h4570 b8aa40cba8 increased spammer count for stapip 2022-08-14 18:58:49 +02:00
h4570 58f45833fe fix typo in macro 2022-08-14 18:37:44 +02:00
h4570 03eaf726ed z buffer fix for minecraft pipeline 2022-08-14 18:18:41 +02:00
h4570 15391a81e0 z test patch 2022-08-14 18:05:57 +02:00
h4570 a9c91db594 change Ka to Kd in obj loader 2022-08-13 00:17:41 +02:00
h4570 8829bf3035 10 enemies in demo 2022-08-12 23:40:26 +02:00
h4570 2054dba4ec change enemy to monster 2022-08-12 12:04:52 +02:00
h4570 d65561487c enemy position and rotation 2022-08-12 10:24:40 +02:00
h4570 cbe346900d other fixes 2022-08-12 01:05:08 +02:00
h4570 00216da1cd minor audio fixes 2022-08-11 23:46:02 +02:00
h4570 472ab5c2ad audio rework 2022-08-11 23:18:50 +02:00
h4570 74c642bd83 minor fixes 2022-08-11 20:39:04 +02:00
h4570 5316abce42 demo roadmap 2022-08-11 10:32:00 +02:00
h4570 b6ffc11be3 cleanup 2022-08-11 10:20:35 +02:00
h4570 5f5f28b3fb skip not used materials 2022-08-10 22:43:10 +02:00
h4570 0a2d19b2d0 mesh refactor 3 2022-08-10 21:58:32 +02:00
h4570 10e0f52d44 math classes refactor 2022-08-10 20:51:19 +02:00
h4570 0df43e5a08 m4x4 identity 2022-08-10 19:22:59 +02:00
h4570 5cc5862810 obj options 2022-08-10 19:00:57 +02:00
h4570 a0898e7b4c mesh refactor 2 2022-08-10 17:57:42 +02:00
h4570 725c17f9d4 stapip patch 2022-08-10 17:46:07 +02:00
h4570 420a2d3eae add verbose logging 2022-08-10 10:32:50 +02:00
h4570 2dad96d396 mesh patch 1 2022-08-09 23:12:09 +02:00
h4570 6b45629595 Merge branch 'tyrav2-develop' of https://github.com/h4570/tyra into tyrav2-develop 2022-08-08 21:41:02 +02:00
h4570 0c4fff4f0c minor fixes 2022-08-08 21:40:47 +02:00
h4570 a3e4ee8496 obj loader refactor 2022-08-08 21:37:51 +02:00
h4570 599d44a491 add obj extension 2022-08-08 21:33:04 +02:00
h4570 5d632c36bf roadmap update 2022-08-08 21:32:49 +02:00
Sandro Sobczyński 01f4121242 Update bbox.cpp 2022-08-04 22:24:40 +02:00
h4570 153ebb52a5 mesh builder v2 2022-08-03 20:31:19 +02:00
h4570 689c8132d1 minor mesh refactor 2022-08-03 19:23:55 +02:00
h4570 82e5e87822 mcpip changes 2022-08-03 18:35:00 +02:00
h4570 0a024e745f renderer cleanup, demo changes 2022-08-03 10:37:27 +02:00
h4570 da958cb094 ztest option 2022-08-02 18:36:08 +02:00
h4570 5aae7cff7e demo skybox 2022-08-02 13:20:12 +02:00
h4570 cdadb932b7 clip comments 2022-08-01 18:37:49 +02:00
h4570 74668fba34 remove test code 2022-08-01 16:49:25 +02:00
h4570 4a9042b129 minor fixes 2022-08-01 13:37:48 +02:00
h4570 34b2956c08 demo buggy heightmap 2022-08-01 10:04:21 +02:00
h4570 47c323ec9e clip comments 2022-07-31 20:01:34 +02:00
h4570 4f3b731ad7 fixed clipper bug 2022-07-31 19:51:16 +02:00
h4570 b94ef8c416 demo player movement 2022-07-31 17:37:48 +02:00
h4570 12dd72f15e demo map and weapon 2022-07-31 16:24:46 +02:00
h4570 834d57ea32 demo memory leak fix 2022-07-31 11:52:49 +02:00
h4570 347fdb240b finished demo intro 2022-07-31 00:49:42 +02:00
h4570 bc1ac1b4a3 lod, prim refactor 2022-07-30 23:51:22 +02:00
h4570 927c10e82a deallocate pipeline in renderer on pipeline destroy 2022-07-30 18:17:48 +02:00
h4570 1bdb33e1a6 demo map 2022-07-30 17:00:22 +02:00
h4570 ff2967c7e5 support for 512x512 textures 2022-07-30 15:03:46 +02:00
h4570 b7b32fb35a demo 1 2022-07-30 14:48:59 +02:00
h4570 52a19f11a5 roadmap update 2022-07-29 23:11:54 +02:00
h4570 1a2f7026e5 fix copyrights 2022-07-29 23:11:12 +02:00
h4570 8591e35c4f add game template 2022-07-29 23:04:31 +02:00
h4570 d435d08cf8 fixed typos 2022-07-29 22:40:02 +02:00
h4570 b2f538bf1c roadmap fixes 2022-07-29 19:40:25 +02:00
h4570 97946e1c6d fixed textures overlapping 2022-07-29 19:04:55 +02:00
h4570 7ec6bb71b8 temporary fix for texture system 2022-07-28 23:54:53 +02:00
h4570 19e99eee56 fix coords 2022-07-28 21:29:58 +02:00
h4570 4366d6d6fb some bugfixes 2022-07-28 20:44:21 +02:00
h4570 960f4dd0c4 fix bug in deallocate tex 2022-07-28 11:51:16 +02:00
h4570 59077bcfe9 margin fix 2022-07-28 11:38:47 +02:00
h4570 e894039959 fix textures alloc problem 2022-07-28 11:34:28 +02:00
h4570 0107e888c7 vram margin fix 2022-07-28 11:02:52 +02:00
h4570 01e1d6adbf margin fix 2022-07-28 10:58:53 +02:00
h4570 31b7626bea fix roadmap 2022-07-28 10:52:59 +02:00
h4570 440f25d7d8 fix tex coords to full numbers 2022-07-28 10:52:38 +02:00
h4570 7a80c15ac8 disable interlacing and texture cache manager 2022-07-28 10:12:26 +02:00
h4570 dfb8bc73c3 add gitignore to bin 2022-07-27 00:15:15 +02:00
h4570 cf553b7376 remove irx file 2022-07-27 00:13:00 +02:00
h4570 af843fba87 add demo directory 2022-07-27 00:10:56 +02:00
h4570 21073a8a99 rename 2022-07-27 00:00:24 +02:00
h4570 b2c0bfbe11 fix roadmap 2022-07-26 23:17:42 +02:00
h4570 10164beadf some optimizations 2022-07-26 23:16:21 +02:00
h4570 97e44507ff obj loader 2022-07-26 20:27:01 +02:00
h4570 7a9b294945 free ram and tyrobj wip 2022-07-26 19:32:20 +02:00
h4570 70028a8f18 wellinator sample update 2022-07-25 21:18:15 +02:00
Sandro Sobczyński ff5757bf9b Merge pull request #121 from h4570/tyrav2-static-dynamic-pipelines
[Tyra2] Static/Dynamic pipeline/mesh
2022-07-25 21:11:05 +02:00
h4570 237066bfd4 finish of renderer refactor 2022-07-25 21:00:33 +02:00
h4570 0c63de8ac9 core renderer refactor finish 2022-07-25 20:10:46 +02:00
h4570 819a7c3de3 documentation update 2022-07-24 23:08:10 +02:00
h4570 c1f88d2f15 interlacing mode 2022-07-24 23:03:48 +02:00
h4570 7c1ab0bfaa texture allocation bugfix 2022-07-24 23:03:06 +02:00
h4570 9d18a81c2a vu1 packet spamming in static pipeline 2022-07-24 12:21:21 +02:00
h4570 cf8ca23ba9 small documentation 2022-07-23 21:47:18 +02:00
h4570 f5a7b7519e roadmap update 2022-07-23 21:14:17 +02:00
h4570 9a5993232a local todolist 2022-07-23 21:11:10 +02:00
h4570 91e425e0f8 small documentation 2022-07-23 21:05:20 +02:00
h4570 91ba265310 dynpip vu1 programs 2022-07-23 20:25:08 +02:00
h4570 1e2560c566 Merge branch 'tyrav2-develop' into tyrav2-static-dynamic-pipelines 2022-07-23 18:35:27 +02:00
h4570 23e98afe91 bbox fixes 2022-07-23 18:34:35 +02:00
h4570 e7a9230b59 vu1 animation 2022-07-23 18:32:38 +02:00
h4570 1ffba47119 spamming with vu1 packets 2 2022-07-23 15:55:38 +02:00
h4570 17d7634f1d Merge branch 'tyrav2-develop' into tyrav2-static-dynamic-pipelines 2022-07-23 14:37:17 +02:00
h4570 1ae7939cc3 tasks.json patch 2022-07-23 14:34:17 +02:00
h4570 22998fbbef allow recursive /res copy 2022-07-23 12:56:12 +02:00
h4570 c5aea0d50f spamming with multiple buffers to vu1 2022-07-22 00:12:36 +02:00
h4570 c8592e0c67 launching vu1 programs 2022-07-21 20:34:05 +02:00
h4570 0b60aa0f6d sending vu1 programs 2022-07-21 18:39:37 +02:00
h4570 aad634a241 Merge branch 'tyrav2-develop' into tyrav2-static-dynamic-pipelines 2022-07-21 17:56:17 +02:00
h4570 2c72abe081 dynamic pipeline - render 2022-07-21 17:47:10 +02:00
Sandro Sobczyński 04e89fd3a2 Merge pull request #117 from Wellinator/feature/tyrav2-physics
[Tyra2] Physics directory
2022-07-19 14:23:41 +02:00
Wellinator a9975c9da2 Merge branch 'tyrav2-develop' into feature/tyrav2-physics 2022-07-19 09:14:30 -03:00
Wellinator 81686a8033 refactor: apply review changes 2022-07-19 09:12:00 -03:00
Wellinator e7e4f375ba refactor: apply review changes 2022-07-19 08:59:04 -03:00
h4570 4e0785754e init of dynpip bag 2022-07-19 13:16:18 +02:00
h4570 86c11034bf roadmap update 2022-07-19 08:56:13 +02:00
Wellinator 07d7db97c2 feat: implements min and max bbox methods 2022-07-18 20:27:32 -03:00
h4570 7fd2926d1d some descriptions 2022-07-19 00:01:37 +02:00
h4570 dfd79a307e roadmap update 2022-07-18 23:53:25 +02:00
h4570 2fe40c8d90 dynpip rearrangment 2022-07-18 23:50:25 +02:00
h4570 f08fc1c8d3 bags refactor 2022-07-18 23:42:24 +02:00
h4570 0953ce3f19 init dynpip bag 2022-07-18 23:16:47 +02:00
h4570 efdec2c52e max vert count 2022-07-18 23:01:12 +02:00
h4570 9850028811 dynpip programs 2022-07-18 22:52:05 +02:00
h4570 a5e1a28164 dynpip files 2022-07-18 22:42:14 +02:00
h4570 95c01afa01 dynamic pipeline base 2022-07-18 21:49:38 +02:00
h4570 34c553af04 static mesh finish 2022-07-18 21:42:23 +02:00
Wellinator 85f4f2e666 refactor: moves isInFrustum from RenderBBox to CoreBBox 2022-07-18 16:11:46 -03:00
Wellinator f651ec76ac feat: implements ray 2022-07-18 16:11:18 -03:00
h4570 f249936981 dynamic mesh functions 2022-07-18 20:32:30 +02:00
h4570 c56c3d76db mesh base 2022-07-18 20:08:57 +02:00
h4570 ecfaef1b85 mesh -> dynamicmesh 2022-07-18 19:53:28 +02:00
h4570 bb02a3d9bf std pipeline rename 2022-07-18 19:46:28 +02:00
h4570 632be84ceb roadmap update 2022-07-18 19:33:14 +02:00
h4570 2797d71618 fixed gitignores 2022-07-17 11:31:46 +02:00
h4570 c8b22ff331 tyrav2 init 2022-07-17 10:21:35 +02:00
h4570 44c1ee4fe8 remove tyrav1 stuff 2022-07-17 10:15:37 +02:00
Sandro Sobczyński 7f619ec829 Merge pull request #99 from wolfysdl/master
fix some mistaken format on install.md
2021-11-23 16:03:31 +01:00
Wolf3s 94a77267a8 Merge branch 'master' into master 2021-11-23 10:38:56 -03:00
Wolfywolfy 950d0fc052 fix some mistaken typos 2021-11-23 10:33:55 -03:00
Sandro Sobczyński e11af10ba1 Merge pull request #98 from wolfysdl/master
Update information of installing on install.md and add new options on makefile
2021-11-23 14:28:52 +01:00
Wolfywolfy 4b0f2862d3 fix some mistaken typos 2021-11-23 10:26:34 -03:00
Wolfywolfy bb6956576b update install.md and fix typo 2021-11-23 08:30:16 -03:00
Wolfywolfy 288d27f97b add new tests option 2021-11-22 21:56:59 -03:00
Wolfywolfy 12de377525 update makefile 2021-11-22 21:39:18 -03:00
Sandro Sobczyński 0afd450c63 Merge pull request #97 from wolfysdl/master
Add new makefile to tyra
2021-11-22 20:15:26 +01:00
Wolfywolfy e9ff711c38 restore original makefile 2021-11-22 10:38:51 -03:00
Wolfywolfy 9a0504f94a typo fixed on makefile 2021-11-22 10:27:46 -03:00
Wolfywolfy 3ee31276ef examples 2021-11-22 10:02:12 -03:00
Wolfywolfy 3a68de50cb add new makefile, fix workflow errors and fix make 2021-11-22 09:14:44 -03:00
Sandro Sobczyński 7f9addbeb9 added additional unsets to prevent troubles 2021-06-01 22:16:01 +02:00
Sandro Sobczyński 3f3e6a0df4 fixed bounding box creation bug 2021-05-31 18:02:01 +02:00
h4570 7bfe7675cb added using of drawlist
Signed-off-by: h4570 <sandro.sobczynski@gmail.com>
2021-05-29 17:57:12 +02:00
611 changed files with 36921 additions and 30248 deletions
+40
View File
@@ -0,0 +1,40 @@
# Use the Google style in this project.
BasedOnStyle: Google
# Some folks prefer to write "int& foo" while others prefer "int &foo". The
# Google Style Guide only asks for consistency within a project, we chose
# "int& foo" for this project:
DerivePointerAlignment: false
PointerAlignment: Left
SortIncludes: false
IncludeBlocks: Merge
IncludeCategories:
# Matches common headers first, but sorts them after project includes
- Regex: '^\"google/cloud/internal/disable_deprecation_warnings.inc\"$'
Priority: -1
- Regex: '^\"google/cloud/(internal/|grpc_utils/|testing_util/|[^/]+\.h)'
Priority: 1000
- Regex: '^\"google/cloud/' # project includes should sort first
Priority: 500
- Regex: '^\"'
Priority: 1500
- Regex: '^<grpc/'
Priority: 2000
- Regex: '^<google/*'
Priority: 3000
- Regex: '^<.*/.*'
Priority: 4000
- Regex: '^<[^/]*>'
Priority: 5000
# Format raw string literals with a `pb` or `proto` tag as proto.
RawStringFormats:
- Language: TextProto
Delimiters:
- 'pb'
- 'proto'
BasedOnStyle: Google
CommentPragmas: '(@copydoc)'
+5
View File
@@ -0,0 +1,5 @@
*.elf
.git/
.vscode/
docs/
tools/
+2
View File
@@ -0,0 +1,2 @@
# Ignore all differences in line endings
* -crlf
-60
View File
@@ -1,60 +0,0 @@
# Based on https://github.com/ps2dev/gsKit/blob/master/.github/workflows/compilation.yml
# Thanks fjtrujy!
name: CI
on:
push:
pull_request:
repository_dispatch:
types: [run_build]
jobs:
build:
runs-on: ubuntu-latest
container: ps2dev/ps2sdk-ports:latest
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: |
apk add build-base git
- name: Compile engine
working-directory: ./src/engine
env:
ZLIB: ${PS2SDK}/ports
LIBTIFF: ${PS2SDK}/ports
LIBJPEG: ${PS2SDK}/ports
LIBPNG: ${PS2SDK}/ports
TYRA: ${GITHUB_WORKSPACE}
run: |
make
- name: Compile unit test project
working-directory: ./src/unit_tests/
env:
TYRA: ${GITHUB_WORKSPACE}
run: |
make
- name: Compile cube project
working-directory: ./src/samples/cube/
env:
TYRA: ${GITHUB_WORKSPACE}
run: |
make
- name: Compile floors project
working-directory: ./src/samples/floors/
env:
TYRA: ${GITHUB_WORKSPACE}
run: |
make
- name: Compile dolphin project
working-directory: ./src/samples/dolphin/
env:
TYRA: ${GITHUB_WORKSPACE}
run: |
make
+70
View File
@@ -0,0 +1,70 @@
name: Official build
on:
push:
branches: [ master ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
container: h4570/tyra
steps:
- name: Install dependencies
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y git make wget nodejs
- name: Set git safe directory
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: Checkout
uses: actions/checkout@v3
- name: Compile engine
run: |
make clean all -C engine
- name: Compile tutorials
run: |
make clean all -C tutorials/01-hello
make clean all -C tutorials/02-sprite
make clean all -C tutorials/03-minecraft
make clean all -C tutorials/04-de_dust2
make clean all -C tutorials/05-animation
make clean all -C tutorials/06-audio
make clean all -C tutorials/07-lighting
make clean all -C tutorials/08-skybox-debug
make clean all -C tutorials/09-manual-mode
make clean all -C tutorials/10-sprite-sheet
- name: Compile demo
run: |
make clean all -C demo
- name: Upload tutorials
if: ${{ success() }}
uses: actions/upload-artifact@v3
with:
name: tutorials-elf
path: |
tutorials/01-hello/bin
tutorials/02-sprite/bin
tutorials/03-minecraft/bin
tutorials/04-de_dust2/bin
tutorials/05-animation/bin
tutorials/06-audio/bin
tutorials/07-lighting/bin
tutorials/08-skybox-debug/bin
tutorials/09-manual-mode/bin
tutorials/10-sprite-sheet/bin
- name: Upload demo
if: ${{ success() }}
uses: actions/upload-artifact@v3
with:
name: demo-elf
path: |
demo/bin
+74
View File
@@ -0,0 +1,74 @@
name: PR build check
on:
pull_request:
branches: [ master ]
jobs:
build:
name: Build
runs-on: ubuntu-latest
container: h4570/tyra
steps:
- name: Install dependencies
run: |
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y git make wget nodejs
- name: Set git safe directory
run: |
git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: Checkout
uses: actions/checkout@v3
- name: Compile engine
run: |
make clean all -C engine
- name: Compile tutorials
run: |
make clean all -C tutorials/01-hello
make clean all -C tutorials/02-sprite
make clean all -C tutorials/03-minecraft
make clean all -C tutorials/04-de_dust2
make clean all -C tutorials/05-animation
make clean all -C tutorials/06-audio
make clean all -C tutorials/07-lighting
make clean all -C tutorials/08-skybox-debug
make clean all -C tutorials/09-manual-mode
make clean all -C tutorials/10-sprite-sheet
- name: Compile demo
run: |
make clean all -C demo
- name: Get short SHA
id: slug
run: |
echo "SHA8=$(echo ${GITHUB_SHA} | cut -c1-8)" >> $GITHUB_ENV
- name: Get branch
id: branch
run: |
BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | sed 's/refs\///g' | sed 's/\//_/g')
echo "BRANCH=${BRANCH_NAME}" >> $GITHUB_ENV
- name: Upload build artifacts
if: ${{ success() }}
uses: actions/upload-artifact@v3
with:
name: binaries-${{ env.SHA8 }}-${{ env.BRANCH }}
path: |
tutorials/01-hello/bin
tutorials/02-sprite/bin
tutorials/03-minecraft/bin
tutorials/04-de_dust2/bin
tutorials/05-animation/bin
tutorials/06-audio/bin
tutorials/07-lighting/bin
tutorials/08-skybox-debug/bin
tutorials/09-manual-mode/bin
tutorials/10-sprite-sheet/bin
demo/bin
+40
View File
@@ -0,0 +1,40 @@
#This is a modified version of the clang format check used on Open-PS2-Loader
name: PR C++ format check
on:
push:
paths:
- '**.hpp'
- '**.cpp'
- '**.'
- '**.h'
- './engine/inc/tyra'
- '.github/workflows/check-format.yml'
- '.clang-format'
pull_request:
paths:
- '**.hpp'
- '**.cpp'
- '**.'
- '**.h'
- './engine/inc/tyra'
- '.github/workflows/check-format.yml'
- '.clang-format'
jobs:
check-format:
name: Check clang format
runs-on: ubuntu-latest
steps:
- name: Install Node
run: |
apt-get update -y
apt-get install -y nodejs
- uses: actions/checkout@v2
- uses: DoozyX/clang-format-lint-action@v0.12
with:
source: '.'
extensions: 'hpp, cpp, h'
clangFormatVersion: 12
inplace: False
+2 -7
View File
@@ -1,6 +1,3 @@
.vscode/
.idea/
# ---
# Prerequisites
@@ -10,6 +7,7 @@
*.slo
*.lo
*.o
*.vsm
# Precompiled Headers
*.gch
@@ -20,10 +18,6 @@
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
@@ -36,3 +30,4 @@
*.app
*.erl
*.elf
*.irx
+3
View File
@@ -0,0 +1,3 @@
[submodule "template"]
path = template
url = https://git.ruifpb.pt/RuiFPB/tyra-linux-template
+7
View File
@@ -0,0 +1,7 @@
*.log
# Configuration files
/c_cpp_properties.json
/tasks.json
/settings.json
/ps2dev-intellisense
@@ -0,0 +1,41 @@
{
"configurations": [
{
"name": "Docker PS2SDK (Linux)",
"includePath": [
"${workspaceFolder}/**",
"~/ps2dev-intellisense/ps2sdk/common/include/**",
"~/ps2dev-intellisense/ps2sdk/ee/include/**",
"~/ps2dev-intellisense/ps2sdk/iop/include/**",
"~/ps2dev-intellisense/ps2sdk/ports/include/**",
"~/ps2dev-intellisense/ee/include/**",
"~/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/include/**",
"~/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/include-fixed/**",
"~/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/install-tools/include/**",
"~/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/plugin/include/**",
"~/ps2dev-intellisense/ee/mips64r5900el-ps2-elf/include/**",
"~/ps2dev-intellisense/ee/mips64r5900el-ps2-elf/sys-include/**",
"~/ps2dev-intellisense/gsKit/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/install-tools/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/plugin/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/include-fixed/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/install-tools/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/plugin/include/**",
"~/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/include-fixed/**"
],
"defines": [
"_EE",
"_IOP",
"__SPU__",
"INTELLISENSE"
],
"cppStandard": "c++20",
"compilerPath": "", // Should be empty
"intelliSenseMode": "linux-gcc-x86",
"configurationProvider": "ms-vscode.cpptools"
}
],
"version": 4
}
+14
View File
@@ -0,0 +1,14 @@
{
"buildDirectory": "demo",
"C_Cpp.default.intelliSenseMode": "gcc-x86",
"files.associations": {
"*.vcl": "asm-collection",
"*.i": "asm-collection",
"*.vsm": "asm-collection",
"*.vclpp": "asm-collection",
"*.hpp": "cpp",
"*.cpp": "cpp",
"*.h": "c",
"*.c": "c"
}
}
+119
View File
@@ -0,0 +1,119 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Build & run",
"dependsOrder": "sequence",
"dependsOn": [
"1. Copy source code to docker volume",
"2. Compile via docker container",
"3. Copy binaries to host",
"4. Run PCSX2"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "shell",
"label": "1. Copy source code to docker volume",
"command": "docker exec -t tyra-compiler sh -c 'rsync -ac --delete --exclude \".git\" --exclude \"docs\" --exclude \".vscode\" --exclude \"tools\" --exclude \"obj\" --exclude \"bin\" /host/ /src/'"
},
{
"type": "shell",
"label": "2. Compile via docker container",
"command": "docker exec -t tyra-compiler sh -c 'cd ${config:buildDirectory} && make build-engine all'",
"problemMatcher": {
"base": "$gcc",
"fileLocation": [
"autoDetect"
]
}
},
{
"type": "shell",
"label": "3. Copy binaries to host",
"command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"bin/**\" --exclude=\"*\" /src/ /host/'"
},
{
"type": "shell",
"label": "4. Run PCSX2",
"options": {
"cwd": "${config:buildDirectory}"
},
"command": "./run.sh"
},
{
"type": "shell",
"label": "Convert WAV to ADPCM",
"dependsOn": [
"1. Copy source code to docker volume"
],
"command": "docker exec -t tyra-compiler sh -c 'adpenc ${input:wav2adpcmSource} ${input:wav2adpcmTarget} && rsync -zac /src/${input:wav2adpcmTarget} /host/${input:wav2adpcmTarget}'"
},
{
"type": "shell",
"label": "Cleanup",
"command": "docker exec -t tyra-compiler sh -c 'rm -rf /src/*'"
},
{
"type": "shell",
"label": "Send to PS2",
"command": "docker exec -t tyra-compiler sh -c 'cd ${config:buildDirectory}/bin && killall -v ps2client || true && ps2client -h ${input:ps2Ip} reset && ps2client -h ${input:ps2Ip} reset && ps2client -h ${input:ps2Ip} execee host:$(find . -maxdepth 1 -type f -name \"*.elf\")'"
},
{
"type": "shell",
"label": "Open PS2 output logger",
"command": "docker stop ps2-logs || true && docker run -t --rm --name=ps2-logs -p ${input:local2Ip}:18194:18194/udp h4570/tyra sh -c 'ps2client -h ${input:ps2Ip} listen'",
"runOptions": {
"instanceLimit": 1
},
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"type": "shell",
"label": "Start docker container",
"command": "docker compose up -d"
},
{
"type": "shell",
"label": "Stop docker container",
"command": "docker compose down"
},
{
"type": "shell",
"label": "[Debug] Copy obj directory to host",
"command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"obj/**\" --exclude=\"*\" /src/ /host/'"
}
],
"inputs": [
{
"id": "wav2adpcmSource",
"description": "Source file path (ex. ):",
"default": "demo/res/sound.wav",
"type": "promptString"
},
{
"id": "wav2adpcmTarget",
"description": "Target file path (ex. ):",
"default": "demo/res/sound.adpcm",
"type": "promptString"
},
{
"id": "ps2Ip",
"description": "PS2link ip address:",
"default": "192.168.1.200",
"type": "promptString"
},
{
"id": "local2Ip",
"description": "Local ip address:",
"default": "192.168.1.245",
"type": "promptString"
}
]
}
@@ -0,0 +1,41 @@
{
"configurations": [
{
"name": "Docker PS2SDK",
"includePath": [
"${workspaceFolder}/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ps2sdk/common/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ps2sdk/ee/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ps2sdk/iop/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ps2sdk/ports/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/include-fixed/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/install-tools/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/lib/gcc/mips64r5900el-ps2-elf/11.3.0/plugin/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/mips64r5900el-ps2-elf/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/ee/mips64r5900el-ps2-elf/sys-include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/gsKit/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/install-tools/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/plugin/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-elf/11.3.0/include-fixed/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/install-tools/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/plugin/include/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/iop/lib/gcc/mipsel-ps2-irx/11.3.0/include-fixed/**"
],
"defines": [
"_EE",
"_IOP",
"__SPU__",
"INTELLISENSE"
],
"cppStandard": "c++20",
"compilerPath": "", // Should be empty
"intelliSenseMode": "linux-gcc-x86",
"configurationProvider": "ms-vscode.cpptools"
}
],
"version": 4
}
+14
View File
@@ -0,0 +1,14 @@
{
"buildDirectory": "demo",
"C_Cpp.default.intelliSenseMode": "gcc-x86",
"files.associations": {
"*.vcl": "asm-collection",
"*.i": "asm-collection",
"*.vsm": "asm-collection",
"*.vclpp": "asm-collection",
"*.hpp": "cpp",
"*.cpp": "cpp",
"*.h": "c",
"*.c": "c"
}
}
+119
View File
@@ -0,0 +1,119 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Build & run",
"dependsOrder": "sequence",
"dependsOn": [
"1. Copy source code to docker volume",
"2. Compile via docker container",
"3. Copy binaries to host",
"4. Run PCSX2"
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"type": "shell",
"label": "1. Copy source code to docker volume",
"command": "docker exec -t tyra-compiler sh -c 'rsync -ac --delete --exclude \".git\" --exclude \"docs\" --exclude \".vscode\" --exclude \"tools\" --exclude \"obj\" --exclude \"bin\" /host/ /src/'"
},
{
"type": "shell",
"label": "2. Compile via docker container",
"command": "docker exec -t tyra-compiler sh -c 'cd ${config:buildDirectory} && make build-engine all'",
"problemMatcher": {
"base": "$gcc",
"fileLocation": [
"autoDetect"
]
}
},
{
"type": "shell",
"label": "3. Copy binaries to host",
"command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"bin/**\" --exclude=\"*\" /src/ /host/'"
},
{
"type": "shell",
"label": "4. Run PCSX2",
"options": {
"cwd": "${config:buildDirectory}"
},
"command": "Start-Job { ./run.ps1 } | Receive-Job -Wait"
},
{
"type": "shell",
"label": "Convert WAV to ADPCM",
"dependsOn": [
"1. Copy source code to docker volume"
],
"command": "docker exec -t tyra-compiler sh -c 'adpenc ${input:wav2adpcmSource} ${input:wav2adpcmTarget} && rsync -zac /src/${input:wav2adpcmTarget} /host/${input:wav2adpcmTarget}'"
},
{
"type": "shell",
"label": "Cleanup",
"command": "docker exec -t tyra-compiler sh -c 'rm -rf /src/*'"
},
{
"type": "shell",
"label": "Send to PS2",
"command": "docker exec -t tyra-compiler sh -c 'cd ${config:buildDirectory}/bin && killall -v ps2client || $true && ps2client -h ${input:ps2Ip} reset && ps2client -h ${input:ps2Ip} reset && ps2client -h ${input:ps2Ip} execee host:$(find . -maxdepth 1 -type f -name \"*.elf\")'"
},
{
"type": "shell",
"label": "Open PS2 output logger",
"command": "docker stop ps2-logs || $true && docker run -t --rm --name=ps2-logs -p ${input:local2Ip}:18194:18194/udp h4570/tyra sh -c 'ps2client -h ${input:ps2Ip} listen'",
"runOptions": {
"instanceLimit": 1
},
"presentation": {
"reveal": "always",
"panel": "new"
}
},
{
"type": "shell",
"label": "Start docker container",
"command": "docker compose up -d"
},
{
"type": "shell",
"label": "Stop docker container",
"command": "docker compose down"
},
{
"type": "shell",
"label": "[Debug] Copy obj directory to host",
"command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"obj/**\" --exclude=\"*\" /src/ /host/'"
}
],
"inputs": [
{
"id": "wav2adpcmSource",
"description": "Source file path (ex. ):",
"default": "demo/res/sound.wav",
"type": "promptString"
},
{
"id": "wav2adpcmTarget",
"description": "Target file path (ex. ):",
"default": "demo/res/sound.adpcm",
"type": "promptString"
},
{
"id": "ps2Ip",
"description": "PS2link ip address:",
"default": "192.168.1.200",
"type": "promptString"
},
{
"id": "local2Ip",
"description": "Local ip address:",
"default": "192.168.1.245",
"type": "promptString"
}
]
}
+9
View File
@@ -0,0 +1,9 @@
{
"recommendations": [
"ms-vscode.cpptools-extension-pack",
"ryzngard.vscode-header-source",
"maziac.asm-code-lens",
"dmnsgn.vscode-wavefront",
"spmeesseman.vscode-taskexplorer"
]
}
-134
View File
@@ -1,134 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.36.3] - 2021-05-28
### Added
- Unit test project
- Assert
- CI via Github workflows
- Install tutorial as separated .MD file
### Changed
- Improved BMP loader.
- All PRINT_LOG and PRINT_ERR to consoleLog() and assertMsg()
- Refactored makefiles
- **CHANGED ENV VARIABLES!**
- Install tutorial
- Readme
## [1.31.2] - 2021-02-06
### Added
- Id to MeshFrame
- Non textured rendering (RGBA only)
### Changed
- Moved color from mesh to mesh material.
- OBJ Loader refactor
- Logic of loadFrom()
- Migrated to GCC9 (valid with latest PS2SDK)
### Removed
- Removed MeshId from TextureLink, TextureRepository
## [1.29.1] - 2020-12-27
### Added
- Created libpacket2 in PS2SDK
- Dolphin sample
- 2D support (Sprite class)
- Alpha blending (transparency)
- PNG support
- ADPCM support in audio class
- AudioFinish event in audio class
- BoundingBox class
- A lot of useful funcs in Matrix class
- Mock of file service
- Array mode to draw() (highly optimized for small meshes)
- VCLPP - Usage of VU1 Preprocessor
### Changed
- Project setup (makefile mostly)
- Readme
- Switched into libpacket2 in `vifsender` and `gifsender`
- Timer class refactor
- Engine base refactor
- MeshTexture into Texture
- Refactored floors sample
- Refactored Audio class
- Fixed Path 3 lighting
- Refactored, optimized math classes (vector, matrix..)
- Cleanup in camera base
- Refactored Path 3 and Path 1 rendering
- Synchronization functions (`renderer->waitForRender()`)
- BMP class refactor
- Dff Loader refactor
- Optimized rendering data preparation
### Removed
- Ari sample
- VU1 class
## [1.1.0] - 2020-11-03
### Added
- A lot of useful functions to Mesh class
- MeshFrame class
- MeshMaterial class
- MeshTexture class
- TextureLink struct
- Texture wrapping settings
- TextureRepository class
- PRINT_ERR()
- Ari sample
### Changed
- Project setup (gitignore etc.)
- Readme
- DFF loader refactor
- OBJ loader refactor
- MD2 loader refactor
- 3D data classes refactor (one interface for all)
- Rendering refactor
### Removed
- MeshSpec class
- Texture class
- Md2Model class
- ObjModel class
- DffModel class
## [1.0.0] - 2020-10-28
### Added
- Project setup (gitignore etc.)
- License
- Readme
- BMP support
- DFF support
- MD2 support
- OBJ support
- Animation support
- Engine base
- AudioListener class
- Rendering base
- Path 1 renderer (VU1)
- Path 3 renderer (GIF)
- Math classes (matrix, vector, plane..)
- Audio support (bg song only)
- Camera base
- Base lighting support (bugged) for Path 3
- Pad support
- EE Timer
- Math class
- String class
- Mesh class with AABB
- Makefile
- Primitive floors sample
[1.36.3]: https://github.com/h4570/tyra/compare/v1.31.2-alpha...v1.36.3-alpha
[1.31.2]: https://github.com/h4570/tyra/compare/v1.29.1-alpha...v1.31.2-alpha
[1.29.1]: https://github.com/h4570/tyra/compare/1.1.0...v1.29.1-alpha
[1.1.0]: https://github.com/h4570/tyra/compare/1.0.0...1.1.0
[1.0.0]: https://github.com/h4570/tyra/compare/1.0.0
+66
View File
@@ -0,0 +1,66 @@
# syntax=docker/dockerfile:1
FROM ubuntu:20.04
# Install necessary packages for PS2DEV, VCLPP and VCL.
RUN apt-get update
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y git make g++ texinfo bison flex gettext libgmp3-dev \
libmpfr-dev libmpc-dev gcc binutils cmake wget patch zlib1g-dev libgsl-dev \
unzip
# Setup PS2DEV env
ENV PS2DEV /usr/local/ps2dev
RUN mkdir -p $PS2DEV
RUN chown -R $USER: $PS2DEV
ENV PS2SDK $PS2DEV/ps2sdk
ENV GSKIT $PS2DEV/gsKit
ENV PATH $PATH:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin
# Compile PS2DEV
RUN mkdir -p /temp/ps2dev
RUN git clone https://github.com/ps2dev/ps2dev.git /temp/ps2dev
WORKDIR "/temp/ps2dev"
RUN ./build-all.sh
# Compile VCLPP
RUN mkdir -p /temp/vclpp
RUN git clone https://github.com/glampert/vclpp.git /temp/vclpp
WORKDIR "/temp/vclpp"
RUN make
# Download VCL
RUN mkdir -p /temp/vcl
WORKDIR "/temp/vcl"
RUN wget https://github.com/h4570/tyra/raw/master/assets/vcl
# ------------------------------------------------------------------------------
# Start from clean image
FROM ubuntu:20.04
# Set ENV variables
ENV PS2DEV /usr/local/ps2dev
ENV PS2SDK $PS2DEV/ps2sdk
ENV PATH $PATH:${PS2DEV}/bin:${PS2DEV}/ee/bin:${PS2DEV}/iop/bin:${PS2DEV}/dvp/bin:${PS2SDK}/bin
# Copy stuff from previous stage
COPY --from=0 ${PS2DEV} ${PS2DEV}
COPY --from=0 /temp/vcl/vcl /usr/bin/vcl
COPY --from=0 /temp/vclpp/vclpp /usr/bin/vclpp
# Install packages for emulating x86 and Tyra (make, libmpc, psmisc)
RUN apt-get update
RUN apt-get install -y make rsync libmpc-dev qemu qemu-user-static binfmt-support psmisc
# Add 32bit executables support for VCL
RUN dpkg --add-architecture i386
RUN apt-get update
RUN apt-get install -y libstdc++5:i386
RUN update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
# Set chmod
RUN chmod 755 /usr/bin/vclpp
RUN chmod 755 /usr/bin/vcl
WORKDIR /src
CMD ["/bin/bash"]
-201
View File
@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+117
View File
@@ -0,0 +1,117 @@
#Compiler and Linker
EE_PREFIX := mips64r5900el-ps2-elf-
AR := $(EE_PREFIX)ar
AS := $(EE_PREFIX)as
CC := $(EE_PREFIX)gcc
CXX := $(EE_PREFIX)g++
STRIP := $(EE_PREFIX)strip
BIN2S := $(PS2SDK)/bin/bin2s
VCL := vcl
VCLPP := vclpp
DVP := dvp-as
IRXEMBEDDEDEXT := irx-em
#Flags, Libraries and Includes
CFLAGS += -D_EE -Wall -O3
LINKFLAGS += -O3 -Wl,-zmax-page-size=128
ASFLAGS += -O3
LIB += -lstdc++ -ldma -lpacket2 -lgraph -ldraw -lmath3d -lpng -ldebug -lz -lpad -laudsrv -lpatches -lcdvd
INC += -I$(PS2DEV)/ps2sdk/ee/include -I$(PS2DEV)/ps2sdk/common/include -I$(PS2DEV)/ps2sdk/ports/include
#---------------------------------------------------------------------------------
#DO NOT EDIT BELOW THIS LINE
#---------------------------------------------------------------------------------
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.$(OBJEXT)))
IRXEM_SOURCES := $(shell find $(SRCDIR) -type f -name *.$(IRXEMBEDDEDEXT))
IRXEM_OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(IRXEM_SOURCES:.$(IRXEMBEDDEDEXT)=.$(OBJEXT)))
VU_SOURCES_VCL := $(shell find $(SRCDIR) -type f -name *.$(VCLEXT))
VU_OBJECTS_VCL := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(VU_SOURCES_VCL:.$(VCLEXT)=.$(OBJEXT)))
VU_SOURCES_VSM := $(shell find $(SRCDIR) -type f -name *.$(VSMEXT))
VU_OBJECTS_VSM := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(VU_SOURCES_VSM:.$(VSMEXT)=.$(OBJEXT)))
VCL_SOURCES := $(shell find $(SRCDIR) -type f -name *.$(VCLPPEXT))
VCL_OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(VCL_SOURCES:.$(VCLPPEXT)=.$(OBJEXT)))
#Default Make
all: resources $(TARGET)
#all: resources irxcopy $(TARGET)
release:
$(MAKE) CFLAGS="-DNDEBUG $(CFLAGS)"
#Remake
remake: cleaner all
#Copy Resources from Resources Directory to Target Directory
resources: directories
@cp -r $(RESDIR)/* $(TARGETDIR)/ || true
#Make the Directories
directories:
@mkdir -p $(TARGETDIR)
@mkdir -p $(BUILDDIR)
#Clean only Objects
clean:
@$(RM) -rf $(BUILDDIR)
#Full Clean, Objects and Binaries
cleaner: clean
@$(RM) -rf $(TARGETDIR)
@$(RM) -rf $(BUILDDIR)
#irxcopy:
# @cp $(PS2SDK)/iop/irx/audsrv.irx $(TARGETDIR)/audsrv.irx
#Pull in dependency info for *existing* .o files
-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))
#Link
$(TARGET): $(OBJECTS) $(VCL_OBJECTS) $(VU_OBJECTS_VCL) $(VU_OBJECTS_VSM) $(IRXEM_OBJECTS)
$(CXX) -T$(PS2DEV)/ps2sdk/ee/startup/linkfile -o $(TARGETDIR)/$(TARGET) $^ -L$(PS2DEV)/ps2sdk/ee/lib -L$(PS2SDK)/ports/lib $(LINKFLAGS) $(LIBDIRS) $(LIB)
$(STRIP) --strip-all $(TARGETDIR)/$(TARGET)
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(IRXEMBEDDEDEXT)
@mkdir -p $(dir $@)
@rm -f $@.s
$(BIN2S) $(shell head -1 $<) $@.s $(shell sed -n '2p' $<)
$(AS) $(ASFLAGS) $@.s -o $@
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(dir $@)
$(CXX) $(CFLAGS) $(INC) -c -o $@ $<
@$(CXX) $(CFLAGS) $(INCDEP) -MM $(SRCDIR)/$*.$(SRCEXT) > $(BUILDDIR)/$*.$(DEPEXT)
@cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp
@sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)
@sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)
@rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(VCLEXT)
@mkdir -p $(dir $@)
@rm -f $@.vsm
$(VCL) $< >> $@.vsm
$(DVP) $@.vsm -o $@
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(VSMEXT)
@mkdir -p $(dir $@)
$(DVP) $< -o $@
$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(VCLPPEXT)
@mkdir -p $(dir $@)
@rm -f $@.vcl
@rm -f $@.vsm
$(VCLPP) $< $@.vcl
$(VCL) $@.vcl > $@.vsm
$(DVP) $@.vsm -o $@
run-pcsx2:
taskkill.exe /f /t /im pcsx2x64.exe || true
$(WSL_LINUX_PCSX2)/pcsx2x64.exe --elf=$(WSL_MAKE_WINDOWS)$(CURDIR)/$(TARGETDIR)/$(TARGET)
#Non-File Targets
.PHONY: all remake clean cleaner resources
+86 -109
View File
@@ -1,3 +1,4 @@
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/b81ab27f1c774f839729829c9f772b1a)](https://www.codacy.com/gh/h4570/tyra/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=h4570/tyra&amp;utm_campaign=Badge_Grade)
[![Contributors][contributors-shield]][contributors-url]
[![MIT License][license-shield]][license-url]
[![Discord](https://img.shields.io/badge/discord-Tyra-brightgreen?logo=discord)](https://discord.gg/NhhTmg3Gm5)
@@ -6,17 +7,18 @@
<br />
<p align="center">
<a href="https://github.com/h4570/tyra">
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/github-splash.png" alt="Logo" width="100%" height="auto">
<img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/github-splash.png" alt="Logo" width="100%" height="auto">
</a>
<h3 align="center">Tyra - alpha 1.36.3</h3>
<h3 align="center">Tyra</h3>
<p align="center">
Open source game engine for PlayStation 2™
<br />
<a href="https://github.com/h4570/tyra/tree/master/src/samples/dolphin"><strong>Dolphin sample »</strong></a>
<a href="https://www.youtube.com/watch?v=DGR4vWDjkmc"><strong>Showcase video »</strong></a>
&nbsp;
<a href="https://youtube.com/playlist?list=PLdQVLBcXRRWvtMi-OqccDWLTEFEisD5RH"><strong>YouTube tutorials »</strong></a>
&nbsp;
<a href="https://github.com/h4570/tyra/tree/master/src/samples/floors"><strong>Floors sample »</strong></a>
<br />
<br />
<a href="https://github.com/h4570/tyra/issues">Report Bug</a>
@@ -25,112 +27,81 @@
</p>
</p>
[![Stargazers repo roster for h4570/tyra](https://reporoster.com/stars/h4570/tyra)](https://github.com/h4570/tyra/stargazers)
## Table of Contents
* [About the Project](#about-the-project)
* [Samples](#samples)
* [About the project](#about-the-project)
* [Description](#description)
* [Tutorials](#tutorials)
* [Features](#features)
* [Branches](#branches)
* [Getting Started](#getting-started)
* [Installation](#installation)
* [Prerequisites](#prerequisites)
* [Roadmap](#roadmap)
* [Contributing](#contributing)
* [Games](#games)
* [License](#license)
* [Built With](#built-with)
* [Acronyms](#acronyms)
* [Thanks](#thanks)
<br />
* [Credits](#credits)
## About the Project
<p align="center">
<img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/tyra_code.gif" alt="Sample code" width="500" height="auto">
<img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/showcase.gif " alt="Sample game" width="500" height="auto">
</p>
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/tyra.gif" alt="Sample code" width="600" height="auto">
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/dolphin.gif " alt="Sample game" width="500" height="auto">
### Samples
* [Dolphin](https://github.com/h4570/tyra/tree/master/src/samples/dolphin)
* [Floors](https://github.com/h4570/tyra/tree/master/src/samples/floors)
* [Cube](https://github.com/h4570/tyra/tree/master/src/samples/cube)
---
### Description
Tyra is a project that aims to facilitate the development of PlayStation 2 games. The goal is simple API which will allow you to develop some nice small homebrew games in a short period of time. Finally, (thanks to PS2DEV team) Tyra supports C++20, so we are free from the 2003's GCC which only supported C++98.
**Project is on alpha stage, so keep in mind that there are many things to be done and to fix.**
Unfortunately there are not many people, which want's to help with this project. **If you want to be a volunteer**, but don't have too much knowledge in this field, write to me on Discord, **I will be happy to help.**
Tyra is a project that allows you to easily create games for the PlayStation 2 console.
When I tried to make a game for PS2 a few years ago, I realized how many things had to be done to tame this exotic console architecture.
Decision was simple - I need to create an engine which will handle 3D file loading, 2D/3D rendering, animation, audio, handling between PS2 CPUs, synchronization.. It should be simple as possible - so people with no experience can create a simple game in a few hours.
**And that's what Tyra is all about.**
When project will be on beta stage, we plan to create some YouTube tutorials :)
**Why was this project created?**
PS2 development can be a big challenge.
PS2 it's pretty low-level and there are a lot of stuff that you must do from scratch.
For example, if you want to render something using only PS2DEV you must:
- Create VU1 micro-program
- Load micro-program and send it to VU1
- Create parser for your 3D file
- Create parser for texture file
- Calculate lights, shadows, MVP matrices (3D->2D)..
- Clip triangles ([sic!](https://github.com/h4570/tyra/issues/14))
- Prepare DMA packets for coprocessors communication
- Setup rasterizer (GS)
- Send texture to GS
- Send packets
- Synchronize all
but with Tyra you can do it with methods like `loadObj()` and `draw()` 😁.
### Tutorials
* 01 - Setup environment - [Text tutorial](https://github.com/h4570/tyra/tree/master/docs/install) or [Video](https://www.youtube.com/watch?v=9IXOU1SPdzc)
* 02 - Cooking game assets - [Video](https://www.youtube.com/watch?v=hpVDeTTLyjI)
* 03 - Create a game repository - [Video](https://www.youtube.com/watch?v=DKfIKar3GUM)
* 04 - Run game from USB in PS2 - [Video](https://www.youtube.com/watch?v=ZX8fTQqiNho)
---
* 01 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/01-hello) - Hello world
* 02 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/02-sprite) - 2D rendering
* 03 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/03-minecraft) - 3D minecraft blocks
* 04 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/04-de_dust2) - `de_dust2.obj` rendering
* 05 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/05-animation) - 3D animation
* 06 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/06-audio) - Background music and sound effects
* 07 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/07-lighting) - Static lightmap and dynamic directional lights
* 08 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/08-skybox-debug) - Skybox and debug rendering
* 09 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/09-manual-mode) - Manual rendering (a'la OpenGL)
* 10 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/10-sprite-sheet) - Sprite sheet (font)
* 11 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/11-texture-region-repeat) - Texture repeating
* Demo game - [Code](https://github.com/h4570/tyra/tree/master/demo)
---
### Features
* 3D support - VU1 "Path 1 rendering"
* 2D support - PNG & BMP
* Frustum culling, backface culling
* OpenGL adaptions: Perspective projection, lookAt camera
* Texture support - .bmp and png
* Mesh loaders: ".obj", ".dff" (RenderWare, GTA:SA) and ".md2" (Quake II)
* Threading support
* Animation support for obj and md2
* Audio support - .wav and .adpcm
* Docker image with Tyra, all tools and `PS2DEV` C++20 compiler
* 3D rendering via `VU1` coprocessor:
* Static rendering
* Morph animation rendering
* Super optimized, custom minecraft block renderer
* Debug rendering (lines, boxes, bboxes)
* Manual rendering (a'la `OpenGL`)
* 2D rendering
* Frustum culling:
* Simple - culling whole mesh
* Precise - culling only visible parts of mesh
* Clipping:
* Standard "fake", but fast PS2 clipping done in `VU1`
* Software clipping done in `EE Core`
* Optimized math functions via `VU0` coprocessor
* Background music and sound effects support
* Pad support
### Branches
* Master - monthly releases - tested on PS2 & PCSX2.
* Develop - daily builds - can be unstable.
<br />
## Getting Started
### Installation
Step by step [tutorial here](https://github.com/h4570/tyra/tree/develop/docs)
If you need any support, feel free to ask questions on discord:
[![Discord](https://img.shields.io/badge/discord-Tyra-brightgreen?logo=discord)](https://discord.gg/NhhTmg3Gm5)
### Prerequisites
* PS2 DEV environment - [PS2DEV](https://github.com/ps2dev/ps2dev)
* At least #58ffb33 PS2SDK (28.05.2021) - [PS2SDK](https://github.com/ps2dev/ps2sdk)
* PS2 Emulator. For example [PCSX2](https://pcsx2.net/)
<br />
## Extra info
* If you want to use your own .obj file, please check "triangulate faces" in blender.
PS2 is supporting only triangle primitive type.
<br />
## Roadmap
### Roadmap for next master release:
[Next release roadmap](https://github.com/h4570/tyra/projects/4)
See the [open issues](https://github.com/h4570/tyra/issues) for a list of proposed features (and known issues).
<br />
* USB support
* Memory card support
* `.wav` Audio file support
* `.obj` 3D file support
* `.md2` 3D file support
* `.png` Texture file support
## Contributing
See the [open issues](https://github.com/h4570/tyra/issues) for a list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**.
1. Fork the Project
@@ -139,48 +110,54 @@ Contributions are what make the open source community such an amazing place to b
4. Push to the Branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
<br />
## Games
List of games developed with Tyra.
If you created one, please contact me - I will add it to the list :)
* [Tyracraft](https://github.com/Wellinator/tyracraft) by [Wellinator](https://github.com/Wellinator)
* [Game with car](https://github.com/freebytego/gwc-ps2) by [freebytego](https://github.com/freebytego)
* [Rock, paper, scissors](https://github.com/GuidoDQR/my-ps2-game) by [GuidoDQR](https://github.com/GuidoDQR)
* [TyraTale](https://github.com/Br4k2n/TyraTale) by [Br4k2n](https://github.com/Br4k2n)
## License
Distributed under the Apache License 2.0 License. See `LICENSE` for more information.
<br />
## Built With
* [PS2DEV](https://github.com/ps2dev/ps2dev)
<br />
* [VCLPP](https://github.com/glampert/vclpp)
* Sony VCL
## Acronyms
* EE (Emotion Engine) - whole set of processors and subsystems that make up the PlayStation 2
* EE Core - main PS2 CPU (c++ done here)
* GS (Graphic synthesizer) - configurable rasterizer and texture mapper. Has only 2MB~ memory for textures, but for the opposite have very high transfer rate, so you can switch textures in the blink
* VU0 - programmable (ASM) vector processor that is accessed by inline assembly code injected into C program.
* VU1 - programmable (ASM) vector processor, which is similar to vertex shader. Accessed via DMA.
* IOP - I/O processor which enables access to peripheral devices, such the game controller
<br />
## Credits
## Thanks
Without these guys, everything would be harder:
* Dr Henry Fortuna - for code sources
* Rick Gaiser, fjtrujy - for help and new GCC!
* Lukasz D.K. - for huge archive of PS2 stuff
* Guilherme Lampert - for code sources
* Jesper Svennevid, Daniel Collin - for openvcl's code samples
* Whole PS2DEV team
* Manieq - for nice splash screens!
Without these guys, Tyra would not happen:
* [Dr Henry Fortuna](http://ps2-edu.tensioncore.com/index.html) - for code sources, PS2 academy tutorials
* Whole [PS2DEV](https://github.com/ps2dev) team, and specially to [Rick Gaiser](https://github.com/rickgaiser), [fjtrujy](https://github.com/fjtrujy) - for a lot of good tips!
* [Wellington Carvalho](https://github.com/Wellinator), [André Guilheme](https://github.com/Wolf3s), [Matías Israelson](https://github.com/israpps), [Guido Diego Quispe Robles](https://github.com/israpps) - for testing, contributing to Tyra and sharing cool ideas!
* [Leonardo Ono](https://github.com/leonardo-ono) - for software renderer example (with clipping!)
* [Lukasz D.K.](https://github.com/lukaszdk) - for huge archive of PS2 stuff
* [Guilherme Lampert](https://github.com/glampert) - for code sources
* [Jesper Svennevid](https://github.com/jsvennevid), [Daniel Collin](https://github.com/emoon) - for openvcl's code samples
* [Manieq](https://www.facebook.com/mvnieq) - for nice splash screens!
* And so many other guys. Thanks!
Project Link: [https://github.com/h4570/tyra](https://github.com/h4570/tyra)
Sandro Sobczyński - sandro.sobczynski@gmail.com
Sandro Sobczyński - sandro.sobczynski@gmail.com (<a href="https://hasto.pl">hasto.pl</a>)
[![LinkedIn][linkedin-shield]](https://linkedin.com/in/sandro-sobczyński-28820b15a)
<br />
<a href="https://github.com/h4570/tyra">
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/github-splash2.png" alt="Logo" width="100%" height="auto">
<img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/github-splash2.png" alt="Logo" width="100%" height="auto">
</a>
[contributors-shield]: https://img.shields.io/github/contributors/h4570/tyra.svg?style=flat-square
Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
View File
Binary file not shown.
+33
View File
@@ -0,0 +1,33 @@
TARGET := demo.elf
ENGINEDIR := ../engine
#The Directories, Source, Includes, Objects, Binary and Resources
SRCDIR := src
INCDIR := inc
BUILDDIR := obj
TARGETDIR := bin
RESDIR := res
SRCEXT := cpp
VSMEXT := vsm
VCLEXT := vcl
VCLPPEXT := vclpp
DEPEXT := d
OBJEXT := o
#Flags, Libraries and Includes
CFLAGS :=
LIB := -ltyra
LIBDIRS := -L$(ENGINEDIR)/bin
INC := -I$(INCDIR) -I$(ENGINEDIR)/inc
INCDEP := -I$(INCDIR) -I$(ENGINEDIR)/inc
include ../Makefile.base
clean-engine:
cd $(ENGINEDIR) && $(MAKE) cleaner
build-engine:
cd $(ENGINEDIR) && $(MAKE)
build-release-engine:
cd $(ENGINEDIR) && $(MAKE) release
+34
View File
@@ -0,0 +1,34 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "state/state_manager.hpp"
using Tyra::Engine;
using Tyra::Game;
namespace Demo {
class DemoGame : public Game {
public:
DemoGame(Engine* engine);
~DemoGame();
void init();
void loop();
private:
Engine* engine;
StateManager<GlobalStateType> stateManager;
};
} // namespace Demo
+17
View File
@@ -0,0 +1,17 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
namespace Demo {
const bool IS_REAL_PS2_VIA_USB = false;
} // namespace Demo
+17
View File
@@ -0,0 +1,17 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
namespace Demo {
enum GlobalStateType { STATE_INTRO, STATE_LOADING, STATE_GAME, STATE_EXIT };
} // namespace Demo
+40
View File
@@ -0,0 +1,40 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <engine.hpp>
using Tyra::Engine;
namespace Demo {
template <typename StateTypeT>
class State {
public:
State(Engine* t_engine) : engine(t_engine) {}
virtual ~State() {}
virtual const StateTypeT& getState() const = 0;
virtual const bool& wantFinish() const = 0;
virtual void onStart() = 0;
virtual void update() = 0;
/** @return Next game state */
virtual StateTypeT onFinish() = 0;
protected:
Engine* engine;
};
} // namespace Demo
+99
View File
@@ -0,0 +1,99 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <vector>
#include "./state.hpp"
#include "./global_state_type.hpp"
namespace Demo {
template <typename StateTypeT>
class StateManager {
public:
StateManager(const StateTypeT& t_initialState,
const StateTypeT& t_exitState) {
stateInitialized = false;
currentState = t_initialState;
exitState = t_exitState;
}
~StateManager() { freeAll(); }
const StateTypeT& getCurrentState() const { return currentState; }
const StateTypeT& getExitState() const { return exitState; }
bool finished() const { return currentState == exitState; }
std::vector<State<StateTypeT>*>* getAll() { return &states; }
State<StateTypeT>* get(const StateTypeT& stateType) {
for (auto& state : states) {
if (state->getState() == stateType) {
return state;
}
}
return nullptr;
}
void add(State<StateTypeT>* state) { states.push_back(state); }
/** remove (without free) */
void remove(const State<StateTypeT>* state) {
states.erase(std::remove(states.begin(), states.end(), state),
states.end());
}
/** free and remove */
void free(const State<StateTypeT>* state) {
auto* found = get(state);
if (!found) return;
remove(found);
delete found;
}
/** free and remove all */
void freeAll() {
for (auto& state : states) {
delete state;
}
states.clear();
}
void update() {
for (auto& state : states) {
if (state->getState() == currentState) {
if (state->wantFinish()) {
currentState = state->onFinish();
stateInitialized = false;
break;
}
if (!stateInitialized) {
state->onStart();
stateInitialized = true;
}
state->update();
break;
}
}
}
private:
bool stateInitialized;
std::vector<State<StateTypeT>*> states;
StateTypeT currentState, exitState;
};
} // namespace Demo
+63
View File
@@ -0,0 +1,63 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "states/game/renderer/renderer_dynamic_pair.hpp"
#include "states/game/terrain/heightmap.hpp"
#include "states/game/player/player_shoot_action.hpp"
#include "./enemy_info.hpp"
using Tyra::AnimationSequenceCallback;
using Tyra::Audio;
using Tyra::DynamicMesh;
using Tyra::DynPipOptions;
using Tyra::Engine;
using Tyra::Renderer;
using Tyra::Renderer3DUtility;
using Tyra::TextureRepository;
using Tyra::Vec4;
namespace Demo {
class Enemy {
public:
Enemy(Engine* engine, const EnemyInfo& info);
~Enemy();
DynamicMesh* mesh;
DynPipOptions* options;
RendererDynamicPair* pair;
void update(const Heightmap& heightmap, const Vec4& playerPosition,
const PlayerShootAction& shootAction);
private:
std::vector<u32> walkSequence;
std::vector<u32> fightSequence;
void allocateOptions();
void walk(const Heightmap& heightmap, const Vec4& positionDiff);
void animationCallback(const AnimationSequenceCallback& callback);
void fight();
void handlePlayerShoot(const PlayerShootAction& shootAction);
void setMeshToSpawn();
bool isWalking = true;
bool isFighting = false;
Vec4 terrainLeftUp;
Vec4 terrainRightDown;
Audio* audio;
EnemyInfo info;
};
} // namespace Demo
+33
View File
@@ -0,0 +1,33 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include <audsrv.h>
using Tyra::DynamicMesh;
using Tyra::Texture;
using Tyra::Vec4;
namespace Demo {
struct EnemyInfo {
u8 adpcmChannel;
audsrv_adpcm_t* adpcmPunch;
audsrv_adpcm_t* adpcmDeath;
DynamicMesh* motherMesh;
Texture* bodyTexture;
Texture* clothTexture;
Vec4 terrainLeftUp;
Vec4 terrainRightDown;
};
} // namespace Demo
@@ -0,0 +1,45 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include <vector>
#include "states/game/terrain/heightmap.hpp"
#include "states/game/player/player_shoot_action.hpp"
#include "./enemy.hpp"
using Tyra::DynamicMesh;
using Tyra::Engine;
using Tyra::Texture;
using Tyra::TextureRepository;
using Tyra::Vec4;
namespace Demo {
class EnemyManager {
public:
EnemyManager(Engine* engine, const Heightmap& heightmap);
~EnemyManager();
void update(const Heightmap& heightmap, const Vec4& playerPosition,
const PlayerShootAction& shootAction);
std::vector<RendererDynamicPair*> getPairs() const;
private:
TextureRepository* textureRepo;
std::vector<Enemy*> enemies;
DynamicMesh* motherMesh;
Texture* bodyTexture;
Texture* clothTexture;
};
} // namespace Demo
+58
View File
@@ -0,0 +1,58 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "state/global_state_type.hpp"
#include "./player/player.hpp"
#include "./renderer/game_renderer.hpp"
#include "./terrain/terrain.hpp"
#include "./skybox/skybox.hpp"
#include "./ship/ship.hpp"
#include "./hud/hud.hpp"
#include "./enemy/enemy_manager.hpp"
using std::unique_ptr;
namespace Demo {
class GameState : public State<GlobalStateType> {
public:
GameState(Engine* t_engine);
~GameState();
const GlobalStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
void update();
/** @return Next game state */
GlobalStateType onFinish();
private:
GlobalStateType state;
bool _wantFinish;
bool initialized;
u8 fpsChecker;
GameRenderer renderer;
unique_ptr<Player> player;
unique_ptr<EnemyManager> enemyManager;
unique_ptr<Terrain> terrain;
unique_ptr<Skybox> skybox;
unique_ptr<Ship> ship;
unique_ptr<Hud> hud;
};
} // namespace Demo
+39
View File
@@ -0,0 +1,39 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include <memory>
using std::unique_ptr;
using Tyra::Sprite;
using Tyra::Texture;
using Tyra::TextureRepository;
namespace Demo {
class Hud {
public:
Hud(TextureRepository* repo);
~Hud();
TextureRepository* repo;
unique_ptr<Sprite> hpSprite;
unique_ptr<Sprite> crosshairSprite;
unique_ptr<Sprite> soldierSprite;
Texture* hpTexture;
Texture* crosshairTexture;
Texture* soldierTexture;
};
} // namespace Demo
+40
View File
@@ -0,0 +1,40 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
using Tyra::CameraInfo3D;
using Tyra::Pad;
using Tyra::Vec4;
namespace Demo {
class Camera {
public:
Camera(Pad* pad);
~Camera();
Vec4 lookAt;
Vec4 position;
Vec4 unitCircle;
CameraInfo3D getCameraInfo() { return CameraInfo3D(&position, &lookAt); }
void update(const Vec4& playerPosition, const float& terrainHeight);
private:
float circleRotation, lengthFromOrigin, height;
Pad* pad;
};
} // namespace Demo
+53
View File
@@ -0,0 +1,53 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "states/game/renderer/renderer_dynamic_pair.hpp"
#include "states/game/renderer/renderer_static_pair.hpp"
#include "states/game/terrain/heightmap.hpp"
#include "./weapon.hpp"
#include "./camera.hpp"
#include "./player_shoot_action.hpp"
#include <tyra>
using Tyra::Engine;
using Tyra::Pad;
using Tyra::Renderer3DUtility;
using Tyra::Vec4;
namespace Demo {
class Player {
public:
Player(Engine* engine);
~Player();
const Vec4& getPosition() const { return position; }
CameraInfo3D getCameraInfo() { return camera.getCameraInfo(); }
RendererStaticPair* pair;
void update(const Heightmap& heightmap);
PlayerShootAction getShootAction() const;
private:
void handlePlayerPosition(const Heightmap& heightmap,
const float& terrainHeight);
float speed;
Pad* pad;
Vec4 position;
Weapon weapon;
Camera camera;
};
} // namespace Demo
@@ -0,0 +1,25 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include <optional>
using Tyra::Ray;
namespace Demo {
struct PlayerShootAction {
bool isShooting = false;
std::optional<Ray> ray;
};
} // namespace Demo
+54
View File
@@ -0,0 +1,54 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
using Tyra::Audio;
using Tyra::Engine;
using Tyra::Pad;
using Tyra::Renderer;
using Tyra::StaPipOptions;
using Tyra::StaticMesh;
using Tyra::TextureRepository;
using Tyra::Timer;
using Tyra::Vec4;
namespace Demo {
class Weapon {
public:
Weapon(Engine* engine);
~Weapon();
StaticMesh* mesh;
StaPipOptions* options;
bool isShooting = false;
void update();
private:
bool isShootAnimation1, isShootAnimation2;
Pad* pad;
Audio* audio;
Timer shootTimer;
Vec4 initialPosition;
u8 adpcmCurrentChannel;
u8 adpcmChannelsCount;
audsrv_adpcm_t* shootAdpcm;
void shoot();
void allocateOptions();
u8 getShootChannel();
};
} // namespace Demo
@@ -0,0 +1,52 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "./renderer_static_pair.hpp"
#include "./renderer_dynamic_pair.hpp"
using Tyra::CoreBBox;
using Tyra::DynamicPipeline;
using Tyra::Renderer;
using Tyra::Sprite;
using Tyra::StaticPipeline;
namespace Demo {
class GameRenderer {
public:
GameRenderer(Renderer* renderer);
~GameRenderer();
void add(std::vector<RendererStaticPair*> staticPairs);
void add(std::vector<RendererDynamicPair*> dynamicPairs);
void add(RendererStaticPair* staticPair);
void add(RendererDynamicPair* dynamicPair);
void add(Sprite* sprite);
void add(const CoreBBox& bbox);
void clear();
void render();
private:
Renderer* renderer;
StaticPipeline stpip;
DynamicPipeline dypip;
std::vector<RendererStaticPair*> staticPairs;
std::vector<RendererDynamicPair*> dynamicPairs;
std::vector<Sprite*> sprites;
std::vector<CoreBBox> bboxes;
};
} // namespace Demo
@@ -0,0 +1,25 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
using Tyra::DynamicMesh;
using Tyra::DynPipOptions;
namespace Demo {
struct RendererDynamicPair {
DynamicMesh* mesh;
DynPipOptions* options;
};
} // namespace Demo
@@ -0,0 +1,25 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
using Tyra::StaPipOptions;
using Tyra::StaticMesh;
namespace Demo {
struct RendererStaticPair {
StaticMesh* mesh;
StaPipOptions* options;
};
} // namespace Demo
+37
View File
@@ -0,0 +1,37 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "states/game/renderer/renderer_static_pair.hpp"
using Tyra::Renderer;
using Tyra::StaPipOptions;
using Tyra::StaticMesh;
using Tyra::TextureRepository;
using Tyra::Vec4;
namespace Demo {
class Ship {
public:
Ship(TextureRepository* repo);
~Ship();
StaticMesh* mesh;
StaPipOptions* options;
RendererStaticPair* pair;
private:
void allocateOptions();
};
} // namespace Demo
+39
View File
@@ -0,0 +1,39 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "states/game/renderer/renderer_static_pair.hpp"
using Tyra::Renderer;
using Tyra::StaPipOptions;
using Tyra::StaticMesh;
using Tyra::TextureRepository;
using Tyra::Vec4;
namespace Demo {
class Skybox {
public:
Skybox(TextureRepository* repo);
~Skybox();
StaticMesh* mesh;
StaPipOptions* options;
RendererStaticPair* pair;
void update(const Vec4& playerPosition);
private:
void allocateOptions();
};
} // namespace Demo
@@ -0,0 +1,43 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
using Tyra::Vec4;
namespace Demo {
class Heightmap {
public:
Heightmap(const float& minHeight, const float& maxHeight, const Vec4& leftUp,
const Vec4& rightDown);
~Heightmap();
const float& getHeightOffset(const Vec4& playerPosition) const;
bool isOutside(const Vec4& position) const;
float** map;
s16 mapWidth, mapHeight;
float minHeight, maxHeight;
Vec4 leftUp, rightDown;
private:
float getWidthPercentage(const Vec4& playerPosition) const;
float getHeightPercentage(const Vec4& playerPosition) const;
void allocateMap(const unsigned char* data, const int& width,
const int& height);
float getGameHeight(const u8& inputColor, const u8& minColor,
const u8& maxColor) const;
};
} // namespace Demo
+40
View File
@@ -0,0 +1,40 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <tyra>
#include "states/game/renderer/renderer_static_pair.hpp"
#include "./heightmap.hpp"
using Tyra::StaPipOptions;
using Tyra::StaticMesh;
using Tyra::TextureRepository;
using Tyra::Vec4;
namespace Demo {
class Terrain {
public:
Terrain(TextureRepository* repo);
~Terrain();
Heightmap heightmap;
StaticMesh* mesh;
StaPipOptions* options;
RendererStaticPair* pair;
float getHeightOffset(const Vec4& playerPosition);
private:
void allocateOptions();
};
} // namespace Demo
+44
View File
@@ -0,0 +1,44 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "state/global_state_type.hpp"
#include "state/state_manager.hpp"
#include "./intro_state_type.hpp"
namespace Demo {
class IntroState : public State<GlobalStateType> {
public:
IntroState(Engine* t_engine);
~IntroState();
const GlobalStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
void update();
/** @return Next game state */
GlobalStateType onFinish();
private:
GlobalStateType state;
bool _wantFinish;
bool initialized;
StateManager<IntroStateType> stateManager;
};
} // namespace Demo
@@ -0,0 +1,22 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
namespace Demo {
enum IntroStateType {
STATE_PS2DEV,
STATE_TYRA,
STATE_PRESS_KEY,
STATE_INTRO_END
};
} // namespace Demo
@@ -0,0 +1,74 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "../intro_state_type.hpp"
#include <tyra>
using Tyra::Sprite;
using Tyra::Texture;
using Tyra::Timer;
using Tyra::Vec2;
namespace Demo {
class IntroPressKeyState : public State<IntroStateType> {
public:
IntroPressKeyState(Engine* t_engine);
~IntroPressKeyState();
const IntroStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
/** @return Next game state */
IntroStateType onFinish();
void update();
private:
void renderFiller();
void updateMap();
IntroStateType state;
bool _wantFinish;
bool initialized;
bool mapFadeIn;
bool fillerFadeIn;
bool showPressKey;
bool pressKeyAlphaToggle;
u8 pressKeyAlphaDelayer;
float fillersOffset;
constexpr static float textureWidthHeight = 512.0F;
const static u8 mapRows = 3;
const static u8 mapCols = 3;
Vec2 mapPosition;
u8 mapDirection;
Texture* fillerTexture;
Sprite* fillerSprite;
Texture* logoTexture;
Sprite* logoSprite;
Texture* pressKeyTexture;
Sprite* pressKeySprite;
Texture* mapTextures[mapRows][mapCols];
Sprite* mapSprites[mapRows][mapCols];
};
} // namespace Demo
@@ -0,0 +1,54 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "../intro_state_type.hpp"
#include <tyra>
using Tyra::Sprite;
using Tyra::Texture;
using Tyra::Timer;
namespace Demo {
class IntroPs2DevState : public State<IntroStateType> {
public:
IntroPs2DevState(Engine* t_engine);
~IntroPs2DevState();
const IntroStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
void update();
/** @return Next game state */
IntroStateType onFinish();
private:
IntroStateType state;
bool _wantFinish;
Texture* texture;
Timer initialDelayTimer;
bool initialized;
bool initialDelayElapsed;
bool fadeinActivated;
bool fadeoutActivated;
u8 frameSkipper;
Sprite* sprite;
};
} // namespace Demo
@@ -0,0 +1,63 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "../intro_state_type.hpp"
#include <tyra>
using Tyra::Sprite;
using Tyra::Texture;
using Tyra::Timer;
namespace Demo {
class IntroTyraState : public State<IntroStateType> {
public:
IntroTyraState(Engine* t_engine);
~IntroTyraState();
const IntroStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
void update();
/** @return Next game state */
IntroStateType onFinish();
private:
IntroStateType state;
bool _wantFinish;
Texture* tyraTexture;
Texture* bgTexture;
Texture* bg2Texture;
Texture* fillerTexture;
Timer initialDelayTimer;
bool initialized;
bool initialDelayElapsed;
bool animActivated;
bool fadeoutActivated;
u8 frameSkipper;
Sprite* tyraSprite;
Sprite* bgSprite;
Sprite* bg2Sprite;
Sprite* fillerSprite;
void renderFillers();
};
} // namespace Demo
+41
View File
@@ -0,0 +1,41 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "state/state.hpp"
#include "state/global_state_type.hpp"
#include "state/state_manager.hpp"
namespace Demo {
class LoadingState : public State<GlobalStateType> {
public:
LoadingState(Engine* t_engine);
~LoadingState();
const GlobalStateType& getState() const { return state; }
const bool& wantFinish() const { return _wantFinish; };
void onStart();
void update();
/** @return Next game state */
GlobalStateType onFinish();
private:
GlobalStateType state;
bool _wantFinish;
bool initialized;
};
} // namespace Demo
+4
View File
@@ -0,0 +1,4 @@
$ConfigFile = Join-Path $PSScriptRoot '../windows-pcsx2.ps1'
. $ConfigFile
RunPCSX2
Executable
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../linux-pcsx2.sh
+35
View File
@@ -0,0 +1,35 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "demo_game.hpp"
#include "states/intro/intro_state.hpp"
#include "states/loading/loading_state.hpp"
#include "states/game/game_state.hpp"
namespace Demo {
DemoGame::DemoGame(Engine* t_engine)
: engine(t_engine), stateManager(STATE_INTRO, STATE_EXIT) {}
DemoGame::~DemoGame() {}
void DemoGame::init() {
stateManager.add(new IntroState(engine));
stateManager.add(new LoadingState(engine));
stateManager.add(new GameState(engine));
}
void DemoGame::loop() {
stateManager.update();
if (stateManager.finished()) {
exit(0);
}
}
} // namespace Demo
+29
View File
@@ -0,0 +1,29 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include <tyra>
#include "demo_game.hpp"
#include "game_settings.hpp"
int main() {
Tyra::EngineOptions options;
if (Demo::IS_REAL_PS2_VIA_USB) {
options.writeLogsToFile = true;
options.loadUsbDriver = true;
}
Tyra::Engine engine(options);
Demo::DemoGame game(&engine);
engine.run(&game);
SleepThread();
return 0;
}
+159
View File
@@ -0,0 +1,159 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/enemy/enemy.hpp"
#include <functional>
using Tyra::Color;
using Tyra::Math;
namespace Demo {
Enemy::Enemy(Engine* engine, const EnemyInfo& t_info) {
info = t_info;
mesh = new DynamicMesh(*info.motherMesh);
auto* bodyMaterial = mesh->getMaterialByName("BodyMaterial");
auto* clothMaterial = mesh->getMaterialByName("ClothMaterial");
TYRA_ASSERT(bodyMaterial != nullptr && clothMaterial != nullptr,
"Body and cloth materials not found!");
info.bodyTexture->addLink(bodyMaterial->id);
info.clothTexture->addLink(clothMaterial->id);
float r = Math::randomf(75.0F, 128.0F);
float g = Math::randomf(75.0F, 128.0F);
float b = Math::randomf(75.0F, 128.0F);
bodyMaterial->ambient.set(r, g, b);
clothMaterial->ambient.set(r, g, b);
walkSequence = {0, 1, 2};
fightSequence = {3, 4, 5};
terrainLeftUp = info.terrainLeftUp;
terrainRightDown = info.terrainRightDown;
setMeshToSpawn();
mesh->animation.setSequence(walkSequence);
mesh->animation.loop = true;
mesh->animation.setCallback(
std::bind(&Enemy::animationCallback, this, std::placeholders::_1));
mesh->translation.translateY(-5.0F);
audio = &engine->audio;
audio->adpcm.setVolume(30, info.adpcmChannel);
allocateOptions();
pair = new RendererDynamicPair{mesh, options};
}
Enemy::~Enemy() {
delete mesh;
delete options;
delete pair;
}
void Enemy::setMeshToSpawn() {
auto spawnPoint =
Vec4(Math::randomf(terrainLeftUp.x, terrainRightDown.x), 0.0F,
Math::randomf(terrainLeftUp.z, terrainRightDown.z), 1.0F);
mesh->setPosition(spawnPoint);
}
void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition,
const PlayerShootAction& shootAction) {
auto* enemyPosition = mesh->getPosition();
handlePlayerShoot(shootAction);
auto diff = *enemyPosition - playerPosition;
auto ang = Math::atan2(diff.x, diff.z);
if (diff.length() > 150.0F) {
walk(heightmap, diff);
} else {
fight();
}
const float naturalRotation = 3.1F;
mesh->rotation.identity();
ang += naturalRotation;
mesh->rotation.rotateByAngle(ang, Vec4(0.0F, 1.0F, 0.0F, 0.0F));
mesh->update();
}
void Enemy::handlePlayerShoot(const PlayerShootAction& shootAction) {
if (!shootAction.isShooting) {
return;
}
const auto& ray = shootAction.ray.value();
auto bbox =
mesh->getCurrentBoundingBox().getTransformed(mesh->getModelMatrix());
auto isOnEnemy = ray.intersectBox(bbox.min(), bbox.max());
if (isOnEnemy) {
setMeshToSpawn();
audio->adpcm.tryPlay(info.adpcmDeath, info.adpcmChannel);
}
}
void Enemy::walk(const Heightmap& heightmap, const Vec4& positionDiff) {
if (isFighting) {
mesh->animation.setSequence(walkSequence);
}
isFighting = false;
isWalking = true;
auto* enemyPosition = mesh->getPosition();
auto normalized = positionDiff;
normalized.normalize();
const float speed = 2.5F;
auto nextPos = *enemyPosition - normalized * speed;
nextPos.y = heightmap.getHeightOffset(nextPos) - 60.0F;
mesh->translation.identity();
mesh->translation.translate(nextPos);
}
void Enemy::fight() {
if (isWalking) {
mesh->animation.setSequence(fightSequence);
}
isFighting = true;
isWalking = false;
}
void Enemy::animationCallback(const AnimationSequenceCallback& callback) {
if (callback == AnimationSequenceCallback::AnimationSequenceCallback_Loop) {
if (isFighting) {
audio->adpcm.tryPlay(info.adpcmPunch, info.adpcmChannel);
}
}
}
void Enemy::allocateOptions() {
options = new DynPipOptions();
options->frustumCulling =
Tyra::PipelineFrustumCulling::PipelineFrustumCulling_None;
}
} // namespace Demo
@@ -0,0 +1,92 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/enemy/enemy_manager.hpp"
#include <functional>
#include "game_settings.hpp"
using Tyra::FileUtils;
using Tyra::Math;
using Tyra::ObjLoader;
using Tyra::ObjLoaderOptions;
namespace Demo {
EnemyManager::EnemyManager(Engine* engine, const Heightmap& heightmap) {
textureRepo = &engine->renderer.core.texture.repository;
ObjLoader loader;
ObjLoaderOptions objOptions;
objOptions.animation.count = 6;
objOptions.flipUVs = true;
objOptions.scale = 250.0F;
auto data = loader.load(FileUtils::fromCwd("game/models/zombie/zombie.obj"),
objOptions);
data->loadNormals = false;
motherMesh = new DynamicMesh(data.get());
bodyTexture = textureRepo->add(
FileUtils::fromCwd("game/models/zombie/BodyMaterial.png"));
clothTexture = textureRepo->add(
FileUtils::fromCwd("game/models/zombie/ClothMaterial.png"));
auto* punch = engine->audio.adpcm.load(
FileUtils::fromCwd("game/models/zombie/punch.adpcm"));
auto* death = engine->audio.adpcm.load(
FileUtils::fromCwd("game/models/zombie/death.adpcm"));
const int enemyCount = IS_REAL_PS2_VIA_USB ? 8 : 12;
for (int i = 0; i < enemyCount; i++) {
EnemyInfo info;
info.adpcmChannel = 9 + i;
info.adpcmPunch = punch;
info.adpcmDeath = death;
info.motherMesh = motherMesh;
info.clothTexture = clothTexture;
info.bodyTexture = bodyTexture;
info.terrainLeftUp = heightmap.leftUp;
info.terrainRightDown = heightmap.rightDown;
enemies.push_back(new Enemy(engine, info));
}
}
EnemyManager::~EnemyManager() {
for (auto* enemy : enemies) {
delete enemy;
}
delete motherMesh;
textureRepo->free(bodyTexture->id);
textureRepo->free(clothTexture->id);
}
std::vector<RendererDynamicPair*> EnemyManager::getPairs() const {
std::vector<RendererDynamicPair*> result;
for (auto* enemy : enemies) {
result.push_back(enemy->pair);
}
return result;
}
void EnemyManager::update(const Heightmap& heightmap,
const Vec4& playerPosition,
const PlayerShootAction& shootAction) {
for (auto* enemy : enemies) {
enemy->update(heightmap, playerPosition, shootAction);
}
}
} // namespace Demo
+97
View File
@@ -0,0 +1,97 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/game_state.hpp"
#include "game_settings.hpp"
using std::make_unique;
using Tyra::FileUtils;
namespace Demo {
GameState::GameState(Engine* t_engine)
: State(t_engine), renderer(&t_engine->renderer) {
state = STATE_GAME;
_wantFinish = false;
initialized = false;
fpsChecker = 0;
}
GameState::~GameState() {}
void GameState::onStart() {
TYRA_LOG("Game. RAM: ", engine->info.getAvailableRAM(), "MB");
engine->audio.song.stop();
engine->audio.song.inLoop = true;
engine->audio.song.load(FileUtils::fromCwd("game/game-audio.wav"));
engine->audio.song.setVolume(0);
engine->audio.song.play();
auto* repository = &engine->renderer.core.texture.repository;
player = make_unique<Player>(engine);
terrain = make_unique<Terrain>(repository);
enemyManager = make_unique<EnemyManager>(engine, terrain->heightmap);
ship = make_unique<Ship>(repository);
skybox = make_unique<Skybox>(repository);
hud = make_unique<Hud>(repository);
engine->audio.song.setVolume(85);
if (IS_REAL_PS2_VIA_USB) engine->renderer.setFrameLimit(false);
initialized = true;
}
GlobalStateType GameState::onFinish() {
if (!initialized) return STATE_EXIT;
initialized = false;
return STATE_EXIT;
}
void GameState::update() {
// Check fps
if (fpsChecker++ > 50) {
TYRA_LOG("FPS: ", engine->info.getFps(),
" RAM: ", engine->info.getAvailableRAM());
fpsChecker = 0;
}
// Game logic
player->update(terrain->heightmap);
skybox->update(player->getPosition());
auto shootAction = player->getShootAction();
enemyManager->update(terrain->heightmap, player->getPosition(), shootAction);
auto* firstEnemyMesh = enemyManager->getPairs().front()->mesh;
// Render
engine->renderer.beginFrame(player->getCameraInfo());
{
renderer.clear();
{
renderer.add(skybox->pair); // First, because of ALLPASS
renderer.add(ship->pair);
renderer.add(player->pair);
renderer.add(enemyManager->getPairs());
renderer.add(terrain->pair);
renderer.add(firstEnemyMesh->getCurrentBoundingBox().getTransformed(
firstEnemyMesh->getModelMatrix()));
renderer.add(hud->crosshairSprite.get());
renderer.add(hud->hpSprite.get());
renderer.add(hud->soldierSprite.get());
}
renderer.render();
}
engine->renderer.endFrame();
}
} // namespace Demo
+51
View File
@@ -0,0 +1,51 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/hud/hud.hpp"
using Tyra::FileUtils;
namespace Demo {
Hud::Hud(TextureRepository* t_repo) {
repo = t_repo;
soldierSprite = std::make_unique<Sprite>();
soldierSprite->mode = Tyra::MODE_STRETCH;
soldierSprite->size.set(64.0F, 64.0F);
soldierSprite->position.set(5.0F, 448.0F - 64.0F - 5.0F);
soldierTexture = repo->add(FileUtils::fromCwd("game/soldier.png"));
soldierTexture->addLink(soldierSprite->id);
hpSprite = std::make_unique<Sprite>();
hpSprite->mode = Tyra::MODE_STRETCH;
hpSprite->size.set(128.0F, 64.0F);
hpSprite->position.set(70.0F, 448.0F - 64.0F - 5.0F);
hpTexture = repo->add(FileUtils::fromCwd("game/health_bar.png"));
hpTexture->addLink(hpSprite->id);
crosshairSprite = std::make_unique<Sprite>();
crosshairSprite->mode = Tyra::MODE_STRETCH;
crosshairSprite->size.set(16.0F, 16.0F);
crosshairSprite->position.set(512.0F / 2.0F - 16.0F / 2,
448.0F / 2.0F - 16.0F / 2);
crosshairTexture = repo->add(FileUtils::fromCwd("game/crosshair.png"));
crosshairTexture->addLink(crosshairSprite->id);
}
Hud::~Hud() {
repo->free(crosshairTexture->id);
repo->free(hpTexture->id);
}
} // namespace Demo
+49
View File
@@ -0,0 +1,49 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/player/camera.hpp"
namespace Demo {
Camera::Camera(Pad* t_pad) : lookAt(0.0F), position(0.0F), pad(t_pad) {
lengthFromOrigin = 30.0F;
circleRotation = -3.5F;
height = 1.5F;
}
Camera::~Camera() {}
void Camera::update(const Vec4& playerPosition, const float& terrainHeight) {
const float rotationOffset = 0.045F;
const float heightOffset = 0.5F;
const auto& rightJoy = pad->getRightJoyPad();
if (rightJoy.h <= 100) {
circleRotation -= rotationOffset;
} else if (rightJoy.h >= 200) {
circleRotation += rotationOffset;
}
if (rightJoy.v <= 100) {
height -= heightOffset;
} else if (rightJoy.v >= 200) {
height += heightOffset;
}
unitCircle.x = (sin(circleRotation) * lengthFromOrigin);
unitCircle.y = height;
unitCircle.z = (cos(circleRotation) * lengthFromOrigin);
position = playerPosition;
lookAt = unitCircle + playerPosition;
}
} // namespace Demo
+77
View File
@@ -0,0 +1,77 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/player/player.hpp"
namespace Demo {
Player::Player(Engine* engine)
: position(0.0F), weapon(engine), camera(&engine->pad) {
pair = new RendererStaticPair{weapon.mesh, weapon.options};
pad = &engine->pad;
position = Vec4(3.0F, 50.0F, 0.0F);
camera.lookAt = Vec4(0.0F, 0.0F, -30.0F);
speed = 6.0F;
}
Player::~Player() { delete pair; }
void Player::update(const Heightmap& heightmap) {
float terrainHeight = heightmap.getHeightOffset(getPosition());
handlePlayerPosition(heightmap, terrainHeight);
camera.update(position, terrainHeight);
weapon.update();
}
PlayerShootAction Player::getShootAction() const {
PlayerShootAction action;
action.isShooting = weapon.isShooting;
if (action.isShooting) {
action.ray =
Ray(camera.position, (camera.lookAt - camera.position).getNormalized());
}
return action;
}
void Player::handlePlayerPosition(const Heightmap& heightmap,
const float& terrainHeight) {
const auto& leftJoy = pad->getLeftJoyPad();
auto normalizedCamera = Vec4(camera.unitCircle);
normalizedCamera.normalize();
normalizedCamera *= speed;
Vec4 nextPosition(position);
nextPosition.y = terrainHeight + 50.0F;
if (leftJoy.v <= 100) {
nextPosition.x += normalizedCamera.x;
nextPosition.z += normalizedCamera.z;
} else if (leftJoy.v >= 200) {
nextPosition.x += -normalizedCamera.x;
nextPosition.z += -normalizedCamera.z;
}
if (leftJoy.h <= 100) {
nextPosition.x += normalizedCamera.z;
nextPosition.z += -normalizedCamera.x;
} else if (leftJoy.h >= 200) {
nextPosition.x += -normalizedCamera.z;
nextPosition.z += normalizedCamera.x;
}
if (!heightmap.isOutside(nextPosition)) position = nextPosition;
camera.position = position;
}
} // namespace Demo
+131
View File
@@ -0,0 +1,131 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/player/weapon.hpp"
using Tyra::FileUtils;
using Tyra::ObjLoader;
using Tyra::ObjLoaderOptions;
namespace Demo {
Weapon::Weapon(Engine* engine) {
ObjLoader loader;
ObjLoaderOptions objOptions;
objOptions.flipUVs = true;
objOptions.scale = .5F;
pad = &engine->pad;
audio = &engine->audio;
auto* repo = &engine->renderer.core.texture.repository;
auto data =
loader.load(FileUtils::fromCwd("game/models/ak47/ak47.obj"), objOptions);
data->loadNormals = false;
mesh = new StaticMesh(data.get());
mesh->translation.translateX(2.85F);
mesh->translation.translateY(-3.40F);
mesh->translation.translateZ(-10.50F);
mesh->rotation.rotateY(1.60F);
mesh->rotation.rotateZ(-6.30F);
mesh->scale.scale(0.5F);
repo->addByMesh(mesh, FileUtils::fromCwd("game/models/ak47/"), "png");
initialPosition = *mesh->getPosition();
allocateOptions();
shootAdpcm =
audio->adpcm.load(FileUtils::fromCwd("game/models/ak47/ak47.adpcm"));
isShootAnimation1 = isShootAnimation2 = false;
adpcmChannelsCount = 8;
adpcmCurrentChannel = 0;
const u8 shootVolume = 25;
for (u8 i = 0; i < adpcmChannelsCount; i++) {
audio->adpcm.setVolume(shootVolume, i);
}
}
Weapon::~Weapon() {
delete mesh;
delete options;
delete shootAdpcm;
}
u8 Weapon::getShootChannel() {
auto result = adpcmCurrentChannel++;
if (adpcmCurrentChannel >= adpcmChannelsCount) {
adpcmCurrentChannel = 0;
}
return result;
}
void Weapon::update() {
isShooting = false;
if (!isShootAnimation1 && !isShootAnimation2 && pad->getPressed().Cross) {
shoot();
}
auto* position = mesh->getPosition();
const float recoil = 0.5F;
const float speed = 500;
if (isShootAnimation1) {
position->z += recoil;
position->y -= recoil / 4;
if (shootTimer.getTimeDelta() > speed) {
isShootAnimation1 = false;
shootTimer.prime();
isShootAnimation2 = true;
}
}
if (isShootAnimation2) {
position->z -= recoil / 2;
position->y += recoil / 8;
if (shootTimer.getTimeDelta() > speed * 2) {
isShootAnimation2 = false;
*position = initialPosition;
if (pad->getPressed().Cross) {
shoot();
}
}
}
}
void Weapon::shoot() {
isShooting = true;
shootTimer.prime();
audio->adpcm.tryPlay(shootAdpcm, getShootChannel());
isShootAnimation1 = true;
}
void Weapon::allocateOptions() {
options = new StaPipOptions();
options->textureMappingType = Tyra::TyraNearest;
options->shadingType = Tyra::TyraShadingFlat;
options->blendingEnabled = false;
options->fullClipChecks = false;
options->frustumCulling = Tyra::PipelineFrustumCulling_None;
options->transformationType = Tyra::TyraMP;
options->antiAliasingEnabled = false;
}
} // namespace Demo
@@ -0,0 +1,89 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/renderer/game_renderer.hpp"
using Tyra::Threading;
namespace Demo {
GameRenderer::GameRenderer(Renderer* t_renderer) {
renderer = t_renderer;
stpip.setRenderer(&renderer->core);
dypip.setRenderer(&renderer->core);
}
GameRenderer::~GameRenderer() {}
void GameRenderer::add(std::vector<RendererStaticPair*> t_staticPairs) {
staticPairs.insert(staticPairs.end(), t_staticPairs.begin(),
t_staticPairs.end());
}
void GameRenderer::add(std::vector<RendererDynamicPair*> t_dynamicPairs) {
dynamicPairs.insert(dynamicPairs.end(), t_dynamicPairs.begin(),
t_dynamicPairs.end());
}
void GameRenderer::add(Sprite* sprite) { sprites.push_back(sprite); }
void GameRenderer::add(const CoreBBox& bbox) { bboxes.push_back(bbox); }
void GameRenderer::add(RendererStaticPair* staticPair) {
staticPairs.push_back(staticPair);
}
void GameRenderer::add(RendererDynamicPair* dynamicPair) {
dynamicPairs.push_back(dynamicPair);
}
void GameRenderer::clear() {
staticPairs.clear();
dynamicPairs.clear();
sprites.clear();
bboxes.clear();
}
void GameRenderer::render() {
// Render static stuff
if (staticPairs.size()) {
renderer->renderer3D.usePipeline(&stpip);
for (auto& pair : staticPairs) {
stpip.render(pair->mesh, pair->options);
}
}
Threading::switchThread(); // give some time for audio thread
// Render animated stuff
if (dynamicPairs.size()) {
renderer->renderer3D.usePipeline(&dypip);
for (auto& pair : dynamicPairs) {
dypip.render(pair->mesh, pair->options);
}
}
Threading::switchThread();
// Render debug stuff after stapip/dynpip, otherwise it will not be visible
for (auto& bbox : bboxes) {
renderer->renderer3D.utility.drawBBox(bbox);
}
// Render 2D
for (auto& sprite : sprites) {
renderer->renderer2D.render(sprite);
}
}
} // namespace Demo
+50
View File
@@ -0,0 +1,50 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/ship/ship.hpp"
using Tyra::FileUtils;
using Tyra::ObjLoader;
using Tyra::ObjLoaderOptions;
namespace Demo {
Ship::Ship(TextureRepository* repo) {
ObjLoader loader;
ObjLoaderOptions objOptions;
objOptions.flipUVs = true;
objOptions.scale = 200.0F;
auto data =
loader.load(FileUtils::fromCwd("game/models/ship/ship.obj"), objOptions);
mesh = new StaticMesh(data.get());
for (std::size_t i = 0; i < mesh->materials.size(); i++) {
mesh->materials[i]->ambient /= 2.0F;
mesh->materials[i]->ambient.a = 128.0F;
}
mesh->setPosition(Vec4(-800.0F, 10.0F, -2500.0F));
allocateOptions();
pair = new RendererStaticPair{mesh, options};
}
Ship::~Ship() {
delete mesh;
delete options;
delete pair;
}
void Ship::allocateOptions() { options = new StaPipOptions(); }
} // namespace Demo
+59
View File
@@ -0,0 +1,59 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/skybox/skybox.hpp"
using Tyra::FileUtils;
using Tyra::ObjLoader;
using Tyra::ObjLoaderOptions;
namespace Demo {
Skybox::Skybox(TextureRepository* repo) {
ObjLoader loader;
ObjLoaderOptions objOptions;
objOptions.flipUVs = true;
objOptions.scale = 100.0F;
auto data = loader.load(FileUtils::fromCwd("game/models/skybox/skybox.obj"),
objOptions);
data->loadNormals = false;
mesh = new StaticMesh(data.get());
repo->addByMesh(mesh, FileUtils::fromCwd("game/models/skybox/"), "png");
allocateOptions();
pair = new RendererStaticPair{mesh, options};
}
Skybox::~Skybox() {
delete mesh;
delete options;
delete pair;
}
void Skybox::update(const Vec4& playerPosition) {
mesh->translation.identity();
mesh->translation.translate(playerPosition);
}
void Skybox::allocateOptions() {
options = new StaPipOptions();
options->frustumCulling = Tyra::PipelineFrustumCulling_None;
options->shadingType = Tyra::TyraShadingGouraud;
options->zTestType = Tyra::PipelineZTest_AllPass;
options->textureMappingType = Tyra::TyraNearest;
options->blendingEnabled = true;
options->antiAliasingEnabled = false;
}
} // namespace Demo
+113
View File
@@ -0,0 +1,113 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/terrain/heightmap.hpp"
using Tyra::FileUtils;
using Tyra::PngLoader;
using Tyra::PngPixel3;
using Tyra::Vec4;
namespace Demo {
Heightmap::Heightmap(const float& t_minHeight, const float& t_maxHeight,
const Vec4& t_leftUp, const Vec4& t_rightDown)
: minHeight(t_minHeight),
maxHeight(t_maxHeight),
leftUp(t_leftUp),
rightDown(t_rightDown) {
PngLoader loader;
auto* data =
loader.load(FileUtils::fromCwd("game/models/terrain/heightmap.png"));
allocateMap(data->data, data->width, data->height);
delete data;
}
bool Heightmap::isOutside(const Vec4& position) const {
return position.x <= leftUp.x || position.x >= rightDown.x ||
position.z <= leftUp.z || position.z >= rightDown.z;
}
Heightmap::~Heightmap() {
if (map) {
for (int i = 0; i < mapHeight; i++) {
delete[] map[i];
}
delete[] map;
}
}
const float& Heightmap::getHeightOffset(const Vec4& playerPosition) const {
float widthPercentage = getWidthPercentage(playerPosition);
float heightPercentage = getHeightPercentage(playerPosition);
auto x = static_cast<s16>(widthPercentage * mapWidth);
auto y = static_cast<s16>(heightPercentage * mapHeight);
TYRA_ASSERT(x >= 0 && x < mapWidth, "x is out of range");
TYRA_ASSERT(y >= 0 && y < mapHeight, "y is out of range");
return map[x][y];
}
float Heightmap::getWidthPercentage(const Vec4& playerPosition) const {
return (playerPosition.x - leftUp.x) / (rightDown.x - leftUp.x);
}
float Heightmap::getHeightPercentage(const Vec4& playerPosition) const {
return (playerPosition.z - leftUp.z) / (rightDown.z - leftUp.z);
}
void Heightmap::allocateMap(const unsigned char* data, const int& width,
const int& height) {
auto* pixels = (struct PngPixel3*)data;
u8 min = pixels[0].r; // in grayscale every r,g,b is the same
u8 max = pixels[0].r;
// Get min and max
for (int i = 0; i < width * height; i++) {
const auto& value = pixels[i].r;
if (value < min) {
min = value;
}
if (value > max) {
max = value;
}
}
// Allocate
mapWidth = width;
mapHeight = height;
map = new float*[width];
for (int i = 0; i < width; i++) {
map[i] = new float[height];
}
// Fill
int k = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
map[i][j] = getGameHeight(pixels[k++].r, min, max);
}
}
}
float Heightmap::getGameHeight(const u8& inputColor, const u8& minColor,
const u8& maxColor) const {
const float mapRange = maxColor - minColor;
const float gameRange = maxHeight - minHeight;
return (inputColor - minColor) / mapRange * gameRange + minHeight;
}
} // namespace Demo
+60
View File
@@ -0,0 +1,60 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/terrain/terrain.hpp"
using Tyra::FileUtils;
using Tyra::ObjLoader;
using Tyra::ObjLoaderOptions;
namespace Demo {
Terrain::Terrain(TextureRepository* repo)
: heightmap(-70.0F, // Min height
240.0F, // Max height
Vec4(-750.0F, 0.0F, -1400.0F, 1.0F), // Left up
Vec4(920.0F, 0.0F, 1520.0F, 1.0F) // Right down
) {
ObjLoader loader;
ObjLoaderOptions objOptions;
objOptions.flipUVs = true;
objOptions.scale = 100.0F;
auto data = loader.load(FileUtils::fromCwd("game/models/terrain/terrain.obj"),
objOptions);
data->loadNormals = false;
mesh = new StaticMesh(data.get());
repo->addByMesh(mesh, FileUtils::fromCwd("game/models/terrain/"), "png");
allocateOptions();
pair = new RendererStaticPair{mesh, options};
}
float Terrain::getHeightOffset(const Vec4& playerPosition) {
return heightmap.getHeightOffset(playerPosition);
}
Terrain::~Terrain() {
delete mesh;
delete options;
delete pair;
}
void Terrain::allocateOptions() {
options = new StaPipOptions();
options->frustumCulling = Tyra::PipelineFrustumCulling_None;
options->shadingType = Tyra::TyraShadingGouraud;
options->blendingEnabled = true;
options->antiAliasingEnabled = false;
}
} // namespace Demo
+62
View File
@@ -0,0 +1,62 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/intro/intro_state.hpp"
#include "states/intro/states/intro_ps2dev_state.hpp"
#include "states/intro/states/intro_tyra_state.hpp"
#include "states/intro/states/intro_press_key_state.hpp"
using Tyra::FileUtils;
namespace Demo {
IntroState::IntroState(Engine* t_engine)
: State(t_engine), stateManager(STATE_PS2DEV, STATE_INTRO_END) {
state = STATE_INTRO;
_wantFinish = false;
initialized = false;
}
IntroState::~IntroState() {}
void IntroState::onStart() {
TYRA_LOG("Intro. RAM: ", engine->info.getAvailableRAM(), "MB");
engine->audio.song.load(FileUtils::fromCwd("intro/intro.wav"));
engine->audio.song.inLoop = false;
engine->audio.song.setVolume(80);
engine->audio.song.play();
stateManager.add(new IntroPs2DevState(engine));
stateManager.add(new IntroTyraState(engine));
stateManager.add(new IntroPressKeyState(engine));
initialized = true;
}
GlobalStateType IntroState::onFinish() {
if (!initialized) return STATE_LOADING;
stateManager.freeAll();
initialized = false;
return STATE_LOADING;
}
void IntroState::update() {
stateManager.update();
if (stateManager.finished()) {
_wantFinish = true;
}
}
} // namespace Demo
@@ -0,0 +1,198 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/intro/states/intro_press_key_state.hpp"
#include <string>
using Tyra::FileUtils;
using Tyra::Math;
using Tyra::PngLoader;
using Tyra::SpriteMode;
using Tyra::Threading;
namespace Demo {
IntroPressKeyState::IntroPressKeyState(Engine* t_engine)
: State(t_engine), mapPosition(0.0F, 0.0F) {
state = STATE_PRESS_KEY;
_wantFinish = false;
mapDirection = 0;
mapFadeIn = true;
fillerFadeIn = false;
showPressKey = false;
pressKeyAlphaToggle = false;
pressKeyAlphaDelayer = 0;
fillersOffset = -512.0F;
}
IntroPressKeyState::~IntroPressKeyState() {}
void IntroPressKeyState::onStart() {
TYRA_LOG("Intro - presskey. RAM: ", engine->info.getAvailableRAM(), "MB");
for (u8 i = 0; i < mapRows; i++) {
for (u8 j = 0; j < mapCols; j++) {
mapSprites[i][j] = new Sprite;
mapSprites[i][j]->color.a = 0.0F;
mapSprites[i][j]->mode = SpriteMode::MODE_STRETCH;
mapSprites[i][j]->size.set(textureWidthHeight, textureWidthHeight);
mapSprites[i][j]->position.set(i * textureWidthHeight,
j * textureWidthHeight);
std::string filename =
"map-" + std::to_string(i) + "-" + std::to_string(j);
std::string path = "intro/map/" + filename + ".png";
mapTextures[i][j] = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd(path));
mapTextures[i][j]->addLink(mapSprites[i][j]->id);
}
}
fillerSprite = new Sprite;
fillerSprite->size.set(256.0F, 50.0F);
fillerSprite->position.set(0.0F, 224.0F - 25.0F);
fillerTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/filler.png"));
fillerTexture->addLink(fillerSprite->id);
pressKeySprite = new Sprite;
pressKeySprite->size.set(256.0F, 64.0F);
pressKeySprite->scale = 0.5F;
pressKeySprite->position.set(192.0F, 380.0F);
pressKeyTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/press-key.png"));
pressKeyTexture->addLink(pressKeySprite->id);
logoSprite = new Sprite;
logoSprite->size.set(256.0F, 128.0F);
logoSprite->position.set(256.0F - 128.0F, 224.0F - 64.0F);
logoTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/lastalive.png"));
logoTexture->addLink(logoSprite->id);
initialized = true;
}
IntroStateType IntroPressKeyState::onFinish() {
if (!initialized) return STATE_INTRO_END;
for (u8 i = 0; i < mapRows; i++)
for (u8 j = 0; j < mapCols; j++) {
engine->renderer.core.texture.repository.free(mapTextures[i][j]->id);
delete mapSprites[i][j];
}
engine->renderer.core.texture.repository.free(fillerTexture->id);
delete fillerSprite;
engine->renderer.core.texture.repository.free(logoTexture->id);
delete logoSprite;
engine->renderer.core.texture.repository.free(pressKeyTexture->id);
delete pressKeySprite;
initialized = false;
return STATE_INTRO_END;
}
void IntroPressKeyState::update() {
engine->renderer.beginFrame();
if (mapDirection == 0 &&
mapPosition.x >= textureWidthHeight * (mapRows - 1) &&
mapPosition.y >= textureWidthHeight * (mapCols - 1)) {
mapDirection = 1;
} else if (mapDirection == 1 && mapPosition.x <= 0.0F &&
mapPosition.y <= 0.0F) {
mapDirection = 0;
}
if (engine->pad.getClicked().Cross) {
_wantFinish = true;
}
const float offset = 0.1F;
if (mapDirection == 0) {
mapPosition += offset;
} else if (mapDirection == 1) {
mapPosition -= offset;
}
if (mapFadeIn) {
for (u8 i = 0; i < mapRows; i++) {
for (u8 j = 0; j < mapCols; j++) {
auto* sprite = mapSprites[i][j];
if (sprite->color.a >= 16.0F && sprite->color.a < 32.0F) {
fillerFadeIn = true;
}
if (sprite->color.a < 96.0F) {
sprite->color.a += 0.2F;
} else {
mapFadeIn = false;
}
}
}
}
if (fillerFadeIn) {
if (fillersOffset < -1.0F) {
fillersOffset += 4.0F;
} else {
fillerFadeIn = false;
showPressKey = true;
}
}
updateMap();
Threading::switchThread();
for (u8 i = 0; i < mapRows; i++)
for (u8 j = 0; j < mapCols; j++)
engine->renderer.renderer2D.render(mapSprites[i][j]);
renderFiller();
engine->renderer.renderer2D.render(logoSprite);
if (showPressKey) {
if (pressKeyAlphaDelayer++ > 50) {
pressKeyAlphaToggle = !pressKeyAlphaToggle;
pressKeyAlphaDelayer = 0;
}
if (pressKeyAlphaToggle) {
engine->renderer.renderer2D.render(pressKeySprite);
}
}
engine->renderer.endFrame();
}
void IntroPressKeyState::renderFiller() {
fillerSprite->position.x = -1.0F + fillersOffset;
engine->renderer.renderer2D.render(fillerSprite);
fillerSprite->position.x = 255.0F + fillersOffset;
engine->renderer.renderer2D.render(fillerSprite);
}
void IntroPressKeyState::updateMap() {
for (u8 i = 0; i < mapRows; i++)
for (u8 j = 0; j < mapCols; j++) {
mapSprites[i][j]->position.x =
i * (textureWidthHeight + 1.0F) - mapPosition.x;
mapSprites[i][j]->position.y =
j * (textureWidthHeight + 1.0F) - mapPosition.y;
}
}
} // namespace Demo
@@ -0,0 +1,104 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/intro/states/intro_ps2dev_state.hpp"
using Tyra::FileUtils;
using Tyra::PngLoader;
using Tyra::Threading;
namespace Demo {
IntroPs2DevState::IntroPs2DevState(Engine* t_engine) : State(t_engine) {
state = STATE_PS2DEV;
_wantFinish = false;
initialized = false;
initialDelayElapsed = false;
frameSkipper = 0;
fadeinActivated = true;
fadeoutActivated = false;
}
IntroPs2DevState::~IntroPs2DevState() {}
void IntroPs2DevState::onStart() {
TYRA_LOG("Intro - ps2dev. RAM: ", engine->info.getAvailableRAM(), "MB");
const auto& settings = engine->renderer.core.getSettings();
initialDelayTimer.prime();
sprite = new Sprite;
sprite->size.set(256.0F, 64.0F);
sprite->position.set(settings.getWidth() / 2 - sprite->size.x / 2,
settings.getHeight() / 2 - sprite->size.y / 2);
sprite->color.a = 0;
Threading::switchThread();
texture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/ps2dev.png"));
texture->addLink(sprite->id);
initialized = true;
}
IntroStateType IntroPs2DevState::onFinish() {
if (!initialized) return STATE_TYRA;
delete sprite;
engine->renderer.core.texture.repository.free(texture->id);
initialized = false;
return STATE_TYRA;
}
void IntroPs2DevState::update() {
engine->renderer.beginFrame();
if (initialDelayTimer.getTimeDelta() >= 60000) initialDelayElapsed = true;
if (engine->pad.getClicked().Cross) {
_wantFinish = true;
}
frameSkipper++;
if (frameSkipper > 3) {
frameSkipper = 0;
}
if (fadeinActivated && initialDelayElapsed && frameSkipper == 0) {
if (sprite->color.a < 128.0F)
sprite->color.a += 2.0F;
else {
fadeoutActivated = true;
fadeinActivated = false;
}
if (sprite->color.a >= 96.0F && sprite->color.a < 128.0F) {
sprite->color.g -= 6.0F;
sprite->color.b -= 6.0F;
}
}
Threading::switchThread();
if (fadeoutActivated && frameSkipper == 0) {
if (sprite->color.a > 0)
sprite->color.a -= 4;
else
_wantFinish = true;
}
engine->renderer.renderer2D.render(sprite);
engine->renderer.endFrame();
}
} // namespace Demo
@@ -0,0 +1,180 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/intro/states/intro_tyra_state.hpp"
using Tyra::FileUtils;
using Tyra::Math;
using Tyra::PngLoader;
using Tyra::Threading;
namespace Demo {
IntroTyraState::IntroTyraState(Engine* t_engine) : State(t_engine) {
state = STATE_TYRA;
_wantFinish = false;
initialized = false;
initialDelayElapsed = false;
animActivated = true;
fadeoutActivated = false;
frameSkipper = 0;
}
IntroTyraState::~IntroTyraState() {}
void IntroTyraState::onStart() {
TYRA_LOG("Intro - tyra. RAM: ", engine->info.getAvailableRAM(), "MB");
const auto& settings = engine->renderer.core.getSettings();
initialDelayTimer.prime();
tyraSprite = new Sprite;
tyraSprite->size.set(256.0F, 64.0F);
tyraSprite->position.set(settings.getWidth() / 2 - tyraSprite->size.x / 2,
settings.getHeight() / 2 - tyraSprite->size.y / 2);
bgSprite = new Sprite;
bgSprite->size.set(256.0F, 256.0F);
bgSprite->position.set(settings.getWidth() / 2 - bgSprite->size.x / 2,
settings.getHeight() / 3 * 2.0F);
bg2Sprite = new Sprite;
bg2Sprite->size.set(256.0F, 256.0F);
bg2Sprite->position.set(
settings.getWidth() / 2 - bg2Sprite->size.x / 2,
(settings.getHeight() / 3 * 2.0F) + bg2Sprite->size.y + 1.0F);
fillerSprite = new Sprite;
fillerSprite->size.set(256.0F, 256.0F);
fillerSprite->position.set(0.0F, 0.0F);
tyraTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/tyra.png"));
tyraTexture->addLink(tyraSprite->id);
bgTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/tyra_bg.png"));
bgTexture->addLink(bgSprite->id);
Threading::switchThread();
bg2Texture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/tyra_bg2.png"));
bg2Texture->addLink(bg2Sprite->id);
fillerTexture = engine->renderer.core.texture.repository.add(
FileUtils::fromCwd("intro/filler.png"));
fillerTexture->addLink(fillerSprite->id);
initialized = true;
}
IntroStateType IntroTyraState::onFinish() {
if (!initialized) return STATE_PRESS_KEY;
engine->renderer.core.texture.repository.free(tyraTexture->id);
engine->renderer.core.texture.repository.free(bgTexture->id);
engine->renderer.core.texture.repository.free(bg2Texture->id);
engine->renderer.core.texture.repository.free(fillerTexture->id);
delete tyraSprite;
delete bgSprite;
delete bg2Sprite;
delete fillerSprite;
initialized = false;
return STATE_PRESS_KEY;
}
void IntroTyraState::update() {
engine->renderer.beginFrame();
if (initialDelayTimer.getTimeDelta() >= 15000) initialDelayElapsed = true;
frameSkipper++;
if (frameSkipper > 3) {
frameSkipper = 0;
}
if (engine->pad.getClicked().Cross) {
_wantFinish = true;
}
const float slideUpMaxPost = -128.0F;
if (initialDelayElapsed) {
if (bgSprite->position.y <= 32.0F) fadeoutActivated = true;
float offset = 1.0F;
if (bgSprite->position.y > slideUpMaxPost && bgSprite->position.y <= 64.0F)
offset /= 1.6F;
else if (bgSprite->position.y > 64.0F && bgSprite->position.y <= 128.0F)
offset /= 1.2F;
if (bgSprite->position.y > 32.0F && bgSprite->position.y <= 64.0F &&
bgSprite->color.g > 0.0F) {
const float colorOffset = 1.5F;
bgSprite->color.g -= colorOffset;
bgSprite->color.b -= colorOffset;
bg2Sprite->color.g -= colorOffset;
bg2Sprite->color.b -= colorOffset;
}
if (bgSprite->position.y > slideUpMaxPost) {
bgSprite->position.y -= offset;
bg2Sprite->position.y -= offset;
}
}
if (fadeoutActivated && frameSkipper == 0) {
if (bgSprite->color.a > 0) {
bgSprite->color.a -= 4.0F;
bg2Sprite->color.a -= 4.0F;
} else
_wantFinish = true;
}
Threading::switchThread();
engine->renderer.renderer2D.render(bgSprite);
engine->renderer.renderer2D.render(bg2Sprite);
engine->renderer.renderer2D.render(tyraSprite);
renderFillers();
engine->renderer.endFrame();
}
void IntroTyraState::renderFillers() {
// Up
fillerSprite->position.set(0.0F, -63.0F);
engine->renderer.renderer2D.render(fillerSprite);
fillerSprite->position.set(256.0F, -63.0F);
engine->renderer.renderer2D.render(fillerSprite);
// Left
fillerSprite->position.set(-124.0F, 128.0F);
engine->renderer.renderer2D.render(fillerSprite);
// Down
fillerSprite->position.set(0.0F, 256.0F);
engine->renderer.renderer2D.render(fillerSprite);
fillerSprite->position.set(256.0F, 256.0F);
engine->renderer.renderer2D.render(fillerSprite);
// Right
fillerSprite->position.set(386.0F, 128.0F);
engine->renderer.renderer2D.render(fillerSprite);
}
} // namespace Demo
+72
View File
@@ -0,0 +1,72 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include <tyra>
#include "states/loading/loading_state.hpp"
#include <memory>
using std::make_unique;
using std::unique_ptr;
using Tyra::FileUtils;
using Tyra::Sprite;
namespace Demo {
LoadingState::LoadingState(Engine* t_engine) : State(t_engine) {
state = STATE_LOADING;
_wantFinish = false;
initialized = false;
}
LoadingState::~LoadingState() {}
void LoadingState::onStart() {
TYRA_LOG("Loading. RAM: ", engine->info.getAvailableRAM(), "MB");
auto* repo = &engine->renderer.core.texture.repository;
auto fillerTexture = repo->add(FileUtils::fromCwd("loading/filler.png"));
auto loadingTexture = repo->add(FileUtils::fromCwd("loading/loading.png"));
auto fillerSprite = make_unique<Sprite>();
auto loadingSprite = make_unique<Sprite>();
fillerSprite->position.set(0.0F, 0.0F);
fillerSprite->size.set(600.0F, 600.0F);
fillerSprite->mode = Tyra::MODE_STRETCH;
loadingSprite->size.set(128.0F, 64.0F);
loadingSprite->mode = Tyra::MODE_STRETCH;
loadingSprite->position.set(5.0F, 448.0F - 64.0F - 5.0F);
fillerTexture->addLink(fillerSprite->id);
loadingTexture->addLink(loadingSprite->id);
engine->renderer.beginFrame();
engine->renderer.renderer2D.render(fillerSprite.get());
engine->renderer.renderer2D.render(loadingSprite.get());
engine->renderer.endFrame();
repo->free(fillerTexture->id);
repo->free(loadingTexture->id);
initialized = true;
}
GlobalStateType LoadingState::onFinish() {
if (!initialized) return STATE_GAME;
initialized = false;
return STATE_GAME;
}
void LoadingState::update() { _wantFinish = true; }
} // namespace Demo
+14
View File
@@ -0,0 +1,14 @@
version: "3.9"
volumes:
tyra-volume:
services:
compiler:
environment:
TERM: xterm-256color
network_mode: host
image: "h4570/tyra"
tty: true
container_name: tyra-compiler
volumes:
- tyra-volume:/src
- ./:/host:z
-210
View File
@@ -1,210 +0,0 @@
# Installation tutorial
This tutorial will show you, how to:
- Setup your WSL machine for PS2DEV
- Install entire PS2DEV+Tyra environment
- Setup VSCode with Intelisense
- Setup PCSX2
So let's get started!
---
<br/>
## VSCode and WSL
- Install VSCode from
https://code.visualstudio.com/
- Install WSL
https://docs.microsoft.com/en-us/windows/wsl/install-win10
`Info: Please choose Ubuntu-20.04`
- Set root as default WSL user.
Open `cmd.exe` and type:
`ubuntu2004 config --default-user root`
---
<br/>
## Ubuntu configuration and PS2DEV+Tyra
- Open WSL terminal (Windows search -> wsl)
`Info: Be sure that are you logged as a root!`
- Type these commands
```
apt-get update && apt-get upgrade -y
apt-get install -y build-essential make texinfo cmake bison flex gettext libgmp3-dev libmpfr-dev libmpc-dev libz-dev wget patch
```
- Configure git (replace your name and email)
```
git config --global user.email "your@email.com"
git config --global user.name "Your Name"
```
- Create directories
```
mkdir /ps2dev
mkdir /ps2dev/built
mkdir /ps2dev/source
mkdir /repos
mkdir /repos/tyra
```
- Clone repos
```
git clone https://github.com/ps2dev/ps2dev.git /ps2dev/source/
git clone https://github.com/h4570/tyra.git /repos/tyra/
```
- Open bashrc via `nano ~/.bashrc` and add these lines at the end of file. Be sure that they are 1:1, so don't add additional spaces!
```
export PS2DEV=/ps2dev/built
export PS2SDK=$PS2DEV/ps2sdk
export GSKIT=$PS2DEV/gsKit
export PATH=$PATH:$PS2DEV/bin:$PS2DEV/ee/bin:$PS2DEV/iop/bin:$PS2DEV/dvp/bin:$PS2SDK/bin
export PS2HOSTNAME=192.168.0.200
export TYRA=/repos/tyra
export WSL_MAKE_WINDOWS=\\\\\\\\wsl\$\$\\\\Ubuntu-20.04
export WSL_LINUX_PCSX2=/mnt/c/Program\\\ Files\\\ \\\(x86\\\)/PCSX2
```
- Refresh env variables via -> `. ~/.bashrc`
- Close wsl terminal
---
<br/>
## Mapping WSL directories to your Windows machine
- Open cmd and type `wsl.exe --list`
`Info: Remember your distribution name from this list. My is "Ubuntu-20.04"`
- Click at the windows logo on your keyboard, type "This PC" and open
- At the upper menu click "Map disk drive"
`Info: Replace my name with your WSL name!`
- Folder: \\\\wsl$\\Ubuntu-20.04
- Click OK
`Info: You will have now new disk on your PC, this is the WSL filesystem.`
---
<br/>
## Configuring VSCode
- Open VSCode
- Install extension "Remote - WSL"
- Install extension "C/C++"
- Restart VSCode if required
- VSCode: Click on "File" -> "Open folder in WSL"
- Open "repos/tyra"
- VSCode: Click on "Terminal" -> "New terminal"
`Info: New terminal should appear. This is the same WSL terminal :)`
---
<br/>
## PS2DEV installation
- In VSCode's WSL terminal type:
```
cd /ps2dev/source
./build-all.sh
```
`Info: This can take some time...`
- And open again .bashrc via `nano ~/.bashrc` and add these lines at the end of file.
```
export ZLIB=${PS2SDK}/ports
export LIBTIFF=${PS2SDK}/ports
export LIBJPEG=${PS2SDK}/ports
export LIBPNG=${PS2SDK}/ports
```
- Refresh env variables via `. ~/.bashrc`
### !!! Please don't forgot to remove/refresh these 4 exports when you will want to update PS2DEV (./build-all.sh), because there is circular dependency between these libs and gsKit which is included in PS2DEV !!!
---
<br/>
## Build Tyra
- Go to one of the samples via `cd /repos/tyra/src/samples/floors`
- Build debug version: `make rebuild-dbg-engine`
`Info: If you want to build final version in future, type make rebuild-engine `
---
<br/>
## Install & configure PCSX2
- Download & install PCSX2 from (1.6+ version)
https://pcsx2.net/
- Extract bios files from
https://romsmania.cc/bios/pcsx2-playstation-2-bios-3
to
`C:\Users%USERNAME%\Documents\PCSX2\bios`
- Close `PCSX2` if you have opened!
- Open `C:\Users\hasto\Documents\PCSX2\inis\PCSX2_vm.ini` in notepad
```
HostFs=enabled
```
- Open PCSX2 and map pad to your keyboard, for example:
```
WASD = Left joy
Arrows = Right joy
Space = X
Circle = C
```
---
<br/>
## Run one of the samples
- Add assets for "floors" sample
- Download assets from
https://github.com/h4570/tyra/tree/master/src/samples/floors
- Windows: Open your WSL folder (This PC -> WSL folder)
- Extract assets to /repos/tyra/src/samples/floors/bin/ (create bin folder if not exists)
- Compile sample via `make`
`Info: Elf file should be produced in /bin`
- Run sample in PSX2 via `make run-pcsx2`
---
<br/>
## How to code?
Do some changes in your sample and just type `make clean all run-pcsx2` in your sample folder.
You can create your own sample, by just copying cube folder.
---
<br/>
## Setup Intelisense
- Download
http://apgcglz.cluster028.hosting.ovh.net/tyra/intellisense.zip
- Unpack `.vscode` folder to WSL's `/repos/tyra/`
`Info: This configuration is set for cube sample, but you can change it in tasks.json file`
---
<br/>
## Advanced: Compiling VU1 programs
`Info: Based on https://github.com/microsoft/wsl/issues/2468#issuecomment-374904520`
- Download VCL
http://lukasz.dk/files/vcl.1.4.beta7.x86.tgz
- Rename `vcl_14beta7_x86` binary to `vcl`
- Put `vcl` to WSL's `/usr/bin`
```
apt-get install qemu qemu-user-static binfmt-support
update-binfmts --install i386 /usr/bin/qemu-i386-static --magic '\x7fELF\x01\x01\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x03\x00\x01\x00\x00\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xff\xff\xff\xff\xff\xff\xff'
dpkg --add-architecture i386
apt-get update
apt-get install libstdc++5:i386
chmod 755 /usr/bin/vcl
```
`Info: In Ubuntu 18.04 I was obligated to install lib32ncurses5 also`
- Add this line to `~/.bashrc`
```
service binfmt-support start &>/dev/null
```
- Uncomment `.vsm`/`.vcl` recipe from Tyra's engine `Makefile`
- Download & install VCL preprocessor
```
mkdir temp && cd temp
git clone https://github.com/glampert/vclpp .
make
cp vclpp /usr/bin/
chmod 755 /usr/bin/vclpp
cd .. && rm -rf ./temp
```
- Uncomment `.vclpp`/`.vcl` recipe from Tyra's engine `Makefile`
+26
View File
@@ -0,0 +1,26 @@
# Installing Tyra
[![](https://img.shields.io/badge/Install%20time-5%20minutes-brightgreen)](#)
## Prerequisites:
1. Git
2. VSCode
3. Docker with PowerShell as a default terminal
4. [Configured PCSX2](https://github.com/h4570/tyra/blob/master/docs/install/pcsx2.md#)
---
## Steps:
1. Download [intellisense package](https://github.com/h4570/tyra/releases) and unzip it somewhere in your computer.
2. Open terminal in your favourite repositories directory and execute:
```
docker pull h4570/tyra
git clone https://github.com/h4570/tyra.git
```
3. Download the [assets.zip](https://github.com/h4570/tyra/releases) file and unzip it into the tyra directory
4. Open `VSCode` and open previously cloned directory.
5. In `VSCode` open `.vscode/configurations/windows-docker` and copy configuration files into `.vscode/`
6. In `c_cpp_properties.json` fix all `YOUR-INTELLISENSE-PATH` with path from point 2.
7. Click `CTRL+SHIFT+P`, type `Tasks: Run task` and run `Start docker container` - Repeat this step every time you want to start working with Tyra (every reboot)
8. Click `CTRL+SHIFT+P`, type `Tasks: Run build task`
9. Tyra should automatically compile engine, `demo` game and run `PCSX2`. If you want to compile & run tutorials, please change `buildDirectory` in `settings.json` to example `tutorials/01-hello`
+25
View File
@@ -0,0 +1,25 @@
## PCSX2 preparation
- Download PCSX2 from https://pcsx2.net/
- Install
- Extract bios files from https://romsmania.cc/bios/pcsx2-playstation-2-bios-3 to `%UserProfile%\Documents\PCSX2\bios`
- Map pad to your keyboard, for example:
```
WASD = Left joy
Arrows = Right joy
Space = X
Circle = C
```
### For PCSX2 1.6.X
- Close `PCSX2` if you have opened!
- Open `%UserProfile%\Documents\PCSX2\inis\PCSX2_vm.ini` in notepad and change HostFs option:
```
HostFs=enabled
```
### For PCSX2 1.7.X
- Open `PCSX2`
- Go to Settings -> Emulation -> Enable `Host file system`
+26
View File
@@ -0,0 +1,26 @@
TARGET := libtyra.a
#The Directories, Source, Includes, Objects, Binary and Resources
SRCDIR := src
INCDIR := inc
BUILDDIR := obj
TARGETDIR := bin
RESDIR := res
SRCEXT := cpp
VSMEXT := vsm
VCLEXT := vcl
VCLPPEXT := vclpp
DEPEXT := d
OBJEXT := o
#Flags, Libraries and Includes
CFLAGS :=
LIB :=
LIBDIRS :=
INC := -I$(INCDIR)
INCDEP := -I$(INCDIR)
include ../Makefile.base
$(TARGET): $(OBJECTS) $(VCL_OBJECTS) $(VU_OBJECTS_VCL) $(VU_OBJECTS_VSM) $(IRXEM_OBJECTS)
$(AR) rcs $(TARGETDIR)/$(TARGET) $(OBJECTS) $(VCL_OBJECTS) $(VU_OBJECTS_VCL) $(VU_OBJECTS_VSM) $(IRXEM_OBJECTS)
+28
View File
@@ -0,0 +1,28 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
namespace Tyra {
enum AdpcmResult {
ADPCM_OK,
/** When provided channel by user is currently in use */
ADPCM_CHANNEL_USED,
/** When user did not provided channel and all are in use */
ADPCM_NO_FREE_CHANNELS,
ADPCM_ERROR
};
} // namespace Tyra
+42
View File
@@ -0,0 +1,42 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include "./audio_adpcm.hpp"
#include "./audio_song.hpp"
namespace Tyra {
/** Class responsible for audio. */
class Audio {
public:
Audio();
~Audio();
void init();
AudioSong song;
AudioAdpcm adpcm;
void work();
private:
ee_thread_t thread;
int threadId;
static const u16 threadStackSize;
u8* threadStack;
void initAUDSRV();
void initThread();
};
} // namespace Tyra
+77
View File
@@ -0,0 +1,77 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include "./audio_listener_ref.hpp"
#include "./adpcm_result.hpp"
#include <audsrv.h>
#include <string>
namespace Tyra {
/**
* Class responsible for playing ADPCM samples.
* ADPCM sample can't be stopped.
*/
class AudioAdpcm {
public:
AudioAdpcm();
~AudioAdpcm();
void init();
/**
* Load ADPCM sample.
* ADPCM sample is an output from "Convert WAV to ADPCM" task (adpenc tool).
* Adpenc expects 22kHz 16bit file.
* @param t_path Example: "host:hit.adpcm" or "host:folder/jump.adpcm"
*/
audsrv_adpcm_t* load(const char* t_path);
audsrv_adpcm_t* load(const std::string& t_path);
/**
* Frees up all memory taken by samples, and stops all voices from
* being played.
*/
void reset();
/**
* Try play ADPCM sample if channel(s) is not occupied.
* @param t_adpcm ADPCM data, created by load();
* @param t_ch Channel (0-23). Type -1 for use any free channel.
*/
AdpcmResult tryPlay(audsrv_adpcm_t* t_adpcm);
AdpcmResult tryPlay(audsrv_adpcm_t* t_adpcm, const s8& t_ch);
/**
* Play ADPCM sample, if channel is occupied, wait for it.
* If not used properly, can hugely reduce performance.
* @param t_adpcm ADPCM data, created by load();
* @param t_ch Channel (0-23). Type -1 for use any free channel.
*/
void playWait(audsrv_adpcm_t* t_adpcm);
void playWait(audsrv_adpcm_t* t_adpcm, const s8& t_ch);
/**
* Set ADPCM volume.
* @param t_vol Value 0-100
* @param t_ch Channel (0-23)
*/
void setVolume(const u8& t_vol, const s8& t_ch) {
audsrv_adpcm_set_volume(t_ch, t_vol);
}
private:
void initAUDSRV();
};
} // namespace Tyra
+25
View File
@@ -0,0 +1,25 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
namespace Tyra {
class AudioListener {
public:
virtual ~AudioListener(){};
virtual void onAudioTick() = 0;
virtual void onAudioFinish() = 0;
private:
};
} // namespace Tyra
+24
View File
@@ -0,0 +1,24 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include "./audio_listener.hpp"
#include <tamtypes.h>
namespace Tyra {
struct AudioListenerRef {
AudioListener* listener;
u32 id;
};
} // namespace Tyra
+90
View File
@@ -0,0 +1,90 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022-2022, Tyra - https://github.com/h4570/tyrav2
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
# Wellinator Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include "./audio_listener_ref.hpp"
#include <audsrv.h>
#include <string>
#include <vector>
#include <kernel.h>
namespace Tyra {
/** Class responsible for background audio playing. */
class AudioSong {
public:
AudioSong();
~AudioSong();
void init();
bool inLoop;
/**
* Load 16bit 22kHz Stereo WAV.
* Can be used multiple times for song switching.
* @param t_path Example: "host:song.wav" or "host:folder/song.wav"
*/
void load(const char* t_path);
void load(const std::string& t_path);
void play();
void stop();
const bool& isPlaying() const;
const bool& isLoaded() const;
const u8& getVolume() const;
/**
* Set song volume.
* @param t_vol Value 0-100
*/
void setVolume(const u8& t_vol);
/**
* If you want to synchronize some actions with
* background song, add audio listener.
* @returns Listener id.
*/
u32 addListener(AudioListener* t_listener);
/** Remove song listener. */
void removeListener(const u32& t_id);
std::size_t getListenersCount() const;
void work();
private:
bool songLoaded, songPlaying, songFinished;
u8 tyraVolume, audsrvVolume;
FILE* wav;
audsrv_fmt_t format;
std::vector<AudioListenerRef*> songListeners;
ee_sema_t sema;
s32 fillbufferSema;
static const u16 chunkSize;
char* chunk;
s32 chunkReadStatus;
void initSema();
void initAUDSRV();
void setSongFormat();
void unloadSong();
void rewindSongToStart();
};
} // namespace Tyra
+126
View File
@@ -0,0 +1,126 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#ifdef NDEBUG
#define TYRA_LOG(...) ((void)0)
#define TYRA_WARN(...) ((void)0)
#define TYRA_ERROR(...) ((void)0)
#define TYRA_TRAP(...) ((void)0)
#define TYRA_ASSERT(condition, ...) ((void)0)
#else // IF Debug
#include <stdio.h>
#include <debug.h>
#include <string>
#include <sstream>
#include <fstream>
#include <utility>
#include <memory>
#include "file/file_utils.hpp"
#include "info/info.hpp"
#define TYRA_LOG(...) TyraDebug::writeLines("LOG: ", ##__VA_ARGS__, "\n")
#define TYRA_WARN(...) TyraDebug::writeLines("==WARN: ", ##__VA_ARGS__, "\n")
#define TYRA_ERROR(...) TyraDebug::writeLines("====ERR: ", ##__VA_ARGS__, "\n")
#define TYRA_TRAP(...) TyraDebug::trap(__FILE__, __LINE__, ##__VA_ARGS__)
#define TYRA_BREAKPOINT() TyraDebug::trap(__FILE__, __LINE__, "Breakpoint")
#define TYRA_ASSERT(condition, ...) \
if (!(condition)) TyraDebug::trap(__FILE__, __LINE__, ##__VA_ARGS__)
class TyraDebug {
public:
template <typename Arg, typename... Args>
static void writeLines(Arg&& arg, Args&&... args) {
std::stringstream ss;
ss << std::forward<Arg>(arg);
using expander = int[];
(void)expander{0, (void(ss << std::forward<Args>(args)), 0)...};
if (Tyra::Info::writeLogsToFile) {
writeInLogFile(&ss);
} else {
printf("%s", ss.str().c_str());
}
}
template <typename... Args>
static void trap(const char* file, int line, Args... args) {
std::stringstream ss1;
ss1 << "\n";
ss1 << "============== TYRA ==============\n";
ss1 << "| Assertion failed!\n";
ss1 << "|\n";
if (Tyra::Info::writeLogsToFile) {
writeInLogFile(&ss1);
} else {
printf("%s", ss1.str().c_str());
}
writeAssertLines(args...);
std::stringstream ss2;
ss2 << "|\n";
ss2 << "| File : " << file << ":" << line << "\n";
ss2 << "====================================\n\n";
if (Tyra::Info::writeLogsToFile) {
writeInLogFile(&ss2);
} else {
printf("%s", ss2.str().c_str());
}
init_scr();
for (;;) {
scr_setXY(20, 10);
scr_printf(ss1.str().c_str());
writeAssertLinesInScreen(args...);
scr_printf(ss2.str().c_str());
}
}
private:
static void writeInLogFile(std::stringstream* ss);
template <typename Arg, typename... Args>
static void writeAssertLines(Arg&& arg, Args&&... args) {
std::stringstream ss;
ss << "| " << std::forward<Arg>(arg) << "\n";
using expander = int[];
(void)expander{
0, (void(ss << "| " << std::forward<Args>(args) << "\n"), 0)...};
if (Tyra::Info::writeLogsToFile) {
writeInLogFile(&ss);
} else {
printf("%s", ss.str().c_str());
}
}
template <typename Arg, typename... Args>
static void writeAssertLinesInScreen(Arg&& arg, Args&&... args) {
std::stringstream ss;
ss << "| " << std::forward<Arg>(arg) << "\n";
using expander = int[];
(void)expander{
0, (void(ss << "| " << std::forward<Args>(args) << "\n"), 0)...};
scr_printf(ss.str().c_str());
}
};
#endif // NDEBUG
+56
View File
@@ -0,0 +1,56 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include "./renderer/renderer.hpp"
#include "./pad/pad.hpp"
#include "./audio/audio.hpp"
#include "./irx/irx_loader.hpp"
#include "./info/info.hpp"
#include "./info/banner.hpp"
#include "./game.hpp"
namespace Tyra {
struct EngineOptions {
/**
* True -> logs will be written to file.
* False -> logs will be displayed in console
*/
bool writeLogsToFile = false;
bool loadUsbDriver = false;
};
class Engine {
public:
Engine();
Engine(const EngineOptions& options);
~Engine();
Renderer renderer;
Pad pad;
Audio audio;
Info info;
void run(Game* t_game);
private:
IrxLoader irx;
Game* game;
Banner banner;
void realLoop();
void initAll(const bool& loadUsbDriver);
};
} // namespace Tyra
+54
View File
@@ -0,0 +1,54 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include <string>
#include <limits.h>
#include <syslimits.h>
namespace Tyra {
class FileUtils {
public:
FileUtils();
~FileUtils();
/**
* Get current working directory.
* Example: "host:" or "mass:"
*/
static std::string getCwd();
/**
* Add current working directory prefix to path
* Example: "host:..." or "mass:..."
*/
static std::string fromCwd(const std::string& relativePath);
static std::string fromCwd(const char* relativePath);
static std::string getFilenameFromPath(const std::string& path);
static std::string getPathFromFilename(const std::string& path);
static std::string getFilenameWithoutExtension(const std::string& filename);
static std::string getExtensionOfFilename(const std::string& filename);
const char* getElfName() const { return elfName; };
const char* getElfPath() const { return elfPath; };
private:
// Argv name+path & just path
char cwd[NAME_MAX];
char elfName[NAME_MAX];
char elfPath[NAME_MAX - 14];
void setPathInfo(const char* path);
};
} // namespace Tyra
+21
View File
@@ -0,0 +1,21 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
namespace Tyra {
class Game {
public:
virtual void init() = 0;
virtual void loop() = 0;
};
} // namespace Tyra
+25
View File
@@ -0,0 +1,25 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include "renderer/renderer.hpp"
namespace Tyra {
class Banner {
public:
Banner();
~Banner();
void show(Renderer* renderer);
};
} // namespace Tyra
+47
View File
@@ -0,0 +1,47 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include <tamtypes.h>
#include <stddef.h>
#include "time/timer.hpp"
#include "./version.hpp"
namespace Tyra {
class Info {
public:
Info();
~Info();
Version version;
static bool writeLogsToFile;
/** Called by engine */
void update();
const u32& getFps() const { return fps; };
/** @return Available RAM in MB */
float getAvailableRAM();
private:
float calcFps();
void* allocateLargestFreeRAMBlock(size_t* size);
size_t getFreeRAMSize();
u8 fpsDelayer;
u32 fps;
Timer timer;
};
} // namespace Tyra
+33
View File
@@ -0,0 +1,33 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# André Guilherme <andregui17@outlook.com>
*/
#pragma once
#include <tamtypes.h>
#include <string>
namespace Tyra {
class Version {
public:
Version() {}
~Version() {}
static const u8 major = 2;
static const u8 minor = 2;
static const u8 patch = 0;
static std::string toString() {
return std::to_string(major) + "." + std::to_string(minor) + "." +
std::to_string(patch);
}
};
} // namespace Tyra
+39
View File
@@ -0,0 +1,39 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include <tamtypes.h>
namespace Tyra {
class IrxLoader {
public:
IrxLoader();
~IrxLoader();
void loadAll(const bool& withUsb, const bool& isLoggingToFile);
private:
static bool isLoaded;
void loadSio2man(const bool& verbose);
void loadPadman(const bool& verbose);
void loadLibsd(const bool& verbose);
void loadIO(const bool& verbose);
void loadUsbModules(const bool& verbose);
void loadAudsrv(const bool& verbose);
int applyRpcPatches();
void waitUntilUsbDeviceIsReady();
void delay(int count);
};
} // namespace Tyra
@@ -0,0 +1,34 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <vector>
#include "./mesh_builder_material_data.hpp"
namespace Tyra {
/**
* Data needed for constructing mesh class.
* All dynamic data ownership is moved to mesh class, so
* verts, coords.. are not deallocated!
*/
class MeshBuilderData {
public:
MeshBuilderData();
~MeshBuilderData();
std::vector<MeshBuilderMaterialData*> materials;
bool loadNormals, loadLightmap;
};
} // namespace Tyra
@@ -0,0 +1,33 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#pragma once
#include <vector>
#include <string>
#include <optional>
#include "./mesh_builder_material_frame_data.hpp"
#include "renderer/models/color.hpp"
namespace Tyra {
class MeshBuilderMaterialData {
public:
MeshBuilderMaterialData();
~MeshBuilderMaterialData();
std::vector<MeshBuilderMaterialFrameData*> frames;
std::string name;
std::optional<std::string> texturePath;
Color ambient;
};
} // namespace Tyra

Some files were not shown because too many files have changed in this diff Show More