raze/source/duke3d/src/lunatic/test/tables.lua

116 lines
2.2 KiB
Lua
Raw Normal View History

#!/usr/bin/env luajit
local ffi = require "ffi"
local io = require "io"
local os = require "os"
local math = require "math"
local tablesfn = arg[1]
local taylor_n = tonumber(arg[2])
if (tablesfn==nil) then
-- taylor_n is a number: use that n for Taylor approximation of atan
-- taylor_n==nil: use math.atan
print("Usage: ./tables.lua ../path/to/TABLES.DAT [talyor_n]")
return 1
end
local fd, errmsg = io.open(tablesfn)
if (fd==nil) then
print("Failed opening "..tablesfn..": "..errmsg)
return 1 -- XXX: not working, neither os.exit(1) as of 20120901
end
local sintab = ffi.new("int16_t [?]", 2048)
local sinstr = fd:read(2048*2)
if (sinstr==nil or #sinstr<2048*2) then
print("Failed reading whole sine table")
fd:close()
return 1
end
ffi.copy(sintab, sinstr, 2048*2)
sinstr = nil
--== sintable
local oursin = ffi.new("int16_t [?]", 2048)
local BANG2RAD = math.pi/1024
for a=0,2047 do
local s = 16384*math.sin(a*BANG2RAD)
oursin[a] = s
-- if (a < 1024) then print(a..": "..s) end
end
--print("")
for a=0,2047 do
local dif = oursin[a]-sintab[a]
assert(dif == 0)
--[[
if (dif ~= 0) then
print(a..": "..dif)
end
--]]
if (a < 512) then
assert(sintab[a] == sintab[1024-a])
end
if (a >= 1024) then
assert(sintab[a] == -sintab[a-1024])
end
end
--== radarang
local ratab = ffi.new("int16_t [?]", 640)
local rastr = fd:read(640*2)
fd:close()
ffi.copy(ratab, rastr, 640*2)
rastr = nil
local function atan_taylor(x, n)
local absx = math.abs(x)
local at = 0
for i=0,n do
local twoip2 = 2*i+1
local xp = x^twoip2
local pmone = (-1)^i
if (absx < 1) then
at = at + (pmone * xp)/twoip2
else
at = at + pmone/(xp * twoip2)
end
end
if (absx > 1) then
at = math.pi/2 - at
end
return at
end
local atan
if (taylor_n==nil) then
atan = math.atan
else
atan = function (x) return atan_taylor(x, taylor_n) end
end
for i=0,639 do
local at = -64*atan((640-0.5-i)/160)/BANG2RAD
local ra = ratab[i]
at = math.ceil(at)
-- print(i ..": ".. ra .." ".. at .." ".. at/ra .." ".. at-ra)
end
--[[
local ourra = ffi.new("int16_t [?]", 640)
--]]