//------------------------------------------------------------------------------- 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; }
//------------------------------------------------------------------------------- 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; }