VGearsHRCFile.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (C) 2022 The V-Gears Team
  3. *
  4. * This file is part of V-Gears
  5. *
  6. * V-Gears is free software: you can redistribute it and/or modify it under
  7. * terms of the GNU General Public License as published by the Free Software
  8. * Foundation, version 3.0 (GPLv3) of the License.
  9. *
  10. * V-Gears is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <OgreLogManager.h>
  16. #include <OgreMeshManager.h>
  17. #include <OgreSkeletonManager.h>
  18. #include "data/VGearsHRCFile.h"
  19. #include "common/FinalFantasy7/FF7NameLookup.h"
  20. #include "common/VGearsStringUtil.h"
  21. #include "data/VGearsHRCFileSerializer.h"
  22. #include "data/VGearsHRCMeshLoader.h"
  23. #include "data/VGearsHRCSkeletonLoader.h"
  24. namespace VGears{
  25. const String HRCFile::RESOURCE_TYPE("VGearsHRCFile");
  26. //33.0f; TODO fix unit tests before changing this.
  27. const float HRCFile::DOWN_SCALER = 1.0f;
  28. HRCFile::HRCFile(
  29. Ogre::ResourceManager *creator, const String &name, Ogre::ResourceHandle handle,
  30. const String &group, bool is_manual, Ogre::ManualResourceLoader *loader
  31. ) :
  32. Ogre::Resource(creator, name, handle, group, is_manual, loader),
  33. mesh_loader_(nullptr), skeleton_loader_(nullptr)
  34. {createParamDictionary(RESOURCE_TYPE);}
  35. HRCFile::~HRCFile(){
  36. if (skeleton_loader_){
  37. Ogre::SkeletonManager::getSingleton().remove(skeleton_->getHandle());
  38. delete skeleton_loader_;
  39. skeleton_loader_ = nullptr;
  40. }
  41. if (mesh_loader_){
  42. Ogre::MeshManager::getSingleton().remove(mesh_->getHandle());
  43. delete mesh_loader_;
  44. mesh_loader_ = nullptr;
  45. }
  46. skeleton_.reset();
  47. mesh_.reset();
  48. unload();
  49. }
  50. void HRCFile::loadImpl(){
  51. HRCFileSerializer serializer;
  52. Ogre::DataStreamPtr stream(
  53. Ogre::ResourceGroupManager::getSingleton().openResource(mName, mGroup, true, this)
  54. );
  55. serializer.ImportHRCFile(stream, this);
  56. const String skeletonfile_name_(GetSkeletonFileName());
  57. Ogre::SkeletonManager &skeleton_manager(Ogre::SkeletonManager::getSingleton());
  58. skeleton_ = skeleton_manager.getByName(skeletonfile_name_, mGroup);
  59. if (skeleton_ == nullptr){
  60. assert(skeleton_loader_ == nullptr);
  61. skeleton_loader_ = new HRCSkeletonLoader(*this);
  62. skeleton_ = skeleton_manager.create(skeletonfile_name_, mGroup, true, skeleton_loader_);
  63. }
  64. const String meshfile_name_(GetMeshFileName());
  65. Ogre::LogManager::getSingleton().stream()
  66. << "HRC::loadImpl(): meshfile_name_: " << meshfile_name_;
  67. Ogre::MeshManager &mesh_manager(Ogre::MeshManager::getSingleton());
  68. mesh_ = mesh_manager.getByName(meshfile_name_, mGroup);
  69. if (mesh_ == nullptr){
  70. assert(mesh_loader_ == nullptr);
  71. mesh_loader_ = new HRCMeshLoader(*this);
  72. mesh_ = mesh_manager.create(meshfile_name_, mGroup, true, mesh_loader_);
  73. }
  74. }
  75. void HRCFile::unloadImpl(){
  76. skeleton_name_.clear();
  77. bones_.clear();
  78. }
  79. size_t HRCFile::CalculateSize(const Bone &bone) const{
  80. size_t size_rsd_names(0);
  81. for(
  82. RSDNameList::const_iterator it(bone.rsd_names.begin()); it != bone.rsd_names.end(); ++ it
  83. ){size_rsd_names += it->size();}
  84. return bone.name.size() + bone.parent.size() + sizeof(bone.length) + size_rsd_names;
  85. }
  86. size_t HRCFile::CalculateSize() const{
  87. size_t size_bones(0);
  88. for(BoneList::const_iterator it(bones_.begin()); it != bones_.end(); ++ it)
  89. size_bones += CalculateSize(*it);
  90. return skeleton_name_.size() + size_bones;
  91. }
  92. void HRCFile::SetSkeletonName(const String &name){skeleton_name_ = name;}
  93. String HRCFile::GetSkeletonFileName(void) const{
  94. String path;
  95. StringUtil::splitPath(getName(), path);
  96. return path + skeleton_name_ + EXT_SKELETON;
  97. }
  98. String HRCFile::GetMeshFileName(void) const{
  99. String base_name;
  100. StringUtil::splitBase(getName(), base_name);
  101. return NameLookup::model(base_name) + EXT_MESH;
  102. }
  103. Ogre::SkeletonPtr HRCFile::GetSkeleton(void) const{
  104. skeleton_->load();
  105. return skeleton_;
  106. }
  107. }