diff --git a/res/modules/animation.lua b/res/modules/animation.lua index 1e19822a4..0c7bb7741 100644 --- a/res/modules/animation.lua +++ b/res/modules/animation.lua @@ -21,8 +21,10 @@ local function bezier_interpolation(k0, k1, t) local u = t for i=1,8 do - local x = bezier(k0.frame, k0.rx, k1.lx, k1.frame, u) - local dx = bezier_derivative(k0.frame, k0.rx, k1.lx, k1.frame, u) + local x = bezier( + k0.frame, k0.rx + k0.frame, k1.lx + k1.frame, k1.frame, u) + local dx = bezier_derivative( + k0.frame, k0.rx + k0.frame, k1.lx + k1.frame, k1.frame, u) if math.abs(dx) < 1e-8 then break @@ -34,7 +36,7 @@ local function bezier_interpolation(k0, k1, t) if u > 1 then u = 1 end end - return bezier(k0.value, k0.ry, k1.ly, k1.value, u) + return bezier(k0.value, k0.ry + k0.value, k1.ly + k1.value, k1.value, u) end local this = { @@ -133,6 +135,9 @@ function internals.on_animation_frame() if track_info.__timer > track.duration then table.remove(playing_tracks, i) else + if track_info.target.reset_pose then + track_info.target:reset_pose() + end track.func(track_info.target, track_info.__timer) end end diff --git a/res/modules/internal/animation_codegen.lua b/res/modules/internal/animation_codegen.lua index a8fabab8e..525240f66 100644 --- a/res/modules/internal/animation_codegen.lua +++ b/res/modules/internal/animation_codegen.lua @@ -15,16 +15,15 @@ local exclude_patters = { } -- TODO: replace with actual expression -> lua translator -local function process_expression(src, memoised, ismul) - if ismul then +local function process_expression(src, memoised, mode) + if mode == 'mul' then src = string.format("(%s) * intensity + (1.0 - intensity)", src) - else + elseif mode == "add" then src = string.format("(%s) * intensity", src) end for i, pattern in ipairs(exclude_patters) do if src:find(pattern) then - debug.print(exclude_patters) error("invalid syntax "..string.escape(src)) end end @@ -148,7 +147,8 @@ local function codegen_track(raw_track, lineset, memoised, keysets, use_tsf) for i, line in ipairs(lines) do if line.expression then code = code .. "\n local l" .. i .. " = (" .. - process_expression(line.expression, memoised, is_multiplier[line.channel]) .. ")" + process_expression(line.expression, memoised, + is_multiplier[line.channel] and "mul" or "add") .. ")" elseif line.keys then local target_keysets = keysets[lineset.target_name] if not target_keysets then @@ -247,7 +247,7 @@ end local function codegen_object_target(raw_track, context) local code = "\n if target.set_pos then\n" - code = code .. " local dst = DST\n" + code = code .. " local dst = mat4.idt()\n" local lineset = raw_track.linesets[""] if not lineset then return "" @@ -284,7 +284,7 @@ function internals.compile_animation_track(raw_track, track_name) for name, curve in pairs(raw_track.curves) do context.curves[name] = load(string.format( "return function(kl, kr, t) return %s end", - process_expression(curve.func, context.memoised) + process_expression(curve.func, context.memoised, "curve") ), "", "t", env)() end @@ -302,7 +302,7 @@ function internals.compile_animation_track(raw_track, track_name) code = memoised_code .. "\n" .. code end - local src = "return function(target, t, intensity, m)\n m = m or 1\n" + local src = "return function(target, t, intensity, m)\n m = m or 1\n intensity = intensity or 1.0\n" .. code .. "\nend" if animation.TRACE_CODEGEN then diff --git a/res/scripts/components/animator.lua b/res/scripts/components/animator.lua index 341f7cf11..e5f959df7 100644 --- a/res/scripts/components/animator.lua +++ b/res/scripts/components/animator.lua @@ -12,7 +12,7 @@ function create_state(name, track_id, max_intencity) fade_time = 0.0, fade_timer = 0.0, fade_in = false, - max_intencity = max_intencity, + max_intencity = max_intencity or 1.0, } end @@ -25,14 +25,14 @@ function set_state(name, fade_time) end if current_state then current_state.fade_in = false - current_state.fade_time = fade_time + current_state.fade_time = fade_time or 0.0 current_state.fade_timer = 0.0 end current_state = state if state then state.timer = 0.0 state.fade_in = true - state.fade_time = fade_time + state.fade_time = fade_time or 0.0 state.fade_timer = 0.0 end end