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