Пример #1
0
        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);
                }
            }
        }
    }
Пример #3
0
            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));
                        }
                    }
                }
            }
Пример #4
0
        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;
        }
Пример #5
0
            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));
                        }
                    }
                }
            }