Better handling for finding modules by file path. Mainly used in asset importer

This commit is contained in:
Areloch 2020-12-02 23:57:17 -06:00
parent 80eb4ab2ba
commit e8564680e4
4 changed files with 60 additions and 10 deletions

View file

@ -666,18 +666,13 @@ AssetImportObject* AssetImporter::findImportingAssetByName(String assetName, Ass
ModuleDefinition* AssetImporter::getModuleFromPath(Torque::Path filePath)
{
U32 folderCount = StringUnit::getUnitCount(filePath.getPath().c_str(), "/");
//We want to ensure it's a full filepath, because the module system internally uses full paths for the module dirs
char fullPath[2048];
Platform::makeFullPathName(filePath.getFullPath().c_str(), fullPath, sizeof(fullPath));
for (U32 i = 0; i < folderCount; i++)
{
String folderName = StringUnit::getUnit(filePath.getPath().c_str(), i, "/");
ModuleDefinition* moduleDef = ModuleDatabase.findModuleByFilePath(StringTable->insert(fullPath));
ModuleDefinition* moduleDef = ModuleDatabase.findModule(folderName.c_str(), 1);
if (moduleDef != nullptr)
return moduleDef;
}
return nullptr;
return moduleDef;
}
String AssetImporter::parseImageSuffixes(String assetName, String* suffixType)

View file

@ -1058,6 +1058,42 @@ ModuleDefinition* ModuleManager::findModule( const char* pModuleId, const U32 ve
//-----------------------------------------------------------------------------
ModuleDefinition* ModuleManager::findModuleByFilePath(StringTableEntry filePath)
{
// Sanity!
AssertFatal(filePath != StringTable->EmptyString(), "Cannot find module with an empty filePath.");
String desiredPath = filePath;
StringTableEntry coreModuleId = StringTable->insert("CoreModule");
StringTableEntry toolsModuleId = StringTable->insert("ToolsModule");
for (typeModuleIdDatabaseHash::iterator moduleIdItr = mModuleIdDatabase.begin(); moduleIdItr != mModuleIdDatabase.end(); ++moduleIdItr)
{
// Fetch module definition entry.
ModuleDefinitionEntry* pModuleDefinitionEntry = moduleIdItr->value;
for (typeModuleDefinitionVector::iterator moduleDefinitionItr = pModuleDefinitionEntry->begin(); moduleDefinitionItr != pModuleDefinitionEntry->end(); ++moduleDefinitionItr)
{
// Fetch module definition.
ModuleDefinition* pModuleDefinition = *moduleDefinitionItr;
Torque::Path modulePath = pModuleDefinition->getModulePath();
StringTableEntry asdasd = StringTable->insert(modulePath.getFullPath());
//We don't deal with CoreModule or ToolsModule having assets for now
if (desiredPath.startsWith(asdasd) && pModuleDefinition->mModuleId != coreModuleId)
{
return pModuleDefinition;
}
}
}
return nullptr;
}
//-----------------------------------------------------------------------------
ModuleDefinition* ModuleManager::findLoadedModule( const char* pModuleId )
{
// Sanity!

View file

@ -173,6 +173,7 @@ public:
/// Module type enumeration.
ModuleDefinition* findModule( const char* pModuleId, const U32 versionId );
ModuleDefinition* findModuleByFilePath(StringTableEntry filePath);
ModuleDefinition* findLoadedModule( const char* pModuleId );
void findModules( const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );
void findModuleTypes( const char* pModuleType, const bool loadedOnly, typeConstModuleDefinitionVector& moduleDefinitions );

View file

@ -133,6 +133,24 @@ DefineEngineMethod(ModuleManager, findModule, String, (const char* pModuleId, U3
//-----------------------------------------------------------------------------
DefineEngineMethod(ModuleManager, findModuleByFilePath, String, (const char* filePath), (""),
"Find the specific module Id optionally at the specified version Id.\n"
"@param moduleId The module Id to find.\n"
"@param versionId The version Id to find.\n"
"@return The module definition object or NULL if not found.\n")
{
// Find module definition.
ModuleDefinition* pModuleDefinition = object->findModuleByFilePath(StringTable->insert(filePath));
// Return nothing if not found.
if (pModuleDefinition == NULL)
return StringTable->EmptyString();
return pModuleDefinition->getIdString();
}
//-----------------------------------------------------------------------------
DefineEngineMethod(ModuleManager, findModules, String, (bool loadedOnly), (false),
"Find all the modules registered with the specified loaded state.\n"
"@param loadedOnly Whether to return only modules that are loaded or not.\n"