SkeletonPtr StatefulSkeletonSerializer::loadSkeleton(const String& name) { // Resource already created upon mesh loading? mSkeleton = SkeletonManager::getSingleton().getByName(name); if (mSkeleton.isNull()) { // Nope. We create it here then. mSkeleton = SkeletonManager::getSingleton().create(name, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); } mSkeleton = SkeletonPtr(new EditableSkeleton(*mSkeleton.getPointer())); std::ifstream ifs; ifs.open(name.c_str(), std::ios_base::in | std::ios_base::binary); if (!ifs) { throw std::ios_base::failure(("cannot open file " + name).c_str()); } DataStreamPtr stream(new FileStreamDataStream(name, &ifs, false)); determineFileFormat(stream); importSkeleton(stream, mSkeleton.getPointer()); ifs.close(); return mSkeleton; }
void MeshCombiner::consoleMeshCombiner() { StringVector vec = m_MeshCombinerConfig->getMultiSetting( "Mesh" ); if( vec.empty() ) return; MergeMesh* mm = new MergeMesh(); SkeletonPtr skel = SkeletonPtr(); for( StringVector::iterator it = vec.begin(); it != vec.end(); ++it ) { log( "Loading: " + *it ); try { MeshPtr mesh = MeshManager::getSingleton().load( *it, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); if( !mesh.isNull() ) mm->addMesh( mesh ); } catch( ... ) { } } // save MeshPtr mesh = mm->bake(); MeshSerializer* meshSerializer = new MeshSerializer(); meshSerializer->exportMesh( mesh.getPointer(), "./media/merged.mesh" ); MeshManager::getSingleton().remove( mesh->getHandle() ); // try to load... mesh = MeshManager::getSingleton().load( "merged.mesh", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); SceneManager* sm = Root::getSingleton().createSceneManager( ST_GENERIC ); // try to place... sm->getRootSceneNode()->attachObject( sm->createEntity( "test", "merged.mesh" ) ); delete meshSerializer; delete mm; }
SkeletonPtr AssetLoader::LoadSkeleton(std::string fileName) { FILE * f; fopen_s(&f,fileName.c_str(),"rb"); unsigned int number; fread_s(&number,4,4,1,f); if(number != 50) { fclose(f); return SkeletonPtr(true); } unsigned int meshesCount; fread_s(&meshesCount,4,4,1,f); int vertCount; int indCount; for(unsigned int i = 0; i < meshesCount; i++) { fread_s(&vertCount,4,4,1,f); fseek(f,(sizeof(AnimatedVert) * vertCount),SEEK_CUR); fread_s(&indCount,4,4,1,f); fseek(f,(4 * indCount),SEEK_CUR); } DirectX::XMFLOAT4X4 mat; SkeletonPtr ptr(Heap::GetPtr()->Skeletons.New()); Skeleton * skeleton = ptr.Get(); skeleton->Init(); fread_s(&skeleton->globalInverse,64,64,1,f); fread_s(&skeleton->numberOfBones,4,4,1,f); skeleton->bones = new Bone[skeleton->numberOfBones]; int index; for(unsigned int i = 0; i<skeleton->numberOfBones; i++) { skeleton->bones[i].name = "name"; fread_s(&skeleton->bones[i].offsetMatrix,64,64,1,f); fread_s(&skeleton->bones[i].transformation,64,64,1,f); int childCount; fread_s(&childCount,4,4,1,f); if(childCount > 0) { for(int ch = 0; ch < childCount; ch++) { fread_s(&index,4,4,1,f); skeleton->bones[i].childIndexes.push_back(index); } } } fclose(f); return ptr; }