Merge branch 'master' into issue_2182
This commit is contained in:
@@ -331,7 +331,7 @@ ADD_ASSIMP_EXPORTER( ASSBIN
|
||||
Assbin/AssbinExporter.cpp
|
||||
)
|
||||
|
||||
ADD_ASSIMP_IMPORTER( ASSXML
|
||||
ADD_ASSIMP_EXPORTER( ASSXML
|
||||
Assxml/AssxmlExporter.h
|
||||
Assxml/AssxmlExporter.cpp
|
||||
)
|
||||
|
||||
@@ -99,7 +99,7 @@ ColladaExporter::ColladaExporter( const aiScene* pScene, IOSystem* pIOSystem, co
|
||||
, mFile(file) {
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
mOutput.imbue( std::locale("C") );
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
mScene = pScene;
|
||||
mSceneOwned = false;
|
||||
|
||||
@@ -323,10 +323,8 @@ void ColladaParser::ReadMetaDataItem(StringMetaData &metadata)
|
||||
aiString aistr;
|
||||
aistr.Set(value_char);
|
||||
metadata.emplace(camel_key_str, aistr);
|
||||
TestClosing(key_str.c_str());
|
||||
}
|
||||
else
|
||||
SkipElement();
|
||||
TestClosing(key_str.c_str());
|
||||
}
|
||||
else
|
||||
SkipElement();
|
||||
|
||||
@@ -590,10 +590,12 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags)
|
||||
|
||||
// Find an worker class which can handle the file
|
||||
BaseImporter* imp = NULL;
|
||||
SetPropertyInteger("importerIndex", -1);
|
||||
for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) {
|
||||
|
||||
if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, false)) {
|
||||
imp = pimpl->mImporter[a];
|
||||
SetPropertyInteger("importerIndex", a);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -606,6 +608,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags)
|
||||
for( unsigned int a = 0; a < pimpl->mImporter.size(); a++) {
|
||||
if( pimpl->mImporter[a]->CanRead( pFile, pimpl->mIOHandler, true)) {
|
||||
imp = pimpl->mImporter[a];
|
||||
SetPropertyInteger("importerIndex", a);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1255,7 +1255,7 @@ namespace Assimp {
|
||||
|
||||
// mapping from output indices to DOM indexing, needed to resolve weights
|
||||
std::vector<unsigned int> reverseMapping;
|
||||
|
||||
std::map<unsigned int, unsigned int> translateIndexMap;
|
||||
if (process_weights) {
|
||||
reverseMapping.resize(count_vertices);
|
||||
}
|
||||
@@ -1363,6 +1363,7 @@ namespace Assimp {
|
||||
|
||||
if (reverseMapping.size()) {
|
||||
reverseMapping[cursor] = in_cursor;
|
||||
translateIndexMap[in_cursor] = cursor;
|
||||
}
|
||||
|
||||
out_mesh->mVertices[cursor] = vertices[in_cursor];
|
||||
@@ -1394,6 +1395,39 @@ namespace Assimp {
|
||||
ConvertWeights(out_mesh, model, mesh, node_global_transform, index, &reverseMapping);
|
||||
}
|
||||
|
||||
std::vector<aiAnimMesh*> animMeshes;
|
||||
for (const BlendShape* blendShape : mesh.GetBlendShapes()) {
|
||||
for (const BlendShapeChannel* blendShapeChannel : blendShape->BlendShapeChannels()) {
|
||||
const std::vector<const ShapeGeometry*>& shapeGeometries = blendShapeChannel->GetShapeGeometries();
|
||||
for (size_t i = 0; i < shapeGeometries.size(); i++) {
|
||||
aiAnimMesh* animMesh = aiCreateAnimMesh(out_mesh);
|
||||
const ShapeGeometry* shapeGeometry = shapeGeometries.at(i);
|
||||
const std::vector<aiVector3D>& vertices = shapeGeometry->GetVertices();
|
||||
const std::vector<aiVector3D>& normals = shapeGeometry->GetNormals();
|
||||
const std::vector<unsigned int>& indices = shapeGeometry->GetIndices();
|
||||
animMesh->mName.Set(FixAnimMeshName(shapeGeometry->Name()));
|
||||
for (size_t j = 0; j < indices.size(); j++) {
|
||||
unsigned int index = indices.at(j);
|
||||
aiVector3D vertex = vertices.at(j);
|
||||
aiVector3D normal = normals.at(j);
|
||||
unsigned int count = 0;
|
||||
const unsigned int* outIndices = mesh.ToOutputVertexIndex(index, count);
|
||||
for (unsigned int k = 0; k < count; k++) {
|
||||
unsigned int index = translateIndexMap[outIndices[k]];
|
||||
|
||||
animMesh->mVertices[index] += vertex;
|
||||
if (animMesh->mNormals != nullptr) {
|
||||
animMesh->mNormals[index] += normal;
|
||||
animMesh->mNormals[index].NormalizeSafe();
|
||||
}
|
||||
}
|
||||
}
|
||||
animMesh->mWeight = shapeGeometries.size() > 1 ? blendShapeChannel->DeformPercent() / 100.0f : 1.0f;
|
||||
animMeshes.push_back(animMesh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return static_cast<unsigned int>(meshes.size() - 1);
|
||||
}
|
||||
|
||||
@@ -1642,7 +1676,7 @@ namespace Assimp {
|
||||
out_tex->pcData = reinterpret_cast<aiTexel*>(const_cast<Video&>(video).RelinquishContent());
|
||||
|
||||
// try to extract a hint from the file extension
|
||||
const std::string& filename = video.FileName().empty() ? video.RelativeFilename() : video.FileName();
|
||||
const std::string& filename = video.RelativeFilename().empty() ? video.FileName() : video.RelativeFilename();
|
||||
std::string ext = BaseImporter::GetExtension(filename);
|
||||
|
||||
if (ext == "jpeg") {
|
||||
@@ -1653,7 +1687,7 @@ namespace Assimp {
|
||||
memcpy(out_tex->achFormatHint, ext.c_str(), ext.size());
|
||||
}
|
||||
|
||||
out_tex->mFilename.Set(video.FileName().c_str());
|
||||
out_tex->mFilename.Set(filename.c_str());
|
||||
|
||||
return static_cast<unsigned int>(textures.size() - 1);
|
||||
}
|
||||
|
||||
@@ -1328,6 +1328,7 @@ void LWOImporter::LoadLWO2File()
|
||||
bool skip = false;
|
||||
|
||||
LE_NCONST uint8_t* const end = mFileBuffer + fileSize;
|
||||
unsigned int iUnnamed = 0;
|
||||
while (true)
|
||||
{
|
||||
if (mFileBuffer + sizeof(IFF::ChunkHeader) > end)break;
|
||||
@@ -1339,7 +1340,6 @@ void LWOImporter::LoadLWO2File()
|
||||
break;
|
||||
}
|
||||
uint8_t* const next = mFileBuffer+head.length;
|
||||
unsigned int iUnnamed = 0;
|
||||
|
||||
if(!head.length) {
|
||||
mFileBuffer = next;
|
||||
|
||||
@@ -126,9 +126,9 @@ ObjExporter::ObjExporter(const char* _filename, const aiScene* pScene, bool noMt
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
const std::locale& l = std::locale("C");
|
||||
mOutput.imbue(l);
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
mOutputMat.imbue(l);
|
||||
mOutputMat.precision(16);
|
||||
mOutputMat.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
WriteGeometryFile(noMtl);
|
||||
if ( !noMtl ) {
|
||||
|
||||
@@ -111,7 +111,7 @@ PlyExporter::PlyExporter(const char* _filename, const aiScene* pScene, bool bina
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
const std::locale& l = std::locale("C");
|
||||
mOutput.imbue(l);
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
unsigned int faces = 0u, vertices = 0u, components = 0u;
|
||||
for (unsigned int i = 0; i < pScene->mNumMeshes; ++i) {
|
||||
|
||||
@@ -111,7 +111,7 @@ STLExporter::STLExporter(const char* _filename, const aiScene* pScene, bool expo
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
const std::locale& l = std::locale("C");
|
||||
mOutput.imbue(l);
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
if (binary) {
|
||||
char buf[80] = {0} ;
|
||||
buf[0] = 'A'; buf[1] = 's'; buf[2] = 's'; buf[3] = 'i'; buf[4] = 'm'; buf[5] = 'p';
|
||||
|
||||
@@ -143,15 +143,15 @@ namespace {
|
||||
// ------------------------------------------------------------------------------------------------
|
||||
// Constructor for a specific scene to export
|
||||
StepExporter::StepExporter(const aiScene* pScene, IOSystem* pIOSystem, const std::string& path,
|
||||
const std::string& file, const ExportProperties* pProperties):
|
||||
mProperties(pProperties),mIOSystem(pIOSystem),mFile(file), mPath(path),
|
||||
mScene(pScene), endstr(";\n") {
|
||||
CollectTrafos(pScene->mRootNode, trafos);
|
||||
CollectMeshes(pScene->mRootNode, meshes);
|
||||
const std::string& file, const ExportProperties* pProperties) :
|
||||
mProperties(pProperties), mIOSystem(pIOSystem), mFile(file), mPath(path),
|
||||
mScene(pScene), endstr(";\n") {
|
||||
CollectTrafos(pScene->mRootNode, trafos);
|
||||
CollectMeshes(pScene->mRootNode, meshes);
|
||||
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
mOutput.imbue( std::locale("C") );
|
||||
mOutput.precision(16);
|
||||
mOutput.imbue(std::locale("C"));
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
// start writing
|
||||
WriteFile();
|
||||
@@ -166,7 +166,7 @@ void StepExporter::WriteFile()
|
||||
mOutput.setf(std::ios::fixed);
|
||||
// precision for double
|
||||
// see http://stackoverflow.com/questions/554063/how-do-i-print-a-double-value-with-full-precision-using-cout
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
// standard color
|
||||
aiColor4D fColor;
|
||||
|
||||
@@ -113,7 +113,7 @@ XFileExporter::XFileExporter(const aiScene* pScene, IOSystem* pIOSystem, const s
|
||||
{
|
||||
// make sure that all formatting happens using the standard, C locale and not the user's current locale
|
||||
mOutput.imbue( std::locale("C") );
|
||||
mOutput.precision(16);
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION);
|
||||
|
||||
// start writing
|
||||
WriteFile();
|
||||
@@ -134,7 +134,7 @@ void XFileExporter::WriteFile()
|
||||
{
|
||||
// note, that all realnumber values must be comma separated in x files
|
||||
mOutput.setf(std::ios::fixed);
|
||||
mOutput.precision(16); // precision for double
|
||||
mOutput.precision(ASSIMP_AI_REAL_TEXT_PRECISION); // precision for ai_real
|
||||
|
||||
// entry of writing the file
|
||||
WriteHeader();
|
||||
|
||||
Reference in New Issue
Block a user