mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-24 22:26:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			206 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			206 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
 |