浏览代码

Added recursive scanning for utilized assets on any object within the scene, soas to catch objects in simgroups or parented
Disabled initial materialSlot fill-out until logic for looking up assetName from material list name can be done to avoid 'unable to find assetid' spam
Added function to SimGroup to easily acquire child object by index
Some minor cleanup of commented lines in asset browser
Fixed forward/backward navigation arrow behavior in asset browser
Fixed double-click navigation when the AB is in select mode
Fixed erroneous 'could not acquire asset' messages when navigating folders in AB
Added editor setting for UseGroupSnap snap option and integrated it into the UI interface
Removed some duplicate settings from the EditorSettingsWindow

Areloch 5 年之前
父节点
当前提交
0b954459a3

+ 23 - 2
Engine/source/T3D/Scene.cpp

@@ -253,9 +253,9 @@ bool Scene::saveScene(StringTableEntry fileName)
 
    //Next, lets build out our 
    Vector<StringTableEntry> utilizedAssetsList;
-   for (U32 i = 0; i < mPermanentObjects.size(); i++)
+   for (U32 i = 0; i < size(); i++)
    {
-      mPermanentObjects[i]->getUtilizedAssets(&utilizedAssetsList);
+      getUtilizedAssetsFromSceneObject(getObject(i), &utilizedAssetsList);
    }
 
    for (U32 i = 0; i < utilizedAssetsList.size(); i++)
@@ -268,6 +268,27 @@ bool Scene::saveScene(StringTableEntry fileName)
    return saveSuccess;
 }
 
+void Scene::getUtilizedAssetsFromSceneObject(SimObject* object, Vector<StringTableEntry>* usedAssetsList)
+{
+   SceneObject* obj = dynamic_cast<SceneObject*>(object);
+   if(obj)
+      obj->getUtilizedAssets(usedAssetsList);
+
+   SimGroup* group = dynamic_cast<SimGroup*>(object);
+   if (group)
+   {
+      for (U32 c = 0; c < group->size(); c++)
+      {
+         SceneObject* childObj = dynamic_cast<SceneObject*>(group->getObject(c));
+         if (childObj)
+            childObj->getUtilizedAssets(usedAssetsList);
+
+         //Recurse down
+         getUtilizedAssetsFromSceneObject(childObj, usedAssetsList);
+      }
+   }
+}
+
 //
 Vector<SceneObject*> Scene::getObjectsByClass(String className, bool checkSubscenes)
 {

+ 2 - 0
Engine/source/T3D/Scene.h

@@ -77,6 +77,8 @@ public:
    //
    Vector<SceneObject*> getObjectsByClass(String className, bool checkSubscenes);
 
+   void getUtilizedAssetsFromSceneObject(SimObject* object, Vector<StringTableEntry>* usedAssetsList);
+
    template <class T>
    Vector<T*> getObjectsByClass(bool checkSubscenes);
 

+ 3 - 4
Engine/source/T3D/tsStatic.cpp

@@ -511,8 +511,9 @@ bool TSStatic::_createShape()
    }
 
    //Set up the material slot vars for easy manipulation
-   S32 materialCount = mShape->materialList->getMaterialNameList().size(); //mMeshAsset->getMaterialCount();
+   /*S32 materialCount = mShape->materialList->getMaterialNameList().size(); //mMeshAsset->getMaterialCount();
 
+   //Temporarily disabled until fixup of materialName->assetId lookup logic is sorted for easy persistance
    if (isServerObject())
    {
       char matFieldName[128];
@@ -526,15 +527,13 @@ bool TSStatic::_createShape()
 
          setDataField(matFld, NULL, materialname);
       }
-   }
+   }*/
 
    return true;
 }
 
 void TSStatic::onDynamicModified(const char* slotName, const char* newValue)
 {
-   bool isSrv = isServerObject();
-
    if (FindMatch::isMatch("materialslot*", slotName, false))
    {
       if (!getShape())

+ 11 - 0
Engine/source/console/simSet.cpp

@@ -843,6 +843,17 @@ bool SimGroup::processArguments(S32, ConsoleValueRef *argv)
    return true;
 }
 
+
+SimObject* SimGroup::getObject(const S32& index)
+{
+   if (index < 0 || index >= size())
+   {
+      Con::errorf("Set::getObject - index out of range.");
+      return NULL;
+   }
+
+   return (*this)[index];
+}
 //-----------------------------------------------------------------------------
 
 SimObject* SimGroupIterator::operator++()

+ 2 - 0
Engine/source/console/simSet.h

@@ -465,6 +465,8 @@ class SimGroup: public SimSet
 
       virtual bool processArguments( S32 argc, ConsoleValueRef *argv );
 
+      virtual SimObject* getObject(const S32& index);
+
       DECLARE_CONOBJECT( SimGroup );
 };
 

+ 37 - 45
Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs

@@ -290,10 +290,12 @@ function AssetBrowser::showDialog( %this, %AssetTypeFilter, %selectCallback, %ta
    {
       //we're not in selection mode, so just hide the select button
       %this-->SelectButton.setHidden(true);  
+      %this.selectMode = 0;
    }
    else
    {
       %this-->SelectButton.setHidden(false); 
+      %this.selectMode = 1;
    }
 
    AssetBrowser.loadDirectories();
@@ -486,38 +488,15 @@ function AssetBrowser::buildAssetPreview( %this, %asset, %moduleName )
    %previewButton.moduleName = %moduleName;
    %previewButton.assetType = %assetType;
    
-   if(%assetType $= "ShapeAsset")
-   {
-      %previewButton.iconBitmap = "tools/assetBrowser/art/genericAssetIcon";
-      //%previewButton.profile = AssetBrowserPreviewShapeAsset;
-      //%previewButton-->shapeAssetView.setModel(%previewImage);
-      //%previewButton-->shapeAssetView.extent = %previewSize;
-      
-   }
-   else
-   {
-      %previewButton.iconBitmap = %this.previewData.previewImage;
-      //%previewButton-->assetPreviewImage.extent = %previewSize;
-   }
+   %previewButton.iconBitmap = %this.previewData.previewImage;
    
    %previewButton.profile = "AssetBrowserPreview" @ %previewButton.assetType;
-   
-   //%previewButton-->AssetPreviewBorderButton.extent = %previewSize;
-   
-   //%previewButton-->AssetPreviewButton.internalName = %this.previewData.assetName@"Border";
-   //%previewButton-->Button.extent = %previewSize.x + %previewBounds SPC %previewSize.y + 24;
    %previewButton.tooltip = %this.previewData.tooltip;
    %previewButton.Command = "AssetBrowser.updateSelection( $ThisControl.assetName, $ThisControl.moduleName );";
    %previewButton.altCommand = %doubleClickCommand;
-   //%previewButton-->AssetPreviewButton.icon = %this.previewData.previewImage;
    
    %previewButton.text = %this.previewData.assetName;
    %previewButton.text.originalAssetName = %this.previewData.assetName;
-   
-   //%previewButton-->AssetNameLabel.position = 0 SPC %previewSize.y + %previewBounds - 16;
-   //%previewButton-->AssetNameLabel.extent = %previewSize.x + %previewBounds SPC 16;
-   //%previewButton-->AssetNameLabel.text = %this.previewData.assetName;
-   //%previewButton-->AssetNameLabel.originalAssetName = %this.previewData.assetName;
 
    // add to the gui control array
    AssetBrowser-->assetList.add(%previewButton);
@@ -690,14 +669,7 @@ function AssetBrowser::loadDirectories( %this )
 
 function AssetBrowser::updateSelection( %this, %asset, %moduleName )
 {
-   //If we're navigating a folder, just nav to it and be done
-   /*if(isDirectory(%moduleName))
-   {
-      AssetBrowser.navigateTo(%moduleName @ "/" @ %asset);
-      return;
-   }*/
-   
-   %isAssetBorder = 0;
+   /*%isAssetBorder = 0;
    eval("%isAssetBorder = isObject(AssetBrowser-->"@%asset@"Border);");
    if( %isAssetBorder )
    {
@@ -709,14 +681,24 @@ function AssetBrowser::updateSelection( %this, %asset, %moduleName )
    if( %isAssetBorderPrevious )
    {
       eval( "AssetBrowser-->"@%this.prevSelectedMaterialHL@"Border.setStateOn(0);");
-   }
+   }*/
    
-   AssetBrowser.selectedMaterial = %asset;
+   //If we had an existing selected assetDef, clear the reference
+   if(isObject(AssetBrowser.selectedAssetDef))
+      AssetDatabase.releaseAsset(AssetBrowser.selectedAssetDef.getAssetId());
+   
+   //AssetBrowser.selectedMaterial = %asset;
    AssetBrowser.selectedAsset = %moduleName@":"@%asset;
+   
+   //If it's got slashes, it's a path so it's actually a folder item, not an asset
+   if(strstr(%moduleName, "/") != -1)
+      return;
+      
+   //Otherwise, it's an asset so we'll select the definition while we're at it
    AssetBrowser.selectedAssetDef = AssetDatabase.acquireAsset(AssetBrowser.selectedAsset);
    //AssetBrowser.selectedPreviewImagePath = %previewImagePath;
    
-   %this.prevSelectedMaterialHL = %asset;
+   //%this.prevSelectedMaterialHL = %asset;
 }
 
 function AssetBrowser::loadCollectionSets(%this)
@@ -916,7 +898,7 @@ function AssetBrowser::addCreatorClass(%this, %class, %name, %buildfunc)
 //also need to update instances... i guess which is the tricky part....
 function AssetBrowser::showDeleteDialog( %this )
 {
-   %material = AssetBrowser.selectedMaterial;
+   %material = AssetBrowser.selectedAsset;
    %secondFilter = "MaterialFilterMappedArray";
    %secondFilterName = "Mapped";
    
@@ -1891,20 +1873,20 @@ function AssetBrowser::navigateTo(%this, %address, %historyNav)
       %address = strreplace(%address, "/", "");
       
    //Don't bother navigating if it's to the place we already are
-   if(AssetBrowser.dirHandler.currentAddress !$= %address)
+   if(%this.dirHandler.currentAddress !$= %address)
    {
-      AssetBrowser.dirHandler.navigateTo(%address, %historyNav);
+      %this.dirHandler.navigateTo(%address, %historyNav);
          
       //%this.updateNavigationBreadcrumb(%address);
       
-      AssetBrowser.lastValidNavPath = %address;
-      AssetBrowser-->navPath.setText(%address);
+      %this.lastValidNavPath = %address;
+      %this-->navPath.setText(%address);
       
-      %module = AssetBrowser.dirHandler.getModuleFromAddress(%address);
+      %module = %this.dirHandler.getModuleFromAddress(%address);
       if(%module !$= "")
       {
          //legit module, so set it as current target
-         AssetBrowser.SelectedModule = %module.moduleId;
+         %this.SelectedModule = %module.moduleId;
       }
       
       if(%this.hasLooseFilesInDir())
@@ -1927,13 +1909,18 @@ function AssetBrowser::navigateHistoryForward(%this)
    
    %this.updateNavigationBreadcrumb();
    
+   %address = %this.dirHandler.currentAddress;
+   
    %module = AssetBrowser.dirHandler.getModuleFromAddress(%address);
    if(%module !$= "")
    {
       //legit module, so set it as current target
-      AssetBrowser.SelectedModule = %module.moduleId;
+      %this.SelectedModule = %module.moduleId;
    }
    
+   %this.lastValidNavPath = %address;
+   %this-->navPath.setText(%address);
+   
    %this.rebuildAssetArray();
 }
 
@@ -1943,13 +1930,18 @@ function AssetBrowser::navigateHistoryBack(%this)
       
    %this.updateNavigationBreadcrumb();
    
-   %module = AssetBrowser.dirHandler.getModuleFromAddress(%address);
+   %address = %this.dirHandler.currentAddress;
+   
+   %module = %this.dirHandler.getModuleFromAddress(%address);
    if(%module !$= "")
    {
       //legit module, so set it as current target
-      AssetBrowser.SelectedModule = %module.moduleId;
+      %this.SelectedModule = %module.moduleId;
    }
    
+   %this.lastValidNavPath = %address;
+   %this-->navPath.setText(%address);
+   
    %this.rebuildAssetArray();
 }
 

+ 4 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs

@@ -446,7 +446,10 @@ function AssetBrowser::buildMaterialAssetPreview(%this, %assetDef, %previewData)
                                    @ "EditorGui.setEditor(MaterialEditorPlugin); "
                                    @ "AssetBrowser.hideDialog();";*/
                                    
-   %previewData.doubleClickCommand = "AssetBrowser.editAsset(" @ %assetDef @ ");";
+   if(%this.selectMode)
+      %previewData.doubleClickCommand = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+   else
+      %previewData.doubleClickCommand = "AssetBrowser.editAsset( "@%assetDef@" );";
    
    %test = %assetDef.materialDefinitionName.diffuseMapAsset[0];
    

+ 5 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs

@@ -247,7 +247,7 @@ function AssetBrowser::buildShapeAssetPreview(%this, %assetDef, %previewData)
    %previewData.assetName = %assetDef.assetName;
    %previewData.assetPath = %assetDef.fileName;
 
-   %previewData.previewImage = %assetDef.fileName;
+   %previewData.previewImage = "tools/assetBrowser/art/genericAssetIcon";//%assetDef.fileName;
    
    %previewData.assetFriendlyName = %assetDef.assetName;
    %previewData.assetDesc = %assetDef.description;
@@ -256,6 +256,10 @@ function AssetBrowser::buildShapeAssetPreview(%this, %assetDef, %previewData)
                            "Asset Definition ID: " @  %assetDef @ "\n" @ 
                            "Shape File path: " @ %assetDef.getShapeFile();
                            
+   if(%this.selectMode)
+      %previewData.doubleClickCommand = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+   else
+      %previewData.doubleClickCommand = "AssetBrowser.editAsset( "@%assetDef@" );";
 }
 
 function AssetBrowser::onShapeAssetEditorDropped(%this, %assetDef, %position)

+ 5 - 0
Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.cs

@@ -4,6 +4,11 @@ function AssetBrowser::buildSoundAssetPreview(%this, %assetDef, %previewData)
    %previewData.assetPath = %assetDef.soundFilePath;
    //%previewData.doubleClickCommand = "EditorOpenFileInTorsion( "@%previewData.assetPath@", 0 );";
    
+   if(%this.selectMode)
+      %previewData.doubleClickCommand = "AssetBrowser.selectAsset( AssetBrowser.selectedAsset );";
+   else
+      %previewData.doubleClickCommand = "AssetBrowser.editAsset( "@%assetDef@" );";
+   
    %previewData.previewImage = "tools/assetBrowser/art/soundIcon";   
    
    %previewData.assetFriendlyName = %assetDef.assetName;

+ 1 - 1
Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs

@@ -143,7 +143,7 @@ function directoryHandler::navigateTo(%this, %address, %historyNav, %selectionNa
    {
       %this.foreHistoryList.empty();  
       
-      if(%oldAddress !$= "") 
+      if(%this.oldAddress !$= "") 
          %this.prevHistoryList.push_front(%this.oldAddress);
    }
    

+ 1 - 2
Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs

@@ -359,8 +359,6 @@ function ESettingsWindow::getSceneEditorSettings(%this)
    SettingsInspector.startGroup("Misc");
    //SettingsInspector.addSettingsField("WorldEditor/forceLoadDAE", "Force Load DAE", "bool", "");
    SettingsInspector.addSettingsField("WorldEditor/forceLoadDAE", "Force Load DAE", "bool", "");
-   SettingsInspector.addSettingsField("WorldEditor/Tools/dropAtScreenCenterScalar", "Screen Center Scalar", "float", "");
-   SettingsInspector.addSettingsField("WorldEditor/Tools/dropAtScreenCenterMax", "Screen Center Max", "float", "");
    SettingsInspector.endGroup();
    
    SettingsInspector.startGroup("Layout");
@@ -377,6 +375,7 @@ function ESettingsWindow::getSceneEditorSettings(%this)
    SettingsInspector.addSettingsField("WorldEditor/Tools/objectsUseBoxCenter", "Objects Use Box Center", "bool", "1");
    SettingsInspector.addSettingsField("WorldEditor/Tools/dropAtScreenCenterScalar", "Drop at Sceen Center Scalar", "bool", "1");
    SettingsInspector.addSettingsField("WorldEditor/Tools/dropAtScreenCenterMax", "Drop at Screen Center Max Dist.", "float", "100");
+   SettingsInspector.addSettingsField("WorldEditor/Tools/UseGroupCenter", "Use Group Center when snapping", "bool", "0");
    SettingsInspector.endGroup();
    
    SettingsInspector.startGroup("Images");

+ 6 - 1
Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs

@@ -1651,6 +1651,7 @@ function EditorTree::onRightMouseUp( %this, %itemId, %mouse, %obj )
          %popup.item[ 1 ] = "Delete" TAB "" TAB "EWorldEditor.deleteMissionObject(" @ %popup.object @ ");";
          %popup.item[ 2 ] = "Inspect" TAB "" TAB "inspectObject(" @ %popup.object @ ");";
          %popup.item[ 3 ] = "-";
+         %popup.item[ 4 ] = "Add SimGroup" TAB "" TAB "EWorldEditor.addSimGroup( false );";
       }
       else 
       {
@@ -2067,6 +2068,9 @@ function EWorldEditor::syncGui( %this )
    ESnapOptions-->GridSize.setText( EWorldEditor.getGridSize() );
    
    ESnapOptions-->GridSnapButton.setStateOn( %this.getGridSnap() );
+   
+   %this.UseGroupCenter = EditorSettings.value("WorldEditor/Tools/UseGroupCenter");
+   
    ESnapOptions-->GroupSnapButton.setStateOn( %this.UseGroupCenter );
    SnapToBar-->objectGridSnapBtn.setStateOn( %this.getGridSnap() );
    ESnapOptions-->NoSnapButton.setStateOn( !%this.stickToGround && !%this.getSoftSnap() && !%this.getGridSnap() );
@@ -2090,7 +2094,7 @@ function EWorldEditor::syncToolPalette( %this )
 function EWorldEditor::addSimGroup( %this, %groupCurrentSelection )
 {
    %activeSelection = %this.getActiveSelection();
-   if ( %activeSelection.getObjectIndex( getScene(0) ) != -1 )
+   if ( %groupCurrentSelection && %activeSelection.getObjectIndex( getScene(0) ) != -1 )
    {
       toolsMessageBoxOK( "Error", "Cannot add Scene to a new SimGroup" );
       return;
@@ -2324,6 +2328,7 @@ function toggleSnappingOptions( %var )
    else if( %var $= "byGroup" )
    {
 	   EWorldEditor.UseGroupCenter = !EWorldEditor.UseGroupCenter;
+	   EditorSettings.setValue("WorldEditor/Tools/UseGroupCenter", EWorldEditor.UseGroupCenter );
 	   ESnapOptions->GroupSnapButton.setStateOn(EWorldEditor.UseGroupCenter);
    }
    else

+ 1 - 0
Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs

@@ -68,6 +68,7 @@ EditorSettings.setDefaultValue(  "boundingBoxCollision",    "0"               );
 EditorSettings.setDefaultValue(  "objectsUseBoxCenter",     "1"               );
 EditorSettings.setDefaultValue(  "dropAtScreenCenterScalar","1.0"             );
 EditorSettings.setDefaultValue(  "dropAtScreenCenterMax",   "100.0"           );
+EditorSettings.setDefaultValue(  "UseGroupCenter",          "0"               );
 EditorSettings.endGroup();
 
 EditorSettings.beginGroup( "Render" );

+ 1 - 0
Templates/BaseGame/game/tools/worldEditor/scripts/objectSnapOptions.ed.cs

@@ -45,6 +45,7 @@ function ESnapOptions::ToggleVisibility()
    }
    else
    {
+      EWorldEditor.syncGui();
       ESnapOptions.setVisible(true);
       ESnapOptions.selectWindow();
       ESnapOptions.setCollapseGroup(false);