Loading Meshes From Any Path         Sometimes we need to load mesh files just like "open file" from any local path, which is not predefined in the resource file

Usually the paths of resources - including meshes - should be defined in the resource.cfg file. However, sometimes we need to load mesh files just like "open file" from any local path, which is not predefined in the resource file. The following code snippet shows to accomplish that.

For a similar example using FileStreamDataStream see the wiki article Loading skeletons from any path.

// "source" should contain the pathname to your mesh file 
Ogre::String source;

/* 
   An alternate (better) way of doing the following would be to 
   use the FileStreamDataStream class, which avoids having to use
   the more esoteric "stat" struct and stdio APIs. For more, see
   http://stderr.org/doc/ogre-doc/api/classOgre_1_1FileStreamDataStream.html

   This prevents having to create and fill a MemoryDataStream instance, as 
   the FileStreamDataStream can be used directly in the "stream" c'tor below.
*/
FILE* pFile = fopen( source.c_str(), "rb" );
if (!pFile)
    OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,"File " + source + " not found.", "OgreMeshLoaded");

struct stat tagStat;
stat( source.c_str(), &tagStat );
MemoryDataStream* memstream = new MemoryDataStream(source, tagStat.st_size, true);
fread( (void*)memstream->getPtr(), tagStat.st_size, 1, pFile );
fclose( pFile );

// give the resource a name -- it can be the full pathname if you like, since it's 
// just going to be the key in an STL associative tree container
MeshPtr pMesh = MeshManager::getSingleton().createManual("LocalMesh",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

// this part does the actual load into the live Mesh object created above
MeshSerializer meshSerializer;
DataStreamPtr stream(memstream);
meshSerializer.importMesh(stream, pMesh.getPointer());

// and finally, now that we have a named Mesh resource, we can use it
// in our createEntity() call...
Entity* pF35_1 = m_pSceneMgr->createEntity("LocalMesh_Ent", "LocalMesh");


Alias: Loading_Meshes_From_Any_Path