private static Transform[] Convert(HierarchyAnimation hAnim, Dictionary <GeometryFrame, Transform> transforms, IEnumerable <GeometryFrame> frames) { var dict = frames.Where(x => x.Source.HAnim != null) .ToDictionary(x => x.Source.HAnim.NodeId, x => transforms[x]); return(hAnim.Nodes.Select(x => dict[x.NodeId]).ToArray()); }
public FrameContainer AttachFrames(Transform destParent, MaterialFlags flags) { var transforms = Frames.ToDictionary(x => x, x => { var trans = new GameObject(x.Name).transform; trans.localPosition = x.Position; trans.localRotation = x.Rotation; return(trans); }); var container = destParent.gameObject.AddComponent <FrameContainer>(); foreach (var frame in Frames) { if (frame.ParentIndex != -1) { transforms[frame].SetParent(transforms[Frames[frame.ParentIndex]], false); } else { transforms[frame].SetParent(destParent, false); } if (frame.GeometryIndex != -1) { var gobj = transforms[frame].gameObject; var geometry = Geometry[frame.GeometryIndex]; HierarchyAnimation hAnim = null; var parent = frame; while ((hAnim = parent.Source.HAnim) == null || hAnim.NodeCount == 0) { if (parent.ParentIndex == -1) { hAnim = null; break; } parent = Frames[parent.ParentIndex]; } Renderer renderer; if (hAnim != null) { var smr = gobj.AddComponent <SkinnedMeshRenderer>(); var bones = Convert(hAnim, transforms, Frames); smr.rootBone = bones[0]; smr.bones = bones; smr.sharedMesh = geometry.Mesh; if (smr.sharedMesh != null) { smr.sharedMesh.bindposes = geometry.SkinToBoneMatrices .Select(x => x.transpose) .ToArray(); } renderer = smr; } else { var mf = gobj.AddComponent <MeshFilter>(); mf.sharedMesh = geometry.Mesh; renderer = gobj.AddComponent <MeshRenderer>(); } renderer.sharedMaterials = geometry.GetMaterials(flags); // filter these out for now if (frame.Name.EndsWith("_vlo") || frame.Name.EndsWith("_dam")) { gobj.SetActive(false); } } } container.Initialize(Frames, transforms); return(container); }
private static Transform[] Convert(HierarchyAnimation hAnim, Dictionary<GeometryFrame, Transform> transforms, IEnumerable<GeometryFrame> frames) { var dict = frames.Where(x => x.Source.HAnim != null) .ToDictionary(x => x.Source.HAnim.NodeId, x => transforms[x]); return hAnim.Nodes.Select(x => dict[x.NodeId]).ToArray(); }