diff --git a/src/runner.c b/src/runner.c index 6879a2ad..d3e34e32 100644 --- a/src/runner.c +++ b/src/runner.c @@ -775,6 +775,8 @@ static void rebuildDrawableCacheIfDirty(Runner* runner) { } void Runner_draw(Runner* runner) { + if (!runner->drawAutomatic) return; + Room* room = runner->currentRoom; rebuildDrawableCacheIfDirty(runner); @@ -1019,6 +1021,8 @@ static void endGuiPass(Runner* runner) { } void Runner_drawGUI(Runner* runner, int32_t windowW, int32_t windowH, int32_t targetW, int32_t targetH) { + if (!runner->drawAutomatic) return; + rebuildDrawableCacheIfDirty(runner); Drawable* drawables = runner->cachedDrawables; int32_t drawableCount = (int32_t) arrlen(drawables); @@ -1109,7 +1113,9 @@ static void applyFreeCamera(Runner* runner, int32_t* viewX, int32_t* viewY, int3 *viewY = (int32_t) (centerY - zoomedH * 0.5f); } + void Runner_drawViews(Runner* runner, int32_t gameW, int32_t gameH, bool debugShowCollisionMasks) { + if (!runner->drawAutomatic) return; Renderer* renderer = runner->renderer; renderer->vtable->clearScreen(renderer, runner->drawBackgroundColor ? runner->backgroundColor : 0, 1.0f); @@ -2119,6 +2125,7 @@ Runner* Runner_create(DataWin* dataWin, VMContext* vm, Renderer* renderer, FileS runner->windowTitle = dataWin->gen8.displayName ? strdup(dataWin->gen8.displayName) : nullptr; runner->appSurfaceAutoDraw = true; runner->usingAppSurface = true; + runner->drawAutomatic = true; runner->applicationWidth = (int32_t) dataWin->gen8.defaultWindowWidth; runner->applicationHeight = (int32_t) dataWin->gen8.defaultWindowHeight; runner->oldApplicationWidth = runner->applicationWidth; diff --git a/src/runner.h b/src/runner.h index c6c4796e..7487bcdb 100644 --- a/src/runner.h +++ b/src/runner.h @@ -619,6 +619,7 @@ struct Runner { // Just like the original runner, argv[0] is included in gameArgs char** gameArgs; + bool drawAutomatic; // Offset between game start time and nowNanos() uint64_t gameStartTime; }; diff --git a/src/vm_builtins.c b/src/vm_builtins.c index a04684e0..7105d086 100644 --- a/src/vm_builtins.c +++ b/src/vm_builtins.c @@ -9316,6 +9316,17 @@ static RValue builtin_psn_setup_trophies(MAYBE_UNUSED VMContext* ctx, RValue* ar } // Draw functions + +static RValue builtin_draw_enable_drawevent(VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { + if (1 > argCount) return RValue_makeUndefined(); + Runner* runner = ctx->runner; + if (runner != nullptr) { + runner->drawAutomatic = RValue_toBool(args[0]); + } + return RValue_makeUndefined(); +} + + static RValue builtin_draw_sprite(VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { Runner* runner = ctx->runner; if (runner->renderer == nullptr) return RValue_makeUndefined(); @@ -15967,6 +15978,7 @@ void VMBuiltins_registerAll(VMContext* ctx) { VM_registerBuiltin(ctx, "psn_setup_trophies", builtin_psn_setup_trophies); // Draw + VM_registerBuiltin(ctx, "draw_enable_drawevent", builtin_draw_enable_drawevent); VM_registerBuiltin(ctx, "draw_sprite", builtin_draw_sprite); VM_registerBuiltin(ctx, "draw_sprite_ext", builtin_draw_sprite_ext); VM_registerBuiltin(ctx, "draw_sprite_tiled", builtin_draw_sprite_tiled);