Browse Source

Added Renderer::setWindowTitle().
Added accelerator key support to menus.
UI bugfixes.
Changed binary scene extension to bin.

Lasse Öörni 15 years ago
parent
commit
e43c591f6e

+ 1 - 0
Bin/CoreData/Scripts/Editor.as

@@ -21,6 +21,7 @@ void start()
     createScene();
     createCamera();
     createUI();
+    updateWindowTitle();
     parseArguments();
 }
 

+ 1 - 4
Bin/CoreData/Scripts/EditorCamera.as

@@ -5,7 +5,6 @@ Camera@ camera;
 float cameraBaseSpeed = 10.0;
 float cameraBaseRotationSpeed = 0.2;
 float cameraShiftSpeedMultiplier = 5.0;
-float cameraCtrlSpeedMultiplier = 0.1;
 float cameraYaw = 0.0;
 float cameraPitch = 0.0;
 
@@ -19,13 +18,11 @@ void createCamera()
 
 void moveCamera(float timeStep)
 {
-    if (ui.getFocusElement() is null)
+    if ((ui.getFocusElement() is null) && (!input.getKeyDown(KEY_CTRL)))
     {
         float speedMultiplier = 1.0f;
         if (input.getKeyDown(KEY_SHIFT))
             speedMultiplier = cameraShiftSpeedMultiplier;
-        if (input.getKeyDown(KEY_CTRL))
-            speedMultiplier = cameraCtrlSpeedMultiplier;
 
         if ((input.getKeyDown('W')) || (input.getKeyDown(KEY_UP)))
             camera.translateRelative(Vector3(0, 0, cameraBaseSpeed) * timeStep * speedMultiplier);

+ 24 - 3
Bin/CoreData/Scripts/EditorScene.as

@@ -3,6 +3,7 @@
 Scene@ editorScene;
 string sceneFileName;
 string sceneResourcePath;
+bool sceneUnsaved = false;
 
 void createScene()
 {
@@ -41,10 +42,30 @@ void loadScene(string fileName)
     setResourcePath(getPath(fileName));
 
     File file(fileName, FILE_READ);
-    if (getExtension(fileName) == ".xml")
-        editorScene.loadXML(file);
-    else
+    string extension = getExtension(fileName);
+    if ((extension == ".bin") || (extension == ".sav"))
         editorScene.load(file);
+    else
+        editorScene.loadXML(file);
         
     sceneFileName = fileName;
+    sceneUnsaved = false;
+    updateWindowTitle();
+}
+
+void saveScene(string fileName)
+{
+    if ((fileName.empty()) || (getFileName(fileName).empty()))
+        return;
+
+    File file(fileName, FILE_WRITE);
+    string extension = getExtension(fileName);
+    if ((extension == ".bin") || (extension == ".sav"))
+        editorScene.save(file);
+    else
+        editorScene.saveXML(file);
+
+    sceneFileName = fileName;
+    sceneUnsaved = false;
+    updateWindowTitle();
 }

+ 54 - 12
Bin/CoreData/Scripts/EditorUI.as

@@ -7,7 +7,7 @@ XMLFile@ uiStyle;
 UIElement@ uiMenuBar;
 FileSelector@ uiFileSelector;
 
-array<string> uiSceneFilters = {"*.xml", "*.scn", "*.*"};
+array<string> uiSceneFilters = {"*.xml", "*.bin", "*.sav", "*.*"};
 uint uiSceneFilter = 0;
 
 void createUI()
@@ -39,11 +39,11 @@ void createMenuBar(XMLFile@ uiStyle)
     {
         Menu@ fileMenu = createMenu(uiStyle, "File");
         Window@ filePopup = fileMenu.getPopup();
-        filePopup.addChild(createMenuItem(uiStyle, "Load scene"));
-        filePopup.addChild(createMenuItem(uiStyle, "Save scene"));
-        filePopup.addChild(createMenuItem(uiStyle, "Save scene as"));
+        filePopup.addChild(createMenuItem(uiStyle, "Open scene", 'O', QUAL_CTRL));
+        filePopup.addChild(createMenuItem(uiStyle, "Save scene", 'S', QUAL_CTRL));
+        filePopup.addChild(createMenuItem(uiStyle, "Save scene as", 'S', QUAL_SHIFT | QUAL_CTRL));
         filePopup.addChild(createMenuSpacer(uiStyle));
-        filePopup.addChild(createMenuItem(uiStyle, "Exit"));
+        filePopup.addChild(createMenuItem(uiStyle, "Exit", 'X', QUAL_CTRL));
         uiMenuBar.addChild(fileMenu);
     }
 
@@ -53,11 +53,13 @@ void createMenuBar(XMLFile@ uiStyle)
     resizeUI();
 }
 
-Menu@ createMenuItem(XMLFile@ uiStyle, string title)
+Menu@ createMenuItem(XMLFile@ uiStyle, string title, int accelKey, int accelQual)
 {
     Menu@ menu = Menu(title);
     menu.setStyleAuto(uiStyle);
     menu.setLayout(LM_HORIZONTAL, 0, IntRect(uiSpacing, 0, uiSpacing, 0));
+    if (accelKey != 0)
+        menu.setAccelerator(accelKey, accelQual);
 
     Text@ menuText = Text(title + "_Text");
     menuText.setStyle(uiStyle, "EditorMenuText");
@@ -92,7 +94,7 @@ Window@ createPopup(XMLFile@ uiStyle, Menu@ baseMenu)
 
 Menu@ createMenu(XMLFile@ uiStyle, string title)
 {
-    Menu@ menu = createMenuItem(uiStyle, title);
+    Menu@ menu = createMenuItem(uiStyle, title, 0, 0);
     menu.setFixedWidth(menu.getWidth());
     createPopup(uiStyle, menu);
 
@@ -126,16 +128,42 @@ void resizeUI()
     uiMenuBar.setFixedWidth(renderer.getWidth());
 }
 
+void updateWindowTitle()
+{
+    string sceneName = sceneFileName.empty() ? "Untitled" : getFileNameAndExtension(sceneFileName);
+    if (sceneUnsaved)
+        sceneName += "*";
+    renderer.setWindowTitle("Urho3D editor - " + sceneName);
+}
+
 void handleMenuSelected(StringHash eventType, VariantMap& eventData)
 {
     Menu@ menu = eventData["Element"].getUIElement();
     if (menu is null)
         return;
 
-    if ((menu.getName() == "Load scene") && (uiFileSelector is null))
+    string action = menu.getName();
+
+    if (uiFileSelector is null)
     {
-        createFileSelector("Load scene", "Load", "Cancel", getPath(sceneFileName), uiSceneFilters, uiSceneFilter);
-        subscribeToEvent(uiFileSelector, "FileSelected", "handleLoadSceneFile");
+        if (action == "Open scene")
+        {
+            createFileSelector("Open scene", "Open", "Cancel", getPath(sceneFileName), uiSceneFilters, uiSceneFilter);
+            subscribeToEvent(uiFileSelector, "FileSelected", "handleOpenSceneFile");
+        }
+
+        if (action == "Save scene")
+        {
+            saveScene(sceneFileName);
+            ui.setFocusElement(null); // Close the menu
+        }
+
+        if (action == "Save scene as")
+        {
+            createFileSelector("Save scene as", "Save", "Cancel", getPath(sceneFileName), uiSceneFilters, uiSceneFilter);
+            uiFileSelector.setFileName(getFileNameAndExtension(sceneFileName));
+            subscribeToEvent(uiFileSelector, "FileSelected", "handleSaveSceneFile");
+        }
     }
 
     if (menu.getName() == "Exit")
@@ -147,7 +175,7 @@ void handleScreenMode(StringHash eventType, VariantMap& eventData)
     resizeUI();
 }
 
-void handleLoadSceneFile(StringHash eventType, VariantMap& eventData)
+void handleOpenSceneFile(StringHash eventType, VariantMap& eventData)
 {
     // Save filter for next time
     uiSceneFilter = uiFileSelector.getFilterIndex();
@@ -159,4 +187,18 @@ void handleLoadSceneFile(StringHash eventType, VariantMap& eventData)
 
     string fileName = eventData["FileName"].getString();
     loadScene(fileName);
-}
+}
+
+void handleSaveSceneFile(StringHash eventType, VariantMap& eventData)
+{
+    // Save filter for next time
+    uiSceneFilter = uiFileSelector.getFilterIndex();
+    closeFileSelector();
+
+    // Check for cancel
+    if (!eventData["OK"].getBool())
+        return;
+
+    string fileName = eventData["FileName"].getString();
+    saveScene(fileName);
+}

+ 62 - 62
Bin/Data/GraphicsTestScene.xml

@@ -1,6 +1,6 @@
 <scene name="GraphicsTest">
     <interpolation predictiontime="2" constant="50" snapthreshold="1" />
-    <physics gravity="0 -9.81 0" fps="100" timeacc="0" randomseed="0">
+    <physics gravity="0 -9.81 0" fps="100" timeacc="0.00700104" randomseed="0">
         <contacts max="20" bouncethreshold="0.1" erp="0.2" cfm="1e-005" surfacelayer="0.001" />
         <linear restthreshold="0.1" dampingthreshold="0.01" dampingscale="0" />
         <angular restthreshold="0.1" dampingthreshold="0.01" dampingscale="0" maxnetvelocity="256" />
@@ -2226,7 +2226,7 @@
             <instance pos="-8.46802 0 -8.41309" rot="-0.428508 0 0.903538 0" scale="2.63995 2.63995 2.63995" />
             <instance pos="-1.03516 0 0.901489" rot="0.282109 0 0.959382 0" scale="1.59747 1.59747 1.59747" />
             <instance pos="0.0238037 0 -0.689087" rot="0.887198 0 0.46139 0" scale="1.64606 1.64606 1.64606" />
-            <instance pos="-3.72253 0 4.75952" rot="-0.855354 0 0.518045 0" scale="2.91809 2.91809 2.91809" />
+            <instance pos="-3.72253 0 4.75952" rot="-0.855353 0 0.518045 0" scale="2.91809 2.91809 2.91809" />
             <instance pos="4.50012 0 7.46643" rot="0.587661 0 0.809107 0" scale="2.88794 2.88794 2.88794" />
             <instance pos="-8.6853 0 -7.45544" rot="-0.780318 0 0.625383 0" scale="2.04913 2.04913 2.04913" />
             <instance pos="9.1217 0 2.19238" rot="0.974339 0 0.225084 0" scale="2.75122 2.75122 2.75122" />
@@ -2234,10 +2234,10 @@
             <instance pos="-4.19434 0 -5.45837" rot="-0.968546 0 0.248835 0" scale="2.10229 2.10229 2.10229" />
             <instance pos="-7.70935 0 3.25562" rot="0.0234869 0 0.999724 0" scale="1.75824 1.75824 1.75824" />
             <instance pos="5.8667 0 -0.0640869" rot="-0.0290457 0 0.999578 0" scale="1.76471 1.76471 1.76471" />
-            <instance pos="0.6427 0 3.76282" rot="-0.327666 0 0.944793 0" scale="1.79034 1.79034 1.79034" />
+            <instance pos="0.6427 0 3.76282" rot="-0.327666 0 0.944794 0" scale="1.79034 1.79034 1.79034" />
             <instance pos="4.1571 0 -9.8822" rot="0.950456 0 0.310858 0" scale="2.24609 2.24609 2.24609" />
             <instance pos="-0.170288 0 7.2644" rot="-0.701116 0 0.713047 0" scale="1.99377 1.99377 1.99377" />
-            <instance pos="5.70679 0 -2.39807" rot="-0.165102 0 0.986276 0" scale="1.71417 1.71417 1.71417" />
+            <instance pos="5.70679 0 -2.39807" rot="-0.165102 0 0.986277 0" scale="1.71417 1.71417 1.71417" />
             <instance pos="2.61658 0 9.11377" rot="0.850045 0 0.52671 0" scale="1.74847 1.74847 1.74847" />
             <instance pos="4.86511 0 -7.36755" rot="-0.988505 0 0.151186 0" scale="2.22394 2.22394 2.22394" />
             <instance pos="-3.40332 0 -9.44336" rot="0.984615 0 0.174739 0" scale="2.27838 2.27838 2.27838" />
@@ -2305,7 +2305,7 @@
             <instance pos="4.16992 0 2.54639" rot="0.987874 0 0.15526 0" scale="1.57111 1.57111 1.57111" />
             <instance pos="-1.84753 0 -4.79614" rot="-0.946384 0 0.323043 0" scale="2.42035 2.42035 2.42035" />
             <instance pos="7.92053 0 4.56848" rot="0.32821 0 0.944605 0" scale="1.7948 1.7948 1.7948" />
-            <instance pos="-3.82813 0 8.07678" rot="0.344371 0 0.938833 0" scale="2.14111 2.14111 2.14111" />
+            <instance pos="-3.82813 0 8.07678" rot="0.344371 0 0.938834 0" scale="2.14111 2.14111 2.14111" />
             <instance pos="4.67346 0 -2.92908" rot="-0.696659 0 0.717403 0" scale="2.47272 2.47272 2.47272" />
             <instance pos="-7.21375 0 4.78821" rot="0.808713 0 0.588204 0" scale="1.54517 1.54517 1.54517" />
             <instance pos="8.22205 0 3.6084" rot="0.4034 0 0.915024 0" scale="2.03528 2.03528 2.03528" />
@@ -2339,7 +2339,7 @@
             <instance pos="4.54529 0 -1.96228" rot="-0.343381 0 0.939196 0" scale="2.6167 2.6167 2.6167" />
             <instance pos="1.65161 0 7.50793" rot="-0.294044 0 0.955792 0" scale="1.15802 1.15802 1.15802" />
             <instance pos="-0.756226 0 5.86304" rot="-0.280821 0 0.95976 0" scale="2.17883 2.17883 2.17883" />
-            <instance pos="6.3208 0 1.38367" rot="-0.516403 0 0.856345 0" scale="1.68713 1.68713 1.68713" />
+            <instance pos="6.3208 0 1.38367" rot="-0.516403 0 0.856346 0" scale="1.68713 1.68713 1.68713" />
             <instance pos="-4.65393 0 -9.79553" rot="0.477473 0 0.878646 0" scale="1.46417 1.46417 1.46417" />
             <instance pos="-2.56531 0 5.41992" rot="-0.917558 0 0.397602 0" scale="1.2337 1.2337 1.2337" />
             <instance pos="2.57813 0 4.51111" rot="-0.944982 0 0.327123 0" scale="1.36603 1.36603 1.36603" />
@@ -2365,7 +2365,7 @@
             <instance pos="7.0105 0 7.28394" rot="0.605435 0 0.795895 0" scale="2.7287 2.7287 2.7287" />
             <instance pos="4.93652 0 2.89795" rot="-0.858516 0 0.512786 0" scale="2.53119 2.53119 2.53119" />
             <instance pos="8.16589 0 7.43774" rot="-0.96246 0 0.271422 0" scale="2.04388 2.04388 2.04388" />
-            <instance pos="-7.84729 0 -1.1969" rot="0.442747 0 0.896646 0" scale="2.64606 2.64606 2.64606" />
+            <instance pos="-7.84729 0 -1.1969" rot="0.442747 0 0.896647 0" scale="2.64606 2.64606 2.64606" />
             <instance pos="-6.60339 0 -1.44592" rot="0.999996 0 0.00268446 0" scale="2.31488 2.31488 2.31488" />
             <instance pos="-8.72559 0 5.47058" rot="0.960457 0 0.278428 0" scale="1.7713 1.7713 1.7713" />
             <instance pos="6.15173 0 3.67737" rot="0.88511 0 0.465383 0" scale="1.28571 1.28571 1.28571" />
@@ -2392,7 +2392,7 @@
             <instance pos="4.24683 0 0.964355" rot="0.714994 0 0.699131 0" scale="2.09332 2.09332 2.09332" />
             <instance pos="9.04053 0 -0.147705" rot="-0.5085 0 0.861062 0" scale="2.53027 2.53027 2.53027" />
             <instance pos="-1.08521 0 2.46704" rot="-0.806678 0 0.590992 0" scale="2.49103 2.49103 2.49103" />
-            <instance pos="-5.90759 0 9.77783" rot="-0.395578 0 0.918433 0" scale="2.81958 2.81958 2.81958" />
+            <instance pos="-5.90759 0 9.77783" rot="-0.395578 0 0.918432 0" scale="2.81958 2.81958 2.81958" />
             <instance pos="8.36731 0 1.82556" rot="-0.0173522 0 0.999849 0" scale="1.97876 1.97876 1.97876" />
             <instance pos="7.78625 0 -1.00586" rot="-0.982504 0 0.186243 0" scale="1.36584 1.36584 1.36584" />
             <instance pos="-5.93994 0 -4.96094" rot="-0.662416 0 0.749136 0" scale="2.8822 2.8822 2.8822" />
@@ -2400,7 +2400,7 @@
             <instance pos="0.889282 0 1.12671" rot="0.167844 0 0.985814 0" scale="1.12274 1.12274 1.12274" />
             <instance pos="-7.44507 0 9.92004" rot="-0.311678 0 0.950188 0" scale="1.10071 1.10071 1.10071" />
             <instance pos="3.20435 0 -6.54419" rot="0.502461 0 0.8646 0" scale="1.6319 1.6319 1.6319" />
-            <instance pos="-1.78955 0 3.07129" rot="0.225831 0 0.974166 0" scale="1.44324 1.44324 1.44324" />
+            <instance pos="-1.78955 0 3.07129" rot="0.225831 0 0.974167 0" scale="1.44324 1.44324 1.44324" />
             <instance pos="-6.67114 0 3.56995" rot="0.00776577 0 0.99997 0" scale="2.01526 2.01526 2.01526" />
             <instance pos="-1.29883 0 6.05408" rot="0.999899 0 0.0141888 0" scale="1.67896 1.67896 1.67896" />
             <instance pos="-7.42859 0 -2.4823" rot="-0.856395 0 0.516321 0" scale="2.46655 2.46655 2.46655" />
@@ -2413,7 +2413,7 @@
             <instance pos="2.36511 0 -7.63306" rot="-0.248928 0 0.968522 0" scale="2.38055 2.38055 2.38055" />
             <instance pos="8.31238 0 4.63074" rot="-0.508252 0 0.861208 0" scale="1.59698 1.59698 1.59698" />
             <instance pos="-2.43652 0 6.17676" rot="-0.999968 0 0.00795753 0" scale="2.54498 2.54498 2.54498" />
-            <instance pos="-6.58875 0 -5.91187" rot="0.343921 0 0.938998 0" scale="1.36243 1.36243 1.36243" />
+            <instance pos="-6.58875 0 -5.91187" rot="0.343921 0 0.938999 0" scale="1.36243 1.36243 1.36243" />
             <instance pos="-6.08765 0 1.61926" rot="-0.992159 0 0.124979 0" scale="1.38049 1.38049 1.38049" />
             <instance pos="-3.92029 0 -2.36572" rot="0.928826 0 0.370516 0" scale="1.3963 1.3963 1.3963" />
             <instance pos="5.42297 0 -9.07532" rot="-0.731152 0 0.682215 0" scale="2.76202 2.76202 2.76202" />
@@ -2520,7 +2520,7 @@
             <instance pos="0.79834 0 -3.06213" rot="-0.495149 0 0.868808 0" scale="2.74146 2.74146 2.74146" />
             <instance pos="8.90503 0 8.6499" rot="0.945888 0 0.324494 0" scale="1.30646 1.30646 1.30646" />
             <instance pos="6.00464 0 1.15906" rot="-0.946198 0 0.323587 0" scale="1.14502 1.14502 1.14502" />
-            <instance pos="6.44775 0 7.44568" rot="0.343831 0 0.939031 0" scale="2.09753 2.09753 2.09753" />
+            <instance pos="6.44775 0 7.44568" rot="0.343831 0 0.939032 0" scale="2.09753 2.09753 2.09753" />
             <instance pos="-0.981445 0 3.43872" rot="0.634097 0 0.773254 0" scale="2.89886 2.89886 2.89886" />
             <instance pos="4.56055 0 9.64233" rot="-0.293402 0 0.955989 0" scale="1.54474 1.54474 1.54474" />
             <instance pos="-6.04126 0 -7.36084" rot="-0.310494 0 0.950575 0" scale="1.97467 1.97467 1.97467" />
@@ -2544,7 +2544,7 @@
             <instance pos="-3.98193 0 -5.59753" rot="-0.784021 0 0.620734 0" scale="2.29919 2.29919 2.29919" />
             <instance pos="-4.74487 0 -8.32642" rot="0.909487 0 0.415732 0" scale="1.43506 1.43506 1.43506" />
             <instance pos="-6.43494 0 1.25122" rot="-0.403663 0 0.914908 0" scale="1.21381 1.21381 1.21381" />
-            <instance pos="5.17639 0 -0.925903" rot="0.498726 0 0.866759 0" scale="1.11481 1.11481 1.11481" />
+            <instance pos="5.17639 0 -0.925903" rot="0.498726 0 0.86676 0" scale="1.11481 1.11481 1.11481" />
             <instance pos="3.8855 0 -4.34998" rot="-0.921737 0 0.387815 0" scale="2.13513 2.13513 2.13513" />
             <instance pos="-8.37585 0 7.36938" rot="-0.8004 0 0.599466 0" scale="2.99927 2.99927 2.99927" />
             <instance pos="2.37671 0 2.69958" rot="-0.293311 0 0.956017 0" scale="2.18622 2.18622 2.18622" />
@@ -2554,7 +2554,7 @@
             <instance pos="-8.94104 0 -5.87036" rot="-0.322589 0 0.946539 0" scale="1.70795 1.70795 1.70795" />
             <instance pos="3.36182 0 -2.77527" rot="-0.997162 0 0.0752856 0" scale="1.44727 1.44727 1.44727" />
             <instance pos="-3.06091 0 7.91504" rot="-0.989345 0 0.145592 0" scale="2.3302 2.3302 2.3302" />
-            <instance pos="-4.35303 0 -5.9668" rot="0.438702 0 0.898632 0" scale="2.06396 2.06396 2.06396" />
+            <instance pos="-4.35303 0 -5.9668" rot="0.438702 0 0.898633 0" scale="2.06396 2.06396 2.06396" />
         </component>
     </entity>
     <entity id="134" netflags="0" netdistance="0" groupflags="0">
@@ -2572,7 +2572,7 @@
             <instance pos="-3.90259 0 2.11792" rot="-0.778877 0 0.627177 0" scale="1.30023 1.30023 1.30023" />
             <instance pos="3.78052 0 0.852051" rot="0.325038 0 0.945701 0" scale="2.98633 2.98633 2.98633" />
             <instance pos="-1.76819 0 -7.96143" rot="0.996288 0 0.0860839 0" scale="2.37482 2.37482 2.37482" />
-            <instance pos="-6.61987 0 -4.82239" rot="0.752934 0 0.658095 0" scale="1.37799 1.37799 1.37799" />
+            <instance pos="-6.61987 0 -4.82239" rot="0.752935 0 0.658095 0" scale="1.37799 1.37799 1.37799" />
             <instance pos="5.2655 0 7.24365" rot="0.988836 0 0.149006 0" scale="1.96643 1.96643 1.96643" />
             <instance pos="9.22424 0 -8.87695" rot="0.964565 0 0.263847 0" scale="2.13092 2.13092 2.13092" />
             <instance pos="1.47766 0 9.25049" rot="-0.928185 0 0.372118 0" scale="1.81738 1.81738 1.81738" />
@@ -2589,7 +2589,7 @@
             <instance pos="2.16553 0 -1.62842" rot="-0.763931 0 0.645298 0" scale="1.1673 1.1673 1.1673" />
             <instance pos="-5.84167 0 -6.97632" rot="0.96259 0 0.270961 0" scale="1.63452 1.63452 1.63452" />
             <instance pos="2.5824 0 -0.563965" rot="0.501549 0 0.865129 0" scale="1.15863 1.15863 1.15863" />
-            <instance pos="-7.14355 0 2.29004" rot="0.635726 0 0.771914 0" scale="2.6499 2.6499 2.6499" />
+            <instance pos="-7.14355 0 2.29004" rot="0.635726 0 0.771915 0" scale="2.6499 2.6499 2.6499" />
             <instance pos="9.8877 0 -1.21887" rot="0.768613 0 0.639714 0" scale="1.21466 1.21466 1.21466" />
             <instance pos="-4.70825 0 0.379639" rot="0.999733 0 0.0231035 0" scale="2.15247 2.15247 2.15247" />
             <instance pos="-7.84973 0 5.41077" rot="-0.995315 0 0.0966814 0" scale="1.73883 1.73883 1.73883" />
@@ -2664,7 +2664,7 @@
             <instance pos="-7.13562 0 -3.73291" rot="-0.329387 0 0.944195 0" scale="1.02057 1.02057 1.02057" />
             <instance pos="0.744629 0 9.11072" rot="0.347969 0 0.937506 0" scale="1.02478 1.02478 1.02478" />
             <instance pos="7.71362 0 -5.25879" rot="-0.286337 0 0.958129 0" scale="1.30518 1.30518 1.30518" />
-            <instance pos="0.703735 0 -9.66919" rot="-0.965942 0 0.258757 0" scale="2.30542 2.30542 2.30542" />
+            <instance pos="0.703735 0 -9.66919" rot="-0.965943 0 0.258757 0" scale="2.30542 2.30542 2.30542" />
             <instance pos="-1.88904 0 -5.51086" rot="-0.99423 0 0.107268 0" scale="1.19415 1.19415 1.19415" />
             <instance pos="0.12207 0 -2.00867" rot="0.494649 0 0.869093 0" scale="1.6568 1.6568 1.6568" />
             <instance pos="-4.98474 0 2.50793" rot="0.613037 0 0.790054 0" scale="2.06702 2.06702 2.06702" />
@@ -2704,7 +2704,7 @@
             <instance pos="6.7041 0 5.88013" rot="-0.646542 0 0.762879 0" scale="1.5929 1.5929 1.5929" />
             <instance pos="-1.88843 0 0.772705" rot="0.949317 0 0.314319 0" scale="1.77875 1.77875 1.77875" />
             <instance pos="3.36365 0 -8.0658" rot="0.873515 0 0.486797 0" scale="2.38184 2.38184 2.38184" />
-            <instance pos="4.7699 0 3.41492" rot="-0.938965 0 0.344011 0" scale="2.51312 2.51312 2.51312" />
+            <instance pos="4.7699 0 3.41492" rot="-0.938966 0 0.344011 0" scale="2.51312 2.51312 2.51312" />
             <instance pos="-4.70154 0 1.38977" rot="0.939328 0 0.343021 0" scale="1.53424 1.53424 1.53424" />
             <instance pos="9.54895 0 4.66858" rot="0.0380527 0 0.999276 0" scale="1.42981 1.42981 1.42981" />
             <instance pos="2.25769 0 6.02356" rot="0.458154 0 0.888873 0" scale="1.96521 1.96521 1.96521" />
@@ -2730,7 +2730,7 @@
             <instance pos="-9.69788 0 1.35864" rot="-0.0342203 0 0.999414 0" scale="1.91687 1.91687 1.91687" />
             <instance pos="7.79236 0 9.4165" rot="-0.593773 0 0.804633 0" scale="1.49164 1.49164 1.49164" />
             <instance pos="-4.66675 0 -7.92908" rot="0.105742 0 0.994394 0" scale="2.2135 2.2135 2.2135" />
-            <instance pos="-2.27661 0 -9.01855" rot="0.933612 0 0.358284 0" scale="2.99628 2.99628 2.99628" />
+            <instance pos="-2.27661 0 -9.01855" rot="0.933613 0 0.358284 0" scale="2.99628 2.99628 2.99628" />
             <instance pos="-9.18335 0 4.79797" rot="0.999905 0 0.0138054 0" scale="2.36047 2.36047 2.36047" />
             <instance pos="4.13208 0 9.12781" rot="-0.709002 0 0.705206 0" scale="1.28217 1.28217 1.28217" />
             <instance pos="2.25464 0 3.56506" rot="-0.489892 0 0.871783 0" scale="2.95197 2.95197 2.95197" />
@@ -2746,14 +2746,14 @@
             <material index="0" name="Materials/Mushroom.xml" />
             <instances relative="true" count="50" />
             <instance pos="7.9718 0 -6.95618" rot="-0.230032 0 0.973183 0" scale="1.52588 1.52588 1.52588" />
-            <instance pos="2.50549 0 -6.49048" rot="-0.867523 0 0.497396 0" scale="2.34052 2.34052 2.34052" />
+            <instance pos="2.50549 0 -6.49048" rot="-0.867524 0 0.497396 0" scale="2.34052 2.34052 2.34052" />
             <instance pos="-1.02966 0 7.17224" rot="-0.998564 0 0.0535679 0" scale="2.32019 2.32019 2.32019" />
             <instance pos="-8.83545 0 4.1748" rot="-0.83744 0 0.54653 0" scale="2.49377 2.49377 2.49377" />
             <instance pos="6.70654 0 9.48242" rot="0.551338 0 0.834282 0" scale="1.23529 1.23529 1.23529" />
             <instance pos="-4.16443 0 -5.88989" rot="-0.98656 0 0.1634 0" scale="2.68494 2.68494 2.68494" />
             <instance pos="-5.68176 0 -5.00488" rot="-0.912884 0 0.408219 0" scale="1.86176 1.86176 1.86176" />
             <instance pos="8.57422 0 -5.88562" rot="-0.71439 0 0.699747 0" scale="1.77997 1.77997 1.77997" />
-            <instance pos="1.15906 0 -2.50549" rot="-0.399185 0 0.916871 0" scale="2.88208 2.88208 2.88208" />
+            <instance pos="1.15906 0 -2.50549" rot="-0.399185 0 0.91687 0" scale="2.88208 2.88208 2.88208" />
             <instance pos="4.72046 0 4.72473" rot="0.342571 0 0.939492 0" scale="2.10034 2.10034 2.10034" />
             <instance pos="2.5592 0 9.60388" rot="0.515336 0 0.856988 0" scale="1.86005 1.86005 1.86005" />
             <instance pos="3.91296 0 2.54639" rot="0.0310582 0 0.999518 0" scale="2.33673 2.33673 2.33673" />
@@ -2777,10 +2777,10 @@
             <instance pos="-3.05298 0 2.13196" rot="-0.811579 0 0.584243 0" scale="2.65948 2.65948 2.65948" />
             <instance pos="-1.53198 0 6.29944" rot="0.967585 0 0.252547 0" scale="2.26477 2.26477 2.26477" />
             <instance pos="3.77319 0 9.65027" rot="0.00230093 0 0.999997 0" scale="1.36853 1.36853 1.36853" />
-            <instance pos="-5.23254 0 1.34521" rot="-0.907443 0 0.420174 0" scale="1.57782 1.57782 1.57782" />
+            <instance pos="-5.23254 0 1.34521" rot="-0.907444 0 0.420174 0" scale="1.57782 1.57782 1.57782" />
             <instance pos="6.39832 0 9.79065" rot="0.301549 0 0.953451 0" scale="1.64343 1.64343 1.64343" />
             <instance pos="3.15125 0 -2.02698" rot="-0.976494 0 0.215545 0" scale="2.80768 2.80768 2.80768" />
-            <instance pos="5.27283 0 -4.44641" rot="-0.0806381 0 0.996743 0" scale="2.90448 2.90448 2.90448" />
+            <instance pos="5.27283 0 -4.44641" rot="-0.0806381 0 0.996744 0" scale="2.90448 2.90448 2.90448" />
             <instance pos="2.84851 0 8.33984" rot="0.988693 0 0.149954 0" scale="1.5271 1.5271 1.5271" />
             <instance pos="5.849 0 -4.22729" rot="0.688985 0 0.724776 0" scale="1.57404 1.57404 1.57404" />
             <instance pos="8.28735 0 -2.96204" rot="-0.84171 0 0.539929 0" scale="1.48676 1.48676 1.48676" />
@@ -2821,7 +2821,7 @@
             <instance pos="8.97461 0 -1.13647" rot="0.988793 0 0.149291 0" scale="2.57678 2.57678 2.57678" />
             <instance pos="0.389404 0 -3.98804" rot="0.768613 0 0.639714 0" scale="2.33734 2.33734 2.33734" />
             <instance pos="-6.5509 0 -4.20654" rot="-0.920468 0 0.390817 0" scale="1.94464 1.94464 1.94464" />
-            <instance pos="8.23486 0 6.85547" rot="-0.264679 0 0.964336 0" scale="1.3186 1.3186 1.3186" />
+            <instance pos="8.23486 0 6.85547" rot="-0.264679 0 0.964337 0" scale="1.3186 1.3186 1.3186" />
             <instance pos="3.64014 0 -1.07971" rot="-0.840622 0 0.541623 0" scale="2.96405 2.96405 2.96405" />
             <instance pos="0.288696 0 9.30847" rot="0.962043 0 0.272898 0" scale="1.10144 1.10144 1.10144" />
             <instance pos="7.24976 0 1.53687" rot="-0.28698 0 0.957937 0" scale="2.20667 2.20667 2.20667" />
@@ -2868,7 +2868,7 @@
             <instance pos="-2.10632 0 -0.116577" rot="-0.968355 0 0.249577 0" scale="2.04388 2.04388 2.04388" />
             <instance pos="7.21863 0 -7.7478" rot="0.255051 0 0.966928 0" scale="2.50562 2.50562 2.50562" />
             <instance pos="-5.42358 0 9.91394" rot="0.995508 0 0.0946772 0" scale="1.93066 1.93066 1.93066" />
-            <instance pos="-2.89124 0 -7.63245" rot="0.481091 0 0.87667 0" scale="2.88788 2.88788 2.88788" />
+            <instance pos="-2.89124 0 -7.63245" rot="0.481091 0 0.876671 0" scale="2.88788 2.88788 2.88788" />
             <instance pos="8.8446 0 -9.59167" rot="-0.772889 0 0.634542 0" scale="2.55328 2.55328 2.55328" />
             <instance pos="5.01404 0 5.5249" rot="-0.350844 0 0.936434 0" scale="1.08807 1.08807 1.08807" />
             <instance pos="1.08032 0 -8.94348" rot="-0.581828 0 0.813312 0" scale="1.27063 1.27063 1.27063" />
@@ -2876,12 +2876,12 @@
             <instance pos="8.22876 0 0.195313" rot="-0.984898 0 0.173134 0" scale="2.84985 2.84985 2.84985" />
             <instance pos="1.40381 0 7.22595" rot="-0.982109 0 0.188315 0" scale="2.38348 2.38348 2.38348" />
             <instance pos="9.8175 0 -3.86719" rot="0.23311 0 0.97245 0" scale="2.88055 2.88055 2.88055" />
-            <instance pos="-0.179443 0 2.09351" rot="0.867667 0 0.497147 0" scale="2.44916 2.44916 2.44916" />
+            <instance pos="-0.179443 0 2.09351" rot="0.867666 0 0.497147 0" scale="2.44916 2.44916 2.44916" />
             <instance pos="-3.53088 0 -9.021" rot="-0.00862854 0 0.999963 0" scale="1.43915 1.43915 1.43915" />
             <instance pos="-6.85181 0 -9.69116" rot="-0.115271 0 0.993334 0" scale="1.60168 1.60168 1.60168" />
             <instance pos="0.918579 0 6.97327" rot="0.455852 0 0.890056 0" scale="1.00244 1.00244 1.00244" />
             <instance pos="-4.28467 0 -7.66968" rot="-0.151944 0 0.988389 0" scale="1.00159 1.00159 1.00159" />
-            <instance pos="-8.47229 0 5.31311" rot="-0.966633 0 0.256163 0" scale="2.61206 2.61206 2.61206" />
+            <instance pos="-8.47229 0 5.31311" rot="-0.966634 0 0.256163 0" scale="2.61206 2.61206 2.61206" />
             <instance pos="-2.32788 0 -5.8252" rot="0.163022 0 0.986623 0" scale="2.54999 2.54999 2.54999" />
             <instance pos="8.302 0 7.48108" rot="-0.121174 0 0.992631 0" scale="2.28839 2.28839 2.28839" />
             <instance pos="2.25769 0 -5.00305" rot="-0.435598 0 0.900141 0" scale="2.42761 2.42761 2.42761" />
@@ -2931,7 +2931,7 @@
             <instance pos="-2.40234 0 -2.78015" rot="0.877039 0 0.480419 0" scale="1.72009 1.72009 1.72009" />
             <instance pos="-3.69873 0 -0.0976563" rot="0.383923 0 0.923365 0" scale="2.10675 2.10675 2.10675" />
             <instance pos="-0.821533 0 3.9679" rot="0.393111 0 0.919491 0" scale="1.41882 1.41882 1.41882" />
-            <instance pos="-6.89697 0 9.91516" rot="0.415994 0 0.909368 0" scale="1.90808 1.90808 1.90808" />
+            <instance pos="-6.89697 0 9.91516" rot="0.415994 0 0.909367 0" scale="1.90808 1.90808 1.90808" />
             <instance pos="6.53137 0 -5.77454" rot="-0.948318 0 0.317321 0" scale="2.40527 2.40527 2.40527" />
             <instance pos="4.10217 0 -1.33728" rot="0.619756 0 0.784794 0" scale="1.96222 1.96222 1.96222" />
             <instance pos="-0.596313 0 -6.4801" rot="0.520257 0 0.85401 0" scale="1.84131 1.84131 1.84131" />
@@ -2991,7 +2991,7 @@
             <instance pos="2.1106 0 -4.06616" rot="-0.935692 0 0.352818 0" scale="1.94379 1.94379 1.94379" />
             <instance pos="8.88855 0 6.02783" rot="0.245862 0 0.969305 0" scale="2.74744 2.74744 2.74744" />
             <instance pos="4.06433 0 1.42395" rot="-0.991108 0 0.133061 0" scale="2.54504 2.54504 2.54504" />
-            <instance pos="0.447388 0 0.147705" rot="0.991832 0 0.127547 0" scale="2.25854 2.25854 2.25854" />
+            <instance pos="0.447388 0 0.147705" rot="0.991833 0 0.127547 0" scale="2.25854 2.25854 2.25854" />
             <instance pos="6.35254 0 -1.35071" rot="0.652882 0 0.757459 0" scale="2.16907 2.16907 2.16907" />
             <instance pos="-1.0321 0 1.51489" rot="-0.979724 0 0.200353 0" scale="2.45111 2.45111 2.45111" />
             <instance pos="-2.54639 0 -2.06543" rot="-0.436892 0 0.899514 0" scale="1.46088 1.46088 1.46088" />
@@ -3011,13 +3011,13 @@
             <instance pos="-5.83984 0 6.21643" rot="0.983749 0 0.179551 0" scale="2.54828 2.54828 2.54828" />
             <instance pos="7.33521 0 -6.71326" rot="0.876901 0 0.480671 0" scale="2.04718 2.04718 2.04718" />
             <instance pos="-0.498657 0 7.50549" rot="0.699062 0 0.715061 0" scale="1.11389 1.11389 1.11389" />
-            <instance pos="-1.96106 0 -7.74963" rot="0.94495 0 0.327213 0" scale="2.90704 2.90704 2.90704" />
+            <instance pos="-1.96106 0 -7.74963" rot="0.944951 0 0.327213 0" scale="2.90704 2.90704 2.90704" />
             <instance pos="-6.19263 0 9.99756" rot="-0.882959 0 0.469451 0" scale="1.12494 1.12494 1.12494" />
             <instance pos="-7.19727 0 5.93933" rot="-0.866233 0 0.49964 0" scale="2.99323 2.99323 2.99323" />
             <instance pos="-9.96765 0 -9.14246" rot="0.772828 0 0.634616 0" scale="2.2561 2.2561 2.2561" />
             <instance pos="3.75122 0 3.87939" rot="0.256812 0 0.966461 0" scale="2.48438 2.48438 2.48438" />
             <instance pos="-1.83533 0 5.74097" rot="0.493732 0 0.869614 0" scale="2.01233 2.01233 2.01233" />
-            <instance pos="-7.26013 0 3.18604" rot="-0.306299 0 0.951936 0" scale="2.81543 2.81543 2.81543" />
+            <instance pos="-7.26013 0 3.18604" rot="-0.306299 0 0.951935 0" scale="2.81543 2.81543 2.81543" />
             <instance pos="6.24146 0 -4.88037" rot="-0.221907 0 0.975068 0" scale="2.64301 2.64301 2.64301" />
             <instance pos="-6.38245 0 1.14441" rot="0.169356 0 0.985555 0" scale="2.71625 2.71625 2.71625" />
             <instance pos="3.86475 0 3.10974" rot="0.823068 0 0.567943 0" scale="2.30591 2.30591 2.30591" />
@@ -3059,7 +3059,7 @@
             <instance pos="-7.41516 0 -5.14526" rot="0.994168 0 0.10784 0" scale="1.89313 1.89313 1.89313" />
             <instance pos="-8.86353 0 7.23633" rot="0.120222 0 0.992747 0" scale="2.68317 2.68317 2.68317" />
             <instance pos="-8.57178 0 4.53674" rot="0.563358 0 0.826213 0" scale="1.92163 1.92163 1.92163" />
-            <instance pos="-5.99731 0 7.33398" rot="-0.469028 0 0.883184 0" scale="1.1925 1.1925 1.1925" />
+            <instance pos="-5.99731 0 7.33398" rot="-0.469028 0 0.883183 0" scale="1.1925 1.1925 1.1925" />
             <instance pos="0.0280762 0 -3.32581" rot="0.847765 0 0.530373 0" scale="2.29974 2.29974 2.29974" />
             <instance pos="-0.464478 0 -7.84119" rot="-0.14692 0 0.989148 0" scale="1.17865 1.17865 1.17865" />
             <instance pos="8.43933 0 7.10754" rot="0.0165854 0 0.999862 0" scale="1.71741 1.71741 1.71741" />
@@ -3067,7 +3067,7 @@
             <instance pos="6.19141 0 2.68616" rot="0.539284 0 0.842124 0" scale="2.89209 2.89209 2.89209" />
             <instance pos="5.05798 0 -3.55774" rot="0.630383 0 0.776284 0" scale="1.45483 1.45483 1.45483" />
             <instance pos="-1.06995 0 -4.27795" rot="0.260054 0 0.965594 0" scale="1.54529 1.54529 1.54529" />
-            <instance pos="-5.12573 0 1.01074" rot="-0.929712 0 0.368289 0" scale="1.86963 1.86963 1.86963" />
+            <instance pos="-5.12573 0 1.01074" rot="-0.929711 0 0.368289 0" scale="1.86963 1.86963 1.86963" />
             <instance pos="7.55676 0 -9.06067" rot="0.337251 0 0.941415 0" scale="1.62939 1.62939 1.62939" />
             <instance pos="5.29053 0 -5.56763" rot="-0.98099 0 0.194056 0" scale="2.46405 2.46405 2.46405" />
             <instance pos="9.87122 0 4.93164" rot="0.203358 0 0.979104 0" scale="2.80396 2.80396 2.80396" />
@@ -3091,7 +3091,7 @@
             <instance pos="6.41846 0 1.77063" rot="0.496231 0 0.86819 0" scale="2.46448 2.46448 2.46448" />
             <instance pos="-1.52527 0 0.151978" rot="0.999443 0 0.0333579 0" scale="2.11578 2.11578 2.11578" />
             <instance pos="-0.078125 0 1.00586" rot="-0.962694 0 0.270591 0" scale="1.66357 1.66357 1.66357" />
-            <instance pos="4.58801 0 -4.51782" rot="0.381089 0 0.924539 0" scale="1.64911 1.64911 1.64911" />
+            <instance pos="4.58801 0 -4.51782" rot="0.381089 0 0.924538 0" scale="1.64911 1.64911 1.64911" />
             <instance pos="9.81873 0 0.900879" rot="-0.952112 0 0.305751 0" scale="1.43561 1.43561 1.43561" />
             <instance pos="-4.03809 0 -4.90784" rot="-0.906959 0 0.421218 0" scale="1.24384 1.24384 1.24384" />
             <instance pos="-5.3595 0 7.80457" rot="-0.933475 0 0.358642 0" scale="2.0993 2.0993 2.0993" />
@@ -3113,7 +3113,7 @@
             <instance pos="-4.7345 0 -4.58801" rot="-0.513198 0 0.85827 0" scale="1.6803 1.6803 1.6803" />
             <instance pos="0.125122 0 9.94995" rot="-0.387992 0 0.921663 0" scale="2.1131 2.1131 2.1131" />
             <instance pos="1.44958 0 3.94653" rot="0.607188 0 0.794558 0" scale="2.76733 2.76733 2.76733" />
-            <instance pos="-8.53333 0 9.94446" rot="-0.899095 0 0.437755 0" scale="1.38452 1.38452 1.38452" />
+            <instance pos="-8.53333 0 9.94446" rot="-0.899094 0 0.437755 0" scale="1.38452 1.38452 1.38452" />
             <instance pos="-6.81091 0 -0.349731" rot="-0.440597 0 0.897705 0" scale="2.31805 2.31805 2.31805" />
             <instance pos="6.24451 0 2.82715" rot="-0.928648 0 0.370961 0" scale="2.2821 2.2821 2.2821" />
             <instance pos="9.31213 0 7.31445" rot="-0.972918 0 0.231151 0" scale="1.0426 1.0426 1.0426" />
@@ -3288,7 +3288,7 @@
             <instance pos="-1.83899 0 1.41907" rot="-0.922775 0 0.385339 0" scale="1.99725 1.99725 1.99725" />
             <instance pos="9.91028 0 -6.13281" rot="-0.471143 0 0.882057 0" scale="2.58899 2.58899 2.58899" />
             <instance pos="3.03589 0 1.06506" rot="0.990538 0 0.13724 0" scale="2.73761 2.73761 2.73761" />
-            <instance pos="7.39746 0 3.97522" rot="0.896051 0 0.44395 0" scale="1.25647 1.25647 1.25647" />
+            <instance pos="7.39746 0 3.97522" rot="0.896052 0 0.44395 0" scale="1.25647 1.25647 1.25647" />
             <instance pos="-9.24438 0 4.10217" rot="0.129259 0 0.991611 0" scale="2.22467 2.22467 2.22467" />
             <instance pos="-1.1615 0 -2.36084" rot="0.0771018 0 0.997023 0" scale="1.55072 1.55072 1.55072" />
             <instance pos="-8.91907 0 -8.94592" rot="-0.990286 0 0.139044 0" scale="1.63367 1.63367 1.63367" />
@@ -3310,7 +3310,7 @@
             <instance pos="9.67773 0 -5.0293" rot="-0.946291 0 0.323315 0" scale="1.93359 1.93359 1.93359" />
             <instance pos="5.27527 0 -2.75146" rot="0.993334 0 0.115271 0" scale="1.12317 1.12317 1.12317" />
             <instance pos="9.31213 0 -7.38098" rot="0.276217 0 0.961095 0" scale="1.98822 1.98822 1.98822" />
-            <instance pos="-6.17981 0 3.71521" rot="-0.645297 0 0.763931 0" scale="2.23395 2.23395 2.23395" />
+            <instance pos="-6.17981 0 3.71521" rot="-0.645297 0 0.763932 0" scale="2.23395 2.23395 2.23395" />
             <instance pos="-8.81409 0 -8.76953" rot="0.167938 0 0.985798 0" scale="2.0415 2.0415 2.0415" />
             <instance pos="-9.29382 0 9.22913" rot="-0.992643 0 0.121078 0" scale="1.4679 1.4679 1.4679" />
             <instance pos="9.55933 0 -4.33899" rot="-0.119365 0 0.99285 0" scale="2.81818 2.81818 2.81818" />
@@ -3329,7 +3329,7 @@
             <instance pos="-6.57593 0 -2.00378" rot="0.814815 0 0.579721 0" scale="2.2196 2.2196 2.2196" />
             <instance pos="-6.83044 0 7.46887" rot="-0.852861 0 0.522139 0" scale="2.02258 2.02258 2.02258" />
             <instance pos="-0.908813 0 -7.19666" rot="-0.364899 0 0.931047 0" scale="1.34412 1.34412 1.34412" />
-            <instance pos="0.632324 0 5.36072" rot="0.914482 0 0.404628 0" scale="2.03046 2.03046 2.03046" />
+            <instance pos="0.632324 0 5.36072" rot="0.914481 0 0.404628 0" scale="2.03046 2.03046 2.03046" />
             <instance pos="5.07324 0 4.56604" rot="-0.982841 0 0.184454 0" scale="1.63416 1.63416 1.63416" />
             <instance pos="2.32239 0 3.81348" rot="-0.139044 0 0.990286 0" scale="2.23187 2.23187 2.23187" />
             <instance pos="3.50647 0 -1.56677" rot="0.797633 0 0.603143 0" scale="1.65179 1.65179 1.65179" />
@@ -4186,7 +4186,7 @@
     </entity>
     <entity id="224" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="21.731 0 13.8647" rot="0.991511 0 0.130019 0" scale="1.02147 1.02147 1.02147" />
+            <transform pos="21.731 0 13.8647" rot="0.991512 0 0.130019 0" scale="1.02147 1.02147 1.02147" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -4494,7 +4494,7 @@
     </entity>
     <entity id="252" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="35.6232 0 -32.4976" rot="0.999044 0 0.0437045 0" scale="1.05135 1.05135 1.05135" />
+            <transform pos="35.6232 0 -32.4976" rot="0.999045 0 0.0437045 0" scale="1.05135 1.05135 1.05135" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -4516,7 +4516,7 @@
     </entity>
     <entity id="254" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="-16.853 0 81.7932" rot="0.130019 0 0.991511 0" scale="1.23278 1.23278 1.23278" />
+            <transform pos="-16.853 0 81.7932" rot="0.130019 0 0.991512 0" scale="1.23278 1.23278 1.23278" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -4835,7 +4835,7 @@
     </entity>
     <entity id="283" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="-49.9658 0 45.2197" rot="0.974036 0 0.226391 0" scale="1.21419 1.21419 1.21419" />
+            <transform pos="-49.9658 0 45.2197" rot="0.974037 0 0.226391 0" scale="1.21419 1.21419 1.21419" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -5176,7 +5176,7 @@
     </entity>
     <entity id="314" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="24.6808 0 9.44824" rot="-0.371406 0 0.92847 0" scale="1.02245 1.02245 1.02245" />
+            <transform pos="24.6808 0 9.44824" rot="-0.371406 0 0.928471 0" scale="1.02245 1.02245 1.02245" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -5913,7 +5913,7 @@
     </entity>
     <entity id="381" netflags="0" netdistance="0" groupflags="0">
         <component type="AnimatedModel" netflags="0">
-            <transform pos="-28.7073 0 -71.3232" rot="0.0745207 0 0.997219 0" scale="1.12923 1.12923 1.12923" />
+            <transform pos="-28.7073 0 -71.3232" rot="0.0745207 0 0.99722 0" scale="1.12923 1.12923 1.12923" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="300" shadowdistance="0" viewmask="-1" lightmask="-1" lodbias="1" animlodbias="1" invisiblelodfactor="0" localanimation="false" />
             <model name="Models/Jack.mdl" />
@@ -6548,9 +6548,9 @@
         </component>
     </entity>
     <entity id="417" netflags="0" netdistance="0" groupflags="0">
-        <property hash="44830" type="Quaternion" value="0.809479 0.436766 0.3924 -0" sync="false" />
+        <property hash="44830" type="Quaternion" value="0.80948 0.436766 0.3924 -0" sync="false" />
         <component type="Light" netflags="0">
-            <transform pos="4.78821 53.898 22.7097" rot="0.809479 0.436766 0.3924 -0" scale="1 1 1" />
+            <transform pos="4.78821 53.898 22.7097" rot="0.80948 0.436766 0.3924 -0" scale="1 1 1" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="0" shadowdistance="200" viewmask="-1" lightmask="-1" fadedistance="0" detail="0" shadowdetail="0" />
             <light type="spot" color="0.5 1 0.5 1" specular="1" range="75" fov="15" aspectratio="1" />
@@ -6559,7 +6559,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="418" netflags="0" netdistance="0" groupflags="0">
@@ -6574,13 +6574,13 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="419" netflags="0" netdistance="0" groupflags="0">
-        <property hash="44830" type="Quaternion" value="0.632069 0.559358 0.536289 -0" sync="false" />
+        <property hash="44830" type="Quaternion" value="0.63207 0.559358 0.536289 -0" sync="false" />
         <component type="Light" netflags="0">
-            <transform pos="-16.4063 40.9113 74.6521" rot="0.632069 0.559358 0.536289 -0" scale="1 1 1" />
+            <transform pos="-16.4063 40.9113 74.6521" rot="0.63207 0.559358 0.536289 -0" scale="1 1 1" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="0" shadowdistance="200" viewmask="-1" lightmask="-1" fadedistance="0" detail="0" shadowdetail="0" />
             <light type="spot" color="0.5 1 0.5 1" specular="1" range="75" fov="15" aspectratio="1" />
@@ -6589,7 +6589,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="420" netflags="0" netdistance="0" groupflags="0">
@@ -6619,7 +6619,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="422" netflags="0" netdistance="0" groupflags="0">
@@ -6649,7 +6649,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="424" netflags="0" netdistance="0" groupflags="0">
@@ -6679,7 +6679,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="426" netflags="0" netdistance="0" groupflags="0">
@@ -6694,7 +6694,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="427" netflags="0" netdistance="0" groupflags="0">
@@ -6739,7 +6739,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="430" netflags="0" netdistance="0" groupflags="0">
@@ -6754,13 +6754,13 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="431" netflags="0" netdistance="0" groupflags="0">
-        <property hash="44830" type="Quaternion" value="0.884829 0.399572 -0.239622 0" sync="false" />
+        <property hash="44830" type="Quaternion" value="0.88483 0.399572 -0.239622 0" sync="false" />
         <component type="Light" netflags="0">
-            <transform pos="-8.4549 41.4111 -28.5141" rot="0.884829 0.399572 -0.239622 0" scale="1 1 1" />
+            <transform pos="-8.4549 41.4111 -28.5141" rot="0.88483 0.399572 -0.239622 0" scale="1 1 1" />
             <render castshadows="true" occluder="false" visible="true" />
             <lod drawdistance="0" shadowdistance="200" viewmask="-1" lightmask="-1" fadedistance="0" detail="0" shadowdetail="0" />
             <light type="spot" color="1 0.5 0.5 1" specular="1" range="75" fov="15" aspectratio="1" />
@@ -6769,7 +6769,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="432" netflags="0" netdistance="0" groupflags="0">
@@ -6784,7 +6784,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="433" netflags="0" netdistance="0" groupflags="0">
@@ -6814,7 +6814,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
     <entity id="435" netflags="0" netdistance="0" groupflags="0">
@@ -6844,7 +6844,7 @@
             <shadowcascade lambda="0.5" maxrange="1e+008" faderange="0.2" splits="1" />
             <shadowfocus enable="true" nonuniform="true" zoomout="true" quantize="0.5" minview="3" />
             <ramptexture name="Textures/RampExtreme.png" />
-            <spottexture name="" />
+            <spottexture name="Textures/Spot.png" />
         </component>
     </entity>
 </scene>

+ 1 - 1
Bin/Data/Scripts/GraphicsTest.as

@@ -267,7 +267,7 @@ void initScene()
     
     // Save the ready scene for examination
     scene.saveXML(File("Data/GraphicsTestScene.xml", FILE_WRITE));
-    scene.save(File("Data/GraphicsTestScene.scn", FILE_WRITE));
+    scene.save(File("Data/GraphicsTestScene.bin", FILE_WRITE));
 }
 
 void animateScene(float timeStep)

+ 1 - 0
Engine/Engine/RegisterRenderer.cpp

@@ -811,6 +811,7 @@ static void registerRenderer(asIScriptEngine* engine)
     engine->RegisterObjectType("Renderer", 0, asOBJ_REF);
     engine->RegisterObjectBehaviour("Renderer", asBEHAVE_ADDREF, "void f()", asMETHOD(Renderer, addRef), asCALL_THISCALL);
     engine->RegisterObjectBehaviour("Renderer", asBEHAVE_RELEASE, "void f()", asMETHOD(Renderer, releaseRef), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Renderer", "void setWindowTitle(const string& in)", asMETHOD(Renderer, setWindowTitle), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "void setMode(RenderMode, int, int, bool, bool, int)", asMETHOD(Renderer, setMode), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "void toggleFullscreen()", asMETHOD(Renderer, toggleFullscreen), asCALL_THISCALL);
     engine->RegisterObjectMethod("Renderer", "void close()", asMETHOD(Renderer, close), asCALL_THISCALL);

+ 6 - 0
Engine/Engine/RegisterUI.cpp

@@ -327,9 +327,12 @@ static void registerMenu(asIScriptEngine* engine)
     engine->RegisterObjectMethod("Menu", "void setPopupOffset(const IntVector2& in)", asMETHODPR(Menu, setPopupOffset, (const IntVector2&), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Menu", "void setPopupOffset(int, int)", asMETHODPR(Menu, setPopupOffset, (int, int), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("Menu", "void showPopup(bool)", asMETHOD(Menu, showPopup), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Menu", "void setAccelerator(int, int)", asMETHOD(Menu, setAccelerator), asCALL_THISCALL);
     engine->RegisterObjectMethod("Menu", "UIElement@+ getPopup() const", asMETHOD(Menu, getPopup), asCALL_THISCALL);
     engine->RegisterObjectMethod("Menu", "const IntVector2& getPopupOffset() const", asMETHOD(Menu, getPopupOffset), asCALL_THISCALL);
     engine->RegisterObjectMethod("Menu", "bool getShowPopup() const", asMETHOD(Menu, getShowPopup), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Menu", "int getAcceleratorKey() const", asMETHOD(Menu, getAcceleratorKey), asCALL_THISCALL);
+    engine->RegisterObjectMethod("Menu", "int setAcceleratorQualifiers() const", asMETHOD(Menu, getAcceleratorQualifiers), asCALL_THISCALL);
     registerRefCasts<UIElement, Menu>(engine, "UIElement", "Menu");
 }
 
@@ -343,6 +346,7 @@ static void registerDropDownList(asIScriptEngine* engine)
 {
     registerButton<DropDownList>(engine, "DropDownList");
     engine->RegisterObjectMethod("DropDownList", "void showPopup(bool)", asMETHOD(DropDownList, showPopup), asCALL_THISCALL);
+    engine->RegisterObjectMethod("DropDownList", "void setAccelerator(int, int)", asMETHOD(DropDownList, setAccelerator), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "void addItem(UIElement@+)", asMETHOD(DropDownList, addItem), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "void removeItem(UIElement@+)", asMETHODPR(DropDownList, removeItem, (UIElement*), void), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "void removeItem(uint)", asMETHODPR(DropDownList, removeItem, (unsigned), void), asCALL_THISCALL);
@@ -351,6 +355,8 @@ static void registerDropDownList(asIScriptEngine* engine)
     engine->RegisterObjectMethod("DropDownList", "void setResizePopup(bool)", asMETHOD(DropDownList, setResizePopup), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "UIElement@+ getPopup() const", asMETHOD(DropDownList, getPopup), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "bool getShowPopup() const", asMETHOD(DropDownList, getShowPopup), asCALL_THISCALL);
+    engine->RegisterObjectMethod("DropDownList", "int getAcceleratorKey() const", asMETHOD(DropDownList, getAcceleratorKey), asCALL_THISCALL);
+    engine->RegisterObjectMethod("DropDownList", "int setAcceleratorQualifiers() const", asMETHOD(DropDownList, getAcceleratorQualifiers), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "uint getNumItems() const", asMETHOD(DropDownList, getSelection), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "UIElement@+ getItem(uint) const", asMETHOD(DropDownList, getItem), asCALL_THISCALL);
     engine->RegisterObjectMethod("DropDownList", "array<UIElement@>@ getItems() const", asFUNCTION(DropDownListGetItems), asCALL_CDECL_OBJLAST);

+ 6 - 0
Engine/Input/Input.cpp

@@ -439,10 +439,14 @@ void Input::keyChange(int key, bool newState)
     if ((key < 0) || (key >= MAX_KEYS))
         return;
     
+    bool repeat = false;
+    
     if (newState)
     {
         if (!mKeyDown[key])
             mKeyPress[key] = true;
+        else
+            repeat = true;
     }
     else
     {
@@ -458,6 +462,8 @@ void Input::keyChange(int key, bool newState)
     eventData[P_KEY] = key;
     eventData[P_BUTTONS] = mMouseButtonDown;
     eventData[P_QUALIFIERS] = getQualifiers();
+    if (newState)
+        eventData[P_REPEAT] = repeat;
     sendEvent(newState ? EVENT_KEYDOWN : EVENT_KEYUP, eventData);
 }
 

+ 1 - 0
Engine/Input/InputEvents.h

@@ -78,6 +78,7 @@ DEFINE_EVENT(EVENT_KEYDOWN, KeyDown)
     EVENT_PARAM(P_KEY, Key);                    // int
     EVENT_PARAM(P_BUTTONS, Buttons);            // int
     EVENT_PARAM(P_QUALIFIERS, Qualifiers);      // int
+    EVENT_PARAM(P_REPEAT, Repeat);              // bool
 }
 
 //! Key released

+ 9 - 2
Engine/Renderer/Renderer.cpp

@@ -69,7 +69,7 @@ static LRESULT CALLBACK wndProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam
 
 Renderer::Renderer(const std::string& windowTitle) :
     mImpl(new RendererImpl()),
-    mTitle(windowTitle),
+    mWindowTitle(windowTitle),
     mMode(RENDER_FORWARD),
     mWidth(0),
     mHeight(0),
@@ -163,6 +163,13 @@ void Renderer::messagePump()
     }
 }
 
+void Renderer::setWindowTitle(const std::string& windowTitle)
+{
+    mWindowTitle = windowTitle;
+    if (mImpl->mWindow)
+        SetWindowText(mImpl->mWindow, mWindowTitle.c_str());
+}
+
 void Renderer::setMode(RenderMode mode, int width, int height, bool fullscreen, bool vsync, int multiSample)
 {
     // Find out the full screen mode display format (match desktop color depth)
@@ -1892,7 +1899,7 @@ void Renderer::createWindow(int width, int height)
     
     RECT rect = {0, 0, width, height};
     AdjustWindowRect(&rect, windowStyle, false);
-    mImpl->mWindow = CreateWindow("D3DWindow", mTitle.c_str(), windowStyle, CW_USEDEFAULT, CW_USEDEFAULT, 
+    mImpl->mWindow = CreateWindow("D3DWindow", mWindowTitle.c_str(), windowStyle, CW_USEDEFAULT, CW_USEDEFAULT, 
         rect.right, rect.bottom, 0, 0, mImpl->mInstance, 0); 
     
     if (!mImpl->mWindow)

+ 4 - 2
Engine/Renderer/Renderer.h

@@ -65,6 +65,8 @@ public:
     
     //! Pump operating system messages
     void messagePump();
+    //! Set window title text
+    void setWindowTitle(const std::string& windowTitle);
     //! Set screen mode. In deferred rendering modes multisampling means edge filtering instead of MSAA
     void setMode(RenderMode mode, int width, int height, bool fullscreen, bool vsync, int multiSample);
     //! Toggle between full screen and windowed mode
@@ -206,7 +208,7 @@ public:
     //! Return renderer implementation, which holds the actual Direct3D resources
     RendererImpl* getImpl() const { return mImpl; }
     //! Return window title
-    const std::string& getWindowTitle() const { return mTitle; }
+    const std::string& getWindowTitle() const { return mWindowTitle; }
     //! Return rendering mode
     RenderMode getRenderMode() const { return mMode; }
     //! Return window width
@@ -358,7 +360,7 @@ private:
     //! Implementation
     RendererImpl* mImpl;
     //! Window title
-    std::string mTitle;
+    std::string mWindowTitle;
     //! Rendering mode
     RenderMode mMode;
     //! Window width

+ 4 - 1
Engine/UI/FileSelector.cpp

@@ -122,7 +122,10 @@ FileSelector::FileSelector(UI* ui) :
 
 FileSelector::~FileSelector()
 {
-    mUI->getRootElement()->removeChild(mWindow);
+    UIElement* root = mUI->getRootElement();
+    //! \todo This should not be necessary
+    root->removeChild(mFilterList->getPopup());
+    root->removeChild(mWindow);
 }
 
 void FileSelector::setStyle(XMLFile* style)

+ 35 - 7
Engine/UI/Menu.cpp

@@ -33,16 +33,18 @@ static const ShortStringHash originHash("origin");
 Menu::Menu(const std::string& name) :
     Button(name),
     mPopupOffset(IntVector2::sZero),
-    mShowPopup(false)
+    mShowPopup(false),
+    mAcceleratorKey(0),
+    mAcceleratorQualifiers(0)
 {
-    subscribeToEvent(EVENT_UIMOUSECLICK, EVENT_HANDLER(Menu, handleFocusChange));
-    subscribeToEvent(EVENT_FOCUSED, EVENT_HANDLER(Menu, handleFocusChange));
+    subscribeToEvent(EVENT_UIMOUSECLICK, EVENT_HANDLER(Menu, handleFocusChanged));
+    subscribeToEvent(EVENT_FOCUSCHANGED, EVENT_HANDLER(Menu, handleFocusChanged));
 }
 
 Menu::~Menu()
 {
     if (mPopup)
-        mPopup->getUserData()[originHash].clear();
+        showPopup(false);
 }
 
 void Menu::setStyle(const XMLElement& element, ResourceCache* cache)
@@ -116,8 +118,10 @@ void Menu::showPopup(bool enable)
     if (!mPopup)
         return;
     
-    // Find the UI root element for showing the popup
+    // Find the UI root element for showing the popup. If we are already detached, try to find it through the popup
     UIElement* root = getRootElement();
+    if (!root)
+        root = mPopup->getRootElement();
     if (!root)
         return;
     
@@ -145,12 +149,23 @@ void Menu::showPopup(bool enable)
     mSelected = enable;
 }
 
-void Menu::handleFocusChange(StringHash eventType, VariantMap& eventData)
+void Menu::setAccelerator(int key, int qualifiers)
+{
+    mAcceleratorKey = key;
+    mAcceleratorQualifiers = qualifiers;
+    
+    if (key)
+        subscribeToEvent(EVENT_KEYDOWN, EVENT_HANDLER(Menu, handleKeyDown));
+    else
+        unsubscribeFromEvent(EVENT_KEYDOWN);
+}
+
+void Menu::handleFocusChanged(StringHash eventType, VariantMap& eventData)
 {
     if (!mShowPopup)
         return;
     
-    using namespace UIMouseClick;
+    using namespace FocusChanged;
     
     UIElement* element = static_cast<UIElement*>(eventData[P_ELEMENT].getPtr());
     UIElement* root = getRootElement();
@@ -176,3 +191,16 @@ void Menu::handleFocusChange(StringHash eventType, VariantMap& eventData)
     
     showPopup(false);
 }
+
+void Menu::handleKeyDown(StringHash eventType, VariantMap& eventData)
+{
+    if ((!mEnabled) || (!mVisible))
+        return;
+    
+    using namespace KeyDown;
+    
+    // Simulate a click if accelerator key pressed
+    if ((eventData[P_KEY].getInt() == mAcceleratorKey) && (eventData[P_QUALIFIERS].getInt() == mAcceleratorQualifiers) &&
+        (eventData[P_REPEAT].getBool() == false))
+        onClick(getPosition(), getScreenPosition(), eventData[P_BUTTONS].getInt(), eventData[P_QUALIFIERS].getInt(), 0);
+}

+ 14 - 2
Engine/UI/Menu.h

@@ -54,6 +54,8 @@ public:
     void setPopupOffset(int x, int y);
     //! Force the popup to show or hide
     void showPopup(bool enable);
+    //! Set accelerator key (set zero key code to disable)
+    void setAccelerator(int key, int qualifiers);
     
     //! Return popup element
     UIElement* getPopup() const { return mPopup; }
@@ -61,6 +63,10 @@ public:
     const IntVector2& getPopupOffset() const { return mPopupOffset; }
     //! Return whether popup is open
     bool getShowPopup() const { return mShowPopup; }
+    //! Return accelerator key code, 0 if disabled
+    int getAcceleratorKey() const { return mAcceleratorKey; }
+    //! Return accelerator qualifiers
+    int getAcceleratorQualifiers() const { return mAcceleratorQualifiers; }
     
 protected:
     //! Popup element
@@ -69,10 +75,16 @@ protected:
     IntVector2 mPopupOffset;
     //! Show popup flag
     bool mShowPopup;
+    //! Accelerator key code
+    int mAcceleratorKey;
+    //! Accelerator qualifiers
+    int mAcceleratorQualifiers;
     
 private:
-    //! Handle global UI mouseclick or focus change to check for hiding the popup
-    void handleFocusChange(StringHash eventType, VariantMap& eventData);
+    //! Handle UI focus change to check for hiding the popup
+    void handleFocusChanged(StringHash eventType, VariantMap& eventData);
+    //! Handle keypress for checking accelerator
+    void handleKeyDown(StringHash eventType, VariantMap& eventData);
 };
 
 #endif // UI_MENU_H

+ 6 - 0
Engine/UI/UI.cpp

@@ -139,6 +139,12 @@ void UI::setFocusElement(UIElement* element)
     
     if (element)
         element->setFocus(true);
+    
+    using namespace FocusChanged;
+    
+    VariantMap eventData;
+    eventData[P_ELEMENT] = (void*)element;
+    sendEvent(EVENT_FOCUSCHANGED, eventData);
 }
 
 void UI::clear()

+ 6 - 0
Engine/UI/UIEvents.h

@@ -37,6 +37,12 @@ DEFINE_EVENT(EVENT_UIMOUSECLICK, UIMouseClick)
     EVENT_PARAM(P_QUALIFIERS, Qualifiers);      // int
 }
 
+//! Focus element changed
+DEFINE_EVENT(EVENT_FOCUSCHANGED, FocusChanged)
+{
+    EVENT_PARAM(P_ELEMENT, Element);            // UIElement pointer
+}
+
 //! Drag and drop test
 DEFINE_EVENT(EVENT_UIDRAGDROPTEST, UIDragDropTest)
 {

+ 1 - 1
Examples/Urho3D/Application.cpp

@@ -93,7 +93,7 @@ void Application::run()
     
     // Script mode: execute the rest of initialization, including scene creation, in script
     std::string extension = getExtension(fileName);
-    if ((extension != ".xml") && (extension != ".scn") && (extension != ".bin"))
+    if ((extension != ".xml") && (extension != ".bin") && (extension != ".sav"))
     {
         mScriptFile = new ScriptFile(mEngine->getScriptEngine(), fileName);
         mScriptFile->load(*file, mCache);