float[] GetBoneMatrix(IISkin skin, IINode bone, int t, bool hasParent)
        {
            var maxMatrix = bone.GetWorldMatrix(t, hasParent);

            //var initialMatrix = Loader.Global.Matrix3.Create();
            //skin.GetBoneInitTM(bone, initialMatrix, false);

            //initialMatrix.Invert();

            //maxMatrix = maxMatrix.MultiplyBy(initialMatrix);

            //if (!hasParent)
            //{
            //    initialMatrix = Loader.Global.Matrix3.Create();
            //    skin.GetSkinInitTM(bone, initialMatrix, false);

            //    initialMatrix.Invert();

            //    maxMatrix = maxMatrix.MultiplyBy(initialMatrix);
            //}

            maxMatrix.NoScale();

            var trans = maxMatrix.Trans;

            var parts = Loader.Global.AffineParts.Create();

            Loader.Global.DecompAffine(maxMatrix, parts);

            var rotationQuaternion = new Quaternion(parts.Q.X, parts.Q.Z, parts.Q.Y, parts.Q.W);

            var matrix = Matrix.RotationQuaternion(rotationQuaternion) * Matrix.Translation(trans.X, trans.Z, trans.Y);

            return(matrix.ToArray());
        }
Ejemplo n.º 2
0
        public static bool Export_To(string _filepath)
        {
            List <IINode> nodes = GetSelection();

            foreach (IINode _node in nodes)
            {
                IIDerivedObject _gObject = (IIDerivedObject)_node.ObjectRef;
                IClass_ID       classID  = maxGlobal.Class_ID.Create((uint)BuiltInClassIDA.TRIOBJ_CLASS_ID, 0);
                ITriObject      _mObject = (ITriObject)_gObject.ObjRef.ConvertToType(0, classID);
                IMesh           _mMesh   = _mObject.Mesh;
                _mMesh.BuildNormals();
                IIDerivedObject theObj = (IIDerivedObject)_node.ObjectRef;
                for (int m = 0; m < theObj.Modifiers.Count; m++)
                {
                    IModifier theModifier = theObj.GetModifier(m);
                    if (theModifier.ClassName == "Skin")
                    {
                        IISkin            _skin        = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000));
                        IISkinContextData _skinContext = _skin.GetContextInterface(_node);
                        ComputeVertexData(_mMesh, _skinContext, semantic, _filepath);
                    }
                }
            }
            return(true);
        }
        float[] GetBoneMatrix(IISkin skin, IINode bone, int t, bool hasParent)
        {
            var maxMatrix = bone.GetWorldMatrix(t, hasParent);

            //var initialMatrix = Loader.Global.Matrix3.Create();
            //skin.GetBoneInitTM(bone, initialMatrix, false);

            //initialMatrix.Invert();

            //maxMatrix = maxMatrix.MultiplyBy(initialMatrix);

            //if (!hasParent)
            //{
            //    initialMatrix = Loader.Global.Matrix3.Create();
            //    skin.GetSkinInitTM(bone, initialMatrix, false);

            //    initialMatrix.Invert();

            //    maxMatrix = maxMatrix.MultiplyBy(initialMatrix);
            //}

            maxMatrix.NoScale();

            var trans = maxMatrix.Trans;

            var parts = Loader.Global.AffineParts.Create();
            Loader.Global.DecompAffine(maxMatrix, parts);

            var rotationQuaternion = new Quaternion(parts.Q.X, parts.Q.Z, parts.Q.Y, parts.Q.W);

            var matrix = Matrix.RotationQuaternion(rotationQuaternion) * Matrix.Translation(trans.X, trans.Z, trans.Y);

            return matrix.ToArray();
        }
Ejemplo n.º 4
0
        public static bool ExportAnimation(int[] _frames, string _filename, int _samplingRate)
        {
            List <IINode> nodes = GetSelection();

            foreach (IINode _node in nodes)
            {
                IIDerivedObject theObj   = (IIDerivedObject)_node.ObjectRef;
                IInterval       interval = maxGlobal.Interval.Create();
                interval.SetInfinite();
                maxGlobal.IGameInterface.InitialiseIGame(false);
                for (int m = 0; m < theObj.Modifiers.Count; m++)
                {
                    IModifier theModifier = theObj.GetModifier(m);
                    if (theModifier.ClassName == "Skin")
                    {
                        IISkin _skin = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000));
                        IINode _bone = _skin.GetBone(0);

                        int           nbBones  = _skin.NumBones;
                        List <string> boneName = new List <string>();
                        for (int b = 0; b < nbBones; b++)
                        {
                            boneName.Add(_skin.GetBone(b).Name);
                        }
                        #region create bindPose World
                        Pose bindPose = new Pose("bindPose");
                        BuildBind(_bone, -1, bindPose);
                        #endregion

                        ROD_core.Graphics.Animation.Clip_Skinning clip = new ROD_core.Graphics.Animation.Clip_Skinning();
                        clip.sequencesData   = new List <Pose>();
                        clip.sequencesTiming = new List <TimeSpan>();
                        for (int f = 0; f < _frames.Length; f++)
                        {
                            // create Pose at frame (_frame)
                            Pose _pose = new Pose("frame" + _frames[f].ToString());
                            BuildLJoint(_bone, -1, _pose, _frames, f, _samplingRate, bindPose);
                            clip.sequencesData.Add(_pose);
                            clip.sequencesTiming.Add(TimeSpan.FromSeconds(_frames[f] / 30));
                        }

                        clip.saveToFile(_filename);
                    }
                }
            }
            return(true);
        }
Ejemplo n.º 5
0
        public static List <IINode> GetINodeSkinnedBones(this IINode node)
        {
            List <IINode> skinnedNodes = new List <IINode>();

            if (!node.IsSkinned())
            {
                return(null);
            }
            IISkin skin = node.GetSkinModifier();

            for (int i = 0; i < skin.NumBones; i++)
            {
                IINode bone = skin.GetBone(i);
                skinnedNodes.Add(bone);
            }
            return(skinnedNodes);
        }
Ejemplo n.º 6
0
        public static bool ExportSkeleton(string _filenameSkeleton)
        {
            List <IINode> nodes = GetSelection();

            foreach (IINode _node in nodes)
            {
                IIDerivedObject theObj   = (IIDerivedObject)_node.ObjectRef;
                IInterval       interval = maxGlobal.Interval.Create();
                interval.SetInfinite();
                maxGlobal.IGameInterface.InitialiseIGame(false);
                for (int m = 0; m < theObj.Modifiers.Count; m++)
                {
                    IModifier theModifier = theObj.GetModifier(m);
                    if (theModifier.ClassName == "Skin")
                    {
                        IISkin _skin = (IISkin)theModifier.GetInterface((InterfaceID)(0x00010000));
                        IINode _bone = _skin.GetBone(0);

                        int           nbBones  = _skin.NumBones;
                        List <string> boneName = new List <string>();
                        for (int b = 0; b < nbBones; b++)
                        {
                            boneName.Add(_skin.GetBone(b).Name);
                        }
                        #region create bindPose World
                        Pose bindPose = new Pose("bindPose");
                        BuildBind(_bone, -1, bindPose);
                        #endregion

                        Skeleton skelete = new Skeleton("skelete", bindPose);
                        skelete.saveToFile(_filenameSkeleton);
                    }
                }
            }
            return(true);
        }
        private void ExportSkin(IISkin skin, BabylonScene babylonScene)
        {
            var babylonSkeleton = new BabylonSkeleton {
                id = skins.IndexOf(skin)
            };

            babylonSkeleton.name = "skeleton #" + babylonSkeleton.id;

            RaiseMessage(babylonSkeleton.name, 1);

            var bones = new List <BabylonBone>();

            for (var index = 0; index < skin.NumBones; index++)
            {
                var bone = new BabylonBone {
                    name = skin.GetBoneName(index), index = index
                };

                var maxBone    = skin.GetBone(index);
                var parentNode = maxBone.ParentNode;

                if (parentNode != null)
                {
                    for (var recurseIndex = 0; recurseIndex < index; recurseIndex++)
                    {
                        if (skin.GetBone(recurseIndex).GetGuid() == parentNode.GetGuid())
                        {
                            bone.parentBoneIndex = recurseIndex;
                            break;
                        }
                    }
                }
                var hasParent = bone.parentBoneIndex != -1;
                bone.matrix = GetBoneMatrix(skin, maxBone, 0, hasParent);

                // Animation
                var babylonAnimation = new BabylonAnimation
                {
                    name           = bone.name + "Animation",
                    property       = "_matrix",
                    dataType       = BabylonAnimation.DataType.Matrix,
                    loopBehavior   = BabylonAnimation.LoopBehavior.Cycle,
                    framePerSecond = Loader.Global.FrameRate
                };

                var start = Loader.Core.AnimRange.Start;
                var end   = Loader.Core.AnimRange.End;

                float[] previous = null;
                var     keys     = new List <BabylonAnimationKey>();
                for (var key = start; key <= end; key += Ticks)
                {
                    var current = GetBoneMatrix(skin, maxBone, key, hasParent);

                    if (key == start || key == end || !(previous.IsEqualTo(current)))
                    {
                        keys.Add(new BabylonAnimationKey
                        {
                            frame  = key / Ticks,
                            values = current
                        });
                    }

                    previous = current;
                }

                babylonAnimation.keys = keys.ToArray();
                bone.animation        = babylonAnimation;

                bones.Add(bone);
            }

            babylonSkeleton.bones = bones.ToArray();

            babylonScene.SkeletonsList.Add(babylonSkeleton);
        }
        private void ExportSkin(IISkin skin, BabylonScene babylonScene)
        {
            var babylonSkeleton = new BabylonSkeleton {id = skins.IndexOf(skin)};
            babylonSkeleton.name = "skeleton #" + babylonSkeleton.id;

            RaiseMessage(babylonSkeleton.name, 1);

            var bones = new List<BabylonBone>();

            for (var index = 0; index < skin.NumBones; index++)
            {
                var bone = new BabylonBone {name = skin.GetBoneName(index), index = index};

                var maxBone = skin.GetBone(index);
                var parentNode = maxBone.ParentNode;

                if (parentNode != null)
                {
                    for (var recurseIndex = 0; recurseIndex < index; recurseIndex++)
                    {
                        if (skin.GetBone(recurseIndex).GetGuid() == parentNode.GetGuid())
                        {
                            bone.parentBoneIndex = recurseIndex;
                            break;
                        }
                    }
                }
                var hasParent = bone.parentBoneIndex != -1;
                bone.matrix = GetBoneMatrix(skin, maxBone, 0, hasParent);

                // Animation
                var babylonAnimation = new BabylonAnimation
                {
                    name = bone.name + "Animation", 
                    property = "_matrix", 
                    dataType = BabylonAnimation.DataType.Matrix, 
                    loopBehavior = BabylonAnimation.LoopBehavior.Cycle,
                    framePerSecond = Loader.Global.FrameRate
                };

                var start = Loader.Core.AnimRange.Start;
                var end = Loader.Core.AnimRange.End;

                float[] previous = null;
                var keys = new List<BabylonAnimationKey>();
                for (var key = start; key <= end; key += Ticks)
                {
                    var current = GetBoneMatrix(skin, maxBone, key, hasParent);

                    if (key == start || key == end || !(previous.IsEqualTo(current)))
                    {
                        keys.Add(new BabylonAnimationKey
                        {
                            frame = key / Ticks,
                            values = current
                        });
                    }

                    previous = current;
                }

                babylonAnimation.keys = keys.ToArray();
                bone.animation = babylonAnimation;

                bones.Add(bone);
            }

            babylonSkeleton.bones = bones.ToArray();

            babylonScene.SkeletonsList.Add(babylonSkeleton);
        }