mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
5.6 KiB
Lua
207 lines
5.6 KiB
Lua
local ui = require('openmw.ui')
|
|
local util = require('openmw.util')
|
|
|
|
local auxUi = require('openmw_aux.ui')
|
|
|
|
local constants = require('scripts.omw.mwui.constants')
|
|
|
|
local v2 = util.vector2
|
|
local whiteTexture = constants.whiteTexture
|
|
local menuTransparency = ui._getMenuTransparency()
|
|
|
|
local sideParts = {
|
|
left = v2(0, 0),
|
|
right = v2(1, 0),
|
|
top = v2(0, 0),
|
|
bottom = v2(0, 1),
|
|
}
|
|
local cornerParts = {
|
|
top_left = v2(0, 0),
|
|
top_right = v2(1, 0),
|
|
bottom_left = v2(0, 1),
|
|
bottom_right = v2(1, 1),
|
|
}
|
|
|
|
local borderSidePattern = 'textures/menu_%s_border_%s.dds'
|
|
local borderCornerPattern = 'textures/menu_%s_border_%s_corner.dds'
|
|
|
|
local borderResources = {}
|
|
local borderPieces = {}
|
|
for _, thickness in ipairs{'thin', 'thick'} do
|
|
borderResources[thickness] = {}
|
|
for k in pairs(sideParts) do
|
|
borderResources[thickness][k] = ui.texture{ path = borderSidePattern:format(thickness, k) }
|
|
end
|
|
for k in pairs(cornerParts) do
|
|
borderResources[thickness][k] = ui.texture{ path = borderCornerPattern:format(thickness, k) }
|
|
end
|
|
|
|
borderPieces[thickness] = {}
|
|
for k in pairs(sideParts) do
|
|
local horizontal = k == 'top' or k == 'bottom'
|
|
borderPieces[thickness][k] = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = borderResources[thickness][k],
|
|
tileH = horizontal,
|
|
tileV = not horizontal,
|
|
},
|
|
}
|
|
end
|
|
for k in pairs(cornerParts) do
|
|
borderPieces[thickness][k] = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = borderResources[thickness][k],
|
|
},
|
|
}
|
|
end
|
|
end
|
|
|
|
|
|
|
|
local function borderTemplates(thickness)
|
|
local borderSize = (thickness == 'thin') and constants.border or constants.thickBorder
|
|
local borderV = v2(1, 1) * borderSize
|
|
local result = {}
|
|
result.horizontalLine = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = borderResources[thickness].top,
|
|
tileH = true,
|
|
tileV = false,
|
|
size = v2(0, borderSize),
|
|
relativeSize = v2(1, 0),
|
|
},
|
|
}
|
|
|
|
result.verticalLine = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = borderResources[thickness].left,
|
|
tileH = false,
|
|
tileV = true,
|
|
size = v2(borderSize, 0),
|
|
relativeSize = v2(0, 1),
|
|
},
|
|
}
|
|
|
|
result.borders = {
|
|
content = ui.content {},
|
|
}
|
|
for k, v in pairs(sideParts) do
|
|
local horizontal = k == 'top' or k == 'bottom'
|
|
local direction = horizontal and v2(1, 0) or v2(0, 1)
|
|
result.borders.content:add {
|
|
template = borderPieces[thickness][k],
|
|
props = {
|
|
position = (direction - v) * borderSize,
|
|
relativePosition = v,
|
|
size = (v2(1, 1) - direction * 3) * borderSize,
|
|
relativeSize = direction,
|
|
}
|
|
}
|
|
end
|
|
for k, v in pairs(cornerParts) do
|
|
result.borders.content:add {
|
|
template = borderPieces[thickness][k],
|
|
props = {
|
|
position = -v * borderSize,
|
|
relativePosition = v,
|
|
size = borderV,
|
|
},
|
|
}
|
|
end
|
|
result.borders.content:add {
|
|
external = { slot = true },
|
|
props = {
|
|
position = borderV,
|
|
size = borderV * -2,
|
|
relativeSize = v2(1, 1),
|
|
}
|
|
}
|
|
|
|
result.box = {
|
|
type = ui.TYPE.Container,
|
|
content = ui.content{},
|
|
}
|
|
for k, v in pairs(sideParts) do
|
|
local horizontal = k == 'top' or k == 'bottom'
|
|
local direction = horizontal and v2(1, 0) or v2(0, 1)
|
|
result.box.content:add {
|
|
template = borderPieces[thickness][k],
|
|
props = {
|
|
position = (direction + v) * borderSize,
|
|
relativePosition = v,
|
|
size = (v2(1, 1) - direction) * borderSize,
|
|
relativeSize = direction,
|
|
}
|
|
}
|
|
end
|
|
for k, v in pairs(cornerParts) do
|
|
result.box.content:add {
|
|
template = borderPieces[thickness][k],
|
|
props = {
|
|
position = v * borderSize,
|
|
relativePosition = v,
|
|
size = borderV,
|
|
},
|
|
}
|
|
end
|
|
result.box.content:add {
|
|
external = { slot = true },
|
|
props = {
|
|
position = borderV,
|
|
relativeSize = v2(1, 1),
|
|
}
|
|
}
|
|
|
|
local backgroundTransparent = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = whiteTexture,
|
|
color = util.color.rgb(0, 0, 0),
|
|
alpha = menuTransparency,
|
|
},
|
|
}
|
|
local backgroundSolid = {
|
|
type = ui.TYPE.Image,
|
|
props = {
|
|
resource = whiteTexture,
|
|
color = util.color.rgb(0, 0, 0),
|
|
},
|
|
}
|
|
|
|
result.boxTransparent = auxUi.deepLayoutCopy(result.box)
|
|
result.boxTransparent.content:insert(1, {
|
|
template = backgroundTransparent,
|
|
props = {
|
|
relativeSize = v2(1, 1),
|
|
size = borderV * 2,
|
|
},
|
|
})
|
|
|
|
result.boxSolid = auxUi.deepLayoutCopy(result.box)
|
|
result.boxSolid.content:insert(1, {
|
|
template = backgroundSolid,
|
|
props = {
|
|
relativeSize = v2(1, 1),
|
|
size = borderV * 2,
|
|
},
|
|
})
|
|
|
|
return result
|
|
end
|
|
|
|
local thinBorders = borderTemplates('thin')
|
|
local thickBorders = borderTemplates('thick')
|
|
|
|
return function(templates)
|
|
for k, t in pairs(thinBorders) do
|
|
templates[k] = t
|
|
end
|
|
for k, t in pairs(thickBorders) do
|
|
templates[k .. 'Thick'] = t
|
|
end
|
|
end
|