Пример #1
0
        void CalcTriangleCoefficients(float slope)
        {
            //triangle magnitudes
            var slopeClamp = (float)VMath.Clamp(slope, 0.01, 0.99);

            A      = 1 / slopeClamp;
            B      = -1 / (1 - slopeClamp);
            AoverB = A / B;
            BoverA = B / A;

            var t4 = 4 * T;
            var t2 = 2 * T;

            //coeffs max
            var rezDenomA = 1 / (t4 * (A - 1));

            a2 = -rezDenomA;

            a1 = (t2 * A - t4 + 2) * rezDenomA;

            var tmp = A * T - 1;

            a0 = -(tmp * tmp) * rezDenomA;

            //coeffs min
            var rezDenomB = 1 / (t4 * (B + 1));

            b2 = -rezDenomB;
            b1 = (t2 * B + t4 - 2) * rezDenomB;

            tmp = B * T + 1;
            b0  = -(tmp * tmp) * rezDenomB;
        }
Пример #2
0
        public static double Digest(this IAgent agent)
        {
            dynamic a = agent;

            double energy = a["Energy"].First;

            energy            = VMath.Clamp(energy, 0, 1);
            a["Energy"].First = energy;

            //  https://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427e2uth181l2b
            a["Health"].First = (Math.Tanh(energy * 4.0 - 2) + 1) / 2.0;

            var health = VMath.Clamp(a["Health"].First, 0, 1) * 4;

            switch ((int)Math.Floor(health))
            {
            case 0:
                a.FoodStatus = FoodStatus.Starving.ToString();
                break;

            case 1:
                a.FoodStatus = FoodStatus.Hungry.ToString();
                break;

            case 2:
                a.FoodStatus = FoodStatus.Normal.ToString();
                break;

            case 3:
                a.FoodStatus = FoodStatus.Replete.ToString();
                break;
            }

            return(health);
        }
Пример #3
0
        //update mouse
        public override void UpdateTouches(TouchList touches)
        {
            base.UpdateTouches(touches);

            //update slider
            for (int i = 0; i < FControllers.Length; i++)
            {
                //get current slider
                Slider s = FControllers[i];

                if (s.Hit)
                {
                    Vector2D invMouse     = (s.InvTransform * new Vector2D(s.AssignedTouch.X, s.AssignedTouch.Y)).xy;
                    Vector2D invLastMouse = (s.InvTransform * new Vector2D(s.LastTouchPos.X, s.LastTouchPos.Y)).xy;
                    s.Value = VMath.Clamp(s.Value + (invMouse.y - invLastMouse.y) * FSliderSpeed, 0, 1);
                    if (!FIsLong)
                    {
                        s.SliderTransform = FSliderSize * VMath.Translate(0, s.Value - 0.5, 0) * s.Transform;
                    }
                    else
                    {
                        s.SliderTransform = VMath.Scale(1, s.Value, 1) * VMath.Translate(0, s.Value * 0.5 - 0.5, 1) * s.Transform;
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Create a new texture renderer.
        /// </summary>
        /// <param name="logger">The logger to log to.</param>
        /// <param name="frameRate">
        /// The maximum rate in frames per second (fps) that CefRenderHandler::OnPaint will
        /// be called for a windowless browser. The actual fps may be lower if the browser
        /// cannot generate frames at the requested rate. The minimum value is 1 and the
        /// maximum value is 60 (default 30).
        /// </param>
        public HTMLTextureRenderer(ILogger logger, int frameRate)
        {
            Logger    = logger;
            FrameRate = VMath.Clamp(frameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);

            FLoaded = false;

            var settings = new CefBrowserSettings();

            settings.FileAccessFromFileUrls = CefState.Enabled;
            settings.Plugins     = CefState.Enabled;
            settings.RemoteFonts = CefState.Enabled;
            settings.UniversalAccessFromFileUrls = CefState.Enabled;
            settings.WebGL               = CefState.Enabled;
            settings.WebSecurity         = CefState.Disabled;
            settings.WindowlessFrameRate = frameRate;

            var windowInfo = CefWindowInfo.Create();

            windowInfo.SetAsWindowless(IntPtr.Zero, true);

            FWebClient = new WebClient(this);
            // See http://magpcss.org/ceforum/viewtopic.php?f=6&t=5901
            // We need to maintain different request contexts in order to have different zoom levels
            // See https://bitbucket.org/chromiumembedded/cef/issues/1314
            var rcSettings = new CefRequestContextSettings()
            {
                IgnoreCertificateErrors = true
            };

            FRequestContext = CefRequestContext.CreateContext(rcSettings, new WebClient.RequestContextHandler());
            CefBrowserHost.CreateBrowser(windowInfo, FWebClient, settings, FRequestContext);
            // Block until browser is created
            FBrowserAttachedEvent.WaitOne();
        }
Пример #5
0
        //update mouse
        public override bool UpdateMouse(Vector2D Mouse,
                                         bool MouseLeftDownEdge,
                                         bool MouseLeftPressed)
        {
            bool upEdgeHit = base.UpdateMouse(Mouse, MouseLeftDownEdge, MouseLeftPressed);

            //update slider
            for (int i = 0; i < FControllers.Length; i++)
            {
                //get current slider
                RotarySlider s = FControllers[i];


                //set selected slice number and color
                if (FMouseHit && i == SelectedSlice)
                {
                    Vector2D invMouse     = (s.InvTransform * Mouse).xy;
                    Vector2D invLastMouse = (s.InvTransform * FLastMouse).xy;

                    s.Value = VMath.Clamp(s.Value + (invMouse.y - invLastMouse.y) * FSliderSpeed, 0, 1);
                }

                s.ColorSlider = ColSlider;
            }

            FLastMouse = Mouse;

            return(upEdgeHit);
        }
Пример #6
0
        private void AddParameter(float value, int index)
        {
            var yPos  = index * 60;
            var label = new Label();

            label.Padding  = new Padding(5, 0, 0, 0);;
            label.Font     = new Font(label.Font.FontFamily, 12);
            label.Text     = GetParamText(index);
            label.Dock     = DockStyle.Top;
            label.Location = new Point(0, yPos);
            label.Tag      = index;

            var trackbar = new TrackBar();

            trackbar.Maximum       = 1000;
            trackbar.Location      = new Point(0, yPos + 30);
            trackbar.Dock          = DockStyle.Top;
            trackbar.TickFrequency = 1;
            trackbar.TickStyle     = TickStyle.None;
            trackbar.Value         = VMath.Clamp((int)(value * 1000), trackbar.Minimum, trackbar.Maximum);
            trackbar.MouseDown    += Trackbar_MouseDown;
            trackbar.MouseUp      += Trackbar_MouseUp;
            trackbar.ValueChanged += Trackbar_ValueChanged;
            trackbar.Tag           = label;

            PluginParameterListVw.Add(trackbar);
        }
Пример #7
0
        public void Fade(double deltatime, Transition trans)
        {
            if (trans.Seconds <= deltatime)
            {
                FadeProgress = Active ? 0 : 1;
                FadingState  = Active ? FadingState.Inactive : FadingState.Active;
            }
            if (FadingState == FadingState.FadeIn)
            {
                FadeProgress += deltatime / trans.Seconds;
            }
            if (FadingState == FadingState.FadeOut)
            {
                FadeProgress -= deltatime / trans.Seconds;
            }
            FadeProgress = VMath.Clamp(FadeProgress, 0, 1);
            if (FadeProgress <= 0)
            {
                FadingState = FadingState.Inactive;
            }
            if (FadeProgress >= 1)
            {
                FadingState = FadingState.Active;
            }

            if (FadingState == FadingState.Inactive)
            {
                ElapsedFrames = 0;
                ElapsedTime   = 0;
            }
        }
Пример #8
0
        //update transform
        public virtual void UpdateTransform(Matrix4x4 Transform,
                                            Vector2D Count,
                                            Vector2D Size)

        {
            //get counts
            int countX     = VMath.Clamp((int)Math.Round(Count.x), 1, 1000);
            int countY     = VMath.Clamp((int)Math.Round(Count.y), 1, 1000);
            int countTotal = countX * countY;

            //calculate controller space
            Matrix4x4 size            = VMath.Scale(Size.x / countX, Size.y / countY, 1);
            Matrix4x4 controllerSpace = Transform;

            //create controllers?
            if (countTotal != FControllers.Length)
            {
                //store old controllers
                T[] temp = FControllers;

                //make new array
                FControllers = new T[countTotal];
                for (int i = 0; i < countTotal; i++)
                {
                    FControllers[i] = new T();

                    //copy data from old array
                    FControllers[i].CopyFrom(temp[i % temp.Length]);
                }
            }

            int slice = 0;

            for (int i = 0; i < countY; i++)
            {
                for (int j = 0; j < countX; j++)
                {
                    //get current controller
                    AbstractMTGui2dController b = FControllers[slice];

                    //calc position in controller space
                    double posX = ((j + 0.5) / countX) - 0.5;
                    double posY = 0.5 - ((i + 0.5) / countY);

                    //build particular controller space
                    b.Transform    = size * VMath.Translate(posX, posY, 0) * controllerSpace;
                    b.InvTransform = !b.Transform;


                    if (b is RotarySlider)
                    {
                        b.Transform = VMath.Scale(-1, 1, 1) * VMath.RotateZ(0.25 * VMath.CycToRad) * b.Transform;
                    }

                    slice++;
                }
            }
        }
Пример #9
0
        protected override void FillBuffer(float[] buffer, int offset, int count)
        {
            var alpha = (float)VMath.Clamp(FAlpha.Value, 0, 1);

            for (int i = 0; i < count; i++)
            {
                buffer[i] = FLastValue = alpha * FLastValue + (1 - alpha) * FValue.Value;
            }
        }
Пример #10
0
        public uint getMortonCode(Vector3D p)
        {
            p = VMath.Clamp(p * 1023.0, 0.0, 1023.0);
            uint xx = expandBits((uint)p.x);
            uint yy = expandBits((uint)p.y);
            uint zz = expandBits((uint)p.z);

            return((xx << 2) | (yy << 1) | (zz));
        }
Пример #11
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            this.stream.Position = this.position;
            var newCount  = VMath.Clamp(count, 0, (int)(this.Length - this.position));
            var bytesRead = this.stream.Read(buffer, offset, newCount);

            this.position += bytesRead;
            return(bytesRead);
        }
Пример #12
0
 internal void RefreshValue(int index)
 {
     if (PluginContext.PluginInfo.ParameterCount > index)
     {
         var trackbar = PluginParameterListVw[index];
         var value    = PluginContext.PluginCommandStub.GetParameter(index);
         trackbar.Value = VMath.Clamp((int)(value * 1000), trackbar.Minimum, trackbar.Maximum);
         var label = (Label)trackbar.Tag;
         label.Text = GetParamText(index);
     }
 }
Пример #13
0
 //set value
 public void UpdateValue(Slider s, double val)
 {
     s.Value = VMath.Clamp(val, 0, 1);
     if (!FIsLong)
     {
         s.SliderTransform = FSliderSize * VMath.Translate(0, s.Value - 0.5, 0) * s.Transform;
     }
     else
     {
         s.SliderTransform = VMath.Scale(1, s.Value, 1) * VMath.Translate(0, s.Value * 0.5 - 0.5, 1) * s.Transform;
     }
 }
Пример #14
0
        //mirror the index inside a range
        private int mirror(int n, int d)
        {
            int dm = d - 1;

            if (n > dm)
            {
                n = dm + dm - n;
            }
            if (n < 0)
            {
                n = -n;
            }
            return(VMath.Clamp(n, 0, dm));
        }
Пример #15
0
        private int[] PinsAsArgumentList(DisplayPin[] pins, int index)
        {
            int[]  result = new int[pins.Length];
            double tmp;

            for (int i = 0; i < result.Length; i++)
            {
                pins[i].Pin.GetValue(index, out tmp);
                int v = (int)tmp;
                v = VMath.Clamp(v, pins[i].Min, pins[i].Max);
                result[pins[i].ArgPos] = v;
            }

            return(result);
        }
Пример #16
0
        //This is the (Old) One. It assumes a rate between 0.0 and 1.0
        public void MutateAlt(VRandom rng, double rate)
        {
            //clamps the rate to be between zero and one
            rate = VMath.Clamp(rate);

            //expands the size of the network at random
            //if (rng.RandBool(P_EXPAND)) Expand(rng);
            if (rng.RandBool(rate))
            {
                Expand(rng);
            }

            //used in itterating the structure
            var ittr1 = nurons.ListItems();
            var ittr2 = axons.ListItems();

            //foreach (Nuron n in ittr1)
            //{
            //    //skips over input nurons
            //    if (n.IsInput) continue;

            //    //mutates nodes based on the augmented mutation rate
            //    if (!rng.RandBool(P_NODE * rate)) continue;

            //    //updates the activation funciton
            //    n.Func = GetRandomActivation(rng);
            //}

            foreach (Axon ax in ittr2)
            {
                if (rng.RandBool(P_TOGGEL * rate))
                {
                    //toggeles the enabled state
                    ax.Enabled = !ax.Enabled;
                    if (ax.Enabled)
                    {
                        ax.Weight = 0.0;
                    }
                }

                if (ax.Enabled)
                {
                    //permutes the weight by a small amount
                    double delta = rng.RandGauss() * SD_NEW;
                    ax.Weight = ax.Weight + (delta * rate);
                }
            }
        }
Пример #17
0
        protected override void FillBuffer(float[] buffer, int offset, int count)
        {
            if (FEnableBuffer.Length < count)
            {
                FEnableBuffer = new float[count];
            }

            Enable.Read(FEnableBuffer, offset, count);


            for (int i = 0; i < count; i++)
            {
                var enabled = FEnableBuffer[i];
                if (enabled != FLastEnabled)
                {
                    if (enabled > 0 && FLastEnabled <= 0.0f)
                    {
                        EnterStage(EnvelopStage.Attack);
                        FEnabledLevel = enabled;
                    }
                    else if (enabled <= 0.0f)
                    {
                        EnterStage(EnvelopStage.Release);
                    }
                }


                if (FCurrentStage == EnvelopStage.Sustain)
                {
                    FCurrentLevel *= FMultiplier;
                    FCurrentLevel  = VMath.Clamp(FCurrentLevel, 0, 1);
                }
                else if (FCurrentStage != EnvelopStage.Off)
                {
                    if (FCurrentSampleIndex == FNextStageSampleIndex)
                    {
                        var newStage = (EnvelopStage)(((int)FCurrentStage + 1) % 5);
                        EnterStage(newStage);
                    }
                    FCurrentLevel *= FMultiplier;
                    FCurrentSampleIndex++;
                }

                buffer[i] = (float)(FCurrentLevel * FEnabledLevel * (Max.Value - Min.Value) + Min.Value);

                FLastEnabled = enabled;
            }
        }
        void CalcMoogCoeffs2(float cutoff, float resonance)
        {
            var f = (float)VMath.Clamp(cutoff + FCutoffOffset, 15, SampleRate * 0.25);

            f = (f + f) / SampleRate;
            //[0 - 1]
            // empirical tuning
            p = f * (1.8f - 0.8f * f);
            // k = p + p - T(1.0);
            // A much better tuning seems to be:
            k = 2.0f * (float)Math.Sin(f * Math.PI * 0.5f) - 1.0f;
            var t1 = (1.0f - p) * 1.386249f;
            var t2 = 12.0f + t1 * t1;

            FResoCoeff = (resonance + FResonanceOffset) * (t2 + 6.0f * t1) / (t2 - 6.0f * t1);
        }
Пример #19
0
        public override void UpdateTouches(TouchList touches)
        {
            base.UpdateTouches(touches);

            //update slider
            for (int i = 0; i < FControllers.Length; i++)
            {
                //get current slider
                RotarySlider s = FControllers[i];

                if (s.Hit)
                {
                    Vector2D invMouse     = (s.InvTransform * new Vector2D(s.AssignedTouch.X, s.AssignedTouch.Y)).xy;
                    Vector2D invLastMouse = (s.InvTransform * new Vector2D(s.LastTouchPos.X, s.LastTouchPos.Y)).xy;
                    s.Value = VMath.Clamp(s.Value + (invMouse.y - invLastMouse.y) * FSliderSpeed, 0, 1);
                }
            }
        }
Пример #20
0
        public override long Seek(long offset, SeekOrigin origin)
        {
            switch (origin)
            {
            case SeekOrigin.Begin:
                this.position = VMath.Clamp(offset, 0, this.Length);
                break;

            case SeekOrigin.Current:
                this.position = VMath.Clamp(this.position + offset, 0, this.Length);
                break;

            case SeekOrigin.End:
                this.position = VMath.Clamp(this.Length - offset, 0, this.Length);
                break;
            }
            return(this.position);
        }
Пример #21
0
        /// <summary>
        /// Adds an enum entry at a specific position of an enum.
        /// </summary>
        /// <param name="enumName">The enums name.</param>
        /// <param name="entryName">The new enum entry.</param>
        /// <param name="index">Position of the new entry.</param>
        public static void AddEntry(string enumName, string entryName, int index)
        {
            var count = GetEnumEntryCount(enumName);

            index = VMath.Clamp(index, 0, count);

            var entries = new string[count + 1];

            for (int i = 0; i < count; i++)
            {
                int offset = (i < index) ? 0 : 1;
                entries[i + offset] = GetEnumEntryString(enumName, i);
            }

            entries[index] = entryName;

            UpdateEnum(enumName, entries[0], entries);
        }
        public void Update(double time)
        {
            if (FIsRunning)
            {
                Progress   = VMath.Clamp((time - FStartTime) / Duration, 0, 1);
                FirstFrame = Progress == 0;
                LastFrame  = Progress == 1;

                if (LastFrame)
                {
                    FIsRunning = false;
                }
            }
            else
            {
                FirstFrame = false;
                LastFrame  = false;
            }
        }
Пример #23
0
        public override void Nudge(ref CompoundCommand cmds, NudgeDirection direction, float timeDelta, float valueDelta)
        {
            base.Nudge(ref cmds, direction, timeDelta, valueDelta);

            foreach (var kf in Keyframes.Where(x => x.Model.Selected.Value))
            {
                switch (direction)
                {
                case NudgeDirection.Up:
                    var newValue = (float)VMath.Clamp(kf.Model.Value.Value + valueDelta, Model.Minimum.Value, Model.Maximum.Value);
                    cmds.Append(Command.Set(kf.Model.Value, newValue));
                    break;

                case NudgeDirection.Down:
                    newValue = (float)VMath.Clamp(kf.Model.Value.Value - valueDelta, Model.Minimum.Value, Model.Maximum.Value);
                    cmds.Append(Command.Set(kf.Model.Value, newValue));
                    break;
                }
            }
        }
Пример #24
0
        private IEnumerable <MouseNotification> GenerateMouseNotifications(MouseData mouseData, MouseInputEventArgs args)
        {
            var virtualScreenSize = SystemInformation.VirtualScreen.Size;
            var position          = mouseData.Position;

            switch (args.Mode)
            {
            case MouseMode.MoveAbsolute:
                // x,y between 0x0000 and 0xffff
                position = new Point(args.X / virtualScreenSize.Width, args.Y / virtualScreenSize.Height);
                break;

            case MouseMode.MoveRelative:
                position = new Point(VMath.Clamp(args.X + position.X, 0, virtualScreenSize.Width - 1), VMath.Clamp(args.Y + position.Y, 0, virtualScreenSize.Height - 1));
                break;

            case MouseMode.VirtualDesktop:
                position = new Point(args.X, args.Y);
                break;

            case MouseMode.AttributesChanged:
            case MouseMode.MoveNoCoalesce:
                // Ignore
                break;

            default:
                break;
            }
            if (mouseData.Position != position)
            {
                mouseData.Position = position;
                yield return(new MouseMoveNotification(position, virtualScreenSize));
            }
            foreach (var n in GenerateMouseButtonNotifications(args, position, virtualScreenSize))
            {
                yield return(n);
            }
        }
Пример #25
0
        /// <summary>
        /// Preterbs the current neural net by some random amount without
        /// creating a clone. The rate of mutaiton determins how many of the
        /// network connections are preturbed. For exampe, a mutation rate
        /// of 0.5 indicates that half the weights will be perturbed.
        /// </summary>
        /// <param name="rate">Rate of mutation</param>
        public void MutateSelf(double rate)
        {
            //clamps the rate to be between zero and one
            rate = VMath.Clamp(rate);

            if (rng.RandBool(P_Node))
            {
                //changes the activation funciton of a single node
                NuronOld node = RandNuron();
                node.Func = RandFunc();
                return;
            }

            //lists all the axons in the network
            var axons = ListAxons();

            foreach (Axon ax in axons)
            {
                //mutates weights based on the rate of mutation
                if (rng.RandBool(1.0 - rate))
                {
                    continue;
                }

                if (ax.Enabled)
                {
                    //permutes the weight by a small amount
                    double delta = rng.RandGauss() * SDS;
                    ax.Weight = ax.Weight + delta;
                }
                else
                {
                    //resets the neuron to a small weight
                    ax.Weight  = rng.RandGauss() * SDS;
                    ax.Enabled = true;
                }
            }
        }
Пример #26
0
        //update mouse
        public override bool UpdateMouse(Vector2D Mouse,
                                         bool MouseLeftDownEdge,
                                         bool MouseLeftPressed)
        {
            bool upEdgeHit = base.UpdateMouse(Mouse, MouseLeftDownEdge, MouseLeftPressed);

            //update slider
            for (int i = 0; i < FControllers.Length; i++)
            {
                //get current slider
                Slider s = FControllers[i];


                //set selected slice number and color
                if (FMouseHit && i == SelectedSlice)
                {
                    Vector2D invMouse     = (s.InvTransform * Mouse).xy;
                    Vector2D invLastMouse = (s.InvTransform * FLastMouse).xy;

                    s.Value = VMath.Clamp(s.Value + (invMouse.y - invLastMouse.y) * FSliderSpeed, 0, 1);
                    if (!FIsLong)
                    {
                        s.SliderTransform = FSliderSize * VMath.Translate(0, s.Value - 0.5, 0) * s.Transform;
                    }
                    else
                    {
                        s.SliderTransform = VMath.Scale(1, s.Value, 1) * VMath.Translate(0, s.Value * 0.5 - 0.5, 1) * s.Transform;
                    }
                }

                s.ColorSlider = FColSlider;
            }

            FLastMouse = Mouse;

            return(upEdgeHit);
        }
Пример #27
0
        /// <summary>
        /// Create a new texture renderer.
        /// </summary>
        /// <param name="logger">The logger to log to.</param>
        /// <param name="frameRate">
        /// The maximum rate in frames per second (fps) that CefRenderHandler::OnPaint will
        /// be called for a windowless browser. The actual fps may be lower if the browser
        /// cannot generate frames at the requested rate. The minimum value is 1 and the
        /// maximum value is 60 (default 30).
        /// </param>
        public HTMLTextureRenderer(ILogger logger, int frameRate)
        {
            Logger    = logger;
            FrameRate = VMath.Clamp(frameRate, MIN_FRAME_RATE, MAX_FRAME_RATE);

            FLoaded = false;

            var settings = new CefBrowserSettings();

            settings.FileAccessFromFileUrls      = CefState.Enabled;
            settings.UniversalAccessFromFileUrls = CefState.Enabled;
            settings.WebGL = CefState.Enabled;
            settings.WindowlessFrameRate = frameRate;

            var windowInfo = CefWindowInfo.Create();

            windowInfo.SetAsWindowless(IntPtr.Zero, true);

            FWebClient = new WebClient(this);
            // See http://magpcss.org/ceforum/viewtopic.php?f=6&t=5901
            CefBrowserHost.CreateBrowser(windowInfo, FWebClient, settings);
            // Block until browser is created
            FBrowserAttachedEvent.WaitOne();
        }
Пример #28
0
 //set value
 public void UpdateValue(RotarySlider s, double val)
 {
     s.Value = VMath.Clamp(val, 0, 1);
 }
Пример #29
0
        public void Evaluate(int spreadMax)
        {
            FWebRenderers.ResizeAndDispose(spreadMax, (i) => new HTMLTextureRenderer(FLogger, FFrameRateIn[i]));

            FTextureOut.SliceCount        = spreadMax;
            FRootElementOut.SliceCount    = spreadMax;
            FDomOut.SliceCount            = spreadMax;
            FDocumentWidthOut.SliceCount  = spreadMax;
            FDocumentHeightOut.SliceCount = spreadMax;
            FIsLoadingOut.SliceCount      = spreadMax;
            FLoadedOut.SliceCount         = spreadMax;
            FErrorTextOut.SliceCount      = spreadMax;
            FCurrentUrlOut.SliceCount     = spreadMax;

            for (int i = 0; i < spreadMax; i++)
            {
                var webRenderer = FWebRenderers[i];

                var frameRate = VMath.Clamp(FFrameRateIn[i], HTMLTextureRenderer.MIN_FRAME_RATE, HTMLTextureRenderer.MAX_FRAME_RATE);
                if (frameRate != webRenderer.FrameRate)
                {
                    webRenderer.Dispose();
                    webRenderer      = new HTMLTextureRenderer(FLogger, frameRate);
                    FWebRenderers[i] = webRenderer;
                }

                // Check enabled state
                webRenderer.Enabled = FEnabledIn[i];
                if (!webRenderer.Enabled)
                {
                    continue;
                }

                // LoadUrl or LoadString
                LoadContent(webRenderer, new Size(FWidthIn[i], FHeightIn[i]), i);

                // Assign inputs
                webRenderer.ZoomLevel = FZoomLevelIn[i];
                webRenderer.Mouse     = FMouseIn[i];
                webRenderer.Keyboard  = FKeyboardIn[i];
                webRenderer.ScrollTo  = FScrollToIn[i];

                if (FExecuteIn[i])
                {
                    webRenderer.ExecuteJavaScript(FJavaScriptIn[i]);
                }

                if (FUpdateDomIn[i])
                {
                    webRenderer.UpdateDom();
                }

                if (FReloadIn[i])
                {
                    webRenderer.Reload();
                }

                // Set outputs
                FErrorTextOut[i] = webRenderer.CurrentError;
                FIsLoadingOut[i] = webRenderer.IsLoading;
                FLoadedOut[i]    = webRenderer.Loaded;
                // As long as the renderer is in the loading state stick to the old values
                if (!webRenderer.IsLoading)
                {
                    if (FDomOut[i] != webRenderer.CurrentDom)
                    {
                        FDomOut[i] = webRenderer.CurrentDom;
                    }
                    var rootElement = webRenderer.CurrentDom != null
                        ? webRenderer.CurrentDom.Root
                        : null;
                    if (FRootElementOut[i] != rootElement)
                    {
                        FRootElementOut[i] = rootElement;
                    }
                    var documentSize = webRenderer.DocumentSize;
                    FDocumentWidthOut[i]  = documentSize.Width;
                    FDocumentHeightOut[i] = documentSize.Height;
                    FCurrentUrlOut[i]     = webRenderer.CurrentUrl;
                }
            }

            FTextureOut.MarkPinAsChanged();
        }
Пример #30
0
        private void OscBasic(float[] buffer, int count)
        {
            var t2    = 2 * T;
            var slope = (float)VMath.Clamp(Slope.Value, 0.01, 0.99);

            switch (WaveForm.Value)
            {
            case WaveFormSelection.Sine:
                for (int i = 0; i < count; i++)
                {
                    buffer[i] = Gain.Value * (float)Math.Sin(FPhase * Math.PI);

                    FPhase += t2 + FMBuffer[i] * FMLevel.Value;

                    if (FPhase > 1)
                    {
                        FPhase -= 2;
                    }
                }
                break;

            case WaveFormSelection.Triangle:
                for (int i = 0; i < count; i++)
                {
                    var phase = FPhase * 0.5f + 0.5f;
                    //buffer[i] =  Gain.Value * (phase < slope ? (2/slope) * phase - 1 : 1 - (2/(1-slope)) * (phase-slope));

                    buffer[i] = Gain.Value * AudioUtils.Triangle(phase, slope);

                    FPhase += t2 + FMBuffer[i] * FMLevel.Value;

                    if (FPhase >= 1)
                    {
                        FPhase -= 2f;
                    }
                }
                break;

            case WaveFormSelection.Square:
                for (int i = 0; i < count; i++)
                {
                    buffer[i] = FPhase < 2 * slope ? Gain.Value : -Gain.Value;

                    FPhase += t2 + FMBuffer[i] * FMLevel.Value;

                    if (FPhase >= 2.0f)
                    {
                        FPhase -= 2.0f;
                    }
                }
                break;

            case WaveFormSelection.Sawtooth:

                for (int i = 0; i < count; i++)
                {
                    buffer[i] = Gain.Value * FPhase;

                    FPhase += t2 + FMBuffer[i] * FMLevel.Value;

                    if (FPhase > 1.0f)
                    {
                        FPhase -= 2.0f;
                    }
                }
                break;
            }
        }