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]; } } }
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()); }
protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); HavokInterop.InitializeMTA(); this.Exit += App_Exit; }
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(); } }