Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local ret = {}
- ret.new = function (self, stackLength)
- local thing = {}
- thing.speed = 10
- thing.stack = {}
- for i=1,stackLength do
- thing.stack[i] = 0
- end
- thing.update = function(self, dt)
- --dt is in seconds passed
- --at 60 fps it would be 0.01667
- --equation for framerate independence is ((1/(framerate/-0.6))+1)
- --dt is 1/framerate, framerate is 1/dt
- --final equation: (1/((1/dt)/-0.6))+1 = 1-(0.6*dt)
- local t = 1-(self.speed*dt)
- if t < 0 then t = 0 end -- <--for SUPER low framerates
- for i=2,#(self.stack) do
- --self.stack[i] = (self.stack[i] + self.stack[i-1]) * 0.5
- self.stack[i] = ((1-t) * self.stack[i-1]) + (t * self.stack[i])
- end
- --[[
- for a 2 item stack
- 1: [1]
- 2: ([2] + [1]) / 2
- for a 3 item stack
- 1: [1]
- 2: ([2]+[1]) / 2
- 3: ([3]+[2]) / 2
- well now it's lerp instead of average
- if you wanted average at 60fps then change the 0.6 to 30
- the right value being 90% would be 6
- the right value being 10% would be 0.015
- 1% = 59.4, 0.1% = 59.94, 0% = 60
- so if a frame lasts 0 seconds exactly, the values don't change
- ]]
- end
- --set all values in the stack to a given value
- thing.init = function(self, value)
- for i=1,#(self.stack) do
- self.stack[i] = value
- end
- end
- --define metatable if it isn't defined already
- if not self.mathObjectMT then
- --make metatable for math interactions
- self.mathObjectMT = {} --is this something you can do? idk
- self.mathObjectMT.__utilGetNumber = function (value) --return number from value of unknown type
- if type(value) == "table" then
- if value.stack then --if it has a stack
- return value.stack[#(value.stack)]
- elseif value.currentValue then --if it has a currentValue
- return value.currentValue
- else --if there were to be another special number type to check for, that goes here
- return nil
- end
- elseif type(value) == number then
- return value
- else --some other random type like a string
- return nil
- end
- end
- --define math functions
- self.mathObjectMT.__add = function(a,b) -- a+b
- local getNum;
- if type(a) == "table" and a.stack then
- getNum = getmetatable(a).__utilGetNumber
- else
- getNum = getmetatable(b).__utilGetNumber
- end
- return getNum(a) + getNum(b)
- end
- self.mathObjectMT.__sub = function(a,b) -- a-b
- local getNum;
- if type(a) == "table" and a.stack then
- getNum = getmetatable(a).__utilGetNumber
- else
- getNum = getmetatable(b).__utilGetNumber
- end
- return getNum(a) - getNum(b)
- end
- self.mathObjectMT.__mul = function(a,b) -- a*b
- local getNum;
- if type(a) == "table" and a.stack then
- getNum = getmetatable(a).__utilGetNumber
- else
- getNum = getmetatable(b).__utilGetNumber
- end
- return getNum(a) * getNum(b)
- end
- self.mathObjectMT.__div = function(a,b) -- a/b
- local getNum;
- if type(a) == "table" and a.stack then
- getNum = getmetatable(a).__utilGetNumber
- else
- getNum = getmetatable(b).__utilGetNumber
- end
- return getNum(a) / getNum(b)
- end
- self.mathObjectMT.__pow = function(a,b) -- a^b
- local getNum;
- if type(a) == "table" and a.stack then
- getNum = getmetatable(a).__utilGetNumber
- else
- getNum = getmetatable(b).__utilGetNumber
- end
- return getNum(a) ^ getNum(b)
- end
- self.mathObjectMT.__unm = function(a) -- -a
- return -(getmetatable(a).__utilGetNumber(a))
- end
- end
- setmetatable(thing, self.mathObjectMT)
- return thing
- end
- return ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement