2015-02-14 18:03:50 +13:00

181 lines
4.7 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/>.
]]
-- Wrappers for graphical stuff. Also handles input.
do
local sb_list, sb_aux, sb_ctl = ...
sb_ctl.gfx_select = "root"
sb_ctl.gfx_map_stack = {idx = 0}
-- Select sandbox to use for graphics and input.
function sandbox.gfx_select(name)
if name == nil then
sb_ctl.gfx_select = nil
return
end
if not sb_list[name] then
error("invalid VM \""..tostring(name).."\" for gfx_select")
end
sb_ctl.gfx_select = name
client.mouse_lock_set(sb_aux[name].gfx_mouse_grab)
client.mouse_visible_set(sb_aux[name].gfx_mouse_vis)
local l = sb_aux[name].gfx_map_fog
client.map_fog_set(l[1], l[2], l[3], l[4])
end
-- INTERNAL API: Begin / end of hooks
function sb_ctl.gfx_api_push(name)
local map = nil
if sb_aux[name] then
map = sb_aux[name].gfx_map
end
sb_ctl.gfx_map_stack.idx = sb_ctl.gfx_map_stack.idx + 1
sb_ctl.gfx_map_stack[sb_ctl.gfx_map_stack.idx] = {name, common.map_get()}
common.map_set(map)
end
function sb_ctl.gfx_api_pop()
local name = sb_ctl.gfx_map_stack[sb_ctl.gfx_map_stack.idx][1]
if sb_aux[name] then
sb_aux[name].gfx_map = common.map_get()
end
common.map_set(sb_ctl.gfx_map_stack[sb_ctl.gfx_map_stack.idx][2])
sb_ctl.gfx_map_stack[sb_ctl.gfx_map_stack.idx] = nil
sb_ctl.gfx_map_stack.idx = sb_ctl.gfx_map_stack.idx - 1
end
function sb_ctl.gfx_api_prerender()
local map = nil
if sb_aux[sb_ctl.gfx_select] then
map = sb_aux[sb_ctl.gfx_select].gfx_map
end
common.map_set(map)
end
function sb_ctl.gfx_api_postrender(name)
local map = nil
if sb_aux[name] then
map = sb_aux[name].gfx_map
end
common.map_set(map)
end
function sb_ctl.gfx_kill(name)
if name == sb_ctl.gfx_select then
-- TODO: properly return to parent
if name ~= "root" then
sandbox.gfx_select("root")
end
end
end
return function(sb_list, sb_aux, sb_ctl, name)
local SG = sb_list[name]
sb_aux[name].gfx_mouse_vis = true
sb_aux[name].gfx_mouse_grab = false
sb_aux[name].gfx_map_fog = {208, 224, 255, 60.0}
sb_aux[name].gfx_map = map
if client then
local s_img_blit = SG.client.img_blit
function SG.client.img_blit(...)
if sb_ctl.gfx_select == name then
return s_img_blit(...)
end
end
local s_va_render_global = SG.client.va_render_global
function SG.client.va_render_global(...)
if sb_ctl.gfx_select == name then
return s_va_render_global(...)
end
end
local s_va_render_local = SG.client.va_render_local
function SG.client.va_render_local(...)
if sb_ctl.gfx_select == name then
return s_va_render_local(...)
end
end
local s_model_render_bone_global = SG.client.model_render_bone_global
function SG.client.model_render_bone_global(...)
if sb_ctl.gfx_select == name then
return s_model_render_bone_global(...)
end
end
local s_model_render_bone_local = SG.client.model_render_bone_local
function SG.client.model_render_bone_local(...)
if sb_ctl.gfx_select == name then
return s_model_render_bone_local(...)
end
end
local s_mouse_lock_set = SG.client.mouse_lock_set
function SG.client.mouse_lock_set(state)
sb_aux[name].gfx_mouse_grab = state
if sb_ctl.gfx_select == name then
return s_mouse_lock_set(state)
end
end
local s_mouse_visible_set = SG.client.mouse_visible_set
function SG.client.mouse_visible_set(state)
sb_aux[name].gfx_mouse_vis = state
if sb_ctl.gfx_select == name then
return s_mouse_visible_set(state)
end
end
local s_map_set = SG.common.map_set
function SG.common.map_set(map)
print("map", name, map)
sb_aux[name].gfx_map = map
return s_map_set(map)
end
SG.client.map_set = SG.common.map_set
local s_map_fog_set = SG.client.map_fog_set
function SG.client.map_fog_set(r, g, b, dist)
sb_aux[name].gfx_map_fog = {r, g, b, dist}
if sb_ctl.gfx_select == name then
return s_map_fog_set(r, g, b, dist)
end
end
local s_map_fog_get = SG.client.map_fog_get
function SG.client.map_fog_get()
if sb_ctl.gfx_select == name then
return s_map_fog_get()
else
local l = sb_aux[name].gfx_map_fog
return l[1], l[2], l[3], l[4]
end
end
end
end
end