Files
EGJ25/addons/guide/modifiers/guide_modifier_map_range.gd

68 lines
1.9 KiB
GDScript3
Raw Normal View History

@tool
## Maps an input range to an output range and optionally clamps the output.
class_name GUIDEModifierMapRange
extends GUIDEModifier
## Should the output be clamped to the range?
@export var apply_clamp:bool = true
## The minimum input value
@export var input_min:float = 0.0
## The maximum input value
@export var input_max:float = 1.0
## The minimum output value
@export var output_min:float = 0.0
## The maximum output value
@export var output_max:float = 1.0
## Apply modifier to X axis
@export var x:bool = true
## Apply modifier to Y axis
@export var y:bool = true
## Apply modifier to Z axis
@export var z:bool = true
var _omin:float
var _omax:float
func _begin_usage():
# we calculate the min and max of the output range here, so we can use them later and don't have to
# recalculate them every time the modifier is used
_omin = min(output_min, output_max)
_omax = max(output_min, output_max)
func _modify_input(input:Vector3, delta:float, value_type:GUIDEAction.GUIDEActionValueType) -> Vector3:
if not input.is_finite():
return Vector3.INF
var x_value:float = remap(input.x, input_min, input_max, output_min, output_max)
var y_value:float = remap(input.y, input_min, input_max, output_min, output_max)
var z_value:float = remap(input.z, input_min, input_max, output_min, output_max)
if apply_clamp:
# clamp doesn't handle reverse ranges, so we need to use our calculated normalized output range
# to clamp the output values
x_value = clamp(x_value, _omin, _omax)
y_value = clamp(y_value, _omin, _omax)
z_value = clamp(z_value, _omin, _omax)
# Return vector with enabled axes set, others unchanged
return Vector3(
x_value if x else input.x,
y_value if y else input.y,
z_value if z else input.z,
)
func _editor_name() -> String:
return "Map Range"
func _editor_description() -> String:
return "Maps an input range to an output range and optionally clamps the output"