From dff83182e2da7a5655ee3e7b0c774117303fd5e6 Mon Sep 17 00:00:00 2001 From: JeffR Date: Sun, 27 Mar 2022 03:05:48 -0500 Subject: [PATCH] Added sanity check to ensure that the requested file to be scaled via saveScaledImage actually exists Shifts integration of other modules with the OptionsMenu so other modules can inject their own options categories to a callOnModules hook Updated ExampleModule to use new options menu integration angle to show example option Deleted unneeded dropdown_textEdit_image asset def from baseUI Fixed incorrect internal values for the terrainIcon_image asset def that made it present as a redundant terrain material asset Cleaned up old, bad loadFilters calls and replaced them with the proper refresh() calls. Removed old, bad calls for jumping through the asset browser's tree from when it was still hardcoded organization, which cuts down a lot of error spam Cleaned up some of the asset type's preview image assignment code to be more reliable Made terrain materials now use a similar preview proxy shape as regular materials Fixed erroneous duplicate GuiInspectorTypeShapeAssetPtr::onControlDropped, which was breaking drag-n-drop actions of shapeAssets into inspector fields Added proper logic for drag-n-drop actions of imageAssets into inspector fields Add sanity check after creating new asset to avoid redundant attempts at initialization of the new asset Fixed ConvexShape Editor tooling so you can now use the UI to apply the selected material to the selected surface Added tools menu to the menubar with the Project Importer entry so the PI can be launched from either tool Implemented ability to drag-n-drop imageAssets onto MaterialEditor map fields and have it work Implemented ability to drag-n-drop imageAssets onto TerrainMaterial Editor map fields and have it work Made the TerrainMaterial editor dialogue have a non-modal background so you can interact with the editor as normal while it's up Add sanity check to avoid attempting to mark EditorTree items if we couldn't find it's id renamed BaseMap references in terrain material editor to diffuseMap for consistency --- Engine/source/gfx/bitmap/gBitmap.cpp | 5 ++ .../worldEditor/guiConvexShapeEditorCtrl.cpp | 2 +- .../data/ExampleModule/ExampleModule.tscript | 11 ++- .../game/data/UI/guis/optionsMenu.tscript | 7 +- .../images/dropdown_textEdit_image.asset.taml | 8 -- .../art/terrainIcon_image.asset.taml | 4 +- .../assetBrowser/scripts/assetBrowser.tscript | 8 +- .../scripts/assetTypes/component.tscript | 7 +- .../scripts/assetTypes/cubemap.tscript | 7 +- .../scripts/assetTypes/gameObject.tscript | 13 +-- .../scripts/assetTypes/gui.tscript | 7 +- .../scripts/assetTypes/image.tscript | 19 ++++- .../scripts/assetTypes/level.tscript | 5 -- .../scripts/assetTypes/material.tscript | 23 +++--- .../scripts/assetTypes/shape.tscript | 17 ++-- .../scripts/assetTypes/sound.tscript | 2 +- .../scripts/assetTypes/stateMachine.tscript | 20 +---- .../assetTypes/terrainMaterial.tscript | 74 ++++++++++++++++- .../assetBrowser/scripts/editAsset.tscript | 4 +- .../assetBrowser/scripts/newAsset.tscript | 13 +-- .../convexEditor/convexEditorGui.tscript | 2 +- .../scripts/guiEditorCanvas.ed.tscript | 9 ++ .../gui/guiMaterialPropertiesWindow.ed.gui | 13 +++ .../scripts/materialEditor.ed.tscript | 82 ++++++++++++++++++- .../gui/guiTerrainMaterialDlg.ed.gui | 12 +-- .../worldEditor/scripts/EditorGui.ed.tscript | 6 +- .../interfaces/terrainMaterialDlg.ed.tscript | 58 +++++++++++-- 27 files changed, 311 insertions(+), 127 deletions(-) delete mode 100644 Templates/BaseGame/game/data/UI/images/dropdown_textEdit_image.asset.taml diff --git a/Engine/source/gfx/bitmap/gBitmap.cpp b/Engine/source/gfx/bitmap/gBitmap.cpp index ebd3741b1..21e1351f8 100644 --- a/Engine/source/gfx/bitmap/gBitmap.cpp +++ b/Engine/source/gfx/bitmap/gBitmap.cpp @@ -1373,6 +1373,11 @@ DefineEngineFunction(saveScaledImage, bool, (const char* bitmapSource, const cha return false; } + if (!Platform::isFile(bitmapSource)) + { + return false; + } + //First, gotta check the extension, as we have some extra work to do if it's //a DDS file const char* ret = dStrrchr(bitmapSource, '.'); diff --git a/Engine/source/gui/worldEditor/guiConvexShapeEditorCtrl.cpp b/Engine/source/gui/worldEditor/guiConvexShapeEditorCtrl.cpp index 9350f39e0..ae1b90df8 100644 --- a/Engine/source/gui/worldEditor/guiConvexShapeEditorCtrl.cpp +++ b/Engine/source/gui/worldEditor/guiConvexShapeEditorCtrl.cpp @@ -204,7 +204,7 @@ void GuiConvexEditorCtrl::setVisible( bool val ) mConvexHL = NULL; mFaceHL = -1; - setSelection( NULL, -1 ); + setSelection( NULL, -1 ); WorldEditor *wedit; if ( Sim::findObject( "EWorldEditor", wedit ) ) diff --git a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript index 0f540c0d8..137067959 100644 --- a/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript +++ b/Templates/BaseGame/game/data/ExampleModule/ExampleModule.tscript @@ -81,7 +81,6 @@ function ExampleModule::initClient(%this) exec(%prefPath @ "/keybinds." @ $TorqueScriptFileExtension); %this.queueExec("./scripts/inputCommands"); - addOptionsMenuCategory("Example Options", "testExampleOptions();"); } //This is called when a game session client successfuly connects to a game server. @@ -108,7 +107,17 @@ function ExampleModule::onDestroyClientConnection(%this) ExampleMoveMap.pop(); } +function ExampleModule::populateOptionsMenuCategories(%this) +{ + addOptionsMenuCategory("Example Options", "testExampleOptions();"); +} + function testExampleOptions() { + OptionsMenuSettingsList.clear(); + + OptionName.setText(""); + OptionDescription.setText(""); + addListOption("Test Option", "This is a test option", $testOptionValue, "OptionA\tOptionB"); } \ No newline at end of file diff --git a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript index 23a09236e..7fb2cd43d 100644 --- a/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript +++ b/Templates/BaseGame/game/data/UI/guis/optionsMenu.tscript @@ -63,6 +63,8 @@ function OptionsMenu::onAdd(%this) addOptionsMenuCategory("Audio", "populateAudioSettingsList();"); addOptionsMenuCategory("Keyboard & Mouse", "populateKeyboardMouseSettingsList();"); addOptionsMenuCategory("Gamepad", "populateGamepadSettingsList();"); + + callOnModules("populateOptionsMenuCategories", "Game"); } function OptionsMenuSettingsList::onAdd(%this) @@ -900,7 +902,10 @@ function OptionsMenu::onKeybindChanged(%this, %actionMap, %keybind) // function addOptionsMenuCategory(%categoryName, %selectCallback) { - OptionsMenu.optionsCategories.add(%categoryName, %selectCallback); + //Don't add duplicates! + %index = OptionsMenu.optionsCategories.getIndexFromKey(%categoryName); + if(%index == -1) + OptionsMenu.optionsCategories.add(%categoryName, %selectCallback); } function removeOptionsMenuCategory(%categoryName) diff --git a/Templates/BaseGame/game/data/UI/images/dropdown_textEdit_image.asset.taml b/Templates/BaseGame/game/data/UI/images/dropdown_textEdit_image.asset.taml deleted file mode 100644 index 63455e9dd..000000000 --- a/Templates/BaseGame/game/data/UI/images/dropdown_textEdit_image.asset.taml +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/Templates/BaseGame/game/tools/assetBrowser/art/terrainIcon_image.asset.taml b/Templates/BaseGame/game/tools/assetBrowser/art/terrainIcon_image.asset.taml index 4a6ef4a57..5b7fffc0c 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/art/terrainIcon_image.asset.taml +++ b/Templates/BaseGame/game/tools/assetBrowser/art/terrainIcon_image.asset.taml @@ -1,8 +1,8 @@ diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript index 7d0c1e3da..c99602084 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript @@ -915,13 +915,7 @@ function AssetBrowser::deleteMaterial( %this, %materialName, %secondFilter, %sec AssetBrowserPerMan.saveDirty(); } - AssetBrowser.preloadFilter(); -} - -function AssetBrowser::thumbnailCountUpdate(%this) -{ - $Pref::AssetBrowser::ThumbnailCountIndex = AssetBrowser-->materialPreviewCountPopup.getSelected(); - AssetBrowser.LoadFilter( AssetBrowser.currentFilter, AssetBrowser.currentStaticFilter ); + AssetBrowser.refresh(); } function AssetBrowser::toggleTagFilterPopup(%this) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.tscript index 6488b319f..d443157ea 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/component.tscript @@ -54,12 +54,7 @@ function AssetBrowser::createComponentAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "ComponentAsset"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.tscript index 78076654b..b050d37cd 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/cubemap.tscript @@ -28,12 +28,7 @@ function AssetBrowser::createCubemapAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "CubemapAsset"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gameObject.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gameObject.tscript index bdf079ad0..c25eda8f4 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gameObject.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gameObject.tscript @@ -73,21 +73,10 @@ function AssetBrowser::duplicateGameObjectAsset(%this, %assetDef, %targetModule) AssetDatabase.addDeclaredAsset(%moduleDef, %tamlPath); //Refresh the browser - AssetBrowser.loadFilters(); - - //Ensure our context is set - %treeItemId = AssetBrowserFilterTree.findItemByName(%targetModule); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "GameObjectAsset"); - - AssetBrowserFilterTree.selectItem(%smItem); + AssetBrowser.refresh(); //Rename it for convenience AssetBrowser.performRenameAsset(%assetName, "New" @ %assetName); - - //Expand and refresh the target module - AssetBrowserFilterTree.expandItem(%treeItemId,true); - - AssetBrowserFilterTree.buildVisibleTree(); } //not used diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.tscript index 4660d56fc..dfebccb47 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/gui.tscript @@ -79,12 +79,7 @@ function AssetBrowser::createGUIAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "GUIs"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript index f39d35349..0dbebd39b 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript @@ -233,13 +233,17 @@ function AssetBrowser::buildImageAssetPreview(%this, %assetDef, %previewData) //Revalidate. If it didn't work, just use the default placeholder one if(!isFile(%previewFilePath)) - %previewAssetName = "ToolsModule:genericAssetIcon_image"; + { + %previewData.previewImage = "ToolsModule:genericAssetIcon_image"; + } + else + { + %previewData.previewImage = %previewAssetName; + } %previewData.assetName = %assetDef.assetName; %previewData.assetPath = %assetDef.scriptFile; - %previewData.previewImage = %previewAssetName; - %previewData.assetFriendlyName = %assetDef.assetName; %previewData.assetDesc = %assetDef.description; @@ -324,7 +328,14 @@ function GuiInspectorTypeImageAssetPtr::onControlDropped( %this, %payload, %posi if(%assetType $= "ImageAsset") { - echo("DROPPED A IMAGE ON AN IMAGE ASSET COMPONENT FIELD!"); + %module = %payload.moduleName; + %asset = %payload.assetName; + + %oldValue = %this.targetObject.bitmapAsset; + %arrayIndex = ""; + + %targetObject = %this.targetObject; + %targetObject.bitmapAsset = %module @ ":" @ %asset; } EWorldEditor.isDirty = true; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.tscript index e46e891c7..23be49e9f 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/level.tscript @@ -61,11 +61,6 @@ function AssetBrowser::createLevelAsset(%this) AssetBrowser.refresh(); - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Levels"); - - AssetBrowserFilterTree.onSelect(%smItem); - return %tamlpath; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript index 880ff115e..fab16eb90 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript @@ -24,12 +24,7 @@ function AssetBrowser::createMaterialAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "Materials"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } @@ -428,7 +423,7 @@ function AssetBrowser::importMaterialAsset(%this, %assetItem) function AssetBrowser::buildMaterialAssetPreview(%this, %assetDef, %previewData) { - %module = %this.dirHandler.getModuleFromAddress(makeRelativePath(filePath(%assetDef.getScriptPath()))); + %module = %this.dirHandler.getModuleFromAddress(makeRelativePath(filePath(AssetDatabase.getAssetFilePath(%assetDef.getAssetId())))); %previewPath = "tools/resources/previewCache/" @ %module.moduleId @ "/"; if(!IsDirectory(%previewPath)) @@ -460,8 +455,8 @@ function AssetBrowser::buildMaterialAssetPreview(%this, %assetDef, %previewData) { displayEditorLoadingGui("Generating Material Asset Preview..."); - if(isObject(%assetDef.materialDefinitionName)) - { + if(isObject(%assetDef.materialDefinitionName)) + { %previewShapeDef = AssetDatabase.acquireAsset("ToolsModule:previewSphereShape"); %generatedFilePath = %previewShapeDef.generateCachedPreviewImage(256, %assetDef.materialDefinitionName); @@ -488,13 +483,17 @@ function AssetBrowser::buildMaterialAssetPreview(%this, %assetDef, %previewData) //Revalidate. If it didn't work, just use the default placeholder one if(!isFile(%previewFilePath)) - %previewAssetName = "ToolsModule:materialIcon_image"; + { + %previewData.previewImage = "ToolsModule:materialIcon_image"; + } + else + { + %previewData.previewImage = "ToolsModule:" @ %previewAssetName; + } %previewData.assetName = %assetDef.assetName; %previewData.assetPath = %assetDef.scriptFile; - %previewData.previewImage = "ToolsModule:" @ %previewAssetName;//%assetDef.fileName; - %previewData.assetFriendlyName = %assetDef.assetName; %previewData.assetDesc = %assetDef.description; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript index 7ce0acb1b..15c48079b 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript @@ -26,12 +26,7 @@ function AssetBrowser::createShapeAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "ShapeAsset"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } @@ -302,12 +297,16 @@ function AssetBrowser::buildShapeAssetPreview(%this, %assetDef, %previewData) //Revalidate. If it didn't work, just use the default placeholder one if(!isFile(%previewFilePath)) - %previewAssetName = "ToolsModule:genericAssetIcon_image"; + { + %previewData.previewImage = "ToolsModule:genericAssetIcon_image"; + } + else + { + %previewData.previewImage = "ToolsModule:" @ %previewAssetName; + } %previewData.assetName = %assetDef.assetName; %previewData.assetPath = %assetDef.fileName; - - %previewData.previewImage = "ToolsModule:" @ %previewAssetName;//%assetDef.fileName; %previewData.assetFriendlyName = %assetDef.assetName; %previewData.assetDesc = %assetDef.description; diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript index 04ab8d508..8cc63bdf4 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/sound.tscript @@ -75,7 +75,7 @@ function AssetBrowser::onSoundAssetEditorDropped(%this, %assetDef, %position) } -function GuiInspectorTypeShapeAssetPtr::onControlDropped( %this, %payload, %position ) +function GuiInspectorTypeSoundAssetPtr::onControlDropped( %this, %payload, %position ) { Canvas.popDialog(EditorDragAndDropLayer); diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/stateMachine.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/stateMachine.tscript index dff204024..0e9188a97 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/stateMachine.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/stateMachine.tscript @@ -47,12 +47,7 @@ function AssetBrowser::createStateMachineAsset(%this) %moduleDef = ModuleDatabase.findModule(%moduleName, 1); AssetDatabase.addDeclaredAsset(%moduleDef, %tamlpath); - AssetBrowser.loadFilters(); - - %treeItemId = AssetBrowserFilterTree.findItemByName(%moduleName); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "StateMachines"); - - AssetBrowserFilterTree.onSelect(%smItem); + AssetBrowser.refresh(); return %tamlpath; } @@ -123,21 +118,10 @@ function AssetBrowser::duplicateStateMachineAsset(%this, %assetDef) AssetDatabase.addDeclaredAsset(%moduleDef, %tamlPath); //Refresh the browser - AssetBrowser.loadFilters(); - - //Ensure our context is set - %treeItemId = AssetBrowserFilterTree.findItemByName(%targetModule); - %smItem = AssetBrowserFilterTree.findChildItemByName(%treeItemId, "StateMachineAsset"); - - AssetBrowserFilterTree.selectItem(%smItem); + AssetBrowser.refresh(); //Rename it for convenience AssetBrowser.performRenameAsset(%assetName, "New" @ %assetName); - - //Expand and refresh the target module - AssetBrowserFilterTree.expandItem(%treeItemId,true); - - AssetBrowserFilterTree.buildVisibleTree(); } function AssetBrowser::renameGameObjectAsset(%this, %assetDef, %newAssetId, %originalName, %newName) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.tscript index ad1212e11..8fc9e21f9 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/terrainMaterial.tscript @@ -91,15 +91,85 @@ function AssetBrowser::deleteTerrainMaterialAsset(%this, %assetDef) function AssetBrowser::buildTerrainMaterialAssetPreview(%this, %assetDef, %previewData) { + %module = %this.dirHandler.getModuleFromAddress(makeRelativePath(filePath(AssetDatabase.getAssetFilePath(%assetDef.getAssetId())))); + %previewPath = "tools/resources/previewCache/" @ %module.moduleId @ "/"; + + if(!IsDirectory(%previewPath)) + { + %this.dirHandler.createFolder(%previewPath); + } + + %generatePreview = false; + + %previewFilePath = %previewPath @ %assetDef.assetName @ "_Preview.dds"; + if(!isFile(%previewFilePath)) + { + %generatePreview = true; + } + else + { + if(isObject(%assetDef.materialDefinitionName)) + { + if(compareFileTimes(%assetDef.materialDefinitionName.getDiffuseMap(), %previewFilePath) == 1 || + compareFileTimes(%assetDef.materialDefinitionName.getFilename(), %previewFilePath) == 1) + %generatePreview = true; + } + } + + %previewAssetName = %module.moduleId @ "_" @ %assetDef.assetName @ "_PreviewImage"; + + if(%generatePreview) + { + displayEditorLoadingGui("Generating Material Asset Preview..."); + + if(isObject(%assetDef.materialDefinitionName)) + { + %previewShapeDef = AssetDatabase.acquireAsset("ToolsModule:previewSphereShape"); + %generatedFilePath = %previewShapeDef.generateCachedPreviewImage(256, %assetDef.materialDefinitionName); + + pathCopy(%generatedFilePath, %previewFilePath); + fileDelete(%generatedFilePath); + + %previewAsset = new ImageAsset() + { + assetName = %previewAssetName; + versionId = 1; + imageFile = fileName(%previewFilePath); + }; + + %previewImgAssetPath = %previewPath @ %previewAsset.assetName @ ".asset.taml"; + %assetImportSuccessful = TAMLWrite(%previewAsset, %previewImgAssetPath); + + %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1); + + %success = AssetDatabase.addDeclaredAsset(%toolsModuleDef, %previewImgAssetPath); + } + + hideEditorLoadingGui(); + } + + //Revalidate. If it didn't work, just use the default placeholder one + if(!isFile(%previewFilePath)) + { + %previewData.previewImage = "ToolsModule:terrainMaterialIcon_image"; + } + else + { + %previewData.previewImage = "ToolsModule:" @ %previewAssetName; + } + %previewData.assetName = %assetDef.assetName; %previewData.assetPath = ""; %previewData.doubleClickCommand = ""; - %previewData.previewImage = "ToolsModule:terrainMaterialIcon_image"; - %previewData.assetFriendlyName = %assetDef.gameObjectName; %previewData.assetDesc = %assetDef.description; %previewData.tooltip = %assetDef.gameObjectName; + + %previewData.tooltip = "Asset Name: " @ %assetDef.assetName @ + "\nAsset Type: Terrain Material Asset" @ + "\nAsset Definition ID: " @ %assetDef @ + "\nDefinition Path: " @ %assetDef.getScriptPath(); } function GuiInspectorTypeTerrainMaterialAssetPtr::onClick( %this, %fieldName ) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.tscript index 4b71d7660..2d088f27a 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/editAsset.tscript @@ -163,7 +163,7 @@ function AssetBrowser::performRenameAsset(%this, %originalAssetName, %newName) %ModuleItem = AssetBrowser-->filterTree.findItemByName(%moduleName); // TODO is this correct? - %assetType = %ModuleItem.getClassName(); + /*%assetType = %ModuleItem.getClassName(); %assetTypeId = AssetBrowser-->filterTree.findChildItemByName(%ModuleItem, %assetType); @@ -172,7 +172,7 @@ function AssetBrowser::performRenameAsset(%this, %originalAssetName, %newName) %selectedItem = AssetBrowser-->filterTree.getSelectedItem(); AssetBrowser-->filterTree.scrollVisibleByObjectId(%selectedItem); - AssetBrowser-->filterTree.buildVisibleTree(); + AssetBrowser-->filterTree.buildVisibleTree();*/ } function renameAssetFile(%assetDef, %newName) diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript index f22c6f73d..f2ea27660 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/newAsset.tscript @@ -182,11 +182,14 @@ function CreateNewAsset() Canvas.popDialog(AssetBrowser_newAsset); //Load it - %moduleDef = ModuleDatabase.findModule(%moduleName,1); - AssetDatabase.addDeclaredAsset(%moduleDef, %assetFilePath); - //For utilities' sake, we'll acquire it immediately so it can be utilized - //without delay if it's got any script/dependencies stuff - AssetDatabase.acquireAsset("\"" @ %moduleName @ ":" @ %assetName @ "\""); + if(!AssetDatabase.isDeclaredAsset(%moduleName @ ":" @ %assetName)) + { + %moduleDef = ModuleDatabase.findModule(%moduleName,1); + AssetDatabase.addDeclaredAsset(%moduleDef, %assetFilePath); + //For utilities' sake, we'll acquire it immediately so it can be utilized + //without delay if it's got any script/dependencies stuff + AssetDatabase.acquireAsset("\"" @ %moduleName @ ":" @ %assetName @ "\""); + } if(AssetBrowser_newAsset.callbackFunc !$= "") { diff --git a/Templates/BaseGame/game/tools/convexEditor/convexEditorGui.tscript b/Templates/BaseGame/game/tools/convexEditor/convexEditorGui.tscript index 09215601a..0baf0eb70 100644 --- a/Templates/BaseGame/game/tools/convexEditor/convexEditorGui.tscript +++ b/Templates/BaseGame/game/tools/convexEditor/convexEditorGui.tscript @@ -179,7 +179,7 @@ function ConvexEditorMaterialBtn::gotMaterialName(%this, %name) ConvexEditorOptionsWindow-->matPreviewBtn.setBitmap(getAssetPreviewImage(%diffusemap)); - ConvexEditorOptionsWindow.activeMaterial = %materialAsset.materialDefinitionName; + ConvexEditorOptionsWindow.activeMaterial = %materialAsset.getAssetId(); } function ConvexEditorMaterialApplyBtn::onClick(%this) diff --git a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript index f62fe12ea..59df87bd9 100644 --- a/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript +++ b/Templates/BaseGame/game/tools/guiEditor/scripts/guiEditorCanvas.ed.tscript @@ -186,6 +186,15 @@ function GuiEditCanvas::onCreateMenu(%this) item[8] = "Show Guides" TAB "" TAB "GuiEditor.toggleDrawGuides();"; item[9] = "Clear Guides" TAB "" TAB "GuiEditor.clearGuides();"; }; + + new PopupMenu() + { + superClass = "MenuBuilder"; + barTitle = "Tools"; + internalName = "ToolsMenu"; + + item[0] = "Project Importer" TAB "" TAB "ProjectImporter::beginProjectImport();"; + }; new PopupMenu() { diff --git a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui index 0f71d8757..d1d46b2b1 100644 --- a/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui +++ b/Templates/BaseGame/game/tools/materialEditor/gui/guiMaterialPropertiesWindow.ed.gui @@ -260,6 +260,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 21"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorDiffuseMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -412,6 +413,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 79"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorNormalMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -764,6 +766,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 364"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorORMConfigMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -985,6 +988,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + className = "materialEditorRoughnessMapContainer"; new GuiBitmapCtrl() { bitmapAsset = "ToolsModule:unknownImage_image"; @@ -1221,6 +1225,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + className = "materialEditorAOMapContainer"; new GuiBitmapCtrl() { bitmapAsset = "ToolsModule:unknownImage_image"; @@ -1457,6 +1462,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + className = "materialEditorMetalMapContainer"; new GuiBitmapCtrl() { bitmapAsset = "ToolsModule:unknownImage_image"; @@ -1710,6 +1716,8 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { isContainer = "1"; canSave = "1"; canSaveDynamicFields = "0"; + className = "materialEditorGlowMapContainer"; + new GuiBitmapCtrl() { bitmapAsset = "ToolsModule:unknownImage_image"; wrap = "0"; @@ -1945,6 +1953,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 193"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorDetailMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -2090,6 +2099,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 136"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorDetailNormalMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -2235,6 +2245,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 136"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorOverlayMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -2361,6 +2372,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 250"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorLightMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; @@ -2487,6 +2499,7 @@ $guiContent = new GuiControl(MaterialEditorGui,EditorGuiGroup) { position = "6 307"; Extent = "185 52"; HorizSizing = "width"; + className = "materialEditorToneMapContainer"; new GuiBitmapCtrl() { canSaveDynamicFields = "0"; diff --git a/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript b/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript index d157c817a..de003fdc8 100644 --- a/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript +++ b/Templates/BaseGame/game/tools/materialEditor/scripts/materialEditor.ed.tscript @@ -1174,8 +1174,8 @@ function MaterialEditorGui::updateTextureMap( %this, %type, %action ) function MaterialEditorGui::doUpdateTextureMap( %this, %assetId ) { if(%assetId !$= "") -{ - %layer = MaterialEditorGui.currentLayer; + { + %layer = MaterialEditorGui.currentLayer; %type = %this.updatingTextureType; @@ -2419,4 +2419,82 @@ function MaterialEditorGui::swapMaterial(%this) function MaterialEditorGui::doSwapMaterial(%this, %materialAsset) { MaterialEditorGui.showMaterialChangeSaveDialog(%materialAsset); +} + +// +// +function matEdDragNDropMapAssignment(%type, %payload) +{ + %assetType = %payload.assetType; + if(%assetType !$= "ImageAsset") + return; + + %module = %payload.moduleName; + %assetName = %payload.assetName; + %assetId = %module @ ":" @ %assetName; + + MaterialEditorGui.updatingTextureType = %type; + MaterialEditorGui.guiSync( materialEd_previewMaterial ); + + MaterialEditorGui.doUpdateTextureMap( %assetId ); +} + +function materialEditorDiffuseMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Diffuse", %payload); +} + +function materialEditorNormalMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Normal", %payload); +} + +function materialEditorORMConfigMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("ORMConfig", %payload); +} + +function materialEditorRoughnessMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Roughness", %payload); +} + +function materialEditorAOMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("AO", %payload); +} + +function materialEditorMetalMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Metal", %payload); +} + +function materialEditorGlowMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Glow", %payload); +} + +function materialEditorDetailMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Detail", %payload); +} + +function materialEditorDetailNormalMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("DetailNormal", %payload); +} + +function materialEditorOverlayMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Overlay", %payload); +} + +function materialEditorLightMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Light", %payload); +} + +function materialEditorToneMapContainer::onControlDropped( %this, %payload, %position ) +{ + matEdDragNDropMapAssignment("Tone", %payload); } \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui b/Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui index 1a7d1caf1..4eef5308f 100644 --- a/Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui +++ b/Templates/BaseGame/game/tools/worldEditor/gui/guiTerrainMaterialDlg.ed.gui @@ -5,7 +5,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { minExtent = "8 2"; horizSizing = "right"; vertSizing = "bottom"; - profile = "ToolsGuiDefaultProfile"; + profile = "ToolsGuiDefaultNonModalProfile"; visible = "1"; active = "1"; tooltipProfile = "ToolsGuiToolTipProfile"; @@ -256,7 +256,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { canSave = "1"; canSaveDynamicFields = "0"; }; - new GuiContainer(BaseMapContainer) { + new GuiContainer(DiffuseMapContainer) { margin = "0 0 0 0"; padding = "0 0 0 0"; anchorTop = "1"; @@ -312,7 +312,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { tooltipProfile = "ToolsGuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; - internalName = "texBaseMap"; + internalName = "texDiffuseMap"; canSave = "1"; canSaveDynamicFields = "0"; }; @@ -334,7 +334,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; - command = "TerrainMaterialDlg.updateTextureMap(\"BaseMap\");"; + command = "TerrainMaterialDlg.updateTextureMap(\"DiffuseMap\");"; tooltipProfile = "ToolsGuiDefaultProfile"; tooltip = "Change the Active Diffuse Map for this layer"; hovertime = "1000"; @@ -402,7 +402,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { profile = "ToolsGuiButtonProfile"; visible = "1"; active = "1"; - command = "TerrainMaterialDlg.updateTextureMap(\"BaseMap\");"; + command = "TerrainMaterialDlg.updateTextureMap(\"DiffuseMap\");"; tooltipProfile = "ToolsGuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; @@ -427,7 +427,7 @@ $guiContent = new GuiControl(TerrainMaterialDlg,EditorGuiGroup) { profile = "ToolsGuiDefaultProfile"; visible = "1"; active = "1"; - command = "TerrainMaterialDlg.clearTextureMap(\"BaseMap\");"; + command = "TerrainMaterialDlg.clearTextureMap(\"DiffuseMap\");"; tooltipProfile = "ToolsGuiToolTipProfile"; hovertime = "1000"; isContainer = "0"; diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript b/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript index ef1b9292b..54c7d22b4 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/EditorGui.ed.tscript @@ -2313,11 +2313,13 @@ function EWorldEditor::SetActiveScene(%this, %sceneObj) { $ActiveEditingScene.isEditing = false; %itemId = EditorTree.findItemByObjectId($ActiveScene); - EditorTree.markItem(%itemId); + if(%itemId != -1) + EditorTree.markItem(%itemId); } %itemId = EditorTree.findItemByObjectId(%sceneObj); - EditorTree.markItem(%itemId); + if(%itemId != -1) + EditorTree.markItem(%itemId); $ActiveEditingScene = %sceneObj; $ActiveEditingScene.isEditing = true; diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript b/Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript index b49cef39a..fd1063618 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript +++ b/Templates/BaseGame/game/tools/worldEditor/scripts/interfaces/terrainMaterialDlg.ed.tscript @@ -269,27 +269,27 @@ function TerrainMaterialDlg::changeTerrainMatMapAsset(%this) %imgAsset = AssetBrowser.selectedAsset; if(%imgAsset !$= "") -{ + { %targetMap.asset = %imgAsset; %image = %imgAsset; if(%this.updateTargetMap $= "DetailMap") - { + { //show the supplemental maps NormalMapContainer.callOnChildren("setActive", true); ORMMapContainer.callOnChildren("setActive", true); MacroMapContainer.callOnChildren("setActive", true); + } } -} - else + else { %image = $TerrainMaterialEditor::emptyMaterialImage; } %targetMap.setBitmap( getAssetPreviewImage(%image) ); - %targetMapName = %targetMap @ "AssetId"; - %targetMapName.setText(%imgAsset); + %targetMapNameText = %this.findObjectByInternalName(%this.updateTargetMap @ "AssetId", true); + %targetMapNameText.setText(%imgAsset); TerrainMaterialDlg.matDirty = true; } @@ -412,7 +412,7 @@ function TerrainMaterialDlg::setActiveMaterial( %this, %mat ) %imgPath = %mat.getDiffuseMap(); %imgPathText = %imgPath !$= "" && %imgPath !$= $TerrainMaterialEditor::emptyMaterialImage ? %mat.getDiffuseMapAsset() : "None"; %this-->diffuseMapAssetId.setText( %imgPathText ); - %this-->texBaseMap.setBitmap( getAssetPreviewImage(%imgPath) ); + %this-->texDiffuseMap.setBitmap( getAssetPreviewImage(%imgPath) ); // %imgPath = %mat.getNormalMap(); @@ -487,7 +487,7 @@ function TerrainMaterialDlg::saveDirtyMaterial( %this, %mat ) //--- - %newDiffuse = %this-->texBaseMap.getBitmap(); + %newDiffuse = %this-->texDiffuseMap.getBitmap(); if(%newDiffuse $= $TerrainMaterialEditor::emptyMaterialImage || %newDiffuse $= %blankBitmap) %newDiffuse = ""; @@ -741,3 +741,45 @@ function TerrainMaterialDlgBlendHeightContrastTextEdit::onValidate(%this) TerrainMaterialDlg.activeMat.blendHeightContrast = %this.getText(); TerrainMaterialDlg.matDirty = true; } + +// +// +function terrMatEdDragNDropMapAssignment(%mapName, %payload) +{ + %assetType = %payload.assetType; + if(%assetType !$= "ImageAsset") + return; + + %module = %payload.moduleName; + %assetName = %payload.assetName; + %assetId = %module @ ":" @ %assetName; + + TerrainMaterialDlg.updateTargetMap = %mapName; + AssetBrowser.selectedAsset = %assetId; + TerrainMaterialDlg.changeTerrainMatMapAsset(); +} + +function DiffuseMapContainer::onControlDropped( %this, %payload, %position ) +{ + terrMatEdDragNDropMapAssignment("DiffuseMap", %payload); +} + +function DetailMapContainer::onControlDropped( %this, %payload, %position ) +{ + terrMatEdDragNDropMapAssignment("DetailMap", %payload); +} + +function NormalMapContainer::onControlDropped( %this, %payload, %position ) +{ + terrMatEdDragNDropMapAssignment("NormalMap", %payload); +} + +function ORMMapContainer::onControlDropped( %this, %payload, %position ) +{ + terrMatEdDragNDropMapAssignment("ORMMap", %payload); +} + +function MacroMapContainer::onControlDropped( %this, %payload, %position ) +{ + terrMatEdDragNDropMapAssignment("MacroMap", %payload); +}