Files
SDL3CPlusPlus/scripts/gui_demo.lua

145 lines
4.2 KiB
Lua

local Gui = require('gui')
local math3d = require('math3d')
local ctx = Gui.newContext()
local input = Gui.newInputState()
local textState = Gui.newTextState('')
local listState = Gui.newListState()
local items = {
'Dashboard Setup',
'Input Streams',
'Telemetry',
'Power Profile',
'Diagnostics',
'Release Notes',
}
local statusMessage = 'Idle'
local selectedItem = items[1]
local rotationSpeeds = {x = 0.45, y = 0.65}
local function log_trace(fmt, ...)
if not lua_debug or not fmt then
return
end
print(string.format(fmt, ...))
end
local cubeVertices = {
{ position = {-1.0, -1.0, -1.0}, color = {1.0, 0.2, 0.4} },
{ position = {1.0, -1.0, -1.0}, color = {0.2, 0.9, 0.4} },
{ position = {1.0, 1.0, -1.0}, color = {0.3, 0.4, 0.9} },
{ position = {-1.0, 1.0, -1.0}, color = {1.0, 0.8, 0.2} },
{ position = {-1.0, -1.0, 1.0}, color = {0.9, 0.4, 0.5} },
{ position = {1.0, -1.0, 1.0}, color = {0.4, 0.9, 0.5} },
{ position = {1.0, 1.0, 1.0}, color = {0.6, 0.8, 1.0} },
{ position = {-1.0, 1.0, 1.0}, color = {0.4, 0.4, 0.4} },
}
local cubeIndices = {
1, 2, 3, 3, 4, 1,
5, 6, 7, 7, 8, 5,
1, 5, 8, 8, 4, 1,
2, 6, 7, 7, 3, 2,
4, 3, 7, 7, 8, 4,
1, 2, 6, 6, 5, 1,
}
local shaderVariants = {
default = {
vertex = 'shaders/cube.vert.spv',
fragment = 'shaders/cube.frag.spv',
},
}
local camera = {
eye = {2.0, 2.0, 3.0},
center = {0.0, 0.0, 0.0},
up = {0.0, 1.0, 0.0},
fov = 0.78,
near = 0.1,
far = 10.0,
}
local function buildModel(time)
local y = math3d.rotation_y(time * rotationSpeeds.y)
local x = math3d.rotation_x(time * rotationSpeeds.x)
return math3d.multiply(y, x)
end
local function createCube(position)
local function computeModel(time)
local base = buildModel(time)
local offset = math3d.translation(position[1], position[2], position[3])
return math3d.multiply(offset, base)
end
return {
vertices = cubeVertices,
indices = cubeIndices,
compute_model_matrix = computeModel,
shader_key = 'default',
}
end
gui_context = ctx
gui_input = input
function get_scene_objects()
return { createCube({0.0, 0.0, -4.0}) }
end
function get_shader_paths()
return shaderVariants
end
function get_view_projection(aspect)
local view = math3d.look_at(camera.eye, camera.center, camera.up)
local projection = math3d.perspective(camera.fov, aspect, camera.near, camera.far)
return math3d.multiply(projection, view)
end
local function drawPanel()
ctx:pushRect({x = 10, y = 10, width = 460, height = 520}, {
color = {0.06, 0.07, 0.09, 0.9},
borderColor = {0.35, 0.38, 0.42, 1.0},
})
Gui.text(ctx, {x = 30, y = 30, width = 420, height = 30}, "Command Console", {
fontSize = 24,
alignX = "left",
color = {0.95, 0.95, 0.95, 1.0},
})
Gui.svg(ctx, {x = 320, y = 30, width = 120, height = 120}, "assets/logo.svg")
textState = Gui.textbox(ctx, "search_field", {x = 30, y = 80, width = 420, height = 40}, textState, {
placeholder = 'Filter modules...',
onSubmit = function(text)
statusMessage = 'Searching for: ' .. (text ~= '' and text or 'anything')
log_trace("GuiDemo search submitted: %s", statusMessage)
end,
})
listState = Gui.listView(ctx, "menu_list", {x = 30, y = 140, width = 420, height = 240}, items, listState, {
onSelect = function(idx, item)
selectedItem = item
statusMessage = "Ready to adjust " .. item
log_trace("GuiDemo selection changed: idx=%d item=%s", idx, item)
end,
scrollToSelection = true,
})
if Gui.button(ctx, "apply", {x = 30, y = 400, width = 200, height = 38}, "Apply Settings") then
statusMessage = "Applied configuration for " .. (selectedItem or "-")
log_trace("GuiDemo apply clicked: %s", statusMessage)
end
Gui.text(ctx, {x = 30, y = 448, width = 420, height = 24}, "Status: " .. statusMessage, {
color = {0.6, 0.9, 1.0, 1.0},
alignY = "top",
})
end
function get_gui_commands()
ctx:beginFrame(input)
drawPanel()
ctx:endFrame()
return ctx:getCommands()
end