colla/docs/hot_reload.md
2024-11-29 16:10:48 +01:00

1.8 KiB

title = Hot Reload

title = Hot Reload

Hot Reload


This header provides cross-platform library hot-reloading. To use it you need to have to entry points, one for the host and one for the client.

In the client you can then implement these functions:

  • hr_init: called when the library is loaded (or reloaded)
  • hr_loop: called every "tick" (or whenever the host decides)
  • hr_close: called when the host finishes

In the client you need to call these functions:

  • hrOpen: load the library and call hr_init
  • hrStep: call hr_loop
  • hrReload: check if the library has changed, and if so reload it and call hr_init again
  • hrClose: call hr_close and cleanup

Example usage:

Client

int hr_init(hr_t *ctx) {
    uint8 tmpbuf[KB(5)];
    arena_t scratch = arenaMake(ARENA_STATIC, sizeof(tmpbuf), tmpbuf);

    state_t *state = ctx->userdata;
    uint64 timestamp = fileGetTime(scratch, strv("sprite.png"));
    if (timestamp > state->last_write) {
        state->last_write = timestamp;
        destroy_image(state->sprite);
        state->sprite = load_image(strv("sprite.png"));
    }
}

int hr_loop(hr_t *ctx) {
    state_t *state = ctx->userdata;
    draw_image(state->sprite, state->posx, state->posy);
}

int hr_close(hr_t *ctx) {
    state_t *state = ctx->userdata;
    destroy_image(state->sprite);
}

Host

typedef struct {
    hr_t hr;
    image_t sprite;
    int posx;
    int posy;
    uint64 last_write;
} state_t;

int main() {
    arena_t arena = arenaMake(ARENA_VIRTUAL, GB(1));

    state_t state = {0};
    state.hr.userdata = &state;

    if (!hrOpen(&state.hr, strv("bin/client.dll"))) {
        return 1;
    }

    while (game_poll()) {
        hrReload(&state.hr);
        hrStep(&state.hr);
    }

    hrClose(&state.hr, true);
}