Example #1
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];
                }
            }
        }
Example #2
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());
        }
Example #3
0
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            HavokInterop.InitializeMTA();

            this.Exit += App_Exit;
        }
Example #4
0
        internal Animation(AnimationContainer container, IntPtr ptr, string name)
        {
            Container     = container;
            _UnmanagedPtr = ptr;
            Name          = name;

            Duration      = HavokInterop.Execute(() => Interop.getDuration(_UnmanagedPtr));
            FrameCount    = HavokInterop.Execute(() => Interop.getNumFrames(_UnmanagedPtr));
            FrameDuration = Duration / FrameCount;
        }
        public Animation Get(int index)
        {
            Animation anim;

            if (!_Animations.TryGetValue(index, out anim))
            {
                _Animations.Add(index, anim = new Animation(this, HavokInterop.Execute(() => Interop.getAnimation(_UnmanagedPtr, index)), _AnimationNameMap.Where(_ => _.Value == index).Select(_ => _.Key).FirstOrDefault()));
            }
            return(anim);
        }
        private bool _IsDisposed = false; // To detect redundant calls

        protected virtual void Dispose(bool disposing)
        {
            if (!_IsDisposed)
            {
                if (_UnmanagedPtr != IntPtr.Zero)
                {
                    HavokInterop.Execute(() => Interop.unloadAnimationContainer(_UnmanagedPtr));
                }
                _UnmanagedPtr = IntPtr.Zero;

                _IsDisposed = true;
            }
        }
        public AnimationContainer(Skeleton skeleton, PapFile file)
        {
            Skeleton = skeleton;
            File     = file;

            _AnimationNameMap = file.Animations.ToDictionary(_ => _.Name, _ => _.Index);
            _UnmanagedPtr     = HavokInterop.Execute(() => Interop.loadAnimationContainer(skeleton._UnmanagedPtr, file.HavokData, file.HavokData.Length));

            var numAnim = HavokInterop.Execute(() => Interop.getNumAnimations(_UnmanagedPtr));

            if (AnimationCount != numAnim)
            {
                throw new System.IO.InvalidDataException();
            }
        }