Преглед на файлове

Merge remote-tracking branch 'devhead/Preview4_0' into tsneo

# Conflicts:
#	Engine/source/platform/types.visualc.h
#	Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript
#	Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.tscript
#	Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.tscript
#	Templates/BaseGame/game/tools/gui/scriptEditorDlg.ed.gui
Jeff Hutchinson преди 4 години
родител
ревизия
17231ca9fb
променени са 51 файла, в които са добавени 728 реда и са изтрити 480 реда
  1. 4 4
      Engine/source/T3D/assets/ImageAsset.cpp
  2. 7 0
      Engine/source/T3D/assets/TerrainAsset.cpp
  3. 2 2
      Engine/source/core/util/str.cpp
  4. 31 0
      Engine/source/gui/controls/guiPopUpCtrl.cpp
  5. 1 1
      Engine/source/gui/editor/inspector/variableInspector.cpp
  6. 11 11
      Engine/source/platform/threads/thread.h
  7. 1 0
      Engine/source/platform/types.gcc.h
  8. 5 5
      Engine/source/platformSDL/threads/thread.cpp
  9. 4 4
      Engine/source/platformWin32/threads/thread.cpp
  10. 5 5
      Engine/source/platformX86UNIX/threads/thread.cpp
  11. 1 1
      Engine/source/sfx/sfxInternal.h
  12. 8 3
      Templates/BaseGame/game/tools/VPathEditor/Scripts/Plugin.tscript
  13. 1 1
      Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui
  14. 35 33
      Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui
  15. 3 2
      Templates/BaseGame/game/tools/assetBrowser/guis/selectModule.gui
  16. 1 4
      Templates/BaseGame/game/tools/assetBrowser/main.tscript
  17. 5 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.tscript
  18. 79 34
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript
  19. 23 10
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript
  20. 14 18
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript
  21. 17 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.tscript
  22. 5 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.tscript
  23. 15 30
      Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript
  24. 9 4
      Templates/BaseGame/game/tools/assetBrowser/scripts/selectModule.tscript
  25. 9 4
      Templates/BaseGame/game/tools/convexEditor/main.tscript
  26. 6 0
      Templates/BaseGame/game/tools/datablockEditor/datablockEditor.tscript
  27. 5 0
      Templates/BaseGame/game/tools/decalEditor/decalEditorGui.tscript
  28. 6 0
      Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript
  29. 7 3
      Templates/BaseGame/game/tools/forestEditor/main.tscript
  30. 26 2
      Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.tscript
  31. 5 1
      Templates/BaseGame/game/tools/gui/profiles.ed.tscript
  32. 102 94
      Templates/BaseGame/game/tools/gui/scriptEditorDlg.ed.gui
  33. 82 133
      Templates/BaseGame/game/tools/guiEditor/gui/guiEditor.ed.gui
  34. 5 1
      Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript
  35. 8 4
      Templates/BaseGame/game/tools/meshRoadEditor/main.tscript
  36. 1 1
      Templates/BaseGame/game/tools/meshRoadEditor/meshRoadEditorToolbar.gui
  37. 6 4
      Templates/BaseGame/game/tools/navEditor/main.tscript
  38. 5 0
      Templates/BaseGame/game/tools/particleEditor/particleEmitterEditor.ed.tscript
  39. 5 0
      Templates/BaseGame/game/tools/particleEditor/particleParticleEditor.ed.tscript
  40. 1 1
      Templates/BaseGame/game/tools/riverEditor/RiverEditorToolbar.gui
  41. 7 4
      Templates/BaseGame/game/tools/riverEditor/main.tscript
  42. 1 1
      Templates/BaseGame/game/tools/roadEditor/RoadEditorToolbar.gui
  43. 6 4
      Templates/BaseGame/game/tools/roadEditor/main.tscript
  44. 6 5
      Templates/BaseGame/game/tools/shapeEditor/main.tscript
  45. 94 0
      Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui
  46. 0 25
      Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui
  47. 20 11
      Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript
  48. 2 0
      Templates/BaseGame/game/tools/worldEditor/scripts/editor.keybinds.tscript
  49. 1 1
      Templates/BaseGame/game/tools/worldEditor/scripts/editors/terrainEditor.ed.tscript
  50. 19 5
      Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript
  51. 6 1
      Templates/BaseGame/game/tools/worldEditor/scripts/menuHandlers.ed.tscript

+ 4 - 4
Engine/source/T3D/assets/ImageAsset.cpp

@@ -438,15 +438,15 @@ ImageAsset::ImageTypes ImageAsset::getImageTypeFromName(const char* name)
 }
 
 DefineEngineMethod(ImageAsset, getImagePath, const char*, (), ,
-   "Creates an instance of the given GameObject given the asset definition.\n"
-   "@return The GameObject entity created from the asset.")
+   "Gets the image filepath of this asset.\n"
+   "@return File path of the image file.")
 {
    return object->getImagePath();
 }
 
 DefineEngineMethod(ImageAsset, getImageInfo, const char*, (), ,
-   "Creates an instance of the given GameObject given the asset definition.\n"
-   "@return The GameObject entity created from the asset.")
+   "Gets the info and properties of the image.\n"
+   "@return The info/properties of the image.")
 {
    return object->getImageInfo();
 }

+ 7 - 0
Engine/source/T3D/assets/TerrainAsset.cpp

@@ -429,6 +429,13 @@ void TerrainAsset::copyTo(SimObject* object)
    Parent::copyTo(object);
 }
 
+DefineEngineMethod(TerrainAsset, getTerrainFilePath, const char*, (), ,
+   "Gets the terrain filepath of this asset.\n"
+   "@return File path of the terrain file.")
+{
+   return object->getTerrainFilePath();
+}
+
 //-----------------------------------------------------------------------------
 // GuiInspectorTypeAssetId
 //-----------------------------------------------------------------------------

+ 2 - 2
Engine/source/core/util/str.cpp

@@ -284,8 +284,8 @@ class String::StringData : protected StringDataImpl
             delete [] mUTF16;
       }
 
-      void* operator new(size_t size, U32 len);
-      void* operator new( size_t size, U32 len, DataChunker& chunker );
+      void* TORQUE_NOINLINE operator new(size_t size, U32 len);
+      void* TORQUE_NOINLINE operator new( size_t size, U32 len, DataChunker& chunker );
       void operator delete(void *);
 
       bool isShared() const

+ 31 - 0
Engine/source/gui/controls/guiPopUpCtrl.cpp

@@ -881,6 +881,12 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
       // Do we render a bitmap border or lines?
       if ( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() )
       {
+         if (mProfile->mBitmapArrayRects[0].extent.y < baseRect.extent.y)
+         {
+            //if our bitmap is smaller than the height of our ctrl, we'll nudge it towards the center
+            U32 nudge = (baseRect.extent.y - mProfile->mBitmapArrayRects[0].extent.y) / 2;
+            baseRect.point.y += nudge;
+         }
          // Render the fixed, filled in border
          renderFixedBitmapBordersFilled(baseRect, 3, mProfile );
 
@@ -926,6 +932,12 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
          // Do we render a bitmap border or lines?
          if ( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() )
          {
+            if (mProfile->mBitmapArrayRects[0].extent.y < baseRect.extent.y)
+            {
+               //if our bitmap is smaller than the height of our ctrl, we'll nudge it towards the center
+               U32 nudge = (baseRect.extent.y - mProfile->mBitmapArrayRects[0].extent.y) / 2;
+               baseRect.point.y += nudge;
+            }
             // Render the fixed, filled in border
             renderFixedBitmapBordersFilled(baseRect, 2, mProfile );
 
@@ -957,6 +969,12 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
          // Do we render a bitmap border or lines?
          if ( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() )
          {
+            if (mProfile->mBitmapArrayRects[0].extent.y < baseRect.extent.y)
+            {
+               //if our bitmap is smaller than the height of our ctrl, we'll nudge it towards the center
+               U32 nudge = (baseRect.extent.y - mProfile->mBitmapArrayRects[0].extent.y) / 2;
+               baseRect.point.y += nudge;
+            }
             // Render the fixed, filled in border
             renderFixedBitmapBordersFilled(baseRect, 1, mProfile );
          } 
@@ -976,6 +994,12 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
          // Do we render a bitmap border or lines?
          if ( !( mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size() ) )
          {
+            if (mProfile->mBitmapArrayRects[0].extent.y < baseRect.extent.y)
+            {
+               //if our bitmap is smaller than the height of our ctrl, we'll nudge it towards the center
+               U32 nudge = (baseRect.extent.y - mProfile->mBitmapArrayRects[0].extent.y) / 2;
+               baseRect.point.y += nudge;
+            }
             drawUtil->drawRect( baseRect, mProfile->mBorderColorNA );
          }
       }
@@ -1095,6 +1119,13 @@ void GuiPopUpMenuCtrl::onRender( Point2I offset, const RectI &updateRect )
       // If we're rendering a bitmap border, then it will take care of the arrow.
       if ( !(mProfile->getChildrenProfile() && mProfile->mBitmapArrayRects.size()) )
       {
+         if (mProfile->mBitmapArrayRects[0].extent.y < baseRect.extent.y)
+         {
+            //if our bitmap is smaller than the height of our ctrl, we'll nudge it towards the center
+            U32 nudge = (baseRect.extent.y - mProfile->mBitmapArrayRects[0].extent.y) / 2;
+            baseRect.point.y += nudge;
+         }
+
          //  Draw a triangle (down arrow)
          S32 left = baseRect.point.x + baseRect.extent.x - 12;
          S32 right = left + 8;

+ 1 - 1
Engine/source/gui/editor/inspector/variableInspector.cpp

@@ -150,7 +150,7 @@ void GuiVariableInspector::addField(const char* name, const char* label, const c
 {
    VariableField newField;
    newField.mFieldName = StringTable->insert(name);
-   newField.mFieldLabel = StringTable->insert(label);
+   newField.mFieldLabel = StringTable->insert(label, true);
    newField.mFieldTypeName = StringTable->insert(typeName);
    newField.mFieldDescription = StringTable->insert(description);
    newField.mDefaultValue = StringTable->insert(defaultValue);

+ 11 - 11
Engine/source/platform/threads/thread.h

@@ -110,7 +110,7 @@ public:
    bool isAlive();
 
    /// Returns the platform specific thread id for this thread.
-   U32 getId();
+   dsize_t getId();
 };
 
 
@@ -122,12 +122,12 @@ class ThreadManager
 
    struct MainThreadId
    {
-      U32 mId;
+      dsize_t mId;
       MainThreadId()
       {
          mId = ThreadManager::getCurrentThreadId();
       }
-      U32 get()
+      dsize_t get()
       {
          // Okay, this is a bit soso.  The main thread ID may get queried during
          // global ctor phase before MainThreadId's ctor ran.  Since global
@@ -152,21 +152,21 @@ public:
    static bool isMainThread();
 
    /// Returns true if threadId is the same as the calling thread's id.
-   static bool isCurrentThread(U32 threadId);
+   static bool isCurrentThread(dsize_t threadId);
 
    /// Returns true if the 2 thread ids represent the same thread. Some thread
    /// APIs return an opaque object as a thread id, so the == operator cannot
    /// reliably compare thread ids.
    // this comparator is needed by pthreads and ThreadManager.
-   static bool compare(U32 threadId_1, U32 threadId_2);
+   static bool compare(dsize_t threadId_1, dsize_t threadId_2);
       
    /// Returns the platform specific thread id of the calling thread. Some 
    /// platforms do not guarantee that this ID stays the same over the life of 
    /// the thread, so use ThreadManager::compare() to compare thread ids.
-   static U32 getCurrentThreadId();
+   static dsize_t getCurrentThreadId();
 
    /// Returns the platform specific thread id ot the main thread.
-   static U32 getMainThreadId() { return smMainThreadId.get(); }
+   static dsize_t getMainThreadId() { return smMainThreadId.get(); }
    
    /// Each thread should add itself to the thread pool the first time it runs.
    static void addThread(Thread* thread)
@@ -184,7 +184,7 @@ public:
       ThreadManager &manager = *ManagedSingleton< ThreadManager >::instance();
       manager.poolLock.lock();
       
-      U32 threadID = thread->getId();
+      dsize_t threadID = thread->getId();
       for(U32 i = 0;i < manager.threadPool.size();++i)
       {
          if( compare( manager.threadPool[i]->getId(), threadID ) )
@@ -199,7 +199,7 @@ public:
    
    /// Searches the pool of known threads for a thread whose id is equivalent to
    /// the given threadid. Compares thread ids with ThreadManager::compare().
-   static Thread* getThreadById(U32 threadid)
+   static Thread* getThreadById(dsize_t threadid)
    {
       AssertFatal(threadid != 0, "ThreadManager::getThreadById() Searching for a bad thread id.");
       Thread* ret = NULL;
@@ -236,9 +236,9 @@ inline bool ThreadManager::isMainThread()
    return compare( ThreadManager::getCurrentThreadId(), smMainThreadId.get() );
 }
 
-inline bool ThreadManager::isCurrentThread(U32 threadId)
+inline bool ThreadManager::isCurrentThread(dsize_t threadId)
 {
-   U32 current = getCurrentThreadId();
+   dsize_t current = getCurrentThreadId();
    return compare(current, threadId);
 }
 

+ 1 - 0
Engine/source/platform/types.gcc.h

@@ -46,6 +46,7 @@ typedef unsigned long  U64;
 #define TORQUE_FORCEINLINE __attribute__((always_inline))
 #define TORQUE_CASE_FALLTHROUGH __attribute__((fallthrough))
 #define TORQUE_NOINLINE __attribute__ ((noinline))
+#define TORQUE_UNLIKELY
 
 //--------------------------------------
 // Identify the compiler string

+ 5 - 5
Engine/source/platformSDL/threads/thread.cpp

@@ -134,9 +134,9 @@ bool Thread::isAlive()
    return ( !mData->mDead );
 }
 
-U32 Thread::getId()
+dsize_t Thread::getId()
 {
-   return (U32)mData->mThreadID;
+   return (dsize_t)mData->mThreadID;
 }
 
 void Thread::_setName( const char* )
@@ -145,12 +145,12 @@ void Thread::_setName( const char* )
    // that one thread you are looking for is just so much fun.
 }
 
-U32 ThreadManager::getCurrentThreadId()
+dsize_t ThreadManager::getCurrentThreadId()
 {
-   return (U32)SDL_ThreadID();
+   return (dsize_t)SDL_ThreadID();
 }
 
-bool ThreadManager::compare(U32 threadId_1, U32 threadId_2)
+bool ThreadManager::compare(dsize_t threadId_1, dsize_t threadId_2)
 {
    return (threadId_1 == threadId_2);
 }

+ 4 - 4
Engine/source/platformWin32/threads/thread.cpp

@@ -43,7 +43,7 @@ public:
    Thread*                 mThread;
    HANDLE                  mThreadHnd;
    Semaphore               mGateway;
-   U32                     mThreadID;
+   dsize_t                 mThreadID;
    U32                     mDead;
 
    PlatformThreadData()
@@ -157,7 +157,7 @@ bool Thread::isAlive()
    return ( !mData->mDead );
 }
 
-U32 Thread::getId()
+dsize_t Thread::getId()
 {
    return mData->mThreadID;
 }
@@ -197,12 +197,12 @@ void Thread::_setName( const char* name )
 #endif
 }
 
-U32 ThreadManager::getCurrentThreadId()
+dsize_t ThreadManager::getCurrentThreadId()
 {
    return GetCurrentThreadId();
 }
 
-bool ThreadManager::compare(U32 threadId_1, U32 threadId_2)
+bool ThreadManager::compare(dsize_t threadId_1, dsize_t threadId_2)
 {
    return (threadId_1 == threadId_2);
 }

+ 5 - 5
Engine/source/platformX86UNIX/threads/thread.cpp

@@ -137,9 +137,9 @@ bool Thread::isAlive()
    return ( !mData->mDead );
 }
 
-U32 Thread::getId()
+dsize_t Thread::getId()
 {
-   return (U32)mData->mThreadID;
+   return (dsize_t)mData->mThreadID;
 }
 
 void Thread::_setName( const char* )
@@ -148,12 +148,12 @@ void Thread::_setName( const char* )
    // that one thread you are looking for is just so much fun.
 }
 
-U32 ThreadManager::getCurrentThreadId()
+dsize_t ThreadManager::getCurrentThreadId()
 {
-   return (U32)pthread_self();
+   return (dsize_t)pthread_self();
 }
 
-bool ThreadManager::compare(U32 threadId_1, U32 threadId_2)
+bool ThreadManager::compare(dsize_t threadId_1, dsize_t threadId_2)
 {
    return pthread_equal((pthread_t)threadId_1, (pthread_t)threadId_2);
 }

+ 1 - 1
Engine/source/sfx/sfxInternal.h

@@ -442,7 +442,7 @@ inline bool isSFXThread()
 {
    ThreadSafeRef< SFXUpdateThread > sfxThread = UPDATE_THREAD();
 
-   U32 threadId;
+   dsize_t threadId;
    if( sfxThread != NULL )
       threadId = sfxThread->getId();
    else

+ 8 - 3
Templates/BaseGame/game/tools/VPathEditor/Scripts/Plugin.tscript

@@ -61,7 +61,8 @@ function VPathEditorPlugin::onWorldEditorStartup( %this )
     }
     
     // Add Toolbar.
-    EditorGuiToolbar.add( VPathEditorToolbar );
+    //EditorGuiToolbar.add( VPathEditorToolbar );
+
     
     // Populate Type Menu.
     VPathEditorToolbarPathTypeMenu.clear();
@@ -119,7 +120,9 @@ function VPathEditorPlugin::onActivated( %this )
     EVPathEditor.setVisible( true );
     EVPathEditor.makeFirstResponder( true );
     EditorGui.bringToFront( EVPathEditor );
-    VPathEditorToolbar.setVisible( true );
+    EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+    EditorGuiToolbarStack.add( VPathEditorToolbar );
+
     VPathTreeView.open( GetServerPathSet(), true );
     
     // Sync Gizmo.
@@ -147,7 +150,9 @@ function VPathEditorPlugin::onDeactivated( %this )
 {
     // Hide Editor.
     EVPathEditor.setVisible( false );
-    VPathEditorToolbar.setVisible( false );
+
+    EditorGuiToolbarStack.add( EWorldEditorToolbar );
+    EditorGuiToolbarStack.remove( VPathEditorToolbar );
     
     // Disable Map.
     %this.EditorMap.pop();

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui

@@ -247,7 +247,7 @@ $guiContent = new GuiControl(AssetBrowser) {
             tooltip = "Create a new asset in the current directory";
             hovertime = "1000";
             isContainer = "0";
-            internalName = "CreateAssetButton";
+            class="CreateAssetButton";
             canSave = "1";
             canSaveDynamicFields = "0";
          };

+ 35 - 33
Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui

@@ -31,7 +31,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
       anchorBottom = "0";
       anchorLeft = "1";
       anchorRight = "0";
-      position = "328 140";
+      position = "328 159";
       extent = "368 450";
       minExtent = "48 92";
       horizSizing = "center";
@@ -54,7 +54,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "12 54";
+         position = "12 29";
          extent = "116 17";
          minExtent = "8 2";
          horizSizing = "right";
@@ -68,6 +68,35 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          canSave = "1";
          canSaveDynamicFields = "0";
       };
+      new GuiPopUpMenuCtrlEx(NewAssetTargetModule) {
+         maxPopupHeight = "200";
+         sbUsesNAColor = "0";
+         reverseTextList = "0";
+         bitmapBounds = "16 16";
+         hotTrackCallback = "0";
+         maxLength = "1024";
+         margin = "0 0 0 0";
+         padding = "0 0 0 0";
+         anchorTop = "1";
+         anchorBottom = "0";
+         anchorLeft = "1";
+         anchorRight = "0";
+         position = "135 28";
+         extent = "202 18";
+         minExtent = "8 2";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "ToolsGuiPopUpMenuProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         internalName = "ModuleList";
+         class = "AssetBrowserModuleList";
+         canSave = "1";
+         canSaveDynamicFields = "0";
+      };
       new GuiTextCtrl() {
          text = "Target Path:";
          maxLength = "1024";
@@ -77,7 +106,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "12 30";
+         position = "12 54";
          extent = "116 17";
          minExtent = "8 2";
          horizSizing = "right";
@@ -104,7 +133,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "135 30";
+         position = "135 54";
          extent = "201 18";
          minExtent = "8 2";
          horizSizing = "width";
@@ -128,7 +157,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          groupNum = "-1";
          buttonType = "PushButton";
          useMouseEvents = "0";
-         position = "343 27";
+         position = "340 51";
          extent = "22 22";
          minExtent = "8 2";
          horizSizing = "left";
@@ -144,33 +173,6 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
          canSave = "1";
          canSaveDynamicFields = "0";
       };
-      new GuiTextEditCtrl(NewAssetTargetModule) {
-         historySize = "0";
-         tabComplete = "0";
-         sinkAllKeyEvents = "0";
-         password = "0";
-         passwordMask = "*";
-         maxLength = "1024";
-         margin = "0 0 0 0";
-         padding = "0 0 0 0";
-         anchorTop = "1";
-         anchorBottom = "0";
-         anchorLeft = "1";
-         anchorRight = "0";
-         position = "135 53";
-         extent = "202 18";
-         minExtent = "8 2";
-         horizSizing = "width";
-         vertSizing = "bottom";
-         profile = "ToolsGuiTextEditProfile";
-         visible = "1";
-         active = "0";
-         tooltipProfile = "GuiToolTipProfile";
-         hovertime = "1000";
-         isContainer = "1";
-         canSave = "1";
-         canSaveDynamicFields = "0";
-      };
       new GuiScrollCtrl() {
          willFirstRespond = "1";
          hScrollBar = "alwaysOn";
@@ -213,7 +215,7 @@ $guiContent = new GuiControl(AssetBrowser_newAsset) {
             changeChildSizeToFit = "1";
             changeChildPosition = "1";
             position = "1 1";
-            extent = "337 338";
+            extent = "337 56";
             minExtent = "16 16";
             horizSizing = "width";
             vertSizing = "height";

+ 3 - 2
Templates/BaseGame/game/tools/assetBrowser/guis/selectModule.gui

@@ -44,6 +44,7 @@ $guiContent = new GuiControl(AssetBrowser_SelectModule) {
       isContainer = "1";
       canSave = "1";
       canSaveDynamicFields = "0";
+      closeCommand="Canvas.popDialog(AssetBrowser_SelectModule);";
 
       new GuiPopUpMenuCtrlEx() {
          maxPopupHeight = "200";
@@ -95,7 +96,7 @@ $guiContent = new GuiControl(AssetBrowser_SelectModule) {
          tooltipProfile = "GuiToolTipProfile";
          hovertime = "1000";
          isContainer = "0";
-         class = "SelectPackage_NewAssetModuleBtn";
+         class = "AssetBrowserSelModuleAddBtn";
          canSave = "1";
          canSaveDynamicFields = "0";
       };
@@ -132,7 +133,7 @@ $guiContent = new GuiControl(AssetBrowser_SelectModule) {
          profile = "ToolsGuiButtonProfile";
          visible = "1";
          active = "1";
-         command = "Canvas.popDialog(AssetBrowser_addModule);";
+         command = "Canvas.popDialog(AssetBrowser_SelectModule);";
          tooltipProfile = "ToolsGuiToolTipProfile";
          hovertime = "1000";
          isContainer = "0";

+ 1 - 4
Templates/BaseGame/game/tools/assetBrowser/main.tscript

@@ -156,14 +156,11 @@ function initializeAssetBrowser()
    AssetBrowser.buildPopupMenus();
    
    //Force everything to initialize if other things need to reference it's behavior before we're displayed(usually other tools)
-   AssetBrowser.showDialog();
-   AssetBrowser.hideDialog();
+   AssetBrowser.initialize();
 }
 
 function AssetBrowserPlugin::onWorldEditorStartup( %this )
 { 
-   // Add ourselves to the toolbar.
-   AssetBrowser.addToolbarButton();
 }
 
 function AssetBrowserPlugin::initSettings( %this )

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

@@ -32,7 +32,6 @@ function AssetBrowser_addModuleWindow::onGainFirstResponder(%this)
 function AssetBrowser_addModuleWindow::close()
 {
    Canvas.popDialog(AssetBrowser_addModule);  
-   eval(AssetBrowser_addModuleWindow.callbackFunction);
 }
 
 function AssetBrowser_addModuleWindow::CreateNewModule(%this)
@@ -127,4 +126,9 @@ function AssetBrowserModuleList::refresh(%this)
       %moduleName = getWord(%moduleList, %i);
       %this.add(%moduleName.ModuleId, %i);  
    }
+}
+
+function AssetBrowserSelModuleAddBtn::onClick(%this)
+{
+   AssetBrowser.CreateNewModule("AssetBrowser_selectModule.newModuleAdded();");
 }

+ 79 - 34
Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript

@@ -1,5 +1,3 @@
-new SimGroup(AssetBrowserPreviewCache);
-
 //AssetBrowser.addToolbarButton
 function AssetBrowser::addToolbarButton(%this)
 {
@@ -30,18 +28,18 @@ function AssetBrowser::addToolbarButton(%this)
 	EWToolsToolbar.setExtent((25 + 8) * (ToolsToolbarArray.getCount()) + 12 SPC "33");
 }
 //
-function AssetBrowser::onAdd(%this)
-{
-}
 
-function AssetBrowser::onWake(%this)
+function AssetBrowser::initialize(%this)
 {
    // manage preview array
    if(!isObject(AssetPreviewArray))
       new ArrayObject(AssetPreviewArray);
       
    if(!isObject(%this.dirHandler))
+   {
       %this.dirHandler = makedirectoryHandler(AssetBrowser-->filterTree, "cache,shaderCache", ""); 
+      %this.dirHandler.currentAddress = "data/";
+   }
       
    AssetBrowser-->filterTree.buildIconTable( ":tools/classIcons/Prefab:tools/classIcons/Prefab" @
                                              ":tools/classIcons/SimSet:tools/classIcons/SimSet");
@@ -65,6 +63,30 @@ function AssetBrowser::onWake(%this)
    AssetBrowser-->filterAssetsButton.setActive(true); 
 }
 
+function AssetBrowser::onAdd(%this)
+{
+}
+
+function AssetBrowser::onWake(%this)
+{
+   %this.initialize();
+}
+
+function AssetBrowser::onDialogPop(%this)
+{
+   %lastPosExt = AssetBrowserWindow.position SPC AssetBrowserWindow.extent;
+   EditorSettings.setValue("Assets/Browser/LastPosExt", %lastPosExt); 
+}
+
+function AssetBrowser::restoreLastPosExt(%this)
+{
+   %lastPosExt = EditorSettings.value("Assets/Browser/LastPosExt", ""); 
+   if(%lastPosExt !$= "")
+   {
+      AssetBrowserWindow.resize(getWord(%lastPosExt, 0), getWord(%lastPosExt, 1), getWord(%lastPosExt, 2), getWord(%lastPosExt, 3));
+   }    
+}
+
 function contentTreeTabBook::onTabSelected(%this, %tabText, %tabIndex)
 {
    if(%tabText $= "Content")
@@ -273,6 +295,7 @@ function AssetBrowser::showDialog( %this, %AssetTypeFilter, %selectCallback, %ta
 
    Canvas.popDialog(AssetBrowser);
    Canvas.pushDialog(AssetBrowser);
+   
    AssetBrowser.setVisible(1);
    AssetBrowserWindow.setVisible(1);
    AssetBrowserWindow.selectWindow();
@@ -301,6 +324,8 @@ function AssetBrowser::showDialog( %this, %AssetTypeFilter, %selectCallback, %ta
    }
 
    AssetBrowser.loadDirectories();
+   
+   AssetBrowser.restoreLastPosExt();
 }
 
 function AssetBrowser::hideDialog( %this )
@@ -313,6 +338,18 @@ function AssetBrowser::hideDialog( %this )
    Canvas.popDialog(AssetBrowser);
 }
 
+function AssetBrowser::toggleDialog( %this )
+{
+   if(AssetBrowser.isAwake())
+   {
+      AssetBrowser.hideDialog();
+   }
+   else
+   {
+      AssetBrowser.showDialog();
+   }
+}
+
 function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName )
 {
    if(!isObject(%this.previewData))
@@ -481,13 +518,12 @@ function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName )
    {
       %previewButton.iconLocation = "Left";
       %previewButton.textLocation = "Right";
-      %previewButton.extent = "120 20";
+      %previewButton.setextent(120,20);
    }
    else
    {
       %size = %previewSize.x * %previewScaleSize;
-      %previewButton.extent.x = %size;
-      %previewButton.extent.y = %size + %textBottomPad;
+      %previewButton.setextent(%size,%size + %textBottomPad);
    }
    
    //%previewButton.extent = %previewSize.x + %previewBounds SPC %previewSize.y + %previewBounds + 24;
@@ -1417,13 +1453,10 @@ function AssetBrowser::doRebuildAssetArray(%this)
    AssetBrowser-->assetList.deleteAllObjects();
    AssetPreviewArray.empty();
 
-   // uhh?? I just added global schenanagins here to make this work
-   %assetArray = $AssetBrowser::AssetArray;
-   if(isObject(%assetArray))
-      %assetArray.delete();
+   if(isObject($AssetBrowser::AssetArray))
+      $AssetBrowser::AssetArray.delete();
       
-   %assetArray = new ArrayObject();
-   $AssetBrowser::AssetArray = %assetArray;
+   $AssetBrowser::AssetArray = new ArrayObject();
    
    //First, Query for our assets
    %assetQuery = new AssetQuery();
@@ -1504,7 +1537,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
          {
             if(matchesSearch(%assetName, %assetType))
             {
-               %assetArray.add( %moduleName, %assetId);
+               $AssetBrowser::AssetArray.add( %moduleName, %assetId);
                   
                if(%assetType !$= "Folder")
                   %finalAssetCount++;
@@ -1518,7 +1551,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
             {
                if(AssetBrowser.assetTypeFilter $= %assetType)
                {
-                  %assetArray.add( %moduleName, %assetId );
+                  $AssetBrowser::AssetArray.add( %moduleName, %assetId );
                   
                   if(%assetType !$= "Folder")
                      %finalAssetCount++;
@@ -1527,7 +1560,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
             else
             {
                //got it.	
-               %assetArray.add( %moduleName, %assetId );
+               $AssetBrowser::AssetArray.add( %moduleName, %assetId );
                
                if(%assetType !$= "Folder")
                   %finalAssetCount++;
@@ -1549,7 +1582,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
          {
             if(matchesSearch(%folderName, "Folder", ""))
             {
-               %assetArray.add( %breadcrumbPath, "Folder" TAB %folderName );
+               $AssetBrowser::AssetArray.add( %breadcrumbPath, "Folder" TAB %folderName );
                continue;
             }
          }
@@ -1565,7 +1598,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
             if(!%this.toolsModulesFilter && %folderName $= "tools" && %breadcrumbPath $= "")
                continue;
                
-            %assetArray.add( %breadcrumbPath, "Folder" TAB %folderName );
+            $AssetBrowser::AssetArray.add( %breadcrumbPath, "Folder" TAB %folderName );
          }
       }
    }
@@ -1595,14 +1628,14 @@ function AssetBrowser::doRebuildAssetArray(%this)
                %dbName = %obj.getName();
                if(matchesSearch(%dbName, "Datablock"))
                {
-                  %assetArray.add( %dbFilename, "Datablock" TAB %dbName );
+                  $AssetBrowser::AssetArray.add( %dbFilename, "Datablock" TAB %dbName );
                }  
             }
          }
          else if(%dbFilePath $= %breadcrumbPath)
          {
             %dbName = %obj.getName();
-            %assetArray.add( %dbFilename, "Datablock" TAB %dbName );
+            $AssetBrowser::AssetArray.add( %dbFilename, "Datablock" TAB %dbName );
             
             /*%catItem = AssetBrowser-->filterTree.findItemByName(%obj.category);
             
@@ -1627,7 +1660,7 @@ function AssetBrowser::doRebuildAssetArray(%this)
          %looseFileName = fileName(%looseFileFullPath);
          %looseFileExt = fileExt(%looseFileFullPath);
          
-         %assetArray.add( %looseFilePath, "LooseFile" TAB %looseFileName );
+         $AssetBrowser::AssetArray.add( %looseFilePath, "LooseFile" TAB %looseFileName );
       }
          
       //Prefabs
@@ -1646,13 +1679,13 @@ function AssetBrowser::doRebuildAssetArray(%this)
             {
                if(matchesSearch(%prefabName, "Prefab"))
                {
-                  %assetArray.add( %prefabPath, "Prefab" TAB %prefabName );
+                  $AssetBrowser::AssetArray.add( %prefabPath, "Prefab" TAB %prefabName );
                }  
             }
          }
          else if(%prefabPath $= %breadcrumbPath)
          {
-            %assetArray.add( %prefabPath, "Prefab" TAB %prefabName );
+            $AssetBrowser::AssetArray.add( %prefabPath, "Prefab" TAB %prefabName );
          }
 
          %fullPrefabPath = findNextFile( %breadcrumbPath @ "/" @ %expr );
@@ -1672,13 +1705,13 @@ function AssetBrowser::doRebuildAssetArray(%this)
             {
                if(matchesSearch(%cppName, "Cpp"))
                {
-                  %assetArray.add( %cppPath, "Cpp" TAB %cppName );
+                  $AssetBrowser::AssetArray.add( %cppPath, "Cpp" TAB %cppName );
                }  
             }
          }
          else if(%cppPath $= %breadcrumbPath)
          {
-            %assetArray.add( %cppPath, "Cpp" TAB %cppName );
+            $AssetBrowser::AssetArray.add( %cppPath, "Cpp" TAB %cppName );
          }
       }
       
@@ -1696,13 +1729,13 @@ function AssetBrowser::doRebuildAssetArray(%this)
             {
                if(matchesSearch(%cppName, "Cpp"))
                {
-                  %assetArray.add( %cppPath, "Cpp" TAB %cppName );
+                  $AssetBrowser::AssetArray.add( %cppPath, "Cpp" TAB %cppName );
                }  
             }
          }
          else if(%cppPath $= %breadcrumbPath)
          {
-            %assetArray.add( %cppPath, "Cpp" TAB %cppName );
+            $AssetBrowser::AssetArray.add( %cppPath, "Cpp" TAB %cppName );
          }
       }
       
@@ -1744,13 +1777,13 @@ function AssetBrowser::doRebuildAssetArray(%this)
             {
                if(matchesSearch(%tscriptName, "tscript"))
                {
-                  %assetArray.add( %tscriptPath, "tscript" TAB %tscriptName );
+                  $AssetBrowser::AssetArray.add( %tscriptPath, "tscript" TAB %tscriptName );
                }  
             }
          }
          else if(%tscriptPath $= %breadcrumbPath)
          {
-            %assetArray.add( %tscriptPath, "tscript" TAB %tscriptName );
+            $AssetBrowser::AssetArray.add( %tscriptPath, "tscript" TAB %tscriptName );
          }
       }
    }
@@ -1772,13 +1805,13 @@ function AssetBrowser::doRebuildAssetArray(%this)
             %name = %creatorObj.val[1];
             %func = %creatorObj.val[2];
             
-            %assetArray.add( %name, "Creator" TAB %creatorObj );
+            $AssetBrowser::AssetArray.add( %name, "Creator" TAB %creatorObj );
          }               
       }   
 	}
 	
-   for(%i=0; %i < %assetArray.count(); %i++)
-		AssetBrowser.buildAssetPreview( %assetArray.getValue(%i), %assetArray.getKey(%i) );  
+   for(%i=0; %i < $AssetBrowser::AssetArray.count(); %i++)
+		AssetBrowser.buildAssetPreview( $AssetBrowser::AssetArray.getValue(%i), $AssetBrowser::AssetArray.getKey(%i) );  
 		
    AssetBrowser_FooterText.text = %finalAssetCount @ " Assets";
    
@@ -2075,7 +2108,14 @@ function AssetBrowser::navigateTo(%this, %address, %historyNav)
       
       if(%this.hasLooseFilesInDir())
       {
+         if(EditorSettings.value("Assets/AutoImportLooseFiles", false) && EditorSettings.value("Assets/AutoImport", false))
+         {
+            AssetBrowser.autoImportSimpleLooseFiles();
+         }
+         else
+         {
          %this-->AutoImportAssetButton.visible = true;
+         }
       }
       else
       {
@@ -2420,6 +2460,11 @@ function EWorldEditor::onControlDropped( %this, %payload, %position )
          %buildCommand = AssetBrowser @ ".on" @ %assetType @ "EditorDropped(" @ %assetDef @ ",\"" @ %position @ "\");";
       }
       eval(%buildCommand);
+      
+      if(EditorSettings.value("AssetManagement/Assets/closeBrowserOnDragAction", false))
+      {
+         AssetBrowser.hideDialog();  
+      }
    }
    
    EWorldEditor.isDirty = true;

+ 23 - 10
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript

@@ -196,22 +196,35 @@ function AssetBrowser::buildImageAssetPreview(%this, %assetDef, %previewData)
       
       %success = saveScaledImage(%assetDef.getImagePath(), %previewFilePath);
       
-      %previewAsset = new ImageAsset()
+      if(%success)
       {
-         assetName = %previewAssetName;
-         versionId = 1;
-         imageFile = fileName(%previewFilePath);
-      };
+         %previewAsset = new ImageAsset()
+         {
+            assetName = %previewAssetName;
+            versionId = 1;
+            imageFile = fileName(%previewFilePath);
+         };
       
-      %previewImgAssetPath = %previewPath @ %previewAsset.assetName @ ".asset.taml";
-      %assetImportSuccessful = TAMLWrite(%previewAsset, %previewImgAssetPath); 
+         %previewAssetName = "ToolsModule:" @ %previewAssetName;
+         %previewImgAssetPath = %previewPath @ %previewAsset.assetName @ ".asset.taml";
+         %assetImportSuccessful = TAMLWrite(%previewAsset, %previewImgAssetPath); 
       
-      %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1);
+         %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1);
          
-      %success = AssetDatabase.addDeclaredAsset(%toolsModuleDef, %previewImgAssetPath);
+         %success = AssetDatabase.addDeclaredAsset(%toolsModuleDef, %previewImgAssetPath);
+      }
+      else
+      {
+         %previewFilePath = %assetDef.getImagePath();
+         %previewAssetName = %module.moduleId @ ":" @ %assetDef.assetName;  
+      }
       
       hideEditorLoadingGui();
    }
+   else
+   {
+      %previewAssetName = "ToolsModule:" @ %previewAssetName;
+   }
    
    //Revalidate. If it didn't work, just use the default placeholder one
    if(!isFile(%previewFilePath))
@@ -220,7 +233,7 @@ function AssetBrowser::buildImageAssetPreview(%this, %assetDef, %previewData)
    %previewData.assetName = %assetDef.assetName;
    %previewData.assetPath = %assetDef.scriptFile;
    
-   %previewData.previewImage = "ToolsModule:" @ %previewAssetName;//%assetDef.fileName;
+   %previewData.previewImage = %previewAssetName;
    
    %previewData.assetFriendlyName = %assetDef.assetName;
    %previewData.assetDesc = %assetDef.description;

+ 14 - 18
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript

@@ -318,30 +318,24 @@ function AssetBrowser::buildShapeAssetPreview(%this, %assetDef, %previewData)
                            "Shape File path: " @ %assetDef.getShapeFile();
                            
    if(%this.selectMode)
+   {
       %previewData.doubleClickCommand = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+   }
    else
-      %previewData.doubleClickCommand = "AssetBrowser.editAsset( "@%assetDef@" );";
+   {
+      if(EditorSettings.value("Assets/Browser/doubleClickAction", "Edit Asset") $= "Edit Asset")
+      {
+         %previewData.doubleClickCommand = "AssetBrowser.editAsset( "@%assetDef@" );";
+      }
+      else
+      {
+         %previewData.doubleClickCommand = "AssetBrowser.onShapeAssetEditorDropped( "@%assetDef@" );";
+      }
+   }
 }
 
 function AssetBrowser::onShapeAssetEditorDropped(%this, %assetDef, %position)
 {
-   //echo("DROPPED A SHAPE ON THE EDITOR WINDOW!"); 
-
-   %targetPosition = EWorldEditor.unproject(%position SPC 1000);
-   %camPos = LocalClientConnection.camera.getPosition();
-   %rayResult = containerRayCast(%camPos, %targetPosition, -1);
-   
-   %pos = EWCreatorWindow.getCreateObjectPosition();
-
-   if(%rayResult != 0)
-   {
-      %pos = getWords(%rayResult, 1, 3);
-   }
-   else
-   {
-      %pos = "0 0 0";  
-   }
-   
    %assetId = %assetDef.getAssetId();
    
    %newStatic = new TSStatic()
@@ -354,6 +348,8 @@ function AssetBrowser::onShapeAssetEditorDropped(%this, %assetDef, %position)
    
    EWorldEditor.clearSelection();
    EWorldEditor.selectObject(%newStatic);
+   
+   EWorldEditor.dropSelection();
       
    EWorldEditor.isDirty = true;
    

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

@@ -148,6 +148,11 @@ function AssetBrowser::dragAndDropTerrainAsset(%this, %assetDef, %dropTarget)
       return;
 }
 
+function AssetBrowser::onTerrainAssetEditorDropped(%this, %assetDef, %position)
+{
+   createTerrainBlock(%assetDef.getAssetId());
+}
+
 function AssetBrowser::renameTerrainAsset(%this, %assetDef, %newAssetId, %originalName, %newName)
 {
 }
@@ -160,7 +165,6 @@ function AssetBrowser::buildTerrainAssetPreview(%this, %assetDef, %previewData)
 {
    %previewData.assetName = %assetDef.assetName;
    %previewData.assetPath = "";
-   %previewData.doubleClickCommand = "";
    
    %previewData.previewImage = "ToolsModule:gameObjectIcon_image";
    
@@ -170,6 +174,18 @@ function AssetBrowser::buildTerrainAssetPreview(%this, %assetDef, %previewData)
       "\nAsset Type: Terrain Asset" @ 
       "\nAsset Definition ID: " @ %assetDef @
       "\nDefinition Path: " @ %assetDef.getTerrainFilePath(); 
+      
+   if(%this.selectMode)
+   {
+      %previewData.doubleClickCommand = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+   }
+   else
+   {
+      if(EditorSettings.value("Assets/Browser/doubleClickAction", "Edit Asset") $= "Edit Asset")
+         %previewData.doubleClickCommand = "";
+      else
+         %previewData.doubleClickCommand = "createTerrainBlock(\""@%assetDef.getAssetId()@"\");";
+   }
 }
 
 function GuiInspectorTypeTerrainAssetPtr::onClick( %this, %fieldName )

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

@@ -10,12 +10,13 @@ function AssetBrowser::ConvertFolderIntoModule(%this, %folderName)
    AssetBrowser_addModuleWindow.CreateNewModule();
 }
 
-function AssetBrowser::CreateNewModule(%this)
+function AssetBrowser::CreateNewModule(%this, %callback)
 {
    Canvas.pushDialog(AssetBrowser_AddModule); 
    AssetBrowser_addModuleWindow.selectWindow();  
    
    AssetBrowser_addModuleWindow.callbackFunction = "AssetBrowser.promptNewModuleFolders();";
+   AssetBrowser_addModuleWindow.callbackFallthrough = %callback;
 }
 
 function AssetBrowser::promptNewModuleFolders(%this)
@@ -24,6 +25,9 @@ function AssetBrowser::promptNewModuleFolders(%this)
          "Do you want to create some common folders for organization of your new Module?", 
          "AssetBrowser.makeModuleFolders();",  //if yes, make the foldesr
          "AssetBrowser.loadDirectories();");  //if no, just refresh
+         
+   if(AssetBrowser_addModuleWindow.callbackFallthrough !$= "")
+      eval(AssetBrowser_addModuleWindow.callbackFallthrough);
 }
 
 function AssetBrowser::makeModuleFolders(%this)

+ 15 - 30
Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript

@@ -26,9 +26,22 @@ function CreateAssetButton::onClick(%this)
 
 function AssetBrowser_newAsset::onWake(%this)
 {
-   NewAssetTargetAddress.text = AssetBrowser.dirHandler.currentAddress;
-   NewAssetTargetModule.text = AssetBrowser.dirHandler.getModuleFromAddress(AssetBrowser.dirHandler.currentAddress).ModuleId;
+   %targetModule = AssetBrowser.dirHandler.getModuleFromAddress(AssetBrowser.dirHandler.currentAddress).ModuleId;
 
+   if(%targetModule $= "")
+      %targetModule = EditorSettings.value("Assets/New/defaultModule", "");
+      
+   NewAssetTargetModule.setText(%targetModule);
+   
+   %moduleDef = ModuleDatabase.findModule(%targetModule);
+   
+   %targetPath = AssetBrowser.dirHandler.currentAddress;
+   if(!startsWith(%targetPath, %moduleDef.ModulePath))
+   {
+      %targetPath = %moduleDef.ModulePath;
+   }
+   
+   NewAssetTargetAddress.text = %targetPath;
 }
 
 function AssetBrowser_newAssetWindow::onClose(%this)
@@ -107,34 +120,6 @@ function AssetBrowser::setupCreateNewAsset(%this, %assetType, %moduleName, %call
       %command = %this @ ".setupCreateNew"@%assetType @"();";
       eval(%command);
    }
-   /*if(%assetType $= "ComponentAsset")
-   {
-      NewAssetPropertiesInspector.startGroup("Components");
-      NewAssetPropertiesInspector.addField("parentClass", "New Asset Parent Class", "String",  "Name of the new asset's parent class", "Component", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.addField("componentGroup", "Component Group", "String",  "Name of the group of components this component asset belongs to", "", "", %this.newAssetSettings);
-      //NewAssetPropertiesInspector.addField("componentName", "Component Name", "String",  "Name of the new component", "", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.endGroup();
-   }*/
-   //Special case, we only do this via internal means like baking
-   /*else if(%assetType $= "ShapeAsset")
-   {
-      NewAssetPropertiesInspector.startGroup("Shape");
-      NewAssetPropertiesInspector.addField("isServerScript", "Is Server Script", "bool",  "Is this script used on the server?", "1", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.endGroup();
-   }*/
-   /*else if(%assetType $= "ShapeAnimationAsset")
-   {
-      NewAssetPropertiesInspector.startGroup("Animation");
-      NewAssetPropertiesInspector.addField("sourceFile", "Source File", "filename",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.addField("animationName", "Animation Name", "string",  "Name of the animation clip when used in a shape", "", "", %this.newAssetSettings);
-      
-      NewAssetPropertiesInspector.addField("startFrame", "Starting Frame", "int",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.addField("endFrame", "Ending Frame", "int",  "Source file this animation will pull from", "", "", %this.newAssetSettings);
-      
-      NewAssetPropertiesInspector.addField("padRotation", "Pad Rotations", "bool",  "Source file this animation will pull from", "0", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.addField("padTransforms", "Pad Transforms", "bool",  "Source file this animation will pull from", "0", "", %this.newAssetSettings);
-      NewAssetPropertiesInspector.endGroup();
-   }*/
 }
 
 function NewAssetPropertiesInspector::updateNewAssetField(%this)

+ 9 - 4
Templates/BaseGame/game/tools/assetBrowser/scripts/selectModule.tscript

@@ -7,6 +7,14 @@ function AssetBrowser_SelectModule::showDialog(%this, %callback)
 function AssetBrowser_SelectModule::onWake(%this)
 {
    AssetBrowser_SelectModuleWindow-->ModuleList.refresh();
+   
+   %defaultModule = EditorSettings.value("Assets/New/defaultModule", "");
+   if(%defaultModule !$= "" && 
+      EditorSettings.value("Assets/New/alwaysPromptModuleTarget", false) == false)
+   {
+      Canvas.popDialog(AssetBrowser_SelectModule);
+      eval(%this.callback @ "(" @ %defaultModule @ ");");
+   }
 }
 
 function AssetBrowser_SelectModule::moduleSelected(%this)
@@ -24,10 +32,7 @@ function AssetBrowser_SelectModule::moduleSelected(%this)
 
 function SelectModule_NewAssetModuleBtn::onClick(%this)
 {
-   Canvas.pushDialog(AssetBrowser_AddModule);
-   AssetBrowser_addModuleWindow.selectWindow();
-   
-   AssetBrowser_AddModule.callback = "AssetBrowser_selectModule.newModuleAdded();";
+   AssetBrowser.CreateNewModule("AssetBrowser_selectModule.newModuleAdded();");
 }
 
 function AssetBrowser_selectModule::newModuleAdded(%this)

+ 9 - 4
Templates/BaseGame/game/tools/convexEditor/main.tscript

@@ -34,13 +34,12 @@ function initializeConvexEditor()
    ConvexEditorGui.setVisible( false );  
    ConvexEditorOptionsWindow.setVisible( false );  
    ConvexEditorTreeWindow.setVisible( false ); 
-   ConvexEditorToolbar.setVisible( false );
+   
    ConvexEditorOptionsWindow.setVisible( false );
    
    EditorGui.add( ConvexEditorGui );
    EditorGui.add( ConvexEditorOptionsWindow );
    EditorGui.add( ConvexEditorTreeWindow );
-   EditorGui.add( ConvexEditorToolbar );
    EditorGui.add( ConvexEditorOptionsWindow );
       
    new ScriptObject( ConvexEditorPlugin )
@@ -103,7 +102,10 @@ function ConvexEditorPlugin::onActivated( %this )
    
    EditorGui.bringToFront( ConvexEditorGui );
    ConvexEditorGui.setVisible( true );
-   ConvexEditorToolbar.setVisible( true );
+   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( ConvexEditorToolbar );
+   
    ConvexEditorOptionsWindow.setVisible( true );
    ConvexEditorGui.makeFirstResponder( true ); 
    %this.map.push();   
@@ -137,7 +139,10 @@ function ConvexEditorPlugin::onDeactivated( %this )
    %this.writeSettings();
    
    ConvexEditorGui.setVisible( false );
-   ConvexEditorOptionsWindow.setVisible( false );
+   
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( ConvexEditorToolbar );
+
    ConvexEditorTreeWindow.setVisible( false );
    ConvexEditorOptionsWindow.setVisible( false );
    ConvexEditorToolbar.setVisible( false );

+ 6 - 0
Templates/BaseGame/game/tools/datablockEditor/datablockEditor.tscript

@@ -686,6 +686,12 @@ function DatablockEditorPlugin::pickedNewDBTargetModule(%this, %module)
    %moduleDef = ModuleDatabase.findModule(%module);
    
    $DATABLOCK_EDITOR_DEFAULT_FILENAME = %moduleDef.ModulePath @ "/scripts/managedData/managedDatablocks." @ $TorqueScriptFileExtension;
+   
+   if(!isDirectory(filePath($DATABLOCK_EDITOR_DEFAULT_FILENAME)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath($DATABLOCK_EDITOR_DEFAULT_FILENAME));
+   }
+   
    DatablockEditorPlugin.createDatablock();
 }
 

+ 5 - 0
Templates/BaseGame/game/tools/decalEditor/decalEditorGui.tscript

@@ -167,6 +167,11 @@ function DecalEditorGui::pickedNewDecalTargetModule(%this, %module)
    %moduleDef = ModuleDatabase.findModule(%module);
    $decalDataFile = %moduleDef.ModulePath @ "/scripts/managedData/managedDecalData." @ $TorqueScriptFileExtension;
    
+   if(!isDirectory(filePath($decalDataFile)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath($decalDataFile));
+   }
+   
    %name = getUniqueName( "NewDecalData" );
    
    %str = "datablock DecalData( " @ %name @ " ) { Material = \"WarningMaterial\"; };";            

+ 6 - 0
Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript

@@ -180,6 +180,12 @@ function ForestEditorGui::pickedNewMeshTargetModule(%this, %module)
    %moduleDef = ModuleDatabase.findModule(%module);
     
    ForestEditorGui.forestItemDataPath = %moduleDef.ModulePath @ "/scripts/managedData/managedForestItemData." @ $TorqueScriptFileExtension;
+   
+   if(!isDirectory(filePath(ForestEditorGui.forestItemDataPath)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath(ForestEditorGui.forestItemDataPath));
+   }
+   
    AssetBrowser.showDialog("ShapeAsset", "selectNewForestMesh", "", "", "");
 }
 

+ 7 - 3
Templates/BaseGame/game/tools/forestEditor/main.tscript

@@ -34,12 +34,10 @@ function initializeForestEditor()
    ForestEditorGui.setVisible( false );   
    ForestEditorPalleteWindow.setVisible( false );
    ForestEditorPropertiesWindow.setVisible( false );
-   ForestEditToolbar.setVisible( false );
    
    EditorGui.add( ForestEditorGui );
    EditorGui.add( ForestEditorPalleteWindow );
    EditorGui.add( ForestEditorPropertiesWindow );
-   EditorGui.add( ForestEditToolbar );
             
    new ScriptObject( ForestEditorPlugin )
    {
@@ -141,7 +139,9 @@ function ForestEditorPlugin::onActivated( %this )
    ForestEditorPalleteWindow.setVisible( true );
    ForestEditorPropertiesWindow.setVisible( true );
    ForestEditorGui.makeFirstResponder( true );
-   //ForestEditToolbar.setVisible( true );
+   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( ForestEditToolbar );
 
    //Get our existing forest object in our current mission if we have one
    %forestObject = trim(parseMissionGroupForIds("Forest", ""));
@@ -210,7 +210,11 @@ function ForestEditorPlugin::onActivated( %this )
 
 function ForestEditorPlugin::onDeactivated( %this )
 {  
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( ForestEditToolbar );
+   
    ForestEditorGui.setVisible( false );
+   
    ForestEditorPalleteWindow.setVisible( false );
    ForestEditorPropertiesWindow.setVisible( false );
    

+ 26 - 2
Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.tscript

@@ -492,8 +492,29 @@ function ESettingsWindow::getAssetManagementSettings(%this)
 function ESettingsWindow::getAssetEditingSettings(%this)
 {
    ImportAssetWindow::reloadImportOptionConfigs();
-   %formattedConfigList = "";
-
+   
+   //First, get our list of modules
+   %moduleList = ModuleDatabase.findModules();
+   %formattedModuleList = "";
+   
+   %count = getWordCount(%moduleList);
+   for(%i=0; %i < %count; %i++)
+   {
+      %module = getWord(%moduleList, %i);
+      if(%module.group !$= "Tools" && %module.group !$= "Core")
+      {
+         if(%formattedModuleList $= "")
+            %formattedModuleList = %module.moduleId;
+         else
+            %formattedModuleList = %formattedModuleList @ "," @ %module.moduleId;  
+      }
+   }
+   
+   SettingsInspector.startGroup("Asset Creation");
+   SettingsInspector.addSettingsField("Assets/New/defaultModule", "Default Module", "list", "Default Module for new assets to be created into", %formattedModuleList); 
+   SettingsInspector.addSettingsField("Assets/New/alwaysPromptModuleTarget", "Always Prompt Target Module", "bool", "If off, use the default module"); 
+   SettingsInspector.endGroup();
+   
    for(%i=0; %i < ImportAssetWindow.importConfigsList.Count(); %i++)
    {
       %configName = ImportAssetWindow.importConfigsList.getKey(%i);
@@ -507,6 +528,7 @@ function ESettingsWindow::getAssetEditingSettings(%this)
                                                                                                                         "will attempt to automatically import any inbound assets"@
                                                                                                                         "using the default config, without prompting the import window."@
                                                                                                                         "The window will still display if any issues are detected", ""); 
+   SettingsInspector.addSettingsField("Assets/AutoImportLooseFiles", "Automatically Import Loose Files", "bool", "If on, will automatically import unassociated loose files in assets when navigating the Asset Browser.", ""); 
    SettingsInspector.endGroup();
    
    SettingsInspector.startGroup("Asset Browser");
@@ -517,6 +539,8 @@ function ESettingsWindow::getAssetEditingSettings(%this)
    SettingsInspector.addSettingsField("Assets/Browser/showEmptyFolders", "Show Empty Folders in Tiles view in Asset Browser", "bool", "");
    SettingsInspector.addSettingsField("Assets/Browser/showLooseFiles", "Show Loose Files when viewing in Asset Browser", "bool", "");
    SettingsInspector.addSettingsField("AssetManagement/Assets/promptOnRename", "Prompt on Rename", "bool", "");
+   SettingsInspector.addSettingsField("Assets/Browser/doubleClickAction", "Double Click Action", "list", "Dictates what sort of action double clicking on an asset in the Browser will invoke", "Edit Asset,Spawn Asset");
+   SettingsInspector.addSettingsField("AssetManagement/Assets/closeBrowserOnDragAction", "Close Browser on Drag Action", "bool", "If on, the Asset Browser will automatically close after dragging an asset from it to the editor interface.");
    SettingsInspector.endGroup();
 }
 

+ 5 - 1
Templates/BaseGame/game/tools/gui/profiles.ed.tscript

@@ -353,13 +353,17 @@ new GuiControlProfile( ToolsGuiButtonProfile )
 {
    opaque = true;
    border = true;
+   fillColor = EditorSettings.value("Theme/tabsColor");
+   fillColorHL = EditorSettings.value("Theme/tabsGLColor");
+   fillColorSEL = EditorSettings.value("Theme/tabsSELColor");
+   fillColorNA = EditorSettings.value("Theme/tabsSELColor");
+   
    fontColor = EditorSettings.value("Theme/fieldTextColor");
    fontColorHL = EditorSettings.value("Theme/fieldTextHLColor");
    fontColorNA = EditorSettings.value("Theme/fieldTextSELColor");
    fixedExtent = false;
    justify = "center";
    canKeyFocus = false;
-	bitmapAsset = "ToolsModule:button_image";
    hasBitmapArray = false;
    category = "Tools";
 };

+ 102 - 94
Templates/BaseGame/game/tools/gui/scriptEditorDlg.ed.gui

@@ -1,76 +1,80 @@
 //--- OBJECT WRITE BEGIN ---
 $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
-   isContainer = "1";
-   Profile = "ToolsGuiDefaultNonModalProfile";
-   HorizSizing = "width";
-   VertSizing = "height";
    position = "0 0";
-   Extent = "1024 768";
-   MinExtent = "8 2";
-   canSave = "1";
-   Visible = "1";
-   tooltipprofile = "ToolsGuiToolTipProfile";
+   extent = "1024 768";
+   minExtent = "8 2";
+   horizSizing = "width";
+   vertSizing = "height";
+   profile = "ToolsGuiDefaultNonModalProfile";
+   visible = "1";
+   active = "1";
+   tooltipProfile = "ToolsGuiToolTipProfile";
    hovertime = "1000";
-   canSaveDynamicFields = "0";
+   isContainer = "1";
+   canSave = "1";
+   canSaveDynamicFields = "1";
 
    new GuiWindowCtrl() {
+      text = "Text Pad";
       resizeWidth = "0";
       resizeHeight = "0";
       canMove = "1";
       canClose = "1";
       canMinimize = "1";
       canMaximize = "1";
-      minSize = "50 50";
+      canCollapse = "0";
       closeCommand = "ScriptEditorDlg.close();";
-      EdgeSnap = "1";
-      text = "Text Pad";
-      Margin = "0 0 0 0";
-      Padding = "0 0 0 0";
-      AnchorTop = "1";
-      AnchorBottom = "0";
-      AnchorLeft = "1";
-      AnchorRight = "0";
+      edgeSnap = "1";
+      margin = "0 0 0 0";
+      padding = "0 0 0 0";
+      anchorTop = "1";
+      anchorBottom = "0";
+      anchorLeft = "1";
+      anchorRight = "0";
+      position = "219 162";
+      extent = "524 373";
+      minExtent = "8 8";
+      horizSizing = "center";
+      vertSizing = "center";
+      profile = "ToolsGuiWindowProfile";
+      visible = "1";
+      active = "1";
+      command = "ScriptEditorDlg.close();";
+      accelerator = "escape";
+      tooltipProfile = "ToolsGuiToolTipProfile";
+      hovertime = "1000";
       isContainer = "1";
-      Profile = "ToolsGuiWindowProfile";
-      HorizSizing = "center";
-      VertSizing = "center";
-      position = "176 120";
-      Extent = "656 464";
-      MinExtent = "8 8";
       canSave = "1";
-      Visible = "1";
-      Command = "ScriptEditorDlg.close();";
-      Accelerator = "escape";
-      tooltipprofile = "ToolsGuiToolTipProfile";
-      hovertime = "1000";
       canSaveDynamicFields = "0";
 
       new GuiControl() {
-         isContainer = "1";
-         Profile = "ToolsGuiDefaultProfile";
-         HorizSizing = "width";
-         VertSizing = "height";
          position = "8 24";
-         Extent = "640 392";
-         MinExtent = "8 2";
-         canSave = "1";
-         Visible = "1";
-         tooltipprofile = "ToolsGuiToolTipProfile";
+         extent = "508 291";
+         minExtent = "8 2";
+         horizSizing = "width";
+         vertSizing = "height";
+         profile = "ToolsGuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "ToolsGuiToolTipProfile";
          hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
          canSaveDynamicFields = "0";
 
          new GuiControl() {
+            position = "1 7";
+            extent = "507 286";
+            minExtent = "8 2";
+            horizSizing = "width";
+            vertSizing = "height";
+            profile = "ToolsGuiDefaultProfile";
+            visible = "1";
+            active = "1";
+            tooltipProfile = "ToolsGuiToolTipProfile";
+            hovertime = "1000";
             isContainer = "1";
-            Profile = "ToolsGuiDefaultProfile";
-            HorizSizing = "width";
-            VertSizing = "height";
-            position = "8 7";
-            Extent = "627 380";
-            MinExtent = "8 2";
             canSave = "1";
-            Visible = "1";
-            tooltipprofile = "ToolsGuiToolTipProfile";
-            hovertime = "1000";
             canSaveDynamicFields = "0";
 
             new GuiScrollCtrl() {
@@ -82,23 +86,24 @@ $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
                constantThumbHeight = "0";
                childMargin = "1 1";
                mouseWheelScrollSpeed = "-1";
-               Margin = "0 0 0 0";
-               Padding = "0 0 0 0";
-               AnchorTop = "1";
-               AnchorBottom = "0";
-               AnchorLeft = "1";
-               AnchorRight = "0";
-               isContainer = "1";
-               Profile = "ToolsGuiScrollProfile";
-               HorizSizing = "width";
-               VertSizing = "height";
+               margin = "0 0 0 0";
+               padding = "0 0 0 0";
+               anchorTop = "1";
+               anchorBottom = "0";
+               anchorLeft = "1";
+               anchorRight = "0";
                position = "0 0";
-               Extent = "627 380";
-               MinExtent = "8 2";
-               canSave = "1";
-               Visible = "1";
-               tooltipprofile = "ToolsGuiToolTipProfile";
+               extent = "507 286";
+               minExtent = "8 2";
+               horizSizing = "width";
+               vertSizing = "height";
+               profile = "ToolsGuiScrollProfile";
+               visible = "1";
+               active = "1";
+               tooltipProfile = "ToolsGuiToolTipProfile";
                hovertime = "1000";
+               isContainer = "1";
+               canSave = "1";
                canSaveDynamicFields = "0";
 
                new GuiMLTextEditCtrl() {
@@ -106,18 +111,19 @@ $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
                   allowColorChars = "0";
                   maxChars = "-1";
                   useURLMouseCursor = "0";
-                  isContainer = "0";
-                  Profile = "ToolsGuiTextPadProfile";
-                  HorizSizing = "width";
-                  VertSizing = "height";
                   position = "2 2";
-                  Extent = "623 380";
-                  MinExtent = "8 2";
-                  canSave = "1";
-                  Visible = "1";
-                  tooltipprofile = "ToolsGuiToolTipProfile";
+                  extent = "505 286";
+                  minExtent = "8 2";
+                  horizSizing = "width";
+                  vertSizing = "height";
+                  profile = "ToolsGuiTextPadProfile";
+                  visible = "1";
+                  active = "1";
+                  tooltipProfile = "ToolsGuiToolTipProfile";
                   hovertime = "1000";
+                  isContainer = "0";
                   internalName = "TextPad";
+                  canSave = "1";
                   canSaveDynamicFields = "0";
                };
             };
@@ -125,7 +131,7 @@ $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
       };
       new GuiIconButtonCtrl() {
          buttonMargin = "4 4";
-         bitmapAsset = "ToolsModule:iconCancel_image";
+         BitmapAsset = "ToolsModule:iconCancel_image";
          iconLocation = "Left";
          sizeIconToButton = "0";
          makeIconSquare = "0";
@@ -136,23 +142,24 @@ $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
          groupNum = "-1";
          buttonType = "PushButton";
          useMouseEvents = "0";
+         position = "335 334";
+         extent = "80 25";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "ScriptEditorDlg.close();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
          isContainer = "0";
-         Profile = "ToolsGuiButtonProfile";
-         HorizSizing = "left";
-         VertSizing = "top";
-         position = "460 424";
-         Extent = "80 25";
-         MinExtent = "8 2";
          canSave = "1";
-         Visible = "1";
-         Command = "ScriptEditorDlg.close();";
-         tooltipprofile = "ToolsGuiToolTipProfile";
-         hovertime = "1000";
          canSaveDynamicFields = "0";
       };
       new GuiIconButtonCtrl() {
          buttonMargin = "4 4";
-         bitmapAsset = "ToolsModule:iconAccept_image";
+         BitmapAsset = "ToolsModule:iconAccept_image";
          iconLocation = "Left";
          sizeIconToButton = "0";
          makeIconSquare = "0";
@@ -163,18 +170,19 @@ $guiContent = new GuiControl(ScriptEditorDlg,EditorGuiGroup) {
          groupNum = "-1";
          buttonType = "PushButton";
          useMouseEvents = "0";
+         position = "436 334";
+         extent = "80 25";
+         minExtent = "8 2";
+         horizSizing = "left";
+         vertSizing = "top";
+         profile = "ToolsGuiButtonProfile";
+         visible = "1";
+         active = "1";
+         command = "_TextPadOnOk();";
+         tooltipProfile = "ToolsGuiToolTipProfile";
+         hovertime = "1000";
          isContainer = "0";
-         Profile = "ToolsGuiButtonProfile";
-         HorizSizing = "left";
-         VertSizing = "top";
-         position = "560 424";
-         Extent = "80 25";
-         MinExtent = "8 2";
          canSave = "1";
-         Visible = "1";
-         Command = "_TextPadOnOk();";
-         tooltipprofile = "ToolsGuiToolTipProfile";
-         hovertime = "1000";
          canSaveDynamicFields = "0";
       };
    };

+ 82 - 133
Templates/BaseGame/game/tools/guiEditor/gui/guiEditor.ed.gui

@@ -22,8 +22,8 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
       Profile = "ToolsGuiFrameSetProfile";
       HorizSizing = "width";
       VertSizing = "height";
-      Position = "0 0";
-      Extent = "800 583";
+      Position = "-1 -1";
+      Extent = "801 584";
       MinExtent = "8 2";
       canSave = "1";
       Visible = "1";
@@ -50,24 +50,28 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
          Visible = "1";
          hovertime = "1000";
 
-         new GuiContainer(GHToolBar) {
-            margin = "0 0 0 0";
-            padding = "0 0 0 0";
-            anchorTop = "1";
-            anchorBottom = "0";
-            anchorLeft = "1";
-            anchorRight = "0";
-            isContainer = "1";
-            profile = "ToolsMenubarProfile";
+         new GuiStackControl(GuiEditorToolbarStack) {
+            stackingType = "Horizontal";
+            horizStacking = "Left to Right";
+            vertStacking = "Top to Bottom";
+            padding = "0";
+            dynamicSize = "1";
+            dynamicNonStackExtent = "0";
+            dynamicPos = "0";
+            changeChildSizeToFit = "0";
+            changeChildPosition = "1";
+            position = "0 0";
+            extent = "885 32";
+            minExtent = "16 16";
             horizSizing = "right";
             vertSizing = "bottom";
-            position = "0 0";
-            extent = "16000 32";
-            minExtent = "8 2";
-            canSave = "1";
+            profile = "ToolsGuiDefaultProfile";
             visible = "1";
-            tooltipProfile = "ToolsGuiToolTipProfile";
+            active = "1";
+            tooltipProfile = "GuiToolTipProfile";
             hovertime = "1000";
+            isContainer = "1";
+            canSave = "1";
             canSaveDynamicFields = "0";
 
             new GuiBitmapButtonCtrl(GHWorldEditor) {
@@ -135,6 +139,49 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                hovertime = "1000";
                canSaveDynamicFields = "0";
             };
+            new GuiBitmapButtonCtrl() {
+               BitmapAsset = "ToolsModule:settings_n_image";
+               bitmapMode = "Stretched";
+               autoFitExtents = "0";
+               useModifiers = "0";
+               useStates = "1";
+               masked = "0";
+               groupNum = "-1";
+               buttonType = "PushButton";
+               useMouseEvents = "0";
+               position = "150 0";
+               extent = "29 27";
+               minExtent = "8 8";
+               horizSizing = "right";
+               vertSizing = "bottom";
+               profile = "ToolsGuiButtonProfile";
+               visible = "1";
+               active = "1";
+               command = "ESettingsWindow.toggleEditorSettings();";
+               tooltipProfile = "ToolsGuiToolTipProfile";
+               tooltip = "Open Editor Settings";
+               hovertime = "1000";
+               isContainer = "0";
+               internalName = "editorSettingsBtn";
+               canSave = "1";
+               canSaveDynamicFields = "0";
+            };
+            new GuiBitmapCtrl() {
+               bitmapAsset = "ToolsModule:separator_h_image";
+               wrap = "0";
+               isContainer = "0";
+               profile = "ToolsGuiDefaultProfile";
+               horizSizing = "right";
+               vertSizing = "bottom";
+               position = "130 3";
+               extent = "2 26";
+               minExtent = "1 1";
+               canSave = "1";
+               visible = "1";
+               tooltipProfile = "ToolsGuiToolTipProfile";
+               hovertime = "1000";
+               canSaveDynamicFields = "0";
+            };
             new GuiBitmapButtonCtrl() {
                canSaveDynamicFields = "0";
                internalName = AssetBrowserBtn;
@@ -148,7 +195,7 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                MinExtent = "8 2";
                canSave = "1";
                Visible = "1";
-               Command = "AssetBrowser.ShowDialog();";
+               Command = "AssetBrowser.toggleDialog();";
                tooltipprofile = "ToolsGuiToolTipProfile";
                ToolTip = "Asset Browser";
                hovertime = "750";
@@ -159,36 +206,13 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                useMouseEvents = "0";
             };
             new GuiBitmapCtrl() {
+               Enabled = "1";
+               Profile = "ToolsGuiDefaultProfile";
+               position = "160 3";
+               Extent = "2 26";
+               MinExtent = "1 1";
                bitmapAsset = "ToolsModule:separator_h_image";
-               wrap = "0";
-               isContainer = "0";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "130 3";
-               extent = "2 26";
-               minExtent = "1 1";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
             };
-         };
-         new GuiControl() {
-            isContainer = "1";
-            profile = "ToolsGuiDefaultProfile";
-            horizSizing = "width";
-            vertSizing = "bottom";
-            position = "131 0";
-            extent = "723 32";
-            minExtent = "8 2";
-            canSave = "1";
-            visible = "1";
-            tooltipProfile = "ToolsGuiToolTipProfile";
-            hovertime = "1000";
-            canSaveDynamicFields = "0";
-
             new GuiPopUpMenuCtrl(GuiEditorContentList) {
                maxPopupHeight = "200";
                sbUsesNAColor = "0";
@@ -205,9 +229,9 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                isContainer = "0";
                profile = "ToolsGuiPopUpMenuProfile";
                horizSizing = "right";
-               vertSizing = "bottom";
-               position = "8 7";
-               extent = "145 18";
+               vertSizing = "center";
+               position = "8 0";
+               extent = "145 27";
                minExtent = "8 2";
                canSave = "1";
                visible = "1";
@@ -231,9 +255,9 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                isContainer = "0";
                profile = "ToolsGuiPopUpMenuProfile";
                horizSizing = "right";
-               vertSizing = "bottom";
-               position = "161 7";
-               extent = "136 18";
+               vertSizing = "center";
+               position = "161 0";
+               extent = "136 27";
                minExtent = "8 2";
                canSave = "1";
                visible = "1";
@@ -247,7 +271,7 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                isContainer = "0";
                profile = "ToolsGuiDefaultProfile";
                horizSizing = "right";
-               vertSizing = "bottom";
+               vertSizing = "center";
                position = "307 3";
                extent = "2 26";
                minExtent = "1 1";
@@ -257,20 +281,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                hovertime = "1000";
                canSaveDynamicFields = "0";
             };
-            new GuiControl() {
-               isContainer = "1";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "312 3";
-               extent = "95 27";
-               minExtent = "8 2";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
-
                new GuiBitmapButtonCtrl(GuiEditorSnapCheckBox) {
                   bitmapAsset = "ToolsModule:snap_grid_n_image";
                   bitmapMode = "Stretched";
@@ -302,10 +312,10 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   isContainer = "0";
                   profile = "ToolsGuiButtonProfile";
                   horizSizing = "right";
-                  vertSizing = "bottom";
+               vertSizing = "center";
                   position = "31 0";
                   extent = "29 27";
-                  minExtent = "120 21";
+               minExtent = "21 21";
                   canSave = "1";
                   visible = "1";
                   command = "GuiEditor.toggleEdgeSnap();";
@@ -324,10 +334,10 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   isContainer = "0";
                   profile = "ToolsGuiButtonProfile";
                   horizSizing = "right";
-                  vertSizing = "bottom";
+               vertSizing = "center";
                   position = "62 0";
                   extent = "29 27";
-                  minExtent = "120 21";
+               minExtent = "21 21";
                   canSave = "1";
                   visible = "1";
                   command = "GuiEditor.toggleCenterSnap();";
@@ -336,7 +346,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   hovertime = "1000";
                   canSaveDynamicFields = "0";
                };
-            };
             new GuiBitmapCtrl() {
                bitmapAsset = "ToolsModule:separator_h_image";
                wrap = "0";
@@ -353,20 +362,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                hovertime = "1000";
                canSaveDynamicFields = "0";
             };
-            new GuiControl() {
-               isContainer = "1";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "422 3";
-               extent = "95 27";
-               minExtent = "8 2";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
-
                new GuiBitmapButtonCtrl() {
                   bitmapAsset = "ToolsModule:align_left_n_image";
                   bitmapMode = "Stretched";
@@ -380,7 +375,7 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   vertSizing = "bottom";
                   position = "0 0";
                   extent = "29 27";
-                  minExtent = "120 21";
+               minExtent = "21 21";
                   canSave = "1";
                   visible = "1";
                   command = "GuiEditor.Justify(0);";
@@ -433,21 +428,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   hovertime = "1000";
                   canSaveDynamicFields = "0";
                };
-            };
-            new GuiControl() {
-               isContainer = "1";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "498 3";
-               extent = "95 27";
-               minExtent = "8 2";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
-
                new GuiBitmapButtonCtrl() {
                   bitmapAsset = "ToolsModule:align_top_n_image";
                   bitmapMode = "Stretched";
@@ -461,7 +441,7 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   vertSizing = "bottom";
                   position = "0 0";
                   extent = "29 27";
-                  minExtent = "120 21";
+               minExtent = "21 21";
                   canSave = "1";
                   visible = "1";
                   command = "GuiEditor.Justify(3);";
@@ -514,7 +494,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   hovertime = "1000";
                   canSaveDynamicFields = "0";
                };
-            };
             new GuiBitmapCtrl() {
                bitmapAsset = "ToolsModule:separator_h_image";
                wrap = "0";
@@ -547,20 +526,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                hovertime = "1000";
                canSaveDynamicFields = "0";
             };
-            new GuiControl() {
-               isContainer = "1";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "615 3";
-               extent = "117 27";
-               minExtent = "8 2";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
-
                new GuiBitmapButtonCtrl() {
                   bitmapAsset = "ToolsModule:send_to_back_n_image";
                   bitmapMode = "Stretched";
@@ -605,21 +570,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   hovertime = "1000";
                   canSaveDynamicFields = "0";
                };
-            };
-            new GuiControl() {
-               isContainer = "1";
-               profile = "ToolsGuiDefaultProfile";
-               horizSizing = "right";
-               vertSizing = "bottom";
-               position = "583 3";
-               extent = "60 27";
-               minExtent = "8 2";
-               canSave = "1";
-               visible = "1";
-               tooltipProfile = "ToolsGuiToolTipProfile";
-               hovertime = "1000";
-               canSaveDynamicFields = "0";
-
                new GuiBitmapButtonCtrl() {
                   bitmapAsset = "ToolsModule:distribute_horizontal_n_image";
                   bitmapMode = "Stretched";
@@ -663,7 +613,6 @@ $guiContent = new GuiControl(GuiEditorGui, EditorGuiGroup) {
                   ToolTip = "Distribute Vertically";
                   hovertime = "1000";
                   canSaveDynamicFields = "0";
-               };
             };
          };
          //---------------------

+ 5 - 1
Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript

@@ -2040,13 +2040,17 @@ function MaterialEditorGui::pickedNewMaterialTargetModule( %this, %module )
    PE_EmitterEditor.targetModule = %module;
    MaterialEditorGui.defaultMaterialFile = %moduleDef.ModulePath @ "/scripts/managedData/materials." @ $TorqueScriptFileExtension;
 
+   if(!isDirectory(filePath(MaterialEditorGui.defaultMaterialFile)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath(MaterialEditorGui.defaultMaterialFile));
+   }
+
    %action = %this.createUndo(ActionCreateNewMaterial, "Create New Material");
    %action.object = "";
    
    %material = getUniqueName( "newMaterial" );
    new Material(%material) 
    {
-      diffuseMap[0] = "core/rendering/images/warnmat";
       mapTo = "unmapped_mat";
       parentGroup = RootGroup;
    };

+ 8 - 4
Templates/BaseGame/game/tools/meshRoadEditor/main.tscript

@@ -31,12 +31,10 @@ function initializeMeshRoadEditor()
    
    MeshRoadEditorGui.setVisible( false );  
    MeshRoadEditorOptionsWindow.setVisible( false );  
-   MeshRoadEditorToolbar.setVisible( false ); 
    MeshRoadEditorTreeWindow.setVisible( false ); 
    
    EditorGui.add( MeshRoadEditorGui );
    EditorGui.add( MeshRoadEditorOptionsWindow );
-   EditorGui.add( MeshRoadEditorToolbar );
    EditorGui.add( MeshRoadEditorTreeWindow );
       
    new ScriptObject( MeshRoadEditorPlugin )
@@ -95,7 +93,10 @@ function MeshRoadEditorPlugin::onActivated( %this )
    MeshRoadEditorGui.setVisible( true );
    MeshRoadEditorGui.makeFirstResponder( true );
    MeshRoadEditorOptionsWindow.setVisible( true );
-   MeshRoadEditorToolbar.setVisible( true );  
+   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( MeshRoadEditorToolbar );
+
    MeshRoadEditorTreeWindow.setVisible( true );
    MeshRoadTreeView.open(ServerMeshRoadSet,true);
    %this.map.push();
@@ -121,7 +122,10 @@ function MeshRoadEditorPlugin::onDeactivated( %this )
    
    MeshRoadEditorGui.setVisible( false );
    MeshRoadEditorOptionsWindow.setVisible( false );
-   MeshRoadEditorToolbar.setVisible( false );  
+   
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( MeshRoadEditorToolbar );
+     
    MeshRoadEditorTreeWindow.setVisible( false );
    %this.map.pop();
    

+ 1 - 1
Templates/BaseGame/game/tools/meshRoadEditor/meshRoadEditorToolbar.gui

@@ -10,7 +10,7 @@ $guiContent = new GuiControl(MeshRoadEditorToolbar,EditorGuiGroup) {
    Extent = "800 32";
    MinExtent = "8 2";
    canSave = "1";
-   Visible = "0";
+   Visible = "1";
    hovertime = "1000";
    
    new GuiTextCtrl() {

+ 6 - 4
Templates/BaseGame/game/tools/navEditor/main.tscript

@@ -42,13 +42,11 @@ function initializeNavEditor()
 
    // Add ourselves to EditorGui, where all the other tools reside
    NavEditorGui.setVisible(false);  
-   NavEditorToolbar.setVisible(false); 
    NavEditorOptionsWindow.setVisible(false);
    NavEditorTreeWindow.setVisible(false);
    NavEditorConsoleDlg.setVisible(false);
 
    EditorGui.add(NavEditorGui);
-   EditorGui.add(NavEditorToolbar);
    EditorGui.add(NavEditorOptionsWindow);
    EditorGui.add(NavEditorTreeWindow);
    EditorGui.add(NavEditorConsoleDlg);
@@ -123,7 +121,8 @@ function NavEditorPlugin::onActivated(%this)
 
    NavEditorGui.setVisible(true);
    NavEditorGui.makeFirstResponder(true);
-   NavEditorToolbar.setVisible(true);
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( NavEditorToolbar );
 
    NavEditorOptionsWindow.setVisible(true);
    NavEditorTreeWindow.setVisible(true);
@@ -167,7 +166,10 @@ function NavEditorPlugin::onDeactivated(%this)
    $Nav::EditorOpen = false;   
 
    NavEditorGui.setVisible(false);
-   NavEditorToolbar.setVisible(false);
+
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( NavEditorToolbar );
+
    NavEditorOptionsWindow.setVisible(false);
    NavEditorTreeWindow.setVisible(false);
    %this.map.pop();

+ 5 - 0
Templates/BaseGame/game/tools/particleEditor/particleEmitterEditor.ed.tscript

@@ -563,6 +563,11 @@ function PE_EmitterEditor::pickedNewEmitterTargetModule( %this, %module )
    PE_EmitterEditor.targetModule = %module;
    $PE_EMITTEREDITOR_DEFAULT_FILENAME = %moduleDef.ModulePath @ "/scripts/managedData/managedParticleEmitterData." @ $TorqueScriptFileExtension;
    
+   if(!isDirectory(filePath($PE_EMITTEREDITOR_DEFAULT_FILENAME)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath($PE_EMITTEREDITOR_DEFAULT_FILENAME));
+   }
+   
    // Create a new emitter.
    %emitter = getUniqueName( "newEmitter" );
    datablock ParticleEmitterData( %emitter : DefaultEmitter )

+ 5 - 0
Templates/BaseGame/game/tools/particleEditor/particleParticleEditor.ed.tscript

@@ -498,6 +498,11 @@ function PE_ParticleEditor::pickedNewParticleTargetModule(%this, %module)
    %moduleDef = ModuleDatabase.findModule(%module);
    $PE_PARTICLEEDITOR_DEFAULT_FILENAME = %moduleDef.ModulePath @ "/scripts/managedData/managedParticleData." @ $TorqueScriptFileExtension;
    
+   if(!isDirectory(filePath($PE_PARTICLEEDITOR_DEFAULT_FILENAME)))
+   {
+      AssetBrowser.dirHandler.createFolder(filePath($PE_PARTICLEEDITOR_DEFAULT_FILENAME));
+   }
+   
    // Create the particle datablock and add to the emitter.
    
    %newParticle = getUniqueName( "newParticle" );

+ 1 - 1
Templates/BaseGame/game/tools/riverEditor/RiverEditorToolbar.gui

@@ -10,7 +10,7 @@ $guiContent = new GuiControl(RiverEditorToolbar, EditorGuiGroup) {
    Extent = "800 32";
    MinExtent = "8 2";
    canSave = "1";
-   Visible = "0";
+   Visible = "1";
    hovertime = "1000";
    
    new GuiTextCtrl() {

+ 7 - 4
Templates/BaseGame/game/tools/riverEditor/main.tscript

@@ -31,12 +31,10 @@ function initializeRiverEditor()
    
    // Add ourselves to EditorGui, where all the other tools reside
    RiverEditorGui.setVisible( false );  
-   RiverEditorToolbar.setVisible(false); 
    RiverEditorOptionsWindow.setVisible( false );
    RiverEditorTreeWindow.setVisible( false );
    
    EditorGui.add( RiverEditorGui );
-   EditorGui.add( RiverEditorToolbar );
    EditorGui.add( RiverEditorOptionsWindow );
    EditorGui.add( RiverEditorTreeWindow );
    
@@ -97,7 +95,9 @@ function RiverEditorPlugin::onActivated( %this )
    
    RiverEditorGui.setVisible(true);
    RiverEditorGui.makeFirstResponder( true );
-   RiverEditorToolbar.setVisible(true);
+   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( RiverEditorToolbar );
    
    RiverEditorOptionsWindow.setVisible( true );
    RiverEditorTreeWindow.setVisible( true );
@@ -130,7 +130,10 @@ function RiverEditorPlugin::onDeactivated( %this )
    $River::EditorOpen = false;   
    
    RiverEditorGui.setVisible(false);
-   RiverEditorToolbar.setVisible(false);
+   
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( RiverEditorToolbar );
+
    RiverEditorOptionsWindow.setVisible( false );
    RiverEditorTreeWindow.setVisible( false );
    %this.map.pop();

+ 1 - 1
Templates/BaseGame/game/tools/roadEditor/RoadEditorToolbar.gui

@@ -10,7 +10,7 @@ $guiContent = new GuiControl(RoadEditorToolbar) {
    Extent = "800 32";
    MinExtent = "8 2";
    canSave = "1";
-   Visible = "0";
+   Visible = "1";
    hovertime = "1000";
    
    new GuiTextCtrl() {

+ 6 - 4
Templates/BaseGame/game/tools/roadEditor/main.tscript

@@ -31,12 +31,10 @@ function initializeRoadEditor()
    
    // Add ourselves to EditorGui, where all the other tools reside
    RoadEditorGui.setVisible( false ); 
-   RoadEditorToolbar.setVisible( false );
    RoadEditorOptionsWindow.setVisible( false );
    RoadEditorTreeWindow.setVisible( false );
    
    EditorGui.add( RoadEditorGui );
-   EditorGui.add( RoadEditorToolbar );
    EditorGui.add( RoadEditorOptionsWindow );
    EditorGui.add( RoadEditorTreeWindow );
    
@@ -94,7 +92,8 @@ function RoadEditorPlugin::onActivated( %this )
    
    RoadEditorGui.setVisible( true );
    RoadEditorGui.makeFirstResponder( true );
-   RoadEditorToolbar.setVisible( true );   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( RoadEditorToolbar );
    
    RoadEditorOptionsWindow.setVisible( true );
    RoadEditorTreeWindow.setVisible( true );
@@ -115,7 +114,10 @@ function RoadEditorPlugin::onDeactivated( %this )
    %this.writeSettings();
    
    RoadEditorGui.setVisible( false );
-   RoadEditorToolbar.setVisible( false );   
+   
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( RoadEditorToolbar );
+
    RoadEditorOptionsWindow.setVisible( false );
    RoadEditorTreeWindow.setVisible( false );
    %this.map.pop();

+ 6 - 5
Templates/BaseGame/game/tools/shapeEditor/main.tscript

@@ -44,8 +44,6 @@ function initializeShapeEditor()
    // Add windows to editor gui
    ShapeEdPreviewGui.setVisible(false);
    ShapeEdAnimWindow.setVisible(false);
-
-   ShapeEditorToolbar.setVisible(false);
    ShapeEdSelectWindow.setVisible(false);
    ShapeEdPropWindow.setVisible(false);
 
@@ -53,7 +51,6 @@ function initializeShapeEditor()
    EditorGui.add(ShapeEdAnimWindow);
    EditorGui.add(ShapeEdAdvancedWindow);
 
-   EditorGui.add(ShapeEditorToolbar);
    EditorGui.add(ShapeEdSelectWindow);
    EditorGui.add(ShapeEdPropWindow);
 
@@ -189,7 +186,6 @@ function ShapeEditorPlugin::open(%this, %shapeAsset)
       ShapeEdPropWindow.setVisible(true);
       ShapeEdAnimWindow.setVisible(true);
       ShapeEdAdvancedWindow.setVisible(ShapeEditorToolbar-->showAdvanced.getValue());
-      ShapeEditorToolbar.setVisible(true);
       EditorGui.bringToFront(ShapeEdPreviewGui);
 
       ToolsPaletteArray->WorldEditorMove.performClick();
@@ -256,6 +252,9 @@ function ShapeEditorPlugin::onActivated(%this)
          %this.openShapeAssetId(%shapeFile);
       }
    }
+   
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   EditorGuiToolbarStack.add( ShapeEditorToolbar );
 }
 
 function ShapeEditorPlugin::initStatusBar(%this)
@@ -275,7 +274,9 @@ function ShapeEditorPlugin::onDeactivated(%this)
    $gfx::wireframe = $wasInWireFrameMode;
 
    ShapeEdMaterials.updateSelectedMaterial(false);
-   ShapeEditorToolbar.setVisible(false);
+   
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   EditorGuiToolbarStack.remove( ShapeEditorToolbar );
 
    ShapeEdPreviewGui.setVisible(false);
    ShapeEdSelectWindow.setVisible(false);

+ 94 - 0
Templates/BaseGame/game/tools/worldEditor/gui/EditorGui.ed.gui

@@ -33,6 +33,29 @@ $guiContent = new GuiContainer(EditorGui,EditorGuiGroup) {
       Visible = "1";
       hovertime = "1000";
       
+      new GuiStackControl(EditorGuiToolbarStack) {
+         stackingType = "Horizontal";
+         horizStacking = "Left to Right";
+         vertStacking = "Top to Bottom";
+         padding = "0";
+         dynamicSize = "1";
+         dynamicNonStackExtent = "0";
+         dynamicPos = "0";
+         changeChildSizeToFit = "0";
+         changeChildPosition = "1";
+         position = "0 0";
+         extent = "885 32";
+         minExtent = "16 16";
+         horizSizing = "right";
+         vertSizing = "bottom";
+         profile = "GuiDefaultProfile";
+         visible = "1";
+         active = "1";
+         tooltipProfile = "GuiToolTipProfile";
+         hovertime = "1000";
+         isContainer = "1";
+         canSave = "1";
+         canSaveDynamicFields = "0";
         
       new GuiBitmapButtonCtrl(EHWorldEditor) {
          canSaveDynamicFields = "0";
@@ -107,6 +130,76 @@ $guiContent = new GuiContainer(EditorGui,EditorGuiGroup) {
       bitmapAsset = "ToolsModule:separator_h_image";
       };
       
+         new GuiBitmapButtonCtrl() {
+            BitmapAsset = "ToolsModule:settings_n_image";
+            bitmapMode = "Stretched";
+            autoFitExtents = "0";
+            useModifiers = "0";
+            useStates = "1";
+            masked = "0";
+            groupNum = "-1";
+            buttonType = "PushButton";
+            useMouseEvents = "0";
+            position = "572 0";
+            extent = "29 27";
+            minExtent = "8 8";
+            horizSizing = "right";
+            vertSizing = "bottom";
+            profile = "ToolsGuiButtonProfile";
+            visible = "1";
+            active = "1";
+            command = "ESettingsWindow.toggleEditorSettings();";
+            tooltipProfile = "ToolsGuiToolTipProfile";
+            tooltip = "Open Editor Settings";
+            hovertime = "1000";
+            isContainer = "0";
+            internalName = "editorSettingsBtn";
+            canSave = "1";
+            canSaveDynamicFields = "0";
+         };
+         
+         new GuiBitmapCtrl() {
+            Enabled = "1";
+            Profile = "ToolsGuiDefaultProfile";
+            position = "98 3";
+            Extent = "2 26";
+            MinExtent = "1 1";
+            bitmapAsset = "ToolsModule:separator_h_image";
+         };
+         
+         new GuiBitmapButtonCtrl() {
+            canSaveDynamicFields = "0";
+            internalName = AssetBrowserBtn;
+            Enabled = "1";
+            isContainer = "0";
+            Profile = "ToolsGuiButtonProfile";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+            position = "180 0";
+            Extent = "29 27";
+            MinExtent = "8 2";
+            canSave = "1";
+            Visible = "1";
+            Command = "AssetBrowser.toggleDialog();";
+            tooltipprofile = "ToolsGuiToolTipProfile";
+            ToolTip = "Asset Browser";
+            hovertime = "750";
+            bitmapAsset = "ToolsModule:menuGrid_n_image";
+            bitmapMode = "Stretched";
+            buttonType = "PushButton";
+            groupNum = "0";
+            useMouseEvents = "0";
+         };
+         
+         new GuiBitmapCtrl() {
+            Enabled = "1";
+            Profile = "ToolsGuiDefaultProfile";
+            position = "98 3";
+            Extent = "2 26";
+            MinExtent = "1 1";
+            bitmapAsset = "ToolsModule:separator_h_image";
+         };
+         
       new GuiBitmapButtonCtrl(EWorldEditorToggleCamera) {
          canSaveDynamicFields = "0";
          Enabled = "1";
@@ -306,6 +399,7 @@ $guiContent = new GuiContainer(EditorGui,EditorGuiGroup) {
          sbUsesNAColor = "0";
          reverseTextList = "0";
          bitmapBounds = "16 16";
+         };
       };
    };
    

+ 0 - 25
Templates/BaseGame/game/tools/worldEditor/gui/WorldEditorToolbar.ed.gui

@@ -520,31 +520,6 @@ $guiContent = new GuiControl(EWorldEditorToolbar, EditorGuiGroup) {
          useMouseEvents = "0";
       };
       
-      new GuiBitmapButtonCtrl() {
-         canSaveDynamicFields = "0";
-         internalName = "editorSettingsBtn";
-         Enabled = "1";
-         isContainer = "0";
-         Profile = "ToolsGuiButtonProfile";
-         HorizSizing = "right";
-         VertSizing = "bottom";
-         Position = "484 3";
-         Extent = "29 27";
-         MinExtent = "8 8";
-         canSave = "1";
-         Visible = "1";
-         Variable = "";
-         Command = "ESettingsWindow.toggleEditorSettings();";
-         tooltipprofile = "ToolsGuiToolTipProfile";
-         ToolTip = "Open Editor Settings";
-         hovertime = "1000";
-         bitmapAsset = "ToolsModule:settings_n_image";
-         text = "";
-         groupNum = "-1";
-         buttonType = "PushButton";
-         useMouseEvents = "0";
-      };
-
       new GuiContainer(objectCenterDropdown){
          Profile = "IconDropdownProfile";
          Position = getWord(EWorldEditorToolbar.position, 0)+getWord(ToggleButtonBar.Position, 0)+getWord(EWorldEditorToolbar-->centerObject.position, 0)-5 SPC getWord(EditorGuiToolbar.extent, 1)-1;

+ 20 - 11
Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript

@@ -91,10 +91,10 @@ function EditorGui::init(%this)
    {
       // Load Creator/Inspector GUI
       exec("~/worldEditor/gui/WorldEditorToolbar.ed.gui");
-      if( isObject( EWorldEditorToolbar ) )
+      if( isObject( EditorGuiToolbarStack ) )
       {
-         %this.add( EWorldEditorToolbar );
-         EWorldEditorToolbar.setVisible( false );
+         EditorGuiToolbarStack.add( EWorldEditorToolbar );
+         //EWorldEditorToolbar.setVisible( false );
       }
    }  
    
@@ -102,11 +102,11 @@ function EditorGui::init(%this)
    {
       // Load Terrain Edit GUI
       exec("~/worldEditor/gui/TerrainEditToolbar.ed.gui");
-      if( isObject( EWTerrainEditToolbar ) )
+      /*if( isObject( EWTerrainEditToolbar ) )
       {
          %this.add( EWTerrainEditToolbar );
          EWTerrainEditToolbar.setVisible( false );
-      }
+      }*/
    }
    
    if( !isObject( %this-->TerrainPainter ) )
@@ -126,11 +126,11 @@ function EditorGui::init(%this)
    {
       // Load Terrain Edit GUI
       exec("~/worldEditor/gui/TerrainPainterToolbar.ed.gui");
-      if( isObject( EWTerrainPainterToolbar ) )
+      /*if( isObject( EWTerrainPainterToolbar ) )
       {
          %this.add( EWTerrainPainterToolbar );
          EWTerrainPainterToolbar.setVisible( false );
-      }
+      }*/
    }
 
    if( !isObject( %this-->ToolsToolbar ) )
@@ -1082,7 +1082,9 @@ function TerrainEditorPlugin::onActivated( %this )
    ETerrainEditor.attachTerrain();
    ETerrainEditor.makeFirstResponder( true );
         
-   EWTerrainEditToolbar.setVisible( true );
+   EditorGuiToolbarStack.add(EWTerrainEditToolbar);
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   //EWTerrainEditToolbar.setVisible( true );
    ETerrainEditor.onBrushChanged();
    ETerrainEditor.setup();
    TerrainEditorPlugin.syncBrushInfo();
@@ -1098,7 +1100,9 @@ function TerrainEditorPlugin::onDeactivated( %this )
    endToolTime("TerrainEditor");
    EditorGui.writeTerrainEditorSettings();
 
-   EWTerrainEditToolbar.setVisible( false );
+   EditorGuiToolbarStack.remove(EWTerrainEditToolbar);
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   //EWTerrainEditToolbar.setVisible( false );
    ETerrainEditor.setVisible( false );
 
    EditorGui.menuBar.remove( %this.terrainMenu );
@@ -1216,7 +1220,10 @@ function TerrainPainterPlugin::onActivated( %this )
 
    EditorGui-->TerrainPainter.setVisible(true);
    EditorGui-->TerrainPainterPreview.setVisible(true);
-   EWTerrainPainterToolbar.setVisible(true);
+   
+   EditorGuiToolbarStack.add(EWTerrainPainterToolbar);
+   EditorGuiToolbarStack.remove( EWorldEditorToolbar );
+   //EWTerrainPainterToolbar.setVisible(true);
    ETerrainEditor.onBrushChanged();
    EPainter.setup();
    TerrainPainterPlugin.syncBrushInfo();
@@ -1233,7 +1240,9 @@ function TerrainPainterPlugin::onDeactivated( %this )
    %this.map.pop();
    EditorGui-->TerrainPainter.setVisible(false);
    EditorGui-->TerrainPainterPreview.setVisible(false);
-   EWTerrainPainterToolbar.setVisible(false);
+   EditorGuiToolbarStack.remove(EWTerrainPainterToolbar);
+   EditorGuiToolbarStack.add( EWorldEditorToolbar );
+   //EWTerrainPainterToolbar.setVisible(false);
    ETerrainEditor.setVisible( false );
 }
 

+ 2 - 0
Templates/BaseGame/game/tools/worldEditor/scripts/editor.keybinds.tscript

@@ -78,3 +78,5 @@ GlobalActionMap.bind(keyboard, "ctrl F3", doProfile);
 GlobalActionMap.bind(keyboard, "tilde", toggleConsole);
 
 EditorMap.bind( mouse, "alt zaxis", editorWheelFadeScroll );
+
+EditorMap.bindCmd( keyboard, space, "", "AssetBrowser.toggleDialog();" );

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

@@ -159,7 +159,7 @@ function EPainter::updateLayers( %this, %matIndex )
    %ctrl = new GuiIconButtonCtrl()
    {
       profile = "GuiCreatorIconButtonProfile";
-      iconBitmap = "~/worldEditor/images/terrainpainter/new_layer_icon";
+      iconBitmapAsset = "ToolsModule:new_layer_icon_image";
       iconLocation = "Left";
       textLocation = "Right";
       extent = %listWidth SPC "46";

+ 19 - 5
Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript

@@ -246,14 +246,22 @@ function TerrainMaterialDlg::clearTextureMap(%this, %mapName)
    %targetMap.setBitmap($TerrainMaterialEditor::emptyMaterialImage);
    %targetMap.asset = "";
 
+   %targetMapName = %this.findObjectByInternalName(%mapName @ "AssetId", true);
+   %targetMapName.setText("None");
+
    TerrainMaterialDlg.matDirty = true;
 
    if(%mapName $= "DetailMap")
    {
       //hide the supplemental maps
       NormalMapContainer.callOnChildren("setActive", false);  
+      %this.clearTextureMap("NormalMap");
+      
       ORMMapContainer.callOnChildren("setActive", false);
+      %this.clearTextureMap("ORMMap");
+      
       MacroMapContainer.callOnChildren("setActive", false);
+      %this.clearTextureMap("MacroMap");
    }
 }
 
@@ -290,6 +298,9 @@ function TerrainMaterialDlg::changeTerrainMatMapAsset(%this)
 
    %targetMap.setBitmap( %image );  
 
+   %targetMapName = %mapName @ "AssetId";
+   %targetMapName.setText(%imgAsset);
+
    TerrainMaterialDlg.matDirty = true;
 }
 
@@ -546,29 +557,32 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat )
    
    %newName = %this-->matNameCtrl.getText(); 
    
+   %blankBitmap = AssetDatabase.acquireAsset($TerrainMaterialEditor::emptyMaterialImage).getImagePath();
+   
+   
    //---
    %newDiffuse = %this-->texBaseMap.getBitmap();
-   if(%newDiffuse $= $TerrainMaterialEditor::emptyMaterialImage)
+   if(%newDiffuse $= $TerrainMaterialEditor::emptyMaterialImage || %newDiffuse $= %blankBitmap)
       %newDiffuse = "";
    
    //---
    %newNormal = %this-->texNormalMap.getBitmap();
-   if(%newNormal $= $TerrainMaterialEditor::emptyMaterialImage)
+   if(%newNormal $= $TerrainMaterialEditor::emptyMaterialImage || %newNormal $= %blankBitmap)
       %newNormal = "";
    
    //---
    %newormConfig = %this-->texORMConfigMap.getBitmap();
-   if(%newormConfig $= $TerrainMaterialEditor::emptyMaterialImage)
+   if(%newormConfig $= $TerrainMaterialEditor::emptyMaterialImage || %newormConfig $= %blankBitmap)
       %newormConfig = "";
    
    //---
    %newDetail = %this-->texDetailMap.getBitmap();
-   if(%newDetail $= $TerrainMaterialEditor::emptyMaterialImage)
+   if(%newDetail $= $TerrainMaterialEditor::emptyMaterialImage || %newDetail $= %blankBitmap)
       %newDetail = "";
    
    //---
    %newMacro = %this-->texMacroMap.getBitmap();
-   if(%newMacro $= $TerrainMaterialEditor::emptyMaterialImage)
+   if(%newMacro $= $TerrainMaterialEditor::emptyMaterialImage || %newMacro $= %blankBitmap)
       %newMacro = "";
    
    %detailSize = %this-->detSizeCtrl.getText();      

+ 6 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/menuHandlers.ed.tscript

@@ -1060,7 +1060,12 @@ function EditorDropTypeMenu::onSelectItem(%this, %id, %text)
    // a drop type is selected in the menu.
    EWorldEditor.dropType = getField(%this.item[%id], 2);
    
-   %this.checkRadioItem(0, (%this.getItemCount() - 1), %id);
+   for(%i=0; %i < %this.getItemCount(); %i++)
+   {
+      %this.checkItem(%i, false);  
+   }
+   
+   %this.checkItem(%id, true);  
    
    return true;
 }