2
0
Эх сурвалжийг харах

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.
marauder2k7 7 сар өмнө
parent
commit
bfe2401ebb

+ 115 - 7
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())

+ 16 - 10
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 <string>
-#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<GFXTextureProfile*, GFXTexHandle> 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 

+ 1 - 1
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();

+ 2 - 0
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

+ 5 - 5
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;