157 lines
5.1 KiB
Lua
157 lines
5.1 KiB
Lua
|
-- ui for customisation of selection bbox
|
||
|
|
||
|
r2.CustomBBox =
|
||
|
{
|
||
|
UIPath = "ui:interface:r2ed_bbox_edit",
|
||
|
FirstDisplay = true,
|
||
|
-- tmp, hardcoded stuff here
|
||
|
SavePath = "data_common\\r2\\r2_ui_custom_boxes_data.lua",
|
||
|
Boxes = {}, -- boxes, sorted by sheet ids
|
||
|
SliderMaxRange = 7;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
-- convert coordinate to slider unit
|
||
|
function r2.CustomBBox:coordToSliderValue(coord)
|
||
|
return (coord / self.SliderMaxRange) * 5000 + 5000
|
||
|
end
|
||
|
|
||
|
-- convert slider value to coordinates
|
||
|
function r2.CustomBBox:sliderValueToCoord(sliderValue)
|
||
|
return self.SliderMaxRange * ((sliderValue - 5000) / 5000)
|
||
|
end
|
||
|
|
||
|
|
||
|
function r2.CustomBBox:getWindow()
|
||
|
return getUI(self.UIPath)
|
||
|
end
|
||
|
|
||
|
-- update custom bbox dialog from the current selection
|
||
|
function r2.CustomBBox:updateUI()
|
||
|
local ui = self:getWindow()
|
||
|
if ui.active == false then return end
|
||
|
local selectedInstance = r2:getSelectedInstance()
|
||
|
-- show one of the 3 states of the window (no selection, no custom bbox for the selection, or the bbox itself)
|
||
|
local function setActive(noSelection, noBBox, bbox)
|
||
|
ui:find("no_selected_bbox").active = noSelection
|
||
|
ui:find("no_custom_bbox").active = noBBox
|
||
|
ui:find("custom_bbox").active = bbox
|
||
|
end
|
||
|
--
|
||
|
if selectedInstance == nil then
|
||
|
setActive(true, false, false)
|
||
|
return
|
||
|
end
|
||
|
local sheet = selectedInstance.SheetClient
|
||
|
debugInfo("sheet = " .. tostring(sheet))
|
||
|
if sheet == nil then
|
||
|
setActive(false, true, false)
|
||
|
return
|
||
|
end
|
||
|
setActive(false, false, true)
|
||
|
--
|
||
|
local function setCustomBBoxEnabledInUI(active)
|
||
|
debugInfo("setCustomBBoxEnabledInUI : " .. tostring(active))
|
||
|
ui:find("x_min").slider.active = active
|
||
|
ui:find("x_max").slider.active = active
|
||
|
ui:find("y_min").slider.active = active
|
||
|
ui:find("y_max").slider.active = active
|
||
|
ui:find("z_min").slider.active = active
|
||
|
ui:find("z_max").slider.active = active
|
||
|
ui:find("custom_bbox_enabled").pushed = active
|
||
|
local textColor = select(active, CRGBA(255, 255, 255), CRGBA(127, 127, 127, 127))
|
||
|
ui:find("x_min_text").color_rgba = textColor
|
||
|
ui:find("x_max_text").color_rgba = textColor
|
||
|
ui:find("y_min_text").color_rgba = textColor
|
||
|
ui:find("y_max_text").color_rgba = textColor
|
||
|
ui:find("z_min_text").color_rgba = textColor
|
||
|
ui:find("z_max_text").color_rgba = textColor
|
||
|
end
|
||
|
--
|
||
|
local currBBox = self.Boxes[sheet]
|
||
|
if currBBox == nil then
|
||
|
-- no custom bbox defined
|
||
|
setCustomBBoxEnabledInUI(false)
|
||
|
return
|
||
|
end
|
||
|
if not currBBox.Enabled then
|
||
|
setCustomBBoxEnabledInUI(false)
|
||
|
return
|
||
|
end
|
||
|
setCustomBBoxEnabledInUI(true)
|
||
|
debugInfo('*' .. tostring(sheet))
|
||
|
ui:find("x_min").slider.value = self:coordToSliderValue(currBBox.XMin)
|
||
|
ui:find("x_max").slider.value = self:coordToSliderValue(currBBox.XMax)
|
||
|
ui:find("y_min").slider.value = self:coordToSliderValue(currBBox.YMin)
|
||
|
ui:find("y_max").slider.value = self:coordToSliderValue(currBBox.YMax)
|
||
|
ui:find("z_min").slider.value = self:coordToSliderValue(currBBox.ZMin)
|
||
|
ui:find("z_max").slider.value = self:coordToSliderValue(currBBox.ZMax)
|
||
|
end
|
||
|
|
||
|
-- update current bbox parameters for the selection from the ui
|
||
|
function r2.CustomBBox:updateFromUI()
|
||
|
local selectedInstance = r2:getSelectedInstance()
|
||
|
if selectedInstance == nil then
|
||
|
return
|
||
|
end
|
||
|
local sheet = selectedInstance.SheetClient
|
||
|
if sheet == nil then
|
||
|
return
|
||
|
end
|
||
|
local ui = self:getWindow()
|
||
|
local box = {}
|
||
|
box.XMin = self:sliderValueToCoord(ui:find("x_min").slider.value)
|
||
|
box.XMax = self:sliderValueToCoord(ui:find("x_max").slider.value)
|
||
|
box.XMin = math.min(box.XMin, box.XMax)
|
||
|
box.YMin = self:sliderValueToCoord(ui:find("y_min").slider.value)
|
||
|
box.YMax = self:sliderValueToCoord(ui:find("y_max").slider.value)
|
||
|
box.YMin = math.min(box.YMin, box.YMax)
|
||
|
box.ZMin = self:sliderValueToCoord(ui:find("z_min").slider.value)
|
||
|
box.ZMax = self:sliderValueToCoord(ui:find("z_max").slider.value)
|
||
|
box.ZMin = math.min(box.ZMin, box.ZMax)
|
||
|
box.Enabled = ui:find("custom_bbox_enabled").pushed
|
||
|
if not box.Enabled and self.Boxes[sheet] == nil then
|
||
|
return -- no custom bbox set yet
|
||
|
end
|
||
|
if box.Enabled then
|
||
|
if self.Boxes[sheet] == nil then
|
||
|
debugInfo('assigning new custom bbox')
|
||
|
box.XMin = -0.5
|
||
|
box.XMax = 0.5
|
||
|
box.YMin = -0.5
|
||
|
box.YMax = 0.5
|
||
|
box.ZMin = 0
|
||
|
box.ZMax = 2
|
||
|
end
|
||
|
end
|
||
|
self.Boxes[sheet] = box
|
||
|
r2:setEntityCustomSelectBox(sheet, box)
|
||
|
self:updateUI()
|
||
|
end
|
||
|
|
||
|
-- save all bbox
|
||
|
function r2.CustomBBox:save()
|
||
|
-- tmp : hardcoded path here for now ...
|
||
|
local stream = io.open(self.SavePath, "w")
|
||
|
assert(stream)
|
||
|
stream:write("--***************************************************************--\r\n")
|
||
|
stream:write("-- this file was generated by the r2 editor, do not edit !!!!!! --\r\n")
|
||
|
stream:write("--***************************************************************--\r\n")
|
||
|
for k, box in pairs(self.Boxes) do
|
||
|
if box.Enabled then
|
||
|
stream:write(string.format("\r\nr2.CustomBBox.Boxes['%s'] = { Enabled = true, XMin = %f, XMax = %f, YMin = %f, YMax = %f, ZMin = %f, ZMax = %f }",
|
||
|
k, box.XMin, box.XMax, box.YMin, box.YMax, box.ZMin, box.ZMax))
|
||
|
end
|
||
|
end
|
||
|
stream:close()
|
||
|
debugInfo("Custom bbox save successful")
|
||
|
end
|
||
|
|
||
|
function r2.CustomBBox:load()
|
||
|
r2.doFile(self.SavePath)
|
||
|
for sheet, box in pairs(self.Boxes) do
|
||
|
r2:setEntityCustomSelectBox(sheet, box)
|
||
|
end
|
||
|
end
|
||
|
|