Clone of Bael'Zharon's Respite @ https://github.com/boardwalk/bzr

ResourceCache.cpp 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Bael'Zharon's Respite
  3. * Copyright (C) 2014 Daniel Skorupski
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along
  15. * with this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  17. */
  18. #include "ResourceCache.h"
  19. #include "resource/Animation.h"
  20. #include "resource/EnumMapper.h"
  21. #include "resource/Environment.h"
  22. #include "resource/ImgColor.h"
  23. #include "resource/ImgTex.h"
  24. #include "resource/Model.h"
  25. #include "resource/MotionTable.h"
  26. #include "resource/Palette.h"
  27. #include "resource/ParticleEmitter.h"
  28. #include "resource/PhysicsScript.h"
  29. #include "resource/PhysicsScriptTable.h"
  30. #include "resource/Region.h"
  31. #include "resource/Scene.h"
  32. #include "resource/Setup.h"
  33. #include "resource/Sound.h"
  34. #include "resource/SoundTable.h"
  35. #include "resource/Surface.h"
  36. #include "Core.h"
  37. #include "DatFile.h"
  38. static const Resource* loadResource(uint32_t resourceId)
  39. {
  40. vector<uint8_t> data = Core::get().portalDat().read(resourceId);
  41. if(data.empty())
  42. {
  43. data = Core::get().highresDat().read(resourceId);
  44. if(data.empty())
  45. {
  46. throw runtime_error("Resource not found");
  47. }
  48. }
  49. ResourceType resourceType = static_cast<ResourceType>(resourceId & 0xFF000000);
  50. switch(resourceType)
  51. {
  52. case ResourceType::kModel:
  53. return new Model{resourceId, data.data(), data.size()};
  54. case ResourceType::kSetup:
  55. return new Setup{resourceId, data.data(), data.size()};
  56. case ResourceType::kAnimation:
  57. return new Animation{resourceId, data.data(), data.size()};
  58. case ResourceType::kPalette:
  59. return new Palette{resourceId, data.data(), data.size()};
  60. case ResourceType::kImgTex:
  61. return new ImgTex{resourceId, data.data(), data.size()};
  62. case ResourceType::kImgColor:
  63. return new ImgColor{resourceId, data.data(), data.size()};
  64. case ResourceType::kSurface:
  65. return new Surface{resourceId, data.data(), data.size()};
  66. case ResourceType::kMotionTable:
  67. return new MotionTable{resourceId, data.data(), data.size()};
  68. case ResourceType::kSound:
  69. return new Sound{resourceId, data.data(), data.size()};
  70. case ResourceType::kEnvironment:
  71. return new Environment{resourceId, data.data(), data.size()};
  72. case ResourceType::kScene:
  73. return new Scene{resourceId, data.data(), data.size()};
  74. case ResourceType::kRegion:
  75. return new Region{resourceId, data.data(), data.size()};
  76. case ResourceType::kSoundTable:
  77. return new SoundTable{resourceId, data.data(), data.size()};
  78. case ResourceType::kEnumMapper:
  79. return new EnumMapper{resourceId, data.data(), data.size()};
  80. case ResourceType::kParticleEmitter:
  81. return new ParticleEmitter{resourceId, data.data(), data.size()};
  82. case ResourceType::kPhysicsScript:
  83. return new PhysicsScript{resourceId, data.data(), data.size()};
  84. case ResourceType::kPhysicsScriptTable:
  85. return new PhysicsScriptTable{resourceId, data.data(), data.size()};
  86. default:
  87. throw runtime_error("Resource type not supported");
  88. }
  89. }
  90. ResourcePtr ResourceCache::get(uint32_t resourceId)
  91. {
  92. weak_ptr<const Resource>& weakPtr = data_[resourceId];
  93. ResourcePtr sharedPtr = weakPtr.lock();
  94. if(!sharedPtr)
  95. {
  96. sharedPtr.reset(loadResource(resourceId));
  97. weakPtr = sharedPtr;
  98. }
  99. return sharedPtr;
  100. }