Exemple #1
0
//-------------------------------------------------------------------------------
int CMaterialManager::FindValidPath(aiString* p_szString)
{
	ai_assert(0 != p_szString);
	////LOG_PRINT("p_szString->data:%s\n", p_szString->data);
	aiString pcpy = *p_szString;
	if ('*' ==  p_szString->data[0])	{
		// '*' as first character indicates an embedded file
		return 5;
	}
	
	char szTemp[MAX_PATH];
	std::string szTemp2, szTemp3;
	
	szTemp2.append(mr->m_szPathTex1);
	szTemp3.append(mr->m_szPathTex2);
#ifdef _MSC_VER
	szTemp2.append("\\\\");
	szTemp3.append("\\\\");
#else
	szTemp2.append("/");
	szTemp3.append("/");
#endif
	
	unsigned int i=0;
	
	if(stx_strlen(p_szString->data)>1)
	if(p_szString->data[0]=='.')
	{
		
		if(p_szString->data[1]=='\\')
			i=2;
		else if(p_szString->data[1]=='/')
			i=2;
			
	}

	
	szTemp2.append(p_szString->data+i);
	
	szTemp3.append(p_szString->data+i);

	
	stx_strlcpy(szTemp, szTemp2.c_str(), MAX_PATH);

	// first check whether we can directly load the file
	//LOG_PRINT("MeshRenderer:Material.cpp:fopen2:%s\n", szTemp2.c_str());
	
	LOG_PRINT("MeshRenderer:Material.cpp:fopen3:%s\n", szTemp3.c_str());

	
	FILE* pFile = fopen(szTemp3.c_str(),"rb");
	#if 0
	if (
		!
		stx_isopened(pFile))
		//fclose(pFile);
	//else
	{
		// check whether we can use the directory of  the asset as relative base
		char szTemp[MAX_PATH], tmp2[MAX_PATH];
		stx_strlcpy(szTemp, mr->m_szFileNameMesh.c_str(),MAX_PATH);

		char* szData = p_szString->data;
		if (*szData == stx_getOsSeparator() || *szData == stx_getOsSeparator())++szData;

		char* szEnd = stx_strrchr(szTemp,stx_getOsSeparator());
		if (!szEnd)
		{
			szEnd = stx_strrchr(szTemp,stx_getOsSeparator());
			if (!szEnd)szEnd = szTemp;
		}
		szEnd++;
		*szEnd = 0;
		stx_strlcat(szEnd,szData,MAX_PATH);

		stx_strlcpy(tmp2,stx_convertpath(mr->m_szFileNameTex.c_str(), 0),MAX_PATH);

		//LOG_PRINT("MeshRenderer:Material.cpp:fopen2:%s\n", tmp2);

		pFile = fopen(szTemp,"rb");
		#if 1
		if (!pFile)
		{
			// convert the string to lower case
			for (unsigned int i = 0;;++i)
			{
				if ('\0' == szTemp[i])break;
				szTemp[i] = (char)tolower(szTemp[i]);
			}

			if(TryLongerPath(szTemp,p_szString))return 1;
			*szEnd = 0;

			// search common sub directories
			stx_strlcat(szEnd,"tex\\",MAX_PATH);
			stx_strlcat(szEnd,szData,MAX_PATH);

			//LOG_PRINT("MeshRenderer:Material.cpp:fopen3:%s\n", szTemp);
			pFile = fopen(szTemp, "rb");
			if (!pFile)
			{
				if(TryLongerPath(szTemp,p_szString))return 1;

				*szEnd = 0;

				stx_strlcat(szEnd,"textures\\",MAX_PATH);
				stx_strlcat(szEnd,szData,MAX_PATH);

				//LOG_PRINT("MeshRenderer:Material.cpp:fopen4:%s\n", szTemp);
				pFile = fopen(szTemp, "rb");
				if (!pFile)
				{
					if(TryLongerPath(szTemp, p_szString))return 1;
				}

				// patch by mark sibly to look for textures files in the asset's base directory.
				const char *path=pcpy.data;
				const char *p=stx_strrchr( path,stx_getOsSeparator() );
				if( !p ) p=stx_strrchr( path,stx_getOsSeparator() );
				if( p ){
					char *q=stx_strrchr( tmp2,stx_getOsSeparator() );
					if( !q ) q=stx_strrchr( tmp2,stx_getOsSeparator() );
					if( q ){
						stx_strlcpy( q+1,p+1,MAX_PATH );
       						//LOG_PRINT("MeshRenderer:Material.cpp:fopen5:%s\n", tmp2);                 			
						if(pFile==fopen( tmp2,"r" ) ){
							fclose( pFile );
							stx_strlcpy(p_szString->data,tmp2,MAX_PATH);
							p_szString->length = strlen(tmp2);
							return 1;
						}
					}
				}
				return 0;
			}
			
		}
		#endif
		fclose(pFile);

		// copy the result string back to the aiString
		const size_t iLen = strlen(szTemp);
		size_t iLen2 = iLen+1;
		iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2;
		stx_memcpy(p_szString->data,szTemp,iLen2);
		p_szString->length = iLen;

	}
	#endif

		fclose(pFile);

		// copy the result string back to the aiString
		const size_t iLen = strlen(szTemp);

		size_t iLen2 = iLen+1;
		iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2;
		stx_memcpy(p_szString->data,szTemp,iLen2);

		p_szString->length = iLen;
	return 1;
}
Exemple #2
0
//-------------------------------------------------------------------------------
int CMaterialManager::FindValidPath(aiString* p_szString)
{
    ai_assert(NULL != p_szString);
    aiString pcpy = *p_szString;
    if ('*' ==  p_szString->data[0])    {
        // '*' as first character indicates an embedded file
        return 5;
    }

    // first check whether we can directly load the file
    FILE* pFile = fopen(p_szString->data,"rb");
    if (pFile)fclose(pFile);
    else
    {
        // check whether we can use the directory of  the asset as relative base
        char szTemp[MAX_PATH*2], tmp2[MAX_PATH*2];
        strcpy(szTemp, g_szFileName);
        strcpy(tmp2,szTemp);

        char* szData = p_szString->data;
        if (*szData == '\\' || *szData == '/')++szData;

        char* szEnd = strrchr(szTemp,'\\');
        if (!szEnd)
        {
            szEnd = strrchr(szTemp,'/');
            if (!szEnd)szEnd = szTemp;
        }
        szEnd++;
        *szEnd = 0;
        strcat(szEnd,szData);


        pFile = fopen(szTemp,"rb");
        if (!pFile)
        {
            // convert the string to lower case
            for (unsigned int i = 0;;++i)
            {
                if ('\0' == szTemp[i])break;
                szTemp[i] = (char)tolower(szTemp[i]);
            }

            if(TryLongerPath(szTemp,p_szString))return 1;
            *szEnd = 0;

            // search common sub directories
            strcat(szEnd,"tex\\");
            strcat(szEnd,szData);

            pFile = fopen(szTemp,"rb");
            if (!pFile)
            {
                if(TryLongerPath(szTemp,p_szString))return 1;

                *szEnd = 0;

                strcat(szEnd,"textures\\");
                strcat(szEnd,szData);

                pFile = fopen(szTemp,"rb");
                if (!pFile)
                {
                    if(TryLongerPath(szTemp, p_szString))return 1;
                }

                // patch by mark sibly to look for textures files in the asset's base directory.
                const char *path=pcpy.data;
                const char *p=strrchr( path,'/' );
                if( !p ) p=strrchr( path,'\\' );
                if( p ){
                    char *q=strrchr( tmp2,'/' );
                    if( !q ) q=strrchr( tmp2,'\\' );
                    if( q ){
                        strcpy( q+1,p+1 );
                        if((pFile=fopen( tmp2,"r" ))){
                            fclose( pFile );
                            strcpy(p_szString->data,tmp2);
                            p_szString->length = strlen(tmp2);
                            return 1;
                        }
                    }
                }
                return 0;
            }
        }
        fclose(pFile);

        // copy the result string back to the aiString
        const size_t iLen = strlen(szTemp);
        size_t iLen2 = iLen+1;
        iLen2 = iLen2 > MAXLEN ? MAXLEN : iLen2;
        memcpy(p_szString->data,szTemp,iLen2);
        p_szString->length = iLen;

    }
    return 1;
}