diff --git a/CMakeLists.txt b/CMakeLists.txt index e7ace41..7577a71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules) if(NOT DEFINED DUSK_TARGET_SYSTEM) - set(DUSK_TARGET_SYSTEM "linux") - # set(DUSK_TARGET_SYSTEM "psp") + # set(DUSK_TARGET_SYSTEM "linux") + set(DUSK_TARGET_SYSTEM "psp") endif() # Prep cache @@ -69,8 +69,17 @@ if(DUSK_TARGET_SYSTEM STREQUAL "linux") elseif(DUSK_TARGET_SYSTEM STREQUAL "psp") find_package(SDL2 REQUIRED) - target_link_libraries(${DUSK_TARGET_NAME} PRIVATE + find_package(OpenGL REQUIRED) + target_link_libraries(${DUSK_TARGET_NAME} PUBLIC ${SDL2_LIBRARIES} + SDL2 + OpenGL::GL + zip + bz2 + z + mbedtls + mbedcrypto + lzma ) target_include_directories(${DUSK_TARGET_NAME} PRIVATE ${SDL2_INCLUDE_DIRS} diff --git a/cmake/modules/FindSDL2.cmake b/archive/FindSDL2.cmake similarity index 100% rename from cmake/modules/FindSDL2.cmake rename to archive/FindSDL2.cmake diff --git a/cmake/modules/Findlibzip.cmake b/archive/Findlibzip.cmake similarity index 100% rename from cmake/modules/Findlibzip.cmake rename to archive/Findlibzip.cmake diff --git a/cmake/modules/Findpspsdk.cmake b/cmake/modules/Findpspsdk.cmake index 9cecb4c..e98618d 100644 --- a/cmake/modules/Findpspsdk.cmake +++ b/cmake/modules/Findpspsdk.cmake @@ -33,7 +33,7 @@ if(NOT TARGET pspsdk) file(DOWNLOAD "https://github.com/pspdev/pspdev/releases/latest/download/pspdev-ubuntu-latest-x86_64.tar.gz" "${CMAKE_BINARY_DIR}/pspsdk.tar.gz" - EXPECTED_HASH SHA256=afe338e92f6eeec21c56a64eeb65201e6b95ecbae938ae38688bbf0f17b69ead + EXPECTED_HASH SHA256=2befe2ad83afd88934c106dbe98a72a7ad5ede8d272b7f1e79fda256a22f1062 SHOW_PROGRESS ) @@ -98,6 +98,9 @@ if(NOT TARGET pspsdk) pspaudio pspaudiolib psputility + pspvfpu + pspvram + psphprm ) endif() endif() \ No newline at end of file diff --git a/src/display/display.c b/src/display/display.c index a1a32d7..b229752 100644 --- a/src/display/display.c +++ b/src/display/display.c @@ -51,6 +51,7 @@ errorret_t displayInit(void) { glShadeModel(GL_SMOOTH); // Fixes color on PSP? glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glEnableClientState(GL_COLOR_ARRAY);// To confirm: every frame on PSP? @@ -82,7 +83,12 @@ errorret_t displayUpdate(void) { // TODO: move to framebuffer component int32_t windowWidth, windowHeight; - SDL_GetWindowSize(DISPLAY.window, &windowWidth, &windowHeight); + #if PSP + windowWidth = DISPLAY_WINDOW_WIDTH_DEFAULT; + windowHeight = DISPLAY_WINDOW_HEIGHT_DEFAULT; + #else + SDL_GetWindowSize(DISPLAY.window, &windowWidth, &windowHeight); + #endif glViewport(0, 0, windowWidth, windowHeight); #endif diff --git a/src/display/display.h b/src/display/display.h index 154f6e5..af22a76 100644 --- a/src/display/display.h +++ b/src/display/display.h @@ -10,6 +10,7 @@ #if DISPLAY_SDL2 #include + #define GL_GLEXT_PROTOTYPES #include #include diff --git a/src/display/framebuffer/framebuffer.c b/src/display/framebuffer/framebuffer.c index 120f497..2e7fa2d 100644 --- a/src/display/framebuffer/framebuffer.c +++ b/src/display/framebuffer/framebuffer.c @@ -122,7 +122,11 @@ void frameBufferDispose(framebuffer_t *framebuffer) { assertUnreachable("Cannot dispose of backbuffer"); } - glDeleteFramebuffersEXT(1, &framebuffer->id); + #if DISPLAY_SIZE_DYNAMIC == 0 + assertUnreachable("Dynamic size framebuffers not supported"); + #else + glDeleteFramebuffersEXT(1, &framebuffer->id); + #endif #endif } diff --git a/src/display/scene/overworld/sceneoverworld.c b/src/display/scene/overworld/sceneoverworld.c index 6b2de0b..b3f3a44 100644 --- a/src/display/scene/overworld/sceneoverworld.c +++ b/src/display/scene/overworld/sceneoverworld.c @@ -43,7 +43,7 @@ void sceneOverworldRender(void) { spriteBatchPush( &testAsset->paletteImage.texture, 0.0f, 0.0f, 12.0f, 12.0f, - 0xFF, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0.0f, 0.0f, 1.0f, 1.0f ); spriteBatchFlush(); diff --git a/src/display/texture/texture.c b/src/display/texture/texture.c index 5d50197..638aba2 100644 --- a/src/display/texture/texture.c +++ b/src/display/texture/texture.c @@ -66,6 +66,7 @@ void textureInit( "Palette index out of range" ); + // Get and validate the palette. const palette_t *pal = PALETTE_LIST[data.palette.palette]; assertNotNull(pal, "Palette cannot be NULL"); GLenum err = glGetError(); @@ -75,18 +76,23 @@ void textureInit( // Do we support paletted textures? bool_t havePalTex = false; - GLint mask = 0; - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &mask); - if(mask & GL_CONTEXT_CORE_PROFILE_BIT) { - GLint n=0; glGetIntegerv(GL_NUM_EXTENSIONS, &n); - for (GLint i=0; icolorCount, GL_RGBA, - GL_UNSIGNED_BYTE, (const void*)pal->colors - ); + #if PSP + // PSP requires the color table itself to be a power of two + assertTrue( + pal->colorCount == mathNextPowTwo(pal->colorCount), + "Palette color count must be a power of 2 for PSP" + ); + #endif + glTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, @@ -116,6 +126,11 @@ void textureInit( 0, GL_COLOR_INDEX8_EXT, GL_UNSIGNED_BYTE, (void*)data.palette.data ); + + glColorTableEXT( + GL_TEXTURE_2D, GL_RGBA, pal->colorCount, GL_RGBA, + GL_UNSIGNED_BYTE, (const void*)pal->colors + ); } break; @@ -129,8 +144,6 @@ void textureInit( glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); glBindTexture(GL_TEXTURE_2D, 0); #endif diff --git a/src/dusk.h b/src/dusk.h index 578ed6a..62a31d6 100644 --- a/src/dusk.h +++ b/src/dusk.h @@ -19,6 +19,14 @@ #include #include +#if PSP + #include + #include + #include + #include + #include +#endif + typedef bool bool_t; typedef int int_t; typedef float float_t; diff --git a/src/main.c b/src/main.c index eba3b57..ccbe4b6 100644 --- a/src/main.c +++ b/src/main.c @@ -8,8 +8,7 @@ #include "engine/engine.h" #include "console/console.h" -// PSP_MODULE_INFO("Dusk", 0, 1, 0); -// PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER | THREAD_ATTR_VFPU); + int main(int argc, char **argv) { errorret_t ret; diff --git a/src/time/CMakeLists.txt b/src/time/CMakeLists.txt index 80797bd..7b5cf65 100644 --- a/src/time/CMakeLists.txt +++ b/src/time/CMakeLists.txt @@ -19,5 +19,6 @@ elseif(DUSK_TARGET_SYSTEM STREQUAL "psp") target_compile_definitions(${DUSK_TARGET_NAME} PRIVATE TIME_FIXED=1 + TIME_PLATFORM_STEP=0.016 ) endif() \ No newline at end of file diff --git a/tools/assetstool/processpalette.py b/tools/assetstool/processpalette.py index 4d91b97..d45a457 100644 --- a/tools/assetstool/processpalette.py +++ b/tools/assetstool/processpalette.py @@ -30,15 +30,27 @@ def processPalette(asset): fileNameWithoutExt = os.path.splitext(os.path.basename(asset['path']))[0] fileNameWithoutPalette = os.path.splitext(fileNameWithoutExt)[0] + # PSP requires that the palette size be a power of two, so we will pad the + # palette with transparent colors if needed. + # if args.platform == "psp": + def mathNextPowTwo(x): + return 1 << (x - 1).bit_length() + + nextPowTwo = mathNextPowTwo(len(pixels)) + while len(pixels) < nextPowTwo: + pixels.append((0, 0, 0, 0)) + # Header now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") data = f"// Palette Generated for {asset['path']} at {now}\n" data += f"#include \"display/palette/palette.h\"\n\n" data += f"#define PALETTE_{paletteIndex}_COLOR_COUNT {len(pixels)}\n\n" + data += f"#pragma pack(push, 1)\n" data += f"static const color_t PALETTE_{paletteIndex}_COLORS[PALETTE_{paletteIndex}_COLOR_COUNT] = {{\n" for pixel in pixels: data += f" {{ 0x{pixel[0]:02X}, 0x{pixel[1]:02X}, 0x{pixel[2]:02X}, 0x{pixel[3]:02X} }},\n" data += f"}};\n\n" + data += f"#pragma pack(pop)\n\n" data += f"static const palette_t PALETTE_{paletteIndex} = {{\n" data += f" .colorCount = PALETTE_{paletteIndex}_COLOR_COUNT,\n" data += f" .colors = PALETTE_{paletteIndex}_COLORS,\n"