buldthensnip/pkg/iceball/pmfedit/main_client.lua

280 lines
7.8 KiB
Lua

--[[
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 <http://www.gnu.org/licenses/>.
]]
dofile("pkg/base/preconf.lua")
dofile("pkg/base/lib_gui.lua")
dofile("pkg/base/lib_pmf.lua")
dofile("pkg/base/lib_sdlkey.lua")
preload = ...
PMFEDIT_FNAME = "clsave/vol/editor.pmf"
BTSK_PMF_MOVEXN = SDLK_l
BTSK_PMF_MOVEXP = SDLK_j
BTSK_PMF_MOVEYN = SDLK_i
BTSK_PMF_MOVEYP = SDLK_k
BTSK_PMF_MOVEZN = SDLK_u
BTSK_PMF_MOVEZP = SDLK_o
BTSK_PMF_SIZEP = SDLK_EQUALS
BTSK_PMF_SIZEN = SDLK_MINUS
BTSK_PMF_ROTYN = SDLK_a
BTSK_PMF_ROTYP = SDLK_d
BTSK_PMF_ROTXN = SDLK_w
BTSK_PMF_ROTXP = SDLK_s
BTSK_PMF_ROTY2N = SDLK_q
BTSK_PMF_ROTY2P = SDLK_e
BTSK_QUIT = SDLK_ESCAPE
BTSK_COLORLEFT = SDLK_LEFT
BTSK_COLORRIGHT = SDLK_RIGHT
BTSK_COLORUP = SDLK_UP
BTSK_COLORDOWN = SDLK_DOWN
BTSK_PMF_BLKSET = SDLK_g
BTSK_PMF_BLKCLEAR = SDLK_b
BTSK_PMF_QUICKLOAD = SDLK_F3
BTSK_PMF_QUICKSAVE = SDLK_F10
pmfedit_x = 0
pmfedit_y = 0
pmfedit_z = 0
pmfedit_size = 16
pmfedit_data = {}
pmfedit_model = common.model_new(1)
pmfedit_idx = 1
pmfedit_model_bone = {}
pmfedit_model, pmfedit_model_bone[pmfedit_idx] = common.model_bone_new(pmfedit_model)
pmfedit_data[#pmfedit_data+1] = {x=0,y=0,z=0,r=0,g=0,b=0,radius=1}
pmfedit_ry = 0
pmfedit_rx = 0
pmfedit_ry2 = 0
blk_color = {128,128,128}
blk_color_x = 3
blk_color_y = 0
cpalette_base = {
0x7F,0x7F,0x7F,
0xFF,0x00,0x00,
0xFF,0x7F,0x00,
0xFF,0xFF,0x00,
0x00,0xFF,0x00,
0x00,0xFF,0xFF,
0x00,0x00,0xFF,
0xFF,0x00,0xFF,
}
cpalette = {}
do
local i,j
for i=0,7 do
local r,g,b
r = cpalette_base[i*3+1]
g = cpalette_base[i*3+2]
b = cpalette_base[i*3+3]
for j=0,3 do
local cr = math.floor((r*j)/3)
local cg = math.floor((g*j)/3)
local cb = math.floor((b*j)/3)
cpalette[#cpalette+1] = {cr,cg,cb}
end
for j=1,4 do
local cr = r + math.floor(((255-r)*j)/4)
local cg = g + math.floor(((255-g)*j)/4)
local cb = b + math.floor(((255-b)*j)/4)
cpalette[#cpalette+1] = {cr,cg,cb}
end
end
end
function client.hook_tick(sec_current, sec_delta)
blk_color = cpalette[(blk_color_y*8)+blk_color_x+1]
pmfedit_data[#pmfedit_data] = {
x=pmfedit_x,y=pmfedit_y,z=pmfedit_z-0.01,
r=math.sin(sec_current-2*math.pi/3)*127+128,
g=math.sin(sec_current)*127+128,
b=math.sin(sec_current+2*math.pi/3)*127+128,
radius=pmfedit_size}
common.model_bone_set(pmfedit_model, pmfedit_model_bone[pmfedit_idx], "edit", pmfedit_data)
return 0.005
end
function client.hook_key(key, state)
if state then
if key == BTSK_PMF_MOVEXN then
pmfedit_x = pmfedit_x - pmfedit_size
elseif key == BTSK_PMF_MOVEXP then
pmfedit_x = pmfedit_x + pmfedit_size
elseif key == BTSK_PMF_MOVEYN then
pmfedit_y = pmfedit_y - pmfedit_size
elseif key == BTSK_PMF_MOVEYP then
pmfedit_y = pmfedit_y + pmfedit_size
elseif key == BTSK_PMF_MOVEZN then
pmfedit_z = pmfedit_z - pmfedit_size
elseif key == BTSK_PMF_MOVEZP then
pmfedit_z = pmfedit_z + pmfedit_size
elseif key == BTSK_PMF_SIZEN and pmfedit_size > 1 then
pmfedit_size = pmfedit_size - 1
elseif key == BTSK_PMF_SIZEP and pmfedit_size < 65535 then
pmfedit_size = pmfedit_size + 1
elseif key == BTSK_COLORLEFT then
blk_color_x = blk_color_x - 1
if blk_color_x < 0 then
blk_color_x = 7
end
blk_color = cpalette[blk_color_x+blk_color_y*8+1]
elseif key == BTSK_COLORRIGHT then
blk_color_x = blk_color_x + 1
if blk_color_x > 7 then
blk_color_x = 0
end
blk_color = cpalette[blk_color_x+blk_color_y*8+1]
elseif key == BTSK_COLORUP then
blk_color_y = blk_color_y - 1
if blk_color_y < 0 then
blk_color_y = 7
end
blk_color = cpalette[blk_color_x+blk_color_y*8+1]
elseif key == BTSK_COLORDOWN then
blk_color_y = blk_color_y + 1
if blk_color_y > 7 then
blk_color_y = 0
end
blk_color = cpalette[blk_color_x+blk_color_y*8+1]
elseif key == BTSK_PMF_ROTYN then
pmfedit_ry = pmfedit_ry + math.pi/16
elseif key == BTSK_PMF_ROTYP then
pmfedit_ry = pmfedit_ry - math.pi/16
elseif key == BTSK_PMF_ROTXN then
pmfedit_rx = pmfedit_rx + math.pi/16
elseif key == BTSK_PMF_ROTXP then
pmfedit_rx = pmfedit_rx - math.pi/16
elseif key == BTSK_PMF_ROTY2N then
pmfedit_ry2 = pmfedit_ry2 + math.pi/16
elseif key == BTSK_PMF_ROTY2P then
pmfedit_ry2 = pmfedit_ry2 - math.pi/16
elseif key == BTSK_QUIT then
client.hook_tick = nil
elseif key == BTSK_PMF_BLKSET and #pmfedit_data < 4095 then
pmfedit_data[#pmfedit_data].r = blk_color[1]
pmfedit_data[#pmfedit_data].g = blk_color[2]
pmfedit_data[#pmfedit_data].b = blk_color[3]
pmfedit_data[#pmfedit_data+1] = pmfedit_data[#pmfedit_data]
elseif key == BTSK_PMF_BLKCLEAR then
if #pmfedit_data > 1 then
local i
local dx,dy,dz
local d
local mi,md
mi = 1
md = nil
-- find nearest piece
for i=1,#pmfedit_data-1 do
dx = pmfedit_data[i].x - pmfedit_x
dy = pmfedit_data[i].y - pmfedit_y
dz = pmfedit_data[i].z - pmfedit_z
d = dx*dx+dy*dy+dz*dz
if md == nil or d < md then
md = d
mi = i
end
end
-- delete it and move to it
pmfedit_x = pmfedit_data[mi].x
pmfedit_y = pmfedit_data[mi].y
pmfedit_z = pmfedit_data[mi].z
pmfedit_size = pmfedit_data[mi].radius
for i=mi,#pmfedit_data-1 do
pmfedit_data[i] = pmfedit_data[i+1]
end
pmfedit_data[#pmfedit_data] = nil
end
elseif key == BTSK_PMF_QUICKLOAD then
local xpmf = common.model_load_pmf(PMFEDIT_FNAME)
if xpmf then
common.model_free(pmfedit_model) -- YECCH! Forgot this line!
pmfedit_model = xpmf
pmfedit_model_bone[pmfedit_idx] = 0
local bname
bname, pmfedit_data = common.model_bone_get(pmfedit_model, pmfedit_model_bone[pmfedit_idx])
pmfedit_data[#pmfedit_data+1] = {}
print("loaded!")
else
print("error during loading - NOT LOADED")
end
elseif key == BTSK_PMF_QUICKSAVE then
local xpt = pmfedit_data[#pmfedit_data]
pmfedit_data[#pmfedit_data] = nil
local bname, blah
bname, blah = common.model_bone_get(pmfedit_model, pmfedit_model_bone[pmfedit_idx])
common.model_bone_set(pmfedit_model, pmfedit_model_bone[pmfedit_idx], bname, pmfedit_data)
if common.model_save_pmf(pmfedit_model, PMFEDIT_FNAME) then
print("saved!")
else
print("error during saving - NOT SAVED")
end
pmfedit_data[#pmfedit_data+1] = xpt
end
end
end
function client.hook_render()
local c = 0xFF000000+256*(256*blk_color[1]+blk_color[2])+blk_color[3]
font_mini.print(4,40,c,string.format(
"PMF - size: %-6i x: %-6i y: %6i z: %-6i - COUNT: %6i / rot: %3f, %3f, %3f"
,pmfedit_size
,pmfedit_x
,pmfedit_y
,pmfedit_z
,#pmfedit_data-1
,pmfedit_ry
,pmfedit_rx
,pmfedit_ry2))
client.model_render_bone_local(pmfedit_model, pmfedit_model_bone[pmfedit_idx],
0,0,1,
pmfedit_ry,pmfedit_rx,pmfedit_ry2,
0.7)
end
if preload then
local xpmf = common.model_load_pmf(preload)
if xpmf then
common.model_free(pmfedit_model) -- YECCH! Forgot this line!
pmfedit_model = xpmf
pmfedit_model_bone[pmfedit_idx] = 0
local bname
bname, pmfedit_data = common.model_bone_get(pmfedit_model, pmfedit_model_bone[pmfedit_idx])
pmfedit_data[#pmfedit_data+1] = {}
print("loaded!")
else
print("error during loading - NOT LOADED")
end
end
client.map_fog_set(32, 32, 32, 60)
print("pmfedit successfully loaded!")