|
@@ -55,13 +55,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#include <unordered_map>
|
|
#include <unordered_map>
|
|
|
|
|
|
using namespace Assimp;
|
|
using namespace Assimp;
|
|
-// ------------------------------------------------------------------------------------------------
|
|
|
|
-// Constructor to be privately used by Importer
|
|
|
|
-JoinVerticesProcess::JoinVerticesProcess() = default;
|
|
|
|
-
|
|
|
|
-// ------------------------------------------------------------------------------------------------
|
|
|
|
-// Destructor, private as well
|
|
|
|
-JoinVerticesProcess::~JoinVerticesProcess() = default;
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------
|
|
// ------------------------------------------------------------------------------------------------
|
|
// Returns whether the processing step is present in the given flag field.
|
|
// Returns whether the processing step is present in the given flag field.
|
|
@@ -251,6 +244,9 @@ private:
|
|
unsigned mNumUVChannels;
|
|
unsigned mNumUVChannels;
|
|
unsigned mNumColorChannels;
|
|
unsigned mNumColorChannels;
|
|
};
|
|
};
|
|
|
|
+
|
|
|
|
+static constexpr size_t JOINED_VERTICES_MARK = 0x80000000u;
|
|
|
|
+
|
|
// now start the JoinVerticesProcess
|
|
// now start the JoinVerticesProcess
|
|
int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
|
|
int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
|
|
static_assert( AI_MAX_NUMBER_OF_COLOR_SETS == 8, "AI_MAX_NUMBER_OF_COLOR_SETS == 8");
|
|
static_assert( AI_MAX_NUMBER_OF_COLOR_SETS == 8, "AI_MAX_NUMBER_OF_COLOR_SETS == 8");
|
|
@@ -357,7 +353,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
|
|
}
|
|
}
|
|
} else{
|
|
} else{
|
|
// if the vertex is already there just find the replace index that is appropriate to it
|
|
// if the vertex is already there just find the replace index that is appropriate to it
|
|
- replaceIndex[a] = it->second;
|
|
|
|
|
|
+ // mark it with JOINED_VERTICES_MARK
|
|
|
|
+ replaceIndex[a] = it->second | JOINED_VERTICES_MARK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -386,7 +383,7 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
|
|
for( unsigned int a = 0; a < pMesh->mNumFaces; a++) {
|
|
for( unsigned int a = 0; a < pMesh->mNumFaces; a++) {
|
|
aiFace& face = pMesh->mFaces[a];
|
|
aiFace& face = pMesh->mFaces[a];
|
|
for( unsigned int b = 0; b < face.mNumIndices; b++) {
|
|
for( unsigned int b = 0; b < face.mNumIndices; b++) {
|
|
- face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~0x80000000;
|
|
|
|
|
|
+ face.mIndices[b] = replaceIndex[face.mIndices[b]] & ~JOINED_VERTICES_MARK;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -400,17 +397,8 @@ int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex) {
|
|
for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) {
|
|
for ( unsigned int b = 0; b < bone->mNumWeights; b++ ) {
|
|
const aiVertexWeight& ow = bone->mWeights[ b ];
|
|
const aiVertexWeight& ow = bone->mWeights[ b ];
|
|
// if the vertex is a unique one, translate it
|
|
// if the vertex is a unique one, translate it
|
|
- if ( !( replaceIndex[ ow.mVertexId ] & 0x80000000 ) ) {
|
|
|
|
- bool weightAlreadyExists = false;
|
|
|
|
- for (std::vector<aiVertexWeight>::iterator vit = newWeights.begin(); vit != newWeights.end(); ++vit) {
|
|
|
|
- if (vit->mVertexId == replaceIndex[ow.mVertexId]) {
|
|
|
|
- weightAlreadyExists = true;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (weightAlreadyExists) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
|
|
+ // filter out joined vertices by JOINED_VERTICES_MARK.
|
|
|
|
+ if ( !( replaceIndex[ ow.mVertexId ] & JOINED_VERTICES_MARK ) ) {
|
|
aiVertexWeight nw;
|
|
aiVertexWeight nw;
|
|
nw.mVertexId = replaceIndex[ ow.mVertexId ];
|
|
nw.mVertexId = replaceIndex[ ow.mVertexId ];
|
|
nw.mWeight = ow.mWeight;
|
|
nw.mWeight = ow.mWeight;
|