From dae4a42a70e4675f68f0c28d80d2deaf9c4baa8e Mon Sep 17 00:00:00 2001 From: "Ben Russell (300178622)" Date: Mon, 31 Dec 2012 11:53:03 +1300 Subject: [PATCH] added pkg/iceball/radtest/ for an EXPERIMENTAL and incomplete lighting fork thing --- pkg/iceball/radtest/client_start.lua | 202 +++++++++++++++++++++++++++ pkg/iceball/radtest/main_client.lua | 20 +++ pkg/iceball/radtest/main_server.lua | 21 +++ 3 files changed, 243 insertions(+) create mode 100644 pkg/iceball/radtest/client_start.lua create mode 100644 pkg/iceball/radtest/main_client.lua create mode 100644 pkg/iceball/radtest/main_server.lua diff --git a/pkg/iceball/radtest/client_start.lua b/pkg/iceball/radtest/client_start.lua new file mode 100644 index 0000000..f7d96b4 --- /dev/null +++ b/pkg/iceball/radtest/client_start.lua @@ -0,0 +1,202 @@ +--[[ + This file is part of Ice Lua Components. + + Ice Lua Components is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Ice Lua Components is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Ice Lua Components. If not, see . +]] + +-- Example mod. NOT RELIABLE. + +loadfile("pkg/base/client_start.lua")(...) + +do + local xlen,ylen,zlen + local x,y,z,i,j,ci + + xlen,ylen,zlen = common.map_get_dims() + + -- get top height map + print("Calculating top height map") + local hm = {} + for z=0,zlen-1 do + hm[z] = {} + for x=0,xlen-1 do + local l = common.map_pillar_get(x,z) + hm[z][x] = l[1+1] + end + end + + -- build pillar table + print("Building pillar run table") + local pm = {} + for z=0,zlen-1 do + pm[z] = {} + for x=0,xlen-1 do + local pma = {} + local l = common.map_pillar_get(x,z) + i = 1 + while true do + pma[#pma+1] = l[i+3] + pma[#pma+1] = l[i+1] + if l[i+0] == 0 then + break + end + i = i + 4*l[i+0] + end + pma[1] = 0 + pm[z][x] = pma + end + end + + -- some functions for density calculation + local function calcdens_pillar(x,z,y1,y2) + local pma = pm[z%zlen][x%xlen] + local y,i + local d = 0 + for i=1,#pma,2 do + local h1 = pma[i+0] + local h2 = pma[i+1] + if h1 > y2 then break end + if h2 > y1 then + for y=y1,y2 do + if y >= h1 and y <= h2 then + d = d + 1 + end + end + end + end + return d/(y2-y1+1) + end + + function calcdens(x1,y1,z1,x2,y2,z2) + local x,z + local d = 0.0 + + for z=z1,z2 do + for x=x1,x2 do + d = d + calcdens_pillar(x,z,y1,y2) + end + end + + return d/((x2-x1+1)*(z2-z1+1)) + end + + --print("TEST: Calculate air density") + --print(calcdens(0,0,0,xlen-1,ylen-1,zlen-1)) + + -- initialise light map + print("Initialising light map") + local lm = {} + for z=0,zlen-1 do + lm[z] = {} + for x=0,xlen-1 do + local l = common.map_pillar_get(x,z) + local lma = {} + i = 1 + local lti = 0 + local lt = 1.0 + local bn = nil + local le = 0 + while true do + local n = l[i+0] + local tn = (l[i+2]-l[i+1]+1) + local rn = (n ~= 0 and n-1) or tn + local nbn = rn-tn + + if bn then + local ca = l[i+3]-bn + for j=le+1,ca do + lt = lt * 0.8 + end + for j=1,bn do + lti = lti + 1 + lma[lti] = lt + lt = lt * 0.8 + end + end + le = l[i+2] + bn = nbn + + lti = lti + 1 + lma[lti] = nil + i = i + n*4 + + for j=1,tn do + lti = lti + 1 + lma[lti] = lt + lt = lt * 0.8 + end + + if n == 0 then break end + end + lma.len = lti + lm[z][x] = lma + end + end + + -- spread + -- TODO! + + -- apply lightmap + print("Applying lightmap") + for z=0,zlen-1 do + for x=0,xlen-1 do + local l = common.map_pillar_get(x,z) + local lma = lm[z][x] + for i=1,lma.len do + if lma[i] then + local lt = math.max(0.2,math.min(1.0,lma[i])) + for j=1,3 do + local ci = (i-1)*4+j + l[ci] = math.floor(lt*l[ci]+0.5) + end + end + end + common.map_pillar_set(x,z,l) + end + end + + -- clean up + lm = nil + + print("TODO: nicer stuff") + -- done! + print("Lighting done") +end + +do + local densbase = 0.01 + local h_tick_main_old = h_tick_main + h_tick_main = function (sec_current, sec_delta) + local ret = h_tick_main_old(sec_current, sec_delta) + local cx,cy,cz + cx,cy,cz = client.camera_get_pos() + local dens = calcdens( + math.floor(cx+0.5-5), + math.floor(cy+0.5-7), + math.floor(cz+0.5-5), + math.floor(cx+0.5+5), + math.floor(cy+0.5+3), + math.floor(cz+0.5+5)) + + densbase = densbase + (dens - densbase) * (1.0-math.exp(-3.0*sec_delta)) + + client.map_fog_set( + math.floor(0.5+192*densbase), + math.floor(0.5+238*densbase), + math.floor(0.5+255*densbase), + math.floor(0.5+60*densbase)) + + return ret + end +end diff --git a/pkg/iceball/radtest/main_client.lua b/pkg/iceball/radtest/main_client.lua new file mode 100644 index 0000000..0d35a9a --- /dev/null +++ b/pkg/iceball/radtest/main_client.lua @@ -0,0 +1,20 @@ +--[[ + This file is part of Ice Lua Components. + + Ice Lua Components is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Ice Lua Components is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Ice Lua Components. If not, see . +]] + +-- Example mod. NOT RELIABLE. + +loadfile("pkg/base/main_client.lua")(...) diff --git a/pkg/iceball/radtest/main_server.lua b/pkg/iceball/radtest/main_server.lua new file mode 100644 index 0000000..37e481d --- /dev/null +++ b/pkg/iceball/radtest/main_server.lua @@ -0,0 +1,21 @@ +--[[ + This file is part of Ice Lua Components. + + Ice Lua Components is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Ice Lua Components is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with Ice Lua Components. If not, see . +]] + +-- Example mod. NOT RELIABLE. + +loadfile("pkg/base/main_server.lua")(...) +