void skeletonToXML(XmlOptions opts) { std::ifstream ifs; ifs.open(opts.source.c_str(), std::ios_base::in | std::ios_base::binary); if (ifs.bad()) { cout << "Unable to load file " << opts.source << endl; exit(1); } SkeletonPtr skel = SkeletonManager::getSingleton().create("conversion", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); // pass false for freeOnClose to FileStreamDataStream since ifs is created locally on stack DataStreamPtr stream(new FileStreamDataStream(opts.source, &ifs, false)); skeletonSerializer->importSkeleton(stream, skel.getPointer()); xmlSkeletonSerializer->exportSkeleton(skel.getPointer(), opts.dest); // Clean up the conversion skeleton SkeletonManager::getSingleton().remove("conversion"); }
void MeshCombiner::consoleSkeletonCombiner() { StringVector vec = m_MeshCombinerConfig->getMultiSetting( "Skeleton" ); if( vec.empty() ) return; MergeSkeleton* ms = new MergeSkeleton(); for( StringVector::iterator it = vec.begin(); it != vec.end(); ++it ) { log( "Loading: " + *it ); try { SkeletonPtr skel = SkeletonManager::getSingleton().load( *it, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); if( !skel.isNull() ) ms->addSkeleton( skel ); } catch( ... ) { } } // save SkeletonPtr skel = ms->bake(); SkeletonSerializer* skelSerializer = new SkeletonSerializer(); skelSerializer->exportSkeleton( skel.getPointer(), "./media/merged.skeleton" ); SkeletonManager::getSingleton().remove( skel->getHandle() ); delete skelSerializer; delete ms; }
void XMLToBinary(XmlOptions opts) { // Read root element and decide from there what type String response; TiXmlDocument* doc = new TiXmlDocument(opts.source); // Some double-parsing here but never mind if (!doc->LoadFile()) { cout << "Unable to open file " << opts.source << " - fatal error." << endl; delete doc; exit (1); } TiXmlElement* root = doc->RootElement(); if (!stricmp(root->Value(), "mesh")) { delete doc; MeshPtr newMesh = MeshManager::getSingleton().createManual("conversion", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); VertexElementType colourElementType; if (opts.d3d) colourElementType = VET_COLOUR_ARGB; else colourElementType = VET_COLOUR_ABGR; xmlMeshSerializer->importMesh(opts.source, colourElementType, newMesh.getPointer()); // Re-jig the buffers? // Make sure animation types are up to date first newMesh->_determineAnimationTypes(); if (opts.reorganiseBuffers) { logMgr->logMessage("Reorganising vertex buffers to automatic layout..."); // Shared geometry if (newMesh->sharedVertexData) { // Automatic VertexDeclaration* newDcl = newMesh->sharedVertexData->vertexDeclaration->getAutoOrganisedDeclaration( newMesh->hasSkeleton(), newMesh->hasVertexAnimation(), newMesh->getSharedVertexDataAnimationIncludesNormals()); if (*newDcl != *(newMesh->sharedVertexData->vertexDeclaration)) { // Usages don't matter here since we're onlly exporting BufferUsageList bufferUsages; for (size_t u = 0; u <= newDcl->getMaxSource(); ++u) bufferUsages.push_back(HardwareBuffer::HBU_STATIC_WRITE_ONLY); newMesh->sharedVertexData->reorganiseBuffers(newDcl, bufferUsages); } } // Dedicated geometry Mesh::SubMeshIterator smIt = newMesh->getSubMeshIterator(); while (smIt.hasMoreElements()) { SubMesh* sm = smIt.getNext(); if (!sm->useSharedVertices) { const bool hasVertexAnim = sm->getVertexAnimationType() != Ogre::VAT_NONE; // Automatic VertexDeclaration* newDcl = sm->vertexData->vertexDeclaration->getAutoOrganisedDeclaration( newMesh->hasSkeleton(), hasVertexAnim, sm->getVertexAnimationIncludesNormals()); if (*newDcl != *(sm->vertexData->vertexDeclaration)) { // Usages don't matter here since we're onlly exporting BufferUsageList bufferUsages; for (size_t u = 0; u <= newDcl->getMaxSource(); ++u) bufferUsages.push_back(HardwareBuffer::HBU_STATIC_WRITE_ONLY); sm->vertexData->reorganiseBuffers(newDcl, bufferUsages); } } } } if( opts.mergeTexcoordResult != opts.mergeTexcoordToDestroy ) { newMesh->mergeAdjacentTexcoords( uint16(opts.mergeTexcoordResult), uint16(opts.mergeTexcoordToDestroy) ); } if (opts.nuextremityPoints) { Mesh::SubMeshIterator smIt = newMesh->getSubMeshIterator(); while (smIt.hasMoreElements()) { SubMesh* sm = smIt.getNext(); sm->generateExtremes (opts.nuextremityPoints); } } meshSerializer->exportMesh(newMesh.getPointer(), opts.dest, opts.endian); // Clean up the conversion mesh MeshManager::getSingleton().remove("conversion"); } else if (!stricmp(root->Value(), "skeleton")) { delete doc; SkeletonPtr newSkel = SkeletonManager::getSingleton().create("conversion", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); xmlSkeletonSerializer->importSkeleton(opts.source, newSkel.getPointer()); if (opts.optimiseAnimations) { newSkel->optimiseAllAnimations(); } skeletonSerializer->exportSkeleton(newSkel.getPointer(), opts.dest, SKELETON_VERSION_LATEST, opts.endian); // Clean up the conversion skeleton SkeletonManager::getSingleton().remove("conversion"); } else { delete doc; } }