Changeset 6662
- Timestamp:
- Mar 31, 2010, 1:05:28 AM (15 years ago)
- Location:
- code/branches/gamestates2
- Files:
-
- 37 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
code/branches/gamestates2
- Property svn:mergeinfo changed
/code/branches/gamestate merged: 6621-6630,6655-6661
- Property svn:mergeinfo changed
-
code/branches/gamestates2/data/gui/scripts/AudioMenu.lua
r6595 r6662 1 1 -- AudioMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("AudioMenu") 5 if _REQUIREDNAME == nil then 6 AudioMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("AudioMenu") 10 4 11 function P :init()5 function P.init() 12 6 soundMgr = orxonox.SoundManager:getInstance() 13 7 block = false -
code/branches/gamestates2/data/gui/scripts/BasicGUI.lua
r6595 r6662 1 -- gui.lua1 -- BasicGUI.lua 2 2 3 3 local P = {} 4 if _REQUIREDNAME == nil then 5 BasicGUI = P 6 else 7 _G[_REQUIREDNAME] = P 8 end 4 _G[_REQUIREDNAME or "BasicGUI"] = P 9 5 10 6 -- useless, even wrong? P is the class, not the object.. … … 27 23 end 28 24 29 -- Override this function if you need to 25 -- Override this function if you want to change one of the three input parameters: 26 -- showCursor = true, useKeyboard = true and blockJoyStick = false 30 27 -- But don't forget to stick to the naming convention ("GUI_" .. self.filename) 31 28 function P:createInputState() -
code/branches/gamestates2/data/gui/scripts/ControlsMenu.lua
r6595 r6662 1 1 -- ControlsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("ControlsMenu") 5 if _REQUIREDNAME == nil then 6 ControlsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("ControlsMenu") 10 4 11 5 function P.ControlsMouseControlsButton_clicked(e) -
code/branches/gamestates2/data/gui/scripts/CreditsMenu.lua
r6595 r6662 1 1 -- CreditsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("CreditsMenu") 5 if _REQUIREDNAME == nil then 6 CreditsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local sheetName = _REQUIREDNAME or "CreditsMenu" 4 -- Create object of type BasicGUI and make it global 5 local P = require("BasicGUI"):new(sheetName) 6 _G[sheetName] = P 10 7 11 8 function P.CreditsBackButton_clicked(e) -
code/branches/gamestates2/data/gui/scripts/DecisionPopup.lua
r6595 r6662 1 1 -- DecisionPopup.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("DecisionPopup") 5 if _REQUIREDNAME == nil then 6 DecisionPopup = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("DecisionPopup") 10 4 11 5 function P.setCallback(functionPtr) -
code/branches/gamestates2/data/gui/scripts/GUITools.lua
r6417 r6662 1 function createSheet(sheetName) 2 -- Create object of type BasicGUI and make it global 3 local sheet = require("BasicGUI"):new(sheetName) 4 _G[sheetName] = sheet 5 return sheet 6 end 7 1 8 function openDecisionPopup( text, callbackPtr ) 2 9 showGUI("DecisionPopup", false, true) -
code/branches/gamestates2/data/gui/scripts/GameplayMenu.lua
r6595 r6662 1 1 -- GameplayMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("GameplayMenu") 5 if _REQUIREDNAME == nil then 6 GameplayMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("GameplayMenu") 10 4 11 function P :init()5 function P.init() 12 6 dropdown = winMgr:getWindow("orxonox/ThemeCombobox") 13 7 local themeList = {} … … 24 18 function P.GameplayThemeCombobox_changed(e) 25 19 -- theme 26 debug("event: theme")20 logMessage(0, "event: theme") 27 21 end 28 22 29 23 function P.GameplayDifficultyEasyButton_clicked(e) 30 24 -- difficulty easy 31 debug("event: easy")25 logMessage(0, "event: easy") 32 26 end 33 27 34 28 function P.GameplayDifficultyNormalButton_clicked(e) 35 29 -- difficulty normal 36 debug("event: normal")30 logMessage(0, "event: normal") 37 31 end 38 32 39 33 function P.GameplayDifficultyHardButton_clicked(e) 40 34 -- difficulty hard 41 debug("event: hard")35 logMessage(0, "event: hard") 42 36 end 43 37 -
code/branches/gamestates2/data/gui/scripts/GraphicsMenu.lua
r6595 r6662 1 1 -- GraphicsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("GraphicsMenu") 5 if _REQUIREDNAME == nil then 6 GraphicsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("GraphicsMenu") 10 4 11 function P :init()5 function P.init() 12 6 block = true 13 7 file = orxonox.PathConfig:getConfigPathString() .. orxonox.getConfig("GraphicsManager", "ogreConfigFile_") … … 149 143 if scrollbar_active == false then 150 144 -- brightness 151 debug("event: brightness")145 logMessage(0, "event: brightness") 152 146 end 153 147 end … … 159 153 function P.GraphicsBrightnessScrollbar_ended(e) 160 154 -- brightness 161 debug("event: brightness")155 logMessage(0, "event: brightness") 162 156 scrollbar_active = false 163 157 end -
code/branches/gamestates2/data/gui/scripts/InGameMenu.lua
r6595 r6662 1 1 -- InGameMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("InGameMenu") 5 if _REQUIREDNAME == nil then 6 InGameMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("InGameMenu") 10 4 11 5 -- events for ingamemenu -
code/branches/gamestates2/data/gui/scripts/InfoPopup.lua
r6595 r6662 1 1 -- InfoPopup.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("InfoPopup") 5 6 if _REQUIREDNAME == nil then 7 InfoPopup = P 8 else 9 _G[_REQUIREDNAME] = P 10 end 3 local P = createSheet("InfoPopup") 11 4 12 5 function P.execute(functionPtr, arguments) -
code/branches/gamestates2/data/gui/scripts/InitialiseGUI.lua
r6595 r6662 29 29 system:setDefaultTooltip("MenuWidgets/Tooltip") 30 30 31 loadedGUIs = {} 32 cursorVisibility = {} 33 activeSheets = {} 34 nrOfActiveSheets = 0 35 root = nil 36 bShowsCursor = false 37 bHidePrevious = {} 31 local loadedSheets = {} 32 local activeMenuSheets = {size = 0, topSheet = nil} 33 --activeHUDSheets = {size = 0, topSheet = nil} 34 local root = nil 38 35 39 36 -- Require all tools 40 37 require("GUITools") 41 38 42 -- loads the GUI with the specified filename 43 -- be sure to set the global variable "filename" before calling this function 44 function loadGUI(filename) 45 -- check if it already exists 46 loadedGui = loadedGUIs[filename] 47 if loadedGui == nil then 48 loadedGuiNS = require(filename) 49 if loadedGuiNS == nil then 39 40 ----------------------- 41 --- Local functions --- 42 ----------------------- 43 44 -- Loads the GUI with the specified name 45 -- The name corresponds to the filename of the *.lua and *.layout files 46 -- but without the extension 47 local function loadSheet(name) 48 -- Check if it has already been loaded 49 local sheet = loadedSheets[name] 50 if sheet == nil then 51 -- Load the sheet 52 sheet = require(name) 53 if sheet == nil then 50 54 return 51 55 end 52 loadedGui = loadedGuiNS:load() 53 loadedGUIs[filename] = loadedGui 54 -- if there has no GUI been loaded yet, set new GUI as current 55 if table.getn(loadedGUIs) == 1 then 56 current = loadedGUIs[1] 57 end 58 -- hide new GUI as we do not want to show it accidentially 59 loadedGui:hide() 60 end 61 return loadedGui 62 end 63 64 function showGUI(filename, hidePrevious, bCursorVisible, ptr) 65 gui = showGUI(filename, hidePrevious, bCursorVisible) 56 sheet:load() 57 loadedSheets[name] = sheet 58 -- Hide new GUI as we do not want to show it accidentally 59 sheet:hide() 60 end 61 return sheet 62 end 63 64 local function hideCursor() 65 if cursor:isVisible() then 66 cursor:hide() 67 end 68 end 69 70 local function showCursor() 71 if not cursor:isVisible() and orxonox.InputManager:getInstance():isMouseExclusive() then 72 cursor:show() 73 end 74 end 75 76 local function find(table, value) 77 for i, v in ipairs(table) do 78 if v == value then 79 return i 80 end 81 end 82 return nil 83 end 84 85 86 ------------------------ 87 --- Global functions --- 88 ------------------------ 89 90 -- ? 91 function showGUI(name, bHidePrevious, bShowCursor, ptr) 92 gui = showGUI(name, bHidePrevious, bShowCursor) 66 93 gui.overlay = ptr 67 94 end 68 95 69 -- shows the specified GUI sheet and loads it if not loaded already 70 function showGUI(filename, hidePrevious, bCursorVisible) 71 if bCursorVisible == nil then 72 if nrOfActiveSheets > 0 then 73 bCursorVisible = cursorVisibility[activeSheets[nrOfActiveSheets]] 96 -- Shows the specified menu sheet and loads it if neccessary 97 function showGUI(name, bHidePrevious, bShowCursor) 98 -- Handle default value for bShowCursor 99 if bShowCursor == nil then 100 if activeMenuSheets.size > 0 then 101 bShowCursor = activeMenuSheets.topSheet.bShowCursor 74 102 else 75 bCursorVisible = true 76 end 77 end 78 79 if root == nil then 103 bShowCursor = true 104 end 105 end 106 107 -- Hide if already displayed (to make sure it is up front in the end) 108 if activeMenuSheets[name] ~= nil then 109 hideGUI(name) 110 end 111 112 if not root then 80 113 setBackground("") 81 114 end 82 115 83 local currentGUI = loadedGUIs[filename] 84 if(currentGUI == nil) then 85 currentGUI = loadGUI(filename) 86 end 87 88 if(root:isChild(currentGUI.window)) then 89 root:removeChildWindow(currentGUI.window) 90 end 91 root:addChildWindow(currentGUI.window) 92 93 if bCursorVisible then 116 -- Get sheet (or load it) 117 local menuSheet = loadSheet(name) 118 if not menuSheet then 119 return 120 end 121 122 -- Add sheet to the root window 123 root:addChildWindow(menuSheet.window) 124 125 -- Pause game control if this is the first menu to be displayed 126 -- HUGE HACK? 127 if activeMenuSheets.size == 0 then 128 orxonox.HumanController:pauseControl() 129 end 130 131 -- Handle input distribution 132 orxonox.InputManager:getInstance():enterState(menuSheet.inputState) 133 134 if bShowCursor then 94 135 showCursor() 95 136 else … … 97 138 end 98 139 99 if find( activeSheets, filename ) ~= nil then 100 table.remove( activeSheets, find( activeSheets, filename ) ) 101 nrOfActiveSheets = nrOfActiveSheets - 1 102 else 103 if nrOfActiveSheets == 0 then 104 --orxonox.InputManager:getInstance():enterState("guiMouseOnly") 105 orxonox.HumanController:pauseControl() 106 end 107 end 108 orxonox.InputManager:getInstance():enterState(currentGUI.inputState) 109 110 nrOfActiveSheets = nrOfActiveSheets + 1 111 table.insert(activeSheets, filename) 112 activeSheets[nrOfActiveSheets] = filename 113 bHidePrevious[filename]=hidePrevious 114 cursorVisibility[filename] = bCursorVisible 115 116 if hidePrevious == true then 117 for i=1,nrOfActiveSheets-1 do 118 loadedGUIs[ activeSheets[i] ]:hide() 119 end 120 end 121 currentGUI:show() 122 return currentGUI 123 end 124 125 function hideCursor() 126 if bShowsCursor==true then 127 bShowsCursor=false 128 cursor:hide() 129 end 130 end 131 132 function showCursor() 133 if bShowsCursor==false then 134 bShowsCursor=true 135 cursor:show() 136 end 137 end 138 139 function hideGUI(filename) 140 local currentGUI = loadedGUIs[filename] 141 if currentGUI == nil then 140 -- Add the sheet in a tuple of additional information 141 local sheetTuple = 142 { 143 ["menuSheet"] = menuSheet, 144 ["name"] = name, 145 ["bShowCursor"] = bShowCursor, 146 ["bHidePrevious"] = bHidePrevious 147 } 148 table.insert(activeMenuSheets, sheetTuple) -- indexed array access 149 activeMenuSheets[name] = sheetTuple -- name access 150 activeMenuSheets.size = activeMenuSheets.size + 1 151 activeMenuSheets.topSheet = sheetTuple 152 153 -- Hide all previous sheets if necessary 154 if bHidePrevious then 155 for i = 1, activeMenuSheets.size - 1 do 156 activeMenuSheets[i].menuSheet:hide() 157 end 158 end 159 160 menuSheet:show() 161 return menuSheet 162 end 163 164 function hideGUI(name) 165 local sheetTuple = activeMenuSheets[name] 166 if sheetTuple == nil then 142 167 return 143 168 end 144 currentGUI:hide() 145 if bHidePrevious[filename] == true then 146 local i = nrOfActiveSheets-1 147 while i>0 do 148 loadedGUIs[ activeSheets[i] ]:show() 149 if bHidePrevious[filename]==true then 150 break 151 else 152 i=i-1 169 170 -- Hide the sheet 171 sheetTuple.menuSheet:hide() 172 173 -- Show sheets that were hidden by the sheet to be removed 174 local i = activeMenuSheets.size 175 -- Only do something if all sheets on top of sheetTuple 176 -- have bHidePrevious == false and sheetTuple.bHidePrevious == true 177 while i > 0 do 178 if activeMenuSheets[i].bHidePrevious == true then 179 if activeMenuSheets[i] == sheetTuple then 180 i = i - 1 181 while i > 0 do 182 activeMenuSheets[i].menuSheet:show() 183 if activeMenuSheets[i].bHidePrevious == true then 184 break 185 end 186 i = i - 1 187 end 153 188 end 154 end 155 end 156 root:removeChildWindow(currentGUI.window) 157 local i=1 158 while activeSheets[i] do 159 if activeSheets[i+1] == nil then 160 if activeSheets[i-1] ~= nil then 161 if cursorVisibility[ activeSheets[i-1] ] == true then 162 showCursor() 163 else 164 hideCursor() 165 end 166 else 167 hideCursor() 168 end 169 end 170 if activeSheets[i] == filename then 171 table.remove( activeSheets, i ) 172 nrOfActiveSheets = nrOfActiveSheets-1 173 else 174 i = i+1 175 end 176 end 177 cursorVisibility[filename] = nil -- remove the cursor visibility of the current gui from the table 178 bHidePrevious[filename] = nil 179 if nrOfActiveSheets == 0 then 180 --orxonox.InputManager:getInstance():leaveState("guiMouseOnly") 189 break 190 end 191 i = i - 1 192 end 193 194 -- Remove sheet with its tuple from the table 195 root:removeChildWindow(sheetTuple.menuSheet.window) 196 table.remove(activeMenuSheets, find(activeMenuSheets, sheetTuple)) 197 activeMenuSheets[name] = nil 198 activeMenuSheets.size = activeMenuSheets.size - 1 199 activeMenuSheets.topSheet = activeMenuSheets[activeMenuSheets.size] 200 201 -- Leave the input state 202 orxonox.InputManager:getInstance():leaveState(sheetTuple.menuSheet.inputState) 203 204 -- See whether to show or hide cursor 205 if activeMenuSheets.size > 0 and activeMenuSheets.topSheet.bShowCursor then 206 showCursor() 207 else 208 hideCursor() 209 end 210 211 -- Resume control if the last menu is hidden 212 if activeMenuSheets.size == 0 then 181 213 orxonox.HumanController:resumeControl() 182 214 hideCursor() 183 215 end 184 orxonox.InputManager:getInstance():leaveState(currentGUI.inputState) 185 end 186 216 end 217 218 -- Hides all menu GUI sheets 187 219 function hideAllGUIs() 188 while nrOfActiveSheets~= 0 do189 hideGUI(active Sheets[nrOfActiveSheets])220 while activeMenuSheets.size ~= 0 do 221 hideGUI(activeMenuSheets.topSheet.name) 190 222 end 191 223 end 192 224 193 225 function keyESC() 194 if nrOfActiveSheets == 1 and activeSheets[1] == "MainMenu" then 226 -- HUGE, very HUGE hacks! 227 if activeMenuSheets.size == 1 and activeMenuSheets[1].name == "MainMenu" then 195 228 orxonox.execute("exit") 196 elseif nrOfActiveSheets> 0 then197 orxonox.execute("hideGUI "..active Sheets[nrOfActiveSheets])229 elseif activeMenuSheets.size > 0 then 230 orxonox.execute("hideGUI "..activeMenuSheets.topSheet.name) 198 231 else 199 232 showGUI("InGameMenu") … … 201 234 end 202 235 203 function setBackground( filename)236 function setBackground(name) 204 237 local newroot 205 238 if root ~= nil then 206 239 root:rename("oldRootWindow") 207 240 end 208 if filename ~= "" then209 newroot = winMgr:loadWindowLayout( filename .. ".layout")241 if name ~= "" then 242 newroot = winMgr:loadWindowLayout(name .. ".layout") 210 243 newroot:rename("AbsoluteRootWindow") 211 244 system:setGUISheet(newroot) … … 228 261 root = newroot 229 262 end 230 231 function find(table, value)232 local i=0233 while table[i] ~= nil do234 if table[i]==value then235 return i236 else237 i=i+1238 end239 end240 return nil241 end242 243 function test(e)244 debug(0, "Blubb")245 end -
code/branches/gamestates2/data/gui/scripts/KeyBindMenu.lua
r6595 r6662 1 1 -- KeyBindMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("KeyBindMenu") 5 6 if _REQUIREDNAME == nil then 7 KeyBindMenu = P 8 else 9 _G[_REQUIREDNAME] = P 10 end 11 12 function P:init() 3 local P = createSheet("KeyBindMenu") 4 5 function P.init() 13 6 14 7 commandList = {} -
code/branches/gamestates2/data/gui/scripts/MainMenu.lua
r6595 r6662 1 1 -- MainMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("MainMenu") 5 if _REQUIREDNAME == nil then 6 MainMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("MainMenu") 10 4 11 5 -- events for MainMenu -
code/branches/gamestates2/data/gui/scripts/MouseControlsMenu.lua
r6595 r6662 1 1 -- MouseControlsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("MouseControlsMenu") 5 if _REQUIREDNAME == nil then 6 MouseControlsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("MouseControlsMenu") 10 4 11 function P :init()5 function P.init() 12 6 block = false 13 7 mousenormalscrollbarwindow = tolua.cast(winMgr:getWindow("orxonox/MouseNormalScrollbar"),"CEGUI::Scrollbar") -
code/branches/gamestates2/data/gui/scripts/MultiplayerMenu.lua
r6595 r6662 1 1 -- MultiplayerMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("MultiplayerMenu") 5 if _REQUIREDNAME == nil then 6 MultiplayerMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("MultiplayerMenu") 10 4 11 function P :init()5 function P.init() 12 6 listbox = winMgr:getWindow("orxonox/MultiplayerLevelListbox") 13 7 preselect = orxonox.LevelManager:getInstance():getDefaultLevel() -
code/branches/gamestates2/data/gui/scripts/MultiplayerOptionsMenu.lua
r6595 r6662 1 1 -- MultiplayerOptionsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("MultiplayerOptionsMenu") 5 if _REQUIREDNAME == nil then 6 MultiplayerOptionsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("MultiplayerOptionsMenu") 10 4 11 5 function P.MultiplayerOptionsBackButton_clicked(e) -
code/branches/gamestates2/data/gui/scripts/PickupInventory.lua
r6595 r6662 1 1 -- PickupInventory.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("PickupInventory") 5 if _REQUIREDNAME == nil then 6 PickupInventory = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("PickupInventory") 10 4 11 5 P.lastEquipmentCount_ = 0 … … 14 8 15 9 -- events 16 function P :frmUpdate(e)10 function P.frmUpdate(e) 17 11 local equipCount = orxonox.PickupInventory:getEquipmentCount() 18 12 local usableCount = orxonox.PickupInventory:getUsableCount() 19 13 20 if equipCount ~= self.lastEquipmentCount_ or usableCount ~= self.lastUsableCount_ then21 self:updateTabs()14 if equipCount ~= P.lastEquipmentCount_ or usableCount ~= P.lastUsableCount_ then 15 P.updateTabs() 22 16 end 23 17 end … … 31 25 end 32 26 33 function P :mItemClicked(e)27 function P.mItemClicked(e) 34 28 local w = CEGUI.toWindowEventArgs(e).window 35 29 local name = w:getName() … … 42 36 43 37 if t == "use" then 44 if self.currentUsableID_ >= 0 then45 winMgr:getWindow("orxonox/Inventory/Title/use/" .. self.currentUsableID_):setProperty("TextColours", "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF")38 if P.currentUsableID_ >= 0 then 39 winMgr:getWindow("orxonox/Inventory/Title/use/" .. P.currentUsableID_):setProperty("TextColours", "tl:FFFFFFFF tr:FFFFFFFF bl:FFFFFFFF br:FFFFFFFF") 46 40 end 47 41 orxonox.PickupInventory:selectUsable(tonumber(i)) 48 self.currentUsableID_ = tonumber(i)42 P.currentUsableID_ = tonumber(i) 49 43 winMgr:getWindow("orxonox/Inventory/Title/use/" .. i):setProperty("TextColours", "tl:FFFF4444 tr:FFFF4444 bl:FFFF4444 br:FFFF4444") 50 44 end … … 52 46 53 47 -- methods 54 function P :updateTabs()48 function P.updateTabs() 55 49 local eqWin = winMgr:getWindow("orxonox/Inventory/TabControl/TabEquipment") 56 50 local usWin = winMgr:getWindow("orxonox/Inventory/TabControl/TabUsable") … … 58 52 orxonox.PickupInventory:getSingleton():updateTabs(winMgr, eqWin, usWin) 59 53 60 self.currentUsableID_ = orxonox.PickupInventory:getCurrentUsableIndex()61 self.lastEquipmentCount_ = orxonox.PickupInventory:getEquipmentCount()62 self.lastUsableCount_ = orxonox.PickupInventory:getUsableCount()54 P.currentUsableID_ = orxonox.PickupInventory:getCurrentUsableIndex() 55 P.lastEquipmentCount_ = orxonox.PickupInventory:getEquipmentCount() 56 P.lastUsableCount_ = orxonox.PickupInventory:getUsableCount() 63 57 end 64 58 -
code/branches/gamestates2/data/gui/scripts/QuestGUI.lua
r6595 r6662 1 gui = require("BasicGUI") 2 local P = BasicGUI:new("QuestGUI") 3 if _REQUIREDNAME == nil then 4 QuestGUI = P 5 else 6 _G[_REQUIREDNAME] = P 7 end 1 -- QuestGUI.lua 8 2 9 function P:show() 10 self.window:show() -- TDO: Do this through parent... 11 self.visible = true 3 local P = createSheet("QuestGUI") 4 5 function P.show() 6 P.window:show() -- TDO: Do this through parent... 7 P.visible = true 12 8 13 9 local questManager = orxonox.QuestManager:getInstance() -
code/branches/gamestates2/data/gui/scripts/SettingsMenu.lua
r6595 r6662 1 1 -- SettingsMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("SettingsMenu") 5 if _REQUIREDNAME == nil then 6 SettingsMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("SettingsMenu") 10 4 11 5 function P.SettingsGameplayButton_clicked(e) … … 31 25 function P.SettingsResetSettingsButton_clicked(e) 32 26 -- reset settings 33 debug("event: reset settings")27 logMessage(0, "event: reset settings") 34 28 end 35 29 -
code/branches/gamestates2/data/gui/scripts/SingleplayerMenu.lua
r6595 r6662 1 1 -- SingleplayerMenu.lua 2 2 3 BasicGUI = require("BasicGUI") 4 local P = BasicGUI:new("SingleplayerMenu") 5 if _REQUIREDNAME == nil then 6 SingleplayerMenu = P 7 else 8 _G[_REQUIREDNAME] = P 9 end 3 local P = createSheet("SingleplayerMenu") 10 4 11 function P :init()5 function P.init() 12 6 listbox = winMgr:getWindow("orxonox/SingleplayerLevelListbox") 13 7 preselect = orxonox.LevelManager:getInstance():getDefaultLevel() -
code/branches/gamestates2/data/lua/LuaStateInit.lua
r6536 r6662 1 1 -- Note: luaState is a pointer to the LuaState instance that created this lua state 2 2 3 -- Save original print function in debug4 debug = print5 6 3 -- Redirect print to the C++ print function 4 original_print = print 7 5 print = function(s) 8 6 luaState:luaPrint(s) … … 13 11 luaState:luaLog(level, message) 14 12 end 13 cout = logMessage 15 14 16 15 -- Redirect dofile in order to load with the resource manager 17 doFile = function(filename) 16 original_dofile = dofile 17 dofile = function(filename) 18 18 luaState:doFile(filename) 19 -- Required because the C++ function cannot return whatever might be on the stack19 -- Required because if the file returns a table, it cannot be passed through the C++ function 20 20 return LuaStateReturnValue -- C-injected global variable 21 21 end 22 original_dofile = dofile 23 dofile = doFile 22 doFile = dofile 24 23 25 24 -- Create includeFile function that preparses the file according … … 27 26 include = function(filename) 28 27 luaState:includeFile(filename) 29 -- Required because the C++ function cannot return whatever might be on the stack28 -- Required because if the file returns a table, it cannot be passed through the C++ function 30 29 return LuaStateReturnValue -- C-injected global variable 31 30 end … … 34 33 -- The loaded modules are then stored with their names (where name has no .lua extension) 35 34 -- Furthermore the ".lua" extension is appended to the moduleName parameter when looking for the file 36 old_require = require 35 original_require = require 36 _REQUIREDNAME = "" 37 LuaStateReturnValue = true 37 38 require = function(moduleName) 38 39 if not luaState:fileExists(moduleName .. ".lua") then 40 logMessage(2, "Warning: Lua function require() could not find file '" .. moduleName .. ".lua' ") 39 41 return nil 40 42 end … … 42 44 _LOADED = {} 43 45 end 44 if not _LOADED[moduleName]then46 if _LOADED[moduleName] == nil then 45 47 -- save old value 46 _REQUIREDNAME_OLD = _REQUIREDNAME48 local _REQUIREDNAME_OLD = _REQUIREDNAME 47 49 _REQUIREDNAME = moduleName 48 50 luaState:doFile(moduleName .. ".lua") 49 _LOADED[moduleName] = LuaStateReturnValue or true 51 -- LuaStateReturnValue is required because if the file returns a table, 52 -- it cannot be passed through the C++ function 53 if LuaStateReturnValue == nil then -- C-injected global variable 54 LuaStateReturnValue = true 55 end 56 _LOADED[moduleName] = LuaStateReturnValue -- This entry must never be nil 50 57 -- restore old value 51 58 _REQUIREDNAME = _REQUIREDNAME_OLD … … 53 60 return _LOADED[moduleName] 54 61 end 62 63 64 -- Include command line debugger for lua 5.1 65 -- Note: It doesn't work if the IOConsole was started. Then we replace pause() with a warning 66 if _VERSION ~= "Lua 5.0" and not luaState:usingIOConsole() then 67 require("Debugger") 68 else 69 -- Fallback pause function 70 pause = function() 71 logMessage(2, [["Warning: debug() called in Lua, but Debugger is not active. 72 Do you have the IOConsole disabled and are you using Lua version 5.1?"]]) 73 end 74 end 75 76 -- General error handler that gets called whenever an error happens at runtime 77 errorHandler = function(err) 78 -- Display the error message 79 if type(err) == "string" then 80 logMessage(1, "Lua runtime error: "..err) 81 end 82 83 -- Start debugger if possible 84 if _LOADED and _LOADED["Debugger"] ~= nil then 85 pause() 86 else 87 -- Fallback: print stack trace 88 logMessage(1, debug.traceback(2)) 89 end 90 return err -- Hello Lua debugger user! Please type 'set 2' to get to the 91 -- actual position in the stack where the error occurred 92 end 93 55 94 56 95 -- Convenience function for console commands -
code/branches/gamestates2/src/libraries/core/Core.cc
r6595 r6662 78 78 79 79 SetCommandLineArgument(settingsFile, "orxonox.ini").information("THE configuration file"); 80 SetCommandLineSwitch(noIOConsole).information("Use this if you don't want to use the IOConsole (for instance for Lua debugging)"); 80 81 #ifdef ORXONOX_PLATFORM_WINDOWS 81 82 SetCommandLineArgument(limitToCPU, 1).information("Limits the program to one CPU/core (1, 2, 3, etc.). Default is the first core (faster than off)"); … … 88 89 , consoleCommandDestroyer_(CommandExecutor::destroyExternalCommands) 89 90 , bGraphicsLoaded_(false) 91 , bStartIOConsole_(true) 90 92 { 91 93 // Set the hard coded fixed paths … … 149 151 150 152 // create persistent io console 151 this->ioConsole_.reset(new IOConsole()); 153 if (CommandLineParser::getValue("noIOConsole").getBool()) 154 { 155 ModifyConfigValue(bStartIOConsole_, tset, false); 156 } 157 if (this->bStartIOConsole_) 158 this->ioConsole_.reset(new IOConsole()); 152 159 153 160 // creates the class hierarchy for all classes with factories … … 193 200 .description("If true, all random actions are different each time you start the game") 194 201 .callback(this, &Core::initRandomNumberGenerator); 202 SetConfigValue(bStartIOConsole_, true) 203 .description("Set to false if you don't want to use the IOConsole (for Lua debugging for instance)"); 195 204 } 196 205 … … 327 336 } 328 337 // Process console events and status line 329 this->ioConsole_->preUpdate(time); 338 if (this->ioConsole_ != NULL) 339 this->ioConsole_->preUpdate(time); 330 340 // Process thread commands 331 341 this->tclThreadManager_->preUpdate(time); -
code/branches/gamestates2/src/libraries/core/Core.h
r6595 r6662 97 97 scoped_ptr<TclBind> tclBind_; 98 98 scoped_ptr<TclThreadManager> tclThreadManager_; 99 scoped_ptr<Scope<ScopeID::Root> > 99 scoped_ptr<Scope<ScopeID::Root> > rootScope_; 100 100 // graphical 101 101 scoped_ptr<GraphicsManager> graphicsManager_; //!< Interface to OGRE … … 108 108 std::string language_; //!< The language 109 109 bool bInitRandomNumberGenerator_; //!< If true, srand(time(0)) is called 110 bool bStartIOConsole_; //!< Set to false if you don't want to use the IOConsole 110 111 111 112 static Core* singletonPtr_s; -
code/branches/gamestates2/src/libraries/core/GUIManager.cc
r6595 r6662 253 253 } 254 254 255 const std::string& GUIManager::createInputState(const std::string& name, TriBool::Value show Mouse, TriBool::Value useKeyboard, bool bBlockJoyStick)255 const std::string& GUIManager::createInputState(const std::string& name, TriBool::Value showCursor, TriBool::Value useKeyboard, bool bBlockJoyStick) 256 256 { 257 257 InputState* state = InputManager::getInstance().createInputState(name); 258 258 259 if (GraphicsManager::getInstance().isFullScreen() && showMouse == TriBool::True || 260 !GraphicsManager::getInstance().isFullScreen() && showMouse == TriBool::False) 259 /* Table that maps isFullScreen() and showCursor to mouseExclusive 260 isFullscreen / showCursor | True | False | Dontcare 261 ---------------------------------------------------- 262 true | True | True | Dontcare 263 ---------------------------------------------------- 264 false | False | True | Dontcare 265 */ 266 if (showCursor == TriBool::Dontcare) 267 state->setMouseExclusive(TriBool::Dontcare); 268 else if (GraphicsManager::getInstance().isFullScreen() || showCursor == TriBool::False) 261 269 state->setMouseExclusive(TriBool::True); 262 270 else 263 state->setMouseExclusive(TriBool:: Dontcare);264 265 if (show Mouse== TriBool::True)271 state->setMouseExclusive(TriBool::False); 272 273 if (showCursor == TriBool::True) 266 274 state->setMouseHandler(this); 267 else if (show Mouse== TriBool::False)275 else if (showCursor == TriBool::False) 268 276 state->setMouseHandler(&InputHandler::EMPTY); 269 277 -
code/branches/gamestates2/src/libraries/core/GUIManager.h
r6595 r6662 81 81 void setBackground(const std::string& name); 82 82 83 const std::string& createInputState(const std::string& name, TriBool::Value show Mouse= TriBool::True, TriBool::Value useKeyboard = TriBool::True, bool bBlockJoyStick = false); // tolua_export83 const std::string& createInputState(const std::string& name, TriBool::Value showCursor = TriBool::True, TriBool::Value useKeyboard = TriBool::True, bool bBlockJoyStick = false); // tolua_export 84 84 85 85 void setCamera(Ogre::Camera* camera); -
code/branches/gamestates2/src/libraries/core/LuaState.cc
r6417 r6662 37 37 38 38 #include "util/Debug.h" 39 #include "util/Exception.h" 40 #include "util/ScopeGuard.h" 41 #include "IOConsole.h" 39 42 #include "Resource.h" 40 43 #include "ToluaBindCore.h" … … 54 57 // Create new lua state and configure it 55 58 luaState_ = lua_open(); 59 Loki::ScopeGuard luaStateGuard = Loki::MakeGuard(&lua_close, luaState_); 56 60 #if LUA_VERSION_NUM == 501 57 61 luaL_openlibs(luaState_); … … 78 82 79 83 // Parse init script 80 this->doFile("LuaStateInit.lua"); 84 if (!this->doFile("LuaStateInit.lua")) 85 ThrowException(InitialisationFailed, "Running LuaStateInit.lua failed"); 86 87 luaStateGuard.Dismiss(); 81 88 } 82 89 … … 96 103 } 97 104 98 voidLuaState::includeFile(const std::string& filename)105 bool LuaState::includeFile(const std::string& filename) 99 106 { 100 107 shared_ptr<ResourceInfo> sourceInfo = this->getFileInfo(filename); 101 108 if (sourceInfo != NULL) 102 this->includeString(Resource::open(sourceInfo)->getAsString(), sourceInfo); 103 else 104 COUT(2) << "LuaState: Cannot include file '" << filename << "'." << std::endl; 105 } 106 107 void LuaState::includeString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo) 109 return this->includeString(Resource::open(sourceInfo)->getAsString(), sourceInfo); 110 else 111 { 112 COUT(2) << "LuaState: Cannot include file '" << filename << "' (not found)." << std::endl; 113 return false; 114 } 115 } 116 117 bool LuaState::includeString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo) 108 118 { 109 119 // Parse string with provided include parser (otherwise don't preparse at all) … … 114 124 luaInput = code; 115 125 116 this->doString(luaInput, sourceFileInfo); 117 } 118 119 void LuaState::doFile(const std::string& filename) 126 if (sourceFileInfo != NULL) 127 { 128 // Also fill a map with the actual source code. This is just for the include* commands 129 // where the content of sourceFileInfo->filename doesn't match 'code' 130 this->sourceCodeMap_[sourceFileInfo->filename] = code; 131 } 132 133 bool returnValue = this->doString(luaInput, sourceFileInfo); 134 135 if (sourceFileInfo != NULL) 136 { 137 // Delete source code entry 138 if (sourceFileInfo != NULL) 139 this->sourceCodeMap_.erase(sourceFileInfo->filename); 140 } 141 142 return returnValue; 143 } 144 145 bool LuaState::doFile(const std::string& filename) 120 146 { 121 147 shared_ptr<ResourceInfo> sourceInfo = this->getFileInfo(filename); 122 148 if (sourceInfo != NULL) 123 this->doString(Resource::open(sourceInfo)->getAsString(), sourceInfo); 124 else 125 COUT(2) << "LuaState: Cannot do file '" << filename << "'." << std::endl; 126 } 127 128 void LuaState::doString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo) 149 return this->doString(Resource::open(sourceInfo)->getAsString(), sourceInfo); 150 else 151 { 152 COUT(2) << "LuaState: Cannot do file '" << filename << "' (not found)." << std::endl; 153 return false; 154 } 155 } 156 157 bool LuaState::doString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo) 129 158 { 130 159 // Save the old source file info … … 134 163 sourceFileInfo_ = sourceFileInfo; 135 164 136 int error = 0; 165 std::string chunkname; 166 if (sourceFileInfo != NULL) 167 { 168 // Provide lua_load with the filename for debug purposes 169 // The '@' is a Lua convention to identify the chunk name as filename 170 chunkname = '@' + sourceFileInfo->filename; 171 } 172 else 173 { 174 // Use the code string to identify the chunk 175 chunkname = code; 176 } 177 178 // Push custom error handler that uses the debugger 179 int errorHandler = 1; 180 lua_getglobal(this->luaState_, "errorHandler"); 181 if (lua_isnil(this->luaState_, -1)) 182 { 183 lua_pop(this->luaState_, 1); 184 errorHandler = 0; 185 } 186 137 187 #if LUA_VERSION_NUM != 501 138 188 LoadS ls; 139 189 ls.s = code.c_str(); 140 190 ls.size = code.size(); 141 error = lua_load(luaState_, &orxonox::LuaState::lua_Chunkreader, &ls, code.c_str());191 int error = lua_load(luaState_, &orxonox::LuaState::lua_Chunkreader, &ls, chunkname.c_str()); 142 192 #else 143 error = luaL_loadstring(luaState_, code.c_str());193 int error = luaL_loadbuffer(luaState_, code.c_str(), code.size(), chunkname.c_str()); 144 194 #endif 145 195 146 // execute the chunk 196 switch (error) 197 { 198 case LUA_ERRSYNTAX: // Syntax error 199 COUT(1) << "Lua syntax error: " << lua_tostring(luaState_, -1) << std::endl; 200 break; 201 case LUA_ERRMEM: // Memory allocation error 202 COUT(1) << "Lua memory allocation error: Consult your dentist immediately!" << std::endl; 203 lua_pop(luaState_, 1); 204 break; 205 } 206 147 207 if (error == 0) 148 error = lua_pcall(luaState_, 0, 1, 0); 208 { 209 // Execute the chunk in protected mode with an error handler function (stack index) 210 error = lua_pcall(luaState_, 0, 1, errorHandler); 211 212 switch (error) 213 { 214 case LUA_ERRRUN: // Runtime error 215 // Remove error string from stack (we already display the error in the 216 // 'errorHandler' Lua function in LuaStateInit.lua) 217 lua_pop(luaState_, 1); 218 break; 219 case LUA_ERRERR: // Error in the error handler 220 COUT(1) << "Lua error in error handler: " << lua_tostring(luaState_, -1) << std::endl; 221 break; 222 case LUA_ERRMEM: // Memory allocation error 223 COUT(1) << "Lua memory allocation error: Consult your dentist immediately!" << std::endl; 224 lua_pop(luaState_, 1); 225 break; 226 } 227 } 228 149 229 if (error != 0) 150 230 { 151 std::string origin; 152 if (sourceFileInfo != NULL) 153 origin = " originating from " + sourceFileInfo_->filename; 154 COUT(1) << "Error in Lua-script" << origin << ": " << lua_tostring(luaState_, -1) << std::endl; 155 // return value is nil 231 // Push a nil return value 156 232 lua_pushnil(luaState_); 157 233 } 158 // push return value because it will get lost since the return value of this function is void 234 235 // Set return value to a global variable because we cannot return a table in this function 236 // here. It would work for numbers, pointers and strings, but certainly not for Lua tables. 159 237 lua_setglobal(luaState_, "LuaStateReturnValue"); 160 238 161 239 // Load the old info again 162 240 sourceFileInfo_ = oldSourceFileInfo; 241 242 return (error == 0); 163 243 } 164 244 … … 180 260 else 181 261 return true; 262 } 263 264 //! Returns the content of a file 265 std::string LuaState::getSourceCode(const std::string& filename) 266 { 267 // Try the internal map first to get the actual Lua code 268 // and not just some pseudo Lua-XML code when using include* commands 269 std::map<std::string, std::string>::const_iterator it = this->sourceCodeMap_.find(filename); 270 if (it != this->sourceCodeMap_.end()) 271 return it->second; 272 shared_ptr<ResourceInfo> info = Resource::getInfo(filename); 273 if (info == NULL) 274 return ""; 275 else 276 return Resource::open(info)->getAsString(); 277 } 278 279 bool LuaState::usingIOConsole() const 280 { 281 return IOConsole::exists(); 182 282 } 183 283 -
code/branches/gamestates2/src/libraries/core/LuaState.h
r6595 r6662 71 71 ~LuaState(); 72 72 73 voiddoFile(const std::string& filename); // tolua_export74 voiddoString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo = shared_ptr<ResourceInfo>());73 bool doFile(const std::string& filename); // tolua_export 74 bool doString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo = shared_ptr<ResourceInfo>()); 75 75 76 voidincludeFile(const std::string& filename); // tolua_export77 voidincludeString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo = shared_ptr<ResourceInfo>());76 bool includeFile(const std::string& filename); // tolua_export 77 bool includeString(const std::string& code, const shared_ptr<ResourceInfo>& sourceFileInfo = shared_ptr<ResourceInfo>()); 78 78 79 79 void luaPrint(const std::string& str); // tolua_export 80 80 void luaLog(unsigned int level, const std::string& message); // tolua_export 81 81 bool fileExists(const std::string& filename); // tolua_export 82 std::string getSourceCode(const std::string& filename); // tolua_export 82 83 83 84 const std::stringstream& getOutput() const { return output_; } … … 91 92 92 93 Functor* createLuaFunctor(const std::string& code) { return new LuaFunctor(code, this); } // tolua_export 94 //! Tells about whether IOConsole was activated. The Lua debugger only works with a normal console. 95 bool usingIOConsole() const; // tolua_export 93 96 94 97 static bool addToluaInterface(int (*function)(lua_State*), const std::string& name); … … 114 117 bool bIsRunning_; 115 118 shared_ptr<ResourceInfo> sourceFileInfo_; 119 std::map<std::string, std::string> sourceCodeMap_; 116 120 std::string (*includeParseFunction_)(const std::string&); 117 121 -
code/branches/gamestates2/src/libraries/core/Resource.cc
r6501 r6662 29 29 #include "Resource.h" 30 30 31 #include <boost/filesystem/path.hpp> 31 32 #include <OgreException.h> 33 #include <OgreFileSystem.h> 32 34 #include <OgreResourceGroupManager.h> 33 35 … … 89 91 ptr->group = group; 90 92 ptr->size = it->uncompressedSize; 93 if (dynamic_cast<Ogre::FileSystemArchive*>(it->archive) != NULL) 94 { 95 boost::filesystem::path base(it->archive->getName()); 96 base /= it->filename; 97 ptr->fileSystemPath = base.string(); 98 } 91 99 return ptr; 92 100 } -
code/branches/gamestates2/src/libraries/core/Resource.h
r6417 r6662 57 57 //! Uncompressed size 58 58 size_t size; 59 //! Absolute file path ("" for files not on filesystem) 60 std::string fileSystemPath; 59 61 }; 60 62 -
code/branches/gamestates2/src/libraries/core/input/InputDevice.h
r6417 r6662 159 159 for (unsigned int iB = 0; iB < pressedButtons_.size(); ++iB) 160 160 for (unsigned int iS = 0; iS < inputStates_.size(); ++iS) 161 inputStates_[iS]->buttonEvent<ButtonEvent::THold, Traits >(161 inputStates_[iS]->buttonEvent<ButtonEvent::THold, Traits::ButtonTypeParam>( 162 162 this->getDeviceID(), static_cast<DeviceClass*>(this)->getButtonEventArg(pressedButtons_[iB])); 163 163 … … 196 196 // Call states 197 197 for (unsigned int i = 0; i < inputStates_.size(); ++i) 198 inputStates_[i]->buttonEvent<ButtonEvent::TPress, Traits >(this->getDeviceID(), static_cast<DeviceClass*>(this)->getButtonEventArg(button));198 inputStates_[i]->buttonEvent<ButtonEvent::TPress, Traits::ButtonTypeParam>(this->getDeviceID(), static_cast<DeviceClass*>(this)->getButtonEventArg(button)); 199 199 } 200 200 … … 218 218 // Call states 219 219 for (unsigned int i = 0; i < inputStates_.size(); ++i) 220 inputStates_[i]->buttonEvent<ButtonEvent::TRelease, Traits >(this->getDeviceID(), static_cast<DeviceClass*>(this)->getButtonEventArg(button));220 inputStates_[i]->buttonEvent<ButtonEvent::TRelease, Traits::ButtonTypeParam>(this->getDeviceID(), static_cast<DeviceClass*>(this)->getButtonEventArg(button)); 221 221 } 222 222 -
code/branches/gamestates2/src/libraries/core/input/InputHandler.h
r6105 r6662 112 112 virtual ~InputHandler() { } 113 113 114 template<class T> void buttonEvent(unsigned int device, const T&button, ButtonEvent::TPress)114 template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::TPress) 115 115 { this->buttonPressed(button); } 116 template<class T> void buttonEvent(unsigned int device, const T&button, ButtonEvent::TRelease)116 template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::TRelease) 117 117 { this->buttonReleased(button); } 118 template<class T> void buttonEvent(unsigned int device, const T&button, ButtonEvent::THold)118 template<class T> void buttonEvent(unsigned int device, T button, ButtonEvent::THold) 119 119 { this->buttonHeld(button); } 120 void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TPress)120 template<> void buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TPress) 121 121 { this->buttonPressed(device - InputDeviceEnumerator::FirstJoyStick, button); } 122 void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TRelease)122 template<> void buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::TRelease) 123 123 { this->buttonReleased(device - InputDeviceEnumerator::FirstJoyStick, button); } 124 void buttonEvent(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::THold)124 template<> void buttonEvent<JoyStickButtonCode::ByEnum>(unsigned int device, JoyStickButtonCode::ByEnum button, ButtonEvent::THold) 125 125 { this->buttonHeld(device - InputDeviceEnumerator::FirstJoyStick, button); } 126 126 -
code/branches/gamestates2/src/libraries/core/input/InputManager.cc
r6595 r6662 95 95 CCOUT(4) << "Constructing..." << std::endl; 96 96 97 // Allocate space for the function call buffer 98 this->callBuffer_.reserve(16); 99 97 100 this->setConfigValues(); 98 101 … … 266 269 CCOUT(3) << "Destroying..." << std::endl; 267 270 271 // Leave all active InputStates (except "empty") 272 while (this->activeStates_.size() > 1) 273 this->leaveState(this->activeStates_.rbegin()->second->getName()); 274 this->activeStates_.clear(); 275 268 276 // Destroy calibrator helper handler and state 269 277 this->destroyState("calibrator"); 270 278 // Destroy KeyDetector and state 271 279 calibratorCallbackHandler_->destroy(); 272 // destroy the empty InputState280 // Destroy the empty InputState 273 281 this->destroyStateInternal(this->emptyState_); 274 282 275 // destroy all user InputStates283 // Destroy all user InputStates 276 284 while (statesByName_.size() > 0) 277 285 this->destroyStateInternal(statesByName_.rbegin()->second); … … 335 343 void InputManager::reload() 336 344 { 337 if (internalState_ & Ticking) 338 { 339 // We cannot destroy OIS right now, because reload was probably 340 // caused by a user clicking on a GUI item. The stack trace would then 341 // include an OIS method. So it would be a very bad thing to destroy it.. 342 internalState_ |= ReloadRequest; 343 } 344 else if (internalState_ & Calibrating) 345 if (internalState_ & Calibrating) 345 346 CCOUT(2) << "Warning: Cannot reload input system. Joy sticks are currently being calibrated." << std::endl; 346 347 else … … 351 352 void InputManager::reloadInternal() 352 353 { 353 CCOUT( 3) << "Reloading ..." << std::endl;354 CCOUT(4) << "Reloading ..." << std::endl; 354 355 355 356 this->destroyDevices(); … … 357 358 358 359 internalState_ &= ~Bad; 359 internalState_ &= ~ReloadRequest;360 360 CCOUT(4) << "Reloading complete." << std::endl; 361 361 } … … 370 370 if (internalState_ & Bad) 371 371 ThrowException(General, "InputManager was not correctly reloaded."); 372 373 else if (internalState_ & ReloadRequest)374 reloadInternal();375 376 // check for states to leave377 if (!stateLeaveRequests_.empty())378 {379 for (std::set<InputState*>::iterator it = stateLeaveRequests_.begin();380 it != stateLeaveRequests_.end(); ++it)381 {382 (*it)->left();383 // just to be sure that the state actually is registered384 assert(statesByName_.find((*it)->getName()) != statesByName_.end());385 386 activeStates_.erase((*it)->getPriority());387 if ((*it)->getPriority() < InputStatePriority::HighPriority)388 (*it)->setPriority(0);389 updateActiveStates();390 }391 stateLeaveRequests_.clear();392 }393 394 // check for states to enter395 if (!stateEnterRequests_.empty())396 {397 for (std::set<InputState*>::const_iterator it = stateEnterRequests_.begin();398 it != stateEnterRequests_.end(); ++it)399 {400 // just to be sure that the state actually is registered401 assert(statesByName_.find((*it)->getName()) != statesByName_.end());402 403 if ((*it)->getPriority() == 0)404 {405 // Get smallest possible priority between 1 and maxStateStackSize_s406 for (std::map<int, InputState*>::reverse_iterator rit = activeStates_.rbegin();407 rit != activeStates_.rend(); ++rit)408 {409 if (rit->first < InputStatePriority::HighPriority)410 {411 (*it)->setPriority(rit->first + 1);412 break;413 }414 }415 // In case no normal handler was on the stack416 if ((*it)->getPriority() == 0)417 (*it)->setPriority(1);418 }419 activeStates_[(*it)->getPriority()] = (*it);420 updateActiveStates();421 (*it)->entered();422 }423 stateEnterRequests_.clear();424 }425 426 // check for states to destroy427 if (!stateDestroyRequests_.empty())428 {429 for (std::set<InputState*>::iterator it = stateDestroyRequests_.begin();430 it != stateDestroyRequests_.end(); ++it)431 {432 destroyStateInternal((*it));433 }434 stateDestroyRequests_.clear();435 }436 372 437 373 // check whether a state has changed its EMPTY situation … … 448 384 updateActiveStates(); 449 385 450 // mark that we now start capturing and distributing input 451 internalState_ |= Ticking; 452 453 // Capture all the input and handle it 386 // Capture all the input and collect the function calls 387 // No event gets triggered here yet! 454 388 BOOST_FOREACH(InputDevice* device, devices_) 455 389 if (device != NULL) 456 390 device->update(time); 457 391 458 // Update the states392 // Collect functions calls for the update 459 393 for (unsigned int i = 0; i < activeStatesTicked_.size(); ++i) 460 394 activeStatesTicked_[i]->update(time.getDeltaTime()); 461 395 462 internalState_ &= ~Ticking; 396 // Execute all cached function calls in order 397 // Why so complicated? The problem is that an InputHandler could trigger 398 // a reload that would destroy the OIS devices or it could even leave and 399 // then destroy its own InputState. That would of course lead to access 400 // violations. 401 // If we delay the calls, then OIS and and the InputStates are not anymore 402 // in the call stack and can therefore be edited. 403 for (size_t i = 0; i < this->callBuffer_.size(); ++i) 404 this->callBuffer_[i](); 405 406 this->callBuffer_.clear(); 463 407 } 464 408 … … 470 414 void InputManager::updateActiveStates() 471 415 { 472 assert((internalState_ & InputManager::Ticking) == 0);473 416 // temporary resize 474 417 for (unsigned int i = 0; i < devices_.size(); ++i) … … 622 565 // get pointer from the map with all stored handlers 623 566 std::map<std::string, InputState*>::const_iterator it = statesByName_.find(name); 624 if (it != statesByName_.end()) 625 { 626 // exists 627 if (activeStates_.find(it->second->getPriority()) == activeStates_.end()) 628 { 629 // not active 630 if (stateDestroyRequests_.find(it->second) == stateDestroyRequests_.end()) 567 if (it != statesByName_.end() && activeStates_.find(it->second->getPriority()) == activeStates_.end()) 568 { 569 // exists and not active 570 if (it->second->getPriority() == 0) 571 { 572 // Get smallest possible priority between 1 and maxStateStackSize_s 573 for (std::map<int, InputState*>::reverse_iterator rit = activeStates_.rbegin(); 574 rit != activeStates_.rend(); ++rit) 631 575 { 632 // not scheduled for destruction 633 // prevents a state from being added multiple times 634 stateEnterRequests_.insert(it->second); 635 return true; 576 if (rit->first < InputStatePriority::HighPriority) 577 { 578 it->second->setPriority(rit->first + 1); 579 break; 580 } 636 581 } 637 } 638 else if (this->stateLeaveRequests_.find(it->second) != this->stateLeaveRequests_.end()) 639 { 640 // State already scheduled for leaving --> cancel 641 this->stateLeaveRequests_.erase(this->stateLeaveRequests_.find(it->second)); 642 } 582 // In case no normal handler was on the stack 583 if (it->second->getPriority() == 0) 584 it->second->setPriority(1); 585 } 586 activeStates_[it->second->getPriority()] = it->second; 587 updateActiveStates(); 588 it->second->entered(); 589 590 return true; 643 591 } 644 592 return false; … … 654 602 // get pointer from the map with all stored handlers 655 603 std::map<std::string, InputState*>::const_iterator it = statesByName_.find(name); 656 if (it != statesByName_.end()) 657 { 658 // exists 659 if (activeStates_.find(it->second->getPriority()) != activeStates_.end()) 660 { 661 // active 662 stateLeaveRequests_.insert(it->second); 663 return true; 664 } 665 else if (this->stateEnterRequests_.find(it->second) != this->stateEnterRequests_.end()) 666 { 667 // State already scheduled for entering --> cancel 668 this->stateEnterRequests_.erase(this->stateEnterRequests_.find(it->second)); 669 } 604 if (it != statesByName_.end() && activeStates_.find(it->second->getPriority()) != activeStates_.end()) 605 { 606 // exists and active 607 608 it->second->left(); 609 610 activeStates_.erase(it->second->getPriority()); 611 if (it->second->getPriority() < InputStatePriority::HighPriority) 612 it->second->setPriority(0); 613 updateActiveStates(); 614 615 return true; 670 616 } 671 617 return false; … … 682 628 if (it != statesByName_.end()) 683 629 { 684 if (activeStates_.find(it->second->getPriority()) != activeStates_.end()) 685 { 686 // The state is still active. We have to postpone 687 stateLeaveRequests_.insert(it->second); 688 stateDestroyRequests_.insert(it->second); 689 } 690 else if (this->internalState_ & Ticking) 691 { 692 // cannot remove state while ticking 693 stateDestroyRequests_.insert(it->second); 694 } 695 else 696 destroyStateInternal(it->second); 630 this->leaveState(name); 631 destroyStateInternal(it->second); 697 632 698 633 return true; … … 704 639 void InputManager::destroyStateInternal(InputState* state) 705 640 { 706 assert(state && !(this->internalState_ & Ticking)); 707 std::map<int, InputState*>::iterator it = this->activeStates_.find(state->getPriority()); 708 if (it != this->activeStates_.end()) 709 { 710 this->activeStates_.erase(it); 711 updateActiveStates(); 712 } 641 assert(state && this->activeStates_.find(state->getPriority()) == this->activeStates_.end()); 713 642 statesByName_.erase(state->getName()); 714 643 state->destroy(); -
code/branches/gamestates2/src/libraries/core/input/InputManager.h
r6595 r6662 36 36 #include <string> 37 37 #include <vector> 38 #include <boost/function.hpp> 38 39 39 40 #include "util/Singleton.h" 40 41 #include "util/TriBool.h" 41 42 #include "core/WindowEventListener.h" 42 #include "InputState.h"43 43 44 44 // tolua_begin … … 76 76 Nothing = 0x00, 77 77 Bad = 0x02, 78 Ticking = 0x04, 79 Calibrating = 0x08, 80 ReloadRequest = 0x10, 78 Calibrating = 0x04, 81 79 }; 82 80 … … 170 168 //! Returns a pointer to the OIS InputManager. Only you if you know what you're doing! 171 169 OIS::InputManager* getOISInputManager() { return this->oisInputManager_; } 170 //! Returns the position of the cursor as std::pair of ints 172 171 std::pair<int, int> getMousePosition() const; 172 //! Tells whether the mouse is used exclusively to the game 173 bool isMouseExclusive() const { return this->exclusiveMouse_; } // tolua_export 174 175 //------------------------------- 176 // Function call caching 177 //------------------------------- 178 void pushCall(const boost::function<void ()>& function) 179 { this->callBuffer_.push_back(function); } 173 180 174 181 static InputManager& getInstance() { return Singleton<InputManager>::getInstance(); } // tolua_export … … 208 215 std::vector<InputState*> activeStatesTicked_; //!< Like activeStates_, but only contains the ones that currently receive events 209 216 210 std::set<InputState*> stateEnterRequests_; //!< Requests to enter a new state 211 std::set<InputState*> stateLeaveRequests_; //!< Requests to leave a running state 212 std::set<InputState*> stateDestroyRequests_; //!< Requests to destroy a state 217 std::vector<boost::function<void ()> > callBuffer_; //!< Caches all calls from InputStates to be executed afterwards (see preUpdate) 213 218 214 219 static InputManager* singletonPtr_s; //!< Pointer reference to the singleton -
code/branches/gamestates2/src/libraries/core/input/InputPrereqs.h
r6417 r6662 42 42 #include <ois/OISMouse.h> 43 43 #include <ois/OISJoyStick.h> 44 #include "util/OrxEnum.h" 44 45 45 46 namespace orxonox … … 448 449 }; 449 450 } 451 452 //! Enumeration wrapper for input state priorities 453 struct InputStatePriority : OrxEnum<InputStatePriority> 454 { 455 OrxEnumConstructors(InputStatePriority); 456 457 static const int Empty = -1; 458 static const int Dynamic = 0; 459 460 static const int HighPriority = 1000; 461 static const int Console = HighPriority + 0; 462 static const int Calibrator = HighPriority + 1; 463 static const int Detector = HighPriority + 2; 464 }; 450 465 } 451 466 -
code/branches/gamestates2/src/libraries/core/input/InputState.h
r6595 r6662 35 35 #include <string> 36 36 #include <vector> 37 38 #include "util/OrxEnum.h" 37 #include <boost/function.hpp> 38 #include <boost/bind.hpp> 39 39 40 #include "util/TriBool.h" 40 41 #include "InputHandler.h" 42 #include "InputManager.h" 41 43 #include "JoyStickQuantityListener.h" 44 45 #define INPUT_STATE_PUSH_CALL(deviceIndex, functionName, ...) \ 46 InputManager::getInstance().pushCall(boost::function<void ()>(boost::bind(&InputHandler::functionName, handlers_[deviceIndex], __VA_ARGS__))) 42 47 43 48 namespace orxonox 44 49 { 45 //! Enumeration wrapper for input state priorities46 struct InputStatePriority : OrxEnum<InputStatePriority>47 {48 OrxEnumConstructors(InputStatePriority);49 50 static const int Empty = -1;51 static const int Dynamic = 0;52 53 static const int HighPriority = 1000;54 static const int Console = HighPriority + 0;55 static const int Calibrator = HighPriority + 1;56 static const int Detector = HighPriority + 2;57 };58 59 60 50 /** 61 51 @brief … … 144 134 145 135 //! Generic function that distributes all 9 button events 146 template <typename EventType, class Traits>147 void buttonEvent(unsigned int device, const typename Traits::ButtonTypeParam button);136 template <typename EventType, class ButtonTypeParam> 137 void buttonEvent(unsigned int device, ButtonTypeParam button); 148 138 149 139 //! Event handler … … 190 180 for (unsigned int i = 0; i < handlers_.size(); ++i) 191 181 if (handlers_[i] != NULL) 192 handlers_[i]->allDevicesUpdated(dt);182 INPUT_STATE_PUSH_CALL(i, allDevicesUpdated, dt); 193 183 } 194 184 … … 199 189 case InputDeviceEnumerator::Keyboard: 200 190 if (handlers_[keyboardIndex_s] != NULL) 201 handlers_[keyboardIndex_s]->keyboardUpdated(dt);191 INPUT_STATE_PUSH_CALL(keyboardIndex_s, keyboardUpdated, dt); 202 192 break; 203 193 204 194 case InputDeviceEnumerator::Mouse: 205 195 if (handlers_[mouseIndex_s] != NULL) 206 handlers_[mouseIndex_s]->mouseUpdated(dt);196 INPUT_STATE_PUSH_CALL(mouseIndex_s, mouseUpdated, dt); 207 197 break; 208 198 209 199 default: // joy sticks 210 200 if (handlers_[device] != NULL) 211 handlers_[device]->joyStickUpdated(device - firstJoyStickIndex_s, dt);201 INPUT_STATE_PUSH_CALL(device, joyStickUpdated, device - firstJoyStickIndex_s, dt); 212 202 break; 213 203 } 214 204 } 215 205 216 template <typename EventType, class Traits>217 FORCEINLINE void InputState::buttonEvent(unsigned int device, const typename Traits::ButtonTypeParam button)206 template <typename EventType, class ButtonTypeParam> 207 FORCEINLINE void InputState::buttonEvent(unsigned int device, typename ButtonTypeParam button) 218 208 { 219 209 assert(device < handlers_.size()); 220 210 if (handlers_[device] != NULL) 221 handlers_[device]->buttonEvent(device, button, EventType()); 211 { 212 // We have to store the function pointer to tell the compiler about its actual type because of overloading 213 void (InputHandler::*function)(unsigned int, ButtonTypeParam, EventType) = &InputHandler::buttonEvent<ButtonTypeParam>; 214 InputManager::getInstance().pushCall(boost::function<void ()>(boost::bind(function, handlers_[device], device, button, EventType()))); 215 } 222 216 } 223 217 … … 225 219 { 226 220 if (handlers_[mouseIndex_s] != NULL) 227 handlers_[mouseIndex_s]->mouseMoved(abs, rel, clippingSize);221 INPUT_STATE_PUSH_CALL(mouseIndex_s, mouseMoved, abs, rel, clippingSize); 228 222 } 229 223 … … 231 225 { 232 226 if (handlers_[mouseIndex_s] != NULL) 233 handlers_[mouseIndex_s]->mouseScrolled(abs, rel);227 INPUT_STATE_PUSH_CALL(mouseIndex_s, mouseScrolled, abs, rel); 234 228 } 235 229 … … 238 232 assert(device < handlers_.size()); 239 233 if (handlers_[device] != NULL) 240 handlers_[device]->axisMoved(device - firstJoyStickIndex_s, axis, value);234 INPUT_STATE_PUSH_CALL(device, axisMoved, device - firstJoyStickIndex_s, axis, value); 241 235 } 242 236 } -
code/branches/gamestates2/src/libraries/util/Singleton.h
r6536 r6662 49 49 public: 50 50 //! Returns a reference to the singleton instance 51 static T& getInstance()51 FORCEINLINE static T& getInstance() 52 52 { 53 53 assert(T::singletonPtr_s != NULL); … … 56 56 57 57 //! Tells whether the singleton has been created 58 static bool exists()58 FORCEINLINE static bool exists() 59 59 { 60 60 return (T::singletonPtr_s != NULL); … … 62 62 63 63 //! Update method called by ClassSingletonManager (if used) 64 void preUpdateSingleton(const Clock& time) { static_cast<T*>(T::singletonPtr_s)->preUpdate(time); }64 FORCEINLINE void preUpdateSingleton(const Clock& time) { static_cast<T*>(T::singletonPtr_s)->preUpdate(time); } 65 65 //! Empty update method for the static polymorphism 66 void preUpdate(const Clock& time) { }66 FORCEINLINE void preUpdate(const Clock& time) { } 67 67 //! Update method called by ClassSingletonManager (if used) 68 void postUpdateSingleton(const Clock& time) { static_cast<T*>(T::singletonPtr_s)->postUpdate(time); }68 FORCEINLINE void postUpdateSingleton(const Clock& time) { static_cast<T*>(T::singletonPtr_s)->postUpdate(time); } 69 69 //! Empty update method for the static polymorphism 70 void postUpdate(const Clock& time) { }70 FORCEINLINE void postUpdate(const Clock& time) { } 71 71 72 72 protected:
Note: See TracChangeset
for help on using the changeset viewer.