84 Commits

Author SHA1 Message Date
RuiFPB b6dcd83962 Update template module
Official build / Build (push) Successful in 8m2s
2026-06-11 01:49:13 +01:00
RuiFPB e5b0f839cf Merge pull request 'Template as submodule' (#1) from submodules into master
Official build / Build (push) Successful in 8m5s
PR C++ format check / Check clang format (push) Successful in 10s
Reviewed-on: #1
2026-06-11 00:41:02 +00:00
RuiFPB 1fd1dea078 Test setting the run container
PR C++ format check / Check clang format (pull_request) Successful in 28s
PR build check / Build (pull_request) Successful in 3m2s
2026-06-11 01:35:45 +01:00
RuiFPB 71a3cf92ee Second attempt to fix format-check
PR build check / Build (pull_request) Successful in 3m36s
PR C++ format check / Check clang format (pull_request) Failing after 23s
2026-06-11 01:24:18 +01:00
RuiFPB 7f3e46c66f Update format check workflow and use 4 jobs for pr-build-check
PR build check / Build (pull_request) Successful in 3m50s
PR C++ format check / Check clang format (pull_request) Failing after 3s
2026-06-11 01:13:37 +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
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
81 changed files with 908 additions and 412 deletions
+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 -j4 -C engine
- name: Compile tutorials
run: |
make clean all -j4 -C tutorials/01-hello
make clean all -j4 -C tutorials/02-sprite
make clean all -j4 -C tutorials/03-minecraft
make clean all -j4 -C tutorials/04-de_dust2
make clean all -j4 -C tutorials/05-animation
make clean all -j4 -C tutorials/06-audio
make clean all -j4 -C tutorials/07-lighting
make clean all -j4 -C tutorials/08-skybox-debug
make clean all -j4 -C tutorials/09-manual-mode
make clean all -j4 -C tutorials/10-sprite-sheet
- name: Compile demo
run: |
make clean all -j4 -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
@@ -1,5 +1,5 @@
#This is a modified version of the clang format check used on Open-PS2-Loader #This is a modified version of the clang format check used on Open-PS2-Loader
name: CI-cpp-check name: PR C++ format check
on: on:
push: push:
@@ -23,11 +23,14 @@ on:
jobs: jobs:
check-format: check-format:
name: Check clang format
runs-on: ubuntu-latest runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: DoozyX/clang-format-lint-action@v0.12 - uses: DoozyX/clang-format-lint-action@v0.18
with: with:
source: '.' source: '.'
extensions: 'hpp, cpp, h' extensions: 'hpp, cpp, h'
+3
View File
@@ -0,0 +1,3 @@
[submodule "template"]
path = template
url = https://git.ruifpb.pt/RuiFPB/tyra-linux-template
+1
View File
@@ -4,3 +4,4 @@
/c_cpp_properties.json /c_cpp_properties.json
/tasks.json /tasks.json
/settings.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
}
@@ -1,14 +1,14 @@
{ {
"buildDirectory": "./", "buildDirectory": "demo",
"C_Cpp.default.intelliSenseMode": "gcc-x86", "C_Cpp.default.intelliSenseMode": "gcc-x86",
"files.associations": { "files.associations": {
"*.vcl": "asm-collection", "*.vcl": "asm-collection",
"*.i": "asm-collection", "*.i": "asm-collection",
"*.vsm": "asm-collection", "*.vsm": "asm-collection",
"*.vclpp": "asm-collection", "*.vclpp": "asm-collection",
"*.hpp": "cpp", "*.hpp": "cpp",
"*.cpp": "cpp", "*.cpp": "cpp",
"*.h": "c", "*.h": "c",
"*.c": "c" "*.c": "c"
} }
} }
@@ -18,12 +18,12 @@
{ {
"type": "shell", "type": "shell",
"label": "1. Copy source code to docker volume", "label": "1. Copy source code to docker volume",
"command": "docker exec -t tyra-game-compiler sh -c 'rsync -ac --delete --exclude \".git\" --exclude \".vscode\" --exclude \"*obj*/**\" --exclude \"*bin*/**\" /host/ /src/'" "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", "type": "shell",
"label": "2. Compile via docker container", "label": "2. Compile via docker container",
"command": "docker exec -t tyra-game-compiler sh -c 'cd ${config:buildDirectory} && make'", "command": "docker exec -t tyra-compiler sh -c 'cd ${config:buildDirectory} && make build-engine all'",
"problemMatcher": { "problemMatcher": {
"base": "$gcc", "base": "$gcc",
"fileLocation": [ "fileLocation": [
@@ -34,7 +34,7 @@
{ {
"type": "shell", "type": "shell",
"label": "3. Copy binaries to host", "label": "3. Copy binaries to host",
"command": "docker exec -t tyra-game-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"*bin*/**\" --exclude=\"*\" /src/ /host/'", "command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"bin/**\" --exclude=\"*\" /src/ /host/'"
}, },
{ {
"type": "shell", "type": "shell",
@@ -42,7 +42,7 @@
"options": { "options": {
"cwd": "${config:buildDirectory}" "cwd": "${config:buildDirectory}"
}, },
"command": "./run.ps1" "command": "./run.sh"
}, },
{ {
"type": "shell", "type": "shell",
@@ -50,27 +50,22 @@
"dependsOn": [ "dependsOn": [
"1. Copy source code to docker volume" "1. Copy source code to docker volume"
], ],
"command": "docker exec -t tyra-game-compiler sh -c 'adpenc ${input:wav2adpcmSource} ${input:wav2adpcmTarget} && rsync -zac /src/${input:wav2adpcmTarget} /host/${input:wav2adpcmTarget}'" "command": "docker exec -t tyra-compiler sh -c 'adpenc ${input:wav2adpcmSource} ${input:wav2adpcmTarget} && rsync -zac /src/${input:wav2adpcmTarget} /host/${input:wav2adpcmTarget}'"
}, },
{ {
"type": "shell", "type": "shell",
"label": "Cleanup", "label": "Cleanup",
"command": "docker exec -t tyra-game-compiler sh -c 'rm -rf /src/*'" "command": "docker exec -t tyra-compiler sh -c 'rm -rf /src/*'"
},
{
"type": "shell",
"label": "Update Tyra",
"command": "docker exec -t tyra-game-compiler sh -c 'rm -rf /tyra && mkdir -p /tyra && git clone https://github.com/h4570/tyra.git /tyra && cd /tyra && git checkout ${input:tyraBranch} && cd engine && make'"
}, },
{ {
"type": "shell", "type": "shell",
"label": "Send to PS2", "label": "Send to PS2",
"command": "docker exec -t tyra-game-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\")'" "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", "type": "shell",
"label": "Open PS2 output logger", "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'", "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": { "runOptions": {
"instanceLimit": 1 "instanceLimit": 1
}, },
@@ -92,20 +87,20 @@
{ {
"type": "shell", "type": "shell",
"label": "[Debug] Copy obj directory to host", "label": "[Debug] Copy obj directory to host",
"command": "docker exec -t tyra-game-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"obj/**\" --exclude=\"*\" /src/ /host/'" "command": "docker exec -t tyra-compiler sh -c 'rsync -zac --include=\"*/\" --include=\"obj/**\" --exclude=\"*\" /src/ /host/'"
} }
], ],
"inputs": [ "inputs": [
{ {
"id": "wav2adpcmSource", "id": "wav2adpcmSource",
"description": "Source file path (ex. ):", "description": "Source file path (ex. ):",
"default": "res/sound.wav", "default": "demo/res/sound.wav",
"type": "promptString" "type": "promptString"
}, },
{ {
"id": "wav2adpcmTarget", "id": "wav2adpcmTarget",
"description": "Target file path (ex. ):", "description": "Target file path (ex. ):",
"default": "res/sound.adpcm", "default": "demo/res/sound.adpcm",
"type": "promptString" "type": "promptString"
}, },
{ {
@@ -119,12 +114,6 @@
"description": "Local ip address:", "description": "Local ip address:",
"default": "192.168.1.245", "default": "192.168.1.245",
"type": "promptString" "type": "promptString"
},
{
"id": "tyraBranch",
"description": "Tyra branch:",
"default": "master",
"type": "promptString"
} }
] ]
} }
+1 -1
View File
@@ -42,7 +42,7 @@
"options": { "options": {
"cwd": "${config:buildDirectory}" "cwd": "${config:buildDirectory}"
}, },
"command": "./run.ps1" "command": "Start-Job { ./run.ps1 } | Receive-Job -Wait"
}, },
{ {
"type": "shell", "type": "shell",
+1 -2
View File
@@ -31,8 +31,7 @@ RUN make
# Download VCL # Download VCL
RUN mkdir -p /temp/vcl RUN mkdir -p /temp/vcl
WORKDIR "/temp/vcl" WORKDIR "/temp/vcl"
RUN wget http://apgcglz.cluster028.hosting.ovh.net/tyra/vcl.zip RUN wget https://github.com/h4570/tyra/raw/master/assets/vcl
RUN unzip vcl.zip
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
+1 -1
View File
@@ -16,7 +16,7 @@ IRXEMBEDDEDEXT := irx-em
CFLAGS += -D_EE -Wall -O3 CFLAGS += -D_EE -Wall -O3
LINKFLAGS += -O3 -Wl,-zmax-page-size=128 LINKFLAGS += -O3 -Wl,-zmax-page-size=128
ASFLAGS += -O3 ASFLAGS += -O3
LIB += -lstdc++ -ldma -lpacket2 -lgraph -ldraw -lmath3d -lpng -lz -lpad -laudsrv -lpatches -lcdvd 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 INC += -I$(PS2DEV)/ps2sdk/ee/include -I$(PS2DEV)/ps2sdk/common/include -I$(PS2DEV)/ps2sdk/ports/include
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
+10 -14
View File
@@ -7,7 +7,7 @@
<br /> <br />
<p align="center"> <p align="center">
<a href="https://github.com/h4570/tyra"> <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> </a>
<h3 align="center">Tyra</h3> <h3 align="center">Tyra</h3>
@@ -27,15 +27,12 @@
</p> </p>
</p> </p>
[![Stargazers repo roster for h4570/tyra](https://reporoster.com/stars/h4570/tyra)](https://github.com/h4570/tyra/stargazers)
## Table of Contents ## Table of Contents
* [About the project](#about-the-project) * [About the project](#about-the-project)
* [Description](#description) * [Description](#description)
* [Tutorials](#tutorials) * [Tutorials](#tutorials)
* [Features](#features) * [Features](#features)
* [Branches](#branches)
* [Contributing](#contributing) * [Contributing](#contributing)
* [Games](#games) * [Games](#games)
* [License](#license) * [License](#license)
@@ -45,8 +42,8 @@
## About the Project ## About the Project
<p align="center"> <p align="center">
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/tyra_code.gif" alt="Sample code" width="500" height="auto"> <img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/tyra_code.gif" alt="Sample code" width="500" height="auto">
<img src="http://apgcglz.cluster028.hosting.ovh.net/tyra/showcase.gif " alt="Sample game" width="500" height="auto"> <img src="https://raw.githubusercontent.com/h4570/tyra/master/assets/showcase.gif " alt="Sample game" width="500" height="auto">
</p> </p>
--- ---
@@ -71,6 +68,8 @@ Decision was simple - I need to create an engine which will handle 3D file loadi
* 07 - [Code](https://github.com/h4570/tyra/tree/master/tutorials/07-lighting) - Static lightmap and dynamic directional lights * 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 * 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) * 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) * Demo game - [Code](https://github.com/h4570/tyra/tree/master/demo)
--- ---
@@ -99,14 +98,10 @@ Decision was simple - I need to create an engine which will handle 3D file loadi
* `.md2` 3D file support * `.md2` 3D file support
* `.png` Texture file support * `.png` Texture file support
### Branches ## Contributing
* `master` - stable releases - tested on PS2 & PCSX2.
* `develop` - daily builds.
See the [open issues](https://github.com/h4570/tyra/issues) for a list of proposed features (and known issues). See the [open issues](https://github.com/h4570/tyra/issues) for a list of proposed features (and known issues).
## Contributing
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**. 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 1. Fork the Project
@@ -121,6 +116,7 @@ List of games developed with Tyra.
If you created one, please contact me - I will add it to the list :) 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) * [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) * [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) * [TyraTale](https://github.com/Br4k2n/TyraTale) by [Br4k2n](https://github.com/Br4k2n)
@@ -147,7 +143,7 @@ Distributed under the Apache License 2.0 License. See `LICENSE` for more informa
Without these guys, Tyra would not happen: Without these guys, Tyra would not happen:
* [Dr Henry Fortuna](http://ps2-edu.tensioncore.com/index.html) - for code sources, PS2 academy tutorials * [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! * 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/wolfysdl) - for testing, contributing to Tyra and sharing cool ideas! * [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!) * [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 * [Lukasz D.K.](https://github.com/lukaszdk) - for huge archive of PS2 stuff
* [Guilherme Lampert](https://github.com/glampert) - for code sources * [Guilherme Lampert](https://github.com/glampert) - for code sources
@@ -156,12 +152,12 @@ Without these guys, Tyra would not happen:
* And so many other guys. Thanks! * And so many other guys. Thanks!
Project Link: [https://github.com/h4570/tyra](https://github.com/h4570/tyra) 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) [![LinkedIn][linkedin-shield]](https://linkedin.com/in/sandro-sobczyński-28820b15a)
<br /> <br />
<a href="https://github.com/h4570/tyra"> <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> </a>
[contributors-shield]: https://img.shields.io/github/contributors/h4570/tyra.svg?style=flat-square [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.
Executable
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../linux-pcsx2.sh
+1 -1
View File
@@ -11,4 +11,4 @@ services:
container_name: tyra-compiler container_name: tyra-compiler
volumes: volumes:
- tyra-volume:/src - tyra-volume:/src
- ./:/host - ./:/host:z
+1 -1
View File
@@ -6,7 +6,7 @@
1. Git 1. Git
2. VSCode 2. VSCode
3. Docker with PowerShell as a default terminal 3. Docker with PowerShell as a default terminal
4. [PCSX2](https://github.com/h4570/tyra/blob/master/docs/install/pcsx2.md#) 4. [Configured PCSX2](https://github.com/h4570/tyra/blob/master/docs/install/pcsx2.md#)
--- ---
+15 -11
View File
@@ -1,15 +1,9 @@
## Install & configure PCSX2 ## PCSX2 preparation
- Download & install PCSX2 (1.6+ version) from https://pcsx2.net/ - 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` - Extract bios files from https://romsmania.cc/bios/pcsx2-playstation-2-bios-3 to `%UserProfile%\Documents\PCSX2\bios`
- Close `PCSX2` if you have opened! - Map pad to your keyboard, for example:
- Open `%UserProfile%\Documents\PCSX2\inis\PCSX2_vm.ini` in notepad
```
HostFs=enabled
```
- Open PCSX2 and map pad to your keyboard, for example:
``` ```
WASD = Left joy WASD = Left joy
@@ -18,4 +12,14 @@ Space = X
Circle = C Circle = C
``` ```
- Enable **"EE timing hack"** in PCSX2 hacks! ### 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`
+23 -14
View File
@@ -20,6 +20,7 @@
#else // IF Debug #else // IF Debug
#include <stdio.h> #include <stdio.h>
#include <debug.h>
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <fstream> #include <fstream>
@@ -48,9 +49,7 @@ class TyraDebug {
(void)expander{0, (void(ss << std::forward<Args>(args)), 0)...}; (void)expander{0, (void(ss << std::forward<Args>(args)), 0)...};
if (Tyra::Info::writeLogsToFile) { if (Tyra::Info::writeLogsToFile) {
auto* logFile = getLogFile(); writeInLogFile(&ss);
*logFile << ss.str();
logFile->flush();
} else { } else {
printf("%s", ss.str().c_str()); printf("%s", ss.str().c_str());
} }
@@ -65,9 +64,7 @@ class TyraDebug {
ss1 << "|\n"; ss1 << "|\n";
if (Tyra::Info::writeLogsToFile) { if (Tyra::Info::writeLogsToFile) {
auto* logFile = getLogFile(); writeInLogFile(&ss1);
*logFile << ss1.str();
logFile->flush();
} else { } else {
printf("%s", ss1.str().c_str()); printf("%s", ss1.str().c_str());
} }
@@ -80,20 +77,22 @@ class TyraDebug {
ss2 << "====================================\n\n"; ss2 << "====================================\n\n";
if (Tyra::Info::writeLogsToFile) { if (Tyra::Info::writeLogsToFile) {
auto* logFile = getLogFile(); writeInLogFile(&ss2);
*logFile << ss2.str();
logFile->flush();
} else { } else {
printf("%s", ss2.str().c_str()); printf("%s", ss2.str().c_str());
} }
init_scr();
for (;;) { for (;;) {
scr_setXY(20, 10);
scr_printf(ss1.str().c_str());
writeAssertLinesInScreen(args...);
scr_printf(ss2.str().c_str());
} }
} }
private: private:
static std::unique_ptr<std::ofstream> logFile; static void writeInLogFile(std::stringstream* ss);
static std::ofstream* getLogFile();
template <typename Arg, typename... Args> template <typename Arg, typename... Args>
static void writeAssertLines(Arg&& arg, Args&&... args) { static void writeAssertLines(Arg&& arg, Args&&... args) {
@@ -105,13 +104,23 @@ class TyraDebug {
0, (void(ss << "| " << std::forward<Args>(args) << "\n"), 0)...}; 0, (void(ss << "| " << std::forward<Args>(args) << "\n"), 0)...};
if (Tyra::Info::writeLogsToFile) { if (Tyra::Info::writeLogsToFile) {
auto* logfile = getLogFile(); writeInLogFile(&ss);
*logfile << ss.str();
logFile->flush();
} else { } else {
printf("%s", ss.str().c_str()); 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 #endif // NDEBUG
+5 -3
View File
@@ -11,6 +11,8 @@
#pragma once #pragma once
#include <string> #include <string>
#include <limits.h>
#include <syslimits.h>
namespace Tyra { namespace Tyra {
@@ -42,9 +44,9 @@ class FileUtils {
private: private:
// Argv name+path & just path // Argv name+path & just path
char cwd[255]; char cwd[NAME_MAX];
char elfName[255]; char elfName[NAME_MAX];
char elfPath[255 - 14]; char elfPath[NAME_MAX - 14];
void setPathInfo(const char* path); void setPathInfo(const char* path);
}; };
+1
View File
@@ -27,6 +27,7 @@ class IrxLoader {
void loadSio2man(const bool& verbose); void loadSio2man(const bool& verbose);
void loadPadman(const bool& verbose); void loadPadman(const bool& verbose);
void loadLibsd(const bool& verbose); void loadLibsd(const bool& verbose);
void loadIO(const bool& verbose);
void loadUsbModules(const bool& verbose); void loadUsbModules(const bool& verbose);
void loadAudsrv(const bool& verbose); void loadAudsrv(const bool& verbose);
@@ -33,4 +33,5 @@ class TextureBuilderData {
TextureBpp clutBpp; TextureBpp clutBpp;
unsigned char clutGsComponents; unsigned char clutGsComponents;
}; };
} // namespace Tyra } // namespace Tyra
-3
View File
@@ -36,9 +36,6 @@ class Math {
static int randomi(const int& min, const int& max); static int randomi(const int& min, const int& max);
static bool equalf(const float& a, const float& b, static bool equalf(const float& a, const float& b,
const float& epsilon = 0.00001F); const float& epsilon = 0.00001F);
private:
Math();
}; };
} // namespace Tyra } // namespace Tyra
@@ -62,7 +62,8 @@ class Texture {
/** Set texture wrapping */ /** Set texture wrapping */
void setWrapSettings(const TextureWrap t_horizontal, void setWrapSettings(const TextureWrap t_horizontal,
const TextureWrap t_vertical); const TextureWrap t_vertical, int minu = 0, int minv = 0,
int maxu = 0, int maxv = 0);
// ---- // ----
// Other // Other
@@ -96,9 +97,10 @@ class Texture {
void print(const std::string& name) const { print(name.c_str()); } void print(const std::string& name) const { print(name.c_str()); }
std::string getPrint(const char* name = nullptr) const; std::string getPrint(const char* name = nullptr) const;
void setDefaultWrapSettings();
private: private:
void setPsm(); void setPsm();
void setDefaultWrapSettings();
texwrap_t wrap; texwrap_t wrap;
}; };
@@ -29,6 +29,12 @@ class RendererCoreTexture {
RendererCoreTextureBuffers useTexture(const Texture* t_tex); RendererCoreTextureBuffers useTexture(const Texture* t_tex);
/**
* Called by user after changing texture wrap settings
* Updates texture packet without reallocate it
*/
RendererCoreTextureBuffers updateTextureInfo(const Texture* t_tex);
/** Called by renderer during initialization */ /** Called by renderer during initialization */
void init(RendererCoreGS* gs, Path3* path3); void init(RendererCoreGS* gs, Path3* path3);
@@ -16,6 +16,7 @@
#include "./models/texture.hpp" #include "./models/texture.hpp"
#include "renderer/3d/mesh/mesh.hpp" #include "renderer/3d/mesh/mesh.hpp"
#include "renderer/core/2d/sprite/sprite.hpp" #include "renderer/core/2d/sprite/sprite.hpp"
#include "./renderer_core_texture_buffers.hpp"
#include "loaders/texture/base/texture_loader_selector.hpp" #include "loaders/texture/base/texture_loader_selector.hpp"
#include <string> #include <string>
@@ -25,6 +26,8 @@ class TextureRepository {
TextureRepository(); TextureRepository();
~TextureRepository(); ~TextureRepository();
void init(std::vector<RendererCoreTextureBuffers>* textureBuffers);
/** Returns all repository textures. */ /** Returns all repository textures. */
std::vector<Texture*>* getAll() { return &textures; } std::vector<Texture*>* getAll() { return &textures; }
@@ -99,6 +102,13 @@ class TextureRepository {
void freeByMesh(const Mesh& mesh); void freeByMesh(const Mesh& mesh);
void freeByMesh(const Mesh* mesh); void freeByMesh(const Mesh* mesh);
/**
* remove texture buffer id if exist.
* Texture buffer is NOT destructed.
* easy way to create another texture buffer.
*/
int removeBufferId(const u32& t_texId);
/** /**
* Remove texture from repository. * Remove texture from repository.
* Texture is NOT destructed. * Texture is NOT destructed.
@@ -110,6 +120,7 @@ class TextureRepository {
void removeByIndex(const u32& t_index); void removeByIndex(const u32& t_index);
std::vector<Texture*> textures; std::vector<Texture*> textures;
std::vector<RendererCoreTextureBuffers>* textureBuffers;
TextureLoaderSelector texLoaderSelector; TextureLoaderSelector texLoaderSelector;
}; };
} // namespace Tyra } // namespace Tyra
+1
View File
@@ -148,6 +148,7 @@ void AudioSong::work() {
if (chunkReadStatus > 0) { if (chunkReadStatus > 0) {
WaitSema(fillbufferSema); // wait until previous chunk wasn't finished WaitSema(fillbufferSema); // wait until previous chunk wasn't finished
audsrv_wait_audio(chunkReadStatus);
audsrv_play_audio(chunk, chunkReadStatus); audsrv_play_audio(chunk, chunkReadStatus);
for (u32 i = 0; i < getListenersCount(); i++) for (u32 i = 0; i < getListenersCount(); i++)
songListeners[i]->listener->onAudioTick(); songListeners[i]->listener->onAudioTick();
+8 -13
View File
@@ -10,16 +10,11 @@
#include "debug/debug.hpp" #include "debug/debug.hpp"
std::unique_ptr<std::ofstream> TyraDebug::logFile; void TyraDebug::writeInLogFile(std::stringstream* ss) {
std::ofstream logFile;
std::ofstream* TyraDebug::getLogFile() { logFile.open(Tyra::FileUtils::fromCwd("log.txt"),
if (logFile) { std::ofstream::out | std::ofstream::app);
return logFile.get(); logFile << ss->str();
} else { logFile.flush();
logFile = std::make_unique<std::ofstream>(); // logFile.close();
logFile->open(Tyra::FileUtils::fromCwd("log.txt"), }
std::ofstream::out | std::ofstream::app);
return logFile.get();
}
} // namespace Tyra
+1 -2
View File
@@ -12,8 +12,7 @@
#include <tamtypes.h> #include <tamtypes.h>
#include <cstdio> #include <cstdio>
#include <kernel.h> #include <kernel.h>
#include <limits.h>
#include <syslimits.h>
#include <unistd.h> #include <unistd.h>
#include <cstring> #include <cstring>
#include "file/file_utils.hpp" #include "file/file_utils.hpp"
+2
View File
@@ -0,0 +1,2 @@
$PS2SDK/iop/irx/fileXio.irx
fileXio_irx
+2
View File
@@ -0,0 +1,2 @@
$PS2SDK/iop/irx/iomanX.irx
iomanX_irx
+32 -23
View File
@@ -20,30 +20,20 @@
#include "file/file_utils.hpp" #include "file/file_utils.hpp"
// external IRX modules // external IRX modules
#define EXTERN_IRX(_irx) \
extern u8 _irx[]; \
extern int size_##_irx
extern u8 sio2man_irx[]; EXTERN_IRX(sio2man_irx);
extern int size_sio2man_irx; EXTERN_IRX(padman_irx);
EXTERN_IRX(audsrv_irx);
extern u8 padman_irx[]; EXTERN_IRX(libsd_irx);
extern int size_padman_irx; EXTERN_IRX(fileXio_irx);
EXTERN_IRX(iomanX_irx);
extern u8 audsrv_irx[]; EXTERN_IRX(bdm_irx);
extern int size_audsrv_irx; EXTERN_IRX(bdmfs_fatfs_irx);
EXTERN_IRX(usbd_irx);
extern u8 libsd_irx[]; EXTERN_IRX(usbmass_bd_irx);
extern int size_libsd_irx;
extern u8 bdm_irx[];
extern int size_bdm_irx;
extern u8 bdmfs_fatfs_irx[];
extern int size_bdmfs_fatfs_irx;
extern u8 usbd_irx[];
extern int size_usbd_irx;
extern u8 usbmass_bd_irx[];
extern int size_usbmass_bd_irx;
namespace Tyra { namespace Tyra {
@@ -70,6 +60,7 @@ void IrxLoader::loadAll(const bool& withUsb, const bool& isLoggingToFile) {
return; return;
} }
loadIO(!isLoggingToFile);
loadSio2man(!isLoggingToFile); loadSio2man(!isLoggingToFile);
loadPadman(!isLoggingToFile); loadPadman(!isLoggingToFile);
loadLibsd(!isLoggingToFile); loadLibsd(!isLoggingToFile);
@@ -116,6 +107,24 @@ void IrxLoader::loadLibsd(const bool& verbose) {
if (verbose) TYRA_LOG("IRX: Libsd loaded!"); if (verbose) TYRA_LOG("IRX: Libsd loaded!");
} }
void IrxLoader::loadIO(const bool& verbose) {
int ret;
if (verbose) TYRA_LOG("IRX: Loading iomanX...");
SifExecModuleBuffer(&iomanX_irx, size_iomanX_irx, 0, nullptr, &ret);
TYRA_ASSERT(ret >= 0, "Failed to load module: iomanX_irx");
if (verbose) TYRA_LOG("IRX: iomanX loaded!");
if (verbose) TYRA_LOG("IRX: Loading fileXio...");
SifExecModuleBuffer(&fileXio_irx, size_fileXio_irx, 0, nullptr, &ret);
TYRA_ASSERT(ret >= 0, "Failed to load module: fileXio_irx");
if (verbose) TYRA_LOG("IRX: fileXio_irx loaded!");
}
void IrxLoader::loadUsbModules(const bool& verbose) { void IrxLoader::loadUsbModules(const bool& verbose) {
if (verbose) TYRA_LOG("IRX: Loading usb modules..."); if (verbose) TYRA_LOG("IRX: Loading usb modules...");
@@ -211,10 +211,6 @@ void PngLoader::handle8bppPalletized(TextureBuilderData* result,
auto* pixel = static_cast<unsigned char*>(result->data); auto* pixel = static_cast<unsigned char*>(result->data);
struct PngClut* clut = (struct PngClut*)result->clut; struct PngClut* clut = (struct PngClut*)result->clut;
for (int i = numPallete; i < 256; i++) {
memset(&clut[i], 0, sizeof(clut[i]));
}
for (int i = 0; i < numPallete; i++) { for (int i = 0; i < numPallete; i++) {
clut[i].r = palette[i].red; clut[i].r = palette[i].red;
clut[i].g = palette[i].green; clut[i].g = palette[i].green;
@@ -273,10 +269,6 @@ void PngLoader::handle4bppPalletized(TextureBuilderData* result,
auto* pixel = static_cast<unsigned char*>(result->data); auto* pixel = static_cast<unsigned char*>(result->data);
struct PngClut* clut = (struct PngClut*)result->clut; struct PngClut* clut = (struct PngClut*)result->clut;
for (int i = numPallete; i < 16; i++) {
memset(&clut[i], 0, sizeof(clut[i]));
}
for (int i = 0; i < numPallete; i++) { for (int i = 0; i < numPallete; i++) {
clut[i].r = palette[i].red; clut[i].r = palette[i].red;
clut[i].g = palette[i].green; clut[i].g = palette[i].green;
@@ -189,6 +189,8 @@ void DynPipRenderer::addBufferDataToPacket(DynPipBag** bags, const u32& count) {
void DynPipRenderer::sendPacket() { void DynPipRenderer::sendPacket() {
dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_wait(DMA_CHANNEL_VIF1, 0);
dma_channel_wait(DMA_CHANNEL_GIF, 0); // Wait for texture. Issue #182.
// dma_wait_fast(); // This have no impact on performance // dma_wait_fast(); // This have no impact on performance
dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true); dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true);
@@ -168,6 +168,8 @@ void BlockizerProgramsManager::sendPacket(McpipProgram* program) {
packet2_utils_vu_add_end_tag(currentPacket); packet2_utils_vu_add_end_tag(currentPacket);
dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_wait(DMA_CHANNEL_VIF1, 0);
dma_channel_wait(DMA_CHANNEL_GIF, 0); // Wait for texture. Issue #182.
// dma_wait_fast(); // This have no impact on performance // dma_wait_fast(); // This have no impact on performance
dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true); dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true);
@@ -365,6 +365,8 @@ void StaPipQBufferRenderer::sendPacket() {
"Packet is too big. Internal error"); "Packet is too big. Internal error");
dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_wait(DMA_CHANNEL_VIF1, 0);
dma_channel_wait(DMA_CHANNEL_GIF, 0); // Wait for texture. Issue #182.
// dma_wait_fast(); // This have no impact on performance // dma_wait_fast(); // This have no impact on performance
dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true); dma_channel_send_packet2(currentPacket, DMA_CHANNEL_VIF1, true);
+11 -11
View File
@@ -65,20 +65,20 @@ void Path3::sendTexture(const Texture* texture,
const RendererCoreTextureBuffers& texBuffers) { const RendererCoreTextureBuffers& texBuffers) {
packet2_reset(texturePacket, false); packet2_reset(texturePacket, false);
int coreWidth = texBuffers.core->width <= 64 ? 64 : texBuffers.core->width; packet2_update(
packet2_update(texturePacket, texturePacket,
draw_texture_transfer(texturePacket->base, texture->core->data, draw_texture_transfer(texturePacket->base, texture->core->data,
texture->getWidth(), texture->getWidth(), texture->getHeight(),
texture->getHeight(), texture->core->psm, texture->core->psm, texBuffers.core->address,
texBuffers.core->address, coreWidth)); texBuffers.core->width));
if (texBuffers.clut != nullptr) { if (texBuffers.clut != nullptr) {
auto* clut = texture->clut; auto* clut = texture->clut;
int clutWidth = texBuffers.clut->width <= 64 ? 64 : texBuffers.clut->width; packet2_update(
packet2_update(texturePacket, texturePacket,
draw_texture_transfer(texturePacket->next, clut->data, draw_texture_transfer(texturePacket->next, clut->data, clut->width,
clut->width, clut->height, clut->psm, clut->height, clut->psm, texBuffers.clut->address,
texBuffers.clut->address, clutWidth)); texBuffers.clut->width));
} }
packet2_chain_open_cnt(texturePacket, 0, 0, 0); packet2_chain_open_cnt(texturePacket, 0, 0, 0);
@@ -19,8 +19,18 @@
namespace Tyra { namespace Tyra {
namespace TyraTexture {
u32 textureCounter = 1;
std::vector<u32> deletedIDs;
} // namespace TyraTexture
Texture::Texture(TextureBuilderData* t_data) { Texture::Texture(TextureBuilderData* t_data) {
id = rand() % 1000000; if (TyraTexture::deletedIDs.empty() == false) {
id = TyraTexture::deletedIDs.front();
TyraTexture::deletedIDs.erase(TyraTexture::deletedIDs.begin());
} else {
id = TyraTexture::textureCounter++;
}
name = t_data->name; name = t_data->name;
@@ -50,6 +60,7 @@ Texture::Texture(TextureBuilderData* t_data) {
} }
Texture::~Texture() { Texture::~Texture() {
TyraTexture::deletedIDs.push_back(id);
if (links.size() > 0) links.clear(); if (links.size() > 0) links.clear();
if (core) delete core; if (core) delete core;
if (clut) delete clut; if (clut) delete clut;
@@ -167,9 +178,14 @@ void Texture::setDefaultWrapSettings() {
} }
void Texture::setWrapSettings(const TextureWrap t_horizontal, void Texture::setWrapSettings(const TextureWrap t_horizontal,
const TextureWrap t_vertical) { const TextureWrap t_vertical, int minu, int minv,
int maxu, int maxv) {
wrap.horizontal = t_horizontal; wrap.horizontal = t_horizontal;
wrap.vertical = t_vertical; wrap.vertical = t_vertical;
wrap.minu = minu;
wrap.minv = minv;
wrap.maxu = maxu;
wrap.maxv = maxv;
} }
void Texture::addLink(const u32& t_id) { void Texture::addLink(const u32& t_id) {
@@ -19,6 +19,7 @@ RendererCoreTexture::~RendererCoreTexture() {}
void RendererCoreTexture::init(RendererCoreGS* t_gs, Path3* t_path3) { void RendererCoreTexture::init(RendererCoreGS* t_gs, Path3* t_path3) {
gs = t_gs; gs = t_gs;
sender.init(t_path3, t_gs); sender.init(t_path3, t_gs);
repository.init(&currentAllocations);
path3 = t_path3; path3 = t_path3;
initClut(); initClut();
} }
@@ -56,6 +57,17 @@ RendererCoreTextureBuffers RendererCoreTexture::useTexture(
return newTexBuffer; return newTexBuffer;
} }
RendererCoreTextureBuffers RendererCoreTexture::updateTextureInfo(
const Texture* t_tex) {
TYRA_ASSERT(t_tex != nullptr, "Provided nullptr texture!");
auto allocated = getAllocatedBuffersByTextureId(t_tex->id);
TYRA_ASSERT(allocated.id != 0, "Can't update an unallocated texture!");
path3->sendTexture(t_tex, allocated);
return allocated;
}
RendererCoreTextureBuffers RendererCoreTexture::getAllocatedBuffersByTextureId( RendererCoreTextureBuffers RendererCoreTexture::getAllocatedBuffersByTextureId(
const u32& t_id) { const u32& t_id) {
for (u32 i = 0; i < currentAllocations.size(); i++) for (u32 i = 0; i < currentAllocations.size(); i++)
@@ -58,7 +58,19 @@ texbuffer_t* RendererCoreTextureSender::allocateTextureCore(
auto* result = new texbuffer_t; auto* result = new texbuffer_t;
const auto* core = t_texture->core; const auto* core = t_texture->core;
result->width = t_texture->getWidth(); switch (core->psm) {
case GS_PSM_8:
case GS_PSM_4:
case GS_PSM_8H:
case GS_PSM_4HL:
case GS_PSM_4HH:
result->width = -128 & (core->width + 127);
break;
default:
result->width = -64 & (core->width + 63);
break;
}
result->psm = core->psm; result->psm = core->psm;
result->info.components = core->components; result->info.components = core->components;
@@ -77,7 +89,9 @@ texbuffer_t* RendererCoreTextureSender::allocateTextureClut(
auto* result = new texbuffer_t; auto* result = new texbuffer_t;
const auto* clut = t_texture->clut; const auto* clut = t_texture->clut;
result->width = clut->width; int clutWidth = clut->width <= 64 ? 64 : clut->width;
result->width = clutWidth;
result->psm = clut->psm; result->psm = clut->psm;
result->info.components = clut->components; result->info.components = clut->components;
@@ -22,6 +22,11 @@ TextureRepository::~TextureRepository() {
} }
} }
void TextureRepository::init(
std::vector<RendererCoreTextureBuffers>* t_textureBuffers) {
textureBuffers = t_textureBuffers;
}
Texture* TextureRepository::getBySpriteId(const u32& t_id) const { Texture* TextureRepository::getBySpriteId(const u32& t_id) const {
for (u32 i = 0; i < textures.size(); i++) { for (u32 i = 0; i < textures.size(); i++) {
if (textures[i]->isLinkedWith(t_id)) return textures[i]; if (textures[i]->isLinkedWith(t_id)) return textures[i];
@@ -57,10 +62,20 @@ void TextureRepository::removeByIndex(const u32& t_index) {
textures.erase(textures.begin() + t_index); textures.erase(textures.begin() + t_index);
} }
int TextureRepository::removeBufferId(const u32& t_texId) {
for (u32 i = 0; i < textureBuffers->size(); i++)
if ((*textureBuffers)[i].id == t_texId) {
(*textureBuffers)[i].id = -1;
return 0;
}
return -1;
}
void TextureRepository::removeById(const u32& t_texId) { void TextureRepository::removeById(const u32& t_texId) {
s32 index = getIndexOf(t_texId); s32 index = getIndexOf(t_texId);
TYRA_ASSERT(index != -1, "Cant remove texture, because it was not found!"); TYRA_ASSERT(index != -1, "Cant remove texture, because it was not found!");
removeByIndex(index); removeByIndex(index);
removeBufferId(t_texId);
} }
void TextureRepository::freeByMesh(const Mesh& mesh) { void TextureRepository::freeByMesh(const Mesh& mesh) {
@@ -93,6 +108,7 @@ void TextureRepository::free(const u32& t_texId) {
TYRA_ASSERT(index != -1, "Cant remove texture, because it was not found!"); TYRA_ASSERT(index != -1, "Cant remove texture, because it was not found!");
removeByIndex(index); removeByIndex(index);
removeBufferId(t_texId);
delete tex; delete tex;
} }
@@ -116,7 +132,7 @@ void TextureRepository::addByMesh(const Mesh* mesh, const char* directory,
if (dirFixed.back() != '/' && dirFixed.back() != ':') dirFixed += "/"; if (dirFixed.back() != '/' && dirFixed.back() != ':') dirFixed += "/";
for (u32 i = 0; i < mesh->materials.size(); i++) { for (u32 i = 0; i < mesh->materials.size(); i++) {
if (!mesh->materials[i]->textureName.has_value()) { if (!mesh->materials[i]->textureName.has_value()) {
continue; continue;
} }
Executable
+74
View File
@@ -0,0 +1,74 @@
#!/bin/bash
get_target_elf_name() {
if [ -f "./Makefile" ]; then
grep -oP '\S+\.elf' Makefile | head -n 1
else
echo ""
fi
}
find_pcsx2() {
if [ -n "$CUSTOM_PCSX2_PATH" ]; then
echo "$CUSTOM_PCSX2_PATH"
return 0
fi
# Check flatpak
if command -v flatpak >/dev/null 2>&1 && flatpak list | grep -q "net.pcsx2.PCSX2"; then
echo "flatpak run net.pcsx2.PCSX2"
return 0
fi
# Check if pcsx2-qt is in PATH
if command -v pcsx2-qt >/dev/null 2>&1; then
echo "pcsx2-qt"
return 0
fi
# Check if pcsx2 is in PATH
if command -v pcsx2 >/dev/null 2>&1; then
echo "pcsx2"
return 0
fi
echo "Error: PCSX2 not found! Please install it, put it in PATH, or specify CUSTOM_PCSX2_PATH in this script." >&2
exit 1
}
run_pcsx2() {
local pcsx2_cmd
pcsx2_cmd=$(find_pcsx2)
local elf_name
elf_name=$(get_target_elf_name)
if [ -z "$elf_name" ]; then
echo "Error: Could not find target ELF name in Makefile!" >&2
exit 1
fi
local target_file
target_file="$(pwd)/bin/$elf_name"
if [ ! -f "$target_file" ]; then
echo "Error: ELF file not found at $target_file. Did you build the project?" >&2
exit 1
fi
# Kill existing PCSX2 instances
if [[ "$pcsx2_cmd" == *"flatpak"* ]]; then
pkill -f "net.pcsx2.PCSX2" >/dev/null 2>&1 || true
pkill -f "pcsx2-qt" >/dev/null 2>&1 || true
else
local bin_name
bin_name=$(basename "$pcsx2_cmd")
pkill "$bin_name" >/dev/null 2>&1 || true
fi
echo "Running PCSX2: $pcsx2_cmd -elf $target_file"
# Run PCSX2 in the background
$pcsx2_cmd -elf "$target_file" &
}
run_pcsx2
Submodule
+1
Submodule template added at e16b6e768d
-40
View File
@@ -1,40 +0,0 @@
# 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
@@ -1,5 +0,0 @@
*.elf
.git/
.vscode/
docs/
tools/
-2
View File
@@ -1,2 +0,0 @@
# Ignore all differences in line endings
* -crlf
-32
View File
@@ -1,32 +0,0 @@
# ---
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.vsm
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
*.erl
*.elf
-6
View File
@@ -1,6 +0,0 @@
*.log
# Configuration files
/c_cpp_properties.json
/tasks.json
/settings.json
@@ -1,42 +0,0 @@
{
"configurations": [
{
"name": "Docker PS2SDK",
"includePath": [
"${workspaceFolder}/**",
"C:/Users/YOUR-INTELLISENSE-PATH/ps2dev-intellisense/tyra/inc/**",
"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
}
-9
View File
@@ -1,9 +0,0 @@
{
"recommendations": [
"ms-vscode.cpptools-extension-pack",
"ryzngard.vscode-header-source",
"maziac.asm-code-lens",
"dmnsgn.vscode-wavefront",
"spmeesseman.vscode-taskexplorer"
]
}
-8
View File
@@ -1,8 +0,0 @@
# syntax=docker/dockerfile:1
FROM h4570/tyra
RUN apt-get update
RUN apt-get install git -y
WORKDIR /src
CMD ["/bin/bash"]
-33
View File
@@ -1,33 +0,0 @@
TARGET := racer.elf
ENGINEDIR := /tyra/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 /tyra/Makefile.base
clean-engine:
cd $(ENGINEDIR) && $(MAKE) cleaner
build-engine:
cd $(ENGINEDIR) && $(MAKE)
build-release-engine:
cd $(ENGINEDIR) && $(MAKE) release
-16
View File
@@ -1,16 +0,0 @@
version: "3.9"
volumes:
tyra-game-volume:
services:
compiler:
environment:
TERM: xterm-256color
network_mode: host
build:
context: ./
dockerfile: Dockerfile
tty: true
container_name: tyra-game-compiler
volumes:
- tyra-game-volume:/src
- ./:/host
-19
View File
@@ -1,19 +0,0 @@
#pragma once
#include <tyra>
namespace Racer {
class RacerGame : public Tyra::Game {
public:
RacerGame(Tyra::Engine* engine);
~RacerGame();
void init();
void loop();
private:
Tyra::Engine* engine;
};
} // namespace Racer
-4
View File
@@ -1,4 +0,0 @@
$ConfigFile = Join-Path $PSScriptRoot './windows-pcsx2.ps1'
. $ConfigFile
RunPCSX2
-10
View File
@@ -1,10 +0,0 @@
#include <tyra>
#include "racer_game.hpp"
int main() {
Tyra::Engine engine;
Racer::RacerGame game(&engine);
engine.run(&game);
SleepThread();
return 0;
}
-14
View File
@@ -1,14 +0,0 @@
#include "racer_game.hpp"
namespace Racer {
using namespace Tyra;
RacerGame::RacerGame(Engine* t_engine) { engine = t_engine; }
RacerGame::~RacerGame() {}
void RacerGame::init() { TYRA_LOG("Hello!"); }
void RacerGame::loop() { TYRA_LOG("Loop!"); }
} // namespace Racer
-12
View File
@@ -1,12 +0,0 @@
$PCSX2_PATH = "${Env:ProgramFiles(x86)}/PCSX2"
$PCSX2_EXE = 'pcsx2.exe'
function GetTargetELFName {
return (Select-String -Path './Makefile' -Pattern "[^ ]*.elf").Matches.Value
}
function RunPCSX2 {
$PCSX2_EXE_WITHOUT_EXT = (Split-Path $PCSX2_EXE -Leaf).Split('.')[0]
Stop-Process -Name $PCSX2_EXE_WITHOUT_EXT -ErrorAction 'SilentlyContinue'
Start-Process -FilePath "$PCSX2_PATH/$PCSX2_EXE" -ArgumentList "--elf=$PWD/bin/$(GetTargetELFName)"
}
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
@@ -0,0 +1,24 @@
TARGET := tutorial_11.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 :=
LIBDIRS :=
INC := -I$(INCDIR)
INCDEP := -I$(INCDIR)
include ../Makefile.tutorials-base
@@ -0,0 +1,58 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2024, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#pragma once
#include <tyra>
#include <memory>
namespace Tyra {
class Tutorial11 : public Game {
public:
explicit Tutorial11(Engine* engine);
~Tutorial11();
void init();
void loop();
private:
void setDrawData();
void loadBags();
void setTextureRegionRepeat();
void setTextureDefaultWrap();
const u8 MAX_TILES = 4;
u8 TILE_COL = 0;
u8 TILE_ROW = 0;
u8 shouldFlipTextureSettings = false;
float limitTimeToFlip = 2.00f;
float elapsedTime = 0;
Engine* engine;
Vec4 cameraPosition, cameraLookAt;
M4x4 translation, rotation, scale, model;
Texture* UVCheckerTex;
std::array<Vec4, 6> vertices;
std::array<Color, 6> colors;
std::array<Vec4, 6> uvMap;
StaticPipeline stapip;
std::unique_ptr<StaPipBag> bag;
std::unique_ptr<StaPipInfoBag> infoBag;
std::unique_ptr<StaPipColorBag> colorBag;
std::unique_ptr<StaPipTextureBag> texBag;
};
} // namespace Tyra
@@ -0,0 +1,4 @@
$ConfigFile = Join-Path $PSScriptRoot '../../windows-pcsx2.ps1'
. $ConfigFile
RunPCSX2
+4
View File
@@ -0,0 +1,4 @@
#!/bin/bash
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
cd "$SCRIPT_DIR" || exit 1
../../linux-pcsx2.sh
@@ -0,0 +1,24 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2024, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#include "engine.hpp"
#include "tutorial_11.hpp"
/**
* In this tutorial we will learn:
* - How to use texture in repeate mode of GS
*/
int main() {
Tyra::Engine engine;
Tyra::Tutorial11 game(&engine);
engine.run(&game);
return 0;
}
@@ -0,0 +1,178 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2024, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Wellington Carvalho <wellcoj@gmail.com>
*/
#include <tyra>
#include "tutorial_11.hpp"
namespace Tyra {
Tutorial11::Tutorial11(Engine* t_engine) : engine(t_engine) {
translation = M4x4::Identity;
rotation = M4x4::Identity;
scale = M4x4::Identity;
model = M4x4::Identity;
rotation.rotateY(Math::PI);
}
Tutorial11::~Tutorial11() {}
void Tutorial11::init() {
stapip.setRenderer(&engine->renderer.core);
cameraPosition = Vec4(0.0F, 0.0F, -10.0F);
cameraLookAt.unit();
UVCheckerTex = engine->renderer.getTextureRepository().add(
FileUtils::fromCwd("uv_checker.png"));
setDrawData();
loadBags();
}
void Tutorial11::loop() {
const auto deltaTime =
std::min(1.0f / static_cast<float>(engine->info.getFps()),
static_cast<float>(1.0 / 60.0f));
elapsedTime += deltaTime;
if (elapsedTime > limitTimeToFlip) {
elapsedTime -= limitTimeToFlip;
shouldFlipTextureSettings = !shouldFlipTextureSettings;
shouldFlipTextureSettings ? setTextureRegionRepeat()
: setTextureDefaultWrap();
// Update texture packet info after change wrap settings
engine->renderer.core.texture.updateTextureInfo(UVCheckerTex);
}
model = translation * rotation * scale;
engine->renderer.beginFrame(CameraInfo3D(&cameraPosition, &cameraLookAt));
{
engine->renderer.renderer3D.usePipeline(stapip);
/**
* Lets draw manually via "bags".
* You can do the same thing with dynamic pipeline.
*/
stapip.core.render(bag.get());
}
engine->renderer.endFrame();
}
void Tutorial11::setDrawData() {
vertices = {
// Tri 1
Vec4(-3.0F, -3.0F, 0.0F),
Vec4(3.0F, -3.0F, 0.0F),
Vec4(-3.0F, 3.0F, 0.0F),
// Tri 2
Vec4(3.0F, -3.0F, 0.0F),
Vec4(-3.0F, 3.0F, 0.0F),
Vec4(3.0F, 3.0F, 0.0F),
};
colors = {
Color(128.0F, 128.0F, 128.0F), Color(128.0F, 128.0F, 128.0F),
Color(128.0F, 128.0F, 128.0F), Color(128.0F, 128.0F, 128.0F),
Color(128.0F, 128.0F, 128.0F), Color(128.0F, 128.0F, 128.0F),
};
setTextureDefaultWrap();
}
void Tutorial11::setTextureDefaultWrap() {
uvMap = {Vec4(0.0f, 1.0F, 1.0F, 0.0f), Vec4(0.0f + 1, 1.0F, 1.0F, 0.0f),
Vec4(0.0f, 0.0f, 1.0F, 0.0f),
Vec4(0.0f + 1, 1.0F, 1.0F, 0.0f), Vec4(0.0f, 0.0f, 1.0F, 0.0f),
Vec4(0.0f + 1.0F, 0.0f, 1.0F, 0.0f)};
TYRA_LOG("Reseting texture wrap settings");
UVCheckerTex->setDefaultWrapSettings();
}
void Tutorial11::setTextureRegionRepeat() {
const float _scale = 1.0f / (float)MAX_TILES;
const Vec4 scale =
Vec4(MAX_TILES > 0 ? _scale * MAX_TILES : _scale,
MAX_TILES > 0 ? _scale * MAX_TILES : _scale, 1.0f, 0.0f);
uvMap = {
Vec4(TILE_COL, TILE_ROW + 1.0F, 1.0F, 0.0f) * scale,
Vec4(TILE_COL + 1, TILE_ROW + 1.0F, 1.0F, 0.0f) * scale,
Vec4(TILE_COL, TILE_ROW, 1.0F, 0.0f) * scale,
Vec4(TILE_COL + 1, TILE_ROW + 1.0F, 1.0F, 0.0f) * scale,
Vec4(TILE_COL, TILE_ROW, 1.0F, 0.0f) * scale,
Vec4(TILE_COL + 1.0F, TILE_ROW, 1.0F, 0.0f) * scale,
};
const auto tileW = (UVCheckerTex->getWidth() * _scale) - 1;
const auto tileH = (UVCheckerTex->getHeight() * _scale) - 1;
const auto tileU = TILE_COL * tileW + TILE_COL;
const auto tileV = TILE_ROW * tileH + TILE_ROW;
int minu = tileW;
int minv = tileH;
int maxu = tileU;
int maxv = tileV;
TYRA_LOG("Changing the texture wraping...");
UVCheckerTex->setWrapSettings(TextureWrap::RegionRepeat,
TextureWrap::RegionRepeat, minu, minv, maxu,
maxv);
TILE_COL++;
if (TILE_COL >= MAX_TILES) {
TILE_COL %= MAX_TILES;
TILE_ROW = (TILE_ROW + 1) % MAX_TILES;
}
}
void Tutorial11::loadBags() {
/**
* Create info bag and fill it with model matrix and shading type.
* Keep rest of the options as default.
*/
infoBag = std::make_unique<StaPipInfoBag>();
infoBag->model = &model;
infoBag->shadingType = TyraShadingGouraud;
infoBag->textureMappingType = TyraNearest;
/** Create colors bag and set data pointer */
colorBag = std::make_unique<StaPipColorBag>();
colorBag->many = colors.begin();
texBag = std::make_unique<StaPipTextureBag>();
texBag.get()->texture = UVCheckerTex;
texBag.get()->coordinates = uvMap.data();
/**
* Create main bag and set:
* - vertices data
* - vertices count
* - pointers to other bags
*
* You can add here lighting and texture bag as well.
* If you want to have deeper look of this feature, please
* read static_pipeline.cpp code file.
*/
bag = std::make_unique<StaPipBag>();
bag->color = colorBag.get();
bag->texture = texBag.get();
bag->info = infoBag.get();
bag->vertices = vertices.begin();
bag->count = vertices.size();
}
} // namespace Tyra
+70 -6
View File
@@ -1,12 +1,76 @@
$PCSX2_PATH = "${Env:ProgramFiles(x86)}/PCSX2" # =======================
$PCSX2_EXE = 'pcsx2.exe' $CUSTOM_PCSX2_PATH = "" # "D:/My/Path/To/PCSX2"
# =======================
function GetTargetELFName { function GetTargetELFName {
return (Select-String -Path './Makefile' -Pattern "[^ ]*.elf").Matches.Value return (Select-String -Path './Makefile' -Pattern "[^ ]*.elf").Matches.Value
} }
function FindPCSX2Directory {
if (-not [string]::IsNullOrEmpty($CUSTOM_PCSX2_PATH)) {
return $CUSTOM_PCSX2_PATH
}
else {
# Try to find in program files
$pcsx2Path = "${Env:ProgramFiles}/PCSX2"
$pcsx2Pathx86 = "${Env:ProgramFiles(x86)}/PCSX2"
if (Test-Path -Path $pcsx2Path) {
return $pcsx2Path
}
elseif (Test-Path -Path $pcsx2Pathx86) {
return $pcsx2Pathx86
}
else {
throw "PCSX2 directory not found!"
return $null
}
}
}
function IsNewQtVersionOfPCSX2 {
param (
[string]$path
)
return Test-Path -Path "$path/qt.conf"
}
function FindPCSX2Executable {
param (
[string]$directory
)
$pcsx2ExePath = Join-Path -Path $directory -ChildPath 'pcsx2.exe'
$pcsx2QtExePath = Join-Path -Path $directory -ChildPath 'pcsx2-qt.exe'
if (Test-Path -Path $pcsx2ExePath) {
return 'pcsx2.exe'
}
elseif (Test-Path -Path $pcsx2QtExePath) {
return 'pcsx2-qt.exe'
}
else {
throw "PCSX2 executable not found in: $directory!"
return $null
}
}
function RunPCSX2 { function RunPCSX2 {
$PCSX2_EXE_WITHOUT_EXT = (Split-Path $PCSX2_EXE -Leaf).Split('.')[0] $dirPath = FindPCSX2Directory
Stop-Process -Name $PCSX2_EXE_WITHOUT_EXT -ErrorAction 'SilentlyContinue' $isNewVersion = IsNewQtVersionOfPCSX2 -path $dirPath
Start-Process -FilePath "$PCSX2_PATH/$PCSX2_EXE" -ArgumentList "--elf=$PWD/bin/$(GetTargetELFName)" $executableName = FindPCSX2Executable -directory $dirPath
} $executableNameWithoutExt = (Split-Path $executableName -Leaf).Split('.')[0]
$targetFileName = "$PWD/bin/$(GetTargetELFName)"
Stop-Process -Name $executableNameWithoutExt -ErrorAction 'SilentlyContinue'
if ($isNewVersion) {
Start-Process -FilePath "$dirPath/$executableName" -ArgumentList "-elf", $targetFileName
}
else { # Old version of PCSX2
Start-Process -FilePath "$dirPath/$executableName" -ArgumentList "--elf=$targetFileName"
}
}
RunPCSX2