Explorar el Código

Merge pull request #550 from Areloch/MiscQOLFixes20210828

Misc Quality of Life and Bug fixes
Brian Roberts hace 4 años
padre
commit
09272e0e63
Se han modificado 26 ficheros con 338 adiciones y 210 borrados
  1. 4 4
      Engine/source/T3D/assets/ImageAsset.cpp
  2. 7 0
      Engine/source/T3D/assets/TerrainAsset.cpp
  3. 1 1
      Engine/source/gui/editor/inspector/variableInspector.cpp
  4. 1 1
      Templates/BaseGame/game/tools/assetBrowser/guis/assetBrowser.gui
  5. 35 33
      Templates/BaseGame/game/tools/assetBrowser/guis/newAsset.gui
  6. 3 2
      Templates/BaseGame/game/tools/assetBrowser/guis/selectModule.gui
  7. 5 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/addModuleWindow.tscript
  8. 10 0
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript
  9. 23 10
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript
  10. 14 18
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript
  11. 17 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrain.tscript
  12. 5 1
      Templates/BaseGame/game/tools/assetBrowser/scripts/editModule.tscript
  13. 15 30
      Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript
  14. 9 4
      Templates/BaseGame/game/tools/assetBrowser/scripts/selectModule.tscript
  15. 6 0
      Templates/BaseGame/game/tools/datablockEditor/datablockEditor.tscript
  16. 5 0
      Templates/BaseGame/game/tools/decalEditor/decalEditorGui.tscript
  17. 6 0
      Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript
  18. 24 1
      Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.tscript
  19. 5 1
      Templates/BaseGame/game/tools/gui/profiles.ed.tscript
  20. 102 94
      Templates/BaseGame/game/tools/gui/scriptEditorDlg.ed.gui
  21. 5 1
      Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript
  22. 5 0
      Templates/BaseGame/game/tools/particleEditor/particleEmitterEditor.ed.tscript
  23. 5 0
      Templates/BaseGame/game/tools/particleEditor/particleParticleEditor.ed.tscript
  24. 1 1
      Templates/BaseGame/game/tools/worldEditor/scripts/editors/terrainEditor.ed.tscript
  25. 19 5
      Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript
  26. 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
 //-----------------------------------------------------------------------------

+ 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);

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

@@ -247,7 +247,7 @@
             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 @@
       anchorBottom = "0";
       anchorLeft = "1";
       anchorRight = "0";
-      position = "328 140";
+      position = "328 159";
       extent = "368 450";
       minExtent = "48 92";
       horizSizing = "center";
@@ -54,7 +54,7 @@
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "12 54";
+         position = "12 29";
          extent = "116 17";
          minExtent = "8 2";
          horizSizing = "right";
@@ -68,6 +68,35 @@
          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 @@
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "12 30";
+         position = "12 54";
          extent = "116 17";
          minExtent = "8 2";
          horizSizing = "right";
@@ -104,7 +133,7 @@
          anchorBottom = "0";
          anchorLeft = "1";
          anchorRight = "0";
-         position = "135 30";
+         position = "135 54";
          extent = "201 18";
          minExtent = "8 2";
          horizSizing = "width";
@@ -128,7 +157,7 @@
          groupNum = "-1";
          buttonType = "PushButton";
          useMouseEvents = "0";
-         position = "343 27";
+         position = "340 51";
          extent = "22 22";
          minExtent = "8 2";
          horizSizing = "left";
@@ -144,33 +173,6 @@
          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 @@
             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 @@
       isContainer = "1";
       canSave = "1";
       canSaveDynamicFields = "0";
+      closeCommand="Canvas.popDialog(AssetBrowser_SelectModule);";
 
       new GuiPopUpMenuCtrlEx() {
          maxPopupHeight = "200";
@@ -95,7 +96,7 @@
          tooltipProfile = "GuiToolTipProfile";
          hovertime = "1000";
          isContainer = "0";
-         class = "SelectPackage_NewAssetModuleBtn";
+         class = "AssetBrowserSelModuleAddBtn";
          canSave = "1";
          canSaveDynamicFields = "0";
       };
@@ -132,7 +133,7 @@
          profile = "ToolsGuiButtonProfile";
          visible = "1";
          active = "1";
-         command = "Canvas.popDialog(AssetBrowser_addModule);";
+         command = "Canvas.popDialog(AssetBrowser_SelectModule);";
          tooltipProfile = "ToolsGuiToolTipProfile";
          hovertime = "1000";
          isContainer = "0";

+ 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();");
 }

+ 10 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript

@@ -36,7 +36,10 @@ function AssetBrowser::initialize(%this)
       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");
@@ -2090,7 +2093,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
       {

+ 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)

+ 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", "", "", "");
 }
 

+ 24 - 1
Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.tscript

@@ -493,6 +493,28 @@ function ESettingsWindow::getAssetEditingSettings(%this)
 {
    ImportAssetWindow::reloadImportOptionConfigs();
    
+   //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);
@@ -506,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");
@@ -516,7 +539,7 @@ 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 @@
                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 @@
                   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 @@
       };
       new GuiIconButtonCtrl() {
          buttonMargin = "4 4";
-         bitmapAsset = "ToolsModule:iconCancel_image";
+         BitmapAsset = "ToolsModule:iconCancel_image";
          iconLocation = "Left";
          sizeIconToButton = "0";
          makeIconSquare = "0";
@@ -136,23 +142,24 @@
          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 @@
          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";
       };
    };

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

@@ -2039,13 +2039,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;
    };

+ 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/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

@@ -1059,7 +1059,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;
 }