internal unsafe void PercentChanged(object sender, EventArgs e) { if (SelectedSource == null || SelectedDestination == null || updating) { return; } if ((SelectedAnimation != null) && (CurrentFrame >= 1)) { SHP0EntryNode entry = SelectedAnimation.FindChild(SelectedSource, false) as SHP0EntryNode; SHP0VertexSetNode v; if (entry == null) { (v = (entry = SelectedAnimation.FindOrCreateEntry(SelectedSource)).Children[0] as SHP0VertexSetNode).Name = SelectedDestination; } else if ((v = entry.FindChild(SelectedDestination, false) as SHP0VertexSetNode) == null) { if (!float.IsNaN(textBox1.Value)) { v = entry.FindOrCreateEntry(SelectedDestination); v.SetKeyframe(CurrentFrame - 1, textBox1.Value / 100.0f); } } else if (float.IsNaN(textBox1.Value)) { v.RemoveKeyframe(CurrentFrame - 1); } else { v.SetKeyframe(CurrentFrame - 1, textBox1.Value / 100.0f); } if (_mainWindow.InterpolationEditor != null && _mainWindow.InterpolationEditor._targetNode != VertexSetDest) { _mainWindow.InterpolationEditor.SetTarget(VertexSetDest); } } ResetBox(); _mainWindow.KeyframePanel.UpdateKeyframe(CurrentFrame - 1); _mainWindow.UpdateModel(); }
internal unsafe void PercentChanged(object sender, EventArgs e) { if (VertexSet == null || SelectedDestination == null || updating) { return; } MDL0VertexNode vSet = VertexSet; if ((SelectedAnimation != null) && (CurrentFrame > 0)) { SHP0EntryNode entry = SelectedAnimation.FindChild(vSet.Name, false) as SHP0EntryNode; SHP0VertexSetNode v; if (entry == null) { (v = (entry = SelectedAnimation.FindOrCreateEntry(vSet.Name)).Children[0] as SHP0VertexSetNode).Name = SelectedDestination.Name; } else if ((v = entry.FindChild(SelectedDestination.Name, false) as SHP0VertexSetNode) == null) { if (!float.IsNaN(textBox1.Value)) { v = entry.FindOrCreateEntry(SelectedDestination.Name); v.SetKeyframe(CurrentFrame - 1, textBox1.Value / 100.0f); } } else if (float.IsNaN(textBox1.Value)) { v.RemoveKeyframe(CurrentFrame - 1); } else { v.SetKeyframe(CurrentFrame - 1, textBox1.Value / 100.0f); } } //TargetModel.ApplyCHR(SelectedCHR0, CurrentFrame); //TargetModel.ApplySHP(SelectedAnimation, CurrentFrame); //ResetBox(); //_mainWindow.modelPanel1.Invalidate(); _mainWindow.UpdateModel(); }
internal unsafe void BoxChanged(object sender, EventArgs e) { if (TargetTexRef == null || sender == null) { return; } NumericInputBox box = sender as NumericInputBox; int index = (int)box.Tag; if (index == 2 || index == 4 || index == 5 || index == 8) { return; } MDL0MaterialRefNode mr = TargetTexRef; if ((SelectedAnimation != null) && (CurrentFrame > 0)) { SRT0TextureNode entry = SelectedAnimation.FindChild(mr.Parent.Name + "/Texture" + mr.Index, true) as SRT0TextureNode; if (entry == null) { if (!float.IsNaN(box.Value)) { entry = SelectedAnimation.FindOrCreateEntry(mr.Parent.Name, mr.Index); //Set initial values (so they aren't null) FrameState state = mr._bindState; //Get the texture's bindstate float * p = (float *)&state; for (int i = 0; i < 3; i++) //Get the scale { if (p[i] != 1.0f) //Check for default values { entry.SetKeyframe(KeyFrameMode.ScaleX + i, 0, p[i]); } } for (int i = 3; i < 9; i++) //Get rotation and translation respectively { if (p[i] != 0.0f) //Check for default values { entry.SetKeyframe(KeyFrameMode.ScaleX + i, 0, p[i]); } } if (p[10] != 0.0f) { entry.SetKeyframe(KeyFrameMode.ScaleX + 10, 0, p[10]); } //Finally, replace with the changed value entry.SetKeyframe(KeyFrameMode.ScaleX + index, CurrentFrame - 1, box.Value); } } else //Set to existing SRT0 texture if (float.IsNaN(box.Value)) { entry.RemoveKeyframe(KeyFrameMode.ScaleX + index, CurrentFrame - 1); } else { entry.SetKeyframe(KeyFrameMode.ScaleX + index, CurrentFrame - 1, box.Value); } } else { //Change base transform FrameState state = mr._bindState; float * p = (float *)&state; p[index] = float.IsNaN(box.Value) ? (index > 2 ? 0.0f : 1.0f) : box.Value; mr._bindState = state; //mr.RecalcBindState(); mr.SignalPropertyChange(); } TargetModel.ApplySRT(SelectedAnimation, CurrentFrame); ResetBox(index); _mainWindow.modelPanel1.Invalidate(); }