Ogre Mesh and Skeleton XML Loader (Unity Engine)

Post new topic   Reply to topic

View previous topic View next topic Go down

Ogre Mesh and Skeleton XML Loader (Unity Engine)

Post by InfinitasImpetum on Fri Jan 02, 2015 4:05 pm

if i loaded the xml directly into unity  it would be slow, so i will be using a mid binary format to handle things.  thought i share my work so others can help improve it. code written in visual studio express C#

//tested and works. doesn't load bone weights yet
Code:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.IO;

public class OgreMesh {
   XmlDocument meshdoc = new XmlDocument();

   public void loadFile(string FileName)
   {
      meshdoc.Load(FileName);
   }

   public Mesh constructMesh()
   {
      //Debug.Log ("works");
      Mesh mesh = new Mesh();

      //indices
      XmlNode sharedgeometry = meshdoc.DocumentElement.SelectSingleNode("/mesh/sharedgeometry");
      XmlNode vertexbuffer = sharedgeometry.FirstChild;
      int Count;
      int texCoords;
      bool norms;
      bool positions;
      
      int.TryParse(sharedgeometry.Attributes["vertexcount"].InnerText,out Count);
      bool.TryParse(vertexbuffer.Attributes["positions"].InnerText, out positions);
      int.TryParse(vertexbuffer.Attributes["texture_coords"].InnerText, out texCoords);
      bool.TryParse(vertexbuffer.Attributes["normals"].InnerText, out norms);

      XmlNodeList vertexList = vertexbuffer.ChildNodes;
      List<Vector3> Vertices = new List<Vector3> ();
      List<Vector3> Normals = new List<Vector3> ();
      List<Vector2> UVs = new List<Vector2> ();
      
      for (int i = 0; i < Count; i++)
      {
         XmlNodeList vertex = vertexList.Item(i).ChildNodes;

         if (positions)
         {
            XmlNode pNode = vertex.Item(findChild(vertex, "position", 0));
            Vertices.Add(new Vector3(float.Parse(pNode.Attributes["x"].InnerText),
                                          float.Parse(pNode.Attributes["y"].InnerText),
                                          float.Parse(pNode.Attributes["z"].InnerText)));
         }
         
         if (norms)
         { 
            XmlNode nNode = vertex.Item(findChild(vertex, "normal", 1));
            Normals.Add(new Vector3(float.Parse(nNode.Attributes["x"].InnerText),
                                         float.Parse(nNode.Attributes["y"].InnerText),
                                         float.Parse(nNode.Attributes["z"].InnerText)));
         }
         if (texCoords > 0)
         {
            XmlNode tNode = vertex.Item(findChild(vertex, "texcoord", 1));
            UVs.Add(new Vector2(float.Parse(tNode.Attributes["u"].InnerText),
                                    float.Parse(tNode.Attributes["v"].InnerText)));
         }
      }

      if (positions)
         mesh.vertices = Vertices.ToArray();
      if (norms)
         mesh.normals = Normals.ToArray();
      if (texCoords > 0)
         mesh.uv = UVs.ToArray();


      //triangles/faces
      XmlNode faces = meshdoc.DocumentElement.SelectSingleNode("/mesh/submeshes/submesh/faces");
      int.TryParse(faces.Attributes["count"].InnerText, out Count);
      
      List<int> Triangles = new List<int> ();
      for (int i = 0; i < Count; i++)
      {
         Triangles.Add(int.Parse(faces.ChildNodes.Item(i).Attributes["v1"].InnerText));
         Triangles.Add(int.Parse(faces.ChildNodes.Item(i).Attributes["v2"].InnerText));
         Triangles.Add(int.Parse(faces.ChildNodes.Item(i).Attributes["v3"].InnerText));
      }

      mesh.triangles = Triangles.ToArray ();

      return mesh;
   }
   
   int findChild(XmlNodeList List, string Name, int firstCheck)
   {
      if (List.Item(firstCheck).Name == Name)
         return firstCheck;
      
      return findChild(List, Name);
   }
   int findChild(XmlNodeList List, string Name)
   {
      for(int k = 0; k < List.Count; k++)
      {
         if (List.Item(k).Name == Name)
            return k;
      }
      
      return -1;
   }

   public BoneWeight[] constructSkinning()
   {
      List<BoneWeight> weights = new List<BoneWeight> ();
















      return weights.ToArray ();
   }
   
}



my failed skeleton loading script. works but not completely.
Code:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.IO;

public struct BoneData
{
   public string Name;
   public string Parent;
   public Vector3 Position;
   public Quaternion Rotation;
}
public class OgreSkeleton{

   XmlDocument meshdoc = new XmlDocument();

   public void loadFile(string FileName)
   {
      meshdoc.Load(FileName);
   }

   public BoneData[] constructSkeleton()
   {
      List<BoneData> BD = new List<BoneData> ();
      BoneData sBD;
      XmlNode Bones = meshdoc.DocumentElement.SelectSingleNode ("/skeleton/bones");
      for (int i = 0; i < Bones.ChildNodes.Count; i ++) {
         XmlNode Bone = Bones.ChildNodes[i];
         XmlNode bonePosition = Bone.ChildNodes[0];
         XmlNode boneRotation = Bone.ChildNodes[1];

         sBD = new BoneData();
         sBD.Name = Bone.Attributes["name"].InnerText;
         sBD.Position = new Vector3(float.Parse(bonePosition.Attributes["x"].InnerText),
                                   float.Parse(bonePosition.Attributes["y"].InnerText),
                                   float.Parse(bonePosition.Attributes["z"].InnerText));

         sBD.Rotation = new Quaternion(float.Parse(boneRotation.FirstChild.Attributes["x"].InnerText),
                                      float.Parse(boneRotation.FirstChild.Attributes["y"].InnerText),
                                      float.Parse(boneRotation.FirstChild.Attributes["z"].InnerText),
                                      float.Parse(boneRotation.Attributes["angle"].InnerText));

         BD.Add(sBD);

      }
      BoneData[] BoneDataArray = BD.ToArray();

      XmlNode bonehierarchy = meshdoc.DocumentElement.SelectSingleNode ("/skeleton/bonehierarchy");

      for (int i = 0; i < bonehierarchy.ChildNodes.Count; i ++) {
         string bpBone = bonehierarchy.ChildNodes[i].Attributes["bone"].InnerText;   
         string bpParent = bonehierarchy.ChildNodes[i].Attributes["parent"].InnerText;
         //find bone a set parent
         for (int x = 0; x < BoneDataArray.Length; x++)
         {
            if (BoneDataArray[x].Name == bpBone)
            {
               BoneDataArray[x].Parent = bpParent; break;
            }
         }
      }

      return BoneDataArray;
   }

   public void constructAnimations()
   {




   }



}
avatar
InfinitasImpetum
(0%)-Lv8
(0%)-Lv8

Posts : 2160
Join date : 2012-05-30
Age : 27

View user profile

Back to top Go down

Re: Ogre Mesh and Skeleton XML Loader (Unity Engine)

Post by 00f on Sat Jan 03, 2015 1:59 pm

who understands programming here other than u?

__________________________________________________________________________________________






REVERBLAST






avatar
00f
(90%)-Lv4
(90%)-Lv4

Posts : 500
Join date : 2014-11-06
Currently : Japan

View user profile

Back to top Go down

Re: Ogre Mesh and Skeleton XML Loader (Unity Engine)

Post by InfinitasImpetum on Sat Jan 03, 2015 4:09 pm

so it here for those who are learning or interested.  maxilos is studying programming he might want to see my scripts.

__________________________________________________________________________________________

avatar
InfinitasImpetum
(0%)-Lv8
(0%)-Lv8

Posts : 2160
Join date : 2012-05-30
Age : 27

View user profile

Back to top Go down

Re: Ogre Mesh and Skeleton XML Loader (Unity Engine)

Post by Sponsored content


Sponsored content


Back to top Go down

View previous topic View next topic Back to top

- Similar topics

Post new topic   Reply to topic
 
Permissions in this forum:
You can reply to topics in this forum