diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index cc1a5a4..c6628db 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -1,18 +1,7 @@ -add_custom_command( - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/asset_generator.py ${CMAKE_CURRENT_SOURCE_DIR}/game.js ${CMAKE_CURRENT_SOURCE_DIR}/game.c - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/game.c - DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/game.js ${CMAKE_CURRENT_SOURCE_DIR}/asset_generator.py - COMMENT "Creating game.c from game.js" -) +add_subdirectory(assets) +add_subdirectory(duktape) -add_custom_command( - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/data_asset_generator.py ${CMAKE_SOURCE_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/data_generated.c - OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/data_generated.c - DEPENDS ${CMAKE_SOURCE_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/data_asset_generator.py - COMMENT "Creating data_generated.c from the data directory" -) - -add_executable(WiiDuktape main.c grrlib_duk.c wii_duk.c rgba.c game.c data_generated.c) -target_link_libraries(WiiDuktape duktape) +add_executable(WiiDuktape main.c) target_link_libraries(WiiDuktape GRRLIB) +target_link_libraries(WiiDuktape duktape_engine) ogc_create_dol(WiiDuktape) diff --git a/source/assets/CMakeLists.txt b/source/assets/CMakeLists.txt new file mode 100644 index 0000000..631d9de --- /dev/null +++ b/source/assets/CMakeLists.txt @@ -0,0 +1,16 @@ +add_custom_command( + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/asset_generator.py ${CMAKE_CURRENT_SOURCE_DIR}/game.js ${CMAKE_CURRENT_SOURCE_DIR}/game.c + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/game.c + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/game.js ${CMAKE_CURRENT_SOURCE_DIR}/asset_generator.py + COMMENT "Creating game.c from game.js" +) + +add_custom_command( + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/data_asset_generator.py ${CMAKE_SOURCE_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/data_generated.c + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/data_generated.c + DEPENDS ${CMAKE_SOURCE_DIR}/data ${CMAKE_CURRENT_SOURCE_DIR}/data_asset_generator.py + COMMENT "Creating data_generated.c from the data directory" +) + +add_library(assets game.c data_generated.c) +target_include_directories(assets PUBLIC ./include) diff --git a/source/asset_generator.py b/source/assets/asset_generator.py similarity index 83% rename from source/asset_generator.py rename to source/assets/asset_generator.py index 5a616db..7e056bf 100755 --- a/source/asset_generator.py +++ b/source/assets/asset_generator.py @@ -12,8 +12,8 @@ args = parser.parse_args() script = Path(args.input).read_text().replace("\n", "\\n").replace('"', '\\"') -code = f""" -const char* program = "{script}"; +code = f"""#include +const char * program = "{script}"; """ with open(args.output, 'w') as f: diff --git a/source/data_asset_generator.py b/source/assets/data_asset_generator.py similarity index 100% rename from source/data_asset_generator.py rename to source/assets/data_asset_generator.py diff --git a/source/game.js b/source/assets/game.js similarity index 100% rename from source/game.js rename to source/assets/game.js diff --git a/source/data.h b/source/assets/include/data.h similarity index 100% rename from source/data.h rename to source/assets/include/data.h diff --git a/source/assets/include/game.h b/source/assets/include/game.h new file mode 100644 index 0000000..264b7ad --- /dev/null +++ b/source/assets/include/game.h @@ -0,0 +1,4 @@ +#ifndef GAME_H +#define GAME_H +extern const char * program; +#endif diff --git a/source/duktape/CMakeLists.txt b/source/duktape/CMakeLists.txt new file mode 100644 index 0000000..390a4f8 --- /dev/null +++ b/source/duktape/CMakeLists.txt @@ -0,0 +1,13 @@ +set(duktape_engine_sources + duktape_engine.c + grrlib_duk.c + rgba.c + wii_duk.c +) + +add_library(duktape_engine ${duktape_engine_sources}) +target_link_libraries(duktape_engine duktape) +target_link_libraries(duktape_engine GRRLIB) +target_link_libraries(duktape_engine assets) +target_include_directories(duktape_engine PUBLIC ./include) +target_include_directories(duktape_engine PRIVATE ./include_private) diff --git a/source/duktape/duktape_engine.c b/source/duktape/duktape_engine.c new file mode 100644 index 0000000..489672b --- /dev/null +++ b/source/duktape/duktape_engine.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +const float MICROSECOND = 0.000001f; + +static float deltatime = 1.0f/60; +static unsigned int green = RGBA(0, 255, 0, 255); +static GRRLIB_ttfFont * font; + +static void duk_fatal_error(void *udata, const char *msg) { + const char * err_message_format = "an error has occured: %s"; + size_t message_size = strlen(err_message_format) + strlen(msg) * sizeof(char *); + char * message = malloc(message_size); + snprintf(message, message_size, err_message_format, msg); + while (1) { + GRRLIB_PrintfTTF(0, 0, font, message, 12, green); + GRRLIB_Render(); + } +} + +void duktape(GRRLIB_ttfFont * global_font, bool * running) { + font = global_font; + duk_context * ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error); + + // create a wii object on the global object (globalThis) + define_wii_object(ctx, font, running, &deltatime); + duk_put_global_string(ctx, "wii"); + + // evaluate functions from game.js + duk_eval_string_noresult(ctx, program); + + // call start function + duk_get_global_string(ctx, "start"); + duk_call(ctx, 0); + duk_pop(ctx); + + while (*running) { + const unsigned int beginningOfFrame = ticks_to_microsecs(gettime()); + + PAD_ScanPads(); + + // call update function + duk_get_global_string(ctx, "update"); + duk_call(ctx, 0); + duk_pop(ctx); + + GRRLIB_Render(); + + const unsigned int endOfFrame = ticks_to_microsecs(gettime()); + deltatime = (endOfFrame - beginningOfFrame) * MICROSECOND; + } +} + diff --git a/source/grrlib_duk.c b/source/duktape/grrlib_duk.c similarity index 100% rename from source/grrlib_duk.c rename to source/duktape/grrlib_duk.c diff --git a/source/duktape/include/duktape_engine.h b/source/duktape/include/duktape_engine.h new file mode 100644 index 0000000..35d5a53 --- /dev/null +++ b/source/duktape/include/duktape_engine.h @@ -0,0 +1,5 @@ +#ifndef DUKTAPE_ENGINE_H +#define DUKTAPE_ENGINE_H +#include +void duktape(GRRLIB_ttfFont * global_font, bool * running); +#endif diff --git a/source/grrlib_duk.h b/source/duktape/include_private/grrlib_duk.h similarity index 100% rename from source/grrlib_duk.h rename to source/duktape/include_private/grrlib_duk.h diff --git a/source/rgba.h b/source/duktape/include_private/rgba.h similarity index 100% rename from source/rgba.h rename to source/duktape/include_private/rgba.h diff --git a/source/wii_duk.h b/source/duktape/include_private/wii_duk.h similarity index 100% rename from source/wii_duk.h rename to source/duktape/include_private/wii_duk.h diff --git a/source/rgba.c b/source/duktape/rgba.c similarity index 100% rename from source/rgba.c rename to source/duktape/rgba.c diff --git a/source/wii_duk.c b/source/duktape/wii_duk.c similarity index 100% rename from source/wii_duk.c rename to source/duktape/wii_duk.c diff --git a/source/main.c b/source/main.c index de09c28..ae0bf59 100644 --- a/source/main.c +++ b/source/main.c @@ -4,27 +4,11 @@ #include #include -#include "data.h" -#include "wii_duk.h" +#include +#include -const float MICROSECOND = 0.000001f; - -extern const char * program; static bool running = true; static GRRLIB_ttfFont * font; -static unsigned int green = RGBA(0, 255, 0, 255); -static float deltatime = 1.0f/60; - -static void duk_fatal_error(void *udata, const char *msg) { - const char * err_message_format = "an error has occured: %s"; - size_t message_size = strlen(err_message_format) + strlen(msg) * sizeof(char *); - char * message = malloc(message_size); - snprintf(message, message_size, err_message_format, msg); - while (1) { - GRRLIB_PrintfTTF(0, 0, font, message, 12, green); - GRRLIB_Render(); - } -} int main(int argc, char **argv) { GRRLIB_Init(); @@ -37,37 +21,8 @@ int main(int argc, char **argv) { font = GRRLIB_LoadTTF(pixel_operator_font, pixel_operator_font_size); - duk_context * ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error); - - // create a wii object on the global object (globalThis) - define_wii_object(ctx, font, &running, &deltatime); - duk_put_global_string(ctx, "wii"); - - // evaluate functions from game.js - duk_eval_string_noresult(ctx, program); - - // call start function - duk_get_global_string(ctx, "start"); - duk_call(ctx, 0); - duk_pop(ctx); - - while (running) { - const unsigned int beginningOfFrame = ticks_to_microsecs(gettime()); - - PAD_ScanPads(); - - // call update function - duk_get_global_string(ctx, "update"); - duk_call(ctx, 0); - duk_pop(ctx); - - GRRLIB_Render(); - - const unsigned int endOfFrame = ticks_to_microsecs(gettime()); - deltatime = (endOfFrame - beginningOfFrame) * MICROSECOND; - } - - duk_destroy_heap(ctx); + duktape(font, &running); + GRRLIB_Exit(); return 0;