From 3b5fb1b670f7eeb443afca2194d64634e8f5a697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20Sobczy=C5=84ski?= Date: Sun, 8 Nov 2020 21:50:06 +0100 Subject: [PATCH] fixing rendering issue on real PS2 --- src/engine/engine.cpp | 2 +- src/engine/include/loaders/dff_loader.hpp | 1 + src/engine/include/models/mesh_frame.hpp | 6 +-- src/engine/loaders/bmp_loader.cpp | 32 ++++++------ src/engine/loaders/dff_loader.cpp | 23 ++++++++- src/engine/loaders/md2_loader.cpp | 4 +- src/engine/loaders/obj_loader.cpp | 4 +- src/engine/modules/gif_sender.cpp | 6 ++- src/engine/modules/renderer.cpp | 9 ++-- src/engine/modules/vif_sender.cpp | 2 +- src/engine/modules/vu1.cpp | 9 ++-- src/samples/ari/Makefile | 9 ++++ src/samples/ari/ari.cpp | 60 ++++++++++++----------- src/samples/ari/objects/player.cpp | 20 ++++---- 14 files changed, 110 insertions(+), 77 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 4ab92d5..4293d5f 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -104,7 +104,7 @@ void Engine::gameLoop() timer.primeTimer(); renderer->endFrame(fps); /** -6~ FPS */ - SetAlarm(fps > 49.0F ? 24 : 48, &Engine::wakeup, &mainThreadId); + SetAlarm(150, &Engine::wakeup, &mainThreadId); SleepThread(); } } diff --git a/src/engine/include/loaders/dff_loader.hpp b/src/engine/include/loaders/dff_loader.hpp index a9a6216..14d7ce0 100644 --- a/src/engine/include/loaders/dff_loader.hpp +++ b/src/engine/include/loaders/dff_loader.hpp @@ -22,6 +22,7 @@ public: DffLoader(); ~DffLoader(); + // void im_not_used_anywhere(MeshFrame *o_result, char *t_fileName, float t_scale, u8 t_invertT); void load(MeshFrame *o_result, char *t_fileName, float t_scale, u8 t_invertT); void serialize(MeshFrame *o_result, u8 t_invertT, u8 *t_data, float t_scale); diff --git a/src/engine/include/models/mesh_frame.hpp b/src/engine/include/models/mesh_frame.hpp index 9bd01f7..99ec249 100644 --- a/src/engine/include/models/mesh_frame.hpp +++ b/src/engine/include/models/mesh_frame.hpp @@ -147,10 +147,8 @@ private: _isBoundingBoxCalculated; u32 vertexCount, stsCount, normalsCount, materialsCount; MeshMaterial *materials; - Point *sts __attribute__((aligned(16))); - Vector3 - *vertices __attribute__((aligned(16))), - *normals __attribute__((aligned(16))); + Point __attribute__((aligned(16))) * sts; + Vector3 __attribute__((aligned(16))) * vertices, *normals; }; #endif diff --git a/src/engine/loaders/bmp_loader.cpp b/src/engine/loaders/bmp_loader.cpp index 4c8075f..3eaa753 100644 --- a/src/engine/loaders/bmp_loader.cpp +++ b/src/engine/loaders/bmp_loader.cpp @@ -32,10 +32,12 @@ BmpLoader::~BmpLoader() {} */ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, char *t_extension) { - char *t_path_part = String::createConcatenated(t_subfolder, t_name); - char *t_path = String::createConcatenated(t_path_part, t_extension); - delete[] t_path_part; - FILE *file = fopen(t_path, "rb"); + char *path_part1 = String::createConcatenated(t_subfolder, t_name); + char *path_part2 = String::createConcatenated("host:", path_part1); + char *path = String::createConcatenated(path_part2, t_extension); + delete[] path_part1; + delete[] path_part2; + FILE *file = fopen(path, "rb"); if (file == NULL) { @@ -46,8 +48,8 @@ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, ch unsigned char header[54]; fread(header, sizeof(unsigned char), 54, file); - u32 width = *(u32 *)&header[18]; - u32 height = *(u32 *)&header[22]; + u32 width = (u32)header[18]; + u32 height = (u32)header[22]; o_texture.setSize(width, height); printf("BMPLoader - width: %d | height: %d\n", width, height); if (width > 128 || height > 128) @@ -55,27 +57,21 @@ void BmpLoader::load(MeshTexture &o_texture, char *t_subfolder, char *t_name, ch u64 rowPadded = (width * 3 + 3) & (~3); - unsigned char *data = new unsigned char[rowPadded]; - unsigned char tmp; + unsigned char row[rowPadded]; u32 x = 0; for (u32 i = 0; i < height; i++) { - fread(data, sizeof(unsigned char), rowPadded, file); + fread(&row, sizeof(unsigned char), rowPadded, file); for (u32 j = 0; j < width * 3; j += 3) { // Convert (B, G, R) to (R, G, B) - tmp = data[j]; - data[j] = data[j + 2]; - data[j + 2] = tmp; - - o_texture.setData(x, data[j]); - o_texture.setData(x + 1, data[j + 1]); - o_texture.setData(x + 2, data[j + 2]); + o_texture.setData(x, row[j + 2]); + o_texture.setData(x + 1, row[j + 1]); + o_texture.setData(x + 2, row[j]); x += 3; } } - delete[] t_path; - delete[] data; + delete[] path; fclose(file); } diff --git a/src/engine/loaders/dff_loader.cpp b/src/engine/loaders/dff_loader.cpp index d1bbcaa..abddbcd 100644 --- a/src/engine/loaders/dff_loader.cpp +++ b/src/engine/loaders/dff_loader.cpp @@ -37,7 +37,8 @@ DffLoader::~DffLoader() {} void DffLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_invertT) { PRINT_LOG("Loading dff file"); - FILE *file = fopen(t_filename, "rb"); + char *path = String::createConcatenated("host:", t_filename); + FILE *file = fopen(path, "rb"); if (file == NULL) PRINT_ERR("Failed to load .dff file!"); fseek(file, 0L, SEEK_END); @@ -48,9 +49,29 @@ void DffLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_ fclose(file); serialize(o_result, t_invertT, data, t_scale); o_result->calculateBoundingBoxes(); + delete[] path; PRINT_LOG("Dff file loaded!"); } +// void DffLoader::im_not_used_anywhere(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_invertT) +// { +// PRINT_LOG("Loading dff file"); +// char *path = String::createConcatenated("host:", t_filename); +// FILE *file = fopen(path, "rb"); +// if (file == NULL) +// PRINT_ERR("Failed to load .dff file!"); +// fseek(file, 0L, SEEK_END); +// long fileSize = ftell(file); +// u8 data[fileSize]; +// rewind(file); +// fread(&data, sizeof(u8), fileSize, file); +// fclose(file); +// serialize(o_result, t_invertT, data, t_scale); +// o_result->calculateBoundingBoxes(); +// delete[] path; +// PRINT_LOG("Dff file loaded!"); +// } + void DffLoader::serialize(MeshFrame *o_result, u8 t_invertT, u8 *t_data, float t_scale) { u32 ptrPos = 0; diff --git a/src/engine/loaders/md2_loader.cpp b/src/engine/loaders/md2_loader.cpp index 13e0ef9..d7a8924 100644 --- a/src/engine/loaders/md2_loader.cpp +++ b/src/engine/loaders/md2_loader.cpp @@ -46,8 +46,10 @@ MeshFrame *MD2Loader::load(u32 &o_framesCount, char *t_subpath, char *t_nameWith { PRINT_LOG("Loading new MD2 file"); char *part1 = String::createConcatenated(t_subpath, t_nameWithoutExtension); - char *finalPath = String::createConcatenated(part1, ".md2"); // "folder/object.md2" + char *part2 = String::createConcatenated("host:", part1); + char *finalPath = String::createConcatenated(part2, ".md2"); // "folder/object.md2" delete[] part1; + delete[] part2; md2_t header; FILE *file = fopen(finalPath, "rb"); diff --git a/src/engine/loaders/obj_loader.cpp b/src/engine/loaders/obj_loader.cpp index 20c8be0..8ad6ff9 100644 --- a/src/engine/loaders/obj_loader.cpp +++ b/src/engine/loaders/obj_loader.cpp @@ -28,7 +28,8 @@ ObjLoader::~ObjLoader() {} void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_invertT) { - FILE *file = fopen(t_filename, "rb"); + char *path = String::createConcatenated("host:", t_filename); + FILE *file = fopen(path, "rb"); if (file == NULL) PRINT_ERR("Failed to load .obj file!"); allocateObjMemory(file, o_result); @@ -98,6 +99,7 @@ void ObjLoader::load(MeshFrame *o_result, char *t_filename, float t_scale, u8 t_ } o_result->calculateBoundingBoxes(); fclose(file); + delete[] path; } /** Calculate how many vertices(v), coordinates(vt), normals(vn) and faces(f) have .obj file */ diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 74a1d5d..229c30d 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -13,6 +13,7 @@ #include "../include/utils/math.hpp" #include "../include/utils/debug.hpp" #include "../include/modules/light.hpp" +#include #include #include #include @@ -61,6 +62,7 @@ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) q++; q = draw_texture_wrapping(q, 0, texture.getWrapSettings()); q = draw_texture_flush(q); + FlushCache(0); dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); dma_wait_fast(); packet_free(packet); @@ -79,6 +81,7 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer) q = draw_enable_tests(q, 0, t_zBuffer); q = draw_finish(q); DMATAG_END(packet->data, q - packet->data - 1, 0, 0, 0); + FlushCache(0); dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); dma_wait_fast(); packet_free(packet); @@ -108,8 +111,9 @@ void GifSender::sendPacket() } q = draw_finish(q); DMATAG_END(dmatag, q - dmatag - 1, 0, 0, 0); - dma_wait_fast(); + FlushCache(0); dma_channel_send_chain(DMA_CHANNEL_GIF, currentPacket->data, q - currentPacket->data, 0, 0); + dma_wait_fast(); } /** Adds clear screen to current packet */ diff --git a/src/engine/modules/renderer.cpp b/src/engine/modules/renderer.cpp index 8cac591..31af989 100644 --- a/src/engine/modules/renderer.cpp +++ b/src/engine/modules/renderer.cpp @@ -222,15 +222,12 @@ void Renderer::draw(Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount) if (t_mesh.shouldBeFrustumCulled && !t_mesh.getMaterial(i).isInFrustum(renderData.frustumPlanes, t_mesh.position)) return; u32 vertCount = t_mesh.getMaterial(i).getFacesCount(); - VECTOR *vertices = new VECTOR[vertCount]; - VECTOR *normals = new VECTOR[vertCount]; - VECTOR *coordinates = new VECTOR[vertCount]; + VECTOR __attribute__((aligned(16))) vertices[vertCount]; + VECTOR __attribute__((aligned(16))) normals[vertCount]; + VECTOR __attribute__((aligned(16))) coordinates[vertCount]; changeTexture(t_mesh, t_mesh.getMaterial(i).getId()); vertCount = t_mesh.getDrawData(i, vertices, normals, coordinates, rotatedCamera); vifSender->drawMesh(&renderData, perspective, vertCount, vertices, normals, coordinates, t_mesh, t_bulbs, t_bulbsCount, &textureBuffer); - delete[] vertices; - delete[] normals; - delete[] coordinates; } } diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 504d0b1..2713d59 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -43,7 +43,7 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po vec3ToNative(rotation, t_rotation, 1.0F); create_local_world(localWorld, position, rotation); create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data); - vu1.sendSingleRefList(0, &localScreen, 4); + vu1.sendSingleRefList(0, &localScreen, 8); } void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, const Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index 59a49a7..18c3daa 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -127,7 +127,7 @@ void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) *((u64 *)currentBuffer)++ = DMA_REF_TAG((u32)t_data, t_size); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_STCYL, 0, 0x0101); *((u32 *)currentBuffer)++ = - AddUnpack(V4_32, t_useTops == 1 ? buildList.dmaSize / 16 : t_offset / 16, t_size, t_useTops); + AddUnpack(V4_32, t_useTops == 1 ? buildList.dmaSize >> 4 : t_offset >> 4, t_size, t_useTops); buildList.dmaSize += t_size * 8; buildList.dmaSizeAll += buildList.dmaSize; } @@ -135,7 +135,7 @@ void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) /** Start VU1 program */ void VU1::addStartProgram() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(8 >> 4); + *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_MSCAL, 0, 0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); ; @@ -144,7 +144,7 @@ void VU1::addStartProgram() /** Continue VU1 program from "--cont" line */ void VU1::addContinueProgram() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(8 >> 4); + *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_MSCAL, 0, 0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); ; @@ -156,8 +156,9 @@ void VU1::sendList() *((u64 *)currentBuffer)++ = DMA_END_TAG(0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); - dma_channel_wait(DMA_CHANNEL_VIF1, VU1_DMA_CHAN_TIMEOUT); + FlushCache(0); dma_channel_send_chain(DMA_CHANNEL_VIF1, buildList.kickBuffer, (u32 *)currentBuffer - (u32 *)buildList.kickBuffer, DMA_FLAG_TRANSFERTAG, 0); + dma_channel_wait(DMA_CHANNEL_VIF1, VU1_DMA_CHAN_TIMEOUT); } void VU1::addDoubleBufferSetting() diff --git a/src/samples/ari/Makefile b/src/samples/ari/Makefile index e2b12b3..a941dc2 100644 --- a/src/samples/ari/Makefile +++ b/src/samples/ari/Makefile @@ -52,5 +52,14 @@ all: $(EE_BIN) clean: rm -f $(EE_OBJS) +run: $(EE_BIN) + killall -v ps2client || true + ps2client reset + ps2client reset + $(EE_STRIP) --strip-all $(EE_BIN) + mv $(EE_BIN) bin/$(EE_BIN) + rm $(EE_OBJS) + cd bin/ && ps2client execee host:$(EE_BIN) + include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 83c3fc0..461e3fa 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -32,12 +32,10 @@ Ari::~Ari() {} void Ari::onInit() { - engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes); engine->audio.init(0); engine->audio.setVolume(40); engine->audio.loadSong("MOV-CIRC.WAV"); - engine->audio.play(); texRepo = engine->renderer->getTextureRepository(); @@ -52,31 +50,35 @@ void Ari::onInit() islandAddons.rotation.x = -1.6F; islandAddons.position.set(0.0F, 10.0F, 20.0F); - skybox.loadObj("skybox/", "skybox", 100.0F, false); - skybox.shouldBeFrustumCulled = false; + // 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); - texRepo->addByMesh("skybox/", skybox); - texRepo->addByMesh("ari/", player.mesh); + // texRepo->addByMesh("sunnyisl/", islandAddons); + + // texRepo->addByMesh("skybox/", skybox); + + // texRepo->addByMesh("ari/", player.mesh); + + // engine->audio.play(); } void Ari::initBulb() @@ -90,12 +92,12 @@ void Ari::onUpdate() if (engine->pad.isCrossClicked) printf("FPS:%f\n", engine->fps); camera.update(engine->pad, player.mesh); - engine->renderer->draw(skybox); + // engine->renderer->draw(skybox); 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]); + // engine->renderer->draw(islandAddons); + // engine->renderer->draw(player.mesh); + // for (u8 i = 0; i < WATER_TILES_COUNT; i++) + // engine->renderer->draw(waterFloors[i]); } void Ari::calcSpiral(int X, int Y) diff --git a/src/samples/ari/objects/player.cpp b/src/samples/ari/objects/player.cpp index 2f7da88..65d984e 100644 --- a/src/samples/ari/objects/player.cpp +++ b/src/samples/ari/objects/player.cpp @@ -22,16 +22,16 @@ Player::Player() { - PRINT_LOG("Creating player object"); - this->gravity = 0.1F; - this->lift = -1.0F; - this->mesh.loadMD2("ari/", "ari", 0.0001F, true); - this->mesh.position.set(0.0F, 10.0F, 0.0F); - this->mesh.shouldBeBackfaceCulled = true; - this->mesh.shouldBeFrustumCulled = false; - this->mesh.shouldBeLighted = true; - this->mesh.setAnimSpeed(0.05F); - this->mesh.playAnimation(0, 1); + // PRINT_LOG("Creating player object"); + // this->gravity = 0.1F; + // this->lift = -1.0F; + // this->mesh.loadMD2("ari/", "ari", 0.0001F, true); + // this->mesh.position.set(0.0F, 10.0F, 0.0F); + // this->mesh.shouldBeBackfaceCulled = true; + // this->mesh.shouldBeFrustumCulled = false; + // this->mesh.shouldBeLighted = true; + // this->mesh.setAnimSpeed(0.05F); + // this->mesh.playAnimation(0, 1); PRINT_LOG("Player object created!"); }