Skip to content

Commit

Permalink
Always pre-transform vertices while reading with Assimp.
Browse files Browse the repository at this point in the history
Better error messages.
  • Loading branch information
ssheorey committed Sep 10, 2024
1 parent 553ca86 commit 4cad1d7
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 15 deletions.
1 change: 1 addition & 0 deletions cpp/open3d/io/TriangleMeshIO.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ struct ReadTriangleMeshOptions {
/// `aiProcessPreset_TargetRealtime_Fast,
/// aiProcess_RemoveRedundantMaterials, aiProcess_OptimizeMeshes,
/// aiProcess_PreTransformVertices`.
/// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
///
/// Note that identical vertices will always be joined regardless of whether
/// post-processing is enabled or not, which changes the number of vertices
Expand Down
23 changes: 15 additions & 8 deletions cpp/open3d/io/file_format/FileASSIMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,16 @@ FileGeometry ReadFileGeometryTypeFBX(const std::string& path) {
return FileGeometry(CONTAINS_TRIANGLES | CONTAINS_POINTS);
}

// Ref:
// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
const unsigned int kPostProcessFlags_compulsory =
aiProcess_JoinIdenticalVertices;
aiProcess_JoinIdenticalVertices | aiProcess_SortByPType |
aiProcess_PreTransformVertices;

const unsigned int kPostProcessFlags_fast =
aiProcessPreset_TargetRealtime_Fast |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes |
aiProcess_PreTransformVertices;
kPostProcessFlags_compulsory | aiProcess_GenNormals |
aiProcess_Triangulate | aiProcess_GenUVCoords |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes;

struct TextureImages {
std::shared_ptr<geometry::Image> albedo;
Expand All @@ -65,7 +68,7 @@ void LoadTextures(const std::string& filename,
std::string base_path =
utility::filesystem::GetFileParentDirectory(filename);

auto texture_loader = [&base_path, &scene, &mat](
auto texture_loader = [&base_path, &scene, &mat, &filename](
aiTextureType type,
std::shared_ptr<geometry::Image>& img) {
if (mat->GetTextureCount(type) > 0) {
Expand Down Expand Up @@ -94,7 +97,9 @@ void LoadTextures(const std::string& filename,
}
} else {
utility::LogWarning(
"This format of image is not supported.");
"Unsupported texture format for texture {} for file {}: Only jpg and "
"png textures are supported.",
path.C_Str(), filename);
}
}
// Else, build the path to it.
Expand Down Expand Up @@ -170,7 +175,8 @@ bool ReadTriangleMeshUsingASSIMP(

const auto* scene = importer.ReadFile(filename.c_str(), post_process_flags);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down Expand Up @@ -326,7 +332,8 @@ bool ReadModelUsingAssimp(const std::string& filename,
const auto* scene =
importer.ReadFile(filename.c_str(), kPostProcessFlags_fast);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down
19 changes: 12 additions & 7 deletions cpp/open3d/t/io/file_format/FileASSIMP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,16 @@ namespace t {
namespace io {

// Split all polygons with more than 3 edges into triangles.
// Ref:
// https://github.com/assimp/assimp/blob/master/include/assimp/postprocess.h
const unsigned int kPostProcessFlags_compulsory =
aiProcess_JoinIdenticalVertices | aiProcess_Triangulate |
aiProcess_SortByPType;
aiProcess_SortByPType | aiProcess_PreTransformVertices;

const unsigned int kPostProcessFlags_fast =
aiProcessPreset_TargetRealtime_Fast |
aiProcess_RemoveRedundantMaterials | aiProcess_OptimizeMeshes |
aiProcess_PreTransformVertices;
kPostProcessFlags_compulsory | aiProcess_GenNormals |
aiProcess_GenUVCoords | aiProcess_RemoveRedundantMaterials |
aiProcess_OptimizeMeshes;

bool ReadTriangleMeshUsingASSIMP(
const std::string& filename,
Expand All @@ -58,7 +60,8 @@ bool ReadTriangleMeshUsingASSIMP(

const auto* scene = importer.ReadFile(filename.c_str(), post_process_flags);
if (!scene) {
utility::LogWarning("Unable to load file {} with ASSIMP", filename);
utility::LogWarning("Unable to load file {} with ASSIMP: {}", filename,
importer.GetErrorString());
return false;
}

Expand Down Expand Up @@ -219,7 +222,7 @@ bool WriteTriangleMeshUsingASSIMP(const std::string& filename,
// Sanity checks...
if (write_ascii) {
utility::LogWarning(
"TriangleMesh can't be saved in ASCII fromat as .glb");
"TriangleMesh can't be saved in ASCII format as .glb");
return false;
}
if (compressed) {
Expand Down Expand Up @@ -470,7 +473,9 @@ bool WriteTriangleMeshUsingASSIMP(const std::string& filename,
// Export
if (exporter.Export(ai_scene.get(), "glb2", filename.c_str()) ==
AI_FAILURE) {
utility::LogWarning("Got error: {}", exporter.GetErrorString());
utility::LogWarning(
"Got error: ({}) while writing TriangleMesh to file {}.",
exporter.GetErrorString(), filename);
return false;
}

Expand Down

0 comments on commit 4cad1d7

Please sign in to comment.