public virtual void Dispose() { RenderManager.Renderer.DeleteMesh(this); vertices.Clear(); indices.Clear(); if (skeleton != null) { if (skeleton.GetAnimations() != null) { skeleton.GetAnimations().Clear(); } if (skeleton.GetBones() != null) { skeleton.GetBones().Clear(); } skeleton = null; } }
public void SetSkeleton(Animation.Skeleton skeleton) { this.skeleton = skeleton; }
private static void SaveSkeleton(Skeleton s, XmlWriter writer) { writer.WriteStartElement(TOKEN_SKELETON); foreach (Bone b in s.GetBones()) { SaveBone(b, writer); } if (s.GetAnimations().Count > 0) { SaveAnimations(s, writer); } writer.WriteEndElement(); }
private static void SaveAnimations(Skeleton s, XmlWriter writer) { writer.WriteStartElement(TOKEN_ANIMATIONS); foreach (Animation anim in s.GetAnimations()) { SaveAnimation(anim, writer); } writer.WriteEndElement(); }
public override void ResetLoader() { skeleton = new Skeleton(); bindAxis = new Vector3f(Vector3f.Zero); bindAngle = 0f; lastElement = ""; keyframeBoneTrans = new Vector3f(Vector3f.Zero); keyframeBoneAxis = new Vector3f(Vector3f.Zero); keyframeBoneTime = 0f; keyframeBoneAngle = 0f; keyframeBoneName = ""; }
public AnimationController(Skeleton skeleton) { this.skeleton = skeleton; }
public override object Load(LoadedAsset asset) { XmlReader xmlReader = XmlReader.Create(asset.Data); while (xmlReader.Read()) { if (xmlReader.NodeType == XmlNodeType.Element) { if (xmlReader.Name == "position") { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); positions.Add(vec); } else if (xmlReader.Name == "normal") { float x = float.Parse(xmlReader.GetAttribute("x")); float y = float.Parse(xmlReader.GetAttribute("y")); float z = float.Parse(xmlReader.GetAttribute("z")); Vector3f vec = new Vector3f(x, y, z); normals.Add(vec); } else if (xmlReader.Name == "texcoord") { float x = float.Parse(xmlReader.GetAttribute(0)); float y = float.Parse(xmlReader.GetAttribute(1)); Vector2f tc = new Vector2f(x, -y); texCoords.Add(tc); } else if (xmlReader.Name == "face") { if (!useSubmeshes) { faces.Add(int.Parse(xmlReader.GetAttribute(0))); faces.Add(int.Parse(xmlReader.GetAttribute(1))); faces.Add(int.Parse(xmlReader.GetAttribute(2))); } else if (useSubmeshes) { CurrentSubmesh().faces.Add(int.Parse(xmlReader.GetAttribute(0))); CurrentSubmesh().faces.Add(int.Parse(xmlReader.GetAttribute(1))); CurrentSubmesh().faces.Add(int.Parse(xmlReader.GetAttribute(2))); } } else if (xmlReader.Name == "skeletonlink") { string parentPath = System.IO.Directory.GetParent(asset.FilePath).ToString(); string skeletonPath = parentPath + "\\" + xmlReader.GetAttribute(0) + ".xml"; skeleton = (Skeleton)AssetManager.Load(skeletonPath, OgreXmlSkeletonLoader.GetInstance()); } else if (xmlReader.Name == "vertexboneassignment" || xmlReader.Name == "boneassignment") { int vidx = int.Parse(xmlReader.GetAttribute("vertexindex")); float boneWeight = float.Parse(xmlReader.GetAttribute("weight")); int boneIndex = int.Parse(xmlReader.GetAttribute("boneindex")); AddToBoneAssigns(vidx, new BoneAssign(vidx, boneWeight, boneIndex)); } else if (xmlReader.Name == "submesh") { useSubmeshes = true; if (xmlReader.GetAttribute("operationtype") != null) { // material Submesh sm = new Submesh(); subMeshes.Add(sm); } } } } xmlReader.Close(); List<Vertex> vertices = new List<Vertex>(); if (!useSubmeshes) { LoopThrough(faces, ref vertices); } else { for (int i = subMeshes.Count - 1; i > -1; i--) { Submesh s = subMeshes[i]; if (s.faces.Count > 0) LoopThrough(s.faces, ref s.vertices); else subMeshes.Remove(s); } } if (skeleton.GetNumBones() > 0) { for (int i = 0; i < skeleton.GetNumBones(); i++) skeleton.GetBone(i).SetToBindingPose(); skeleton.GetBone(0).CalculateBindingRotation(); skeleton.GetBone(0).CalculateBindingTranslation(); for (int i = 0; i < skeleton.GetNumBones(); i++) { skeleton.GetBone(i).StoreBindingPose(); skeleton.GetBone(i).ClearPose(); } skeleton.GetBone(0).UpdateTransform(); } bool hasAnimations = skeleton.GetAnimations().Count > 0; AnimationController animControl = new AnimationController(skeleton); Node res = new Node(); if (!useSubmeshes) { Mesh mesh = new Mesh(); mesh.SetSkeleton(skeleton); mesh.SetVertices(vertices); Geometry geom = new Geometry(); geom.Mesh = mesh; res.AddChild(geom); } else { for (int i = 0; i < subMeshes.Count; i++) { Submesh sm = subMeshes[i]; Mesh mesh = new Mesh(); mesh.SetSkeleton(skeleton); mesh.SetVertices(sm.vertices); Geometry geom = new Geometry(); geom.Mesh = mesh; res.AddChild(geom); } } if (hasAnimations) { res.AddController(animControl); } ResetLoader(); return res; }
public override void ResetLoader() { positions.Clear(); normals.Clear(); texCoords.Clear(); faces.Clear(); useSubmeshes = false; boneAssigns.Clear(); subMeshes.Clear(); skeleton = new Skeleton(); }