Explorar el Código

Merge branch 'Preview4_0' into kermithelpme

AzaezelX hace 3 años
padre
commit
52040fb072
Se han modificado 29 ficheros con 397 adiciones y 92 borrados
  1. 2 0
      Engine/source/T3D/projectile.cpp
  2. 3 2
      Engine/source/Verve/Core/Persistence/VPersistence.h
  3. 2 1
      Engine/source/afx/afxEffectron.cpp
  4. 4 2
      Engine/source/afx/afxSelectron.cpp
  5. 4 2
      Engine/source/console/arrayObject.cpp
  6. 2 1
      Engine/source/console/simObjectList.cpp
  7. 2 1
      Engine/source/environment/editors/guiRiverEditorCtrl.cpp
  8. 3 2
      Engine/source/forest/editor/forestBrushTool.cpp
  9. 137 7
      Engine/source/gui/controls/guiGameListMenuCtrl.cpp
  10. 52 2
      Engine/source/gui/controls/guiGameListMenuCtrl.h
  11. 3 1
      Engine/source/gui/controls/guiTreeViewCtrl.cpp
  12. 54 6
      Engine/source/gui/core/guiCanvas.cpp
  13. 19 0
      Engine/source/gui/core/guiCanvas.h
  14. 3 1
      Engine/source/gui/editor/guiPopupMenuCtrl.cpp
  15. 2 1
      Engine/source/gui/editor/popupMenu.cpp
  16. 5 3
      Engine/source/gui/worldEditor/worldEditor.cpp
  17. 9 2
      Engine/source/math/mRotation.cpp
  18. 10 2
      Engine/source/math/mathTypes.cpp
  19. 4 2
      Engine/source/module/moduleManager.cpp
  20. 13 3
      Engine/source/platformX86UNIX/x86UNIXConsole.cpp
  21. 16 5
      Engine/source/sfx/openal/aldlist.cpp
  22. 0 4
      Engine/source/util/messaging/scriptMsgListener.cpp
  23. 1 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript
  24. 7 10
      Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript
  25. 20 22
      Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript
  26. 1 1
      Templates/BaseGame/game/tools/worldEditor/scripts/editors/creator.ed.tscript
  27. 11 6
      Templates/Modules/inputTest/inputTest.tscript
  28. 1 1
      Templates/Modules/inputTest/scripts/gui/inputMonitor.gui
  29. 7 1
      Templates/Modules/inputTest/scripts/menuButtons.tscript

+ 2 - 0
Engine/source/T3D/projectile.cpp

@@ -786,6 +786,8 @@ bool Projectile::onAdd()
       // If we're on the server, we need to inherit some of our parent's velocity
       //
       mCurrTick = 0;
+
+      scriptOnAdd();
    }
    else
    {

+ 3 - 2
Engine/source/Verve/Core/Persistence/VPersistence.h

@@ -250,8 +250,9 @@ namespace VPersistence
             if ( object->isMethod( "onAdd" ) )
             {
                 // Callback.
-                const char *retValue = Con::executef( object, "onAdd" );
-                if ( !dAtob( retValue ) )
+                ConsoleValue cValue = Con::executef( object, "onAdd" );
+
+                if ( !cValue.getBool() )
                 {
                     // Delete.
                     object->deleteObject();

+ 2 - 1
Engine/source/afx/afxEffectron.cpp

@@ -989,9 +989,10 @@ afxEffectron::start_effect(afxEffectronData* datablock, SimObject* extra)
   }
 
   // CALL SCRIPT afxEffectronData::onPreactivate(%params, %extra)
-  const char* result = Con::executef(datablock, "onPreactivate", 
+  ConsoleValue cValue = Con::executef(datablock, "onPreactivate", 
                                      Con::getIntArg(param_holder->getId()), 
                                      (extra) ? Con::getIntArg(extra->getId()) : "");
+  const char* result = cValue.getString();
   if (result && result[0] != '\0' && !dAtob(result))
   {
 #if defined(TORQUE_DEBUG)

+ 4 - 2
Engine/source/afx/afxSelectron.cpp

@@ -1068,9 +1068,11 @@ afxSelectron::start_selectron(SceneObject* picked, U8 subcode, SimObject* extra)
   }
 
   // CALL SCRIPT afxSelectronData::onPreactivate(%params, %extra)
-  const char* result = Con::executef(datablock, "onPreactivate",
+  ConsoleValue cValue = Con::executef(datablock, "onPreactivate",
                                      Con::getIntArg(param_holder->getId()),
-                                     (extra) ? Con::getIntArg(extra->getId()) : "").getString();
+                                     (extra) ? Con::getIntArg(extra->getId()) : "");
+
+  const char* result = cValue.getString();
   if (result && result[0] != '\0' && !dAtob(result))
   {
 #if defined(TORQUE_DEBUG)

+ 4 - 2
Engine/source/console/arrayObject.cpp

@@ -103,7 +103,8 @@ S32 QSORT_CALLBACK ArrayObject::_keyFunctionCompare( const void* a, const void*
    ArrayObject::Element* ea = ( ArrayObject::Element* )( a );
    ArrayObject::Element* eb = ( ArrayObject::Element* )( b );
    
-   S32 result = dAtoi(Con::executef((const char*)smCompareFunction, ea->key, eb->key));
+   ConsoleValue cValue = Con::executef((const char*)smCompareFunction, ea->key, eb->key);
+   S32 result = cValue.getInt();
    S32 res = result < 0 ? -1 : ( result > 0 ? 1 : 0 );
    return ( smDecreasing ? -res : res );
 }
@@ -113,7 +114,8 @@ S32 QSORT_CALLBACK ArrayObject::_valueFunctionCompare( const void* a, const void
    ArrayObject::Element* ea = ( ArrayObject::Element* )( a );
    ArrayObject::Element* eb = ( ArrayObject::Element* )( b );
    
-   S32 result = dAtoi( Con::executef( (const char*)smCompareFunction, ea->value, eb->value ) );
+   ConsoleValue cValue = Con::executef( (const char*)smCompareFunction, ea->value, eb->value );
+   S32 result = cValue.getInt();
    S32 res = result < 0 ? -1 : ( result > 0 ? 1 : 0 );
    return ( smDecreasing ? -res : res );
 }

+ 2 - 1
Engine/source/console/simObjectList.cpp

@@ -118,7 +118,8 @@ S32 QSORT_CALLBACK SimObjectList::_callbackSort( const void *a, const void *b )
    static char idB[64];
    dSprintf( idB, sizeof( idB ), "%d", objB->getId() );
 
-   return dAtoi( Con::executef( (const char*)smSortScriptCallbackFn, idA, idB ) );
+   ConsoleValue cValue = Con::executef( (const char*)smSortScriptCallbackFn, idA, idB );
+   return cValue.getInt();
 }
 
 void SimObjectList::scriptSort( const String &scriptCallback )

+ 2 - 1
Engine/source/environment/editors/guiRiverEditorCtrl.cpp

@@ -438,7 +438,8 @@ void GuiRiverEditorCtrl::_process3DMouseDown( const Gui3DMouseEvent& event )
          return;
       }
 
-      const char *res = Con::executef( this, "createRiver" );
+      ConsoleValue cValue = Con::executef( this, "createRiver" );
+      const char* res = cValue.getString();
 
       River *newRiver;
       if ( !Sim::findObject( res, newRiver ) )

+ 3 - 2
Engine/source/forest/editor/forestBrushTool.cpp

@@ -588,7 +588,8 @@ void ForestBrushTool::_collectElements()
    if ( !Sim::findObject( "ForestEditBrushTree", brushTree ) )
       return;
       
-   const char* objectIdList = Con::executef( brushTree, "getSelectedObjectList" );
+   ConsoleValue cValue = Con::executef( brushTree, "getSelectedObjectList" );
+   const char* objectIdList = cValue.getString();
 
    // Collect those objects in a vector and mark them as selected.
 
@@ -685,4 +686,4 @@ bool ForestBrushTool::getGroundAt( const Point3F &worldPt, F32 *zValueOut, Vecto
 DefineEngineMethod( ForestBrushTool, collectElements, void, (), , "" )
 {
    object->collectElements();
-}
+}

+ 137 - 7
Engine/source/gui/controls/guiGameListMenuCtrl.cpp

@@ -237,7 +237,7 @@ void GuiGameListMenuCtrl::onRenderListOption(Row* row, Point2I currentOffset)
 
       // calculate text to be at the center between the arrows
       GFont* font = profile->mFont;
-      StringTableEntry text = row->mOptions[row->mSelectedOption];
+      StringTableEntry text = row->mOptions[row->mSelectedOption].mDisplayText;
       S32 textWidth = font->getStrWidth(text);
       S32 columnWidth = profile->mHitAreaLowerRight.x * xScale - profile->mRightPad - columnSplit;
       S32 columnCenter = columnSplit + (columnWidth >> 1);
@@ -489,15 +489,18 @@ void GuiGameListMenuCtrl::addRow(const char* label, const char* optionsList, boo
 {
    static StringTableEntry DELIM = StringTable->insert("\t", true);
    Row* row = new Row();
-   Vector<StringTableEntry> options(__FILE__, __LINE__);
+   Vector<OptionEntry> options(__FILE__, __LINE__);
 
    S32 defaultOption = 0;
 
    S32 count = StringUnit::getUnitCount(optionsList, DELIM);
    for (S32 i = 0; i < count; ++i)
    {
+      OptionEntry e;
       const char* option = StringUnit::getUnit(optionsList, i, DELIM);
-      options.push_back(StringTable->insert(option, true));
+      e.mDisplayText = StringTable->insert(option, true);
+      e.mKeyString = e.mDisplayText;
+      options.push_back(e);
 
       if (String::compare(option, defaultValue) == 0)
          defaultOption = options.size() - 1;
@@ -1075,12 +1078,38 @@ StringTableEntry GuiGameListMenuCtrl::getCurrentOption(S32 rowIndex) const
       Row* row = (Row*)mRows[rowIndex];
       if (row->mSelectedOption != NO_OPTION)
       {
-         return row->mOptions[row->mSelectedOption];
+         return row->mOptions[row->mSelectedOption].mDisplayText;
       }
    }
    return StringTable->insert("", false);
 }
 
+StringTableEntry GuiGameListMenuCtrl::getCurrentOptionKey(S32 rowIndex) const
+{
+   if (isValidRowIndex(rowIndex))
+   {
+      Row* row = (Row*)mRows[rowIndex];
+      if (row->mSelectedOption != NO_OPTION)
+      {
+         return row->mOptions[row->mSelectedOption].mKeyString;
+      }
+   }
+   return StringTable->insert("", false);
+}
+
+S32 GuiGameListMenuCtrl::getCurrentOptionIndex(S32 rowIndex) const
+{
+   if (isValidRowIndex(rowIndex))
+   {
+      Row* row = (Row*)mRows[rowIndex];
+      if (row->mSelectedOption != NO_OPTION)
+      {
+         return row->mSelectedOption;
+      }
+   }
+   return S32(-1);
+}
+
 bool GuiGameListMenuCtrl::selectOption(S32 rowIndex, const char* theOption)
 {
    if (!isValidRowIndex(rowIndex))
@@ -1090,9 +1119,9 @@ bool GuiGameListMenuCtrl::selectOption(S32 rowIndex, const char* theOption)
 
    Row* row = (Row*)mRows[rowIndex];
 
-   for (Vector<StringTableEntry>::iterator anOption = row->mOptions.begin(); anOption < row->mOptions.end(); ++anOption)
+   for (Vector<OptionEntry>::iterator anOption = row->mOptions.begin(); anOption < row->mOptions.end(); ++anOption)
    {
-      if (String::compare(*anOption, theOption) == 0)
+      if (String::compare((*anOption).mDisplayText, theOption) == 0)
       {
          S32 newIndex = anOption - row->mOptions.begin();
          row->mSelectedOption = newIndex;
@@ -1103,6 +1132,45 @@ bool GuiGameListMenuCtrl::selectOption(S32 rowIndex, const char* theOption)
    return false;
 }
 
+bool GuiGameListMenuCtrl::selectOptionByKey(S32 rowIndex, const char* optionKey)
+{
+   if (!isValidRowIndex(rowIndex))
+   {
+      return false;
+   }
+
+   Row* row = (Row*)mRows[rowIndex];
+
+   for (Vector<OptionEntry>::iterator anOption = row->mOptions.begin(); anOption < row->mOptions.end(); ++anOption)
+   {
+      if (String::compare((*anOption).mKeyString, optionKey) == 0)
+      {
+         S32 newIndex = anOption - row->mOptions.begin();
+         row->mSelectedOption = newIndex;
+         return true;
+      }
+   }
+
+   return false;
+}
+
+bool GuiGameListMenuCtrl::selectOptionByIndex(S32 rowIndex, S32 optionIndex)
+{
+   if (!isValidRowIndex(rowIndex) || (optionIndex < 0))
+   {
+      return false;
+   }
+
+   Row* row = (Row*)mRows[rowIndex];
+   if (optionIndex < row->mOptions.size())
+   {
+      row->mSelectedOption = optionIndex;
+      return true;
+   }
+
+   return false;
+}
+
 void GuiGameListMenuCtrl::setOptions(S32 rowIndex, const char* optionsList)
 {
    static StringTableEntry DELIM = StringTable->insert("\t", true);
@@ -1119,7 +1187,10 @@ void GuiGameListMenuCtrl::setOptions(S32 rowIndex, const char* optionsList)
    for (S32 i = 0; i < count; ++i)
    {
       const char* option = StringUnit::getUnit(optionsList, i, DELIM);
-      row->mOptions[i] = StringTable->insert(option, true);
+      OptionEntry e;
+      e.mDisplayText = StringTable->insert(option, true);
+      e.mKeyString = e.mDisplayText;
+      row->mOptions[i] = e;
    }
 
    if (row->mSelectedOption >= row->mOptions.size())
@@ -1128,6 +1199,21 @@ void GuiGameListMenuCtrl::setOptions(S32 rowIndex, const char* optionsList)
    }
 }
 
+void GuiGameListMenuCtrl::addOption(S32 rowIndex, const char* displayText, const char* keyText)
+{
+   if (!isValidRowIndex(rowIndex))
+   {
+      return;
+   }
+
+   OptionEntry e;
+   e.mDisplayText = StringTable->insert(displayText, true);
+   e.mKeyString = (keyText[0] == '\0') ? e.mDisplayText : StringTable->insert(keyText, true);
+
+   Row* row = (Row*)mRows[rowIndex];
+   row->mOptions.push_back(e);
+}
+
 void GuiGameListMenuCtrl::clickOption(Row* row, S32 xPos)
 {
    GuiGameListMenuProfile* profile = (GuiGameListMenuProfile*)mProfile;
@@ -1566,6 +1652,22 @@ DefineEngineMethod(GuiGameListMenuCtrl, getCurrentOption, const char*, (S32 row)
    return object->getCurrentOption(row);
 }
 
+DefineEngineMethod(GuiGameListMenuCtrl, getCurrentOptionKey, const char*, (S32 row), ,
+   "Gets the key string for the currently selected option of the given row.\n\n"
+   "@param row Index of the row to get the option from.\n"
+   "@return The key (or id) that was assigned to the selected option on the given row. If there is no selected option then the empty string is returned.")
+{
+   return object->getCurrentOptionKey(row);
+}
+
+DefineEngineMethod(GuiGameListMenuCtrl, getCurrentOptionIndex, S32, (S32 row), ,
+   "Gets the index into the option list for the currently selected option of the given row.\n\n"
+   "@param row Index of the row to get the option from.\n"
+   "@return The index of the selected option on the given row. If there is no selected option then -1 is returned.")
+{
+   return object->getCurrentOptionIndex(row);
+}
+
 DefineEngineMethod(GuiGameListMenuCtrl, selectOption, bool, (S32 row, const char* option), ,
    "Set the row's current option to the one specified\n\n"
    "@param row Index of the row to set an option on.\n"
@@ -1575,6 +1677,24 @@ DefineEngineMethod(GuiGameListMenuCtrl, selectOption, bool, (S32 row, const char
    return object->selectOption(row, option);
 }
 
+DefineEngineMethod(GuiGameListMenuCtrl, selectOptionByKey, bool, (S32 row, const char* optionKey), ,
+   "Set the row's current option to the one with the specified key.\n\n"
+   "@param row Index of the row to set an option on.\n"
+   "@param optionKey The key string that was assigned to the option to be made active.\n"
+   "@return True if the row contained the key and the option and was set, false otherwise.")
+{
+   return object->selectOptionByKey(row, optionKey);
+}
+
+DefineEngineMethod(GuiGameListMenuCtrl, selectOptionByIndex, bool, (S32 row, S32 optionIndex), ,
+   "Set the row's current option to the one at the specified index.\n\n"
+   "@param row Index of the row to set an option on.\n"
+   "@param optionIndex The index of the option to be made active.\n"
+   "@return True if the index was valid and the option and was set, false otherwise.")
+{
+   return object->selectOptionByIndex(row, optionIndex);
+}
+
 DefineEngineMethod(GuiGameListMenuCtrl, setOptions, void, (S32 row, const char* optionsList), ,
    "Sets the list of options on the given row.\n\n"
    "@param row Index of the row to set options on."
@@ -1583,6 +1703,16 @@ DefineEngineMethod(GuiGameListMenuCtrl, setOptions, void, (S32 row, const char*
    object->setOptions(row, optionsList);
 }
 
+DefineEngineMethod(GuiGameListMenuCtrl, addOption, void, (S32 row, const char* displayText, const char* keyText), (""),
+   "Adds an option to the list of options on the given row.\n\n"
+   "@param row Index of the row to add the option on.\n"
+   "@param displayText The text to display for this option.\n"
+   "@param keyText [Optional] The id string to associate with this value. "
+   "If unset, the id will be the same as the display text.\n")
+{
+   object->addOption(row, displayText, keyText);
+}
+
 DefineEngineMethod(GuiGameListMenuCtrl, getValue, F32, (S32 row), ,
    "Sets the list of options on the given row.\n\n"
    "@param row Index of the row to set options on."

+ 52 - 2
Engine/source/gui/controls/guiGameListMenuCtrl.h

@@ -37,6 +37,18 @@ public:
    typedef GuiGameListMenuProfile Profile;
 
 protected:
+
+   /// \struct OptionEntry
+   /// Display text and ID key for each entry in an option row.
+   struct OptionEntry
+   {
+      StringTableEntry mDisplayText;   ///< The text that is displayed for the option
+      StringTableEntry mKeyString;     ///< Key value that is associated with this option
+      OptionEntry() : mDisplayText(StringTable->EmptyString()), mKeyString(StringTable->EmptyString()) {}
+      virtual ~OptionEntry() {}
+   };
+
+
    /// \struct Row
    /// Internal data representation of a single row in the control.
    struct Row
@@ -60,7 +72,7 @@ protected:
       Mode mMode;
 
       //List options
-      Vector<StringTableEntry>   mOptions;         ///< Collection of options available to display
+      Vector<OptionEntry>        mOptions;         ///< Collection of options available to display
       S32                        mSelectedOption;  ///< Index into mOptions pointing at the selected option
       bool                       mWrapOptions;     ///< Determines if options should "wrap around" at the ends
 
@@ -174,13 +186,43 @@ public:
    /// string is returned.
    StringTableEntry getCurrentOption(S32 rowIndex) const;
 
+   /// Gets the key string for the currently selected option of the given row
+   ///
+   /// \param rowIndex Index of the row to get the option from.
+   /// \return The key (or id) that was assigned to the selected option on the
+   ///  given row. If there is no selected option then the empty string is returned.
+   StringTableEntry getCurrentOptionKey(S32 rowIndex) const;
+
+   /// Gets the index into the option list for the currently selected option of the given row.
+   ///
+   /// \param rowIndex Index of the row to get the option from.
+   /// \return The index of the selected option on the given row. If there is no
+   /// selected option then -1 is returned.
+   S32 getCurrentOptionIndex(S32 rowIndex) const;
+
    /// Attempts to set the given row to the specified selected option. The option
    /// will only be set if the option exists in the control.
    ///
    /// \param rowIndex Index of the row to set an option on.
    /// \param option The option to be made active.
    /// \return True if the row contained the option and was set, false otherwise.
-   bool selectOption(S32 rowIndex, StringTableEntry option);
+   bool selectOption(S32 rowIndex, const char* option);
+
+   /// Attempts to set the given row to the option with the specified key. The
+   /// option will only be set if the key exists in the control.
+   ///
+   /// \param rowIndex Index of the row to set an option on.
+   /// \param optionKey The key string that was assigned to the option to be made active.
+   /// \return True if the row contained the key and the option and was set, false otherwise.
+   bool selectOptionByKey(S32 rowIndex, const char* optionKey);
+
+   /// Attempts to set the given row to the option at the specified index. The option
+   /// will only be set if the index is valid.
+   ///
+   /// \param rowIndex Index of the row to set an option on.
+   /// \param optionIndex The index of the option to be made active.
+   /// \return True if the index was valid and the option and was set, false otherwise.
+   bool selectOptionByIndex(S32 rowIndex, S32 optionIndex);
 
    /// Sets the list of options on the given row.
    ///
@@ -188,6 +230,14 @@ public:
    /// \param optionsList A tab separated list of options for the control.
    void setOptions(S32 rowIndex, const char* optionsList);
 
+   /// Adds an option to the list of options on the given row.
+   ///
+   /// \param rowIndex Index of the row to set options on.
+   /// \param displayText The text to display for this option.
+   /// \param keyText The id string to associate with this value. If NULL the
+   ///  id will be the same as the display text.
+   void addOption(S32 rowIndex, const char* displayText, const char* keyText);
+
    /// Activates the current row. The script callback of  the current row will
    /// be called (if it has one).
    virtual void activateRow();

+ 3 - 1
Engine/source/gui/controls/guiTreeViewCtrl.cpp

@@ -637,7 +637,9 @@ void GuiTreeViewCtrl::Item::getTooltipText(U32 bufLen, char *buf)
          method += pClassName;
          if(mParentControl->isMethod(method.c_str()))
          {
-            const char* tooltip = Con::executef( mParentControl, method.c_str(), pObject->getIdString() );
+            ConsoleValue cValue = Con::executef( mParentControl, method.c_str(), pObject->getIdString() );
+            const char* tooltip = cValue.getString();
+
             dsize_t len = dStrlen(buf);
             S32 newBufLen = bufLen-len;
             if(dStrlen(tooltip) > 0 && newBufLen > 0)

+ 54 - 6
Engine/source/gui/core/guiCanvas.cpp

@@ -94,6 +94,33 @@ ConsoleDocClass( GuiCanvas,
 
    "@ingroup GuiCore\n");
 
+   ImplementEnumType(KeyboardTranslationMode,
+      "Modes for handling keyboard translation or native accelerator requests.\n\n")
+      { GuiCanvas::TranslationMode_Platform, "Platform",
+         "Requests will be passed to the platform window for handling." },
+      { GuiCanvas::TranslationMode_Callback, "Callback",
+         "Script callbacks will be issued to notify and allow override of these events." },
+      { GuiCanvas::TranslationMode_Ignore, "Ignore",
+         "Requsts to enable/disable keyboard translations or native accelerators will be ignored "
+         "with no callback triggered." },
+   EndImplementEnumType;
+
+   IMPLEMENT_CALLBACK(GuiCanvas, onSetKeyboardTranslationEnabled, bool, (bool enable), (enable),
+      "Called when the canvas receives an enableKeyboardTranslation request. This is usually the "
+      "result of a GuitTextInputCtrl gaining or losing focus. Return true to allow the request "
+      "to be passed to the platform window. Return false to override the request and handle it in script.\n\n"
+      "@note This callback is only issued if keyTranslationMode is set to \"Callback\" for this canvas.\n"
+      "@param enable Requested keyboard translation state.\n"
+      "@see KeyboardTranslationMode\n");
+
+   IMPLEMENT_CALLBACK(GuiCanvas, onSetNativeAcceleratorsEnabled, bool, (bool enable), (enable),
+      "Called when the canvas receives a setNativeAcceleratorsEnabled request. This is usually the "
+      "result of a GuitTextInputCtrl gaining or losing focus. Return true to allow the request to "
+      "be passed to the platform window. Return false to override the request and handle it in script.\n\n"
+      "@note This callback is only issued if nativeAcceleratorMode is set to \"Callback\" for this canvas.\n"
+      "@param enable Requested accelerator state.\n"
+      "@see KeyboardTranslationMode\n");
+
 ColorI gCanvasClearColor( 255, 0, 255 ); ///< For GFX->clear
 
 extern InputModifiers convertModifierBits(const U32 in);
@@ -127,6 +154,8 @@ GuiCanvas::GuiCanvas(): GuiControl(),
                         mHoverPositionSet(false),
                         mLeftMouseLast(false),
                         mHoverLeftControlTime(0),
+                        mKeyTranslationMode(TranslationMode_Platform),
+                        mNativeAcceleratorMode(TranslationMode_Platform),
                         mMiddleMouseLast(false),
                         mRightMouseLast(false),
                         mMouseDownPoint(0.0f,0.0f),
@@ -183,6 +212,13 @@ void GuiCanvas::initPersistFields()
    addField("displayWindow", TypeBool, Offset(mDisplayWindow, GuiCanvas), "Controls if the canvas window is rendered or not." );
    endGroup("Canvas Rendering");
 
+   addGroup("KeyboardMode Callbacks");
+   addField("keyTranslationMode", TYPEID< KeyTranslationMode >(), Offset(mKeyTranslationMode, GuiCanvas),
+      "How to handle enable/disable keyboard translation requests. \"Platform\", \"Callback\" or \"Ignore\".\n");
+   addField("nativeAcceleratorMode", TYPEID< KeyTranslationMode >(), Offset(mNativeAcceleratorMode, GuiCanvas),
+      "How to handle enable/disable native accelerator requests. \"Platform\", \"Callback\" or \"Ignore\".\n");
+   endGroup("KeyboardMode Callbacks");
+
    Parent::initPersistFields();
 }
 
@@ -442,20 +478,32 @@ Point2I GuiCanvas::getWindowSize()
 
 void GuiCanvas::enableKeyboardTranslation()
 {
-   AssertISV(mPlatformWindow, "GuiCanvas::enableKeyboardTranslation - no window present!");
-   mPlatformWindow->setKeyboardTranslation(true);
+   if ((mKeyTranslationMode == TranslationMode_Platform) ||
+      ((mKeyTranslationMode == TranslationMode_Callback) && onSetKeyboardTranslationEnabled_callback(true)))
+   {
+      AssertISV(mPlatformWindow, "GuiCanvas::enableKeyboardTranslation - no window present!");
+      mPlatformWindow->setKeyboardTranslation(true);
+   }
 }
 
 void GuiCanvas::disableKeyboardTranslation()
 {
-   AssertISV(mPlatformWindow, "GuiCanvas::disableKeyboardTranslation - no window present!");
-   mPlatformWindow->setKeyboardTranslation(false);
+   if ((mKeyTranslationMode == TranslationMode_Platform) ||
+      ((mKeyTranslationMode == TranslationMode_Callback) && onSetKeyboardTranslationEnabled_callback(false)))
+   {
+      AssertISV(mPlatformWindow, "GuiCanvas::disableKeyboardTranslation - no window present!");
+      mPlatformWindow->setKeyboardTranslation(false);
+   }
 }
 
 void GuiCanvas::setNativeAcceleratorsEnabled( bool enabled )
 {
-   AssertISV(mPlatformWindow, "GuiCanvas::setNativeAcceleratorsEnabled - no window present!");
-   mPlatformWindow->setAcceleratorsEnabled( enabled );
+   if ((mNativeAcceleratorMode == TranslationMode_Platform) ||
+      ((mNativeAcceleratorMode == TranslationMode_Callback) && onSetNativeAcceleratorsEnabled_callback(enabled)))
+   {
+      AssertISV(mPlatformWindow, "GuiCanvas::setNativeAcceleratorsEnabled - no window present!");
+      mPlatformWindow->setAcceleratorsEnabled(enabled);
+   }
 }
 
 void GuiCanvas::setForceMouseToGUI(bool onOff)

+ 19 - 0
Engine/source/gui/core/guiCanvas.h

@@ -178,6 +178,19 @@ protected:
    bool           mHoverPositionSet;
    U32            mHoverLeftControlTime;
 
+public:
+   /// Setting for how to handle 'enableKeyboardTranslation' and 'setNativeAcceleratorsEnabled' requests.
+   enum KeyTranslationMode
+   {
+      TranslationMode_Platform,
+      TranslationMode_Callback,
+      TranslationMode_Ignore,
+   };
+
+protected:
+   KeyTranslationMode mKeyTranslationMode;
+   KeyTranslationMode mNativeAcceleratorMode;
+
    /// @}
 
    // Internal event handling callbacks for use with PlatformWindow.
@@ -454,6 +467,10 @@ public:
 
    virtual void setWindowTitle(const char *newTitle);
 
+   DECLARE_CALLBACK(bool, onSetKeyboardTranslationEnabled, (bool enable));
+   DECLARE_CALLBACK(bool, onSetNativeAcceleratorsEnabled, (bool enable));
+
+
 private:
    static const U32 MAX_GAMEPADS = 4; ///< The maximum number of supported gamepads
   protected:
@@ -464,5 +481,7 @@ private:
      void setConsumeLastInputEvent(bool flag) { mConsumeLastInputEvent = flag; }
      bool getLastCursorPoint(Point2I& pt) const { pt = mLastCursorPt; return mLastCursorEnabled; }
 };
+typedef GuiCanvas::KeyTranslationMode KeyboardTranslationMode;
+DefineEnumType(KeyboardTranslationMode);
 
 #endif

+ 3 - 1
Engine/source/gui/editor/guiPopupMenuCtrl.cpp

@@ -226,7 +226,9 @@ void GuiPopupMenuTextListCtrl::onMouseUp(const GuiEvent &event)
       if (item)
       {
          if (item->mEnabled)
-            dAtob(Con::executef(mPopup, "onSelectItem", Con::getIntArg(getSelectedCell().y), item->mText.isNotEmpty() ? item->mText : ""));
+         {
+            Con::executef(mPopup, "onSelectItem", Con::getIntArg(getSelectedCell().y), item->mText.isNotEmpty() ? item->mText : "");
+         }
       }
    }
 

+ 2 - 1
Engine/source/gui/editor/popupMenu.cpp

@@ -288,7 +288,8 @@ bool PopupMenu::canHandleID(U32 id)
 
 bool PopupMenu::handleSelect(U32 command, const char *text /* = NULL */)
 {
-   return dAtob(Con::executef(this, "onSelectItem", Con::getIntArg(command), text ? text : ""));
+   ConsoleValue cValue = Con::executef(this, "onSelectItem", Con::getIntArg(command), text ? text : "");
+   return cValue.getBool();
 }
 
 //////////////////////////////////////////////////////////////////////////

+ 5 - 3
Engine/source/gui/worldEditor/worldEditor.cpp

@@ -461,7 +461,9 @@ bool WorldEditor::pasteSelection( bool dropSel )
    SimGroup *targetGroup = NULL;   
    if( isMethod( "getNewObjectGroup" ) )
    {
-      const char* targetGroupName = Con::executef( this, "getNewObjectGroup" );
+      ConsoleValue cValue = Con::executef( this, "getNewObjectGroup" );
+      const char* targetGroupName = cValue.getString();
+
       if( targetGroupName && targetGroupName[ 0 ] && !Sim::findObject( targetGroupName, targetGroup) )
          Con::errorf( "WorldEditor::pasteSelection() - no SimGroup called '%s'", targetGroupName );
    }
@@ -1993,12 +1995,12 @@ void WorldEditor::on3DMouseMove(const Gui3DMouseEvent & event)
    if ( !mHitObject )
    {
       SceneObject *hitObj = NULL;
-      if ( collide(event, &hitObj) && hitObj->isSelectionEnabled() && !objClassIgnored(hitObj) )
+      if ( collide(event, &hitObj) && !hitObj->isDeleted() && hitObj->isSelectionEnabled() && !objClassIgnored(hitObj) )
       {
          mHitObject = hitObj;
       }
    }
-   
+
    mLastMouseEvent = event;
 }
 

+ 9 - 2
Engine/source/math/mRotation.cpp

@@ -325,14 +325,21 @@ TEST(Maths, RotationF_Calculations)
 };
 #endif
 
-DefineEngineFunction(AddRotation, RotationF, (RotationF a, RotationF b), ,
+DefineEngineFunction(AddRotation, RotationF, (RotationF a, RotationF b, const char* returnType), ("Euler"),
    "Adds two rotations together.\n"
    "@param a Rotation one."
    "@param b Rotation two."
    "@returns v sum of both rotations."
    "@ingroup Math")
 {
-   return a + b;
+   RotationF ret;
+   RotationF sum = a + b;
+   if (String(returnType) == String("Euler"))
+      ret.set(sum.asEulerF());
+   else
+      ret.set(sum.asAxisAngle());
+
+   return ret;
 }
  
 DefineEngineFunction(SubtractRotation, RotationF, (RotationF a, RotationF b), ,

+ 10 - 2
Engine/source/math/mathTypes.cpp

@@ -620,8 +620,16 @@ ConsoleGetType(TypeRotationF)
    static const U32 bufSize = 256;
    char* returnBuffer = Con::getReturnBuffer(bufSize);
 
-   EulerF out = pt->asEulerF(RotationF::Degrees);
-   dSprintf(returnBuffer, bufSize, "%g %g %g", out.x, out.y, out.z);
+   if (pt->mRotationType == RotationF::Euler)
+   {
+      EulerF out = pt->asEulerF(RotationF::Degrees);
+      dSprintf(returnBuffer, bufSize, "%g %g %g", out.x, out.y, out.z);
+   }
+   else if (pt->mRotationType == RotationF::AxisAngle)
+   {
+      AngAxisF out = pt->asAxisAngle(RotationF::Degrees);
+      dSprintf(returnBuffer, bufSize, "%g %g %g %g", out.axis.x, out.axis.y, out.axis.z, out.angle);
+   }
 
    return returnBuffer;
 }

+ 4 - 2
Engine/source/module/moduleManager.cpp

@@ -397,7 +397,8 @@ bool ModuleManager::loadModuleGroup( const char* pModuleGroup )
         if ( pLoadReadyModuleDefinition->getModuleScriptFilePath() != StringTable->EmptyString() )
         {
             // Yes, so execute the script file.
-            const bool scriptFileExecuted = dAtob( Con::executef("exec", pLoadReadyModuleDefinition->getModuleScriptFilePath() ) );
+            ConsoleValue cValue = Con::executef("exec", pLoadReadyModuleDefinition->getModuleScriptFilePath());
+            const bool scriptFileExecuted = cValue.getBool();
 
             // Did we execute the script file?
             if ( scriptFileExecuted )
@@ -784,7 +785,8 @@ bool ModuleManager::loadModuleExplicit( const char* pModuleId, const U32 version
         if ( pLoadReadyModuleDefinition->getModuleScriptFilePath() != StringTable->EmptyString() )
         {
             // Yes, so execute the script file.
-            const bool scriptFileExecuted = dAtob( Con::executef("exec", pLoadReadyModuleDefinition->getModuleScriptFilePath() ) );
+            ConsoleValue cValue = Con::executef("exec", pLoadReadyModuleDefinition->getModuleScriptFilePath());
+            const bool scriptFileExecuted = cValue.getBool();
 
             // Did we execute the script file?
             if ( !scriptFileExecuted )

+ 13 - 3
Engine/source/platformX86UNIX/x86UNIXConsole.cpp

@@ -41,7 +41,10 @@ StdConsole *stdConsole = NULL;
 DefineEngineFunction(enableWinConsole, void, (bool _enable),, "enableWinConsole(bool);")
 {
    if (stdConsole)
-      stdConsole->enable(_enable);
+   {
+       stdConsole->enable(_enable);
+       stdConsole->enableInput(_enable);
+   }
 }
 
 void StdConsole::create()
@@ -141,6 +144,9 @@ StdConsole::StdConsole()
    stdIn  = dup(0);
    stdErr = dup(2);
 
+   // Ensure in buffer is null terminated after allocation
+   inbuf[0] = 0x00;
+
    iCmdIndex = 0;
    stdConsoleEnabled = false;
    stdConsoleInputEnabled = false;
@@ -195,11 +201,14 @@ void StdConsole::processConsoleLine(const char *consoleLine)
 {
    if(stdConsoleEnabled)
    {
-      inbuf[inpos] = 0;
       if(lineOutput)
          printf("%s\n", consoleLine);
       else
-         printf("%c%s\n%s%s", '\r', consoleLine, Con::getVariable("Con::Prompt"), inbuf);
+      {
+          // Clear current line before outputting the console line. This prevents prompt text from overflowing onto normal output.
+          printf("%c[2K", 27);
+          printf("%c%s\n%s%s", '\r', consoleLine, Con::getVariable("Con::Prompt"), inbuf);
+      }
    }
 }
 
@@ -323,6 +332,7 @@ void StdConsole::process()
 
                   printf("%s", Con::getVariable("Con::Prompt"));
                   inpos = outpos = 0;
+                  inbuf[0] = 0x00; // Ensure inbuf is NULL terminated after sending out command
                   break;
             case 27:
                // JMQTODO: are these magic numbers keyboard map specific?

+ 16 - 5
Engine/source/sfx/openal/aldlist.cpp

@@ -55,9 +55,20 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
    defaultDeviceIndex = 0;
 
    // grab function pointers for 1.0-API functions, and if successful proceed to enumerate all devices
-   if (ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT")) {
-      devices = (char *)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER);
-      defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
+   const bool enumerationExtensionPresent = ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATION_EXT");
+   const bool enumerateAllExtensionPresent = ALFunction.alcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT");
+   if (enumerateAllExtensionPresent || enumerationExtensionPresent) {
+      if (enumerateAllExtensionPresent)
+      {
+          devices = (char *)ALFunction.alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER);
+          defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER);
+      }
+      else
+      {
+          devices = (char *)ALFunction.alcGetString(NULL, ALC_DEVICE_SPECIFIER);
+          defaultDeviceName = (char *)ALFunction.alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
+      }
+
       index = 0;
       // go through device list (each device terminated with a single NULL, list terminated with double NULL)
       while (*devices != 0) {
@@ -70,7 +81,7 @@ ALDeviceList::ALDeviceList( const OPENALFNTABLE &oalft )
             if (context) {
                ALFunction.alcMakeContextCurrent(context);
                // if new actual device name isn't already in the list, then add it...
-               actualDeviceName = ALFunction.alcGetString(device, ALC_DEVICE_SPECIFIER);
+               actualDeviceName = devices;
                bool bNewName = true;
                for (int i = 0; i < GetNumDevices(); i++) {
                   if (String::compare(GetDeviceName(i), actualDeviceName) == 0) {
@@ -313,4 +324,4 @@ unsigned int ALDeviceList::GetMaxNumSources()
 	}
 
 	return iSourceCount;
-}
+}

+ 0 - 4
Engine/source/util/messaging/scriptMsgListener.cpp

@@ -121,7 +121,6 @@ IMPLEMENT_CALLBACK( ScriptMsgListener, onMessageReceived, bool, ( const char* qu
 bool ScriptMsgListener::onMessageReceived(StringTableEntry queue, const char* event, const char* data)
 {
 	return onMessageReceived_callback(queue, event, data);
-   //return dAtob(Con::executef(this, "onMessageReceived", queue, event, data));
 }
 
 IMPLEMENT_CALLBACK( ScriptMsgListener, onMessageObjectReceived, bool, ( const char* queue, Message *msg ), ( queue, msg ),
@@ -135,7 +134,6 @@ IMPLEMENT_CALLBACK( ScriptMsgListener, onMessageObjectReceived, bool, ( const ch
 bool ScriptMsgListener::onMessageObjectReceived(StringTableEntry queue, Message *msg)
 {
 	return onMessageObjectReceived_callback(queue, msg);
-   //return dAtob(Con::executef(this, "onMessageObjectReceived", queue, Con::getIntArg(msg->getId())));
 }
 
 //-----------------------------------------------------------------------------
@@ -150,7 +148,6 @@ IMPLEMENT_CALLBACK( ScriptMsgListener, onAddToQueue, void, ( const char* queue),
 
 void ScriptMsgListener::onAddToQueue(StringTableEntry queue)
 {
-   //Con::executef(this, "onAddToQueue", queue);
    onAddToQueue_callback(queue);
    IMLParent::onAddToQueue(queue);
 }
@@ -176,7 +173,6 @@ IMPLEMENT_CALLBACK( ScriptMsgListener, onRemoveFromQueue, void, ( const char* qu
 
 void ScriptMsgListener::onRemoveFromQueue(StringTableEntry queue)
 {
-   //Con::executef(this, "onRemoveFromQueue", queue);
    onRemoveFromQueue_callback(queue);
    IMLParent::onRemoveFromQueue(queue);
 }

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript

@@ -1802,7 +1802,7 @@ function matchesSearch(%assetName, %assetType)
          }
          else
          {
-            if(%assetName.tags !$= %word)
+            if(strstr(strlwr(%assetName.tags), strlwr(%word)) != -1)
                %matchTags = true;
          }
       }

+ 7 - 10
Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript

@@ -1097,9 +1097,6 @@ function MaterialEditorGui::updateActiveMaterial(%this, %propertyField, %value,
 {
    MaterialEditorGui.setMaterialDirty();
 
-   if(%value $= "")
-      %value = "\"\"";
-   
    // Here is where we handle undo actions with slider controls. We want to be able to
    // undo every onMouseUp; so we overrite the same undo action when necessary in order
    // to achieve this desired effect.
@@ -1130,7 +1127,7 @@ function MaterialEditorGui::updateActiveMaterial(%this, %propertyField, %value,
    
    if (MaterialEditorGui.livePreview == true)
    {
-      MaterialEditorGui.setFieldValue(%propertyField, %value);
+      MaterialEditorGui.currentMaterial.setFieldValue(%propertyField, %value);
       MaterialEditorGui.currentMaterial.flush();
       MaterialEditorGui.currentMaterial.reload();
    }
@@ -1263,8 +1260,8 @@ function MaterialEditorGui::doUpdateTextureMap( %this, %assetId )
          %bitmap = strreplace(%bitmap,"tools/materialEditor/scripts/","");
          %bitmapCtrl.setBitmap(%bitmap);
          %textCtrl.setText(%assetId);
-         MaterialEditorGui.updateActiveMaterial(%type @ "Map[" @ %layer @ "]","\"\"");
-         MaterialEditorGui.updateActiveMaterial(%type @ "MapAsset[" @ %layer @ "]","\"" @ %assetId @ "\"");	
+         MaterialEditorGui.updateActiveMaterial(%type @ "Map[" @ %layer @ "]","");
+         MaterialEditorGui.updateActiveMaterial(%type @ "MapAsset[" @ %layer @ "]", %assetId);	
       }
    }
    
@@ -1276,7 +1273,7 @@ function MaterialEditorGui::updateDetailScale(%this,%newScale)
 {
    %layer = MaterialEditorGui.currentLayer;
    
-   %detailScale = "\"" @ %newScale SPC %newScale @ "\"";
+   %detailScale = %newScale SPC %newScale;
    MaterialEditorGui.updateActiveMaterial("detailScale[" @ %layer @ "]", %detailScale);
    }
    
@@ -1284,7 +1281,7 @@ function MaterialEditorGui::updateDetailNormalStrength(%this,%newStrength)
 {
    %layer = MaterialEditorGui.currentLayer;
    
-   %detailStrength = "\"" @ %newStrength @ "\"";
+   %detailStrength = %newStrength;
    MaterialEditorGui.updateActiveMaterial("detailNormalMapStrength[" @ %layer @ "]", %detailStrength);
 }
 
@@ -1295,7 +1292,7 @@ function MaterialEditorGui::updateRotationOffset(%this, %isSlider, %onMouseUp)
 	%Y = MaterialEditorPropertiesWindow-->RotationTextEditV.getText();
 	MaterialEditorPropertiesWindow-->RotationCrosshair.setPosition(45*mAbs(%X)-2, 45*mAbs(%Y)-2);
 	
-	MaterialEditorGui.updateActiveMaterial("rotPivotOffset[" @ %layer @ "]","\"" @ %X SPC %Y @ "\"",%isSlider,%onMouseUp);
+	MaterialEditorGui.updateActiveMaterial("rotPivotOffset[" @ %layer @ "]", %X SPC %Y,%isSlider,%onMouseUp);
 }
 
 function MaterialEditorGui::updateRotationSpeed(%this, %isSlider, %onMouseUp)
@@ -1457,7 +1454,7 @@ function MaterialEditorGui::syncGuiColor(%this, %guiCtrl, %propname, %color)
    %a = getWord(%color,3);
 
    %colorSwatch = (%r SPC %g SPC %b SPC %a);
-   %color = "\"" @ %r SPC %g SPC %b SPC %a @ "\"";
+   %color = %r SPC %g SPC %b SPC %a;
 
    %guiCtrl.color = %colorSwatch;
 	MaterialEditorGui.updateActiveMaterial(%propName, %color);

+ 20 - 22
Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript

@@ -516,31 +516,24 @@ function testFilenameExtensions(%filename)
 
 function processLegacyField(%line, %originalFieldName, %newFieldName)
 {
-   if(!strIsMatchExpr("*"@%originalFieldName@"=*\"*\";*", %line) && 
-      !strIsMatchExpr("*"@%originalFieldName@"[*=*\"*\";*", %line) &&
-      !strIsMatchExpr("*"@%originalFieldName@" *=*\"*\";*", %line))
+   if(!strIsMatchExpr("*"@%originalFieldName@"=*;*", %line) && 
+      !strIsMatchExpr("*"@%originalFieldName@"[*=*;*", %line) &&
+      !strIsMatchExpr("*"@%originalFieldName@" *=*;*", %line))
       return %line;
       
    %outLine = strreplace(%line, %originalFieldName, %newFieldName);
    
    //get the value
    %value = "";
-   %pos = strpos(%outLine, "= \"");
+   %pos = strpos(%outLine, "=");
    if(%pos != -1)
    {
-     %endPos = strpos(%outLine, "\";", %pos); 
+     %endPos = strpos(%outLine, ";", %pos); 
+     %value = getSubStr(%outLine, %pos+1, %endPos-%pos-1);
      
-     %value = getSubStr(%outLine, %pos+3, %endPos-%pos-3);
-   }
-   else
-   {
-      %pos = strpos(%outLine, "=\"");
-      if(%pos != -1)
-      {
-        %endPos = strpos(%outLine, "\";", %pos); 
-        
-        %value = getSubStr(%outLine, %pos+2, %endPos-%pos-2);
-      }
+     %originalValue = %value;
+     %value = trim(%value);
+     %value = strreplace(%value, "\"", "");
    }
    
    if(%outLine !$= %line && %pos != -1 && %endPos != -1 && %value !$= "")
@@ -557,8 +550,13 @@ function processLegacyField(%line, %originalFieldName, %newFieldName)
       
       if(isObject(%targetFilename))
       {
-         if(%originalFieldName $= "soundProfile")
+         //likely a material name, so handle it that way
+         %assetId = MaterialAsset::getAssetIdByMaterialName(%targetFilename);
+           
+         if(%assetId $= "" || %assetId $= "Core_Rendering:NoMaterial")
          {
+            //if not, just do a lookup directly to see if it was another asset by that name
+            //e.g. sound profiles when converted will match names
             $ProjectImporter::assetQuery.clear();
             %foundAssets = AssetDatabase.findAssetName($ProjectImporter::assetQuery, %targetFilename);
             if(%foundAssets != 0)
@@ -566,11 +564,6 @@ function processLegacyField(%line, %originalFieldName, %newFieldName)
                %assetId = $ProjectImporter::assetQuery.getAsset(0);  
             }
          }
-         else
-         {
-            //likely a material name, so handle it that way
-            %assetId = MaterialAsset::getAssetIdByMaterialName(%targetFilename);
-         }
       }
       else
       {
@@ -605,6 +598,11 @@ function processLegacyField(%line, %originalFieldName, %newFieldName)
       if(%assetId !$= "" && AssetDatabase.isDeclaredAsset(%assetId))
       {
          echo("Legacy Project Importer - processing of legacy field line's value: " @ %value @ " has found a matching AssetId: " @ %assetId);
+         
+         //double check if this already had the quotes around the value or not
+         if(!strIsMatchExpr("*\"*\"*", %originalValue))
+            %assetId = "\"" @ %assetId @ "\"";
+         
          //if (%assetId.getStatusString() $= "Ok")
          %outLine = strReplace(%outLine, %value, %assetId);
          //else

+ 1 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/editors/creator.ed.tscript

@@ -227,7 +227,7 @@ function EWCreatorWindow::createObject( %this, %cmd )
       %this.setNewObjectGroup( getScene(0) );
 
    pushInstantGroup();
-   %objId = eval(%cmd);
+   %objId = eval("return " @ %cmd);
    popInstantGroup();
    
    if( isObject( %objId ) )

+ 11 - 6
Templates/Modules/inputTest/inputTest.tscript

@@ -4,6 +4,11 @@
 
 function inputTest::create( %this )
 {
+   // If addToMainMenu is true, a button to display the input monitor will be
+   // added to the MainMenu gui. If false, you will need to call
+   // "$GameCanvas.pushDialog(InputMonitorDlg);" from the console or add a
+   // shortcut somewhere else to access the Input Event Monitor.
+   %this.addToMainMenu = true;
 }
 
 function inputTest::destroy( %this )
@@ -13,12 +18,12 @@ function inputTest::destroy( %this )
 
 function inputTest::initClient( %this )
 {
-   %this.queueExec("/scripts/customProfiles." @ $TorqueScriptFileExtension);
-   %this.queueExec("/scripts/inputMonitor." @ $TorqueScriptFileExtension);
-   %this.queueExec("/scripts/gui/inputMonitor.gui");
-   %this.queueExec("/scripts/joystickSettings." @ $TorqueScriptFileExtension);
-   %this.queueExec("/scripts/gui/joystickSettings.gui");
-   %this.queueExec("/scripts/menuButtons." @ $TorqueScriptFileExtension);
+   %this.queueExec("./scripts/customProfiles." @ $TorqueScriptFileExtension);
+   %this.queueExec("./scripts/inputMonitor." @ $TorqueScriptFileExtension);
+   %this.queueExec("./scripts/gui/inputMonitor.gui");
+   %this.queueExec("./scripts/joystickSettings." @ $TorqueScriptFileExtension);
+   %this.queueExec("./scripts/gui/joystickSettings.gui");
+   %this.queueExec("./scripts/menuButtons." @ $TorqueScriptFileExtension);
 }
 
 function onSDLDeviceConnected(%sdlIndex, %deviceName, %deviceType)

+ 1 - 1
Templates/Modules/inputTest/scripts/gui/inputMonitor.gui

@@ -55,7 +55,7 @@ $guiContent = new GuiControl(InputMonitorDlg) {
          canSaveDynamicFields = "0";
       };
       new GuiChunkedBitmapCtrl() {
-         bitmap = "data/ui/art/hudfill.png";
+         bitmap = "data/ui/images/hudfill.png";
          useVariable = "0";
          tile = "0";
          position = "0 0";

+ 7 - 1
Templates/Modules/inputTest/scripts/menuButtons.tscript

@@ -2,6 +2,8 @@
 // Add buttons to the MainMenu after all other scripts have been exec'ed.
 //-----------------------------------------------------------------------------
 
+function inputTest::addMenuButton( %this )
+{
    if (isObject(MainMenuGui))
    {
       %testBtn = new GuiButtonCtrl() {
@@ -56,4 +58,8 @@
       }
 
       MMTestContainer.add(%testBtn);
-   }
+   }
+}
+
+if (inputTest.addToMainMenu)
+   inputTest.addMenuButton();