/// LOAD void FileData::loadFile( const bool FORCE_RELOAD ) { if( isProcessed() && FORCE_RELOAD ) { std::string filename = getFileName(); reset(); setFileName( filename ); } if( !isInitialized() ) { return; } // File extension check // - If we decide to deal with user-defined file, here we should check if we are dealing with one of them or not Assimp::Importer importer; const aiScene* scene = importer.ReadFile( getFileName(), aiProcess_Triangulate | // This could/should be taken away if we want to deal with mesh types other than trimehses aiProcess_JoinIdenticalVertices | aiProcess_GenSmoothNormals | aiProcess_SortByPType | aiProcess_FixInfacingNormals | aiProcess_CalcTangentSpace | aiProcess_GenUVCoords ); // File was not loaded if( scene == nullptr ) { LOG( logERROR ) << "Error while loading file \"" << getFileName() << "\" : " << importer.GetErrorString() << "."; return; } if( m_verbose ) { LOG(logINFO) << "File Loading begin..."; } std::clock_t startTime; startTime = std::clock(); AssimpGeometryDataLoader geometryLoader( Core::StringUtils::getDirName( getFileName() ), m_verbose ); geometryLoader.loadData( scene, m_geometryData ); AssimpHandleDataLoader handleLoader( m_verbose ); handleLoader.loadData( scene, m_handleData ); AssimpAnimationDataLoader animationLoader( m_verbose ); animationLoader.loadData( scene, m_animationData ); m_loadingTime = ( std::clock() - startTime ) / Scalar( CLOCKS_PER_SEC ); if( m_verbose ) { LOG(logINFO) << "File Loading end."; displayInfo(); } m_processed = true; }
/*! * \internal */ QGeometry *MeshLoaderFunctor::operator()() { if (m_sourcePath.isEmpty()) { qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh is empty, nothing to load"; return nullptr; } QStringList ext; if (!Qt3DCore::QDownloadHelperService::isLocal(m_sourcePath)) { if (m_sourceData.isEmpty()) { if (m_mesh) { // Output a warning in the case a user is calling the functor directly // in the frontend if (m_nodeManagers == nullptr || m_downloaderService == nullptr) { qWarning() << "Mesh source points to a remote URL. Remotes meshes can only be loaded if the geometry is processed by the Qt3DRender backend"; return nullptr; } Qt3DCore::QDownloadRequestPtr request(new MeshDownloadRequest(m_mesh, m_sourcePath, m_nodeManagers)); m_downloaderService->submitRequest(request); } return nullptr; } QMimeDatabase db; QMimeType mtype = db.mimeTypeForData(m_sourceData); if (mtype.isValid()) { ext = mtype.suffixes(); } QFileInfo finfo(m_sourcePath.path()); ext << finfo.suffix(); ext.removeAll(QLatin1String("")); if (!ext.contains(QLatin1String("obj"))) ext << QLatin1String("obj"); } else { QString filePath = Qt3DRender::QUrlHelper::urlToLocalFileOrQrc(m_sourcePath); QFileInfo finfo(filePath); if (finfo.suffix().isEmpty()) ext << QLatin1String("obj"); else ext << finfo.suffix(); } QScopedPointer<QGeometryLoaderInterface> loader; for (const QString &e: qAsConst(ext)) { loader.reset(qLoadPlugin<QGeometryLoaderInterface, QGeometryLoaderFactory>(geometryLoader(), e)); if (loader) break; } if (!loader) { qCWarning(Render::Jobs, "unsupported format encountered (%s)", qPrintable(ext.join(QLatin1String(", ")))); return nullptr; } if (m_sourceData.isEmpty()) { QString filePath = Qt3DRender::QUrlHelper::urlToLocalFileOrQrc(m_sourcePath); QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { qCDebug(Render::Jobs) << "Could not open file" << filePath << "for reading"; return nullptr; } if (loader->load(&file, m_meshName)) return loader->geometry(); qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh loading failure for:" << filePath; } else { QT_PREPEND_NAMESPACE(QBuffer) buffer(&m_sourceData); if (!buffer.open(QIODevice::ReadOnly)) { return nullptr; } if (loader->load(&buffer, m_meshName)) return loader->geometry(); qCWarning(Render::Jobs) << Q_FUNC_INFO << "Mesh loading failure for:" << m_sourcePath; } return nullptr; }