123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- -------------------------------------------------------------------------------
- -- Spine Runtimes License Agreement
- -- Last updated May 1, 2019. Replaces all prior versions.
- --
- -- Copyright (c) 2013-2019, Esoteric Software LLC
- --
- -- Integration of the Spine Runtimes into software or otherwise creating
- -- derivative works of the Spine Runtimes is permitted under the terms and
- -- conditions of Section 2 of the Spine Editor License Agreement:
- -- http://esotericsoftware.com/spine-editor-license
- --
- -- Otherwise, it is permitted to integrate the Spine Runtimes into software
- -- or otherwise create derivative works of the Spine Runtimes (collectively,
- -- "Products"), provided that each user of the Products must obtain their own
- -- Spine Editor license and redistribution of the Products in any form must
- -- include this license and copyright notice.
- --
- -- THIS SOFTWARE IS PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY EXPRESS
- -- OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- -- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- -- NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY DIRECT, INDIRECT,
- -- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- -- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, BUSINESS
- -- INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND ON ANY
- -- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- -- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- -- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- -------------------------------------------------------------------------------
- local utils = {}
- local math_sqrt = math.sqrt
- local math_random = math.random
- utils.degRad = math.pi / 180
- function tablePrint (tt, indent, done)
- done = done or {}
- for key, value in pairs(tt) do
- local spaces = string.rep (" ", indent)
- if type(value) == "table" and not done [value] then
- done [value] = true
- print(spaces .. "{")
- utils.print(value, indent + 2, done)
- print(spaces .. "}")
- else
- io.write(spaces .. tostring(key) .. " = ")
- utils.print(value, indent + 2, done)
- end
- end
- end
- function utils.print (value, indent, done)
- indent = indent or 0
- if "nil" == type(value) then
- print(tostring(nil))
- elseif "table" == type(value) then
- local spaces = string.rep (" ", indent)
- print(spaces .. "{")
- tablePrint(value, indent + 2)
- print(spaces .. "}")
- elseif "string" == type(value) then
- print("\"" .. value .. "\"")
- else
- print(tostring(value))
- end
- end
- function utils.indexOf (haystack, needle)
- for i,value in ipairs(haystack) do
- if value == needle then return i end
- end
- return nil
- end
- function utils.copy (from, to)
- if not to then to = {} end
- for k,v in pairs(from) do
- to[k] = v
- end
- return to
- end
- function utils.newNumberArray (size)
- local a = {}
- local i = 1
- while i <= size do
- a[i] = 0
- i = i + 1
- end
- return a
- end
- function utils.newNumberArrayZero (size)
- local a = {}
- local i = 0
- while i < size do
- a[i] = 0
- i = i + 1
- end
- return a
- end
- function utils.setArraySize (array, size)
- if #array == size then return array end
- if #array < size then
- local i = #array + 1
- while i <= size do
- array[i] = 0
- i = i + 1
- end
- else
- local originalSize = #array
- local i = originalSize
- while i > size do
- array[i] = nil -- dirty trick to appease # without realloc
- i = i - 1
- end
- end
- return array
- end
- function utils.arrayCopy (src, srcOffset, dst, dstOffset, size)
- local n = srcOffset + size
- while srcOffset < n do
- dst[dstOffset] = src[srcOffset]
- dstOffset = dstOffset + 1
- srcOffset = srcOffset + 1
- end
- end
- function utils.clamp (value, min, max)
- if value < min then return min end
- if value > max then return max end
- return value
- end
- function utils.signum (value)
- if value < 0 then
- return -1
- elseif value > 0 then
- return 1
- else
- return 0
- end
- end
- -- Implements Java float modulo
- function utils.mod(a, b)
- if b < 0 then b = -b end
- if a < 0 then
- return -(-a % b)
- else
- return a % b
- end
- end
- function utils.randomTriangular(min, max)
- return utils.randomTriangularWith(min, max, (min + max) * 0.5)
- end
- function utils.randomTriangularWith(min, max, mode)
- local u = math.random()
- local d = max - min
- if (u <= (mode - min) / d) then return min + math_sqrt(u * d * (mode - min)) end
- return max - math_sqrt((1 - u) * d * (max - mode))
- end
- return utils
|