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; }
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); }
//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; } } } }
/// <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(); }
//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); }
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); }
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; } }
//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++; } } }
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; } }
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)); }
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); }
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); } }
//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; } }
//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)); }
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); }
//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); } } }
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); }
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); } } }
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); }
/// <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; } }
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; } } }
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); } }
/// <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; } } }
//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); }
/// <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(); }
//set value public void UpdateValue(RotarySlider s, double val) { s.Value = VMath.Clamp(val, 0, 1); }
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(); }
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; } }