public node MakeBone(int index, Bone bone) { var node = bone.MakeCollada(Name); var children = new List<node>(); for (int i = 0; i < Skeleton.Bones.Count; i++) { if (Skeleton.Bones[i].ParentIndex == index) children.Add(MakeBone(i, Skeleton.Bones[i])); } node.node1 = children.ToArray(); return node; }
public static Bone FromCollada(node bone, int parentIndex, List<Bone> bones, Dictionary<string, Bone> boneSIDs, Dictionary<string, Bone> boneIDs) { var transMat = ColladaHelpers.TransformFromNode(bone); var colladaBone = new Bone(); colladaBone.TransformSID = transMat.TransformSID; var myIndex = bones.Count; bones.Add(colladaBone); boneSIDs.Add(bone.sid, colladaBone); if (bone.id != null) { boneIDs.Add(bone.id, colladaBone); } colladaBone.ParentIndex = parentIndex; colladaBone.Name = bone.name; colladaBone.LODError = 0; // TODO colladaBone.Transform = transMat.transform; colladaBone.UpdateInverseWorldTransform(bones); if (bone.node1 != null) { foreach (var node in bone.node1) { if (node.type == NodeType.JOINT) { FromCollada(node, myIndex, bones, boneSIDs, boneIDs); } } } return colladaBone; }
private void GenerateDummySkeleton(Root root) { foreach (var model in root.Models) { if (model.Skeleton == null) { Utils.Info(String.Format("Generating dummy skeleton for model '{0}'", model.Name)); var skeleton = new Skeleton(); skeleton.Name = model.Name; skeleton.LODType = 0; skeleton.IsDummy = true; root.Skeletons.Add(skeleton); var bone = new Bone(); bone.Name = model.Name; bone.ParentIndex = -1; skeleton.Bones = new List<Bone> { bone }; bone.Transform = new Transform(); // TODO: Transform / IWT is not always identity on dummy bones! skeleton.UpdateInverseWorldTransforms(); model.Skeleton = skeleton; foreach (var mesh in model.MeshBindings) { if (mesh.Mesh.BoneBindings != null && mesh.Mesh.BoneBindings.Count > 0) { throw new ParsingException("Failed to generate dummy skeleton: Mesh already has bone bindings."); } var binding = new BoneBinding(); binding.BoneName = bone.Name; // TODO: Calculate bounding box! binding.OBBMin = new float[] { -10, -10, -10 }; binding.OBBMax = new float[] { 10, 10, 10 }; mesh.Mesh.BoneBindings = new List<BoneBinding> { binding }; } } } }
private void ImportChannel(Skeleton skeleton) { channel channel = null; foreach (var item in Animation.Items) { if (item is channel) { channel = item as channel; break; } } if (channel == null) throw new ParsingException("Animation " + Animation.id + " has no channel!"); var parts = channel.target.Split(new char[] { '/' }); if (parts.Length != 2) throw new ParsingException("Unsupported channel target format: " + channel.target); Bone bone = null; if (!skeleton.BonesByID.TryGetValue(parts[0], out bone)) throw new ParsingException("Animation channel references nonexistent bone: " + parts[0]); if (bone.TransformSID != parts[1]) throw new ParsingException("Animation channel references nonexistent transform or transform is not float4x4: " + channel.target); Bone = bone; }