From cf8659735b47ea7d124003d41c7fb93464be0f19 Mon Sep 17 00:00:00 2001 From: JeffR Date: Sun, 20 Mar 2022 16:17:06 -0500 Subject: [PATCH 1/2] Adjusts handling so if a file being processed for importing is not actually imported as a new, successful asset it does not return an id, allowing tooling to only worry about actual new assets. Adds utility functions to TerrainBlock to be able to replace names of materials in the terrain file, mostly used for importing legacy files Adjusts terrainblock save asset logic to be able to save on a non-networked terrainblock such as when loaded temporarily on the server, for tooling purposes. Changes handling of not-found terrain materials when loading a terrain block so it will create a dummy terrain material with the same name as the not-found, but set the texture as the Warning image, instead of thrashing the original material names data Adds logic for testing newly imported terrain files' materials and if needbe, replacing them with the new terrain material asset ids. Adds logic in the project importer for if a would-be level asset's name already exists, we attempt to slap a "Level" suffix onto it to sidestep collisions. Changed LegacyImport config to try always adding shape suffix to help minimize probable naming collisions. Fixed handling of mission file's MissionGroup defines by specially checking for MissionGroup objects and processing the line into a Scene() declaration instead. --- Engine/source/T3D/assets/assetImporter.cpp | 5 +- Engine/source/terrain/terrData.cpp | 48 +++++++++++++++- Engine/source/terrain/terrData.h | 13 +++++ Engine/source/terrain/terrMaterial.cpp | 27 +++++---- .../tools/assetBrowser/assetImportConfigs.xml | 2 +- .../pre40/T3Dpre4ProjectImporter.tscript | 49 +++++++++++++--- .../scripts/projectImporter.tscript | 56 ++++++++++++++++++- 7 files changed, 176 insertions(+), 24 deletions(-) diff --git a/Engine/source/T3D/assets/assetImporter.cpp b/Engine/source/T3D/assets/assetImporter.cpp index f965bd42c..a3d1a4e21 100644 --- a/Engine/source/T3D/assets/assetImporter.cpp +++ b/Engine/source/T3D/assets/assetImporter.cpp @@ -2534,7 +2534,10 @@ StringTableEntry AssetImporter::autoImportFile(Torque::Path filePath, String typ dumpActivityLog(); - if (hasIssues) + if (hasIssues || + assetItem->importStatus == AssetImportObject::Skipped || + assetItem->importStatus == AssetImportObject::UseForDependencies || + assetItem->importStatus == AssetImportObject::Error) { return StringTable->EmptyString(); } diff --git a/Engine/source/terrain/terrData.cpp b/Engine/source/terrain/terrData.cpp index 532e0cc19..29523e609 100644 --- a/Engine/source/terrain/terrData.cpp +++ b/Engine/source/terrain/terrData.cpp @@ -480,16 +480,21 @@ bool TerrainBlock::saveAsset() AssetDatabase.findAssetType(pAssetQuery, "TerrainMaterialAsset"); - TerrainBlock* clientTerr = static_cast(getClientObject()); + TerrainBlock* terr = static_cast(getClientObject()); + if (!terr) + { + Con::warnf("No active client terrain while trying to save asset. Could be a server action, but should check to be sure!"); + terr = this; + } for (U32 i = 0; i < pAssetQuery->mAssetList.size(); i++) { //Acquire it so we can check it for matches AssetPtr terrMatAsset = pAssetQuery->mAssetList[i]; - for (U32 m = 0; m < clientTerr->mFile->mMaterials.size(); m++) + for (U32 m = 0; m < terr->mFile->mMaterials.size(); m++) { - StringTableEntry intMatName = clientTerr->mFile->mMaterials[m]->getInternalName(); + StringTableEntry intMatName = terr->mFile->mMaterials[m]->getInternalName(); StringTableEntry assetMatDefName = terrMatAsset->getMaterialDefinitionName(); if (assetMatDefName == intMatName) @@ -1456,6 +1461,25 @@ void TerrainBlock::getUtilizedAssets(Vector* usedAssetsList) // Console Methods //----------------------------------------------------------------------------- +bool TerrainBlock::renameTerrainMaterial(StringTableEntry oldMatName, StringTableEntry newMatName) +{ + TerrainMaterial* newMat = TerrainMaterial::findOrCreate(newMatName); + if (!newMat) + return false; + + U32 terrainMaterialCount = mFile->mMaterials.size(); + for (U32 i = 0; i < terrainMaterialCount; i++) + { + if (mFile->mMaterials[i]->getInternalName() == oldMatName) + { + TerrainMaterial* oldMat = mFile->mMaterials[i]; + mFile->mMaterials[i] = newMat; + } + } + + return true; +} + DefineEngineMethod( TerrainBlock, save, bool, ( const char* fileName),, "@brief Saves the terrain block's terrain file to the specified file name.\n\n" @@ -1623,3 +1647,21 @@ DefineEngineMethod(TerrainBlock, setTerrain, bool, (const char* terrain), , "Ter { return object->_setTerrain(StringTable->insert(terrain)); } + +DefineEngineMethod(TerrainBlock, getTerrainMaterialCount, S32, (), , "Gets the number of terrain materials for this block") +{ + return object->getTerrainMaterialCount(); +} + +DefineEngineMethod(TerrainBlock, getTerrainMaterialName, const char*, (S32 index), , "Gets the number of terrain materials for this block") +{ + if (index < 0 || index >= object->getTerrainMaterialCount()) + return StringTable->EmptyString(); + + return object->getTerrainMaterialName(index); +} + +DefineEngineMethod(TerrainBlock, renameTerrainMaterial, bool, (const char* oldMaterialName, const char* newMaterialName), , "Updates the terrain material from the original to the new name in the file. Mostly used for import/conversions.") +{ + return object->renameTerrainMaterial(StringTable->insert(oldMaterialName), StringTable->insert(newMaterialName)); +} diff --git a/Engine/source/terrain/terrData.h b/Engine/source/terrain/terrData.h index cc1479004..07a023371 100644 --- a/Engine/source/terrain/terrData.h +++ b/Engine/source/terrain/terrData.h @@ -522,6 +522,19 @@ public: return true; } + bool renameTerrainMaterial(StringTableEntry oldMatName, StringTableEntry newMatName); + S32 getTerrainMaterialCount() { + if (mFile) + return mFile->mMaterials.size(); + return 0; + } + + StringTableEntry getTerrainMaterialName(S32 index) { + if (mFile) + return mFile->mMaterials[index]->getInternalName(); + + return StringTable->EmptyString(); + } protected: bool mUpdateBasetex; bool mIgnoreZodiacs; diff --git a/Engine/source/terrain/terrMaterial.cpp b/Engine/source/terrain/terrMaterial.cpp index fa3b21f0a..289c9a16f 100644 --- a/Engine/source/terrain/terrMaterial.cpp +++ b/Engine/source/terrain/terrMaterial.cpp @@ -30,6 +30,8 @@ #include "console/persistenceManager.h" #endif +#include "T3D/assets/TerrainMaterialAsset.h" + #include @@ -166,6 +168,18 @@ TerrainMaterial* TerrainMaterial::findOrCreate( const char *nameOrPath ) if ( mat ) return mat; + StringTableEntry assetId = TerrainMaterialAsset::getAssetIdByMaterialName(nameOrPath); + if (assetId != StringTable->EmptyString()) + { + TerrainMaterialAsset* terrMatAsset = AssetDatabase.acquireAsset(assetId); + if (terrMatAsset) + { + mat = terrMatAsset->getMaterialDefinition(); + if (mat) + return mat; + } + } + // We didn't find it... so see if its a path to a // file. If it is lets assume its the texture. if ( GBitmap::sFindFiles( nameOrPath, NULL ) ) @@ -178,15 +192,9 @@ TerrainMaterial* TerrainMaterial::findOrCreate( const char *nameOrPath ) return mat; } - // Ok... return a debug material then. - mat = dynamic_cast( set->findObjectByInternalName( StringTable->insert( "warning_material" ) ) ); - if ( !mat ) - { - // This shouldn't happen.... the warning_texture should - // have already been defined in script, but we put this - // fallback here just in case it gets "lost". + // Ok... return a placeholder material then. mat = new TerrainMaterial(); - mat->setInternalName( "warning_material" ); + mat->setInternalName(nameOrPath); mat->_setDiffuseMap(GFXTextureManager::getWarningTexturePath()); mat->mDiffuseSize = 500; mat->_setDetailMap(StringTable->EmptyString()); @@ -195,8 +203,7 @@ TerrainMaterial* TerrainMaterial::findOrCreate( const char *nameOrPath ) mat->mMacroSize = 200; mat->registerObject(); - Sim::getRootGroup()->addObject( mat ); - } + Sim::getRootGroup()->addObject(mat); return mat; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml index 5c91b3d2a..b74012fb2 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml +++ b/Templates/BaseGame/game/tools/assetBrowser/assetImportConfigs.xml @@ -110,7 +110,7 @@ 0 0 + name="AlwaysAddShapeSuffix">1 0 Date: Sun, 20 Mar 2022 16:42:21 -0500 Subject: [PATCH 2/2] Made renaming of terrain materials on importing terrainblocks to use the full assetId, as it should --- .../game/tools/projectImporter/scripts/projectImporter.tscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript index 76051b570..f8a50e797 100644 --- a/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript +++ b/Templates/BaseGame/game/tools/projectImporter/scripts/projectImporter.tscript @@ -1661,7 +1661,7 @@ function beginTerrainImport() if(%terrMatAssetId !$= "") { //Ok, success, lets run the rename - if(%terrBlock.renameTerrainMaterial(%terrMatName, %terrMatName @ "_terrainMat")) + if(%terrBlock.renameTerrainMaterial(%terrMatName, %terrMatAssetId)) %matNamesChanged = true; } }