From 00c171d6b9842cdcc5da1d1d91c1e3315aebb61b Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 16 Nov 2020 23:15:07 +0100 Subject: [PATCH] migrated gif_sender to spacket --- src/engine/include/modules/gif_sender.hpp | 7 +-- src/engine/include/modules/renderer.hpp | 1 - src/engine/modules/gif_sender.cpp | 74 +++++++++-------------- src/samples/ari/ari.cpp | 42 ++++++------- 4 files changed, 51 insertions(+), 73 deletions(-) diff --git a/src/engine/include/modules/gif_sender.hpp b/src/engine/include/modules/gif_sender.hpp index 7b6f661..7df673e 100644 --- a/src/engine/include/modules/gif_sender.hpp +++ b/src/engine/include/modules/gif_sender.hpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include "../models/mesh.hpp" #include "../models/math/matrix.hpp" @@ -46,10 +45,8 @@ private: texel_t *st; u8 isAnyObjectAdded; ScreenSettings *screen; - u64 *dw; - qword_t *q, *dmatag; - packet_t *packets[2]; - packet_t *currentPacket; + spacket_t *packets[2]; + spacket_t *currentPacket; u8 packetsCount; int packetSize; float halfScreenW, halfScreenH; diff --git a/src/engine/include/modules/renderer.hpp b/src/engine/include/modules/renderer.hpp index b435524..e7b62e7 100644 --- a/src/engine/include/modules/renderer.hpp +++ b/src/engine/include/modules/renderer.hpp @@ -13,7 +13,6 @@ #include #include -#include #include #include "gif_sender.hpp" #include "vif_sender.hpp" diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 2833573..531e0db 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -32,16 +32,16 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre { PRINT_LOG("Initializing GifSender"); packetSize = t_packetSize; - packets[0] = packet_init(t_packetSize, PACKET_NORMAL); - packets[1] = packet_init(t_packetSize, PACKET_NORMAL); + packets[0] = spacket_create(t_packetSize, SPACKET_NORMAL); + packets[1] = spacket_create(t_packetSize, SPACKET_NORMAL); PRINT_LOG("GifSender initialized!"); } /** Releases packets memory */ GifSender::~GifSender() { - packet_free(packets[0]); - packet_free(packets[1]); + spacket_free(packets[0]); + spacket_free(packets[1]); } // ---- @@ -94,12 +94,8 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer) void GifSender::initPacket(u8 t_context) { currentPacket = packets[t_context]; - if (currentPacket->qwords > (u32)packetSize || currentPacket->qwords < 0) - PRINT_ERR("GifSender packet size error. Please consider to change packet size!\n"); - q = currentPacket->data; - dmatag = q; - q++; - isAnyObjectAdded = 0; + spacket_reset(currentPacket, false); + isAnyObjectAdded = false; } /** Sends packet to GIF. */ @@ -107,25 +103,24 @@ void GifSender::sendPacket() { if (isAnyObjectAdded) { - dmatag = q; - q++; + spacket_chain_open_end(currentPacket, 0, 0); + spacket_update(currentPacket, draw_finish(currentPacket->next)); + spacket_chain_close_tag(currentPacket); } - q = draw_finish(q); - DMATAG_END(dmatag, q - dmatag - 1, 0, 0, 0); - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_GIF, currentPacket->data, q - currentPacket->data, 0, 0); - dma_wait_fast(); + spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true); } /** Adds clear screen to current packet */ void GifSender::addClear(zbuffer_t *t_zBuffer) { - q = draw_disable_tests(q, 0, t_zBuffer); - q = draw_clear(q, 0, - 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), - screen->width, screen->height, - 0x10, 0x10, 0x10); - q = draw_enable_tests(q, 0, t_zBuffer); + spacket_chain_open_cnt(currentPacket, 0, 0, 0); + spacket_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer)); + spacket_update(currentPacket, draw_clear(currentPacket->next, 0, + 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), + screen->width, screen->height, + 0x10, 0x10, 0x10)); + spacket_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer)); + spacket_chain_close_tag(currentPacket); } /** Adds 3D objects to current packet @@ -136,19 +131,10 @@ void GifSender::addClear(zbuffer_t *t_zBuffer) */ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) { - if (!isAnyObjectAdded) - { - isAnyObjectAdded = true; - DMATAG_CNT(dmatag, q - dmatag - 1, 0, 0, 0); // init tag (before first 3d obj) - } - qword_t *tempDMATag; - tempDMATag = q; - q++; - - q = draw_texture_sampling(q, 0, &t_mesh.lod); - q = draw_texturebuffer(q, 0, textureBuffer, &t_mesh.clut); - dw = (u64 *)draw_prim_start(q, 0, t_renderData->prim, &t_mesh.color); - + spacket_chain_open_cnt(currentPacket, 0, 0, 0); + spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); + spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); + spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); xyz = new xyz_t[vertexCount]; rgbaq = new color_t[vertexCount]; st = new texel_t[vertexCount]; @@ -157,13 +143,8 @@ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCoun delete[] xyz; delete[] rgbaq; delete[] st; - - if ((u32)dw % 16) // if we are in the middle of qw, switch packet - *dw++ = 0; - - q = draw_prim_end((qword_t *)dw, 3, DRAW_STQ_REGLIST); - - DMATAG_CNT(tempDMATag, q - tempDMATag - 1, 0, 0, 0); + spacket_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST)); + spacket_chain_close_tag(currentPacket); } /** Calculates 3D object data into xyz, rgbq, st @@ -267,8 +248,9 @@ void GifSender::addCurrentCalcs(u32 &t_vertexCount) { for (u32 i = 0; i < t_vertexCount; i++) { - *dw++ = rgbaq[i].rgbaq; - *dw++ = st[i].uv; - *dw++ = xyz[i].xyz; + spacket_add_dword(currentPacket, rgbaq[i].rgbaq); + spacket_add_dword(currentPacket, st[i].uv); + spacket_add_dword(currentPacket, xyz[i].xyz); } + spacket_align_to_qw(currentPacket); } diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 3fbb597..3820215 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -33,7 +33,7 @@ Ari::~Ari() {} void Ari::onInit() { engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes); - engine->audio.setSongVolume(60); + engine->audio.setSongVolume(40); engine->audio.loadSong("MOV-CIRC.WAV"); adpcm = engine->audio.loadADPCM("ziobro.adpcm"); texRepo = engine->renderer->getTextureRepository(); @@ -52,23 +52,23 @@ void Ari::onInit() // skybox.loadObj("skybox/", "skybox", 100.0F, false); // skybox.shouldBeFrustumCulled = false; - // waterFloors[0].loadObj("water/", "water", 5.0F, false); - // waterFloors[0].position.set(0.0F, 8.0F, 0.0F); - // texRepo->addByMesh("water/", waterFloors[0]); - // for (u8 i = 0; i < WATER_TILES_COUNT; i++) - // { - // spirals[i].x = 1.0F; - // spirals[i].y = 2.0F; - // } - // u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT); - // calcSpiral(spiralOffset, spiralOffset); - // for (u8 i = 1; i < WATER_TILES_COUNT; i++) - // { - // waterFloors[i].loadFrom(waterFloors[0]); - // waterFloors[i].position.set(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y); - // texRepo->getByMesh(waterFloors[0].getId(), waterFloors[0].getMaterial(0).getId()) - // ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId()); - // } + waterFloors[0].loadObj("water/", "water", 5.0F, false); + waterFloors[0].position.set(0.0F, 8.0F, 0.0F); + texRepo->addByMesh("water/", waterFloors[0]); + for (u8 i = 0; i < WATER_TILES_COUNT; i++) + { + spirals[i].x = 1.0F; + spirals[i].y = 2.0F; + } + u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT); + calcSpiral(spiralOffset, spiralOffset); + for (u8 i = 1; i < WATER_TILES_COUNT; i++) + { + waterFloors[i].loadFrom(waterFloors[0]); + waterFloors[i].position.set(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y); + texRepo->getByMesh(waterFloors[0].getId(), waterFloors[0].getMaterial(0).getId()) + ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId()); + } texRepo->addByMesh("sunnyisl/", island); // texRepo->addByMesh("sunnyisl/", islandAddons); @@ -91,7 +91,7 @@ void Ari::onUpdate() if (engine->pad.isCrossClicked) { engine->audio.loadSong("nob-else.wav"); - engine->audio.playADPCM(adpcm); + // engine->audio.playADPCM(adpcm); printf("FPS:%f\n", engine->fps); } camera.update(engine->pad, player.mesh); @@ -99,8 +99,8 @@ void Ari::onUpdate() engine->renderer->draw(island); // engine->renderer->draw(islandAddons); // engine->renderer->draw(player.mesh); - // for (u8 i = 0; i < WATER_TILES_COUNT; i++) - // engine->renderer->draw(waterFloors[i]); + for (u8 i = 0; i < WATER_TILES_COUNT; i++) + engine->renderer->drawByPath3(waterFloors[i]); } void Ari::calcSpiral(int X, int Y)