diff --git a/Engine/source/assets/assetManager.cpp b/Engine/source/assets/assetManager.cpp index 2ed7b19ae..805c52c01 100644 --- a/Engine/source/assets/assetManager.cpp +++ b/Engine/source/assets/assetManager.cpp @@ -54,6 +54,14 @@ #include "console/consoleTypes.h" #endif +#ifndef _AUTOLOAD_ASSETS_H_ +#include "assets/autoloadAssets.h" +#endif + +#ifndef COMPONENTASSET_H +#include "T3D/assets/ComponentAsset.h" +#endif + // Script bindings. #include "assetManager_ScriptBinding.h" @@ -202,6 +210,57 @@ bool AssetManager::addModuleDeclaredAssets( ModuleDefinition* pModuleDefinition return true; } +bool AssetManager::loadModuleAutoLoadAssets(ModuleDefinition* pModuleDefinition) +{ + // Debug Profiling. + PROFILE_SCOPE(AssetManager_loadModuleAutoLoadAssets); + + // Sanity! + AssertFatal(pModuleDefinition != NULL, "Cannot auto load assets using a NULL module definition"); + + // Does the module have any assets associated with it? + if (pModuleDefinition->getModuleAssets().empty()) + { + // Yes, so warn. + Con::warnf("Asset Manager: Cannot auto load assets to module '%s' as it has no existing assets.", pModuleDefinition->getSignature()); + return false; + } + + U32 assetCount = pModuleDefinition->getModuleAssets().size(); + + // Iterate the module definition children. + for (SimSet::iterator itr = pModuleDefinition->begin(); itr != pModuleDefinition->end(); ++itr) + { + // Fetch the declared assets. + AutoloadAssets* pAutoloadAssets = dynamic_cast(*itr); + + // Skip if it's not a declared assets location. + if (pAutoloadAssets == NULL) + continue; + + for (U32 i = 0; i < assetCount; ++i) + { + AssetDefinition* assetDef = pModuleDefinition->getModuleAssets()[i]; + + if (assetDef->mAssetType == pAutoloadAssets->getAssetType()) + { + //TODO: this is stupid and ugly, need to properly automagically parse the class for registration + AssetBase* assetBase = nullptr; + + if (assetDef->mAssetType == StringTable->insert("ComponentAsset")) + { + assetBase = mTaml.read(assetDef->mAssetBaseFilePath); + } + + //load the asset now if valid + if (assetBase) + addPrivateAsset(assetBase); + } + } + } + + return true; +} //----------------------------------------------------------------------------- bool AssetManager::addDeclaredAsset( ModuleDefinition* pModuleDefinition, const char* pAssetFilePath ) @@ -2974,6 +3033,9 @@ void AssetManager::onModulePreLoad( ModuleDefinition* pModuleDefinition ) // Add module declared assets. addModuleDeclaredAssets( pModuleDefinition ); + // Load any auto-loaded asset types + loadModuleAutoLoadAssets(pModuleDefinition); + // Is an asset tags manifest specified? if ( pModuleDefinition->getAssetTagsManifest() != StringTable->EmptyString() ) { diff --git a/Engine/source/assets/assetManager.h b/Engine/source/assets/assetManager.h index fbf1522f3..a8ac792a2 100644 --- a/Engine/source/assets/assetManager.h +++ b/Engine/source/assets/assetManager.h @@ -127,6 +127,7 @@ public: bool removeDeclaredAssets( ModuleDefinition* pModuleDefinition ); bool removeDeclaredAsset( const char* pAssetId ); bool renameDeclaredAsset( const char* pAssetIdFrom, const char* pAssetIdTo ); + bool loadModuleAutoLoadAssets(ModuleDefinition* pModuleDefinition); StringTableEntry getAssetName( const char* pAssetId ); StringTableEntry getAssetDescription( const char* pAssetId ); StringTableEntry getAssetCategory( const char* pAssetId ); diff --git a/Engine/source/assets/autoloadAssets.cpp b/Engine/source/assets/autoloadAssets.cpp new file mode 100644 index 000000000..e5b3ca53f --- /dev/null +++ b/Engine/source/assets/autoloadAssets.cpp @@ -0,0 +1,45 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2013 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifndef _AUTOLOAD_ASSETS_H_ +#include "assets/autoloadAssets.h" +#endif + +#ifndef _CONSOLETYPES_H_ +#include "console/consoleTypes.h" +#endif + +//----------------------------------------------------------------------------- + +IMPLEMENT_CONOBJECT(AutoloadAssets); + +//----------------------------------------------------------------------------- + +void AutoloadAssets::initPersistFields() +{ + // Call Parent. + Parent::initPersistFields(); + + addField("Path", TypeString, Offset(mPath, AutoloadAssets), ""); + addField("AssetType", TypeString, Offset(mAssetType, AutoloadAssets), ""); + addField("Recurse", TypeBool, Offset(mRecurse, AutoloadAssets), ""); +} diff --git a/Engine/source/assets/autoloadAssets.h b/Engine/source/assets/autoloadAssets.h new file mode 100644 index 000000000..5a33e57c1 --- /dev/null +++ b/Engine/source/assets/autoloadAssets.h @@ -0,0 +1,74 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2013 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifndef _AUTOLOAD_ASSETS_H_ +#define _AUTOLOAD_ASSETS_H_ + +#ifndef _SIM_H_ +#include "console/sim.h" +#endif + +#ifndef _SIMOBJECT_H_ +#include "console/simObject.h" +#endif + +#ifndef _CONSOLEOBJECT_H_ +#include "console/consoleObject.h" +#endif + +//----------------------------------------------------------------------------- + +class AutoloadAssets : public SimObject +{ + friend class AssetManager; + +private: + typedef SimObject Parent; + + StringTableEntry mPath; + StringTableEntry mAssetType; + bool mRecurse; + +public: + AutoloadAssets() : + mPath(StringTable->EmptyString()), + mAssetType(StringTable->EmptyString()), + mRecurse(false) + {} + virtual ~AutoloadAssets() {} + + static void initPersistFields(); + + inline void setPath(const char* pPath) { mPath = StringTable->insert(pPath); } + inline StringTableEntry getPath(void) const { return mPath; } + inline void setAssetType(const char* pPath) { mAssetType = StringTable->insert(pPath); } + inline StringTableEntry getAssetType(void) const { return mAssetType; } + inline void setRecurse(const bool recurse) { mRecurse = recurse; } + inline bool getRecurse(void) const { return mRecurse; } + + /// Declare Console Object. + DECLARE_CONOBJECT(AutoloadAssets); +}; + +#endif // _DECLARED_ASSETS_H_ + +#pragma once diff --git a/Engine/source/module/moduleDefinition.h b/Engine/source/module/moduleDefinition.h index 2ebb3f99a..42deff44d 100644 --- a/Engine/source/module/moduleDefinition.h +++ b/Engine/source/module/moduleDefinition.h @@ -166,6 +166,8 @@ public: inline void setAssetTagsManifest( const char* pTagsAssetManifest ) { if ( checkUnlocked() ) { mAssetTagsManifest = StringTable->insert(pTagsAssetManifest); } } inline StringTableEntry getAssetTagsManifest( void ) const { return mAssetTagsManifest; } inline typeModuleAssetsVector& getModuleAssets( void ) { return mModuleAssets; } + void addDeclaredAsset(AssetDefinition* asset) { mModuleAssets.push_back(asset); } + /// Module location. inline void setModulePath( const char* pModulePath ) { if ( checkUnlocked() ) { mModulePath = StringTable->insert(pModulePath); } }