Last active
March 23, 2019 22:22
-
-
Save spotco/f304abe9827a6d3ac2021123e0e164c7 to your computer and use it in GitHub Desktop.
simplify_anim.lua
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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