示例#1
0
	//-----------------------------------------------------------------------
	FileInfoListPtr Utf8Archive::findFileInfo(const String& _pattern, bool _recursive, bool _dirs)
	{
		String pattern2 = _pattern;
		StringUtil::utf8ToAnsi(pattern2);
		FileInfoListPtr ret = mBaseArchive->findFileInfo(pattern2, _recursive, _dirs);
		for(size_t i = 0; i != ret->size(); ++i)
		{
			FileInfo& fi = (*ret)[i];
			StringUtil::ansiToUtf8(fi.basename);
			StringUtil::ansiToUtf8(fi.filename);
			StringUtil::ansiToUtf8(fi.path);
		}
		return ret;		
	}
示例#2
0
文件: OgreZip.cpp 项目: wjwwood/ogre
    //-----------------------------------------------------------------------
    DataStreamPtr ZipArchive::open(const String& filename, bool readOnly) const
    {
        // zziplib is not threadsafe
        OGRE_LOCK_AUTO_MUTEX;
        String lookUpFileName = filename;

#if OGRE_RESOURCEMANAGER_STRICT
        const int flags = 0;
#else
        const int flags = ZZIP_CASELESS;
#endif

        // Format not used here (always binary)
        ZZIP_FILE* zzipFile =
            zzip_file_open(mZzipDir, lookUpFileName.c_str(), ZZIP_ONLYZIP | flags);

#if !OGRE_RESOURCEMANAGER_STRICT
        if (!zzipFile) // Try if we find the file
        {
            String basename, path;
            StringUtil::splitFilename(lookUpFileName, basename, path);
            const FileInfoListPtr fileNfo = findFileInfo(basename, true);
            if (fileNfo->size() == 1) // If there are more files with the same do not open anyone
            {
                Ogre::FileInfo info = fileNfo->at(0);
                lookUpFileName = info.path + info.basename;
                zzipFile = zzip_file_open(mZzipDir, lookUpFileName.c_str(), ZZIP_ONLYZIP | flags); // When an error happens here we will catch it below
            }
        }
#endif

        if (!zzipFile)
        {
            int zerr = zzip_error(mZzipDir);
            String zzDesc = getZzipErrorDescription((zzip_error_t)zerr);

            OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
                    mName+ " Cannot open file: " + lookUpFileName + " - "+zzDesc, "ZipArchive::open");
        }

        // Get uncompressed size too
        ZZIP_STAT zstat;
        zzip_dir_stat(mZzipDir, lookUpFileName.c_str(), &zstat, flags);

        // Construct & return stream
        return DataStreamPtr(OGRE_NEW ZipDataStream(lookUpFileName, zzipFile, static_cast<size_t>(zstat.st_size)));

    }
示例#3
0
Ogre::String GUIManager::getRandomWallpaperImage()
{
	
	FileInfoListPtr files = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("Wallpapers", "*.jpg", false);
	if(files.isNull() || files->empty())
	{
		return "";
	}
	srand ( time(NULL) );

	int num = 0;
	for(int i = 0; i<Ogre::Math::RangeRandom(0, 10); i++)
		num = Ogre::Math::RangeRandom(0, files->size());

	return files->at(num).filename;
}
示例#4
0
void ZipArchiveTests::testListFileInfoRecursive()
{
    ZipArchive arch(testPath, "Zip");
    arch.load();
    FileInfoListPtr vec = arch.listFileInfo(true);

    CPPUNIT_ASSERT_EQUAL((size_t)6, vec->size());
    FileInfo& fi3 = vec->at(0);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file.material"), fi3.filename);
    CPPUNIT_ASSERT_EQUAL(String("file.material"), fi3.basename);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi3.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.uncompressedSize);

    FileInfo& fi4 = vec->at(1);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file2.material"), fi4.filename);
    CPPUNIT_ASSERT_EQUAL(String("file2.material"), fi4.basename);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi4.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.uncompressedSize);


    FileInfo& fi5 = vec->at(2);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file3.material"), fi5.filename);
    CPPUNIT_ASSERT_EQUAL(String("file3.material"), fi5.basename);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi5.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.uncompressedSize);

    FileInfo& fi6 = vec->at(3);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file4.material"), fi6.filename);
    CPPUNIT_ASSERT_EQUAL(String("file4.material"), fi6.basename);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi6.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.uncompressedSize);

    FileInfo& fi1 = vec->at(4);
    CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.filename);
    CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.basename);
    CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi1.path);
    CPPUNIT_ASSERT_EQUAL((size_t)40, fi1.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)130, fi1.uncompressedSize);

    FileInfo& fi2 = vec->at(5);
    CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.filename);
    CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.basename);
    CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi2.path);
    CPPUNIT_ASSERT_EQUAL((size_t)45, fi2.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)156, fi2.uncompressedSize);

}
示例#5
0
void ZipArchiveTests::testListFileInfoNonRecursive()
{
    ZipArchive arch(testPath, "Zip");
    arch.load();
    FileInfoListPtr vec = arch.listFileInfo(false);

    CPPUNIT_ASSERT_EQUAL((size_t)2, vec->size());
    FileInfo& fi1 = vec->at(0);
    CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.filename);
    CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.basename);
    CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi1.path);
    CPPUNIT_ASSERT_EQUAL((size_t)40, fi1.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)130, fi1.uncompressedSize);

    FileInfo& fi2 = vec->at(1);
    CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.filename);
    CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.basename);
    CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi2.path);
    CPPUNIT_ASSERT_EQUAL((size_t)45, fi2.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)156, fi2.uncompressedSize);
}
示例#6
0
文件: OgreZip.cpp 项目: wjwwood/ogre
    //-----------------------------------------------------------------------
    FileInfoListPtr ZipArchive::findFileInfo(const String& pattern, 
        bool recursive, bool dirs) const
    {
        OGRE_LOCK_AUTO_MUTEX;
        FileInfoListPtr ret = FileInfoListPtr(OGRE_NEW_T(FileInfoList, MEMCATEGORY_GENERAL)(), SPFM_DELETE_T);
        // If pattern contains a directory name, do a full match
        bool full_match = (pattern.find ('/') != String::npos) ||
                          (pattern.find ('\\') != String::npos);
        bool wildCard = pattern.find("*") != String::npos;

        FileInfoList::const_iterator i, iend;
        iend = mFileList.end();
        for (i = mFileList.begin(); i != iend; ++i)
            if ((dirs == (i->compressedSize == size_t (-1))) &&
                (recursive || full_match || wildCard))
                // Check name matches pattern (zip is case insensitive)
                if (StringUtil::match(full_match ? i->filename : i->basename, pattern, false))
                    ret->push_back(*i);

        return ret;
    }
示例#7
0
void ZipArchiveTests::testFindFileInfoRecursive()
{
    ZipArchive arch(testPath, "Zip");
    arch.load();
    FileInfoListPtr vec = arch.findFileInfo("*.material", true);

    CPPUNIT_ASSERT_EQUAL((size_t)4, vec->size());

    FileInfo& fi3 = vec->at(0);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file.material"), fi3.filename);
    CPPUNIT_ASSERT_EQUAL(String("file.material"), fi3.basename);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi3.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.uncompressedSize);

    FileInfo& fi4 = vec->at(1);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file2.material"), fi4.filename);
    CPPUNIT_ASSERT_EQUAL(String("file2.material"), fi4.basename);
    CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi4.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.uncompressedSize);


    FileInfo& fi5 = vec->at(2);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file3.material"), fi5.filename);
    CPPUNIT_ASSERT_EQUAL(String("file3.material"), fi5.basename);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi5.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.uncompressedSize);

    FileInfo& fi6 = vec->at(3);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file4.material"), fi6.filename);
    CPPUNIT_ASSERT_EQUAL(String("file4.material"), fi6.basename);
    CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi6.path);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.compressedSize);
    CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.uncompressedSize);
}
示例#8
0
void MeshObject::postProcess()
{
    loaded=true;
    if(!sceneNode) return;

    // important: you need to add the LODs before creating the entity
    // now find possible LODs, needs to be done before calling createEntity()
    if(!mesh.isNull())
    {
        String basename, ext;
        StringUtil::splitBaseFilename(meshName, basename, ext);

        String group = ResourceGroupManager::getSingleton().findGroupContainingResource(meshName);

        // the classic LODs
        FileInfoListPtr files = ResourceGroupManager::getSingleton().findResourceFileInfo(group, basename + "_lod*.mesh");
        for (FileInfoList::iterator iterFiles = files->begin(); iterFiles!= files->end(); ++iterFiles)
        {
            String format = basename + "_lod%d.mesh";
            int i = -1;
            int r = sscanf(iterFiles->filename.c_str(), format.c_str(), &i);

            if(r <= 0 || i < 0) continue;

            float distance = 3;

            // we need to tune this according to our sightrange
            float sightrange = PARSEREAL(SSETTING("SightRange"));

            if(sightrange > 4999)
            {
                // unlimited
                if     (i == 1) distance =  200;
                else if(i == 2) distance =  600;
                else if(i == 3) distance = 2000;
                else if(i == 4) distance = 5000;
            } else
            {
                // limited
                if     (i == 1) distance = std::max(20.0f, sightrange * 0.1f);
                else if(i == 2) distance = std::max(20.0f, sightrange * 0.2f);
                else if(i == 3) distance = std::max(20.0f, sightrange * 0.3f);
                else if(i == 4) distance = std::max(20.0f, sightrange * 0.4f);
            }

            Ogre::MeshManager::getSingleton().load(iterFiles->filename, mesh->getGroup());
            mesh->createManualLodLevel(distance, iterFiles->filename);
        }

        // the custom LODs
        FileInfoListPtr files2 = ResourceGroupManager::getSingleton().findResourceFileInfo(group, basename + "_clod_*.mesh");
        for (FileInfoList::iterator iterFiles = files2->begin(); iterFiles!= files2->end(); ++iterFiles)
        {
            // and custom LODs
            String format = basename + "_clod_%d.mesh";
            int i = -1;
            int r = sscanf(iterFiles->filename.c_str(), format.c_str(), &i);
            if(r <= 0 || i < 0) continue;

            Ogre::MeshManager::getSingleton().load(iterFiles->filename, mesh->getGroup());
            mesh->createManualLodLevel(i, iterFiles->filename);
        }
    }

    // now create an entity around the mesh and attach it to the scene graph
    try
    {
        if(entityName.empty())
            ent = smgr->createEntity(meshName);
        else
            ent = smgr->createEntity(entityName, meshName);
        if(ent)
            sceneNode->attachObject(ent);
    } catch(Ogre::Exception& e)
    {
        LOG("error loading mesh: " + meshName + ": " + e.getFullDescription());
        return;
    }

    // then modify some things
    if(enableSimpleMaterial)
        MaterialFunctionMapper::replaceSimpleMeshMaterials(ent, simpleMatColour);

    if(skin)
        skin->replaceMeshMaterials(ent);

    if(mfm)
        mfm->replaceMeshMaterials(ent);

    if(!materialName.empty())
        ent->setMaterialName(materialName);

    // only set it if different from default (true)
    if(!castshadows && sceneNode && sceneNode->numAttachedObjects() > 0)
        sceneNode->getAttachedObject(0)->setCastShadows(castshadows);

    sceneNode->setVisible(visible);
}
	//--------------------------------------------------------------------------
	void DirectMusicPlayContext::play(bool _3D, const String& _filename, const String& _resourceGroup)
	{
		// Stop if played already
		stop();

		// Find the full path to the file.
		FileInfoListPtr fileinfos = ResourceGroupManager::getSingleton().findResourceFileInfo(_resourceGroup, _filename);
		if(fileinfos->empty())
			GOTHOGRE_EXCEPT(_filename << " - File not found.");
		FileInfo& fi = (*fileinfos)[0];
		String path = fi.archive->getName() + "/" + fi.path;

		// Convert the full path and the filename to UTF-16LE.
		CodepageConverter* utf16Conv = UnicodeUtil::openConverter("UTF-16LE");
		CodepageConverter::ByteBuffer bbFileName, bbPath;
		utf16Conv->unicodeToBuffer(bbFileName, fi.basename);
		utf16Conv->unicodeToBuffer(bbPath, path);
		bbPath.push_back(0);
		bbPath.push_back(0);
		bbFileName.push_back(0);
		bbFileName.push_back(0);
		WCHAR* wszPath = (WCHAR*) bbPath.data();
		WCHAR* wszFileName = (WCHAR*) bbFileName.data();

		// Set the search path.
		DXError::check(
			mLoader->SetSearchDirectory(
				GUID_DirectMusicAllTypes, // Types of files sought.
				wszPath, // Where to look.
				FALSE ) ); // Don't clear object data
		
		// Create a segment from the file.
		DXError::check(
			mLoader->LoadObjectFromFile(
				CLSID_DirectMusicSegment, // Class identifier.
				IID_IDirectMusicSegment8, // ID of desired interface.
				wszFileName,              // Filename.
				(LPVOID*) &mSegment ) );    // Pointer that receives interface.

		// Download instrumental data (DLS) to the audiopath.
		DXError::check(
			mSegment->Download( mAudioPath ) );

		// Begin playback of the segment.
		DXError::check(
			mPerformance->PlaySegmentEx(
				mSegment,       // Segment to play.
				NULL,           // Used for songs; not implemented.
				NULL,           // For transitions. 
				0,              // Flags.
				0,              // Start time; 0 is immediate.
				&mSegmentState, // Pointer that receives segment state.
				NULL,           // Object to stop.
				mAudioPath ) ); // Audiopath, if not default.

		// Write the new segment state to the static list
		sSSPCM.insert(mSegmentState, this);

		mPlaying = true;

		// Get playback length
		MUSIC_TIME mtLength;
		DXError::check( 
			mSegment->GetLength(&mtLength) );

		DXError::check( 
			mSegment->GetStartPoint(&mStartMusicTime) );

		mEndMusicTime = mtLength + mStartMusicTime;
	}