diff --git a/demo/mod/worldgen.fnl b/demo/mod/worldgen.fnl index 1884eef..d2ec8a3 100644 --- a/demo/mod/worldgen.fnl +++ b/demo/mod/worldgen.fnl @@ -87,29 +87,36 @@ move-delta (* move-speed dt)] (var moving false) - (var new-x cam-x) - (var new-z cam-z) + (var move-forward 0) + (var move-right 0) (when (pxl8.key_down "w") - (set new-x (+ new-x (* forward-x move-delta))) - (set new-z (+ new-z (* forward-z move-delta))) + (set move-forward (+ move-forward 1)) (set moving true)) (when (pxl8.key_down "s") - (set new-x (- new-x (* forward-x move-delta))) - (set new-z (- new-z (* forward-z move-delta))) + (set move-forward (- move-forward 1)) (set moving true)) (when (pxl8.key_down "q") - (set new-x (- new-x (* right-x move-delta))) - (set new-z (- new-z (* right-z move-delta))) + (set move-right (- move-right 1)) (set moving true)) (when (pxl8.key_down "e") - (set new-x (+ new-x (* right-x move-delta))) - (set new-z (+ new-z (* right-z move-delta))) + (set move-right (+ move-right 1)) (set moving true)) + (var new-x cam-x) + (var new-z cam-z) + + (when moving + (let [len (math.sqrt (+ (* move-forward move-forward) (* move-right move-right)))] + (when (> len 0) + (let [norm-forward (/ move-forward len) + norm-right (/ move-right len)] + (set new-x (+ new-x (* move-delta (+ (* forward-x norm-forward) (* right-x norm-right))))) + (set new-z (+ new-z (* move-delta (+ (* forward-z norm-forward) (* right-z norm-right))))))))) + (when (and (>= new-x 0) (<= new-x grid-max) (>= new-z 0) (<= new-z grid-max)) (set cam-x new-x) diff --git a/src/lua/pxl8.lua b/src/lua/pxl8.lua index 5c39078..a44d90c 100644 --- a/src/lua/pxl8.lua +++ b/src/lua/pxl8.lua @@ -505,7 +505,6 @@ end function pxl8.world_apply_textures(world, texture_defs) local count = #texture_defs local textures = ffi.new("pxl8_world_texture[?]", count) - local callbacks = {} for i, def in ipairs(texture_defs) do local idx = i - 1 @@ -513,12 +512,10 @@ function pxl8.world_apply_textures(world, texture_defs) textures[idx].texture_id = def.texture_id or 0 if def.rule then - local cb = ffi.cast("bool (*)(const pxl8_vec3*, const pxl8_bsp_face*, const pxl8_bsp*)", + textures[idx].rule = ffi.cast("bool (*)(const pxl8_vec3*, const pxl8_bsp_face*, const pxl8_bsp*)", function(normal, face, bsp) return def.rule(normal[0], face, bsp) end) - textures[idx].rule = cb - callbacks[idx + 1] = cb else textures[idx].rule = nil end diff --git a/src/pxl8_sdl3.c b/src/pxl8_sdl3.c index 264a5bc..a64c184 100644 --- a/src/pxl8_sdl3.c +++ b/src/pxl8_sdl3.c @@ -57,8 +57,7 @@ static void* sdl3_create(pxl8_color_mode mode, pxl8_resolution resolution, return NULL; } - // Disable vsync for benchmarking - if (!SDL_SetRenderVSync(ctx->renderer, 0)) { + if (!SDL_SetRenderVSync(ctx->renderer, 1)) { pxl8_error("Failed to set vsync: %s", SDL_GetError()); }