// ------------------------------------------------------------------- // Get material library from file. void ObjFileParser::getMaterialLib() { // Translate tuple m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd); if (m_DataIt == m_DataItEnd) return; char *pStart = &(*m_DataIt); while (m_DataIt != m_DataItEnd && !isNewLine(*m_DataIt)) m_DataIt++; // Check for existence const std::string strMatName(pStart, &(*m_DataIt)); IOStream *pFile = m_pIO->Open(strMatName); if (!pFile ) { DefaultLogger::get()->error("OBJ: Unable to locate material file " + strMatName); m_DataIt = skipLine<DataArrayIt>( m_DataIt, m_DataItEnd, m_uiLine ); return; } // Import material library data from file std::vector<char> buffer; BaseImporter::TextFileToBuffer(pFile,buffer); m_pIO->Close( pFile ); // Importing the material library ObjFileMtlImporter mtlImporter( buffer, strMatName, m_pModel ); }
// ------------------------------------------------------------------- // Get material library from file. void ObjFileParser::getMaterialLib() { // Translate tuple m_DataIt = getNextToken<DataArrayIt>(m_DataIt, m_DataItEnd); if( m_DataIt == m_DataItEnd ) { return; } char *pStart = &(*m_DataIt); while( m_DataIt != m_DataItEnd && !IsLineEnd( *m_DataIt ) ) { ++m_DataIt; } // Check for existence const std::string strMatName(pStart, &(*m_DataIt)); std::string absName; if ( m_pIO->StackSize() > 0 ) { std::string path = m_pIO->CurrentDirectory(); if ( '/' != *path.rbegin() ) { path += '/'; } absName = path + strMatName; } else { absName = strMatName; } IOStream *pFile = m_pIO->Open( absName ); if (!pFile ) { DefaultLogger::get()->error("OBJ: Unable to locate material file " + strMatName); std::string strMatFallbackName = m_originalObjFileName.substr(0, m_originalObjFileName.length() - 3) + "mtl"; DefaultLogger::get()->info("OBJ: Opening fallback material file " + strMatFallbackName); pFile = m_pIO->Open(strMatFallbackName); if (!pFile) { DefaultLogger::get()->error("OBJ: Unable to locate fallback material file " + strMatName); m_DataIt = skipLine<DataArrayIt>(m_DataIt, m_DataItEnd, m_uiLine); return; } } // Import material library data from file. // Some exporters (e.g. Silo) will happily write out empty // material files if the model doesn't use any materials, so we // allow that. std::vector<char> buffer; BaseImporter::TextFileToBuffer( pFile, buffer, BaseImporter::ALLOW_EMPTY ); m_pIO->Close( pFile ); // Importing the material library ObjFileMtlImporter mtlImporter( buffer, strMatName, m_pModel ); }