| 1323 | } |
| 1324 | |
| 1325 | Expected<LoadedObjects> loadObjectFromObj( const std::filesystem::path& file, const ProgressCallback& cb ) |
| 1326 | { |
| 1327 | return fromSceneObjFile( file, false, { .customXf = true, .countSkippedFaces = true, .callback = cb } ) |
| 1328 | .transform( [&] ( std::vector<NamedMesh>&& results ) |
| 1329 | { |
| 1330 | int totalSkippedFaceCount = 0; |
| 1331 | int totalDuplicatedVertexCount = 0; |
| 1332 | int holesCount = 0; |
| 1333 | LoadedObjects res; |
| 1334 | res.objs.resize( results.size() ); |
| 1335 | for ( int i = 0; i < res.objs.size(); ++i ) |
| 1336 | { |
| 1337 | auto& result = results[i]; |
| 1338 | telemetryLogSize( result.mesh ); |
| 1339 | |
| 1340 | std::shared_ptr<ObjectMesh> objectMesh = std::make_shared<ObjectMesh>(); |
| 1341 | if ( result.name.empty() ) |
| 1342 | objectMesh->setName( utf8string( file.stem() ) ); |
| 1343 | else |
| 1344 | objectMesh->setName( std::move( result.name ) ); |
| 1345 | objectMesh->select( true ); |
| 1346 | objectMesh->setMesh( std::make_shared<Mesh>( std::move( result.mesh ) ) ); |
| 1347 | if ( result.diffuseColor ) |
| 1348 | objectMesh->setFrontColor( *result.diffuseColor, false ); |
| 1349 | |
| 1350 | objectMesh->setUVCoords( std::move( result.uvCoords ) ); |
| 1351 | |
| 1352 | int numEmptyTexture = 0; |
| 1353 | for ( const auto& p : result.textureFiles ) |
| 1354 | { |
| 1355 | if ( p.empty() ) |
| 1356 | numEmptyTexture++; |
| 1357 | } |
| 1358 | |
| 1359 | if ( numEmptyTexture != 0 && numEmptyTexture != result.textureFiles.size() ) |
| 1360 | { |
| 1361 | res.warnings += "object has material with and without texture\n"; |
| 1362 | } |
| 1363 | else if ( numEmptyTexture == 0 && result.textureFiles.size() != 0 ) |
| 1364 | { |
| 1365 | bool crashTextureLoad = false; |
| 1366 | for ( const auto& p : result.textureFiles ) |
| 1367 | { |
| 1368 | auto image = ImageLoad::fromAnySupportedFormat( p ); |
| 1369 | if ( image.has_value() ) |
| 1370 | { |
| 1371 | MeshTexture meshTexture; |
| 1372 | meshTexture.resolution = std::move( image.value().resolution ); |
| 1373 | meshTexture.pixels = std::move( image.value().pixels ); |
| 1374 | meshTexture.filter = FilterType::Linear; |
| 1375 | meshTexture.wrap = WrapType::Clamp; |
| 1376 | objectMesh->addTexture( std::move( meshTexture ) ); |
| 1377 | } |
| 1378 | else |
| 1379 | { |
| 1380 | crashTextureLoad = true; |
| 1381 | objectMesh->setTextures( {} ); |
| 1382 | res.warnings += image.error() + '\n'; |
nothing calls this directly
no test coverage detected