private static void ReadBoneAnimations(RAnimation renderAnimation, SsbhAnimTrackDecoder decoder, AnimGroup animGroup) { foreach (AnimNode animNode in animGroup.Nodes) { RTransformAnimation tfrmAnim = new RTransformAnimation() { Name = animNode.Name }; foreach (AnimTrack track in animNode.Tracks) { object[] transform = decoder.ReadTrack(track); if (track.Name.Equals("Transform")) { for (int i = 0; i < transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)transform[i]; tfrmAnim.Transform.Keys.Add(new RKey <Matrix4>() { Frame = i, Value = GetMatrix((AnimTrackTransform)transform[i]), AbsoluteScale = t.CompensateScale }); } } } renderAnimation.TransformNodes.Add(tfrmAnim); } }
private void ReadTransformAnimations(ANIM animFile, AnimGroup animGroup, SBAnimation animation) { var decoder = new SSBHAnimTrackDecoder(animFile); foreach (AnimNode animNode in animGroup.Nodes) { SBTransformAnimation tfrmAnim = new SBTransformAnimation() { Name = animNode.Name }; foreach (AnimTrack track in animNode.Tracks) { object[] Transform = decoder.ReadTrack(track); if (track.Name.Equals("Transform")) { for (int i = 0; i < Transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)Transform[i]; tfrmAnim.Transform.Keys.Add(new SBAnimKey <Matrix4>() { Frame = i, Value = GetMatrix((AnimTrackTransform)Transform[i]), }); } } } animation.TransformNodes.Add(tfrmAnim); } }
private void ReadTransformAnimations(Anim animFile, AnimGroup animGroup, SBAnimation animation) { var decoder = new SsbhAnimTrackDecoder(animFile); foreach (AnimNode animNode in animGroup.Nodes) { SBTransformAnimation tfrmAnim = new SBTransformAnimation() { Name = animNode.Name }; SBTransformTrack X = new SBTransformTrack(SBTrackType.TranslateX); SBTransformTrack Y = new SBTransformTrack(SBTrackType.TranslateY); SBTransformTrack Z = new SBTransformTrack(SBTrackType.TranslateZ); SBTransformTrack RX = new SBTransformTrack(SBTrackType.RotateX); SBTransformTrack RY = new SBTransformTrack(SBTrackType.RotateY); SBTransformTrack RZ = new SBTransformTrack(SBTrackType.RotateZ); SBTransformTrack SX = new SBTransformTrack(SBTrackType.ScaleX); SBTransformTrack SY = new SBTransformTrack(SBTrackType.ScaleY); SBTransformTrack SZ = new SBTransformTrack(SBTrackType.ScaleZ); SBTransformTrack CompensateScale = new SBTransformTrack(SBTrackType.CompensateScale); tfrmAnim.Tracks.AddRange(new SBTransformTrack[] { X, Y, Z, RX, RY, RZ, SX, SY, SZ, CompensateScale }); foreach (AnimTrack track in animNode.Tracks) { object[] Transform = decoder.ReadTrack(track); if (track.Name.Equals("Transform")) { for (int i = 0; i < Transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)Transform[i]; SBBone transform = new SBBone(); transform.Transform = GetMatrix((AnimTrackTransform)Transform[i]); X.AddKey(i, transform.X); Y.AddKey(i, transform.Y); Z.AddKey(i, transform.Z); RX.AddKey(i, transform.RX); RY.AddKey(i, transform.RY); RZ.AddKey(i, transform.RZ); SX.AddKey(i, transform.SX); SY.AddKey(i, transform.SY); SZ.AddKey(i, transform.SZ); CompensateScale.AddKey(i, t.CompensateScale); } } } animation.TransformNodes.Add(tfrmAnim); } }
public IOAnimation GetIOAnimation() { IOAnimation anim = new IOAnimation { Name = Text, FrameCount = animation.FrameCount, RotationType = IORotationType.Quaternion }; SsbhAnimTrackDecoder decoder = new SsbhAnimTrackDecoder(animation); foreach (AnimGroup animGroup in animation.Animations) { // Bone Animations if (animGroup.Type == AnimType.Transform) { foreach (AnimNode animNode in animGroup.Nodes) { foreach (AnimTrack track in animNode.Tracks) { if (track.Name.Equals("Transform")) { object[] transform = decoder.ReadTrack(track); for (int i = 0; i < transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)transform[i]; anim.AddKey(animNode.Name, IOTrackType.POSX, i, t.X); anim.AddKey(animNode.Name, IOTrackType.POSY, i, t.Y); anim.AddKey(animNode.Name, IOTrackType.POSZ, i, t.Z); anim.AddKey(animNode.Name, IOTrackType.ROTX, i, t.Rx); anim.AddKey(animNode.Name, IOTrackType.ROTY, i, t.Ry); anim.AddKey(animNode.Name, IOTrackType.ROTZ, i, t.Rz); anim.AddKey(animNode.Name, IOTrackType.ROTW, i, t.Rw); anim.AddKey(animNode.Name, IOTrackType.SCAX, i, t.Sx); anim.AddKey(animNode.Name, IOTrackType.SCAY, i, t.Sy); anim.AddKey(animNode.Name, IOTrackType.SCAZ, i, t.Sz); } } } } } } return(anim); }
public IOAnimation GetIOAnimation() { IOAnimation Anim = new IOAnimation(); Anim.Name = Text; Anim.FrameCount = animation.FrameCount; Anim.RotationType = IORotationType.Quaternion; SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation); foreach (AnimGroup animGroup in animation.Animations) { // Bone Animations if (animGroup.Type == ANIM_TYPE.Transform) { foreach (AnimNode animNode in animGroup.Nodes) { foreach (AnimTrack track in animNode.Tracks) { if (track.Name.Equals("Transform")) { object[] Transform = decoder.ReadTrack(track); for (int i = 0; i < Transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)Transform[i]; Anim.AddKey(animNode.Name, IOTrackType.POSX, i, t.X); Anim.AddKey(animNode.Name, IOTrackType.POSY, i, t.Y); Anim.AddKey(animNode.Name, IOTrackType.POSZ, i, t.Z); Anim.AddKey(animNode.Name, IOTrackType.ROTX, i, t.RX); Anim.AddKey(animNode.Name, IOTrackType.ROTY, i, t.RY); Anim.AddKey(animNode.Name, IOTrackType.ROTZ, i, t.RZ); Anim.AddKey(animNode.Name, IOTrackType.ROTW, i, t.RW); Anim.AddKey(animNode.Name, IOTrackType.SCAX, i, t.SX); Anim.AddKey(animNode.Name, IOTrackType.SCAY, i, t.SY); Anim.AddKey(animNode.Name, IOTrackType.SCAZ, i, t.SZ); } } } } } } return(Anim); }
private static AnimTrackTransform MatrixToTransform(Matrix4 matrix) { SBBone temp = new SBBone(); temp.Transform = matrix; var t = new AnimTrackTransform() { X = temp.X, Y = temp.Y, Z = temp.Z, Rx = temp.RotationQuaternion.X, Ry = temp.RotationQuaternion.Y, Rz = temp.RotationQuaternion.Z, Rw = temp.RotationQuaternion.W, Sx = temp.SX, Sy = temp.SY, Sz = temp.SZ }; return(t); }
private static Matrix4 GetMatrix(AnimTrackTransform Transform) { return(Matrix4.CreateScale(Transform.Sx, Transform.Sy, Transform.Sz) * Matrix4.CreateFromQuaternion(new Quaternion(Transform.Rx, Transform.Ry, Transform.Rz, Transform.Rw)) * Matrix4.CreateTranslation(Transform.X, Transform.Y, Transform.Z)); }
public IRenderable GetRenderableNode() { if (animation == null) { return(null); } RAnimation renderAnimation = new RAnimation() { FrameCount = (int)animation.FrameCount }; SSBHAnimTrackDecoder decoder = new SSBHAnimTrackDecoder(animation); foreach (AnimGroup animGroup in animation.Animations) { // Material Animations if (animGroup.Type == ANIM_TYPE.Material) { foreach (AnimNode animNode in animGroup.Nodes) { foreach (AnimTrack track in animNode.Tracks) { object[] MaterialAnim = decoder.ReadTrack(track); } } } // Visibility Animations if (animGroup.Type == ANIM_TYPE.Visibilty) { foreach (AnimNode animNode in animGroup.Nodes) { RVisibilityAnimation visAnim = new RVisibilityAnimation() { MeshName = animNode.Name }; foreach (AnimTrack track in animNode.Tracks) { if (track.Name.Equals("Visibility")) { object[] Visibility = decoder.ReadTrack(track); for (int i = 0; i < Visibility.Length; i++) { visAnim.Visibility.Keys.Add(new RKey <bool>() { Frame = i, Value = ((AnimTrackBool)Visibility[i]).Value }); } } } renderAnimation.VisibilityNodes.Add(visAnim); } } // Bone Animations if (animGroup.Type == ANIM_TYPE.Transform) { foreach (AnimNode animNode in animGroup.Nodes) { RTransformAnimation tfrmAnim = new RTransformAnimation() { Name = animNode.Name }; foreach (AnimTrack track in animNode.Tracks) { if (track.Name.Equals("Transform")) { object[] Transform = decoder.ReadTrack(track); for (int i = 0; i < Transform.Length; i++) { AnimTrackTransform t = (AnimTrackTransform)Transform[i]; tfrmAnim.Transform.Keys.Add(new RKey <Matrix4>() { Frame = i, Value = GetMatrix((AnimTrackTransform)Transform[i]) }); } } } renderAnimation.TransformNodes.Add(tfrmAnim); } } } return(renderAnimation); }
private static Matrix4 GetMatrix(AnimTrackTransform Transform) { return(Matrix4.CreateScale(Transform.SX, Transform.SY, Transform.SZ) * Matrix4.CreateFromQuaternion(new Quaternion(Transform.RX, Transform.RY, Transform.RZ, Transform.RW)) * Matrix4.CreateTranslation(Transform.X, Transform.Y, Transform.Z)); }