From 0b954459a360cfdc2b256ccdd754a20e180d8914 Mon Sep 17 00:00:00 2001 From: Areloch Date: Wed, 2 Sep 2020 01:26:43 -0500 Subject: [PATCH] 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 --- Engine/source/T3D/Scene.cpp | 25 +++++- Engine/source/T3D/Scene.h | 2 + Engine/source/T3D/tsStatic.cpp | 7 +- Engine/source/console/simSet.cpp | 11 +++ Engine/source/console/simSet.h | 2 + .../assetBrowser/scripts/assetBrowser.cs | 82 +++++++++---------- .../scripts/assetTypes/material.cs | 5 +- .../assetBrowser/scripts/assetTypes/shape.cs | 6 +- .../assetBrowser/scripts/assetTypes/sound.cs | 5 ++ .../assetBrowser/scripts/directoryHandling.cs | 2 +- .../game/tools/gui/editorSettingsWindow.ed.cs | 3 +- .../tools/worldEditor/scripts/EditorGui.ed.cs | 7 +- .../worldEditor/scripts/editorPrefs.ed.cs | 1 + .../scripts/objectSnapOptions.ed.cs | 1 + 14 files changed, 102 insertions(+), 57 deletions(-) diff --git a/Engine/source/T3D/Scene.cpp b/Engine/source/T3D/Scene.cpp index f762b160f..d9e1b14c5 100644 --- a/Engine/source/T3D/Scene.cpp +++ b/Engine/source/T3D/Scene.cpp @@ -253,9 +253,9 @@ bool Scene::saveScene(StringTableEntry fileName) //Next, lets build out our Vector 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* usedAssetsList) +{ + SceneObject* obj = dynamic_cast(object); + if(obj) + obj->getUtilizedAssets(usedAssetsList); + + SimGroup* group = dynamic_cast(object); + if (group) + { + for (U32 c = 0; c < group->size(); c++) + { + SceneObject* childObj = dynamic_cast(group->getObject(c)); + if (childObj) + childObj->getUtilizedAssets(usedAssetsList); + + //Recurse down + getUtilizedAssetsFromSceneObject(childObj, usedAssetsList); + } + } +} + // Vector Scene::getObjectsByClass(String className, bool checkSubscenes) { diff --git a/Engine/source/T3D/Scene.h b/Engine/source/T3D/Scene.h index ca2238be6..6e47d1d67 100644 --- a/Engine/source/T3D/Scene.h +++ b/Engine/source/T3D/Scene.h @@ -77,6 +77,8 @@ public: // Vector getObjectsByClass(String className, bool checkSubscenes); + void getUtilizedAssetsFromSceneObject(SimObject* object, Vector* usedAssetsList); + template Vector getObjectsByClass(bool checkSubscenes); diff --git a/Engine/source/T3D/tsStatic.cpp b/Engine/source/T3D/tsStatic.cpp index 3689a12b7..d27f0b028 100644 --- a/Engine/source/T3D/tsStatic.cpp +++ b/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()) diff --git a/Engine/source/console/simSet.cpp b/Engine/source/console/simSet.cpp index 9b9b6ca67..67d22b5fd 100644 --- a/Engine/source/console/simSet.cpp +++ b/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++() diff --git a/Engine/source/console/simSet.h b/Engine/source/console/simSet.h index 013b1f807..ed062f7da 100644 --- a/Engine/source/console/simSet.h +++ b/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 ); }; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs index a081edb08..a9c73b8dd 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.cs +++ b/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(); } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs index cfc890133..ebb9b9c88 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.cs +++ b/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]; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs index 98625bb2b..1384ee550 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.cs +++ b/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) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.cs index a432bd980..7c11680fb 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.cs +++ b/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; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs b/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs index 642c9827d..d16fecd04 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/directoryHandling.cs +++ b/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); } diff --git a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs b/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs index e4429a4e6..825aa17c1 100644 --- a/Templates/BaseGame/game/tools/gui/editorSettingsWindow.ed.cs +++ b/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"); diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs b/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs index 995e8a106..3d8cf6a09 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.cs +++ b/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 diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs b/Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs index bf1e1253c..990ebbf88 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/editorPrefs.ed.cs +++ b/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" ); diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/objectSnapOptions.ed.cs b/Templates/BaseGame/game/tools/worldEditor/scripts/objectSnapOptions.ed.cs index 33c231e53..626cf28d1 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/objectSnapOptions.ed.cs +++ b/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);