Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
                }
            }
        }