ModelFile.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "ModelFile.h"
  2. #include <Ogre.h>
  3. #include "AnimationExtractor.h"
  4. #include "MeshExtractor.h"
  5. #include "../../common/Logger.h"
  6. #include "../../common/TimToVram.h"
  7. ModelFile::ModelFile( const Ogre::String& file ):
  8. File( file )
  9. {
  10. }
  11. ModelFile::ModelFile( File* pFile ):
  12. File( pFile )
  13. {
  14. }
  15. ModelFile::ModelFile( File* pFile, u32 offset, u32 length ):
  16. File( pFile, offset, length )
  17. {
  18. }
  19. ModelFile::ModelFile( u8* pBuffer, u32 offset, u32 length ):
  20. File( pBuffer, offset, length )
  21. {
  22. }
  23. ModelFile::~ModelFile()
  24. {
  25. }
  26. Ogre::Entity*
  27. ModelFile::GetModel( const ModelInfo& info )
  28. {
  29. VectorTexForGen textures;
  30. Ogre::MeshPtr mesh = Ogre::MeshManager::getSingleton().create( info.data.name + "export", "General" );
  31. Ogre::SkeletonPtr skeleton = Ogre::SkeletonManager::getSingleton().create( info.data.name + "export", "General" );
  32. int number_of_bones = GetU8( 0x02 );
  33. int number_of_parts = GetU8( 0x03 );
  34. int offset_to_bones = GetU32LE( 0x0c );
  35. int offset_to_parts = GetU32LE( 0x10 );
  36. Ogre::Bone* root1 = skeleton->createBone( "0", 0 );
  37. Ogre::Bone* root2 = skeleton->createBone( "1", 1 );
  38. root1->addChild( root2 );
  39. for( int i = 0; i < number_of_bones; ++i )
  40. {
  41. Bone bone;
  42. bone.parent_id = ( i != 0 ) ? ( s8 )GetU8( offset_to_bones + i * 0x04 + 0x03 ) : -1;
  43. bone.length = ( s16 )GetU16LE( offset_to_bones + i * 0x04 + 0x00 );
  44. m_Skeleton.push_back(bone);
  45. Ogre::Bone* bone1 = skeleton->createBone( Ogre::StringConverter::toString( i * 2 + 2 ), i * 2 + 2 );
  46. Ogre::Bone* bone2 = skeleton->createBone( Ogre::StringConverter::toString( i * 2 + 3 ), i * 2 + 3 );
  47. LOGGER->Log( "Add skeleton bone: bone_id = " + Ogre::StringConverter::toString( i ) + ", length = " + Ogre::StringConverter::toString( bone.length ) + ", parent = " + Ogre::StringConverter::toString( bone.parent_id ) + ".\n" );
  48. if( bone.parent_id == -1 )
  49. {
  50. skeleton->getBone( 1 )->addChild( bone1 );
  51. }
  52. else
  53. {
  54. skeleton->getBone( bone.parent_id * 2 + 3 )->addChild( bone1 );
  55. }
  56. bone1->addChild( bone2 );
  57. }
  58. AnimationExtractor( skeleton, info, m_Skeleton );
  59. // draw skeleton
  60. {
  61. //DrawSkeleton( m_Skeleton, mesh );
  62. }
  63. for( int i = 0; i < number_of_parts; ++i )
  64. {
  65. MeshExtractor( info.data, "ffix/field_model/" + info.data.name, this, offset_to_parts + i * 0x28, textures, mesh );
  66. }
  67. // <OGRE> ///////////////////////////////
  68. skeleton->optimiseAllAnimations();
  69. Ogre::SkeletonSerializer skeleton_serializer;
  70. skeleton_serializer.exportSkeleton( skeleton.getPointer(), "exported/models/field/units/" + info.data.name + ".skeleton" );
  71. // Update bounds
  72. Ogre::AxisAlignedBox aabb( -999, -999, -999, 999, 999, 999 );
  73. mesh->_setBounds( aabb, false );
  74. mesh->_setBoundingSphereRadius( 999 );
  75. mesh->setSkeletonName( "models/field/units/" + info.data.name + ".skeleton" );
  76. Ogre::MeshSerializer ser;
  77. ser.exportMesh( mesh.getPointer(), "exported/models/field/units/" + info.data.name + ".mesh" );
  78. // create and export textures for model
  79. //if (textures.size() > 0)
  80. {
  81. Vram* vram = Vram::MakeInstance().release();
  82. File* tex = new File( "./data/field/5/1b/2/4/1.tim" );
  83. LoadTimFileToVram( tex, 0, vram );
  84. delete tex;
  85. tex = new File( "./data/field/5/1b/2/4/2.tim" );
  86. LoadTimFileToVram( tex, 0, vram );
  87. delete tex;
  88. vram->Save( "1.jpg" );
  89. CreateTexture( vram, info.data, "exported/models/field/units/" + info.data.name + ".png", textures );
  90. delete vram;
  91. }
  92. CreateMaterial( "ffix/field_model/" + info.data.name, "exported/models/field/units/" + info.data.name + ".material", ( textures.size() > 0 ) ? "models/field/units/" + info.data.name + ".png" : "", "", "" );
  93. Ogre::SceneManager* scene_manager = Ogre::Root::getSingleton().getSceneManager( "Scene" );
  94. Ogre::Entity* thisEntity = scene_manager->createEntity( info.data.name, "models/field/units/" + info.data.name + ".mesh" );
  95. //thisEntity->setDisplaySkeleton(true);
  96. //thisEntity->setDebugDisplayEnabled(true);
  97. thisEntity->setVisible( false );
  98. thisEntity->getAnimationState( info.animations_name[ 0 ] )->setEnabled(true);
  99. thisEntity->getAnimationState( info.animations_name[ 0 ] )->setLoop(true);
  100. Ogre::SceneNode* thisSceneNode = scene_manager->getRootSceneNode()->createChildSceneNode();
  101. thisSceneNode->setPosition( 0, 0, 0 );
  102. thisSceneNode->roll( Ogre::Radian( Ogre::Degree( 180.0f ) ) );
  103. thisSceneNode->yaw( Ogre::Radian( Ogre::Degree( 120.0f ) ) );
  104. thisSceneNode->pitch( Ogre::Radian( Ogre::Degree(90.0f ) ) );
  105. thisSceneNode->attachObject( thisEntity );
  106. return thisEntity;
  107. }