internal unsafe void BoxChanged(object sender, EventArgs e) { if (_transformObject == null) { return; } NumericInputBox box = sender as NumericInputBox; int index = (int)box.Tag; if (_transformObject is MDL0BoneNode) { MDL0BoneNode bone = _transformObject as MDL0BoneNode; if ((_selectedAnim != null) && (_animFrame > 0)) { //Find bone anim and change transform CHR0EntryNode entry = _selectedAnim.FindChild(bone.Name, false) as CHR0EntryNode; if (entry == null) //Create new bone animation { if (!float.IsNaN(box.Value)) { entry = _selectedAnim.CreateEntry(); entry._name = bone.Name; //Set initial values FrameState state = bone._bindState; float * p = (float *)&state; for (int i = 0; i < 3; i++) { if (p[i] != 1.0f) { entry.SetKeyframe(KeyFrameMode.ScaleX + i, 0, p[i]); } } for (int i = 3; i < 9; i++) { if (p[i] != 0.0f) { entry.SetKeyframe(KeyFrameMode.ScaleX + i, 0, p[i]); } } entry.SetKeyframe(KeyFrameMode.ScaleX + index, _animFrame - 1, box.Value); } } else //Set existing { if (float.IsNaN(box.Value)) { entry.RemoveKeyframe(KeyFrameMode.ScaleX + index, _animFrame - 1); } else { entry.SetKeyframe(KeyFrameMode.ScaleX + index, _animFrame - 1, box.Value); } } } else { //Change base transform FrameState state = bone._bindState; float * p = (float *)&state; p[index] = float.IsNaN(box.Value) ? (index > 2 ? 0.0f : 1.0f) : box.Value; state.CalcTransforms(); bone._bindState = state; bone.RecalcBindState(); bone.SignalPropertyChange(); } _targetModel.ApplyCHR(_selectedAnim, _animFrame); ResetBox(index); if (RenderStateChanged != null) { RenderStateChanged(this, null); } } }
public static void BoneAnim2Chr0Entry(BoneAnim boneAnim, CHR0Node chr0) { CHR0EntryNode chr0Entry = chr0.CreateEntry(boneAnim.Name); chr0Entry.UseModelRotate = false; chr0Entry.UseModelScale = false; chr0Entry.UseModelTranslate = false; chr0Entry.ScaleCompensateApply = boneAnim.ApplySegmentScaleCompensate; //Float for time/frame Dictionary <float, FSKAKeyNode> TranslateX = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> TranslateY = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> TranslateZ = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> RotateX = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> RotateY = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> RotateZ = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> ScaleX = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> ScaleY = new Dictionary <float, FSKAKeyNode>(); Dictionary <float, FSKAKeyNode> ScaleZ = new Dictionary <float, FSKAKeyNode>(); if (boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Translate)) { TranslateX.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Translate.X, }); TranslateY.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Translate.Y, }); TranslateZ.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Translate.Z, }); } if (boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Rotate)) { RotateX.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Rotate.X, }); RotateY.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Rotate.Y, }); RotateZ.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Rotate.Z, }); } if (boneAnim.FlagsBase.HasFlag(BoneAnimFlagsBase.Scale)) { ScaleX.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Scale.X, }); ScaleY.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Scale.Y, }); ScaleZ.Add(0, new FSKAKeyNode() { Value = boneAnim.BaseData.Scale.Z, }); } else { ScaleX.Add(0, new FSKAKeyNode() { Value = 1 }); ScaleY.Add(0, new FSKAKeyNode() { Value = 1 }); ScaleZ.Add(0, new FSKAKeyNode() { Value = 1 }); } foreach (var curve in boneAnim.Curves) { for (int frame = 0; frame < curve.Frames.Length; frame++) { float time = curve.Frames[frame]; float value = 0; float slope = 0; float slope2 = 0; float delta = 0; float scale = curve.Scale; if (scale <= 0) { scale = 1; } if (curve.CurveType == AnimCurveType.Cubic) { value = curve.Offset + curve.Keys[frame, 0] * scale; slope = curve.Offset + curve.Keys[frame, 1] * scale; slope2 = curve.Offset + curve.Keys[frame, 2] * scale; delta = curve.Offset + curve.Keys[frame, 3] * scale; } if (curve.CurveType == AnimCurveType.Linear) { value = curve.Offset + curve.Keys[frame, 0] * scale; delta = curve.Offset + curve.Keys[frame, 1] * scale; } if (curve.CurveType == AnimCurveType.StepInt) { value = curve.Offset + curve.Keys[frame, 0] * scale; } switch (curve.AnimDataOffset) { case 0x10: if (TranslateX.Count > 0 && frame == 0) { TranslateX.Remove(0); } TranslateX.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x14: if (TranslateY.Count > 0 && frame == 0) { TranslateY.Remove(0); } TranslateY.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x18: if (TranslateZ.Count > 0 && frame == 0) { TranslateZ.Remove(0); } TranslateZ.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x20: if (RotateX.Count > 0 && frame == 0) { RotateX.Remove(0); } RotateX.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x24: if (RotateY.Count > 0 && frame == 0) { RotateY.Remove(0); } RotateY.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x28: if (RotateZ.Count > 0 && frame == 0) { RotateZ.Remove(0); } RotateZ.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x04: if (ScaleX.Count > 0 && frame == 0) { ScaleX.Remove(0); } ScaleX.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x08: if (ScaleY.Count > 0 && frame == 0) { ScaleY.Remove(0); } ScaleY.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; case 0x0C: if (ScaleZ.Count > 0 && frame == 0) { ScaleZ.Remove(0); } ScaleZ.Add(time, new FSKAKeyNode() { Value = value, Slope = slope, Slope2 = slope2, Delta = delta, Frame = time, }); break; } } } for (int frame = 0; frame < chr0.FrameCount; frame++) { if (TranslateX.ContainsKey(frame)) { chr0Entry.SetKeyframe(6, frame, TranslateX[frame].Value); } if (TranslateY.ContainsKey(frame)) { chr0Entry.SetKeyframe(7, frame, TranslateY[frame].Value); } if (TranslateZ.ContainsKey(frame)) { chr0Entry.SetKeyframe(8, frame, TranslateZ[frame].Value); } if (RotateX.ContainsKey(frame)) { chr0Entry.SetKeyframe(3, frame, RotateX[frame].Value * Rad2Deg); } if (RotateY.ContainsKey(frame)) { chr0Entry.SetKeyframe(4, frame, RotateY[frame].Value * Rad2Deg); } if (RotateZ.ContainsKey(frame)) { chr0Entry.SetKeyframe(5, frame, RotateZ[frame].Value * Rad2Deg); } if (ScaleX.ContainsKey(frame)) { chr0Entry.SetKeyframe(0, frame, ScaleX[frame].Value); } if (ScaleY.ContainsKey(frame)) { chr0Entry.SetKeyframe(1, frame, ScaleY[frame].Value); } if (ScaleZ.ContainsKey(frame)) { chr0Entry.SetKeyframe(2, frame, ScaleZ[frame].Value); } } }