Remap#
Math / Range / Remap Number, From, To
Can Read
Cannot Write
Description#
Converts a number from one range of values to another one, keeping its proportion
Parameters#
| Name | Description |
|---|---|
| Number | The number that is converted |
| From Min | The lowest value of the original range |
| From Max | The highest value of the original range |
| To Min | The lowest value of the resulting range |
| To Max | The highest value of the resulting range |
| Clamp | Whether the result stays inside the resulting range |
Code#
using System;
using UnityEngine;
using VisualScript.Icons;
namespace VisualScript.Runtime
{
[Get]
[Title("Remap")]
[Category("Math/Range/Remap", "Number, From, To")]
[Description("Converts a number from one range of values to another one, keeping its proportion")]
[Image(typeof(IconInterpolate), ColorTheme.Type.Yellow, typeof(BadgeSync))]
[Parameter("Number", "The number that is converted")]
[Parameter("From Min", "The lowest value of the original range")]
[Parameter("From Max", "The highest value of the original range")]
[Parameter("To Min", "The lowest value of the resulting range")]
[Parameter("To Max", "The highest value of the resulting range")]
[Parameter("Clamp", "Whether the result stays inside the resulting range")]
[Keywords("Map", "Scale", "Convert", "Normalize", "Range", "Proportion", "Rule of Three")]
[Serializable]
public class TypeNumberMathRemap : TypeNumber
{
[SerializeField] private GetNumber m_Number = new GetNumber();
[SerializeField] private GetNumber m_FromMin = new GetNumber(0f);
[SerializeField] private GetNumber m_FromMax = new GetNumber(1f);
[SerializeField] private GetNumber m_ToMin = new GetNumber(0f);
[SerializeField] private GetNumber m_ToMax = new GetNumber(100f);
[SerializeField] private GetBool m_Clamp = new GetBool(true);
public override double GetPreview(GameObject source) => Remap(
this.m_Number.GetPreview(source),
this.m_FromMin.GetPreview(source),
this.m_FromMax.GetPreview(source),
this.m_ToMin.GetPreview(source),
this.m_ToMax.GetPreview(source),
this.m_Clamp.GetPreview(source)
);
public override double Get(Args args) => Remap(
this.m_Number.Get(args),
this.m_FromMin.Get(args),
this.m_FromMax.Get(args),
this.m_ToMin.Get(args),
this.m_ToMax.Get(args),
this.m_Clamp.Get(args)
);
private static double Remap(double number, double fromMin, double fromMax, double toMin, double toMax, bool clamp)
{
double fromRange = fromMax - fromMin;
if (Math.Abs(fromRange) <= double.Epsilon) return toMin;
double ratio = (number - fromMin) / fromRange;
if (clamp) ratio = Math.Clamp(ratio, 0f, 1f);
return toMin + (toMax - toMin) * ratio;
}
public override string ToString()
{
return $"Remap {this.m_Number} to ({this.m_ToMin}, {this.m_ToMax})";
}
protected override SubscriptionMode Subscription => SubscriptionMode.OnChange;
}
}