generated from krampus/template-godot4
	
		
			
	
	
		
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
		
		
			
		
	
	
			229 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			GDScript3
		
	
	
	
	
	
|  | @tool | ||
|  | @icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") | ||
|  | class_name PhantomCameraNoise2D | ||
|  | extends Resource | ||
|  | 
 | ||
|  | ## A resource type used to apply noise, or shake, to [Camera2D]s that have a [PhantomCameraHost] as a child. | ||
|  | ## | ||
|  | ## Is a resource type that defines, calculates and outputs the noise values to a [Camera2D] through active | ||
|  | ## [PhantomCamera3D].[br] | ||
|  | ## It can be applied to either [PhantomCameraNoiseEmitter2D] or a [PhantomCamera2D] noise property directly | ||
|  | 
 | ||
|  | #region Exported Properties | ||
|  | 
 | ||
|  | ## Defines the size of the noise pattern.[br] | ||
|  | ## Higher values will increase the range the noise can reach. | ||
|  | @export_range(0, 1000, 0.001, "or_greater") var amplitude: float = 10: | ||
|  | 	set = set_amplitude, | ||
|  | 	get = get_amplitude | ||
|  | 
 | ||
|  | ## Sets the density of the noise pattern.[br] | ||
|  | ## Higher values will result in more erratic noise. | ||
|  | @export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.5: | ||
|  | 	set = set_frequency, | ||
|  | 	get = get_frequency | ||
|  | 
 | ||
|  | ## If true, randomizes the noise pattern every time the noise is run.[br] | ||
|  | ## If disabled, [member seed] can be used to define a fixed noise pattern. | ||
|  | @export var randomize_noise_seed: bool = true: | ||
|  | 	set = set_randomize_noise_seed, | ||
|  | 	get = get_randomize_noise_seed | ||
|  | 
 | ||
|  | ## Sets a predetermined seed noise value.[br] | ||
|  | ## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. | ||
|  | @export var noise_seed: int = 0: | ||
|  | 	set = set_noise_seed, | ||
|  | 	get = get_noise_seed | ||
|  | 
 | ||
|  | ## Enables noise changes to the [member Camera2D.offset] position. | ||
|  | @export var positional_noise: bool = true: | ||
|  | 	set = set_positional_noise, | ||
|  | 	get = get_positional_noise | ||
|  | 
 | ||
|  | ## Enables noise changes to the [Camera2D]'s rotation. | ||
|  | @export var rotational_noise: bool = false: | ||
|  | 	set = set_rotational_noise, | ||
|  | 	get = get_rotational_noise | ||
|  | 
 | ||
|  | @export_group("Positional Multiplier") | ||
|  | ## Multiplies positional noise amount in the X-axis.[br] | ||
|  | ## Set the value to [param 0] to disable noise in the axis. | ||
|  | @export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: | ||
|  | 	set = set_positional_multiplier_x, | ||
|  | 	get = get_positional_multiplier_x | ||
|  | 
 | ||
|  | ## Multiplies positional noise amount in the Y-axis.[br] | ||
|  | ## Set the value to [param 0] to disable noise in the axis. | ||
|  | @export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: | ||
|  | 	set = set_positional_multiplier_y, | ||
|  | 	get = get_positional_multiplier_y | ||
|  | 
 | ||
|  | @export_group("Rotational Multiplier") | ||
|  | ## Multiplies rotational noise amount. | ||
|  | @export_range(0, 1, 0.001, "or_greater") var rotational_multiplier: float = 1: | ||
|  | 	set = set_rotational_multiplier, | ||
|  | 	get = get_rotational_multiplier | ||
|  | 
 | ||
|  | #endregion | ||
|  | 
 | ||
|  | #region Private Variables | ||
|  | 
 | ||
|  | var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() | ||
|  | 
 | ||
|  | var _noise_positional_multiplier: Vector2 = Vector2( | ||
|  | 	positional_multiplier_x, | ||
|  | 	positional_multiplier_y | ||
|  | ) | ||
|  | 
 | ||
|  | var _trauma: float = 0.0: | ||
|  | 	set(value): | ||
|  | 		_trauma = value | ||
|  | 
 | ||
|  | var _noise_time: float = 0.0 | ||
|  | 
 | ||
|  | #endregion | ||
|  | 
 | ||
|  | #region Private Functions | ||
|  | 
 | ||
|  | func _init(): | ||
|  | 	_noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN | ||
|  | 	if randomize_noise_seed: _noise_algorithm.seed = randi() | ||
|  | 	_noise_algorithm.frequency = frequency | ||
|  | 
 | ||
|  | 
 | ||
|  | func _validate_property(property: Dictionary) -> void: | ||
|  | 	if randomize_noise_seed and property.name == "noise_seed": | ||
|  | 		property.usage = PROPERTY_USAGE_NO_EDITOR | ||
|  | 
 | ||
|  | 	if not rotational_noise and property.name == "rotational_multiplier": | ||
|  | 			property.usage = PROPERTY_USAGE_NO_EDITOR | ||
|  | 
 | ||
|  | 	if not positional_noise: | ||
|  | 		match property.name: | ||
|  | 			"positional_multiplier_x", \ | ||
|  | 			"positional_multiplier_y": | ||
|  | 				property.usage = PROPERTY_USAGE_NO_EDITOR | ||
|  | 
 | ||
|  | 
 | ||
|  | func _get_noise_from_seed(noise_seed: int) -> float: | ||
|  | 	return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude | ||
|  | 
 | ||
|  | 
 | ||
|  | func set_trauma(value: float) -> void: | ||
|  | 	_trauma = value | ||
|  | 
 | ||
|  | #endregion | ||
|  | 
 | ||
|  | #region Public Functions | ||
|  | 
 | ||
|  | func get_noise_transform(delta: float) -> Transform2D: | ||
|  | 	var output_position: Vector2 = Vector2.ZERO | ||
|  | 	var output_rotation: float = 0.0 | ||
|  | 	_noise_time += delta | ||
|  | 	_trauma = maxf(_trauma, 0.0) | ||
|  | 
 | ||
|  | 	if positional_noise: | ||
|  | 		for i in 2: | ||
|  | 			output_position[i] = _noise_positional_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) | ||
|  | 	if rotational_noise: | ||
|  | 		output_rotation = rotational_multiplier / 100 * pow(_trauma, 2) * _get_noise_from_seed(noise_seed) | ||
|  | 
 | ||
|  | 	return Transform2D(output_rotation, output_position) | ||
|  | 
 | ||
|  | 
 | ||
|  | func reset_noise_time() -> void: | ||
|  | 	_noise_time = 0 | ||
|  | 
 | ||
|  | #endregion | ||
|  | 
 | ||
|  | #region Setters & Getters | ||
|  | 
 | ||
|  | ## Sets the [member amplitude] value. | ||
|  | func set_amplitude(value: float) -> void: | ||
|  | 	amplitude =value | ||
|  | 
 | ||
|  | ## Returns the [member amplitude] value. | ||
|  | func get_amplitude() -> float: | ||
|  | 	return amplitude | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member frequency] value. | ||
|  | func set_frequency(value: float) -> void: | ||
|  | 	frequency = value | ||
|  | 	_noise_algorithm.frequency = value | ||
|  | 
 | ||
|  | ## Returns the [member frequency] value. | ||
|  | func get_frequency() -> float: | ||
|  | 	return frequency | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member randomize_seed] value. | ||
|  | func set_randomize_noise_seed(value: int) -> void: | ||
|  | 	randomize_noise_seed = value | ||
|  | 	if value: _noise_algorithm.seed = randi() | ||
|  | 	notify_property_list_changed() | ||
|  | 
 | ||
|  | ## Returns the [member randomize_seed] value. | ||
|  | func get_randomize_noise_seed() -> int: | ||
|  | 	return randomize_noise_seed | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member randomize_seed] value. | ||
|  | func set_noise_seed(value: int) -> void: | ||
|  | 	noise_seed = value | ||
|  | 
 | ||
|  | ## Returns the [member seed] value. | ||
|  | func get_noise_seed() -> int: | ||
|  | 	return noise_seed | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member positional_noise] value. | ||
|  | func set_positional_noise(value: bool) -> void: | ||
|  | 	positional_noise = value | ||
|  | 	notify_property_list_changed() | ||
|  | 
 | ||
|  | ## Returns the [member positional_noise] value. | ||
|  | func get_positional_noise() -> bool: | ||
|  | 	return positional_noise | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member rotational_noise] value. | ||
|  | func set_rotational_noise(value: bool) -> void: | ||
|  | 	rotational_noise = value | ||
|  | 	notify_property_list_changed() | ||
|  | 
 | ||
|  | ## Returns the [member rotational_noise] value. | ||
|  | func get_rotational_noise() -> bool: | ||
|  | 	return rotational_noise | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member positional_multiplier_x] value. | ||
|  | func set_positional_multiplier_x(value: float) -> void: | ||
|  | 	positional_multiplier_x = value | ||
|  | 	_noise_positional_multiplier.x = value | ||
|  | 
 | ||
|  | ## Returns the [member positional_multiplier_x] value. | ||
|  | func get_positional_multiplier_x() -> float: | ||
|  | 	return positional_multiplier_x | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member positional_multiplier_y] value. | ||
|  | func set_positional_multiplier_y(value: float) -> void: | ||
|  | 	positional_multiplier_y = value | ||
|  | 	_noise_positional_multiplier.y = value | ||
|  | 
 | ||
|  | ## Returns the [member positional_multiplier_y] value. | ||
|  | func get_positional_multiplier_y() -> float: | ||
|  | 	return positional_multiplier_y | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Sets the [member rotational_multiplier] value. | ||
|  | func set_rotational_multiplier(value: float) -> void: | ||
|  | 	rotational_multiplier = value | ||
|  | 
 | ||
|  | ## Returns the [member rotational_multiplier] value. | ||
|  | func get_rotational_multiplier() -> float: | ||
|  | 	return rotational_multiplier | ||
|  | 
 | ||
|  | #endregion |