From febb6f3f80d773f397ead40802535295408ab806 Mon Sep 17 00:00:00 2001 From: jracek Date: Mon, 7 Apr 2025 22:18:28 +0200 Subject: [PATCH] Final before release --- output.bin | Bin 439688 -> 407940 bytes src/camera.hh | 1 + src/gtemath.hh | 1 + src/main.cpp | 103 ++++++++++++++++++++++++++++++--------------- src/navmesh.cpp | 3 ++ src/navmesh.hh | 2 +- src/renderer.cpp | 18 +++++--- src/renderer.hh | 3 +- src/splashpack.cpp | 11 ++++- src/splashpack.hh | 5 +++ 10 files changed, 104 insertions(+), 43 deletions(-) diff --git a/output.bin b/output.bin index 30528a2dbaad4070850aa0cdf4ed6ae93659d62d..317e6d229b7e2e95cb5612ac4c107c042e5fc593 100644 GIT binary patch delta 57736 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 R;D41r%>Ut_bnL!m{|yhNHJAVZ delta 49628 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 diff --git a/src/camera.hh b/src/camera.hh index 51ef552..39c3e84 100644 --- a/src/camera.hh +++ b/src/camera.hh @@ -6,6 +6,7 @@ namespace psxsplash { +// Camera class for managing 3D position and rotation. class Camera { public: Camera(); diff --git a/src/gtemath.hh b/src/gtemath.hh index 059f34e..73fb10b 100644 --- a/src/gtemath.hh +++ b/src/gtemath.hh @@ -1,3 +1,4 @@ +#pragma once #include namespace psxsplash { diff --git a/src/main.cpp b/src/main.cpp index b94b1d6..b04f955 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,11 +30,12 @@ class PSXSplash final : public psyqo::Application { void createScene() override; public: - psyqo::Font<> m_font; - psyqo::AdvancedPad m_input; psxsplash::SplashPackLoader m_loader; - static constexpr uint8_t m_stickDeadzone = 0x30; + psyqo::Font<> m_font; + + psyqo::AdvancedPad m_input; + static constexpr uint8_t m_stickDeadzone = 0x30; }; class MainScene final : public psyqo::Scene { @@ -49,12 +50,17 @@ class MainScene final : public psyqo::Scene { static constexpr psyqo::FixedPoint<12> moveSpeed = 0.002_fp; static constexpr psyqo::Angle rotSpeed = 0.01_pi; - bool m_sprinting = 0; - static constexpr psyqo::FixedPoint<12> sprintSpeed = 0.003_fp; + bool m_sprinting = false; + static constexpr psyqo::FixedPoint<12> sprintSpeed = 0.01_fp; + + bool m_freecam = false; + psyqo::FixedPoint<12> pheight = 0.0_fp; + + bool m_renderSelect = false; }; -PSXSplash psxSplash; +PSXSplash app; MainScene mainScene; } // namespace @@ -78,11 +84,32 @@ void PSXSplash::createScene() { } void MainScene::start(StartReason reason) { - psxSplash.m_loader.LoadSplashpack(_binary_output_bin_start); + app.m_loader.LoadSplashpack(_binary_output_bin_start); psxsplash::Renderer::GetInstance().SetCamera(m_mainCamera); -} -psyqo::FixedPoint<12> pheight = 0.0_fp; + m_mainCamera.SetPosition(static_cast>(app.m_loader.playerStartPos.x), + static_cast>(app.m_loader.playerStartPos.y), + static_cast>(app.m_loader.playerStartPos.z)); + + pheight = psyqo::FixedPoint<12>(app.m_loader.playerHeight); + + app.m_input.setOnEvent( + eastl::function{[this](const psyqo::AdvancedPad::Event& event) { + if (event.pad != psyqo::AdvancedPad::Pad::Pad1a) return; + if (app.m_loader.navmeshes.empty()) return; + if (event.type == psyqo::AdvancedPad::Event::ButtonPressed) { + if (event.button == psyqo::AdvancedPad::Button::Triangle) { + m_freecam = !m_freecam; + } else if (event.button == psyqo::AdvancedPad::Button::Square) { + m_renderSelect = !m_renderSelect; + } + } + }}); + + if (app.m_loader.navmeshes.empty()) { + m_freecam = true; + } +} void MainScene::frame() { uint32_t beginFrame = gpu().now(); @@ -95,63 +122,69 @@ void MainScene::frame() { } mainScene.m_lastFrameCounter = currentFrameCounter; - - uint8_t rightX = psxSplash.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 0); - uint8_t rightY = psxSplash.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 1); - uint8_t leftX = psxSplash.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 2); - uint8_t leftY = psxSplash.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 3); + uint8_t rightX = app.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 0); + uint8_t rightY = app.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 1); + + uint8_t leftX = app.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 2); + uint8_t leftY = app.m_input.getAdc(psyqo::AdvancedPad::Pad::Pad1a, 3); int16_t rightXOffset = (int16_t)rightX - 0x80; int16_t rightYOffset = (int16_t)rightY - 0x80; int16_t leftXOffset = (int16_t)leftX - 0x80; int16_t leftYOffset = (int16_t)leftY - 0x80; - - if(__builtin_abs(leftXOffset) < psxSplash.m_stickDeadzone && - __builtin_abs(leftYOffset) < psxSplash.m_stickDeadzone) { + + if (__builtin_abs(leftXOffset) < app.m_stickDeadzone && + __builtin_abs(leftYOffset) < app.m_stickDeadzone) { m_sprinting = false; } - if(psxSplash.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::L3)) { + if (app.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::L3)) { m_sprinting = true; } psyqo::FixedPoint<12> speed = m_sprinting ? sprintSpeed : moveSpeed; - if (__builtin_abs(rightXOffset) > psxSplash.m_stickDeadzone) { - camRotY += (rightXOffset * rotSpeed * deltaTime) >> 7; + if (__builtin_abs(rightXOffset) > app.m_stickDeadzone) { + camRotY += (rightXOffset * rotSpeed * deltaTime) >> 7; } - if (__builtin_abs(rightYOffset) > psxSplash.m_stickDeadzone) { + if (__builtin_abs(rightYOffset) > app.m_stickDeadzone) { camRotX -= (rightYOffset * rotSpeed * deltaTime) >> 7; camRotX = eastl::clamp(camRotX, -0.5_pi, 0.5_pi); } m_mainCamera.SetRotation(camRotX, camRotY, camRotZ); - if (__builtin_abs(leftYOffset) > psxSplash.m_stickDeadzone) { + if (__builtin_abs(leftYOffset) > app.m_stickDeadzone) { psyqo::FixedPoint<12> forward = -(leftYOffset * speed * deltaTime) >> 7; m_mainCamera.MoveX((m_trig.sin(camRotY) * forward)); m_mainCamera.MoveZ((m_trig.cos(camRotY) * forward)); } - if (__builtin_abs(leftXOffset) > psxSplash.m_stickDeadzone) { - psyqo::FixedPoint<12> strafe = -(leftXOffset * speed * deltaTime) >> 7; + if (__builtin_abs(leftXOffset) > app.m_stickDeadzone) { + psyqo::FixedPoint<12> strafe = -(leftXOffset * speed * deltaTime) >> 7; m_mainCamera.MoveX(-(m_trig.cos(camRotY) * strafe)); m_mainCamera.MoveZ((m_trig.sin(camRotY) * strafe)); } - if(psxSplash.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::L1)) { - pheight += 0.01_fp; + if (app.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::L1)) { + m_mainCamera.MoveY(speed * deltaTime); } - if(psxSplash.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::R1)) { - pheight -= 0.01_fp; + if (app.m_input.isButtonPressed(psyqo::AdvancedPad::Pad::Pad1a, psyqo::AdvancedPad::Button::R1)) { + m_mainCamera.MoveY(-speed * deltaTime); } - psyqo::Vec3 adjustedPosition = - psxsplash::ComputeNavmeshPosition(m_mainCamera.GetPosition(), *psxSplash.m_loader.navmeshes[0], -0.05_fp); - m_mainCamera.SetPosition(adjustedPosition.x, adjustedPosition.y, adjustedPosition.z); + if (!m_freecam) { + psyqo::Vec3 adjustedPosition = + psxsplash::ComputeNavmeshPosition(m_mainCamera.GetPosition(), *app.m_loader.navmeshes[0], -pheight); + m_mainCamera.SetPosition(adjustedPosition.x, adjustedPosition.y, adjustedPosition.z); + } - psxsplash::Renderer::GetInstance().Render(psxSplash.m_loader.gameObjects); - // psxsplash::Renderer::getInstance().renderNavmeshPreview(*psxSplash.m_loader.navmeshes[0], true); - psxSplash.m_font.chainprintf(gpu(), {{.x = 2, .y = 2}}, {{.r = 0xff, .g = 0xff, .b = 0xff}}, "FPS: %i", + if (!m_renderSelect) { + psxsplash::Renderer::GetInstance().Render(app.m_loader.gameObjects); + } else { + psxsplash::Renderer::GetInstance().RenderNavmeshPreview(*app.m_loader.navmeshes[0], true); + } + + app.m_font.chainprintf(gpu(), {{.x = 2, .y = 2}}, {{.r = 0xff, .g = 0xff, .b = 0xff}}, "FPS: %i", gpu().getRefreshRate() / deltaTime); gpu().pumpCallbacks(); @@ -159,4 +192,4 @@ void MainScene::frame() { uint32_t spent = endFrame - beginFrame; } -int main() { return psxSplash.run(); } \ No newline at end of file +int main() { return app.run(); } \ No newline at end of file diff --git a/src/navmesh.cpp b/src/navmesh.cpp index 91e5aaf..bd21ed0 100644 --- a/src/navmesh.cpp +++ b/src/navmesh.cpp @@ -7,6 +7,9 @@ using namespace psyqo::fixed_point_literals; +// FIXME: This entire file uses hard FixedPoint scaling of 100. This is not ideal. +// It would be better to move the fixedpoint precision to 19 instead. + namespace psxsplash { psyqo::FixedPoint<12> DotProduct2D(const psyqo::Vec2& a, const psyqo::Vec2& b) { return a.x * b.x + a.y * b.y; } diff --git a/src/navmesh.hh b/src/navmesh.hh index 121c880..538c1b3 100644 --- a/src/navmesh.hh +++ b/src/navmesh.hh @@ -1,6 +1,6 @@ #pragma once -#include "psyqo/gte-registers.hh" +#include namespace psxsplash { diff --git a/src/renderer.cpp b/src/renderer.cpp index 94ecfee..9d14658 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1,5 +1,6 @@ #include "renderer.hh" +#include #include #include @@ -14,9 +15,7 @@ #include #include -#include "EASTL/array.h" #include "gtemath.hh" -#include "splashpack.hh" using namespace psyqo::fixed_point_literals; using namespace psyqo::trig_literals; @@ -46,7 +45,6 @@ void psxsplash::Renderer::Init(psyqo::GPU &gpuInstance) { void psxsplash::Renderer::SetCamera(psxsplash::Camera &camera) { m_currentCamera = &camera; } - void psxsplash::Renderer::Render(eastl::vector &objects) { psyqo::Kernel::assert(m_currentCamera != nullptr, "PSXSPLASH: Tried to render without an active camera"); @@ -189,6 +187,10 @@ void psxsplash::Renderer::RenderNavmeshPreview(psxsplash::Navmesh navmesh, bool zIndex = eastl::max(eastl::max(sz0, sz1), sz2); if (zIndex < 0 || zIndex >= ORDERING_TABLE_SIZE) continue; + read(&projected[0].packed); + read(&projected[1].packed); + read(&projected[2].packed); + auto &prim = balloc.allocateFragment(); prim.primitive.pointA = projected[0]; @@ -244,6 +246,11 @@ void psxsplash::Renderer::recursiveSubdivideAndRender(Tri &tri, eastl::array(); prim.primitive.pointA = projected[0]; @@ -252,7 +259,7 @@ void psxsplash::Renderer::recursiveSubdivideAndRender(Tri &tri, eastl::array uint32_t { int dx = a.x - b.x; int dy = a.y - b.y; diff --git a/src/renderer.hh b/src/renderer.hh index 8b73344..c5a733a 100644 --- a/src/renderer.hh +++ b/src/renderer.hh @@ -16,7 +16,7 @@ #include "camera.hh" #include "gameobject.hh" -#include "splashpack.hh" +#include "navmesh.hh" namespace psxsplash { @@ -25,6 +25,7 @@ class Renderer final { Renderer(const Renderer&) = delete; Renderer& operator=(const Renderer&) = delete; + // FIXME: I have no idea how to precompute the required sizes of these. It would be best to allocate them based on the scene static constexpr size_t ORDERING_TABLE_SIZE = 2048 * 3; static constexpr size_t BUMP_ALLOCATOR_SIZE = 8096 * 24; diff --git a/src/splashpack.cpp b/src/splashpack.cpp index 56c7df2..d5d6b3e 100644 --- a/src/splashpack.cpp +++ b/src/splashpack.cpp @@ -6,6 +6,8 @@ #include "gameobject.hh" #include "mesh.hh" +#include "psyqo/fixed-point.hh" +#include "psyqo/gte-registers.hh" #include "renderer.hh" namespace psxsplash { @@ -17,7 +19,10 @@ struct SPLASHPACKFileHeader { uint16_t navmeshCount; uint16_t textureAtlasCount; uint16_t clutCount; - uint16_t pad[2]; + psyqo::GTE::PackedVec3 playerStartPos; + psyqo::GTE::PackedVec3 playerStartRot; + psyqo::FixedPoint<12, uint16_t> playerHeight; + uint16_t pad[1]; }; struct SPLASHPACKTextureAtlas { @@ -39,6 +44,10 @@ void SplashPackLoader::LoadSplashpack(uint8_t *data) { psxsplash::SPLASHPACKFileHeader *header = reinterpret_cast(data); psyqo::Kernel::assert(memcmp(header->magic, "SP", 2) == 0, "Splashpack has incorrect magic"); + playerStartPos = header->playerStartPos; + playerStartRot = header->playerStartRot; + playerHeight = header->playerHeight; + gameObjects.reserve(header->gameObjectCount); navmeshes.reserve(header->navmeshCount); diff --git a/src/splashpack.hh b/src/splashpack.hh index 7218ed8..11273c8 100644 --- a/src/splashpack.hh +++ b/src/splashpack.hh @@ -6,6 +6,7 @@ #include "gameobject.hh" #include "navmesh.hh" +#include "psyqo/fixed-point.hh" namespace psxsplash { @@ -13,6 +14,10 @@ class SplashPackLoader { public: eastl::vector gameObjects; eastl::vector navmeshes; + + psyqo::GTE::PackedVec3 playerStartPos, playerStartRot; + psyqo::FixedPoint<12, uint16_t> playerHeight; + void LoadSplashpack(uint8_t *data); };