Make gltf2 export normal normalization safe

This avoids introducing NaNs e.g. when the input mesh has 0-length normals
pull/3214/head
Jeremy Cytryn 2020-05-07 01:21:54 -07:00
parent c5a9fbd47f
commit c3a21666da
4 changed files with 17 additions and 2 deletions

View File

@ -348,7 +348,7 @@ void glTFExporter::GetMatColorOrTex(const aiMaterial* mat, glTF::TexProperty& pr
if (path[0] == '*') { // embedded if (path[0] == '*') { // embedded
aiTexture* curTex = mScene->mTextures[atoi(&path[1])]; aiTexture* curTex = mScene->mTextures[atoi(&path[1])];
prop.texture->source->name = curTex->mFilename.C_Str(); prop.texture->source->name = curTex->mFilename.C_Str();
uint8_t *data = reinterpret_cast<uint8_t *>(curTex->pcData); uint8_t *data = reinterpret_cast<uint8_t *>(curTex->pcData);

View File

@ -758,7 +758,7 @@ void glTF2Exporter::ExportMeshes()
// Normalize all normals as the validator can emit a warning otherwise // Normalize all normals as the validator can emit a warning otherwise
if ( nullptr != aim->mNormals) { if ( nullptr != aim->mNormals) {
for ( auto i = 0u; i < aim->mNumVertices; ++i ) { for ( auto i = 0u; i < aim->mNumVertices; ++i ) {
aim->mNormals[ i ].Normalize(); aim->mNormals[ i ].NormalizeSafe();
} }
} }

View File

@ -446,6 +446,21 @@ TEST_F(utglTF2ImportExport, export_bad_accessor_bounds) {
EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "gltf2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxWithInfinites-glTF-Binary/BoxWithInfinites_out.gltf")); EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "gltf2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxWithInfinites-glTF-Binary/BoxWithInfinites_out.gltf"));
} }
TEST_F(utglTF2ImportExport, export_normalized_normals) {
Assimp::Importer importer;
Assimp::Exporter exporter;
const aiScene* scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals.glb", aiProcess_ValidateDataStructure);
ASSERT_NE(scene, nullptr);
EXPECT_EQ(aiReturn_SUCCESS, exporter.Export(scene, "glb2", ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals_out.glb"));
// load in again and ensure normal-length normals but no Nan's or Inf's introduced
scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/BoxBadNormals-glTF-Binary/BoxBadNormals_out.glb", aiProcess_ValidateDataStructure);
for ( auto i = 0u; i < scene->mMeshes[0]->mNumVertices; ++i ) {
const auto length = scene->mMeshes[0]->mNormals[i].Length();
EXPECT_TRUE(abs(length) < 1e-6 || abs(length - 1) < 1e-6);
}
}
#endif // ASSIMP_BUILD_NO_EXPORT #endif // ASSIMP_BUILD_NO_EXPORT
TEST_F(utglTF2ImportExport, sceneMetadata) { TEST_F(utglTF2ImportExport, sceneMetadata) {