private ErrorCode LoadAnimations(HelixInternalScene scene) { var dict = new Dictionary <string, HxScene.SceneNode>(SceneNodes.Count); foreach (var node in SceneNodes) { if (node is HxScene.GroupNode && !dict.ContainsKey(node.Name)) { dict.Add(node.Name, node); } } foreach (var node in SceneNodes.Where(x => x is Animations.IBoneMatricesNode) .Select(x => x as Animations.IBoneMatricesNode)) { if (node.Bones != null) { for (var i = 0; i < node.Bones.Length; ++i) { if (dict.TryGetValue(node.Bones[i].Name, out var s)) { ref var b = ref node.Bones[i]; b.ParentNode = s.Parent; b.Node = s; s.IsAnimationNode = true; // Make sure to set this to true } } } }
private ErrorCode LoadAnimations(HelixInternalScene scene) { var dict = new Dictionary <string, HxScene.SceneNode>(SceneNodes.Count); foreach (var node in SceneNodes) { if (node is HxScene.GroupNode && !dict.ContainsKey(node.Name)) { dict.Add(node.Name, node); } } var nodeIdxDict = new Dictionary <string, int>(); foreach (var node in SceneNodes.Where(x => x is Animations.IBoneMatricesNode) .Select(x => x as Animations.IBoneMatricesNode)) { if (node.Bones != null) { nodeIdxDict.Clear(); for (var i = 0; i < node.Bones.Length; ++i) { nodeIdxDict.Add(node.Bones[i].Name, i); } for (var i = 0; i < node.Bones.Length; ++i) { if (dict.TryGetValue(node.Bones[i].Name, out var s)) { ref var b = ref node.Bones[i]; b.ParentNode = s.Parent; b.Node = s; b.BoneLocalTransform = s.ModelMatrix; if (s.Parent != null && nodeIdxDict.TryGetValue(s.Parent.Name, out var idx)) { b.ParentIndex = idx; } s.IsAnimationNode = true; // Make sure to set this to true } } if (Configuration.CreateSkeletonForBoneSkinningMesh && node is HxScene.BoneSkinMeshNode sk && sk.Parent is HxScene.GroupNodeBase group) { var skeleton = sk.CreateSkeletonNode(Configuration.SkeletonMaterial, Configuration.SkeletonEffects, Configuration.SkeletonSizeScale); skeleton.Name = "HxSK_" + sk.Name; group.AddChildNode(skeleton); } //Setup bone matrices initially if it's morphable (unable to render w/o bones) if (node is HxScene.BoneSkinMeshNode sn && sn.MorphTargetWeights.Length > 0 && sn.BoneMatrices?.Length == 0) { sn.UpdateBoneMatrices(); } } }