Ejemplo n.º 1
0
        public Matrix[] GetPose(float timestamp)
        {
            var transforms = new InteropTransform[Container.Skeleton.BoneCount];

            HavokInterop.Execute(() => Interop.getPose(_UnmanagedPtr, timestamp, transforms));
            return(transforms.Select(t => t.ToTransformationMatrix()).ToArray());
        }
Ejemplo n.º 2
0
        public Skeleton(SklbFile file)
        {
            this.File = file;

            _UnmanagedPtr = HavokInterop.Execute(() => Interop.loadSkeleton(file.HavokData, file.HavokData.Length));

            BoneCount = HavokInterop.Execute(() => Interop.getNumBones(_UnmanagedPtr));

            BoneNames = new string[BoneCount];
            HavokInterop.Execute(() => Interop.getBoneNames(_UnmanagedPtr, BoneNames));

            ParentBoneIndices = new int[BoneCount];
            HavokInterop.Execute(() => Interop.getParentIndices(_UnmanagedPtr, ParentBoneIndices));

            ReferencePose = new Matrix[BoneCount];
            var referencePoseLocal = new InteropTransform[BoneCount];

            HavokInterop.Execute(() => Interop.getReferencePose(_UnmanagedPtr, referencePoseLocal));
            for (var target = 0; target < BoneCount; ++target)
            {
                var current = target;
                ReferencePose[target] = Matrix.Identity;
                while (current >= 0)
                {
                    ReferencePose[target] = ReferencePose[target] * referencePoseLocal[current].ToTransformationMatrix();

                    current = ParentBoneIndices[current];
                }
            }
        }
Ejemplo n.º 3
0
        private bool _IsDisposed = false; // To detect redundant calls

        #endregion Fields

        #region Constructors

        public Skeleton(SklbFile file)
        {
            this.File = file;

            _UnmanagedPtr = HavokInterop.Execute(() => Interop.loadSkeleton(file.HavokData, file.HavokData.Length));

            BoneCount = HavokInterop.Execute(() => Interop.getNumBones(_UnmanagedPtr));

            BoneNames = new string[BoneCount];
            HavokInterop.Execute(() => Interop.getBoneNames(_UnmanagedPtr, BoneNames));

            ParentBoneIndices = new int[BoneCount];
            HavokInterop.Execute(() => Interop.getParentIndices(_UnmanagedPtr, ParentBoneIndices));

            ReferencePose = new Matrix[BoneCount];
            var referencePoseLocal = new InteropTransform[BoneCount];
            HavokInterop.Execute(() => Interop.getReferencePose(_UnmanagedPtr, referencePoseLocal));
            for (var target = 0; target < BoneCount; ++target) {
                var current = target;
                ReferencePose[target] = Matrix.Identity;
                while (current >= 0) {
                    ReferencePose[target] = ReferencePose[target] * referencePoseLocal[current].ToTransformationMatrix();

                    current = ParentBoneIndices[current];
                }
            }
        }
Ejemplo n.º 4
0
 public Matrix[] GetPose(float timestamp)
 {
     var transforms = new InteropTransform[Container.Skeleton.BoneCount];
     HavokInterop.Execute(() => Interop.getPose(_UnmanagedPtr, timestamp, transforms));
     return transforms.Select(t => t.ToTransformationMatrix()).ToArray();
 }