Пример #1
0
            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();
                        }
                    }
                }