Merge branch 'master' into doxygen_api_generation
commit
9f2540a2a8
|
@ -25,7 +25,7 @@ CMakeSettings.json
|
||||||
# Output
|
# Output
|
||||||
bin/
|
bin/
|
||||||
lib/
|
lib/
|
||||||
|
x64/
|
||||||
# QtCreator
|
# QtCreator
|
||||||
CMakeLists.txt.user
|
CMakeLists.txt.user
|
||||||
|
|
||||||
|
|
|
@ -46,8 +46,8 @@ option(ASSIMP_HUNTER_ENABLED "Enable Hunter package manager support" OFF)
|
||||||
IF(ASSIMP_HUNTER_ENABLED)
|
IF(ASSIMP_HUNTER_ENABLED)
|
||||||
include("cmake/HunterGate.cmake")
|
include("cmake/HunterGate.cmake")
|
||||||
HunterGate(
|
HunterGate(
|
||||||
URL "https://github.com/cpp-pm/hunter/archive/v0.23.293.tar.gz"
|
URL "https://github.com/cpp-pm/hunter/archive/v0.23.311.tar.gz"
|
||||||
SHA1 "e8e5470652db77149d9b38656db2a6c0b7642693"
|
SHA1 "1a82b9b73055879181cb1466b2ab5d48ee8ae410"
|
||||||
)
|
)
|
||||||
|
|
||||||
add_definitions(-DASSIMP_USE_HUNTER)
|
add_definitions(-DASSIMP_USE_HUNTER)
|
||||||
|
|
|
@ -9,6 +9,7 @@ find_package(poly2tri CONFIG REQUIRED)
|
||||||
find_package(polyclipping CONFIG REQUIRED)
|
find_package(polyclipping CONFIG REQUIRED)
|
||||||
find_package(zip CONFIG REQUIRED)
|
find_package(zip CONFIG REQUIRED)
|
||||||
find_package(pugixml CONFIG REQUIRED)
|
find_package(pugixml CONFIG REQUIRED)
|
||||||
|
find_package(stb CONFIG REQUIRED)
|
||||||
|
|
||||||
if(@ASSIMP_BUILD_DRACO@)
|
if(@ASSIMP_BUILD_DRACO@)
|
||||||
find_package(draco CONFIG REQUIRED)
|
find_package(draco CONFIG REQUIRED)
|
||||||
|
|
|
@ -170,10 +170,10 @@ ColladaParser::ColladaParser(IOSystem *pIOHandler, const std::string &pFile) :
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Destructor, private as well
|
// Destructor, private as well
|
||||||
ColladaParser::~ColladaParser() {
|
ColladaParser::~ColladaParser() {
|
||||||
for (auto & it : mNodeLibrary) {
|
for (auto &it : mNodeLibrary) {
|
||||||
delete it.second;
|
delete it.second;
|
||||||
}
|
}
|
||||||
for (auto & it : mMeshLibrary) {
|
for (auto &it : mMeshLibrary) {
|
||||||
delete it.second;
|
delete it.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -396,7 +396,7 @@ void ColladaParser::ReadAnimationClipLibrary(XmlNode &node) {
|
||||||
|
|
||||||
std::string animName;
|
std::string animName;
|
||||||
if (!XmlParser::getStdStrAttribute(node, "name", animName)) {
|
if (!XmlParser::getStdStrAttribute(node, "name", animName)) {
|
||||||
if (!XmlParser::getStdStrAttribute( node, "id", animName )) {
|
if (!XmlParser::getStdStrAttribute(node, "id", animName)) {
|
||||||
animName = std::string("animation_") + ai_to_string(mAnimationClipLibrary.size());
|
animName = std::string("animation_") + ai_to_string(mAnimationClipLibrary.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -420,7 +420,7 @@ void ColladaParser::ReadAnimationClipLibrary(XmlNode &node) {
|
||||||
|
|
||||||
void ColladaParser::PostProcessControllers() {
|
void ColladaParser::PostProcessControllers() {
|
||||||
std::string meshId;
|
std::string meshId;
|
||||||
for (auto & it : mControllerLibrary) {
|
for (auto &it : mControllerLibrary) {
|
||||||
meshId = it.second.mMeshId;
|
meshId = it.second.mMeshId;
|
||||||
if (meshId.empty()) {
|
if (meshId.empty()) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -445,7 +445,7 @@ void ColladaParser::PostProcessRootAnimations() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Animation temp;
|
Animation temp;
|
||||||
for (auto & it : mAnimationClipLibrary) {
|
for (auto &it : mAnimationClipLibrary) {
|
||||||
std::string clipName = it.first;
|
std::string clipName = it.first;
|
||||||
|
|
||||||
Animation *clip = new Animation();
|
Animation *clip = new Animation();
|
||||||
|
@ -552,7 +552,7 @@ void ColladaParser::ReadAnimation(XmlNode &node, Collada::Animation *pParent) {
|
||||||
pParent->mSubAnims.push_back(anim);
|
pParent->mSubAnims.push_back(anim);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto & channel : channels) {
|
for (const auto &channel : channels) {
|
||||||
anim->mChannels.push_back(channel.second);
|
anim->mChannels.push_back(channel.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,8 +626,6 @@ void ColladaParser::ReadController(XmlNode &node, Collada::Controller &controlle
|
||||||
XmlNodeIterator xmlIt(node, XmlNodeIterator::PreOrderMode);
|
XmlNodeIterator xmlIt(node, XmlNodeIterator::PreOrderMode);
|
||||||
XmlNode currentNode;
|
XmlNode currentNode;
|
||||||
while (xmlIt.getNext(currentNode)) {
|
while (xmlIt.getNext(currentNode)) {
|
||||||
|
|
||||||
//for (XmlNode ¤tNode : node.children()) {
|
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string ¤tName = currentNode.name();
|
||||||
if (currentName == "morph") {
|
if (currentName == "morph") {
|
||||||
controller.mType = Morph;
|
controller.mType = Morph;
|
||||||
|
@ -644,7 +642,7 @@ void ColladaParser::ReadController(XmlNode &node, Collada::Controller &controlle
|
||||||
} else if (currentName == "skin") {
|
} else if (currentName == "skin") {
|
||||||
std::string id;
|
std::string id;
|
||||||
if (XmlParser::getStdStrAttribute(currentNode, "source", id)) {
|
if (XmlParser::getStdStrAttribute(currentNode, "source", id)) {
|
||||||
controller.mMeshId = id.substr(1, id.size()-1);
|
controller.mMeshId = id.substr(1, id.size() - 1);
|
||||||
}
|
}
|
||||||
} else if (currentName == "bind_shape_matrix") {
|
} else if (currentName == "bind_shape_matrix") {
|
||||||
std::string v;
|
std::string v;
|
||||||
|
@ -698,7 +696,7 @@ void ColladaParser::ReadControllerJoints(XmlNode &node, Collada::Controller &pCo
|
||||||
} else if (strcmp(attrSemantic, "INV_BIND_MATRIX") == 0) {
|
} else if (strcmp(attrSemantic, "INV_BIND_MATRIX") == 0) {
|
||||||
pController.mJointOffsetMatrixSource = attrSource;
|
pController.mJointOffsetMatrixSource = attrSource;
|
||||||
} else {
|
} else {
|
||||||
throw DeadlyImportError("Unknown semantic \"" , attrSemantic , "\" in <joints> data <input> element");
|
throw DeadlyImportError("Unknown semantic \"", attrSemantic, "\" in <joints> data <input> element");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -708,7 +706,7 @@ void ColladaParser::ReadControllerJoints(XmlNode &node, Collada::Controller &pCo
|
||||||
// Reads the joint weights for the given controller
|
// Reads the joint weights for the given controller
|
||||||
void ColladaParser::ReadControllerWeights(XmlNode &node, Collada::Controller &pController) {
|
void ColladaParser::ReadControllerWeights(XmlNode &node, Collada::Controller &pController) {
|
||||||
// Read vertex count from attributes and resize the array accordingly
|
// Read vertex count from attributes and resize the array accordingly
|
||||||
int vertexCount=0;
|
int vertexCount = 0;
|
||||||
XmlParser::getIntAttribute(node, "count", vertexCount);
|
XmlParser::getIntAttribute(node, "count", vertexCount);
|
||||||
pController.mWeightCounts.resize(vertexCount);
|
pController.mWeightCounts.resize(vertexCount);
|
||||||
|
|
||||||
|
@ -723,7 +721,7 @@ void ColladaParser::ReadControllerWeights(XmlNode &node, Collada::Controller &pC
|
||||||
|
|
||||||
// local URLS always start with a '#'. We don't support global URLs
|
// local URLS always start with a '#'. We don't support global URLs
|
||||||
if (attrSource[0] != '#') {
|
if (attrSource[0] != '#') {
|
||||||
throw DeadlyImportError( "Unsupported URL format in \"", attrSource, "\" in source attribute of <vertex_weights> data <input> element");
|
throw DeadlyImportError("Unsupported URL format in \"", attrSource, "\" in source attribute of <vertex_weights> data <input> element");
|
||||||
}
|
}
|
||||||
channel.mAccessor = attrSource + 1;
|
channel.mAccessor = attrSource + 1;
|
||||||
|
|
||||||
|
@ -777,7 +775,7 @@ void ColladaParser::ReadImageLibrary(XmlNode &node) {
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string ¤tName = currentNode.name();
|
||||||
if (currentName == "image") {
|
if (currentName == "image") {
|
||||||
std::string id;
|
std::string id;
|
||||||
if (XmlParser::getStdStrAttribute( currentNode, "id", id )) {
|
if (XmlParser::getStdStrAttribute(currentNode, "id", id)) {
|
||||||
mImageLibrary[id] = Image();
|
mImageLibrary[id] = Image();
|
||||||
// read on from there
|
// read on from there
|
||||||
ReadImage(currentNode, mImageLibrary[id]);
|
ReadImage(currentNode, mImageLibrary[id]);
|
||||||
|
@ -1361,8 +1359,8 @@ void ColladaParser::ReadMesh(XmlNode &node, Mesh &pMesh) {
|
||||||
} else if (currentName == "vertices") {
|
} else if (currentName == "vertices") {
|
||||||
ReadVertexData(currentNode, pMesh);
|
ReadVertexData(currentNode, pMesh);
|
||||||
} else if (currentName == "triangles" || currentName == "lines" || currentName == "linestrips" ||
|
} else if (currentName == "triangles" || currentName == "lines" || currentName == "linestrips" ||
|
||||||
currentName == "polygons" || currentName == "polylist" || currentName == "trifans" ||
|
currentName == "polygons" || currentName == "polylist" || currentName == "trifans" ||
|
||||||
currentName == "tristrips") {
|
currentName == "tristrips") {
|
||||||
ReadIndexData(currentNode, pMesh);
|
ReadIndexData(currentNode, pMesh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1439,9 +1437,8 @@ void ColladaParser::ReadDataArray(XmlNode &node) {
|
||||||
throw DeadlyImportError("Expected more values while reading float_array contents.");
|
throw DeadlyImportError("Expected more values while reading float_array contents.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ai_real value;
|
|
||||||
// read a number
|
// read a number
|
||||||
//SkipSpacesAndLineEnd(&content);
|
ai_real value;
|
||||||
content = fast_atoreal_move<ai_real>(content, value);
|
content = fast_atoreal_move<ai_real>(content, value);
|
||||||
data.mValues.push_back(value);
|
data.mValues.push_back(value);
|
||||||
// skip whitespace after it
|
// skip whitespace after it
|
||||||
|
@ -1489,11 +1486,10 @@ void ColladaParser::ReadAccessor(XmlNode &node, const std::string &pID) {
|
||||||
std::string name;
|
std::string name;
|
||||||
if (XmlParser::hasAttribute(currentNode, "name")) {
|
if (XmlParser::hasAttribute(currentNode, "name")) {
|
||||||
XmlParser::getStdStrAttribute(currentNode, "name", name);
|
XmlParser::getStdStrAttribute(currentNode, "name", name);
|
||||||
//name = mReader->getAttributeValue(attrName);
|
|
||||||
|
|
||||||
// analyse for common type components and store it's sub-offset in the corresponding field
|
// analyse for common type components and store it's sub-offset in the corresponding field
|
||||||
|
|
||||||
/* Cartesian coordinates */
|
// Cartesian coordinates
|
||||||
if (name == "X")
|
if (name == "X")
|
||||||
acc.mSubOffset[0] = acc.mParams.size();
|
acc.mSubOffset[0] = acc.mParams.size();
|
||||||
else if (name == "Y")
|
else if (name == "Y")
|
||||||
|
@ -1674,12 +1670,9 @@ void ColladaParser::ReadInputChannel(XmlNode &node, std::vector<InputChannel> &p
|
||||||
|
|
||||||
// read set if texture coordinates
|
// read set if texture coordinates
|
||||||
if (channel.mType == IT_Texcoord || channel.mType == IT_Color) {
|
if (channel.mType == IT_Texcoord || channel.mType == IT_Color) {
|
||||||
int attrSet = -1;
|
unsigned int attrSet = 0;
|
||||||
if (XmlParser::hasAttribute(node, "set")) {
|
if (XmlParser::getUIntAttribute(node, "set", attrSet))
|
||||||
XmlParser::getIntAttribute(node, "set", attrSet);
|
channel.mIndex = attrSet;
|
||||||
}
|
|
||||||
|
|
||||||
channel.mIndex = attrSet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// store, if valid type
|
// store, if valid type
|
||||||
|
@ -1704,20 +1697,20 @@ size_t ColladaParser::ReadPrimitives(XmlNode &node, Mesh &pMesh, std::vector<Inp
|
||||||
// determine the expected number of indices
|
// determine the expected number of indices
|
||||||
size_t expectedPointCount = 0;
|
size_t expectedPointCount = 0;
|
||||||
switch (pPrimType) {
|
switch (pPrimType) {
|
||||||
case Prim_Polylist: {
|
case Prim_Polylist: {
|
||||||
for (size_t i : pVCount)
|
for (size_t i : pVCount)
|
||||||
expectedPointCount += i;
|
expectedPointCount += i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Prim_Lines:
|
case Prim_Lines:
|
||||||
expectedPointCount = 2 * pNumPrimitives;
|
expectedPointCount = 2 * pNumPrimitives;
|
||||||
break;
|
break;
|
||||||
case Prim_Triangles:
|
case Prim_Triangles:
|
||||||
expectedPointCount = 3 * pNumPrimitives;
|
expectedPointCount = 3 * pNumPrimitives;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// other primitive types don't state the index count upfront... we need to guess
|
// other primitive types don't state the index count upfront... we need to guess
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// and read all indices into a temporary array
|
// and read all indices into a temporary array
|
||||||
|
@ -1727,7 +1720,7 @@ size_t ColladaParser::ReadPrimitives(XmlNode &node, Mesh &pMesh, std::vector<Inp
|
||||||
}
|
}
|
||||||
|
|
||||||
// It is possible to not contain any indices
|
// It is possible to not contain any indices
|
||||||
if (pNumPrimitives > 0) {
|
if (pNumPrimitives > 0) {
|
||||||
std::string v;
|
std::string v;
|
||||||
XmlParser::getValueAsString(node, v);
|
XmlParser::getValueAsString(node, v);
|
||||||
const char *content = v.c_str();
|
const char *content = v.c_str();
|
||||||
|
@ -1925,87 +1918,87 @@ void ColladaParser::ExtractDataObjectFromChannel(const InputChannel &pInput, siz
|
||||||
|
|
||||||
// now we reinterpret it according to the type we're reading here
|
// now we reinterpret it according to the type we're reading here
|
||||||
switch (pInput.mType) {
|
switch (pInput.mType) {
|
||||||
case IT_Position: // ignore all position streams except 0 - there can be only one position
|
case IT_Position: // ignore all position streams except 0 - there can be only one position
|
||||||
if (pInput.mIndex == 0) {
|
if (pInput.mIndex == 0) {
|
||||||
pMesh.mPositions.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
pMesh.mPositions.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
||||||
} else {
|
} else {
|
||||||
ASSIMP_LOG_ERROR("Collada: just one vertex position stream supported");
|
ASSIMP_LOG_ERROR("Collada: just one vertex position stream supported");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IT_Normal:
|
case IT_Normal:
|
||||||
|
// pad to current vertex count if necessary
|
||||||
|
if (pMesh.mNormals.size() < pMesh.mPositions.size() - 1)
|
||||||
|
pMesh.mNormals.insert(pMesh.mNormals.end(), pMesh.mPositions.size() - pMesh.mNormals.size() - 1, aiVector3D(0, 1, 0));
|
||||||
|
|
||||||
|
// ignore all normal streams except 0 - there can be only one normal
|
||||||
|
if (pInput.mIndex == 0) {
|
||||||
|
pMesh.mNormals.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
||||||
|
} else {
|
||||||
|
ASSIMP_LOG_ERROR("Collada: just one vertex normal stream supported");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IT_Tangent:
|
||||||
|
// pad to current vertex count if necessary
|
||||||
|
if (pMesh.mTangents.size() < pMesh.mPositions.size() - 1)
|
||||||
|
pMesh.mTangents.insert(pMesh.mTangents.end(), pMesh.mPositions.size() - pMesh.mTangents.size() - 1, aiVector3D(1, 0, 0));
|
||||||
|
|
||||||
|
// ignore all tangent streams except 0 - there can be only one tangent
|
||||||
|
if (pInput.mIndex == 0) {
|
||||||
|
pMesh.mTangents.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
||||||
|
} else {
|
||||||
|
ASSIMP_LOG_ERROR("Collada: just one vertex tangent stream supported");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IT_Bitangent:
|
||||||
|
// pad to current vertex count if necessary
|
||||||
|
if (pMesh.mBitangents.size() < pMesh.mPositions.size() - 1) {
|
||||||
|
pMesh.mBitangents.insert(pMesh.mBitangents.end(), pMesh.mPositions.size() - pMesh.mBitangents.size() - 1, aiVector3D(0, 0, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// ignore all bitangent streams except 0 - there can be only one bitangent
|
||||||
|
if (pInput.mIndex == 0) {
|
||||||
|
pMesh.mBitangents.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
||||||
|
} else {
|
||||||
|
ASSIMP_LOG_ERROR("Collada: just one vertex bitangent stream supported");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IT_Texcoord:
|
||||||
|
// up to 4 texture coord sets are fine, ignore the others
|
||||||
|
if (pInput.mIndex < AI_MAX_NUMBER_OF_TEXTURECOORDS) {
|
||||||
// pad to current vertex count if necessary
|
// pad to current vertex count if necessary
|
||||||
if (pMesh.mNormals.size() < pMesh.mPositions.size() - 1)
|
if (pMesh.mTexCoords[pInput.mIndex].size() < pMesh.mPositions.size() - 1)
|
||||||
pMesh.mNormals.insert(pMesh.mNormals.end(), pMesh.mPositions.size() - pMesh.mNormals.size() - 1, aiVector3D(0, 1, 0));
|
pMesh.mTexCoords[pInput.mIndex].insert(pMesh.mTexCoords[pInput.mIndex].end(),
|
||||||
|
pMesh.mPositions.size() - pMesh.mTexCoords[pInput.mIndex].size() - 1, aiVector3D(0, 0, 0));
|
||||||
|
|
||||||
// ignore all normal streams except 0 - there can be only one normal
|
pMesh.mTexCoords[pInput.mIndex].push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
||||||
if (pInput.mIndex == 0) {
|
if (0 != acc.mSubOffset[2] || 0 != acc.mSubOffset[3]) {
|
||||||
pMesh.mNormals.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
pMesh.mNumUVComponents[pInput.mIndex] = 3;
|
||||||
} else {
|
|
||||||
ASSIMP_LOG_ERROR("Collada: just one vertex normal stream supported");
|
|
||||||
}
|
}
|
||||||
break;
|
} else {
|
||||||
case IT_Tangent:
|
ASSIMP_LOG_ERROR("Collada: too many texture coordinate sets. Skipping.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case IT_Color:
|
||||||
|
// up to 4 color sets are fine, ignore the others
|
||||||
|
if (pInput.mIndex < AI_MAX_NUMBER_OF_COLOR_SETS) {
|
||||||
// pad to current vertex count if necessary
|
// pad to current vertex count if necessary
|
||||||
if (pMesh.mTangents.size() < pMesh.mPositions.size() - 1)
|
if (pMesh.mColors[pInput.mIndex].size() < pMesh.mPositions.size() - 1)
|
||||||
pMesh.mTangents.insert(pMesh.mTangents.end(), pMesh.mPositions.size() - pMesh.mTangents.size() - 1, aiVector3D(1, 0, 0));
|
pMesh.mColors[pInput.mIndex].insert(pMesh.mColors[pInput.mIndex].end(),
|
||||||
|
pMesh.mPositions.size() - pMesh.mColors[pInput.mIndex].size() - 1, aiColor4D(0, 0, 0, 1));
|
||||||
|
|
||||||
// ignore all tangent streams except 0 - there can be only one tangent
|
aiColor4D result(0, 0, 0, 1);
|
||||||
if (pInput.mIndex == 0) {
|
for (size_t i = 0; i < pInput.mResolved->mSize; ++i) {
|
||||||
pMesh.mTangents.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
result[static_cast<unsigned int>(i)] = obj[pInput.mResolved->mSubOffset[i]];
|
||||||
} else {
|
|
||||||
ASSIMP_LOG_ERROR("Collada: just one vertex tangent stream supported");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IT_Bitangent:
|
|
||||||
// pad to current vertex count if necessary
|
|
||||||
if (pMesh.mBitangents.size() < pMesh.mPositions.size() - 1) {
|
|
||||||
pMesh.mBitangents.insert(pMesh.mBitangents.end(), pMesh.mPositions.size() - pMesh.mBitangents.size() - 1, aiVector3D(0, 0, 1));
|
|
||||||
}
|
}
|
||||||
|
pMesh.mColors[pInput.mIndex].push_back(result);
|
||||||
|
} else {
|
||||||
|
ASSIMP_LOG_ERROR("Collada: too many vertex color sets. Skipping.");
|
||||||
|
}
|
||||||
|
|
||||||
// ignore all bitangent streams except 0 - there can be only one bitangent
|
break;
|
||||||
if (pInput.mIndex == 0) {
|
default:
|
||||||
pMesh.mBitangents.push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
// IT_Invalid and IT_Vertex
|
||||||
} else {
|
ai_assert(false && "shouldn't ever get here");
|
||||||
ASSIMP_LOG_ERROR("Collada: just one vertex bitangent stream supported");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IT_Texcoord:
|
|
||||||
// up to 4 texture coord sets are fine, ignore the others
|
|
||||||
if (pInput.mIndex < AI_MAX_NUMBER_OF_TEXTURECOORDS) {
|
|
||||||
// pad to current vertex count if necessary
|
|
||||||
if (pMesh.mTexCoords[pInput.mIndex].size() < pMesh.mPositions.size() - 1)
|
|
||||||
pMesh.mTexCoords[pInput.mIndex].insert(pMesh.mTexCoords[pInput.mIndex].end(),
|
|
||||||
pMesh.mPositions.size() - pMesh.mTexCoords[pInput.mIndex].size() - 1, aiVector3D(0, 0, 0));
|
|
||||||
|
|
||||||
pMesh.mTexCoords[pInput.mIndex].push_back(aiVector3D(obj[0], obj[1], obj[2]));
|
|
||||||
if (0 != acc.mSubOffset[2] || 0 != acc.mSubOffset[3]) {
|
|
||||||
pMesh.mNumUVComponents[pInput.mIndex] = 3;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ASSIMP_LOG_ERROR("Collada: too many texture coordinate sets. Skipping.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case IT_Color:
|
|
||||||
// up to 4 color sets are fine, ignore the others
|
|
||||||
if (pInput.mIndex < AI_MAX_NUMBER_OF_COLOR_SETS) {
|
|
||||||
// pad to current vertex count if necessary
|
|
||||||
if (pMesh.mColors[pInput.mIndex].size() < pMesh.mPositions.size() - 1)
|
|
||||||
pMesh.mColors[pInput.mIndex].insert(pMesh.mColors[pInput.mIndex].end(),
|
|
||||||
pMesh.mPositions.size() - pMesh.mColors[pInput.mIndex].size() - 1, aiColor4D(0, 0, 0, 1));
|
|
||||||
|
|
||||||
aiColor4D result(0, 0, 0, 1);
|
|
||||||
for (size_t i = 0; i < pInput.mResolved->mSize; ++i) {
|
|
||||||
result[static_cast<unsigned int>(i)] = obj[pInput.mResolved->mSubOffset[i]];
|
|
||||||
}
|
|
||||||
pMesh.mColors[pInput.mIndex].push_back(result);
|
|
||||||
} else {
|
|
||||||
ASSIMP_LOG_ERROR("Collada: too many vertex color sets. Skipping.");
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// IT_Invalid and IT_Vertex
|
|
||||||
ai_assert(false && "shouldn't ever get here");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2170,10 +2163,10 @@ void ColladaParser::ReadNodeTransformation(XmlNode &node, Node *pNode, Transform
|
||||||
|
|
||||||
// read as many parameters and store in the transformation
|
// read as many parameters and store in the transformation
|
||||||
for (unsigned int a = 0; a < sNumParameters[pType]; a++) {
|
for (unsigned int a = 0; a < sNumParameters[pType]; a++) {
|
||||||
|
// skip whitespace before the number
|
||||||
|
SkipSpacesAndLineEnd(&content);
|
||||||
// read a number
|
// read a number
|
||||||
content = fast_atoreal_move<ai_real>(content, tf.f[a]);
|
content = fast_atoreal_move<ai_real>(content, tf.f[a]);
|
||||||
// skip whitespace after it
|
|
||||||
SkipSpacesAndLineEnd(&content);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// place the transformation at the queue of the node
|
// place the transformation at the queue of the node
|
||||||
|
|
|
@ -55,6 +55,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// Assimp specific M3D configuration. Comment out these defines to remove functionality
|
// Assimp specific M3D configuration. Comment out these defines to remove functionality
|
||||||
//#define ASSIMP_USE_M3D_READFILECB
|
//#define ASSIMP_USE_M3D_READFILECB
|
||||||
|
|
||||||
|
// Share stb_image's PNG loader with other importers/exporters instead of bringing our own copy.
|
||||||
|
#define STBI_ONLY_PNG
|
||||||
|
#include <stb/stb_image.h>
|
||||||
|
|
||||||
#include "m3d.h"
|
#include "m3d.h"
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -419,8 +419,7 @@ bool PLY::DOM::ParseHeader(IOStreamBuffer<char> &streamBuffer, std::vector<char>
|
||||||
if (PLY::Element::ParseElement(streamBuffer, buffer, &out)) {
|
if (PLY::Element::ParseElement(streamBuffer, buffer, &out)) {
|
||||||
// add the element to the list of elements
|
// add the element to the list of elements
|
||||||
alElements.push_back(out);
|
alElements.push_back(out);
|
||||||
} else if ( TokenMatch(buffer, "end_header\r", 11) || //checks for header end with /r/n ending
|
} else if (TokenMatch(buffer, "end_header", 10)) { //checks for /n ending, if it doesn't end with /r/n
|
||||||
TokenMatch(buffer, "end_header", 10)) { //checks for /n ending, if it doesn't end with /r/n
|
|
||||||
// we have reached the end of the header
|
// we have reached the end of the header
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
@ -501,6 +500,11 @@ bool PLY::DOM::ParseInstanceBinary(IOStreamBuffer<char> &streamBuffer, DOM *p_pc
|
||||||
}
|
}
|
||||||
|
|
||||||
streamBuffer.getNextBlock(buffer);
|
streamBuffer.getNextBlock(buffer);
|
||||||
|
|
||||||
|
// remove first char if it's /n in case of file with /r/n
|
||||||
|
if (((char *)&buffer[0])[0] == '\n')
|
||||||
|
buffer.erase(buffer.begin(), buffer.begin() + 1);
|
||||||
|
|
||||||
unsigned int bufferSize = static_cast<unsigned int>(buffer.size());
|
unsigned int bufferSize = static_cast<unsigned int>(buffer.size());
|
||||||
const char *pCur = (char *)&buffer[0];
|
const char *pCur = (char *)&buffer[0];
|
||||||
if (!p_pcOut->ParseElementInstanceListsBinary(streamBuffer, buffer, pCur, bufferSize, loader, p_bBE)) {
|
if (!p_pcOut->ParseElementInstanceListsBinary(streamBuffer, buffer, pCur, bufferSize, loader, p_bBE)) {
|
||||||
|
|
|
@ -411,6 +411,7 @@ struct Object {
|
||||||
std::string name; //!< The user-defined name of this object
|
std::string name; //!< The user-defined name of this object
|
||||||
|
|
||||||
CustomExtension customExtensions;
|
CustomExtension customExtensions;
|
||||||
|
CustomExtension extras;
|
||||||
|
|
||||||
//! Objects marked as special are not exported (used to emulate the binary body buffer)
|
//! Objects marked as special are not exported (used to emulate the binary body buffer)
|
||||||
virtual bool IsSpecial() const { return false; }
|
virtual bool IsSpecial() const { return false; }
|
||||||
|
@ -428,6 +429,7 @@ struct Object {
|
||||||
inline Value *FindExtension(Value &val, const char *extensionId);
|
inline Value *FindExtension(Value &val, const char *extensionId);
|
||||||
|
|
||||||
inline void ReadExtensions(Value &val);
|
inline void ReadExtensions(Value &val);
|
||||||
|
inline void ReadExtras(Value &val);
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -372,6 +372,12 @@ inline void Object::ReadExtensions(Value &val) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Object::ReadExtras(Value &val) {
|
||||||
|
if (Value *curExtras = FindObject(val, "extras")) {
|
||||||
|
this->extras = glTF2::ReadExtensions("extras", *curExtras);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ASSIMP_ENABLE_DRACO
|
#ifdef ASSIMP_ENABLE_DRACO
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -612,6 +618,7 @@ Ref<T> LazyDict<T>::Retrieve(unsigned int i) {
|
||||||
ReadMember(obj, "name", inst->name);
|
ReadMember(obj, "name", inst->name);
|
||||||
inst->Read(obj, mAsset);
|
inst->Read(obj, mAsset);
|
||||||
inst->ReadExtensions(obj);
|
inst->ReadExtensions(obj);
|
||||||
|
inst->ReadExtras(obj);
|
||||||
|
|
||||||
Ref<T> result = Add(inst.release());
|
Ref<T> result = Add(inst.release());
|
||||||
mRecursiveReferenceCheck.erase(i);
|
mRecursiveReferenceCheck.erase(i);
|
||||||
|
@ -1661,9 +1668,9 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Value *extras = FindObject(pJSON_Object, "extras");
|
Value *curExtras = FindObject(pJSON_Object, "extras");
|
||||||
if (nullptr != extras) {
|
if (nullptr != curExtras) {
|
||||||
if (Value *curTargetNames = FindArray(*extras, "targetNames")) {
|
if (Value *curTargetNames = FindArray(*curExtras, "targetNames")) {
|
||||||
this->targetNames.resize(curTargetNames->Size());
|
this->targetNames.resize(curTargetNames->Size());
|
||||||
for (unsigned int i = 0; i < curTargetNames->Size(); ++i) {
|
for (unsigned int i = 0; i < curTargetNames->Size(); ++i) {
|
||||||
Value &targetNameValue = (*curTargetNames)[i];
|
Value &targetNameValue = (*curTargetNames)[i];
|
||||||
|
|
|
@ -778,19 +778,17 @@ void glTF2Exporter::ExportMaterials()
|
||||||
mat.Get(AI_MATKEY_TWOSIDED, m->doubleSided);
|
mat.Get(AI_MATKEY_TWOSIDED, m->doubleSided);
|
||||||
mat.Get(AI_MATKEY_GLTF_ALPHACUTOFF, m->alphaCutoff);
|
mat.Get(AI_MATKEY_GLTF_ALPHACUTOFF, m->alphaCutoff);
|
||||||
|
|
||||||
|
float opacity;
|
||||||
aiString alphaMode;
|
aiString alphaMode;
|
||||||
|
|
||||||
|
if (mat.Get(AI_MATKEY_OPACITY, opacity) == AI_SUCCESS) {
|
||||||
|
if (opacity < 1) {
|
||||||
|
m->alphaMode = "BLEND";
|
||||||
|
m->pbrMetallicRoughness.baseColorFactor[3] *= opacity;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (mat.Get(AI_MATKEY_GLTF_ALPHAMODE, alphaMode) == AI_SUCCESS) {
|
if (mat.Get(AI_MATKEY_GLTF_ALPHAMODE, alphaMode) == AI_SUCCESS) {
|
||||||
m->alphaMode = alphaMode.C_Str();
|
m->alphaMode = alphaMode.C_Str();
|
||||||
} else {
|
|
||||||
float opacity;
|
|
||||||
|
|
||||||
if (mat.Get(AI_MATKEY_OPACITY, opacity) == AI_SUCCESS) {
|
|
||||||
if (opacity < 1) {
|
|
||||||
m->alphaMode = "BLEND";
|
|
||||||
m->pbrMetallicRoughness.baseColorFactor[3] *= opacity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
@ -267,6 +267,7 @@ static aiMaterial *ImportMaterial(std::vector<int> &embeddedTexIdxs, Asset &r, M
|
||||||
SetMaterialColorProperty(r, mat.emissiveFactor, aimat, AI_MATKEY_COLOR_EMISSIVE);
|
SetMaterialColorProperty(r, mat.emissiveFactor, aimat, AI_MATKEY_COLOR_EMISSIVE);
|
||||||
|
|
||||||
aimat->AddProperty(&mat.doubleSided, 1, AI_MATKEY_TWOSIDED);
|
aimat->AddProperty(&mat.doubleSided, 1, AI_MATKEY_TWOSIDED);
|
||||||
|
aimat->AddProperty(&mat.pbrMetallicRoughness.baseColorFactor[3], 1, AI_MATKEY_OPACITY);
|
||||||
|
|
||||||
aiString alphaMode(mat.alphaMode);
|
aiString alphaMode(mat.alphaMode);
|
||||||
aimat->AddProperty(&alphaMode, AI_MATKEY_GLTF_ALPHAMODE);
|
aimat->AddProperty(&alphaMode, AI_MATKEY_GLTF_ALPHAMODE);
|
||||||
|
@ -998,6 +999,14 @@ void ParseExtensions(aiMetadata *metadata, const CustomExtension &extension) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ParseExtras(aiMetadata *metadata, const CustomExtension &extension) {
|
||||||
|
if (extension.mValues.isPresent) {
|
||||||
|
for (size_t i = 0; i < extension.mValues.value.size(); ++i) {
|
||||||
|
ParseExtensions(metadata, extension.mValues.value[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector<unsigned int> &meshOffsets, glTF2::Ref<glTF2::Node> &ptr) {
|
aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector<unsigned int> &meshOffsets, glTF2::Ref<glTF2::Node> &ptr) {
|
||||||
Node &node = *ptr;
|
Node &node = *ptr;
|
||||||
|
|
||||||
|
@ -1016,9 +1025,14 @@ aiNode *ImportNode(aiScene *pScene, glTF2::Asset &r, std::vector<unsigned int> &
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.customExtensions) {
|
if (node.customExtensions || node.extras) {
|
||||||
ainode->mMetaData = new aiMetadata;
|
ainode->mMetaData = new aiMetadata;
|
||||||
ParseExtensions(ainode->mMetaData, node.customExtensions);
|
if (node.customExtensions) {
|
||||||
|
ParseExtensions(ainode->mMetaData, node.customExtensions);
|
||||||
|
}
|
||||||
|
if (node.extras) {
|
||||||
|
ParseExtras(ainode->mMetaData, node.extras);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GetNodeTransform(ainode->mTransformation, node);
|
GetNodeTransform(ainode->mTransformation, node);
|
||||||
|
|
|
@ -873,6 +873,7 @@ ELSE()
|
||||||
../contrib/pugixml/src/pugiconfig.hpp
|
../contrib/pugixml/src/pugiconfig.hpp
|
||||||
../contrib/pugixml/src/pugixml.hpp
|
../contrib/pugixml/src/pugixml.hpp
|
||||||
)
|
)
|
||||||
|
INCLUDE_DIRECTORIES("../contrib/pugixml/src")
|
||||||
SOURCE_GROUP( Contrib\\Pugixml FILES ${Pugixml_SRCS})
|
SOURCE_GROUP( Contrib\\Pugixml FILES ${Pugixml_SRCS})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
@ -1033,16 +1034,26 @@ IF(ASSIMP_HUNTER_ENABLED)
|
||||||
hunter_add_package(RapidJSON)
|
hunter_add_package(RapidJSON)
|
||||||
find_package(RapidJSON CONFIG REQUIRED)
|
find_package(RapidJSON CONFIG REQUIRED)
|
||||||
ELSE()
|
ELSE()
|
||||||
INCLUDE_DIRECTORIES( "../contrib/rapidjson/include" )
|
INCLUDE_DIRECTORIES("../contrib/rapidjson/include")
|
||||||
INCLUDE_DIRECTORIES( "../contrib" )
|
ADD_DEFINITIONS( -DRAPIDJSON_HAS_STDSTRING=1)
|
||||||
INCLUDE_DIRECTORIES( "../contrib/pugixml/src" )
|
|
||||||
ADD_DEFINITIONS( -DRAPIDJSON_HAS_STDSTRING=1 )
|
|
||||||
option( ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR "Suppress rapidjson warning on MSVC (NOTE: breaks android build)" ON )
|
option( ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR "Suppress rapidjson warning on MSVC (NOTE: breaks android build)" ON )
|
||||||
if(ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR)
|
if(ASSIMP_RAPIDJSON_NO_MEMBER_ITERATOR)
|
||||||
ADD_DEFINITIONS( -DRAPIDJSON_NOMEMBERITERATORCLASS )
|
ADD_DEFINITIONS( -DRAPIDJSON_NOMEMBERITERATORCLASS )
|
||||||
endif()
|
endif()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
# stb
|
||||||
|
IF(ASSIMP_HUNTER_ENABLED)
|
||||||
|
hunter_add_package(stb)
|
||||||
|
find_package(stb CONFIG REQUIRED)
|
||||||
|
ELSE()
|
||||||
|
SET( stb_SRCS
|
||||||
|
../contrib/stb/stb_image.h
|
||||||
|
)
|
||||||
|
INCLUDE_DIRECTORIES("../contrib")
|
||||||
|
SOURCE_GROUP( Contrib\\stb FILES ${stb_SRCS})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# VC2010 fixes
|
# VC2010 fixes
|
||||||
if(MSVC10)
|
if(MSVC10)
|
||||||
option( VC10_STDINT_FIX "Fix for VC10 Compiler regarding pstdint.h redefinition errors" OFF )
|
option( VC10_STDINT_FIX "Fix for VC10 Compiler regarding pstdint.h redefinition errors" OFF )
|
||||||
|
@ -1101,6 +1112,7 @@ SET( assimp_src
|
||||||
${open3dgc_SRCS}
|
${open3dgc_SRCS}
|
||||||
${ziplib_SRCS}
|
${ziplib_SRCS}
|
||||||
${Pugixml_SRCS}
|
${Pugixml_SRCS}
|
||||||
|
${stb_SRCS}
|
||||||
# Necessary to show the headers in the project when using the VC++ generator:
|
# Necessary to show the headers in the project when using the VC++ generator:
|
||||||
|
|
||||||
${PUBLIC_HEADERS}
|
${PUBLIC_HEADERS}
|
||||||
|
@ -1158,6 +1170,7 @@ IF(ASSIMP_HUNTER_ENABLED)
|
||||||
utf8cpp
|
utf8cpp
|
||||||
zip::zip
|
zip::zip
|
||||||
pugixml
|
pugixml
|
||||||
|
stb::stb
|
||||||
)
|
)
|
||||||
|
|
||||||
if (ASSIMP_BUILD_DRACO)
|
if (ASSIMP_BUILD_DRACO)
|
||||||
|
|
|
@ -1251,3 +1251,36 @@ ASSIMP_API void aiQuaternionInterpolate(
|
||||||
ai_assert(nullptr != end);
|
ai_assert(nullptr != end);
|
||||||
aiQuaternion::Interpolate(*dst, *start, *end, factor);
|
aiQuaternion::Interpolate(*dst, *start, *end, factor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// stb_image is a lightweight image loader. It is shared by:
|
||||||
|
// - M3D import
|
||||||
|
// - PBRT export
|
||||||
|
// Since it's a header-only library, its implementation must be instantiated in some cpp file.
|
||||||
|
// Don't scatter this task over multiple importers/exporters. Maintain it in a central place (here!).
|
||||||
|
|
||||||
|
#define ASSIMP_HAS_PBRT_EXPORT (!ASSIMP_BUILD_NO_EXPORT && !ASSIMP_BUILD_NO_PBRT_EXPORTER)
|
||||||
|
#define ASSIMP_HAS_M3D ((!ASSIMP_BUILD_NO_EXPORT && !ASSIMP_BUILD_NO_M3D_EXPORTER) || !ASSIMP_BUILD_NO_M3D_IMPORTER)
|
||||||
|
|
||||||
|
#if ASSIMP_HAS_PBRT_EXPORT
|
||||||
|
# define ASSIMP_NEEDS_STB_IMAGE 1
|
||||||
|
#elif ASSIMP_HAS_M3D
|
||||||
|
# define ASSIMP_NEEDS_STB_IMAGE 1
|
||||||
|
# define STBI_ONLY_PNG
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if ASSIMP_NEEDS_STB_IMAGE
|
||||||
|
|
||||||
|
# if _MSC_VER // "unreferenced function has been removed" (SSE2 detection routine in x64 builds)
|
||||||
|
# pragma warning(push)
|
||||||
|
# pragma warning(disable: 4505)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# define STB_IMAGE_IMPLEMENTATION
|
||||||
|
# include "stb/stb_image.h"
|
||||||
|
|
||||||
|
# if _MSC_VER
|
||||||
|
# pragma warning(pop)
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -83,8 +83,7 @@ Other:
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define STB_IMAGE_IMPLEMENTATION
|
#include "stb/stb_image.h"
|
||||||
#include "stb_image.h"
|
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -34,7 +34,8 @@ if os.name=='posix':
|
||||||
additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
|
additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
|
||||||
|
|
||||||
# check if running from anaconda.
|
# check if running from anaconda.
|
||||||
if "conda" or "continuum" in sys.version.lower():
|
anaconda_keywords = ("conda", "continuum")
|
||||||
|
if any(k in sys.version.lower() for k in anaconda_keywords):
|
||||||
cur_path = get_python_lib()
|
cur_path = get_python_lib()
|
||||||
pattern = re.compile('.*\/lib\/')
|
pattern = re.compile('.*\/lib\/')
|
||||||
conda_lib = pattern.match(cur_path).group()
|
conda_lib = pattern.match(cur_path).group()
|
||||||
|
|
Binary file not shown.
|
@ -382,3 +382,25 @@ public:
|
||||||
TEST_F(utColladaZaeImportExport, importBlenFromFileTest) {
|
TEST_F(utColladaZaeImportExport, importBlenFromFileTest) {
|
||||||
EXPECT_TRUE(importerTest());
|
EXPECT_TRUE(importerTest());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(utColladaZaeImportExport, importMakeHumanTest) {
|
||||||
|
Assimp::Importer importer;
|
||||||
|
const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/Collada/human.zae", aiProcess_ValidateDataStructure);
|
||||||
|
ASSERT_NE(nullptr, scene);
|
||||||
|
|
||||||
|
// Expected number of items
|
||||||
|
EXPECT_EQ(scene->mNumMeshes, 2u);
|
||||||
|
EXPECT_EQ(scene->mNumMaterials, 2u);
|
||||||
|
EXPECT_EQ(scene->mNumAnimations, 0u);
|
||||||
|
EXPECT_EQ(scene->mNumTextures, 2u);
|
||||||
|
EXPECT_EQ(scene->mNumLights, 0u);
|
||||||
|
EXPECT_EQ(scene->mNumCameras, 0u);
|
||||||
|
|
||||||
|
// Expected common metadata
|
||||||
|
aiString value;
|
||||||
|
EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT, value)) << "No importer format metadata";
|
||||||
|
EXPECT_STREQ("Collada Importer", value.C_Str());
|
||||||
|
|
||||||
|
EXPECT_TRUE(scene->mMetaData->Get(AI_METADATA_SOURCE_FORMAT_VERSION, value)) << "No format version metadata";
|
||||||
|
EXPECT_STREQ("1.4.1", value.C_Str());
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue