private void ButtonCreateFirCoefficients(object sender, RoutedEventArgs e) { if (!UpdateParameters()) { return; } var dlg = new SaveFileDialog(); dlg.DefaultExt = Properties.Resources.FirFilterFileExt; dlg.Filter = Properties.Resources.FirFilterFileFilter; dlg.FileName = "CrossfeedFilterCoeffs" + Properties.Resources.FirFilterFileExt; dlg.CheckPathExists = true; var result = dlg.ShowDialog(); if (result != true) { return; } int sampleRate; Int32.TryParse(mTextBoxSampleRate.Text, out sampleRate); var crossfeed = CreateCrossFeedFirFromUseInput(); var args = new TraceArgs(); args.SampleRate = sampleRate; args.CrossfeedFir = crossfeed; args.FileName = dlg.FileName; mBw.RunWorkerAsync(args); mWrapPanel.IsEnabled = false; }
void Update() { if (m_Weapon != null) { m_TrArgs = m_Weapon.GetTraceArgs(); m_NeedTrace = m_TrArgs.need; } else { m_NeedTrace = false; } if (m_NeedTrace) { m_IsTraced = true; m_Cast1 = m_TrArgs.pos; m_Cast2 = m_Cast1; m_Points.Add(m_Cast1); m_Vel = m_TrArgs.dir * m_TrArgs.vel; m_Buffer.Clear(); for (int i = 0; i < m_DrawStepsMaxCount; ++i) { m_Vel += m_GravStep; m_VelStep = m_Vel * m_DrawTimeStep; m_Cast2 += m_VelStep; if (!((i > 0 && (i + 1) % m_CastEveryDrawPoints == 0) || i == m_DrawStepsMaxCount - 1)) { m_Buffer.Add(m_Cast2); } else { if (Physics.Linecast(m_Cast1, m_Cast2, out m_Hit, m_LayerMask)) { if (i < m_CastEveryDrawPoints + 1) { m_Points.Add((m_Cast1 + m_Hit.point) * 0.5f); } m_Points.Add(m_Hit.point); m_ActiveHit = true; m_HitPos = m_Hit.point + m_Hit.normal * 0.1f; m_HitRot = Quaternion.LookRotation(-m_Hit.normal); break; } else { m_Buffer.Add(m_Cast2); m_Points.AddRange(m_Buffer); m_Buffer.Clear(); m_Cast1 = m_Cast2; m_ActiveHit = false; } } } m_Line.positionCount = m_Points.Count; m_Line.SetPositions(m_Points.ToArray()); m_Points.Clear(); if (m_ActiveHit) { if (!m_HitTr.gameObject.activeSelf) { m_HitTr.gameObject.SetActive(true); } m_HitTr.position = m_HitPos; m_HitTr.rotation = m_HitRot; } else { if (m_HitTr.gameObject.activeSelf) { m_HitTr.gameObject.SetActive(false); } } } else { if (m_IsTraced) { m_IsTraced = false; m_Line.positionCount = 0; if (!m_HitTr.gameObject.activeSelf) { m_HitTr.gameObject.SetActive(false); } } } }
IEnumerable <T> Trace <T>(TraceArgs args, Func <object, string[], T> resultor) { var stack = new Stack <TraceArgs>(); stack.Push(args); while (stack.Count > 0) { var popped = stack.Pop(); var expr = popped.Expr; var value = popped.Value; var path = popped.Path; if (string.IsNullOrEmpty(expr)) { if (path != null) { yield return(resultor(value, path.Split(Semicolon))); } continue; } var i = expr.IndexOf(';'); var atom = i >= 0 ? expr.Substring(0, i) : expr; var tail = i >= 0 ? expr.Substring(i + 1) : string.Empty; if (value != null && _system.HasMember(value, atom)) { stack.Push(Args(tail, Index(value, atom), path + ";" + atom)); } else if (atom == "*") { Walk(atom, tail, value, path, (m, l, x, v, p) => stack.Push(Args(m + ";" + x, v, p))); } else if (atom == "..") { Walk(atom, tail, value, path, (m, l, x, v, p) => { var result = Index(v, m.ToString()); if (result != null && !_system.IsPrimitive(result)) { stack.Push(Args("..;" + x, result, p + ";" + m)); } }); stack.Push(Args(tail, value, path)); } else if (atom.Length > 2 && atom[0] == '(' && atom[atom.Length - 1] == ')') // [(exp)] { stack.Push(Args(_eval(atom, value, path.Substring(path.LastIndexOf(';') + 1)) + ";" + tail, value, path)); } else if (atom.Length > 3 && atom[0] == '?' && atom[1] == '(' && atom[atom.Length - 1] == ')') // [?(exp)] { Walk(atom, tail, value, path, (m, l, x, v, p) => { var result = _eval(RegExp.Replace(l, @"^\?\((.*?)\)$", "$1"), Index(v, m.ToString()), m.ToString()); if (Convert.ToBoolean(result, CultureInfo.InvariantCulture)) { stack.Push(Args(m + ";" + x, v, p)); } }); } else if (RegExp.IsMatch(atom, @"^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$")) // [start:end:step] Python slice syntax { foreach (var a in Slice(atom, tail, value, path).Reverse()) { stack.Push(a); } } else if (atom.IndexOf(',') >= 0) // [name1,name2,...] { foreach (var part in RegExp.Split(atom, @"'?,'?").Reverse()) { stack.Push(Args(part + ";" + tail, value, path)); } } } }
IEnumerable <T> Trace <T>(TraceArgs args, Func <object, string[], T> resultor) { var stack = new Stack <TraceArgs>(); stack.Push(args); while (stack.Count > 0) { var popped = stack.Pop(); var expr = popped.Expr; var value = popped.Value; var path = popped.Path; if (string.IsNullOrEmpty(expr)) { if (path != null) { yield return(resultor(value, path.Split(_Semicolon))); } continue; } var i = expr.IndexOf(';'); var atom = i >= 0 ? expr.Substring(0, i) : expr; var tail = i >= 0 ? expr.Substring(i + 1) : string.Empty; var hasMember = false; var d = value as IDictionary <string, object>; if (null != d) { if (d.ContainsKey(atom)) { hasMember = true; } } else { var l = value as IList <object>; if (null != l) { int ii; if (int.TryParse(atom, out ii)) { if (-1 < ii && l.Count > ii) { hasMember = true; } } } } if (hasMember) { stack.Push(Args(tail, _Index(value, atom), path + ";" + atom)); } else if (atom == "*") { Walk(atom, tail, value, path, (m, l, x, v, p) => stack.Push(Args(m + ";" + x, v, p))); } else if (atom == "..") { Walk(atom, tail, value, path, (m, l, x, v, p) => { var result = _Index(v, m.ToString()); var isPrim = true; d = result as IDictionary <string, object>; if (null == d) { if (null != result as IList <object> ) { isPrim = false; } } else { isPrim = false; } if (!isPrim) { stack.Push(Args("..;" + x, result, p + ";" + m)); } }); stack.Push(Args(tail, value, path)); } else if (atom.Length > 2 && atom[0] == '(' && atom[atom.Length - 1] == ')') // [(exp)] { stack.Push(Args(_eval(atom, value, path.Substring(path.LastIndexOf(';') + 1)) + ";" + tail, value, path)); } else if (atom.Length > 3 && atom[0] == '?' && atom[1] == '(' && atom[atom.Length - 1] == ')') // [?(exp)] { Walk(atom, tail, value, path, (m, l, x, v, p) => { var result = _eval(RegExp.Replace(l, @"^\?\((.*?)\)$", "$1"), _Index(v, m.ToString()), m.ToString()); if (Convert.ToBoolean(result, CultureInfo.InvariantCulture)) { stack.Push(Args(m + ";" + x, v, p)); } }); } else if (RegExp.IsMatch(atom, @"^(-?[0-9]*):(-?[0-9]*):?([0-9]*)$")) // [start:end:step] Phyton slice syntax { foreach (var a in Slice(atom, tail, value, path).Reverse()) { stack.Push(a); } } else if (atom.IndexOf(',') >= 0) // [name1,name2,...] { foreach (var part in RegExp.Split(atom, @"'?,'?").Reverse()) { stack.Push(Args(part + ";" + tail, value, path)); } } } }