private Grendgine_Collada_Node GetSkeletonFromVisualScene(Grendgine_Collada scene) { // We need to get the hierarchy of the bone structure. // DAE stores it in the visual scene, but sometimes it's hidden under layers of // other nodes. To get around that, we're going to check every node in the visual scene // for if A) it's a "JOINT" node and B) it has children, ie the node property isn't null. // The check will be recursive, working on every node in the hierarchy until we find what // *should* be the skeleton's root. Grendgine_Collada_Node root = null; foreach (Grendgine_Collada_Visual_Scene visScene in scene.Library_Visual_Scene.Visual_Scene) { foreach (Grendgine_Collada_Node node in visScene.Node) { root = GetSkeletonFromNodeRecursive(node); if (root != null) { break; } } } return(root); }
public Bone(Grendgine_Collada_Node node) { Children = new List <Bone>(); InverseBindMatrix = Matrix4.Identity; Bounds = new BoundingBox(); Name = node.Name; Unknown4 = 255; float[] nodeTransform = node.Matrix[0].Value(); Matrix4 transform = new Matrix4(nodeTransform[0], nodeTransform[1], nodeTransform[2], nodeTransform[3], nodeTransform[4], nodeTransform[5], nodeTransform[6], nodeTransform[7], nodeTransform[8], nodeTransform[9], nodeTransform[10], nodeTransform[11], nodeTransform[12], nodeTransform[13], nodeTransform[14], nodeTransform[15]); Scale = transform.ExtractScale(); Translation = new Vector3(transform.Column3[0], transform.Column3[1], transform.Column3[2]); Rotation = transform.ExtractRotation(); if (node.node == null) { return; } foreach (Grendgine_Collada_Node childNode in node.node) { Bone child = new Bone(childNode); Children.Add(child); } }
private Grendgine_Collada_Node GetSkeletonFromNodeRecursive(Grendgine_Collada_Node node) { Grendgine_Collada_Node skelRoot = null; if (node.Type == Grendgine_Collada_Node_Type.JOINT && node.node != null) { return(node); } else if (node.node != null) { foreach (Grendgine_Collada_Node child in node.node) { skelRoot = GetSkeletonFromNodeRecursive(child); if (skelRoot != null) { break; } } } else if (node.Name.ToLower().Contains("root")) { skelRoot = node; } return(skelRoot); }
Grendgine_Collada_Node CreateNode(string name) { Grendgine_Collada_Node node = new Grendgine_Collada_Node(); node.Name = name; node.Type = Grendgine_Collada_Node_Type.NODE; node.Instance_Geometry = new Grendgine_Collada_Instance_Geometry[1]; Grendgine_Collada_Instance_Geometry geom = new Grendgine_Collada_Instance_Geometry(); geom.URL = "#ID2"; geom.Bind_Material = new Grendgine_Collada_Bind_Material[1]; geom.Bind_Material[0] = CreateBindMaterial(); node.Instance_Geometry[0] = geom; return(node); }
public SkeletonData(Grendgine_Collada scene, Grendgine_Collada_Skin skin) { FlatHierarchy = new List <Bone>(); BonesWithGeometry = new List <Bone>(); boneNameList = new List <string>(); inverseBindMatrices = new List <Matrix4>(); // Get the skeleton's root from the visual scene Grendgine_Collada_Node rootNode = GetSkeletonFromVisualScene(scene); // If a proper root was found, we create a new bone hierarchy from it if (rootNode != null) { SkeletonRoot = new Bone(rootNode); MakeDAESkeleton(skin); } // Otherwise, we create a root bone ourselves else { SkeletonRoot = new Bone(); FlatHierarchy.Add(SkeletonRoot); } }