Skip to content

Instantly share code, notes, and snippets.

@spotco
Last active March 23, 2019 22:22
Show Gist options
  • Select an option

  • Save spotco/f304abe9827a6d3ac2021123e0e164c7 to your computer and use it in GitHub Desktop.

Select an option

Save spotco/f304abe9827a6d3ac2021123e0e164c7 to your computer and use it in GitHub Desktop.
simplify_anim.lua
local KEYFRAME_EVERY = 0.25
local target_anim = game.Selection:Get()[1]
local selected_anim = target_anim:Clone()
selected_anim.Parent = target_anim.Parent
selected_anim.Name = selected_anim.Name .. "_Simplified(" .. tostring(KEYFRAME_EVERY) .. ")"
if selected_anim == nil then error("Must have KeyframeSequence selected") end
if selected_anim.ClassName ~= "KeyframeSequence" then error("Must have KeyframeSequence selected") end
local keyframes = {}
for _,child in pairs(selected_anim:GetChildren()) do
if child.ClassName == "Keyframe" then
keyframes[#keyframes+1] = child
end
end
table.sort(keyframes, function(a,b) --smallest first
return (a.Time - b.Time) < 0
end)
local itr_time = 0
while #keyframes > 0 do
local range_max = itr_time + KEYFRAME_EVERY
--find lowest in time range (itr_time, itr_time + KEYFRAME_EVERY)
local keyframes_in_time_range = {}
for i=1,#keyframes do
local itr_keyframe_time = keyframes[i].Time
if itr_keyframe_time > itr_time and itr_keyframe_time <= range_max then
keyframes_in_time_range[#keyframes_in_time_range+1] = i
end
end
table.sort(keyframes_in_time_range, function(a,b) --largest first
return (a - b) > 0
end)
if #keyframes_in_time_range > 0 then
print("kept keyframe at",keyframes[keyframes_in_time_range[1]].Time)
for i=2,#keyframes_in_time_range do
local i_keyframe = keyframes_in_time_range[i]
local itr_keyframe = keyframes[i_keyframe]
table.remove(keyframes, i_keyframe)
itr_keyframe.Parent = nil
print("removed keyframe at", itr_keyframe.Time)
end
itr_time = itr_time + KEYFRAME_EVERY
else
--find lowest in time range (itr_time + KEYFRAME_EVERY, ...)
local found = false
for i=1,#keyframes do
local itr_keyframe = keyframes[i]
if itr_keyframe.Time > itr_time then
itr_time = itr_keyframe.Time
found = true
end
end
if found then
print("none found, skipping to:", itr_time)
else
break
end
end
wait(0.1)
end
print("Anim created:" .. selected_anim.Name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment