[gltf2-exporter] Adding FB_ngon_encoding support

pull/3695/head
Clement Jacob 2021-03-10 09:48:12 +01:00
parent 3880cd225c
commit 8e589221d7
4 changed files with 32 additions and 0 deletions

View File

@ -1108,6 +1108,7 @@ public:
bool KHR_materials_clearcoat;
bool KHR_materials_transmission;
bool KHR_draco_mesh_compression;
bool FB_ngon_encoding;
} extensionsUsed;
//! Keeps info about the required extensions

View File

@ -507,6 +507,19 @@ namespace glTF2 {
Mesh::Primitive& p = m.primitives[i];
Value prim;
prim.SetObject();
// Extensions
{
Value exts;
exts.SetObject();
Value FB_ngon_encoding;
FB_ngon_encoding.SetObject();
exts.AddMember(StringRef("FB_ngon_encoding"), FB_ngon_encoding, w.mAl);
prim.AddMember("extensions", exts, w.mAl);
}
{
prim.AddMember("mode", Value(int(p.mode)).Move(), w.mAl);
@ -874,6 +887,10 @@ namespace glTF2 {
if (this->mAsset.extensionsUsed.KHR_materials_transmission) {
exts.PushBack(StringRef("KHR_materials_transmission"), mAl);
}
if (this->mAsset.extensionsUsed.FB_ngon_encoding) {
exts.PushBack(StringRef("FB_ngon_encoding"), mAl);
}
}
if (!exts.Empty())

View File

@ -97,6 +97,9 @@ glTF2Exporter::glTF2Exporter(const char* filename, IOSystem* pIOSystem, const ai
mAsset.reset( new Asset( pIOSystem ) );
// Always on as our triangulation process is aware of this type of encoding
mAsset->extensionsUsed.FB_ngon_encoding = true;
if (isBinary) {
mAsset->SetAsBinary();
}

View File

@ -217,10 +217,21 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh)
// if it's a simple point,line or triangle: just copy it
if( face.mNumIndices <= 3)
{
// ngon encoding: making sure that triangles are not recognized as false ngons.
// To do so, we make sure the first indice is not the same as previous triangle emitted.
unsigned int prev_first_indice = (unsigned int)-1;
if (curOut != out) prev_first_indice = (curOut - 1)->mIndices[0];
aiFace& nface = *curOut++;
nface.mNumIndices = face.mNumIndices;
nface.mIndices = face.mIndices;
if (nface.mIndices[0] == prev_first_indice) {
// rotate indices to avoid ngon encoding false ngons
std::swap(nface.mIndices[0], nface.mIndices[2]);
std::swap(nface.mIndices[1], nface.mIndices[2]);
}
face.mIndices = nullptr;
continue;
}