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;