From 50f74368b330007484292470ce1b164482da2db1 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Sun, 15 Jun 2025 22:07:12 +0100 Subject: [PATCH] various fixes around preview assets and imageassets text field Imageasset text field now displays correctly in inspector previews now use assets again assetBrowser hides previewCache folder --- Engine/source/T3D/assets/ImageAsset.h | 32 +++++++++++------ Engine/source/console/console.cpp | 17 +++++++++ .../assetBrowser/scripts/assetBrowser.tscript | 4 +-- .../scripts/assetTypes/image.tscript | 32 ++++++++++++++--- .../scripts/assetTypes/material.tscript | 35 ++++++++++++++---- .../scripts/assetTypes/shape.tscript | 36 ++++++++++++------- 6 files changed, 121 insertions(+), 35 deletions(-) diff --git a/Engine/source/T3D/assets/ImageAsset.h b/Engine/source/T3D/assets/ImageAsset.h index 082ddb04f..c60523b81 100644 --- a/Engine/source/T3D/assets/ImageAsset.h +++ b/Engine/source/T3D/assets/ImageAsset.h @@ -233,10 +233,10 @@ DefineEnumType(ImageAssetType); #pragma region Refactor Asset Macros -#define DECLARE_IMAGEASSET(className, name, profile) \ +#define DECLARE_IMAGEASSET(className, name, profile) \ private: \ - AssetPtr m##name##Asset;\ - String m##name##File;\ + AssetPtr m##name##Asset; \ + StringTableEntry m##name##File = StringTable->EmptyString(); \ public: \ void _set##name(StringTableEntry _in){ \ if(m##name##Asset.getAssetId() == _in) \ @@ -244,6 +244,7 @@ public: if(_in == NULL || _in == StringTable->EmptyString()) \ { \ m##name##Asset = NULL; \ + m##name##File = ""; \ return; \ } \ if(!AssetDatabase.isDeclaredAsset(_in)) \ @@ -271,10 +272,12 @@ public: imageAssetId = ImageAsset::smNoImageAssetFallback; \ } \ m##name##Asset = imageAssetId; \ + m##name##File = _in; \ } \ else \ { \ m##name##Asset = _in; \ + m##name##File = get##name##File(); \ } \ }; \ \ @@ -285,10 +288,10 @@ public: StringTableEntry get##name##File(){ return m##name##Asset.notNull() ? m##name##Asset->getImageFile() : ""; } -#define DECLARE_IMAGEASSET_NET(className, name, profile, mask) \ +#define DECLARE_IMAGEASSET_NET(className, name, profile, mask) \ private: \ AssetPtr m##name##Asset; \ - String m##name##File;\ + StringTableEntry m##name##File = StringTable->EmptyString(); \ public: \ void _set##name(StringTableEntry _in){ \ if(m##name##Asset.getAssetId() == _in) \ @@ -296,6 +299,7 @@ public: if(_in == NULL || _in == StringTable->EmptyString()) \ { \ m##name##Asset = NULL; \ + m##name##File = ""; \ setMaskBits(mask); \ return; \ } \ @@ -324,10 +328,12 @@ public: imageAssetId = ImageAsset::smNoImageAssetFallback; \ } \ m##name##Asset = imageAssetId; \ + m##name##File = _in; \ } \ else \ { \ m##name##Asset = _in; \ + m##name##File = get##name##File(); \ } \ setMaskBits(mask); \ }; \ @@ -339,15 +345,15 @@ public: StringTableEntry get##name##File(){ return m##name##Asset.notNull() ? m##name##Asset->getImageFile() : ""; } -#define INITPERSISTFIELD_IMAGEASSET(name, consoleClass, docs) \ +#define INITPERSISTFIELD_IMAGEASSET(name, consoleClass, docs) \ addProtectedField(assetText(name, Asset), TypeImageAssetPtr, Offset(m##name##Asset, consoleClass), _set##name##Data, &defaultProtectedGetFn, assetDoc(name, asset docs.)); \ addProtectedField(assetText(name, File), TypeFilename, Offset(m##name##File, consoleClass), _set##name##Data, &defaultProtectedGetFn, assetDoc(name, file docs.)); -#define DECLARE_IMAGEASSET_ARRAY(className, name, profile, max) \ +#define DECLARE_IMAGEASSET_ARRAY(className, name, profile, max) \ private: \ AssetPtr m##name##Asset[max]; \ - String m##name##File[max];\ + StringTableEntry m##name##File[max] = {StringTable->EmptyString() }; \ public: \ void _set##name(StringTableEntry _in, const U32& index){ \ if(m##name##Asset[index].getAssetId() == _in) \ @@ -355,6 +361,7 @@ public: if(_in == NULL || _in == StringTable->EmptyString()) \ { \ m##name##Asset[index] = NULL; \ + m##name##File[index] = ""; \ return; \ } \ if(!AssetDatabase.isDeclaredAsset(_in)) \ @@ -382,10 +389,12 @@ public: imageAssetId = ImageAsset::smNoImageAssetFallback; \ } \ m##name##Asset[index] = imageAssetId; \ + m##name##File[index] = _in; \ } \ else \ { \ m##name##Asset[index] = _in; \ + m##name##File[index] = get##name##File(index); \ } \ }; \ \ @@ -397,10 +406,10 @@ public: StringTableEntry get##name##File(const U32& idx){ return m##name##Asset[idx].notNull() ? m##name##Asset[idx]->getImageFile() : ""; } -#define DECLARE_IMAGEASSET_ARRAY_NET(className, name, profile, max, mask) \ +#define DECLARE_IMAGEASSET_ARRAY_NET(className, name, profile, max, mask) \ private: \ AssetPtr m##name##Asset[max]; \ - String m##name##File[max];\ + StringTableEntry m##name##File[max] = {StringTable->EmptyString() }; \ public: \ void _set##name(StringTableEntry _in, const U32& index){ \ if(m##name##Asset[index].getAssetId() == _in) \ @@ -408,6 +417,7 @@ public: if(_in == NULL || _in == StringTable->EmptyString()) \ { \ m##name##Asset[index] = NULL; \ + m##name##File[index] = ""; \ setMaskBits(mask); \ return; \ } \ @@ -436,10 +446,12 @@ public: imageAssetId = ImageAsset::smNoImageAssetFallback; \ } \ m##name##Asset[index] = imageAssetId; \ + m##name##File[index] = _in; \ } \ else \ { \ m##name##Asset[index] = _in; \ + m##name##File[index] = get##name##File(index); \ } \ setMaskBits(mask); \ }; \ diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index eb967f35e..4b9316e6f 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -2226,6 +2226,23 @@ bool stripRepeatSlashes(char* pDstPath, const char* pSrcPath, S32 dstSize) //----------------------------------------------------------------------------- +DefineEngineFunction(expandPath, const char*, (const char* path),, "(string path) - Expands an expando or relative path into a full path.") +{ + char* ret = Con::getReturnBuffer(1024); + Con::expandPath(ret, 1024, path); + return ret; +} + +//----------------------------------------------------------------------------- + +DefineEngineFunction(collapsePath, const char*, (const char* path), , "(string path) - Collapses a path into either an expando path or a relative path.") +{ + char* ret = Con::getReturnBuffer(1024); + Con::collapsePath(ret, 1024, path); + return ret; +} + + DefineEngineFunction( log, void, ( const char* message ),, "@brief Logs a message to the console.\n\n" "@param message The message text.\n" diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript index d53e8a4cb..04b12ab3d 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetBrowser.tscript @@ -258,7 +258,7 @@ function AssetBrowser::initialize(%this) if(!isObject(%this.dirHandler)) { - %this.dirHandler = makedirectoryHandler(%this-->filterTree, "cache,shaderCache", ""); + %this.dirHandler = makedirectoryHandler(%this-->filterTree, "cache,shaderCache,previewCache", ""); %this.dirHandler.currentAddress = "data/"; } @@ -1613,7 +1613,7 @@ function AssetBrowser::doRebuildAssetArray(%this) else { //got it. - if(%folderName $= "shaderCache" || %folderName $= "cache" || %folderName $= ".git") + if(%folderName $= "shaderCache" || %folderName $= "cache" || %folderName $= ".git" || %folderName $= "previewCache") continue; if(!%this.coreModulesFilter && %folderName $= "core" && %breadcrumbPath $= "") diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript index f571f2aa6..1aa34f78c 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript @@ -42,29 +42,53 @@ function ImageAsset::generatePreviewImage(%this, %previewButton, %forceRegenerat if(%forceRegenerate $= "") %forceRegenerate = false; - %previewPath = "tools/resources/previewCache/" @ %previewButton.moduleName @ "/"; + %previewPath = "tools/resources/previewCache/" @ %previewButton.moduleName @ "/"; if(!IsDirectory(%previewPath)) { $CurrentAssetBrowser.dirHandler.createFolder(%previewPath); } - %previewFilePath = %previewPath @ %this.assetName @ ".png"; + %previewFilePath = %previewPath @ %this.assetName @ "_Preview.png"; if(!isFile(%previewFilePath) || (compareFileTimes(%this.getImagePath(), %previewFilePath) == 1)) { %generatePreview = true; } + %previewAssetName = "ToolsModule:" @ %this.assetName @ "_Preview"; + if(%generatePreview || %forceRegenerate) { %success = saveScaledImage(%this.getImagePath(), %previewFilePath, EditorSettings.value("Assets/Browser/PreviewImageSize")); if(%success) - %previewButton.setBitmap(%previewFilePath); - + { + + if(!AssetDatabase.isDeclaredAsset(%previewAssetName)) + { + %preview_Asset = new ImageAsset() + { + assetName = %this.assetName @ "_Preview"; + versionId = 1; + imageFile = makeFullPath(%previewFilePath); + }; + + TamlWrite(%preview_Asset, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); + %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1); + AssetDatabase.addDeclaredAsset(%toolsModuleDef, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); + } + + %previewButton.bitmapAsset = %previewAssetName; + } + return %success; } + else + { + %previewButton.bitmapAsset = %previewAssetName; + return true; + } return false; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript index bd88e1274..33456e96a 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/material.tscript @@ -101,8 +101,7 @@ function MaterialAsset::generatePreviewImage(%this, %previewButton, %forceRegene if(%forceRegenerate $= "") %forceRegenerate = false; - %module = $CurrentAssetBrowser.dirHandler.getModuleFromAddress(makeRelativePath(filePath(AssetDatabase.getAssetFilePath(%this.getAssetId())))); - %previewPath = "tools/resources/previewCache/" @ %module.moduleId @ "/"; + %previewPath = "tools/resources/previewCache/" @ %previewButton.moduleName @ "/"; if(!IsDirectory(%previewPath)) { @@ -111,7 +110,8 @@ function MaterialAsset::generatePreviewImage(%this, %previewButton, %forceRegene %generatePreview = false; - %previewFilePath = %previewPath @ %this.assetName @ ".png"; + %previewFilePath = %previewPath @ %this.assetName @ "_Preview.png"; + if(!isFile(%previewFilePath)) { %generatePreview = true; @@ -126,6 +126,8 @@ function MaterialAsset::generatePreviewImage(%this, %previewButton, %forceRegene } } + %previewAssetName = "ToolsModule:" @ %this.assetName @ "_Preview"; + if(%generatePreview || %forceRegenerate) { if(isObject(%this.materialDefinitionName)) @@ -137,22 +139,41 @@ function MaterialAsset::generatePreviewImage(%this, %previewButton, %forceRegene %diffuseMapAsset = AssetDatabase.acquireAsset(%diffuseMapAssetId); AssetDatabase.releaseAsset(%diffuseMapAssetId); } + %previewShapeDef = AssetDatabase.acquireAsset("ToolsModule:previewSphereShape"); %generatedFilePath = %previewShapeDef.generateCachedPreviewImage(256, %this.materialDefinitionName); pathCopy(%generatedFilePath, %previewFilePath, false); fileDelete(%generatedFilePath); - if(isFile(%previewFilePath)) + if(!AssetDatabase.isDeclaredAsset(%previewAssetName)) { - %previewButton.setBitmap(%previewFilePath); - return true; + %preview_Asset = new ImageAsset() + { + assetName = %this.assetName @ "_Preview"; + versionId = 1; + imageFile = makeFullPath(%previewFilePath); + }; + + TamlWrite(%preview_Asset, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); + %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1); + AssetDatabase.addDeclaredAsset(%toolsModuleDef, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); } + %previewButton.bitmapAsset = %previewAssetName; + return true; + } + else + { return false; } } - + else + { + %previewButton.bitmapAsset = %previewAssetName; + return true; + } + return false; } diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript index 855ba712c..d91ea925d 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/shape.tscript @@ -111,23 +111,21 @@ function ShapeAsset::generatePreviewImage(%this, %previewButton, %forceRegenerat if(%forceRegenerate $= "") %forceRegenerate = false; - %assetId = %this.getAssetId(); - - %module = %previewButton.assetBrowser.dirHandler.getModuleFromAddress(makeRelativePath(filePath(%this.getShapePath()))); - %previewPath = "tools/resources/previewCache/" @ %module.moduleId @ "/"; + %previewPath = "tools/resources/previewCache/" @ %previewButton.moduleName @ "/"; if(!IsDirectory(%previewPath)) { - %previewButton.assetBrowser.dirHandler.createFolder(%previewPath); + $CurrentAssetBrowser.dirHandler.createFolder(%previewPath); } - %generatePreview = false; + %previewFilePath = %previewPath @ %this.assetName @ "_Preview.png"; - %previewFilePath = %previewPath @ %this.assetName @ ".png"; if(!isFile(%previewFilePath) || (compareFileTimes(%this.getShapePath(), %previewFilePath) == 1)) { %generatePreview = true; } + + %previewAssetName = "ToolsModule:" @ %this.assetName @ "_Preview"; if(%generatePreview || %forceRegenerate) { @@ -146,14 +144,28 @@ function ShapeAsset::generatePreviewImage(%this, %previewButton, %forceRegenerat pathCopy(%filePath, %previewFilePath, false); fileDelete(%filePath); //cleanup - - if(isFile(%previewFilePath)) + + if(!AssetDatabase.isDeclaredAsset(%previewAssetName)) { - %previewButton.setBitmap(%previewFilePath); - return true; + %preview_Asset = new ImageAsset() + { + assetName = %this.assetName @ "_Preview"; + versionId = 1; + imageFile = makeFullPath(%previewFilePath); + }; + + TamlWrite(%preview_Asset, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); + %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1); + AssetDatabase.addDeclaredAsset(%toolsModuleDef, expandPath("^ToolsModule/resources/previewCache/" @ %previewButton.moduleName @ "/" @ %preview_Asset.AssetName @ ".asset.taml")); } - return false; + %previewButton.bitmapAsset = %previewAssetName; + return true; + } + else + { + %previewButton.bitmapAsset = %previewAssetName; + return true; } return false;