Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/data/gui/scripts/GraphicsMenu.lua @ 8723

Last change on this file since 8723 was 8079, checked in by landauf, 14 years ago

merged usability branch back to trunk

incomplete summary of the changes in this branch:

  • enhanced keyboard navigation in GUIs
  • implemented new graphics menu and changeable window size at runtime
  • added developer mode
  • HUD shows if game is paused, game pauses if ingame menu is opened
  • removed a few obsolete commands and hid some that are more for internal use
  • numpad works in console and gui
  • faster loading of level info
  • enhanced usage of compositors (Shader class)
  • improved camera handling, configurable FOV and aspect ratio
  • Property svn:eol-style set to native
File size: 16.0 KB
Line 
1-- GraphicsMenu.lua
2
3local P = createMenuSheet("GraphicsMenu")
4
5P.resolutionList = {"custom", "640 x 480", "720 x 480", "720 x 576", "800 x 600", "1024 x 600", "1024 x 768", "1152 x 864", "1280 x 720", "1280 x 800", "1280 x 960", "1280 x 1024", "1360 x 768", "1440 x 900", "1600 x 900", "1600 x 1200", "1680 x 1050"}
6P.schemeList = {"TaharezGreen", "Orxonox"}
7P.fsaaList = {"0", "2", "4", "8", "8 [Quality]"}
8P.particleLodList = {"None", "Low", "Normal", "High"}
9
10function P:onLoad()
11    -------------------
12    -- Button matrix --
13    -------------------
14
15    P:setButton(1, 1, {
16            ["button"] = winMgr:getWindow("orxonox/GraphicsOkButton"),
17            ["callback"]  = P.callback_Ok_Clicked
18    })
19
20    P:setButton(1, 2, {
21            ["button"] = winMgr:getWindow("orxonox/GraphicsCancelButton"),
22            ["callback"]  = P.callback_Cancel_Clicked
23    })
24
25    -- place apply button at the bottom in the matrix, even though it's in fact at the top, to make the OK button highlighted by default
26    P:setButton(2, 1, {
27            ["button"] = winMgr:getWindow("orxonox/Display/Resolution/Apply"),
28            ["callback"]  = P.callback_Apply_Clicked
29    })
30
31    -----------------
32    -- Combo boxes --
33    -----------------
34
35    -- resolution combobox
36    local resolutionCombobox = winMgr:getWindow("orxonox/Display/Resolution/Combobox")
37    CEGUI.toCombobox(resolutionCombobox):setReadOnly(true)
38
39    for k,v in pairs(P.resolutionList) do
40        local item = CEGUI.createListboxTextItem(v)
41        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
42        resolutionCombobox:addItem(item)
43    end
44
45    -- themes combobox
46    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
47    CEGUI.toCombobox(themeCombobox):setReadOnly(true)
48
49    for k,v in pairs(P.schemeList) do
50        local item = CEGUI.createListboxTextItem(v)
51        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
52        themeCombobox:addItem(item)
53    end
54
55    -- fsaa combobox
56    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
57    CEGUI.toCombobox(fsaaCombobox):setReadOnly(true)
58
59    for k,v in pairs(P.fsaaList) do
60        local item = CEGUI.createListboxTextItem(v)
61        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
62        fsaaCombobox:addItem(item)
63    end
64
65    -- particle lod combobox
66    local particleLodCombobox = winMgr:getWindow("orxonox/Settings/ParticleLodCombobox")
67    CEGUI.toCombobox(particleLodCombobox):setReadOnly(true)
68
69    for k,v in pairs(P.particleLodList) do
70        local item = CEGUI.createListboxTextItem(v)
71        item:setSelectionBrushImage(menuImageSet, "MultiListSelectionBrush")
72        particleLodCombobox:addItem(item)
73    end
74end
75
76function P:onShow()
77    -----------------
78    -- Display tab --
79    -----------------
80
81    -- fullscreen checkbox / resolution combobox / resolution editboxes
82    self:onWindowResized()
83
84    -- apply button
85    self.updateApplyButton()
86
87    -- aspect ratio editbox
88    local aspectRatioEditbox = winMgr:getWindow("orxonox/Display/Resolution/AspectRatio")
89    local currentAspectRatio = orxonox.CommandExecutor:query("getConfig Camera aspectRatio_")
90    aspectRatioEditbox:setText(currentAspectRatio)
91
92    -- themes combobox
93    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
94    local currentTheme = orxonox.CommandExecutor:query("getConfig GUIManager guiScheme_")
95
96    for i = 0, themeCombobox:getDropList():getItemCount() - 1 do
97        local item = themeCombobox:getListboxItemFromIndex(i)
98        themeCombobox:setItemSelectState(item, (item:getText() == currentTheme))
99    end
100
101    -- vsync checkbox
102    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
103    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
104    CEGUI.toCheckbox(vsyncCheckbox):setSelected(hasVSync)
105
106    -- fsaa combobox
107    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
108    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
109
110    for i = 0, fsaaCombobox:getDropList():getItemCount() - 1 do
111        local item = fsaaCombobox:getListboxItemFromIndex(i)
112        fsaaCombobox:setItemSelectState(item, (item:getText() == currentFSAAMode))
113    end
114
115    -- notice
116    self:updateRedLabel()
117
118    ------------------
119    -- Settings tab --
120    ------------------
121
122    -- fov editbox
123    local fovEditbox = winMgr:getWindow("orxonox/Settings/Fov")
124    local currentFov = orxonox.CommandExecutor:query("getConfig Camera fov_")
125    fovEditbox:setText(currentFov)
126
127    -- fps limit editbox
128    local fpsEditbox = winMgr:getWindow("orxonox/Settings/FpsLimit")
129    local currentFpsLimit = orxonox.CommandExecutor:query("getConfig GraphicsSettings fpsLimit")
130    fpsEditbox:setText(currentFpsLimit)
131
132    -- particle lod combobox
133    local particleLodCombobox = winMgr:getWindow("orxonox/Settings/ParticleLodCombobox")
134    local currentParticleLod = orxonox.CommandExecutor:query("getConfig GraphicsSettings particlesDetailLevel")
135
136    if currentParticleLod == "" then
137        particleLodCombobox:disable()
138    else
139        particleLodCombobox:enable()
140
141        for i = 0, particleLodCombobox:getDropList():getItemCount() - 1 do
142            local item = particleLodCombobox:getListboxItemFromIndex(i)
143            particleLodCombobox:setItemSelectState(item, (tostring(i) == currentParticleLod))
144        end
145    end
146
147    -- mesh lod checkbox
148    local meshLodCheckbox = winMgr:getWindow("orxonox/Settings/MeshLodCheckbox")
149    local hasMeshLod = orxonox.CommandExecutor:query("getConfig GraphicsSettings enableMeshLoD")
150    if hasMeshLod == "true" then
151        hasMeshLod = true
152    elseif hasMeshLod == "false" then
153        hasMeshLod = false
154    end
155    CEGUI.toCheckbox(meshLodCheckbox):setSelected(hasMeshLod)
156
157    -- motion blur checkbox
158    local motionBlurCheckbox = winMgr:getWindow("orxonox/Settings/MotionBlurCheckbox")
159    local hasMotionBlur = orxonox.CommandExecutor:query("getConfig GraphicsSettings enableMotionBlur")
160    if hasMotionBlur == "true" then
161        hasMotionBlur = true
162    elseif hasMotionBlur == "false" then
163        hasMotionBlur = false
164    end
165    CEGUI.toCheckbox(motionBlurCheckbox):setSelected(hasMotionBlur)
166end
167
168function P:onWindowResized()
169    -- fullscreen checkbox
170    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
171    local isFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
172    CEGUI.toCheckbox(fullscreenCheckbox):setSelected(isFullscreen)
173
174    -- resolution combobox
175    local resolutionCombobox = winMgr:getWindow("orxonox/Display/Resolution/Combobox")
176
177    local currentWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
178    local currentHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
179
180    if P.forceResolutionEditboxes then
181        currentWidth = P.newWidth
182        currentHeight = P.newHeight
183        P.forceResolutionEditboxes = false
184    end
185
186    local currentResolution = currentWidth .. " x " .. currentHeight
187
188    for i = 0, resolutionCombobox:getDropList():getItemCount() - 1 do
189        local item = resolutionCombobox:getListboxItemFromIndex(i)
190        resolutionCombobox:setItemSelectState(item, item:getText() == currentResolution)
191    end
192
193    -- resolution editboxes
194    self.updateResolutionEditboxes()
195end
196
197----------------------
198-- Helper functions --
199----------------------
200
201-- updates the text of the resolution checkboxes and checks if they should be enabled (only if the "custom" resolution was selected)
202function P.updateResolutionEditboxes()
203    -- resolution combobox
204    local resolutionCombobox = winMgr:getWindow("orxonox/Display/Resolution/Combobox")
205
206    local currentWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
207    local currentHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
208
209    -- resolution editboxes
210    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
211    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
212    widthEditbox:disable()
213    heightEditbox:disable()
214
215    -- selected combobox item
216    local item = resolutionCombobox:getSelectedItem()
217    if item then
218        local itemText = item:getText()
219        if itemText ~= "custom" then
220            currentWidth = string.sub(itemText, 1, string.find(itemText, "x") - 2)
221            currentHeight = string.sub(itemText, string.find(itemText, "x") + 2)
222        else
223            widthEditbox:enable()
224            heightEditbox:enable()
225        end
226    end
227
228    widthEditbox:setText(currentWidth)
229    heightEditbox:setText(currentHeight)
230end
231
232-- checks if the apply button should be enabled or disabled (only enabled if the current settings are different from the selected values)
233function P.updateApplyButton()
234    -- fullscreen checkbox
235    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
236    local isFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
237    local fullscreenChanged = (isFullscreen ~= CEGUI.toCheckbox(fullscreenCheckbox):isSelected())
238
239    -- resolution editboxes
240    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
241    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
242    local currentWidth = tostring(orxonox.GraphicsManager:getInstance():getWindowWidth())
243    local currentHeight = tostring(orxonox.GraphicsManager:getInstance():getWindowHeight())
244    local widthChanged = (currentWidth ~= widthEditbox:getText())
245    local heightChanged = (currentHeight ~= heightEditbox:getText())
246    local resolutionEditboxesEnabled = not widthEditbox:isDisabled()
247
248    -- apply button
249    local applyButton = winMgr:getWindow("orxonox/Display/Resolution/Apply")
250
251    if fullscreenChanged or widthChanged or heightChanged or resolutionEditboxesEnabled then
252        applyButton:enable()
253    else
254        applyButton:disable()
255    end
256end
257
258function P.updateRedLabel()
259    -- theme
260    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
261    local currentTheme = orxonox.CommandExecutor:query("getConfig GUIManager guiScheme_")
262    local themeChanged = (currentTheme ~= themeCombobox:getText())
263
264    -- vsync
265    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
266    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
267    local vsyncChanged = (hasVSync ~= CEGUI.toCheckbox(vsyncCheckbox):isSelected())
268
269    -- fsaa
270    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
271    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
272    local fsaaChanged = (currentFSAAMode ~= fsaaCombobox:getText())
273
274    local needRestart = themeChanged or vsyncChanged or fsaaChanged
275
276    local notice = winMgr:getWindow("orxonox/Display/Notice")
277    notice:setVisible(not needRestart)
278    local noticeRed = winMgr:getWindow("orxonox/Display/NoticeRed")
279    noticeRed:setVisible(needRestart)
280end
281
282---------------------
283-- Event callbacks --
284---------------------
285
286-- resolution
287
288function P.callback_FullscreenCheckbox_CheckStateChanged(e)
289    P.updateApplyButton()
290end
291
292function P.callback_ResolutionCombobox_ListSelectionAccepted(e)
293    P.updateResolutionEditboxes()
294end
295
296function P.callback_ResolutionEditboxWidth_TextChanged(e)
297    P.updateApplyButton()
298end
299
300function P.callback_ResolutionEditboxHeight_TextChanged(e)
301    P.updateApplyButton()
302end
303
304-- theme
305
306function P.callback_ThemeCombobox_ListSelectionAccepted(e)
307    P.updateRedLabel()
308end
309
310-- vsync
311
312function P.callback_VSyncCheckbox_CheckStateChanged(e)
313    P.updateRedLabel()
314end
315
316-- fsaa
317
318function P.callback_FSAACombobox_ListSelectionAccepted(e)
319    P.updateRedLabel()
320end
321
322-- buttons
323
324function P.callback_Apply_Clicked(e)
325    -- resolution
326    local fullscreenCheckbox = winMgr:getWindow("orxonox/Display/Resolution/Fullscreen")
327    local checkedFullscreen = tostring(CEGUI.toCheckbox(fullscreenCheckbox):isSelected())
328
329    local widthEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxWidth")
330    local heightEditbox = winMgr:getWindow("orxonox/Display/Resolution/EditboxHeight")
331
332    P.newWidth = widthEditbox:getText()
333    P.newHeight = heightEditbox:getText()
334    P.forceResolutionEditboxes = true
335
336    -- start revert timer
337    P.oldWidth = orxonox.GraphicsManager:getInstance():getWindowWidth()
338    P.oldHeight = orxonox.GraphicsManager:getInstance():getWindowHeight()
339    P.oldFullscreen = orxonox.GraphicsManager:getInstance():isFullScreen()
340
341    P.revertTimerHandle = orxonox.CommandExecutor:query("delayreal 10 {hideGUI DecisionPopup; GraphicsManager setScreenResolution " .. P.oldWidth .. " " .. P.oldHeight .. " " .. tostring(P.oldFullscreen) .. "; config Core lastLevelTimestamp_ [expr [getConfig Core ogreConfigTimestamp_] + 1]}")
342
343    -- change settings
344    orxonox.CommandExecutor:execute("GraphicsManager setScreenResolution " .. P.newWidth .. " " .. P.newHeight .. " " .. checkedFullscreen)
345
346    P.updateApplyButton()
347
348    -- prompt for confirmation
349    openDecisionPopup("Do you want to keep these settings? (Settings will be reverted in 10 seconds if not accepted)", GraphicsMenu.callback_ApplyDecisionPopup)
350    if checkedFullscreen then
351        showCursor()
352    end
353end
354
355function P.callback_ApplyDecisionPopup(pressedOK)
356    orxonox.CommandExecutor:execute("killdelay " .. P.revertTimerHandle)
357
358    if not pressedOK then
359        orxonox.CommandExecutor:execute("GraphicsManager setScreenResolution " .. P.oldWidth .. " " .. P.oldHeight .. " " .. tostring(P.oldFullscreen))
360        P:onShow()
361    end
362
363    -- update timestamp to avoid showing the ogre config dialog again after the user accepted or reverted the resolution
364    orxonox.CommandExecutor:execute("config Core lastLevelTimestamp_ [expr [getConfig Core ogreConfigTimestamp_] + 1]")
365end
366
367function P.callback_Ok_Clicked(e)
368    -- aspect ratio
369    local aspectRatioEditbox = winMgr:getWindow("orxonox/Display/Resolution/AspectRatio")
370    orxonox.CommandExecutor:execute("config Camera aspectRatio_ " .. aspectRatioEditbox:getText())
371
372    -- theme
373    local themeCombobox = winMgr:getWindow("orxonox/Display/Theme/Combobox")
374    orxonox.CommandExecutor:execute("config GUIManager guiScheme_ " .. themeCombobox:getText())
375
376    -- vsync
377    local vsyncCheckbox = winMgr:getWindow("orxonox/Display/More/VSync")
378    local hasVSync = orxonox.GraphicsManager:getInstance():hasVSyncEnabled()
379    if hasVSync ~= CEGUI.toCheckbox(vsyncCheckbox):isSelected() then
380        orxonox.CommandExecutor:execute("GraphicsManager setVSync " .. tostring(CEGUI.toCheckbox(vsyncCheckbox):isSelected()))
381    end
382
383    -- fsaa
384    local fsaaCombobox = winMgr:getWindow("orxonox/Display/More/FSAA")
385    local currentFSAAMode = orxonox.GraphicsManager:getInstance():getFSAAMode()
386    if currentFSAAMode ~= fsaaCombobox:getText() then
387        orxonox.CommandExecutor:execute("GraphicsManager setFSAA {" .. fsaaCombobox:getText() .. "}") -- enclose argument in { ... } because it can contain [brackets] (conflicts with tcl)
388    end
389
390    -- fov
391    local fovEditbox = winMgr:getWindow("orxonox/Settings/Fov")
392    orxonox.CommandExecutor:execute("config Camera fov_ " .. fovEditbox:getText())
393
394    -- fps limit
395    local fpsEditbox = winMgr:getWindow("orxonox/Settings/FpsLimit")
396    orxonox.CommandExecutor:execute("config GraphicsSettings fpsLimit " .. fpsEditbox:getText())
397
398    -- particle lod
399    local particleLodCombobox = winMgr:getWindow("orxonox/Settings/ParticleLodCombobox")
400    local item = particleLodCombobox:getSelectedItem()
401    if item then
402        orxonox.CommandExecutor:execute("config GraphicsSettings particlesDetailLevel " .. particleLodCombobox:getItemIndex(item))
403    end
404
405    -- mesh lod
406    local meshLodCheckbox = winMgr:getWindow("orxonox/Settings/MeshLodCheckbox")
407    orxonox.CommandExecutor:execute("config GraphicsSettings enableMeshLoD " .. tostring(CEGUI.toCheckbox(meshLodCheckbox):isSelected()))
408
409    -- motion blur
410    local motionBlurCheckbox = winMgr:getWindow("orxonox/Settings/MotionBlurCheckbox")
411    orxonox.CommandExecutor:execute("config GraphicsSettings enableMotionBlur " .. tostring(CEGUI.toCheckbox(motionBlurCheckbox):isSelected()))
412
413    hideMenuSheet(P.name)
414end
415
416function P.callback_Cancel_Clicked(e)
417    hideMenuSheet(P.name)
418end
419
420return P
421
Note: See TracBrowser for help on using the repository browser.