Parcourir la source

- Meshs without UVs are now supported

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@479 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
jonathanklein il y a 16 ans
Parent
commit
29bb83ebb6

+ 207 - 64
code/OgreImporter.cpp

@@ -99,6 +99,8 @@ void OgreImporter::InternReadFile(const std::string &pFile, aiScene *pScene, Ass
 		string SkeletonFile=GetAttribute<string>(MeshFile, "name");
 		LoadSkeleton(SkeletonFile);
 	}
+	else
+		DefaultLogger::get()->warn(MeshFile->getNodeName());
 	//__________________________________________________________________
 
 
@@ -166,7 +168,10 @@ void OgreImporter::ReadSubMesh(SubMesh &theSubMesh, XmlReader *Reader)
 			}
 			HasPositions=GetAttribute<bool>(Reader, "positions");
 			HasNormals=GetAttribute<bool>(Reader, "normals");
-			NumUvs=GetAttribute<int>(Reader, "texture_coords");
+			if(!Reader->getAttributeValue("texture_coords"))//we can have 1 or 0 uv channels, and if the mesh has no uvs, it also doesn't have the attribute
+				NumUvs=0;
+			else
+				NumUvs=GetAttribute<int>(Reader, "texture_coords");
 			if(NumUvs>1)
 				throw new ImportErrorException("too many texcoords (just 1 supported!)");
 
@@ -214,7 +219,6 @@ void OgreImporter::ReadSubMesh(SubMesh &theSubMesh, XmlReader *Reader)
 		else if(string(Reader->getNodeName())=="boneassignments")
 		{
 			Weights.resize(Positions.size());
-			XmlRead(Reader);
 			while(XmlRead(Reader) && Reader->getNodeName()==string("vertexboneassignment"))
 			{
 				Weight NewWeight;
@@ -224,13 +228,13 @@ void OgreImporter::ReadSubMesh(SubMesh &theSubMesh, XmlReader *Reader)
 				
 				Weights[VertexId].push_back(NewWeight);
 
-				XmlRead(Reader);
+				//XmlRead(Reader);//Once i had this line, and than i got only every second boneassignment, but my first test models had even boneassignment counts, so i thougt, everything would work. And yes, i HATE irrXML!!!
 			}
 
 		}//end of boneassignments
 	}
 	DefaultLogger::get()->debug(str(format("Positionen: %1% Normale: %2% TexCoords: %3%") % Positions.size() % Normals.size() % Uvs.size()));
-	DefaultLogger::get()->debug(Reader->getNodeName());
+	DefaultLogger::get()->warn(Reader->getNodeName());
 
 
 
@@ -251,9 +255,12 @@ void OgreImporter::ReadSubMesh(SubMesh &theSubMesh, XmlReader *Reader)
 		UniqueNormals[3*i+1]=Normals[FaceList[i].VertexIndices[1]];
 		UniqueNormals[3*i+2]=Normals[FaceList[i].VertexIndices[2]];
 
-		UniqueUvs[3*i+0]=Uvs[FaceList[i].VertexIndices[0]];
-		UniqueUvs[3*i+1]=Uvs[FaceList[i].VertexIndices[1]];
-		UniqueUvs[3*i+2]=Uvs[FaceList[i].VertexIndices[2]];
+		if(1==NumUvs)
+		{
+			UniqueUvs[3*i+0]=Uvs[FaceList[i].VertexIndices[0]];
+			UniqueUvs[3*i+1]=Uvs[FaceList[i].VertexIndices[1]];
+			UniqueUvs[3*i+2]=Uvs[FaceList[i].VertexIndices[2]];
+		}
 
 		UniqueWeights[3*i+0]=UniqueWeights[FaceList[i].VertexIndices[0]];
 		UniqueWeights[3*i+1]=UniqueWeights[FaceList[i].VertexIndices[1]];
@@ -287,13 +294,17 @@ void OgreImporter::ReadSubMesh(SubMesh &theSubMesh, XmlReader *Reader)
 	memcpy(NewAiMesh->mNormals, &UniqueNormals[0], UniqueNormals.size()*sizeof(aiVector3D));
 
 	//Uvs
-	NewAiMesh->mNumUVComponents[0]=2;
-	//NewAiMesh->mTextureCoords=new aiVector3D*[1];
-	NewAiMesh->mTextureCoords[0]= new aiVector3D[UniqueUvs.size()];
-	memcpy(NewAiMesh->mTextureCoords[0], &UniqueUvs[0], UniqueUvs.size()*sizeof(aiVector3D));
+	if(0!=NumUvs)
+	{
+		NewAiMesh->mNumUVComponents[0]=2;
+		NewAiMesh->mTextureCoords[0]= new aiVector3D[UniqueUvs.size()];
+		memcpy(NewAiMesh->mTextureCoords[0], &UniqueUvs[0], UniqueUvs.size()*sizeof(aiVector3D));
+	}
 
 	//Bones
-	
+	/*NewAiMesh->mNumBones=UniqueWeights.size();
+	NewAiMesh->mBones=new aiBone*[UniqueWeights.size()];
+	for(un*/
 
 
 
@@ -513,46 +524,49 @@ void OgreImporter::LoadSkeleton(std::string FileName)
 	if(string("skeleton")!=SkeletonFile->getNodeName())
 		throw new ImportErrorException("No <skeleton> node in SkeletonFile: "+FileName);
 
-	//load bones
+
+
+	//------------------------------------load bones-----------------------------------------
+	XmlRead(SkeletonFile);
+	if(string("bones")!=SkeletonFile->getNodeName())
+		throw new ImportErrorException("No bones node in skeleton "+FileName);
+
 	XmlRead(SkeletonFile);
-	if(string("bones")==SkeletonFile->getNodeName())
+
+	while(string("bone")==SkeletonFile->getNodeName())
 	{
-		XmlRead(SkeletonFile);
-		while(string("bone")==SkeletonFile->getNodeName())
-		{
-			//TODO: Maybe we can have bone ids for the errrors, but normaly, they should never appera, so what....
+		//TODO: Maybe we can have bone ids for the errrors, but normaly, they should never appera, so what....
 
-			//read a new bone:
-			Bone NewBone;
-			NewBone.Id=GetAttribute<int>(SkeletonFile, "id");
-			NewBone.Name=GetAttribute<string>(SkeletonFile, "name");
+		//read a new bone:
+		Bone NewBone;
+		NewBone.Id=GetAttribute<int>(SkeletonFile, "id");
+		NewBone.Name=GetAttribute<string>(SkeletonFile, "name");
 
-			//load the position:
-			XmlRead(SkeletonFile);
-			if(string("position")!=SkeletonFile->getNodeName())
-				throw new ImportErrorException("Position is not first node in Bone!");
-			NewBone.Position.x=GetAttribute<float>(SkeletonFile, "x");
-			NewBone.Position.y=GetAttribute<float>(SkeletonFile, "y");
-			NewBone.Position.z=GetAttribute<float>(SkeletonFile, "z");
+		//load the position:
+		XmlRead(SkeletonFile);
+		if(string("position")!=SkeletonFile->getNodeName())
+			throw new ImportErrorException("Position is not first node in Bone!");
+		NewBone.Position.x=GetAttribute<float>(SkeletonFile, "x");
+		NewBone.Position.y=GetAttribute<float>(SkeletonFile, "y");
+		NewBone.Position.z=GetAttribute<float>(SkeletonFile, "z");
 
-			//Rotation:
-			XmlRead(SkeletonFile);
-			if(string("rotation")!=SkeletonFile->getNodeName())
-				throw new ImportErrorException("Rotation is not the second node in Bone!");
-			NewBone.RotationAngle=GetAttribute<float>(SkeletonFile, "angle");
-			XmlRead(SkeletonFile);
-			if(string("axis")!=SkeletonFile->getNodeName())
-				throw new ImportErrorException("No axis specified for bone rotation!");
-			NewBone.RotationAxis.x=GetAttribute<float>(SkeletonFile, "x");
-			NewBone.RotationAxis.y=GetAttribute<float>(SkeletonFile, "y");
-			NewBone.RotationAxis.z=GetAttribute<float>(SkeletonFile, "z");
+		//Rotation:
+		XmlRead(SkeletonFile);
+		if(string("rotation")!=SkeletonFile->getNodeName())
+			throw new ImportErrorException("Rotation is not the second node in Bone!");
+		NewBone.RotationAngle=GetAttribute<float>(SkeletonFile, "angle");
+		XmlRead(SkeletonFile);
+		if(string("axis")!=SkeletonFile->getNodeName())
+			throw new ImportErrorException("No axis specified for bone rotation!");
+		NewBone.RotationAxis.x=GetAttribute<float>(SkeletonFile, "x");
+		NewBone.RotationAxis.y=GetAttribute<float>(SkeletonFile, "y");
+		NewBone.RotationAxis.z=GetAttribute<float>(SkeletonFile, "z");
 
-			//append the newly loaded bone to the bone list
-			Bones.push_back(NewBone);
+		//append the newly loaded bone to the bone list
+		Bones.push_back(NewBone);
 
-			//Proceed to the next bone:
-			XmlRead(SkeletonFile);
-		}
+		//Proceed to the next bone:
+		XmlRead(SkeletonFile);
 	}
 	//The bones in the file a not neccesarly ordered by there id's so we do it now:
 	sort(Bones.begin(), Bones.end());
@@ -568,41 +582,115 @@ void OgreImporter::LoadSkeleton(std::string FileName)
 		if(!IdsOk)
 			throw new ImportErrorException("Bone Ids are not valid!"+FileName);
 	}
-
 	DefaultLogger::get()->debug(str(format("Number of bones: %1%") % Bones.size()));
+	//________________________________________________________________________________
 
 
 
 
 
 
-	//load bonehierarchy
-	if(string("bonehierarchy")==SkeletonFile->getNodeName())
+	//----------------------------load bonehierarchy--------------------------------
+	if(string("bonehierarchy")!=SkeletonFile->getNodeName())
+		throw new ImportErrorException("no bonehierarchy node in "+FileName);
+
+	DefaultLogger::get()->debug("loading bonehierarchy...");
+	XmlRead(SkeletonFile);
+	while(string("boneparent")==SkeletonFile->getNodeName())
 	{
-		DefaultLogger::get()->debug("loading bonehierarchy...");
-		XmlRead(SkeletonFile);
-		while(string("boneparent")==SkeletonFile->getNodeName())
-		{
-			string Child, Parent;
-			Child=GetAttribute<string>(SkeletonFile, "bone");
-			Parent=GetAttribute<string>(SkeletonFile, "parent");
+		string Child, Parent;
+		Child=GetAttribute<string>(SkeletonFile, "bone");
+		Parent=GetAttribute<string>(SkeletonFile, "parent");
 
-			unsigned int ChildId, ParentId;
-			ChildId=find(Bones.begin(), Bones.end(), Child)->Id;
-			ParentId=find(Bones.begin(), Bones.end(), Parent)->Id;
+		unsigned int ChildId, ParentId;
+		ChildId=find(Bones.begin(), Bones.end(), Child)->Id;
+		ParentId=find(Bones.begin(), Bones.end(), Parent)->Id;
 
-			Bones[ChildId].ParentId=ParentId;
-			Bones[ParentId].Children.push_back(ChildId);
+		Bones[ChildId].ParentId=ParentId;
+		Bones[ParentId].Children.push_back(ChildId);
 
-			XmlRead(SkeletonFile);//i once forget this line, which led to an endless loop, did i mentioned, that irrxml sucks??
-		}
+		XmlRead(SkeletonFile);//i once forget this line, which led to an endless loop, did i mentioned, that irrxml sucks??
 	}
+	//_____________________________________________________________________________
+
 	
 
 
+	//---------------------------load animations-----------------------------
+	vector<Animation> Animations;
+	if(string("animations")==SkeletonFile->getNodeName())//animations are optional values
+	{
+		DefaultLogger::get()->debug("Loading Animations");
+		XmlRead(SkeletonFile);
+		while(string("animation")==SkeletonFile->getNodeName())
+		{
+			Animation NewAnimation;
+			NewAnimation.Name=GetAttribute<string>(SkeletonFile, "name");
+			NewAnimation.Length=GetAttribute<float>(SkeletonFile, "length");
+			
+			//Load all Tracks
+			XmlRead(SkeletonFile);
+			if(string("tracks")!=SkeletonFile->getNodeName())
+				throw new ImportErrorException("no tracks node in animation");
+			XmlRead(SkeletonFile);
+			while(string("track")==SkeletonFile->getNodeName())
+			{
+				Track NewTrack;
+				NewTrack.BoneName=GetAttribute<string>(SkeletonFile, "bone");
+
+				//Load all keyframes;
+				XmlRead(SkeletonFile);
+				if(string("keyframes")!=SkeletonFile->getNodeName())
+					throw new ImportErrorException("no keyframes node!");
+				XmlRead(SkeletonFile);
+				while(string("keyframe")==SkeletonFile->getNodeName())
+				{
+					Keyframe NewKeyframe;
+					NewKeyframe.Time=GetAttribute<float>(SkeletonFile, "time");
+
+					//Position:
+					XmlRead(SkeletonFile);
+					if(string("translate")!=SkeletonFile->getNodeName())
+						throw new ImportErrorException("translate node not first in keyframe");
+					NewKeyframe.Position.x=GetAttribute<float>(SkeletonFile, "x");
+					NewKeyframe.Position.y=GetAttribute<float>(SkeletonFile, "y");
+					NewKeyframe.Position.z=GetAttribute<float>(SkeletonFile, "z");
+
+					//Rotation:
+					XmlRead(SkeletonFile);
+					if(string("rotate")!=SkeletonFile->getNodeName())
+						throw new ImportErrorException("rotate is not second node in keyframe");
+					float RotationAngle=GetAttribute<float>(SkeletonFile, "angle");
+					aiVector3D RotationAxis;
+					XmlRead(SkeletonFile);
+					if(string("axis")!=SkeletonFile->getNodeName())
+						throw new ImportErrorException("No axis for keyframe rotation!");
+					RotationAxis.x=GetAttribute<float>(SkeletonFile, "x");
+					RotationAxis.y=GetAttribute<float>(SkeletonFile, "y");
+					RotationAxis.z=GetAttribute<float>(SkeletonFile, "z");
+					NewKeyframe.Rotation=aiQuaternion(RotationAxis, RotationAngle);
+
+					//Scaling:
+					XmlRead(SkeletonFile);
+					if(string("scale")!=SkeletonFile->getNodeName())
+						throw new ImportErrorException("no scalling key in keyframe!");
+					NewKeyframe.Scaling.x=GetAttribute<float>(SkeletonFile, "x");
+					NewKeyframe.Scaling.y=GetAttribute<float>(SkeletonFile, "y");
+					NewKeyframe.Scaling.z=GetAttribute<float>(SkeletonFile, "z");
+
+
+					NewTrack.Keyframes.push_back(NewKeyframe);
+					XmlRead(SkeletonFile);
+				}
+
 
-	//load animations
+				NewAnimation.Tracks.push_back(NewTrack);
+			}
 
+			Animations.push_back(NewAnimation);
+		}
+	}
+	//_____________________________________________________________________________
 
 
 
@@ -615,7 +703,7 @@ void OgreImporter::LoadSkeleton(std::string FileName)
 	if(0!=m_CurrentScene->mRootNode->mNumChildren)
 		throw new ImportErrorException("Root Node already has childnodes!");
 
-	//create a node for all root bones:
+	//--------------Creatre the assimp bone hierarchy-----------------
 	DefaultLogger::get()->debug("Root Bones");
 	vector<aiNode*> RootBoneNodes;
 	BOOST_FOREACH(Bone theBone, Bones)
@@ -629,8 +717,63 @@ void OgreImporter::LoadSkeleton(std::string FileName)
 	m_CurrentScene->mRootNode->mNumChildren=RootBoneNodes.size();
 	m_CurrentScene->mRootNode->mChildren=new aiNode*[RootBoneNodes.size()];
 	memcpy(m_CurrentScene->mRootNode->mChildren, &RootBoneNodes[0], sizeof(aiNode*)*RootBoneNodes.size());
+	//_______________________________________________________________
+
+
+	//-----------------Create the Assimp Animations --------------------
+	if(Animations.size()>0)//Maybe the model had only a skeleton and no animations. (If it also has no skeleton, this function would'nt have benn called
+	{
+		m_CurrentScene->mNumAnimations=Animations.size();
+		m_CurrentScene->mAnimations=new aiAnimation*[Animations.size()];
+		for(unsigned int i=0; i<Animations.size(); ++i)//create all animations
+		{
+			aiAnimation* NewAnimation=new aiAnimation();
+			NewAnimation->mName=Animations[i].Name;
+			NewAnimation->mDuration=Animations[i].Length;
+			NewAnimation->mTicksPerSecond=0.05f;
+
+			//Create all tracks in this animation
+			NewAnimation->mNumChannels=Animations[i].Tracks.size();
+			NewAnimation->mChannels=new aiNodeAnim*[Animations[i].Tracks.size()];
+			for(unsigned int j=0; j<Animations[i].Tracks.size(); ++j)
+			{
+				aiNodeAnim* NewNodeAnim=new aiNodeAnim();
+				NewNodeAnim->mNodeName=Animations[i].Tracks[j].BoneName;
+
+				//Create the keyframe arrays...
+				unsigned int KeyframeCount=Animations[i].Tracks[j].Keyframes.size();
+				NewNodeAnim->mNumPositionKeys=KeyframeCount;
+				NewNodeAnim->mPositionKeys=new aiVectorKey[KeyframeCount];
+				NewNodeAnim->mNumRotationKeys=KeyframeCount;
+				NewNodeAnim->mRotationKeys=new aiQuatKey[KeyframeCount];
+				NewNodeAnim->mNumScalingKeys=KeyframeCount;
+				NewNodeAnim->mScalingKeys=new aiVectorKey[KeyframeCount];
+				
+				//...and fill them
+				for(unsigned int k=0; k<KeyframeCount; ++k)
+				{
+					NewNodeAnim->mPositionKeys[k].mTime=Animations[i].Tracks[j].Keyframes[k].Time;
+					NewNodeAnim->mPositionKeys[k].mValue=Animations[i].Tracks[j].Keyframes[k].Position;
+					
+					NewNodeAnim->mRotationKeys[k].mTime=Animations[i].Tracks[j].Keyframes[k].Time;
+					NewNodeAnim->mRotationKeys[k].mValue=Animations[i].Tracks[j].Keyframes[k].Rotation;
+
+					NewNodeAnim->mScalingKeys[k].mTime=Animations[i].Tracks[j].Keyframes[k].Time;
+					NewNodeAnim->mScalingKeys[k].mValue=Animations[i].Tracks[j].Keyframes[k].Scaling;
+				}
+				
+				NewAnimation->mChannels[j]=NewNodeAnim;
+			}
+
+			m_CurrentScene->mAnimations[i]=NewAnimation;
+		}
+	}
+	//__________________________________________________________________
 }
 
+
+
+
 aiNode* CreateAiNodeFromBone(int BoneId, std::vector<Bone> Bones, aiNode* ParentNode)
 {
 	//----Create the node for this bone and set its values-----

+ 9 - 2
code/OgreImporter.h

@@ -59,7 +59,7 @@ template<> inline int GetAttribute<int>(XmlReader* Reader, std::string Name)
 	if(Value)
 		return atoi(Value);
 	else
-		throw ImportErrorException(std::string("Attribute "+Name+" does not exist in "+Reader->getNodeName()).c_str());
+		throw new ImportErrorException(std::string("Attribute "+Name+" does not exist in "+Reader->getNodeName()).c_str());
 }
 
 template<> inline float GetAttribute<float>(XmlReader* Reader, std::string Name)
@@ -68,7 +68,7 @@ template<> inline float GetAttribute<float>(XmlReader* Reader, std::string Name)
 	if(Value)
 		return fast_atof(Value);
 	else
-		throw ImportErrorException(std::string("Attribute "+Name+" does not exist in "+Reader->getNodeName()).c_str());
+		throw new ImportErrorException(std::string("Attribute "+Name+" does not exist in "+Reader->getNodeName()).c_str());
 }
 
 template<> inline std::string GetAttribute<std::string>(XmlReader* Reader, std::string Name)
@@ -163,16 +163,23 @@ struct Animation
 {
 	std::string Name;
 	float Length;
+	std::vector<Track> Tracks;
 };
 
 ///a track (keyframes for one bone) from an animation
 struct Track
 {
+	std::string BoneName;
+	std::vector<Keyframe> Keyframes;
 };
 
 /// keyframe (bone transformation) from a track from a animation
 struct Keyframe
 {
+	float Time;
+	aiVector3D Position;
+	aiQuaternion Rotation;
+	aiVector3D Scaling;
 };
 
 }//namespace Ogre

+ 316 - 0
test/models/Ogre/Animationtest/Arm.skeleton.xml

@@ -0,0 +1,316 @@
+<skeleton>
+	<bones>
+		<bone id="1" name="Unten">
+			<position x="0.000000" y="0.000000" z="0.000000"/>
+			<rotation angle="0.000000">
+				<axis x="1.000000" y="0.000000" z="0.000000"/>
+			</rotation>
+		</bone>
+		<bone id="0" name="Oben">
+			<position x="0.000000" y="1.900000" z="0.000000"/>
+			<rotation angle="0.000000">
+				<axis x="1.000000" y="0.000000" z="0.000000"/>
+			</rotation>
+		</bone>
+	</bones>
+	<bonehierarchy>
+		<boneparent bone="Oben" parent="Unten" />
+	</bonehierarchy>
+	<animations>
+		<animation name="Winken" length="1.600000">
+			<tracks>
+				<track bone="Oben">
+					<keyframes>
+						<keyframe time="0.000000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.000000">
+								<axis x="1.000000" y="0.000000" z="0.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.040000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.158026">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.080000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.349055">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.120000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.567840">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.160000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.800710">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.200000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.026944">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.240000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.225277">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.280000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.381198">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.320000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.489394">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.360000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.551204">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.400000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.570796">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.440000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.559713">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.480000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.525461">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.520000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.465579">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.560000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.376290">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.600000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.252558">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.640000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.088552">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.680000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.879007">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.720000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.622084">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.760000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.323567">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.800000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.000000">
+								<axis x="0.000000" y="0.000000" z="1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.840000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.323568">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.880000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.622084">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.920000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.879007">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="0.960000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.088552">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.000000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.252558">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.040000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.376290">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.080000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.465579">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.120000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.525460">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.160000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.559713">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.200000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.570796">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.240000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.551204">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.280000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.489394">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.320000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.381198">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.360000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.225277">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.400000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="1.026944">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.440000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.800710">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.480000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.567840">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.520000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.349055">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.560000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.158026">
+								<axis x="0.000000" y="0.000000" z="-1.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+						<keyframe time="1.600000">
+							<translate x="0.000000" y="0.000000" z="0.000000"/>
+							<rotate angle="0.000000">
+								<axis x="1.000000" y="0.000000" z="0.000000"/>
+							</rotate>
+							<scale x="1.000000" y="1.000000" z="1.000000"/>
+						</keyframe>
+					</keyframes>
+				</track>
+			</tracks>
+		</animation>
+	</animations>
+</skeleton>

+ 259 - 0
test/models/Ogre/Animationtest/Cube.mesh.xml

@@ -0,0 +1,259 @@
+<mesh>
+	<submeshes>
+		<submesh material="Material" usesharedvertices="false">
+			<faces count="28">
+				<face v1="0" v2="1" v3="2"/>
+				<face v1="0" v2="2" v3="3"/>
+				<face v1="4" v2="5" v3="7"/>
+				<face v1="5" v2="6" v3="7"/>
+				<face v1="8" v2="9" v3="11"/>
+				<face v1="9" v2="10" v3="11"/>
+				<face v1="12" v2="13" v3="15"/>
+				<face v1="13" v2="14" v3="15"/>
+				<face v1="16" v2="17" v3="18"/>
+				<face v1="16" v2="18" v3="19"/>
+				<face v1="5" v2="4" v3="21"/>
+				<face v1="4" v2="20" v3="21"/>
+				<face v1="19" v2="18" v3="23"/>
+				<face v1="18" v2="22" v3="23"/>
+				<face v1="9" v2="8" v3="24"/>
+				<face v1="9" v2="24" v3="25"/>
+				<face v1="0" v2="3" v3="27"/>
+				<face v1="3" v2="26" v3="27"/>
+				<face v1="27" v2="26" v3="29"/>
+				<face v1="26" v2="28" v3="29"/>
+				<face v1="25" v2="24" v3="30"/>
+				<face v1="25" v2="30" v3="31"/>
+				<face v1="23" v2="22" v3="32"/>
+				<face v1="23" v2="32" v3="33"/>
+				<face v1="21" v2="20" v3="35"/>
+				<face v1="20" v2="34" v3="35"/>
+				<face v1="36" v2="37" v3="39"/>
+				<face v1="37" v2="38" v3="39"/>
+			</faces>
+			<geometry vertexcount="40">
+				<vertexbuffer positions="true" normals="true">
+					<vertex>
+						<position x="1.000000" y="1.000000" z="-1.000000"/>
+						<normal x="0.000000" y="-0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="0.000000" y="-0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="0.000000" y="-0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="1.000000" z="-1.000000"/>
+						<normal x="0.000000" y="-0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="0.999999" z="1.000000"/>
+						<normal x="0.000000" y="0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="1.000000" z="1.000000"/>
+						<normal x="0.000000" y="0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="1.000000"/>
+						<normal x="0.000000" y="0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="0.999999" y="-1.000001" z="1.000000"/>
+						<normal x="0.000000" y="0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="1.000000" z="-1.000000"/>
+						<normal x="1.000000" y="-0.000001" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="0.999999" z="1.000000"/>
+						<normal x="1.000000" y="-0.000001" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="0.999999" y="-1.000001" z="1.000000"/>
+						<normal x="1.000000" y="-0.000001" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="1.000000" y="-0.000001" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="0.999999" y="-1.000001" z="1.000000"/>
+						<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="1.000000"/>
+						<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="-0.000000" y="-1.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="-1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="-1.000000" z="1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="1.000000" z="1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-1.000000" y="1.000000" z="-1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="3.000000" z="1.000000"/>
+						<normal x="-0.000000" y="-0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="3.000000" z="1.000000"/>
+						<normal x="-0.000000" y="-0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="3.000000" z="1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="3.000000" z="-1.000000"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="3.000000" z="-1.000000"/>
+						<normal x="1.000000" y="-0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="3.000000" z="1.000000"/>
+						<normal x="1.000000" y="-0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="3.000000" z="-1.000000"/>
+						<normal x="0.000000" y="0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000000" y="3.000000" z="-1.000000"/>
+						<normal x="0.000000" y="0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="-0.999999"/>
+						<normal x="0.000000" y="0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="-0.999999"/>
+						<normal x="0.000000" y="0.000000" z="-1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="-0.999999"/>
+						<normal x="1.000000" y="-0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="1.000001"/>
+						<normal x="1.000000" y="-0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="1.000001"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="-0.999999"/>
+						<normal x="-1.000000" y="0.000000" z="-0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="1.000001"/>
+						<normal x="-0.000000" y="-0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="1.000001"/>
+						<normal x="-0.000000" y="-0.000000" z="1.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="1.000001"/>
+						<normal x="0.000000" y="1.000000" z="0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="1.000001" y="5.000000" z="-0.999999"/>
+						<normal x="0.000000" y="1.000000" z="0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="-0.999999"/>
+						<normal x="0.000000" y="1.000000" z="0.000000"/>
+					</vertex>
+					<vertex>
+						<position x="-0.999999" y="5.000000" z="1.000001"/>
+						<normal x="0.000000" y="1.000000" z="0.000000"/>
+					</vertex>
+				</vertexbuffer>
+			</geometry>
+			<boneassignments>
+				<vertexboneassignment vertexindex="0" boneindex="1" weight="0.906643"/>
+				<vertexboneassignment vertexindex="0" boneindex="0" weight="0.093356"/>
+				<vertexboneassignment vertexindex="1" boneindex="1" weight="0.980516"/>
+				<vertexboneassignment vertexindex="2" boneindex="1" weight="0.980662"/>
+				<vertexboneassignment vertexindex="3" boneindex="1" weight="0.906108"/>
+				<vertexboneassignment vertexindex="3" boneindex="0" weight="0.093892"/>
+				<vertexboneassignment vertexindex="4" boneindex="1" weight="0.907323"/>
+				<vertexboneassignment vertexindex="4" boneindex="0" weight="0.092677"/>
+				<vertexboneassignment vertexindex="5" boneindex="1" weight="0.907298"/>
+				<vertexboneassignment vertexindex="5" boneindex="0" weight="0.092702"/>
+				<vertexboneassignment vertexindex="6" boneindex="1" weight="0.980827"/>
+				<vertexboneassignment vertexindex="7" boneindex="1" weight="0.980624"/>
+				<vertexboneassignment vertexindex="8" boneindex="1" weight="0.906643"/>
+				<vertexboneassignment vertexindex="8" boneindex="0" weight="0.093356"/>
+				<vertexboneassignment vertexindex="9" boneindex="1" weight="0.907323"/>
+				<vertexboneassignment vertexindex="9" boneindex="0" weight="0.092677"/>
+				<vertexboneassignment vertexindex="10" boneindex="1" weight="0.980624"/>
+				<vertexboneassignment vertexindex="11" boneindex="1" weight="0.980516"/>
+				<vertexboneassignment vertexindex="12" boneindex="1" weight="0.980516"/>
+				<vertexboneassignment vertexindex="13" boneindex="1" weight="0.980624"/>
+				<vertexboneassignment vertexindex="14" boneindex="1" weight="0.980827"/>
+				<vertexboneassignment vertexindex="15" boneindex="1" weight="0.980662"/>
+				<vertexboneassignment vertexindex="16" boneindex="1" weight="0.980662"/>
+				<vertexboneassignment vertexindex="17" boneindex="1" weight="0.980827"/>
+				<vertexboneassignment vertexindex="18" boneindex="1" weight="0.907298"/>
+				<vertexboneassignment vertexindex="18" boneindex="0" weight="0.092702"/>
+				<vertexboneassignment vertexindex="19" boneindex="1" weight="0.906108"/>
+				<vertexboneassignment vertexindex="19" boneindex="0" weight="0.093892"/>
+				<vertexboneassignment vertexindex="20" boneindex="1" weight="0.092568"/>
+				<vertexboneassignment vertexindex="20" boneindex="0" weight="0.907432"/>
+				<vertexboneassignment vertexindex="21" boneindex="1" weight="0.092574"/>
+				<vertexboneassignment vertexindex="21" boneindex="0" weight="0.907426"/>
+				<vertexboneassignment vertexindex="22" boneindex="1" weight="0.092574"/>
+				<vertexboneassignment vertexindex="22" boneindex="0" weight="0.907426"/>
+				<vertexboneassignment vertexindex="23" boneindex="1" weight="0.092465"/>
+				<vertexboneassignment vertexindex="23" boneindex="0" weight="0.907535"/>
+				<vertexboneassignment vertexindex="24" boneindex="1" weight="0.092519"/>
+				<vertexboneassignment vertexindex="24" boneindex="0" weight="0.907481"/>
+				<vertexboneassignment vertexindex="25" boneindex="1" weight="0.092568"/>
+				<vertexboneassignment vertexindex="25" boneindex="0" weight="0.907432"/>
+				<vertexboneassignment vertexindex="26" boneindex="1" weight="0.092465"/>
+				<vertexboneassignment vertexindex="26" boneindex="0" weight="0.907535"/>
+				<vertexboneassignment vertexindex="27" boneindex="1" weight="0.092519"/>
+				<vertexboneassignment vertexindex="27" boneindex="0" weight="0.907481"/>
+				<vertexboneassignment vertexindex="28" boneindex="0" weight="0.980879"/>
+				<vertexboneassignment vertexindex="29" boneindex="0" weight="0.980707"/>
+				<vertexboneassignment vertexindex="30" boneindex="0" weight="0.980707"/>
+				<vertexboneassignment vertexindex="31" boneindex="0" weight="0.980864"/>
+				<vertexboneassignment vertexindex="32" boneindex="0" weight="0.980699"/>
+				<vertexboneassignment vertexindex="33" boneindex="0" weight="0.980879"/>
+				<vertexboneassignment vertexindex="34" boneindex="0" weight="0.980864"/>
+				<vertexboneassignment vertexindex="35" boneindex="0" weight="0.980699"/>
+				<vertexboneassignment vertexindex="36" boneindex="0" weight="0.980864"/>
+				<vertexboneassignment vertexindex="37" boneindex="0" weight="0.980707"/>
+				<vertexboneassignment vertexindex="38" boneindex="0" weight="0.980879"/>
+				<vertexboneassignment vertexindex="39" boneindex="0" weight="0.980699"/>
+			</boneassignments>
+		</submesh>
+	</submeshes>
+	<skeletonlink name="Arm.skeleton"/>
+</mesh>

+ 14 - 0
test/models/Ogre/Animationtest/Scene.material

@@ -0,0 +1,14 @@
+material Material
+{
+	receive_shadows on
+	technique
+	{
+		pass
+		{
+			ambient 0.500000 0.500000 0.500000 1.000000
+			diffuse 0.640000 0.640000 0.640000 1.000000
+			specular 0.500000 0.500000 0.500000 1.000000 12.500000
+			emissive 0.000000 0.000000 0.000000 1.000000
+		}
+	}
+}