Merge branch 'assimp:master' into master
commit
1429927ab9
|
@ -95,6 +95,7 @@ ColladaLoader::ColladaLoader() :
|
|||
noSkeletonMesh(false),
|
||||
removeEmptyBones(false),
|
||||
ignoreUpDirection(false),
|
||||
ignoreUnitSize(false),
|
||||
useColladaName(false),
|
||||
mNodeNameCounter(0) {
|
||||
// empty
|
||||
|
@ -122,6 +123,7 @@ void ColladaLoader::SetupProperties(const Importer *pImp) {
|
|||
noSkeletonMesh = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_NO_SKELETON_MESHES, 0) != 0;
|
||||
removeEmptyBones = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_REMOVE_EMPTY_BONES, true) != 0;
|
||||
ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION, 0) != 0;
|
||||
ignoreUnitSize = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UNIT_SIZE, 0) != 0;
|
||||
useColladaName = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_USE_COLLADA_NAMES, 0) != 0;
|
||||
}
|
||||
|
||||
|
@ -170,12 +172,15 @@ void ColladaLoader::InternReadFile(const std::string &pFile, aiScene *pScene, IO
|
|||
// ... then fill the materials with the now adjusted settings
|
||||
FillMaterials(parser, pScene);
|
||||
|
||||
if (!ignoreUnitSize) {
|
||||
// Apply unit-size scale calculation
|
||||
|
||||
pScene->mRootNode->mTransformation *= aiMatrix4x4(parser.mUnitSize, 0, 0, 0,
|
||||
pScene->mRootNode->mTransformation *= aiMatrix4x4(
|
||||
parser.mUnitSize, 0, 0, 0,
|
||||
0, parser.mUnitSize, 0, 0,
|
||||
0, 0, parser.mUnitSize, 0,
|
||||
0, 0, 0, 1);
|
||||
}
|
||||
|
||||
if (!ignoreUpDirection) {
|
||||
// Convert to Y_UP, if different orientation
|
||||
if (parser.mUpDirection == ColladaParser::UP_X) {
|
||||
|
|
|
@ -239,6 +239,7 @@ protected:
|
|||
bool noSkeletonMesh;
|
||||
bool removeEmptyBones;
|
||||
bool ignoreUpDirection;
|
||||
bool ignoreUnitSize;
|
||||
bool useColladaName;
|
||||
|
||||
/** Used by FindNameForNode() to generate unique node names */
|
||||
|
|
|
@ -836,7 +836,17 @@ void glTF2Exporter::ExportMaterials() {
|
|||
GetMatTex(mat, m->pbrMetallicRoughness.baseColorTexture, aiTextureType_DIFFUSE);
|
||||
}
|
||||
|
||||
GetMatTex(mat, m->pbrMetallicRoughness.metallicRoughnessTexture, aiTextureType_DIFFUSE_ROUGHNESS);
|
||||
|
||||
if (!m->pbrMetallicRoughness.metallicRoughnessTexture.texture) {
|
||||
// if there wasn't a aiTextureType_DIFFUSE_ROUGHNESS defined in the source, fallback to aiTextureType_METALNESS
|
||||
GetMatTex(mat, m->pbrMetallicRoughness.metallicRoughnessTexture, aiTextureType_METALNESS);
|
||||
}
|
||||
|
||||
if (!m->pbrMetallicRoughness.metallicRoughnessTexture.texture) {
|
||||
// if there still wasn't a aiTextureType_METALNESS defined in the source, fallback to AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE
|
||||
GetMatTex(mat, m->pbrMetallicRoughness.metallicRoughnessTexture, AI_MATKEY_GLTF_PBRMETALLICROUGHNESS_METALLICROUGHNESS_TEXTURE);
|
||||
}
|
||||
|
||||
if (GetMatColor(mat, m->pbrMetallicRoughness.baseColorFactor, AI_MATKEY_BASE_COLOR) != AI_SUCCESS) {
|
||||
// if baseColorFactor wasn't defined, then the source is likely not a metallic roughness material.
|
||||
|
|
|
@ -64,8 +64,14 @@ inline double GetArea2D(const T& v1, const T& v2, const T& v3) {
|
|||
* The function accepts an unconstrained template parameter for use with
|
||||
* both aiVector3D and aiVector2D, but generally ignores the third coordinate.*/
|
||||
template <typename T>
|
||||
inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
||||
return GetArea2D(p0,p2,p1) > 0;
|
||||
inline int OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
||||
double area = GetArea2D(p0,p2,p1);
|
||||
if(std::abs(area) < ai_epsilon)
|
||||
return 0;
|
||||
else if(area > 0)
|
||||
return 1;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
|
@ -75,7 +81,10 @@ inline bool OnLeftSideOfLine2D(const T& p0, const T& p1,const T& p2) {
|
|||
template <typename T>
|
||||
inline bool PointInTriangle2D(const T& p0, const T& p1,const T& p2, const T& pp) {
|
||||
// pp should be left side of the three triangle side, by ccw arrow
|
||||
return OnLeftSideOfLine2D(p0, p1, pp) && OnLeftSideOfLine2D(p1, p2, pp) && OnLeftSideOfLine2D(p2, p0, pp);
|
||||
int c1 = OnLeftSideOfLine2D(p0, p1, pp);
|
||||
int c2 = OnLeftSideOfLine2D(p1, p2, pp);
|
||||
int c3 = OnLeftSideOfLine2D(p2, p0, pp);
|
||||
return (c1 >= 0) && (c2 >= 0) && (c3 >= 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -110,7 +119,7 @@ inline bool IsCCW(T* in, size_t npoints) {
|
|||
c = std::sqrt(cc);
|
||||
theta = std::acos((bb + cc - aa) / (2 * b * c));
|
||||
|
||||
if (OnLeftSideOfLine2D(in[i],in[i+2],in[i+1])) {
|
||||
if (OnLeftSideOfLine2D(in[i],in[i+2],in[i+1]) == 1) {
|
||||
// if (convex(in[i].x, in[i].y,
|
||||
// in[i+1].x, in[i+1].y,
|
||||
// in[i+2].x, in[i+2].y)) {
|
||||
|
@ -140,7 +149,7 @@ inline bool IsCCW(T* in, size_t npoints) {
|
|||
//if (convex(in[npoints-2].x, in[npoints-2].y,
|
||||
// in[0].x, in[0].y,
|
||||
// in[1].x, in[1].y)) {
|
||||
if (OnLeftSideOfLine2D(in[npoints-2],in[1],in[0])) {
|
||||
if (OnLeftSideOfLine2D(in[npoints-2],in[1],in[0]) == 1) {
|
||||
convex_turn = AI_MATH_PI_F - theta;
|
||||
convex_sum += convex_turn;
|
||||
} else {
|
||||
|
|
|
@ -451,7 +451,7 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) {
|
|||
*pnt2 = &temp_verts[next];
|
||||
|
||||
// Must be a convex point. Assuming ccw winding, it must be on the right of the line between p-1 and p+1.
|
||||
if (OnLeftSideOfLine2D(*pnt0,*pnt2,*pnt1)) {
|
||||
if (OnLeftSideOfLine2D(*pnt0,*pnt2,*pnt1) == 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -302,7 +302,9 @@ bool TXmlParser<TNodeType>::parse(IOStream *stream) {
|
|||
stream->Read(&mData[0], 1, len);
|
||||
|
||||
mDoc = new pugi::xml_document();
|
||||
pugi::xml_parse_result parse_result = mDoc->load_string(&mData[0], pugi::parse_full);
|
||||
// load_string assumes native encoding (aka always utf-8 per build options)
|
||||
//pugi::xml_parse_result parse_result = mDoc->load_string(&mData[0], pugi::parse_full);
|
||||
pugi::xml_parse_result parse_result = mDoc->load_buffer(&mData[0], mData.size(), pugi::parse_full);
|
||||
if (parse_result.status == pugi::status_ok) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1035,6 +1035,15 @@ enum aiComponent
|
|||
*/
|
||||
#define AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION "IMPORT_COLLADA_IGNORE_UP_DIRECTION"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** @brief Specifies whether the Collada loader will ignore the provided unit size.
|
||||
*
|
||||
* If this property is set to true, the unit size provided in the file header will
|
||||
* be ignored and the file will be loaded without scaling the assets.
|
||||
* Property type: Bool. Default value: false.
|
||||
*/
|
||||
#define AI_CONFIG_IMPORT_COLLADA_IGNORE_UNIT_SIZE "IMPORT_COLLADA_IGNORE_UNIT_SIZE"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
/** @brief Specifies whether the Collada loader should use Collada names.
|
||||
*
|
||||
|
|
|
@ -211,6 +211,7 @@ AI_FORCE_INLINE aiReturn aiMaterial::Get(const char* pKey,unsigned int type,
|
|||
unsigned int idx,aiColor3D& pOut) const {
|
||||
aiColor4D c;
|
||||
const aiReturn ret = aiGetMaterialColor(this,pKey,type,idx,&c);
|
||||
if (ret == aiReturn_SUCCESS)
|
||||
pOut = aiColor3D(c.r,c.g,c.b);
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue