EnemyFile.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include "EnemyFile.h"
  2. #include <Ogre.h>
  3. #include "AnimationExtractor.h"
  4. #include "AnimationScriptDumper.h"
  5. #include "../../common/Logger.h"
  6. #include "../../common/OgreGenUtilites.h"
  7. #include "../../common/TimToVram.h"
  8. EnemyFile::EnemyFile( const Ogre::String& file ):
  9. LzsFile( file ),
  10. m_WithWeapon( false )
  11. {
  12. }
  13. EnemyFile::EnemyFile( File* pFile ):
  14. LzsFile( pFile ),
  15. m_WithWeapon( false )
  16. {
  17. }
  18. EnemyFile::EnemyFile( File* pFile, u32 offset, u32 length ):
  19. LzsFile( pFile, offset, length ),
  20. m_WithWeapon( false )
  21. {
  22. }
  23. EnemyFile::EnemyFile( u8* pBuffer, u32 offset, u32 length ):
  24. LzsFile( pBuffer, offset, length ),
  25. m_WithWeapon( false )
  26. {
  27. }
  28. EnemyFile::~EnemyFile()
  29. {
  30. }
  31. Ogre::Entity*
  32. EnemyFile::GetModel( const EnemyInfo& info )
  33. {
  34. DumpSettings( "exported/models/ffvii/battle/units/" + info.data.name + ".lua" );
  35. VectorTexForGen textures;
  36. Ogre::MeshPtr mesh = Ogre::MeshManager::getSingleton().create(info.data.name + "export", "General");
  37. Ogre::SkeletonPtr skeleton = Ogre::SkeletonManager::getSingleton().create(info.data.name + "export", "General");
  38. int offset_to_models_description = GetU32LE(0x04);
  39. int number_of_bones = GetU32LE(offset_to_models_description);
  40. Ogre::Bone* root1 = skeleton->createBone("0", 0);
  41. Ogre::Bone* root2 = skeleton->createBone("1", 1);
  42. root1->addChild(root2);
  43. for (int i = 0; i < number_of_bones; ++i)
  44. {
  45. Bone bone;
  46. bone.parent_id = (s16)GetU16LE(offset_to_models_description + 0x0c + i * 0x08 + 0x00);
  47. bone.length = (s16)GetU16LE(offset_to_models_description + 0x0c + i * 0x08 + 0x02);
  48. bone.offset = GetU32LE(offset_to_models_description + 0x0c + i * 0x08 + 0x04);
  49. m_Skeleton.push_back(bone);
  50. Ogre::Bone* bone1 = skeleton->createBone(Ogre::StringConverter::toString(i * 2 + 2), i * 2 + 2);
  51. Ogre::Bone* bone2 = skeleton->createBone(Ogre::StringConverter::toString(i * 2 + 3), i * 2 + 3);
  52. LOGGER->Log("Skeleton bone-" + Ogre::StringConverter::toString(i + 2) + " length-" + Ogre::StringConverter::toString(bone.length) + " parent-" + Ogre::StringConverter::toString(bone.parent_id) + + "\n");
  53. LOGGER->Log("bone1 " + Ogre::StringConverter::toString(i * 2 + 2) + ", bone2 " + Ogre::StringConverter::toString(i * 2 + 3) + "\n");
  54. skeleton->getBone(bone.parent_id * 2 + 1)->addChild(bone1);
  55. bone1->addChild(bone2);
  56. }
  57. if( m_WithWeapon == true )
  58. {
  59. Ogre::Bone* weapon1 = skeleton->createBone("weapon_1", number_of_bones * 2 + 2);
  60. root1->addChild(weapon1);
  61. Ogre::Bone* weapon2 = skeleton->createBone("weapon_2", number_of_bones * 2 + 3);
  62. weapon1->addChild(weapon2);
  63. }
  64. for (size_t bone = 0; bone < m_Skeleton.size(); ++bone)
  65. {
  66. int offset = m_Skeleton[bone].offset;
  67. if (offset != 0)
  68. {
  69. int offset_to_vertex = offset_to_models_description + offset;
  70. MeshExtractor(info.data, "ffvii/battle_model/" + info.data.name, this, offset_to_vertex, textures, mesh, Ogre::StringConverter::toString(bone), bone * 2 + 2);
  71. }
  72. }
  73. if (m_WithWeapon == true)
  74. {
  75. int number_of_files = GetU32LE(0x00);
  76. int offset_to_models_description = GetU32LE(number_of_files * 0x04 - 0x04);
  77. int offset_to_vertex = offset_to_models_description + 0x0c;
  78. MeshExtractor(info.data, "ffvii/battle_model/" + info.data.name, this, offset_to_vertex, textures, mesh, "weapon", number_of_bones * 2 + 3);
  79. }
  80. AnimationExtractor(this, skeleton, info, m_Skeleton, m_WithWeapon);
  81. // <OGRE> ///////////////////////////////
  82. skeleton->optimiseAllAnimations();
  83. Ogre::SkeletonSerializer skeleton_serializer;
  84. skeleton_serializer.exportSkeleton(skeleton.getPointer(), "exported/models/ffvii/battle/units/" + info.data.name + ".skeleton");
  85. // Update bounds
  86. Ogre::AxisAlignedBox aabb(-999, -999, -999, 999, 999, 999);
  87. mesh->_setBounds(aabb, false);
  88. mesh->_setBoundingSphereRadius(999);
  89. mesh->setSkeletonName( "models/ffvii/battle/units/" + info.data.name + ".skeleton" );
  90. Ogre::MeshSerializer ser;
  91. ser.exportMesh(mesh.getPointer(), "exported/models/ffvii/battle/units/" + info.data.name + ".mesh");
  92. // create and export textures for model
  93. if (textures.size() > 0)
  94. {
  95. int number_of_files = GetU32LE(0x00);
  96. int offset_to_texture = GetU32LE(number_of_files * 0x04);
  97. Vram* vram = Vram::MakeInstance().release();
  98. LoadTimFileToVram(this, offset_to_texture, vram);
  99. CreateTexture( vram, info.data, "exported/models/ffvii/battle/units/" + info.data.name + ".png", textures );
  100. delete vram;
  101. }
  102. //CreateMaterial("ffvii/battle_model/" + info.data.name, "exported/models/ffvii/battle/units/" + info.data.name + ".material", (textures.size() > 0) ? "models/ffvii/battle/units/" + info.data.name + ".png" : "", "Test/Fixed", "Test/Red");
  103. CreateMaterial("ffvii/battle_model/" + info.data.name, "exported/models/ffvii/battle/units/" + info.data.name + ".material", (textures.size() > 0) ? "models/ffvii/battle/units/" + info.data.name + ".png" : "", "", "");
  104. Ogre::SceneManager* scene_manager = Ogre::Root::getSingleton().getSceneManager( "Scene" );
  105. Ogre::Entity* thisEntity = scene_manager->createEntity( info.data.name, "models/ffvii/battle/units/" + info.data.name + ".mesh" );
  106. //thisEntity->setDisplaySkeleton(true);
  107. //thisEntity->setDebugDisplayEnabled(true);
  108. thisEntity->setVisible(false);
  109. thisEntity->getAnimationState("Idle")->setEnabled(true);
  110. thisEntity->getAnimationState("Idle")->setLoop(true);
  111. Ogre::SceneNode* thisSceneNode = scene_manager->getRootSceneNode()->createChildSceneNode();
  112. thisSceneNode->setPosition(0, 0, 0);
  113. thisSceneNode->roll(Ogre::Radian(Ogre::Degree(180.0f)));
  114. thisSceneNode->yaw(Ogre::Radian(Ogre::Degree(120.0f)));
  115. thisSceneNode->pitch(Ogre::Radian(Ogre::Degree(90.0f)));
  116. thisSceneNode->attachObject(thisEntity);
  117. return thisEntity;
  118. }
  119. void
  120. EnemyFile::DumpSettings(const Ogre::String& file)
  121. {
  122. Logger* settings = new Logger( file );
  123. int model_settings_offset = GetU32LE(0x08);
  124. m_WithWeapon = (GetU8( model_settings_offset + 2 ) & 0x80) > 0;
  125. LOGGER->Log( "Model With Weapon '" + Ogre::StringConverter::toString(m_WithWeapon) + "'\n" );
  126. settings->Log("// animation scripts\n");
  127. settings->Log("+00 [][] " + HexToString(GetU16LE(model_settings_offset + 0), 4, '0') + " - if this is not 0 we add 0x40 bit to 8015190b\n");
  128. settings->Log("+02 [] " + HexToString(GetU8(model_settings_offset + 2), 2, '0') + " - 0x3f - dead type. 0x80 - play secondary animation\n");
  129. settings->Log("+03 [] " + HexToString(GetU8(model_settings_offset + 3), 2, '0') + "\n");
  130. settings->Log("+04 [][] " + HexToString(GetU16LE(model_settings_offset + 4), 4, '0') + " - collision radius. Set to 801518e4+6\n");
  131. settings->Log("+06 [][] " + HexToString(GetU16LE(model_settings_offset + 6), 4, '0') + " - to 801518ec\n");
  132. settings->Log("+08 [][] " + HexToString(GetU16LE(model_settings_offset + 8), 4, '0') + " - to 801518ee\n");
  133. settings->Log("+0a [][] " + HexToString(GetU16LE(model_settings_offset + 0xa), 4, '0') + " - to 801518f0\n");
  134. settings->Log("+0c [][] " + HexToString(GetU16LE(model_settings_offset + 0xc), 4, '0') + "\n");
  135. settings->Log("+0e [][] " + HexToString(GetU16LE(model_settings_offset + 0xe), 4, '0') + "\n");
  136. settings->Log("+10 [][] " + HexToString(GetU16LE(model_settings_offset + 0x10), 4, '0') + " - filler?\n");
  137. settings->Log("+12 array of joints (bone indexes)\n ");
  138. for (int i = 0; i < 0x10; ++i)
  139. {
  140. if (i != 0)
  141. {
  142. settings->Log(" ");
  143. }
  144. settings->Log(HexToString(GetU8(model_settings_offset + 0x12 + i), 2, '0'));
  145. }
  146. settings->Log("\n");
  147. settings->Log("+22 [][] " + HexToString(GetU16LE(model_settings_offset + 0x22), 4, '0') + " - filler?\n");
  148. settings->Log("+24 array of 8 offsets to something\n ");
  149. for (int i = 0; i < 8; ++i)
  150. {
  151. if (i != 0)
  152. {
  153. settings->Log(" ");
  154. }
  155. settings->Log(HexToString(GetU32LE(model_settings_offset + 0x24 + i * 4), 8, '0'));
  156. }
  157. settings->Log("\n");
  158. settings->Log("+44 array of 4 something\n ");
  159. for (int i = 0; i < 4; ++i)
  160. {
  161. if (i != 0)
  162. {
  163. settings->Log(" ");
  164. }
  165. settings->Log(HexToString(GetU16LE(model_settings_offset + 0x44 + i * 2), 4, '0'));
  166. }
  167. settings->Log("\n");
  168. settings->Log("+4c array of 6 something\n ");
  169. for (int i = 0; i < 6; ++i)
  170. {
  171. if (i != 0)
  172. {
  173. settings->Log(" ");
  174. }
  175. settings->Log(HexToString(GetU16LE(model_settings_offset + 0x4c + i * 2), 4, '0'));
  176. }
  177. settings->Log("\n");
  178. settings->Log("+58 array of 6 something\n ");
  179. for (int i = 0; i < 6; ++i)
  180. {
  181. if (i != 0)
  182. {
  183. settings->Log(" ");
  184. }
  185. settings->Log(HexToString(GetU16LE(model_settings_offset + 0x58 + i * 2), 4, '0'));
  186. }
  187. settings->Log("\n");
  188. settings->Log("+64 [][] " + HexToString(GetU16LE(model_settings_offset + 0x64), 4, '0') + "\n");
  189. settings->Log("+66 [][] " + HexToString(GetU16LE(model_settings_offset + 0x66), 4, '0') + " - filler?\n");
  190. settings->Log("+68 array of 32 offsets to animation scripts\n ");
  191. for (int i = 0; i < 0x20; ++i)
  192. {
  193. if (i != 0)
  194. {
  195. if (i % 8 == 0)
  196. {
  197. settings->Log("\n ");
  198. }
  199. else
  200. {
  201. settings->Log(" ");
  202. }
  203. }
  204. settings->Log(HexToString(GetU32LE(model_settings_offset + 0x68 + i * 4), 8, '0'));
  205. }
  206. settings->Log("\n");
  207. AnimationScriptDumper(this, model_settings_offset, settings);
  208. delete settings;
  209. }