Make gltf2 export normal normalization safe
This avoids introducing NaNs e.g. when the input mesh has 0-length normalspull/3214/head
parent
c5a9fbd47f
commit
c3a21666da
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue