From bfe2401ebb9821a62e33e2d475dd121f79300232 Mon Sep 17 00:00:00 2001 From: marauder2k7 Date: Fri, 28 Mar 2025 11:14:21 +0000 Subject: [PATCH] get image metadata adds ability to get image metadata without loading the texture since we are using the getOwned parameter correctly now new assets must have the full path to the image file when being created when the asset becomes owned again the image file path will be updated. --- Engine/source/T3D/assets/ImageAsset.cpp | 122 +++++++++++++++++- Engine/source/T3D/assets/ImageAsset.h | 26 ++-- Engine/source/T3D/assets/assetImporter.cpp | 2 +- .../source/gfx/bitmap/loaders/bitmapSTB.cpp | 2 + .../scripts/assetTypes/image.tscript | 10 +- 5 files changed, 139 insertions(+), 23 deletions(-) diff --git a/Engine/source/T3D/assets/ImageAsset.cpp b/Engine/source/T3D/assets/ImageAsset.cpp index 6829e82bd..f55cae0d9 100644 --- a/Engine/source/T3D/assets/ImageAsset.cpp +++ b/Engine/source/T3D/assets/ImageAsset.cpp @@ -49,6 +49,18 @@ #include "T3D/assets/assetImporter.h" #include "gfx/gfxDrawUtil.h" +#include "gfx/bitmap/ddsFile.h" +#ifdef __clang__ +#define STBIWDEF static inline +#endif +#pragma warning( push ) +#pragma warning( disable : 4505 ) // unreferenced function removed. +#ifndef STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_IMPLEMENTATION +#define STB_IMAGE_STATIC +#include "stb_image.h" +#endif +#pragma warning(pop) //----------------------------------------------------------------------------- @@ -133,14 +145,17 @@ const String ImageAsset::mErrCodeStrings[] = //----------------------------------------------------------------------------- ImageAsset::ImageAsset() : - mImageFile(StringTable->EmptyString()), - mUseMips(true), - mIsHDRImage(false), - mImageType(Albedo), - mTextureHandle(NULL), - mIsNamedTarget(false) + mImageFile(StringTable->EmptyString()), + mUseMips(true), + mIsHDRImage(false), + mImageType(Albedo), + mTextureHandle(NULL), + mIsNamedTarget(false), + mImageWidth(-1), + mImageHeight(-1), + mImageChannels(-1) { - mLoadedState = AssetErrCode::NotLoaded; + mLoadedState = AssetErrCode::NotLoaded; } //----------------------------------------------------------------------------- @@ -373,6 +388,43 @@ void ImageAsset::setImageFile(StringTableEntry pImageFile) mImageFile = getOwned() ? expandAssetFilePath(pImageFile) : StringTable->insert(pImageFile); + if (Torque::FS::IsFile(mImageFile)) + { + if (dStrEndsWith(mImageFile, ".dds")) + { + DDSFile* tempFile = new DDSFile(); + FileStream* ddsFs; + if ((ddsFs = FileStream::createAndOpen(mImageFile, Torque::FS::File::Read)) == NULL) + { + Con::errorf("ImageAsset::setImageFile Failed to open ddsfile: %s", mImageFile); + } + + if (!tempFile->readHeader(*ddsFs)) + { + Con::errorf("ImageAsset::setImageFile Failed to read header of ddsfile: %s", mImageFile); + } + else + { + mImageWidth = tempFile->mWidth; + mImageHeight = tempFile->mHeight; + } + + ddsFs->close(); + delete tempFile; + } + else + { + if (!stbi_info(mImageFile, &mImageWidth, &mImageHeight, &mImageChannels)) + { + StringTableEntry stbErr = stbi_failure_reason(); + if (stbErr == StringTable->EmptyString()) + stbErr = "ImageAsset::Unkown Error!"; + + Con::errorf("ImageAsset::setImageFile STB Get file info failed: %s", stbErr); + } + } + } + refreshAsset(); } @@ -578,6 +630,62 @@ void ImageAsset::onTamlPostWrite(void) mImageFile = expandAssetFilePath(mImageFile); } +void ImageAsset::onTamlCustomWrite(TamlCustomNodes& customNodes) +{ + // Debug Profiling. + PROFILE_SCOPE(ImageAsset_OnTamlCustomWrite); + + // Call parent. + Parent::onTamlCustomWrite(customNodes); + + TamlCustomNode* pImageMetaData = customNodes.addNode(StringTable->insert("ImageMetadata")); + TamlCustomNode* pImageInfoNode = pImageMetaData->addNode(StringTable->insert("ImageInfo")); + + pImageInfoNode->addField(StringTable->insert("ImageWidth"), mImageWidth); + pImageInfoNode->addField(StringTable->insert("ImageHeight"), mImageHeight); + +} + +void ImageAsset::onTamlCustomRead(const TamlCustomNodes& customNodes) +{ + // Debug Profiling. + PROFILE_SCOPE(ImageAsset_OnTamlCustomRead); + + // Call parent. + Parent::onTamlCustomRead(customNodes); + + const TamlCustomNode* pImageMetaDataNode = customNodes.findNode(StringTable->insert("ImageMetadata")); + + if (pImageMetaDataNode != NULL) + { + const TamlCustomNode* pImageInfoNode = pImageMetaDataNode->findNode(StringTable->insert("ImageInfo")); + // Fetch fields. + const TamlCustomFieldVector& fields = pImageInfoNode->getFields(); + // Iterate property fields. + for (TamlCustomFieldVector::const_iterator fieldItr = fields.begin(); fieldItr != fields.end(); ++fieldItr) + { + // Fetch field. + const TamlCustomField* pField = *fieldItr; + // Fetch field name. + StringTableEntry fieldName = pField->getFieldName(); + if (fieldName == StringTable->insert("ImageWidth")) + { + pField->getFieldValue(mImageWidth); + } + else if (fieldName == StringTable->insert("ImageHeight")) + { + pField->getFieldValue(mImageHeight); + } + else + { + // Unknown name so warn. + Con::warnf("ImageAsset::onTamlCustomRead() - Encountered an unknown custom field name of '%s'.", fieldName); + continue; + } + } + } +} + const char* ImageAsset::getImageInfo() { if (isAssetValid()) diff --git a/Engine/source/T3D/assets/ImageAsset.h b/Engine/source/T3D/assets/ImageAsset.h index e372419a2..12538064b 100644 --- a/Engine/source/T3D/assets/ImageAsset.h +++ b/Engine/source/T3D/assets/ImageAsset.h @@ -25,36 +25,36 @@ #ifndef _ASSET_BASE_H_ #include "assets/assetBase.h" #endif - #ifndef _ASSET_DEFINITION_H_ #include "assets/assetDefinition.h" #endif - #ifndef _STRINGUNIT_H_ #include "string/stringUnit.h" #endif - #ifndef _ASSET_FIELD_TYPES_H_ #include "assets/assetFieldTypes.h" #endif #ifndef _ASSET_PTR_H_ #include "assets/assetPtr.h" #endif - +#ifndef _GBITMAP_H_ #include "gfx/bitmap/gBitmap.h" +#endif +#ifndef _GFXTEXTUREHANDLE_H_ #include "gfx/gfxTextureHandle.h" - +#endif +#ifndef _NETCONNECTION_H_ #include "sim/netConnection.h" - -#include -#include "assetMacroHelpers.h" - +#endif +#ifndef _GFXDEVICE_H_ #include "gfx/gfxDevice.h" - +#endif #ifndef _MATTEXTURETARGET_H_ #include "materials/matTextureTarget.h" #endif +#include "assetMacroHelpers.h" + //----------------------------------------------------------------------------- class ImageAsset : public AssetBase { @@ -139,6 +139,10 @@ private: ImageTypes mImageType; HashMap mResourceMap; bool mIsNamedTarget; + S32 mImageWidth; + S32 mImageHeight; + S32 mImageChannels; + void generateTexture(void); public: ImageAsset(); @@ -210,6 +214,8 @@ protected: /// Taml callbacks. void onTamlPreWrite(void) override; void onTamlPostWrite(void) override; + void onTamlCustomWrite(TamlCustomNodes& customNodes) override; + void onTamlCustomRead(const TamlCustomNodes& customNodes) override; protected: // Texture file diff --git a/Engine/source/T3D/assets/assetImporter.cpp b/Engine/source/T3D/assets/assetImporter.cpp index 8d688853e..8fbdc85f9 100644 --- a/Engine/source/T3D/assets/assetImporter.cpp +++ b/Engine/source/T3D/assets/assetImporter.cpp @@ -2824,7 +2824,7 @@ Torque::Path AssetImporter::importImageAsset(AssetImportObject* assetItem) StringTableEntry assetName = StringTable->insert(assetItem->assetName.c_str()); - String imageFileName = assetItem->filePath.getFileName() + "." + assetItem->filePath.getExtension(); + String imageFileName = assetItem->filePath.getFullPath(); String assetPath = targetPath + "/" + imageFileName; String tamlPath = targetPath + "/" + assetName + ".asset.taml"; String originalPath = assetItem->filePath.getFullPath().c_str(); diff --git a/Engine/source/gfx/bitmap/loaders/bitmapSTB.cpp b/Engine/source/gfx/bitmap/loaders/bitmapSTB.cpp index 7a763cd27..710977acd 100644 --- a/Engine/source/gfx/bitmap/loaders/bitmapSTB.cpp +++ b/Engine/source/gfx/bitmap/loaders/bitmapSTB.cpp @@ -37,9 +37,11 @@ #pragma warning( push ) #pragma warning( disable : 4505 ) // unreferenced function removed. +#ifndef STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_STATIC #include "stb_image.h" +#endif #define STB_IMAGE_WRITE_IMPLEMENTATION #define STB_IMAGE_WRITE_STATIC diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript index 2263d0227..ca1123e12 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/assetTypes/image.tscript @@ -147,7 +147,7 @@ function AssetBrowser::importImageAsset(%this, %assetItem) { assetName = %assetName; versionId = 1; - imageFile = fileName(%filePath); + imageFile = makeFullPath(%filePath); imageType = %assetItem.imageType; }; @@ -238,13 +238,13 @@ function AssetBrowser::generateImageAssetPreviewImage(%this, %previewButton, %fo { assetName = %previewAssetName; versionId = 1; - imageFile = fileName(%previewFilePath); + imageFile = makeFullPath(%previewFilePath); }; - + %previewAssetName = "ToolsModule:" @ %previewAssetName; %previewImgAssetPath = %previewPath @ %previewAsset.assetName @ ".asset.taml"; + %assetImportSuccessful = TAMLWrite(%previewAsset, %previewImgAssetPath); - %toolsModuleDef = ModuleDatabase.findModule("ToolsModule",1); %success = AssetDatabase.addDeclaredAsset(%toolsModuleDef, %previewImgAssetPath); @@ -252,8 +252,8 @@ function AssetBrowser::generateImageAssetPreviewImage(%this, %previewButton, %fo if(!%success) { return false; //failed to register the preview image for some reason? + } } - } %previewButton.bitmapAsset = %previewAssetName; return true;