diff --git a/src/runner.c b/src/runner.c index a17f0d514..85c1db360 100644 --- a/src/runner.c +++ b/src/runner.c @@ -886,6 +886,8 @@ static void rebuildDrawableCacheIfDirty(Runner* runner) { } void Runner_draw(Runner* runner) { + if (!runner->drawAutomatic) return; + Room* room = runner->currentRoom; rebuildDrawableCacheIfDirty(runner); @@ -1169,6 +1171,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); @@ -1277,7 +1281,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); @@ -2403,6 +2409,7 @@ Runner* Runner_create(DataWin* dataWin, VMContext* vm, Renderer* renderer, FileS runner->windowTitle = dataWin->gen8.displayName ? safeStrdup(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 56729affe..e2c1dd528 100644 --- a/src/runner.h +++ b/src/runner.h @@ -882,6 +882,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 672a8e758..cf4aebef0 100644 --- a/src/vm_builtins.c +++ b/src/vm_builtins.c @@ -10226,6 +10226,16 @@ 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_primitive_begin(MAYBE_UNUSED VMContext* ctx, RValue* args, MAYBE_UNUSED int32_t argCount) { if (1 > argCount) { logWarn("[draw_primitive_begin]: Expected 1 argument, got %d\n", argCount); @@ -21723,6 +21733,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_primitive_begin", builtin_draw_primitive_begin); VM_registerBuiltin(ctx, "draw_primitive_begin_texture", builtin_draw_primitive_begin_texture); VM_registerBuiltin(ctx, "draw_primitive_end", builtin_draw_primitive_end);