diff --git a/Makefile b/Makefile index a1fe741..490cc4e 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ TARGET = psxsplash TYPE = ps-exe SRCS = \ -src/main.cpp +src/main.cpp \ +src/renderer.cpp include third_party/nugget/psyqo/psyqo.mk diff --git a/src/main.cpp b/src/main.cpp index ae447b6..267db5e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,7 @@ #include +#include "EASTL/array.h" +#include "gameobject.hh" #include "psyqo/application.hh" #include "psyqo/font.hh" #include "psyqo/gpu.hh" @@ -25,6 +27,8 @@ class MainScene final : public psyqo::Scene { uint8_t m_anim = 0; bool m_direction = true; + + eastl::array objects; }; PSXSplash psxSplash; @@ -39,6 +43,7 @@ void PSXSplash::prepare() { .set(psyqo::GPU::ColorMode::C15BITS) .set(psyqo::GPU::Interlace::PROGRESSIVE); gpu().initialize(config); + m_renderer.initialize(); } void PSXSplash::createScene() { @@ -47,22 +52,7 @@ void PSXSplash::createScene() { } void MainScene::frame() { - if (m_anim == 0) { - m_direction = true; - } else if (m_anim == 255) { - m_direction = false; - } - psyqo::Color bg{{.r = 0, .g = 64, .b = 91}}; - bg.r = m_anim; - psxSplash.gpu().clear(bg); - if (m_direction) { - m_anim++; - } else { - m_anim--; - } - - psyqo::Color c = {{.r = 255, .g = 255, .b = uint8_t(255 - m_anim)}}; - psxSplash.m_font.print(psxSplash.gpu(), "Hello World!", {{.x = 16, .y = 32}}, c); + psxSplash.m_renderer.render(objects); } int main() { return psxSplash.run(); } diff --git a/src/renderer.cpp b/src/renderer.cpp index 4293a37..edbb1e1 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -2,65 +2,104 @@ #include "psyqo/primitives/triangles.hh" -#include "renderer.hh" #include "gameobject.hh" +#include "psyqo/soft-math.hh" +#include "renderer.hh" + +void psxsplash::Renderer::initialize() { + psyqo::GTE::clear(); + psyqo::GTE::clear(); + psyqo::GTE::clear(); + + psyqo::GTE::write(psyqo::FixedPoint<16>(160.0).raw()); + psyqo::GTE::write(psyqo::FixedPoint<16>(120.0).raw()); + + psyqo::GTE::write(120); + + psyqo::GTE::write(ORDERING_TABLE_SIZE / 3); + psyqo::GTE::write(ORDERING_TABLE_SIZE / 4); +} void psxsplash::Renderer::render(eastl::array &objects) { - uint8_t parity = m_gpu.getParity(); + uint8_t parity = m_gpu.getParity(); - auto& ot = m_ots[parity]; - auto& clear = m_clear[parity]; - auto& balloc = m_ballocs[parity]; + auto &ot = m_ots[parity]; + auto &clear = m_clear[parity]; + auto &balloc = m_ballocs[parity]; - eastl::array projected; + eastl::array projected; - m_gpu.getNextClear(clear.primitive, m_clearcolor); - m_gpu.chain(clear); + m_gpu.getNextClear(clear.primitive, m_clearcolor); + m_gpu.chain(clear); - balloc.reset(); + balloc.reset(); - for (auto& obj : objects) { + for (auto &obj : objects) { - auto& mesh = obj.m_mesh; - auto& texture = mesh.m_texture; - - for (auto& tri : mesh.m_polygons) { - + auto &mesh = obj.m_mesh; + auto &texture = mesh.m_texture; - psyqo::GTE::writeUnsafe(tri.v0); - psyqo::GTE::writeUnsafe(tri.v1); - psyqo::GTE::writeUnsafe(tri.v2); + psyqo::GTE::write( + obj.m_pos.x.raw()); + psyqo::GTE::write( + obj.m_pos.y.raw()); + psyqo::GTE::write( + obj.m_pos.z.raw()); - psyqo::GTE::Kernels::rtpt(); - psyqo::GTE::Kernels::nclip(); + auto transform = psyqo::SoftMath::generateRotationMatrix33( + obj.m_rot[0], psyqo::SoftMath::Axis::X, m_trig); + auto rot = psyqo::SoftMath::generateRotationMatrix33( + obj.m_rot[1], psyqo::SoftMath::Axis::Y, m_trig); - int32_t mac0 = 0; - psyqo::GTE::read(reinterpret_cast(&mac0)); - if (mac0 <= 0) continue; + psyqo::SoftMath::multiplyMatrix33(transform, rot, &transform); - psyqo::GTE::Kernels::avsz4(); - int32_t zIndex = 0; - psyqo::GTE::read(reinterpret_cast(&zIndex)); - if (zIndex < 0 || zIndex >= ORDERING_TABLE_SIZE) continue; - - psyqo::GTE::read(&projected[1].packed); - psyqo::GTE::read(&projected[2].packed); - psyqo::GTE::read(&projected[3].packed); + auto rotZ = psyqo::SoftMath::generateRotationMatrix33( + obj.m_rot[2], psyqo::SoftMath::Axis::Z, m_trig); - auto& prim = balloc.allocate>(); + psyqo::SoftMath::multiplyMatrix33(transform, rotZ, &transform); - prim.primitive.pointA = projected[0]; - prim.primitive.pointB = projected[1]; - prim.primitive.pointC = projected[2]; - prim.primitive.uvA = tri.uvA; - prim.primitive.uvB = tri.uvB; - prim.primitive.uvC = tri.uvC; - prim.primitive.tpage = texture.m_tpage; + psyqo::GTE::writeUnsafe(transform); - ot.insert(prim, zIndex); - } - + for (auto &tri : mesh.m_polygons) { + + psyqo::GTE::writeUnsafe(tri.v0); + psyqo::GTE::writeUnsafe(tri.v1); + psyqo::GTE::writeUnsafe(tri.v2); + + psyqo::GTE::Kernels::rtpt(); + psyqo::GTE::Kernels::nclip(); + + int32_t mac0 = 0; + psyqo::GTE::read( + reinterpret_cast(&mac0)); + if (mac0 <= 0) + continue; + + psyqo::GTE::Kernels::avsz4(); + int32_t zIndex = 0; + psyqo::GTE::read( + reinterpret_cast(&zIndex)); + if (zIndex < 0 || zIndex >= ORDERING_TABLE_SIZE) + continue; + + psyqo::GTE::read(&projected[1].packed); + psyqo::GTE::read(&projected[2].packed); + psyqo::GTE::read(&projected[3].packed); + + auto &prim = balloc.allocate< + psyqo::Fragments::SimpleFragment>(); + + prim.primitive.pointA = projected[0]; + prim.primitive.pointB = projected[1]; + prim.primitive.pointC = projected[2]; + prim.primitive.uvA = tri.uvA; + prim.primitive.uvB = tri.uvB; + prim.primitive.uvC = tri.uvC; + prim.primitive.tpage = texture.m_tpage; + + ot.insert(prim, zIndex); } + } - m_gpu.chain(ot); + m_gpu.chain(ot); } \ No newline at end of file diff --git a/src/renderer.hh b/src/renderer.hh index e6ea891..5ce1fa5 100644 --- a/src/renderer.hh +++ b/src/renderer.hh @@ -8,6 +8,7 @@ #include "psyqo/primitives/common.hh" #include "psyqo/primitives/misc.hh" #include "psyqo/bump-allocator.hh" +#include "psyqo/trigonometry.hh" namespace psxsplash { @@ -16,14 +17,16 @@ class Renderer final { static constexpr size_t BUMP_ALLOCATOR_SIZE = 100000; psyqo::GPU& m_gpu; + psyqo::Trig<> m_trig; public: psyqo::OrderingTable m_ots[2]; psyqo::Fragments::SimpleFragment m_clear[2]; - psyqo::Color m_clearcolor = {.r = 0, .g = 0, .b = 0}; + psyqo::Color m_clearcolor = {.r = 63, .g = 63, .b = 63}; psyqo::BumpAllocator m_ballocs[2]; Renderer(psyqo::GPU& gpuInstance) : m_gpu(gpuInstance) {} + void initialize(); void render(eastl::array& objects); };