2
0
Эх сурвалжийг харах

Merge pull request #483 from DenisMikhalev/issue-482

Use material names, set default direction to UP_Y, process extra tag
Alexander Gessler 10 жил өмнө
parent
commit
7d3d66936b

+ 1 - 0
code/ColladaHelper.h

@@ -395,6 +395,7 @@ struct Controller
 /** A collada material. Pretty much the only member is a reference to an effect. */
 /** A collada material. Pretty much the only member is a reference to an effect. */
 struct Material
 struct Material
 {
 {
+	std::string mName;
 	std::string mEffect;
 	std::string mEffect;
 };
 };
 
 

+ 2 - 2
code/ColladaLoader.cpp

@@ -176,7 +176,7 @@ void ColladaLoader::InternReadFile( const std::string& pFile, aiScene* pScene, I
 				 0,  0,  1,  0,
 				 0,  0,  1,  0,
 				 0, -1,  0,  0,
 				 0, -1,  0,  0,
 				 0,  0,  0,  1);
 				 0,  0,  0,  1);
-        }
+		}
 	// store all meshes
 	// store all meshes
 	StoreSceneMeshes( pScene);
 	StoreSceneMeshes( pScene);
 
 
@@ -1379,7 +1379,7 @@ void ColladaLoader::BuildMaterials( ColladaParser& pParser, aiScene* /*pScene*/)
 
 
 		// create material
 		// create material
 		aiMaterial* mat = new aiMaterial;
 		aiMaterial* mat = new aiMaterial;
-		aiString name( matIt->first);
+		aiString name( material.mName.empty() ? matIt->first : material.mName );
 		mat->AddProperty(&name,AI_MATKEY_NAME);
 		mat->AddProperty(&name,AI_MATKEY_NAME);
 
 
 		// store the material
 		// store the material

+ 37 - 5
code/ColladaParser.cpp

@@ -60,7 +60,7 @@ ColladaParser::ColladaParser( IOSystem* pIOHandler, const std::string& pFile)
 {
 {
 	mRootNode = NULL;
 	mRootNode = NULL;
 	mUnitSize = 1.0f;
 	mUnitSize = 1.0f;
-	mUpDirection = UP_Z;
+	mUpDirection = UP_Y;
 
 
 	// We assume the newest file format by default
 	// We assume the newest file format by default
 	mFormat = FV_1_5_n;
 	mFormat = FV_1_5_n;
@@ -225,10 +225,10 @@ void ColladaParser::ReadAssetInfo()
 				const char* content = GetTextContent();
 				const char* content = GetTextContent();
 				if( strncmp( content, "X_UP", 4) == 0)
 				if( strncmp( content, "X_UP", 4) == 0)
 					mUpDirection = UP_X;
 					mUpDirection = UP_X;
-				else if( strncmp( content, "Y_UP", 4) == 0)
-					mUpDirection = UP_Y;
-				else
+				else if( strncmp( content, "Z_UP", 4) == 0)
 					mUpDirection = UP_Z;
 					mUpDirection = UP_Z;
+				else
+					mUpDirection = UP_Y;
 
 
 				// check element end
 				// check element end
 				TestClosing( "up_axis");
 				TestClosing( "up_axis");
@@ -817,6 +817,7 @@ void ColladaParser::ReadMaterialLibrary()
 	if( mReader->isEmptyElement())
 	if( mReader->isEmptyElement())
 		return;
 		return;
 
 
+	std::map<std::string, int> names;
 	while( mReader->read())
 	while( mReader->read())
 	{
 	{
 		if( mReader->getNodeType() == irr::io::EXN_ELEMENT) 
 		if( mReader->getNodeType() == irr::io::EXN_ELEMENT) 
@@ -827,8 +828,32 @@ void ColladaParser::ReadMaterialLibrary()
 				int attrID = GetAttribute( "id");
 				int attrID = GetAttribute( "id");
 				std::string id = mReader->getAttributeValue( attrID);
 				std::string id = mReader->getAttributeValue( attrID);
 
 
+				std::string name;
+				int attrName = TestAttribute("name");
+				if (attrName >= 0)
+					name = mReader->getAttributeValue( attrName);
+
 				// create an entry and store it in the library under its ID
 				// create an entry and store it in the library under its ID
-				ReadMaterial(mMaterialLibrary[id] = Material());
+				mMaterialLibrary[id] = Material();
+
+				if( !name.empty())
+				{
+					std::map<std::string, int>::iterator it = names.find( name);
+					if( it != names.end())
+					{
+						std::ostringstream strStream;
+						strStream << ++it->second;
+						name.append( " " + strStream.str());
+					}
+					else
+					{
+						names[name] = 0;
+					}
+
+					mMaterialLibrary[id].mName = name;
+				}
+
+				ReadMaterial( mMaterialLibrary[id]);
 			} else
 			} else
 			{
 			{
 				// ignore the rest
 				// ignore the rest
@@ -1385,6 +1410,9 @@ void ColladaParser::ReadEffectColor( aiColor4D& pColor, Sampler& pSampler)
 				if( attrTex >= 0 )
 				if( attrTex >= 0 )
 	  				pSampler.mUVChannel = mReader->getAttributeValue( attrTex);
 	  				pSampler.mUVChannel = mReader->getAttributeValue( attrTex);
 				//SkipElement();
 				//SkipElement();
+
+				// as we've read texture, the color needs to be 1,1,1,1
+				pColor = aiColor4D(1.f, 1.f, 1.f, 1.f);
 			}
 			}
 			else if( IsElement( "technique"))
 			else if( IsElement( "technique"))
 			{
 			{
@@ -1936,6 +1964,10 @@ void ColladaParser::ReadIndexData( Mesh* pMesh)
 					// now here the actual fun starts - these are the indices to construct the mesh data from
 					// now here the actual fun starts - these are the indices to construct the mesh data from
 					actualPrimitives += ReadPrimitives(pMesh, perIndexData, numPrimitives, vcount, primType);
 					actualPrimitives += ReadPrimitives(pMesh, perIndexData, numPrimitives, vcount, primType);
 				}
 				}
+			}
+			else if (IsElement("extra"))
+			{
+				SkipElement("extra");
 			} else
 			} else
 			{
 			{
 				ThrowException( boost::str( boost::format( "Unexpected sub element <%s> in tag <%s>") % mReader->getNodeName() % elementName));
 				ThrowException( boost::str( boost::format( "Unexpected sub element <%s> in tag <%s>") % mReader->getNodeName() % elementName));