CmImporter.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include "CmImporter.h"
  2. #include "CmPath.h"
  3. #include "CmResource.h"
  4. #include "CmFileSystem.h"
  5. #include "CmSpecificImporter.h"
  6. #include "CmGpuProgIncludeImporter.h"
  7. #include "CmGpuProgramImporter.h"
  8. #include "CmImportOptions.h"
  9. #include "CmDebug.h"
  10. #include "CmDataStream.h"
  11. #include "CmException.h"
  12. namespace CamelotEngine
  13. {
  14. Importer::Importer()
  15. {
  16. registerAssetImporter(new GpuProgIncludeImporter());
  17. registerAssetImporter(new GpuProgramImporter());
  18. }
  19. Importer::~Importer()
  20. {
  21. for(auto i = mAssetImporters.begin(); i != mAssetImporters.end(); ++i)
  22. {
  23. if((*i) != nullptr)
  24. delete *i;
  25. }
  26. mAssetImporters.clear();
  27. }
  28. bool Importer::supportsFileType(const String& extension) const
  29. {
  30. for(auto iter = mAssetImporters.begin(); iter != mAssetImporters.end(); ++iter)
  31. {
  32. if(*iter != nullptr && (*iter)->isExtensionSupported(extension))
  33. return true;
  34. }
  35. return false;
  36. }
  37. bool Importer::supportsFileType(const UINT8* magicNumber, UINT32 magicNumSize) const
  38. {
  39. for(auto iter = mAssetImporters.begin(); iter != mAssetImporters.end(); ++iter)
  40. {
  41. if(*iter != nullptr && (*iter)->isMagicNumberSupported(magicNumber, magicNumSize))
  42. return true;
  43. }
  44. return false;
  45. }
  46. BaseResourceHandle Importer::import(const String& inputFilePath, ConstImportOptionsPtr importOptions)
  47. {
  48. if(!FileSystem::fileExists(inputFilePath))
  49. {
  50. LOGWRN("Trying to import asset that doesn't exists. Asset path: " + inputFilePath);
  51. return BaseResourceHandle();
  52. }
  53. SpecificImporter* importer = getImporterForFile(inputFilePath);
  54. if(importer == nullptr)
  55. return BaseResourceHandle();
  56. if(importOptions == nullptr)
  57. importOptions = importer->getDefaultImportOptions();
  58. else
  59. {
  60. ConstImportOptionsPtr defaultImportOptions = importer->getDefaultImportOptions();
  61. if(importOptions->getTypeId() != defaultImportOptions->getTypeId())
  62. {
  63. CM_EXCEPT(InvalidParametersException, "Provided import options is not of valid type. " \
  64. "Expected: " + defaultImportOptions->getTypeName() + ". Got: " + importOptions->getTypeName() + ".");
  65. }
  66. }
  67. BaseResourceHandle importedResource = importer->import(inputFilePath, importOptions);
  68. return importedResource;
  69. }
  70. ImportOptionsPtr Importer::createImportOptions(const String& inputFilePath)
  71. {
  72. if(!FileSystem::fileExists(inputFilePath))
  73. {
  74. LOGWRN("Trying to import asset that doesn't exists. Asset path: " + inputFilePath);
  75. return nullptr;
  76. }
  77. SpecificImporter* importer = getImporterForFile(inputFilePath);
  78. if(importer == nullptr)
  79. return nullptr;
  80. return importer->createImportOptions();
  81. }
  82. void Importer::registerAssetImporter(SpecificImporter* importer)
  83. {
  84. if(!importer)
  85. {
  86. LOGWRN("Trying to register a null asset importer!");
  87. return;
  88. }
  89. mAssetImporters.push_back(importer);
  90. }
  91. SpecificImporter* Importer::getImporterForFile(const String& inputFilePath) const
  92. {
  93. String ext = Path::getExtension(inputFilePath);
  94. ext = ext.substr(1, ext.size() - 1); // Remove the .
  95. if(!supportsFileType(ext))
  96. {
  97. LOGWRN("There is no importer for the provided file type. (" + inputFilePath + ")");
  98. return nullptr;
  99. }
  100. for(auto iter = mAssetImporters.begin(); iter != mAssetImporters.end(); ++iter)
  101. {
  102. if(*iter != nullptr && (*iter)->isExtensionSupported(ext))
  103. {
  104. return *iter;
  105. }
  106. }
  107. return nullptr;
  108. }
  109. }