some shake
This commit is contained in:
112
addons/shaker/data/BaseShakerType.gd
Normal file
112
addons/shaker/data/BaseShakerType.gd
Normal file
@@ -0,0 +1,112 @@
|
||||
@icon("res://addons/shaker/assets/ShakerType.svg")
|
||||
@tool
|
||||
class_name ShakerTypeBase
|
||||
extends Resource
|
||||
|
||||
# Enumerations for blending modes and graph axes
|
||||
enum BlendingModes {
|
||||
Add,
|
||||
Override,
|
||||
Multiply,
|
||||
Subtract,
|
||||
Average,
|
||||
Max,
|
||||
Min
|
||||
}
|
||||
|
||||
# Shake Properties
|
||||
@export_group("Shake Properties")
|
||||
@export var BlendingMode: BlendingModes = BlendingModes.Add:
|
||||
set = set_blending_mode,
|
||||
get = get_blending_mode
|
||||
|
||||
@export_exp_easing var fade_in: float = 0.0:
|
||||
set = set_fade_in,
|
||||
get = get_fade_in
|
||||
|
||||
@export_exp_easing("attenuation") var fade_out: float = 0.0:
|
||||
set = set_fade_out,
|
||||
get = get_fade_out
|
||||
|
||||
@export_range(0.0, 1.0) var start_percent: float = 0.0:
|
||||
set = set_start_percent,
|
||||
get = get_start_percent
|
||||
|
||||
@export_range(0.0, 1.0) var end_percent: float = 1.0:
|
||||
set = set_end_percent,
|
||||
get = get_end_percent
|
||||
|
||||
# Live Shake Graph
|
||||
@export_group("Live Shake Graph")
|
||||
@export var _temp_graph: bool = false
|
||||
|
||||
@export_range(16, 96) var bake_internal: int = 64:
|
||||
set = set_bake_internal,
|
||||
get = get_bake_internal
|
||||
|
||||
var duration = 0.0:
|
||||
set = set_duration,
|
||||
get = get_duration
|
||||
|
||||
func _init(blending_mode:BlendingModes=BlendingModes.Add, fade_in:float=self.fade_in, fade_out:float=self.fade_out, start_percent:float=self.start_percent, end_percent:float=self.end_percent) -> void:
|
||||
self.BlendingMode = blending_mode
|
||||
self.fade_in = fade_in
|
||||
self.fade_out = fade_out
|
||||
self.start_percent = start_percent
|
||||
self.end_percent = end_percent
|
||||
|
||||
# Signals
|
||||
signal property_changed(name: StringName)
|
||||
|
||||
# Custom setter and getter functions
|
||||
func set_blending_mode(value: BlendingModes) -> void:
|
||||
BlendingMode = value
|
||||
_on_property_changed("BlendingMode")
|
||||
|
||||
func get_blending_mode() -> BlendingModes:
|
||||
return BlendingMode
|
||||
|
||||
func set_fade_in(value: float) -> void:
|
||||
fade_in = value
|
||||
_on_property_changed("fade_in")
|
||||
|
||||
func get_fade_in() -> float:
|
||||
return fade_in
|
||||
|
||||
func set_fade_out(value: float) -> void:
|
||||
fade_out = value
|
||||
_on_property_changed("fade_out")
|
||||
|
||||
func get_fade_out() -> float:
|
||||
return fade_out
|
||||
|
||||
func set_start_percent(value: float) -> void:
|
||||
start_percent = min(value, end_percent)
|
||||
_on_property_changed("start_percent")
|
||||
|
||||
func get_start_percent() -> float:
|
||||
return start_percent
|
||||
|
||||
func set_end_percent(value: float) -> void:
|
||||
end_percent = max(value, start_percent)
|
||||
_on_property_changed("end_percent")
|
||||
|
||||
func get_end_percent() -> float:
|
||||
return end_percent
|
||||
|
||||
func set_bake_internal(value: int) -> void:
|
||||
bake_internal = clamp(value, 16, 96)
|
||||
_on_property_changed("bake_internal")
|
||||
|
||||
func get_bake_internal() -> int:
|
||||
return bake_internal
|
||||
|
||||
func set_duration(value: float = 0.0) -> void:
|
||||
duration = value
|
||||
|
||||
func get_duration() -> float:
|
||||
return duration
|
||||
|
||||
# Handle property changes
|
||||
func _on_property_changed(property_name: StringName) -> void:
|
||||
property_changed.emit(property_name)
|
||||
1
addons/shaker/data/BaseShakerType.gd.uid
Normal file
1
addons/shaker/data/BaseShakerType.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://d2i321te0ny64
|
||||
53
addons/shaker/data/ShakerPresetBase.gd
Normal file
53
addons/shaker/data/ShakerPresetBase.gd
Normal file
@@ -0,0 +1,53 @@
|
||||
@tool
|
||||
@icon("res://addons/shaker/assets/ShakerPreset.svg")
|
||||
class_name ShakerPresetBase
|
||||
extends Resource
|
||||
|
||||
# Enum for shake categories
|
||||
enum Categories {
|
||||
POSITION,
|
||||
ROTATION,
|
||||
SCALE
|
||||
}
|
||||
|
||||
# Graph panel reference
|
||||
var Graph: Panel
|
||||
|
||||
# Bake internal setting
|
||||
@export_range(16, 96) var bake_internal: int = 64:
|
||||
set = set_bake_internal,
|
||||
get = get_bake_internal
|
||||
|
||||
# Follow timeline flag
|
||||
@export var __follow_timeline: bool = false:
|
||||
set = set_follow_timeline,
|
||||
get = get_follow_timeline
|
||||
|
||||
# Component duration and parent node
|
||||
var component_duration: float = 0.0
|
||||
var parent: Node
|
||||
|
||||
# Signal for property changes
|
||||
signal property_changed(name: StringName)
|
||||
|
||||
func set_bake_internal(value: int) -> void:
|
||||
bake_internal = clamp(value, 16, 96)
|
||||
_on_property_changed("bake_internal")
|
||||
|
||||
func get_bake_internal() -> int:
|
||||
return bake_internal
|
||||
|
||||
func set_follow_timeline(value: bool) -> void:
|
||||
__follow_timeline = value
|
||||
_on_property_changed("__follow_timeline")
|
||||
|
||||
func get_follow_timeline() -> bool:
|
||||
return __follow_timeline
|
||||
|
||||
# Handle property changes
|
||||
func _on_property_changed(property_name: StringName) -> void:
|
||||
property_changed.emit(property_name)
|
||||
|
||||
# Calculate the difference between two arrays
|
||||
func _array_difference(a: Array, b: Array) -> Array:
|
||||
return b.filter(func(item): return not a.has(item))
|
||||
1
addons/shaker/data/ShakerPresetBase.gd.uid
Normal file
1
addons/shaker/data/ShakerPresetBase.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cveqkhn5t8vng
|
||||
24
addons/shaker/data/ShakerProperty.gd
Normal file
24
addons/shaker/data/ShakerProperty.gd
Normal file
@@ -0,0 +1,24 @@
|
||||
@tool
|
||||
@icon("res://addons/shaker/assets/ShakerPreset.svg")
|
||||
class_name ShakerProperty
|
||||
extends Resource
|
||||
|
||||
@export var property_name:String
|
||||
# Properties
|
||||
@export var shake_type:ShakerTypeBase
|
||||
|
||||
# Signal for property changes
|
||||
signal property_changed(name: StringName)
|
||||
|
||||
func _init(property_name:String="", shake_type:ShakerTypeBase=null) -> void:
|
||||
self.property_name = property_name
|
||||
self.shake_type = shake_type
|
||||
|
||||
# Handle property changes
|
||||
func _on_property_changed(property_name: StringName) -> void:
|
||||
property_changed.emit(property_name)
|
||||
|
||||
func get_value(_t:float) -> Variant:
|
||||
if shake_type:
|
||||
return shake_type.get_value(_t)
|
||||
return 0.0
|
||||
1
addons/shaker/data/ShakerProperty.gd.uid
Normal file
1
addons/shaker/data/ShakerProperty.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bd8eceas8jvyl
|
||||
46
addons/shaker/data/Single/BaseShakerType1D.gd
Normal file
46
addons/shaker/data/Single/BaseShakerType1D.gd
Normal file
@@ -0,0 +1,46 @@
|
||||
@icon("res://addons/shaker/assets/ShakerType.svg")
|
||||
@tool
|
||||
class_name ShakerTypeBase1D
|
||||
extends ShakerTypeBase
|
||||
|
||||
enum GraphAxis {
|
||||
X,
|
||||
}
|
||||
|
||||
@export var amplitude:float = 1.0:
|
||||
set = set_amplitude,
|
||||
get = get_amplitude
|
||||
|
||||
@export var offset:float = 0.0:
|
||||
set = set_offset,
|
||||
get = get_offset
|
||||
|
||||
func set_amplitude(value: float) -> void:
|
||||
amplitude = value
|
||||
_on_property_changed("amplitude")
|
||||
|
||||
func get_amplitude() -> float:
|
||||
return amplitude
|
||||
|
||||
func set_offset(value: float) -> void:
|
||||
offset = value
|
||||
_on_property_changed("offset")
|
||||
|
||||
func get_offset() -> float:
|
||||
return offset
|
||||
|
||||
# Get the shake value at a given time
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0;
|
||||
return _calc_value(fmod(t, 1.0), result)
|
||||
|
||||
# Calculate the shake value
|
||||
func _calc_value(t: float, result: float) -> float:
|
||||
if duration > 0:
|
||||
t /= duration
|
||||
if (start_percent != 0 && start_percent > t) || (end_percent != 1 && end_percent < t):
|
||||
result = 0.0;
|
||||
else:
|
||||
result = result * amplitude + offset
|
||||
result *= (ease(t, fade_in) if fade_in > 0.0001 else 1.0) * (ease(1.0 - t, fade_out) if fade_out > 0.0001 else 1.0)
|
||||
return result;
|
||||
1
addons/shaker/data/Single/BaseShakerType1D.gd.uid
Normal file
1
addons/shaker/data/Single/BaseShakerType1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bhqlklbhcxfgf
|
||||
43
addons/shaker/data/Single/ShakerTypeAudioBus1D.gd
Normal file
43
addons/shaker/data/Single/ShakerTypeAudioBus1D.gd
Normal file
@@ -0,0 +1,43 @@
|
||||
@tool
|
||||
class_name ShakerTypeAudioBus1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
@export var bus_name:String = "Master":
|
||||
set = set_bus_name,
|
||||
get = get_bus_name
|
||||
@export_range(20, 20000) var min_frequence:float = 20
|
||||
@export_range(20, 20000) var max_frequence:float = 20000
|
||||
|
||||
var bus_index:int = 0
|
||||
var effect:AudioEffectSpectrumAnalyzerInstance
|
||||
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
if effect:
|
||||
var mag:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence, max_frequence, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
result = mag.length()
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_bus_name(value: String) -> void:
|
||||
bus_name = value
|
||||
_update_bus_index()
|
||||
_on_property_changed("bus_name")
|
||||
|
||||
func get_bus_name() -> String:
|
||||
return bus_name
|
||||
|
||||
func _update_bus_index() -> void:
|
||||
bus_index = AudioServer.get_bus_index(bus_name)
|
||||
if bus_index > -1:
|
||||
for e in AudioServer.get_bus_effect_count(bus_index):
|
||||
var _effect:AudioEffect = AudioServer.get_bus_effect(bus_index, e)
|
||||
if _effect is AudioEffectSpectrumAnalyzer:
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, e, 0)
|
||||
break;
|
||||
if effect == null:
|
||||
AudioServer.add_bus_effect(bus_index, AudioEffectSpectrumAnalyzer.new(), 0)
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, 0)
|
||||
else:
|
||||
push_error("Error: Bus '" + bus_name + "' not found!")
|
||||
effect = null
|
||||
1
addons/shaker/data/Single/ShakerTypeAudioBus1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeAudioBus1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dshti5xd41w07
|
||||
42
addons/shaker/data/Single/ShakerTypeBrownianShake1D.gd
Normal file
42
addons/shaker/data/Single/ShakerTypeBrownianShake1D.gd
Normal file
@@ -0,0 +1,42 @@
|
||||
@tool
|
||||
class_name ShakerTypeBrownianShake1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
@export var roughness:float = 1.0:
|
||||
set = set_roughness,
|
||||
get = get_roughness
|
||||
|
||||
@export var persistence:float = 0.5:
|
||||
set = set_persistence,
|
||||
get = get_persistence
|
||||
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
var _last_pos:float = 0.0
|
||||
|
||||
func _init() -> void:
|
||||
property_changed.connect(_property_changed)
|
||||
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
result = (_last_pos + _generator.randf_range(-roughness, roughness))
|
||||
result = _calc_value(t, result)
|
||||
|
||||
_last_pos = lerpf(_last_pos, result, 1.0 - persistence)
|
||||
return _last_pos
|
||||
|
||||
func _property_changed(name: StringName) -> void:
|
||||
_last_pos = 0.0
|
||||
|
||||
func set_roughness(value: float) -> void:
|
||||
roughness = value
|
||||
_on_property_changed("roughness")
|
||||
|
||||
func get_roughness() -> float:
|
||||
return roughness
|
||||
|
||||
func set_persistence(value: float) -> void:
|
||||
persistence = clamp(persistence,0, 1)
|
||||
_on_property_changed("persistence")
|
||||
|
||||
func get_persistence() -> float:
|
||||
return persistence
|
||||
@@ -0,0 +1 @@
|
||||
uid://62yumjskyeow
|
||||
41
addons/shaker/data/Single/ShakerTypeCurve1D.gd
Normal file
41
addons/shaker/data/Single/ShakerTypeCurve1D.gd
Normal file
@@ -0,0 +1,41 @@
|
||||
@tool
|
||||
class_name ShakerTypeCurve1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
@export var curve: Curve:
|
||||
set = set_curve,
|
||||
get = get_curve
|
||||
|
||||
@export var loop: bool = true:
|
||||
set = set_loop,
|
||||
get = get_loop
|
||||
|
||||
func _curve_changed() -> void:
|
||||
_on_property_changed("curve")
|
||||
|
||||
func get_value(t: float) -> float:
|
||||
var result: float = 0.0
|
||||
if loop && t > 1.0:
|
||||
t = fmod(t, 1.0)
|
||||
if curve:
|
||||
result = curve.sample(t)
|
||||
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_curve(value: Curve) -> void:
|
||||
if curve:
|
||||
curve.changed.disconnect(_curve_changed)
|
||||
curve = value
|
||||
if curve:
|
||||
curve.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
func get_curve() -> Curve:
|
||||
return curve
|
||||
|
||||
func set_loop(value: bool) -> void:
|
||||
loop = value
|
||||
_on_property_changed("loop")
|
||||
|
||||
func get_loop() -> bool:
|
||||
return loop
|
||||
1
addons/shaker/data/Single/ShakerTypeCurve1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeCurve1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dadkdm3tvmuqq
|
||||
32
addons/shaker/data/Single/ShakerTypeNoiseShake1D.gd
Normal file
32
addons/shaker/data/Single/ShakerTypeNoiseShake1D.gd
Normal file
@@ -0,0 +1,32 @@
|
||||
@tool
|
||||
class_name ShakerTypeNoiseShake1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
@export var noise_texture: NoiseTexture2D = NoiseTexture2D.new():
|
||||
set = set_noise_texture,
|
||||
get = get_noise_texture
|
||||
|
||||
func _init() -> void:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
if noise_texture && noise_texture.noise:
|
||||
var noise_size:Vector2 = Vector2(noise_texture.width, noise_texture.height)
|
||||
var noise_offset:float = t * noise_size.x
|
||||
result = noise_texture.noise.get_noise_1d(noise_offset)
|
||||
result *= 2.0
|
||||
return _calc_value(t, result)
|
||||
|
||||
func _on_noise_changed() -> void:
|
||||
_on_property_changed("noise_texture")
|
||||
|
||||
func set_noise_texture(value: NoiseTexture2D) -> void:
|
||||
if noise_texture:
|
||||
noise_texture.changed.disconnect(_on_noise_changed)
|
||||
noise_texture = value
|
||||
if noise_texture:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_noise_texture() -> NoiseTexture2D:
|
||||
return noise_texture
|
||||
1
addons/shaker/data/Single/ShakerTypeNoiseShake1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeNoiseShake1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bdrk4rkut1y3l
|
||||
30
addons/shaker/data/Single/ShakerTypeRandom1D.gd
Normal file
30
addons/shaker/data/Single/ShakerTypeRandom1D.gd
Normal file
@@ -0,0 +1,30 @@
|
||||
@tool
|
||||
class_name ShakerTypeRandom1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
## The seed for the random number generator.
|
||||
@export var seed: int = 0:
|
||||
set = set_seed
|
||||
|
||||
## The random number generator instance.
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
|
||||
## Initializes the shake type with the given seed.
|
||||
func _init() -> void:
|
||||
set_seed(seed)
|
||||
|
||||
## Calculates a random value for each axis at time t.
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
result = _generator.randf_range(-1.0, 1.0)
|
||||
return _calc_value(t, result)
|
||||
|
||||
## Sets the seed for the random number generator.
|
||||
func set_seed(value: int) -> void:
|
||||
seed = value
|
||||
_generator.seed = seed
|
||||
_on_property_changed("seed")
|
||||
|
||||
## Gets the current seed of the random number generator.
|
||||
func get_seed() -> int:
|
||||
return seed
|
||||
1
addons/shaker/data/Single/ShakerTypeRandom1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeRandom1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://buor2ix0dmwk2
|
||||
41
addons/shaker/data/Single/ShakerTypeSawtoothWave1D.gd
Normal file
41
addons/shaker/data/Single/ShakerTypeSawtoothWave1D.gd
Normal file
@@ -0,0 +1,41 @@
|
||||
@tool
|
||||
class_name ShakerTypeSawtoothWave1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
## The frequency of the sawtooth wave for each axis.
|
||||
@export var frequency:float = 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The asymmetry of the sawtooth wave for each axis (0 to 1).
|
||||
@export var asymmetry:float = 0.5:
|
||||
set = set_asymmetry
|
||||
|
||||
## Sets the frequency of the sawtooth wave.
|
||||
func set_frequency(value: float) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the sawtooth wave.
|
||||
func get_frequency() -> float:
|
||||
return frequency
|
||||
|
||||
## Sets the asymmetry of the sawtooth wave.
|
||||
func set_asymmetry(value: float) -> void:
|
||||
asymmetry = clamp(value, 0.0, 0.0)
|
||||
_on_property_changed("asymmetry")
|
||||
|
||||
## Gets the asymmetry of the sawtooth wave.
|
||||
func get_asymmetry() -> float:
|
||||
return asymmetry
|
||||
|
||||
## Calculates the value of the sawtooth wave at time t.
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
var _real_time:float = fmod(t, 1.0) if t > 1.0 else t
|
||||
var wave:float = fmod(_real_time * frequency, 1.0)
|
||||
|
||||
wave = wave / asymmetry if wave < asymmetry else (1.0 - wave) / (1.0 - asymmetry)
|
||||
result = wave
|
||||
result = _calc_value(t, result)
|
||||
result = (result - amplitude * 0.5) * 2.0
|
||||
return result
|
||||
@@ -0,0 +1 @@
|
||||
uid://tftoajmajyfg
|
||||
32
addons/shaker/data/Single/ShakerTypeSineWave1D.gd
Normal file
32
addons/shaker/data/Single/ShakerTypeSineWave1D.gd
Normal file
@@ -0,0 +1,32 @@
|
||||
@tool
|
||||
class_name ShakerTypeSineWave1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
@export_group("Sinewave Properties")
|
||||
@export var frequency:float = 1.0:
|
||||
set = set_frequency,
|
||||
get = get_frequency
|
||||
|
||||
@export var phase:float = 0.0:
|
||||
set = set_phase,
|
||||
get = get_phase
|
||||
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
var _real_time: float = fmod(t, 1.0) if t > 1.0 else t
|
||||
result = sin(t * frequency * TAU + phase)
|
||||
return _calc_value(_real_time, result)
|
||||
|
||||
func set_frequency(value: float) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
func get_frequency() -> float:
|
||||
return frequency
|
||||
|
||||
func set_phase(value: float) -> void:
|
||||
phase = value
|
||||
_on_property_changed("phase")
|
||||
|
||||
func get_phase() -> float:
|
||||
return phase
|
||||
1
addons/shaker/data/Single/ShakerTypeSineWave1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeSineWave1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://vvwsdrpmw7w4
|
||||
35
addons/shaker/data/Single/ShakerTypeSquareWave1D.gd
Normal file
35
addons/shaker/data/Single/ShakerTypeSquareWave1D.gd
Normal file
@@ -0,0 +1,35 @@
|
||||
@tool
|
||||
class_name ShakerTypeSquareWave1D
|
||||
extends ShakerTypeBase1D
|
||||
|
||||
## The frequency of the square wave for each axis.
|
||||
@export var frequency:float = 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The duty cycle of the square wave for each axis (0 to 1).
|
||||
@export var duty_cycle:float = 0.5:
|
||||
set = set_duty_cycle
|
||||
|
||||
## Sets the frequency of the square wave.
|
||||
func set_frequency(value:float) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the square wave.
|
||||
func get_frequency() -> float:
|
||||
return frequency
|
||||
|
||||
## Sets the duty cycle of the square wave.
|
||||
func set_duty_cycle(value:float) -> void:
|
||||
duty_cycle = clamp(value, 0.0, 0.0)
|
||||
_on_property_changed("duty_cycle")
|
||||
|
||||
## Gets the duty cycle of the square wave.
|
||||
func get_duty_cycle() -> float:
|
||||
return duty_cycle
|
||||
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> float:
|
||||
var result:float = 0.0
|
||||
result = 1.0 if fmod(t * frequency, 1.0) < duty_cycle else -1.0
|
||||
return _calc_value(t, result)
|
||||
1
addons/shaker/data/Single/ShakerTypeSquareWave1D.gd.uid
Normal file
1
addons/shaker/data/Single/ShakerTypeSquareWave1D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bwuxn8yt7jiwy
|
||||
47
addons/shaker/data/Vector2/BaseShakerType2D.gd
Normal file
47
addons/shaker/data/Vector2/BaseShakerType2D.gd
Normal file
@@ -0,0 +1,47 @@
|
||||
@icon("res://addons/shaker/assets/ShakerType2D.svg")
|
||||
@tool
|
||||
class_name ShakerTypeBase2D
|
||||
extends ShakerTypeBase
|
||||
|
||||
enum GraphAxis {
|
||||
X,
|
||||
Y,
|
||||
}
|
||||
|
||||
@export var amplitude: Vector2 = Vector2.ONE:
|
||||
set = set_amplitude,
|
||||
get = get_amplitude
|
||||
|
||||
@export var offset: Vector2 = Vector2.ZERO:
|
||||
set = set_offset,
|
||||
get = get_offset
|
||||
|
||||
func set_amplitude(value: Vector2) -> void:
|
||||
amplitude = value
|
||||
_on_property_changed("amplitude")
|
||||
|
||||
func get_amplitude() -> Vector2:
|
||||
return amplitude
|
||||
|
||||
func set_offset(value: Vector2) -> void:
|
||||
offset = value
|
||||
_on_property_changed("offset")
|
||||
|
||||
func get_offset() -> Vector2:
|
||||
return offset
|
||||
|
||||
# Get the shake value at a given time
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
return _calc_value(fmod(t, 1.0), result)
|
||||
|
||||
# Calculate the shake value
|
||||
func _calc_value(t: float, result: Vector2) -> Vector2:
|
||||
if duration > 0:
|
||||
t /= duration
|
||||
if (start_percent != 0 && start_percent > t) || (end_percent != 1 && end_percent < t):
|
||||
result = Vector2.ZERO
|
||||
else:
|
||||
result = result * amplitude + offset
|
||||
result *= (ease(t, fade_in) if fade_in > 0.0001 else 1.0) * (ease(1.0 - t, fade_out) if fade_out > 0.0001 else 1.0)
|
||||
return result
|
||||
1
addons/shaker/data/Vector2/BaseShakerType2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/BaseShakerType2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://chp1jfq2fdtbm
|
||||
94
addons/shaker/data/Vector2/ShakerPreset2D.gd
Normal file
94
addons/shaker/data/Vector2/ShakerPreset2D.gd
Normal file
@@ -0,0 +1,94 @@
|
||||
@tool
|
||||
@icon("res://addons/shaker/assets/ShakerPreset2D.svg")
|
||||
class_name ShakerPreset2D
|
||||
extends ShakerPresetBase
|
||||
|
||||
|
||||
# Shake type arrays for each category
|
||||
@export var PositionShake: Array[ShakerTypeBase2D]:
|
||||
set = set_position_shake,
|
||||
get = get_position_shake
|
||||
|
||||
@export var RotationShake: Array[ShakerTypeBase1D]:
|
||||
set = set_rotation_shake,
|
||||
get = get_rotation_shake
|
||||
|
||||
@export var ScaleShake: Array[ShakerTypeBase2D]:
|
||||
set = set_scale_shake,
|
||||
get = get_scale_shake
|
||||
|
||||
# Custom setter and getter functions
|
||||
func set_position_shake(value: Array[ShakerTypeBase2D]) -> void:
|
||||
for _shake_type in _array_difference(PositionShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
PositionShake = value
|
||||
_on_property_changed("PositionShake")
|
||||
if Graph != null:
|
||||
Graph._on_fit_button_clicked()
|
||||
|
||||
func get_position_shake() -> Array[ShakerTypeBase2D]:
|
||||
return PositionShake
|
||||
|
||||
func set_rotation_shake(value: Array[ShakerTypeBase1D]) -> void:
|
||||
for _shake_type in _array_difference(RotationShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
RotationShake = value
|
||||
_on_property_changed("RotationShake")
|
||||
if Graph != null:
|
||||
Graph._on_fit_button_clicked()
|
||||
|
||||
func get_rotation_shake() -> Array[ShakerTypeBase1D]:
|
||||
return RotationShake
|
||||
|
||||
func get_shakes_by_category(category:Categories) -> Array:
|
||||
if category == Categories.POSITION:
|
||||
return PositionShake
|
||||
elif category == Categories.ROTATION:
|
||||
return RotationShake
|
||||
elif category == Categories.SCALE:
|
||||
return ScaleShake
|
||||
return [null]
|
||||
|
||||
func set_scale_shake(value: Array[ShakerTypeBase2D]) -> void:
|
||||
for _shake_type in _array_difference(ScaleShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
ScaleShake = value
|
||||
_on_property_changed("ScaleShake")
|
||||
if Graph != null:
|
||||
Graph._on_fit_button_clicked()
|
||||
|
||||
func get_scale_shake() -> Array[ShakerTypeBase2D]:
|
||||
return ScaleShake
|
||||
|
||||
# Get the shake value for a given time and category
|
||||
func get_value(t: float, _category: Categories = Categories.POSITION):
|
||||
var result
|
||||
if _category == Categories.ROTATION:
|
||||
result = 0.0
|
||||
else:
|
||||
result = Vector2.ZERO
|
||||
for shake_type in [PositionShake, RotationShake, ScaleShake][_category]:
|
||||
if shake_type != null:
|
||||
shake_type.duration = component_duration
|
||||
var _shake_result = shake_type.get_value(t)
|
||||
match shake_type.BlendingMode:
|
||||
shake_type.BlendingModes.Add:
|
||||
result += _shake_result
|
||||
shake_type.BlendingModes.Multiply:
|
||||
result *= _shake_result
|
||||
shake_type.BlendingModes.Subtract:
|
||||
result -= _shake_result
|
||||
shake_type.BlendingModes.Max:
|
||||
result.x = max(result.x, _shake_result.x)
|
||||
result.y = max(result.y, _shake_result.y)
|
||||
shake_type.BlendingModes.Min:
|
||||
result.x = min(result.x, _shake_result.x)
|
||||
result.y = min(result.y, _shake_result.y)
|
||||
shake_type.BlendingModes.Average:
|
||||
result = (result + _shake_result) * 0.5
|
||||
shake_type.BlendingModes.Override:
|
||||
result = _shake_result
|
||||
return result
|
||||
1
addons/shaker/data/Vector2/ShakerPreset2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerPreset2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ieocwh32dyx1
|
||||
45
addons/shaker/data/Vector2/ShakerTypeAudioBus2D.gd
Normal file
45
addons/shaker/data/Vector2/ShakerTypeAudioBus2D.gd
Normal file
@@ -0,0 +1,45 @@
|
||||
@tool
|
||||
class_name ShakerTypeAudioBus2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
@export var bus_name:String = "Master":
|
||||
set = set_bus_name,
|
||||
get = get_bus_name
|
||||
@export var min_frequence:Vector2 = Vector2(20, 20)
|
||||
@export var max_frequence:Vector2 = Vector2(20000, 20000)
|
||||
|
||||
var bus_index:int = 0
|
||||
var effect:AudioEffectSpectrumAnalyzerInstance
|
||||
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result:Vector2 = Vector2.ZERO
|
||||
if effect:
|
||||
var mag_x:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence.x, max_frequence.x, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
var mag_y:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence.y, max_frequence.y, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
result.x = mag_x.length()
|
||||
result.y = mag_y.length()
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_bus_name(value: String) -> void:
|
||||
bus_name = value
|
||||
_update_bus_index()
|
||||
_on_property_changed("bus_name")
|
||||
|
||||
func get_bus_name() -> String:
|
||||
return bus_name
|
||||
|
||||
func _update_bus_index() -> void:
|
||||
bus_index = AudioServer.get_bus_index(bus_name)
|
||||
if bus_index > -1:
|
||||
for e in AudioServer.get_bus_effect_count(bus_index):
|
||||
var _effect:AudioEffect = AudioServer.get_bus_effect(bus_index, e)
|
||||
if _effect is AudioEffectSpectrumAnalyzer:
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, e, 0)
|
||||
break;
|
||||
if effect == null:
|
||||
AudioServer.add_bus_effect(bus_index, AudioEffectSpectrumAnalyzer.new(), 0)
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, 0)
|
||||
else:
|
||||
push_error("Error: Bus '" + bus_name + "' not found!")
|
||||
effect = null
|
||||
1
addons/shaker/data/Vector2/ShakerTypeAudioBus2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeAudioBus2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://4msbbvpnv85g
|
||||
44
addons/shaker/data/Vector2/ShakerTypeBrownianShake2D.gd
Normal file
44
addons/shaker/data/Vector2/ShakerTypeBrownianShake2D.gd
Normal file
@@ -0,0 +1,44 @@
|
||||
@tool
|
||||
class_name ShakerTypeBrownianShake2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
@export var roughness: Vector2 = Vector2.ONE * 1.0:
|
||||
set = set_roughness,
|
||||
get = get_roughness
|
||||
|
||||
@export var persistence: Vector2 = Vector2.ONE * 0.5:
|
||||
set = set_persistence,
|
||||
get = get_persistence
|
||||
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
var _last_pos: Vector2 = Vector2.ZERO
|
||||
|
||||
func _init() -> void:
|
||||
property_changed.connect(_property_changed)
|
||||
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
result.x = (_last_pos.x + _generator.randf_range(-roughness.x, roughness.x))
|
||||
result.y = (_last_pos.y + _generator.randf_range(-roughness.y, roughness.y))
|
||||
result = _calc_value(t, result)
|
||||
|
||||
_last_pos.x = lerpf(_last_pos.x, result.x, 1.0 - persistence.x)
|
||||
_last_pos.y = lerpf(_last_pos.y, result.y, 1.0 - persistence.y)
|
||||
return _last_pos
|
||||
|
||||
func _property_changed(name: StringName) -> void:
|
||||
_last_pos = Vector2.ZERO
|
||||
|
||||
func set_roughness(value: Vector2) -> void:
|
||||
roughness = value
|
||||
_on_property_changed("roughness")
|
||||
|
||||
func get_roughness() -> Vector2:
|
||||
return roughness
|
||||
|
||||
func set_persistence(value: Vector2) -> void:
|
||||
persistence = value.clamp(Vector2(0,0),Vector2(1,1))
|
||||
_on_property_changed("persistence")
|
||||
|
||||
func get_persistence() -> Vector2:
|
||||
return persistence
|
||||
@@ -0,0 +1 @@
|
||||
uid://c2p5nhqgceojd
|
||||
60
addons/shaker/data/Vector2/ShakerTypeCurve2D.gd
Normal file
60
addons/shaker/data/Vector2/ShakerTypeCurve2D.gd
Normal file
@@ -0,0 +1,60 @@
|
||||
@tool
|
||||
class_name ShakerTypeCurve2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
@export var curve_x: Curve:
|
||||
set = set_curve_x,
|
||||
get = get_curve_x
|
||||
|
||||
@export var curve_y: Curve:
|
||||
set = set_curve_y,
|
||||
get = get_curve_y
|
||||
|
||||
@export var loop: bool = true:
|
||||
set = set_loop,
|
||||
get = get_loop
|
||||
|
||||
func _curve_changed() -> void:
|
||||
_on_property_changed("curve_")
|
||||
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
if loop && t > 1.0:
|
||||
t = fmod(t, 1.0)
|
||||
if curve_x:
|
||||
result.x = curve_x.sample(t)
|
||||
if curve_y:
|
||||
result.y = curve_y.sample(t)
|
||||
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_curve_x(value: Curve) -> void:
|
||||
if curve_x:
|
||||
curve_x.changed.disconnect(_curve_changed)
|
||||
curve_x = value
|
||||
if curve_x:
|
||||
curve_x.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
|
||||
func get_curve_x() -> Curve:
|
||||
return curve_x
|
||||
|
||||
func set_curve_y(value: Curve) -> void:
|
||||
if curve_y:
|
||||
curve_y.changed.disconnect(_curve_changed)
|
||||
curve_y = value
|
||||
if curve_y:
|
||||
curve_y.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
|
||||
func get_curve_y() -> Curve:
|
||||
return curve_y
|
||||
|
||||
func set_loop(value: bool) -> void:
|
||||
loop = value
|
||||
_on_property_changed("loop")
|
||||
|
||||
func get_loop() -> bool:
|
||||
return loop
|
||||
1
addons/shaker/data/Vector2/ShakerTypeCurve2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeCurve2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://dd6hr5hjnra0i
|
||||
33
addons/shaker/data/Vector2/ShakerTypeNoiseShake2D.gd
Normal file
33
addons/shaker/data/Vector2/ShakerTypeNoiseShake2D.gd
Normal file
@@ -0,0 +1,33 @@
|
||||
@tool
|
||||
class_name ShakerTypeNoiseShake2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
@export var noise_texture: NoiseTexture2D = NoiseTexture2D.new():
|
||||
set = set_noise_texture,
|
||||
get = get_noise_texture
|
||||
|
||||
func _init() -> void:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
if noise_texture && noise_texture.noise:
|
||||
var noise_size: Vector2 = Vector2(noise_texture.width, noise_texture.height)
|
||||
var noise_offset: Vector2 = t * noise_size
|
||||
result.x = noise_texture.noise.get_noise_2d(noise_offset.x, 0.0)
|
||||
result.y = noise_texture.noise.get_noise_2d(0.0, noise_offset.y)
|
||||
result *= 2.0
|
||||
return _calc_value(t, result)
|
||||
|
||||
func _on_noise_changed() -> void:
|
||||
_on_property_changed("noise_texture")
|
||||
|
||||
func set_noise_texture(value: NoiseTexture2D) -> void:
|
||||
if noise_texture:
|
||||
noise_texture.changed.disconnect(_on_noise_changed)
|
||||
noise_texture = value
|
||||
if noise_texture:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_noise_texture() -> NoiseTexture2D:
|
||||
return noise_texture
|
||||
1
addons/shaker/data/Vector2/ShakerTypeNoiseShake2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeNoiseShake2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://rytryaspugdk
|
||||
31
addons/shaker/data/Vector2/ShakerTypeRandom2D.gd
Normal file
31
addons/shaker/data/Vector2/ShakerTypeRandom2D.gd
Normal file
@@ -0,0 +1,31 @@
|
||||
@tool
|
||||
class_name ShakerTypeRandom2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
## The seed for the random number generator.
|
||||
@export var seed: int = 0:
|
||||
set = set_seed
|
||||
|
||||
## The random number generator instance.
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
|
||||
## Initializes the shake type with the given seed.
|
||||
func _init() -> void:
|
||||
set_seed(seed)
|
||||
|
||||
## Calculates a random value for each axis at time t.
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
result.x = _generator.randf_range(-1.0, 1.0)
|
||||
result.y = _generator.randf_range(-1.0, 1.0)
|
||||
return _calc_value(t, result)
|
||||
|
||||
## Sets the seed for the random number generator.
|
||||
func set_seed(value: int) -> void:
|
||||
seed = value
|
||||
_generator.seed = seed
|
||||
_on_property_changed("seed")
|
||||
|
||||
## Gets the current seed of the random number generator.
|
||||
func get_seed() -> int:
|
||||
return seed
|
||||
1
addons/shaker/data/Vector2/ShakerTypeRandom2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeRandom2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c7jr8ltct1k17
|
||||
42
addons/shaker/data/Vector2/ShakerTypeSawtoothWave2D.gd
Normal file
42
addons/shaker/data/Vector2/ShakerTypeSawtoothWave2D.gd
Normal file
@@ -0,0 +1,42 @@
|
||||
@tool
|
||||
class_name ShakerTypeSawtoothWave2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
## The frequency of the sawtooth wave for each axis.
|
||||
@export var frequency: Vector2 = Vector2.ONE * 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The asymmetry of the sawtooth wave for each axis (0 to 1).
|
||||
@export var asymmetry: Vector2 = Vector2.ONE * 0.5:
|
||||
set = set_asymmetry
|
||||
|
||||
## Sets the frequency of the sawtooth wave.
|
||||
func set_frequency(value: Vector2) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the sawtooth wave.
|
||||
func get_frequency() -> Vector2:
|
||||
return frequency
|
||||
|
||||
## Sets the asymmetry of the sawtooth wave.
|
||||
func set_asymmetry(value: Vector2) -> void:
|
||||
asymmetry = value.clamp(Vector2.ZERO, Vector2.ONE)
|
||||
_on_property_changed("asymmetry")
|
||||
|
||||
## Gets the asymmetry of the sawtooth wave.
|
||||
func get_asymmetry() -> Vector2:
|
||||
return asymmetry
|
||||
|
||||
## Calculates the value of the sawtooth wave at time t.
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
var _real_time: float = fmod(t, 1.0) if t > 1.0 else t
|
||||
var wave: Vector2 = (_real_time * frequency).posmod(1.0)
|
||||
|
||||
wave.x = wave.x / asymmetry.x if wave.x < asymmetry.x else (1.0 - wave.x) / (1.0 - asymmetry.x)
|
||||
wave.y = wave.y / asymmetry.y if wave.y < asymmetry.y else (1.0 - wave.y) / (1.0 - asymmetry.y)
|
||||
result = wave
|
||||
result = _calc_value(t, result)
|
||||
result = (result - amplitude * 0.5) * 2.0
|
||||
return result
|
||||
@@ -0,0 +1 @@
|
||||
uid://x16d6et41iut
|
||||
33
addons/shaker/data/Vector2/ShakerTypeSineWave2D.gd
Normal file
33
addons/shaker/data/Vector2/ShakerTypeSineWave2D.gd
Normal file
@@ -0,0 +1,33 @@
|
||||
@tool
|
||||
class_name ShakerTypeSineWave2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
@export_group("Sinewave Properties")
|
||||
@export var frequency: Vector2 = Vector2.ONE:
|
||||
set = set_frequency,
|
||||
get = get_frequency
|
||||
|
||||
@export var phase: Vector2 = Vector2.ONE:
|
||||
set = set_phase,
|
||||
get = get_phase
|
||||
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
var _real_time: float = fmod(t, 1.0) if t > 1.0 else t
|
||||
result.x = sin(t * frequency.x * TAU + phase.x)
|
||||
result.y = sin(t * frequency.y * TAU + phase.y + PI/2)
|
||||
return _calc_value(_real_time, result)
|
||||
|
||||
func set_frequency(value: Vector2) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
func get_frequency() -> Vector2:
|
||||
return frequency
|
||||
|
||||
func set_phase(value: Vector2) -> void:
|
||||
phase = value
|
||||
_on_property_changed("phase")
|
||||
|
||||
func get_phase() -> Vector2:
|
||||
return phase
|
||||
1
addons/shaker/data/Vector2/ShakerTypeSineWave2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeSineWave2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://drm7drd6f4t4x
|
||||
36
addons/shaker/data/Vector2/ShakerTypeSquareWave2D.gd
Normal file
36
addons/shaker/data/Vector2/ShakerTypeSquareWave2D.gd
Normal file
@@ -0,0 +1,36 @@
|
||||
@tool
|
||||
class_name ShakerTypeSquareWave2D
|
||||
extends ShakerTypeBase2D
|
||||
|
||||
## The frequency of the square wave for each axis.
|
||||
@export var frequency: Vector2 = Vector2.ONE * 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The duty cycle of the square wave for each axis (0 to 1).
|
||||
@export var duty_cycle: Vector2 = Vector2.ONE * 0.5:
|
||||
set = set_duty_cycle
|
||||
|
||||
## Sets the frequency of the square wave.
|
||||
func set_frequency(value: Vector2) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the square wave.
|
||||
func get_frequency() -> Vector2:
|
||||
return frequency
|
||||
|
||||
## Sets the duty cycle of the square wave.
|
||||
func set_duty_cycle(value: Vector2) -> void:
|
||||
duty_cycle = value.clamp(Vector2.ZERO, Vector2.ONE)
|
||||
_on_property_changed("duty_cycle")
|
||||
|
||||
## Gets the duty cycle of the square wave.
|
||||
func get_duty_cycle() -> Vector2:
|
||||
return duty_cycle
|
||||
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> Vector2:
|
||||
var result: Vector2 = Vector2.ZERO
|
||||
result.x = 1.0 if fmod(t * frequency.x, 1.0) < duty_cycle.x else -1.0
|
||||
result.y = 1.0 if fmod(t * frequency.y, 1.0) < duty_cycle.y else -1.0
|
||||
return _calc_value(t, result)
|
||||
1
addons/shaker/data/Vector2/ShakerTypeSquareWave2D.gd.uid
Normal file
1
addons/shaker/data/Vector2/ShakerTypeSquareWave2D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://btxrpjbvdcl1f
|
||||
48
addons/shaker/data/Vector3/BaseShakerType3D.gd
Normal file
48
addons/shaker/data/Vector3/BaseShakerType3D.gd
Normal file
@@ -0,0 +1,48 @@
|
||||
@icon("res://addons/shaker/assets/ShakerType3D.svg")
|
||||
@tool
|
||||
class_name ShakerTypeBase3D
|
||||
extends ShakerTypeBase
|
||||
|
||||
enum GraphAxis {
|
||||
X,
|
||||
Y,
|
||||
Z
|
||||
}
|
||||
|
||||
@export var amplitude: Vector3 = Vector3.ONE:
|
||||
set = set_amplitude,
|
||||
get = get_amplitude
|
||||
|
||||
@export var offset: Vector3 = Vector3.ZERO:
|
||||
set = set_offset,
|
||||
get = get_offset
|
||||
|
||||
func set_amplitude(value: Vector3) -> void:
|
||||
amplitude = value
|
||||
_on_property_changed("amplitude")
|
||||
|
||||
func get_amplitude() -> Vector3:
|
||||
return amplitude
|
||||
|
||||
func set_offset(value: Vector3) -> void:
|
||||
offset = value
|
||||
_on_property_changed("offset")
|
||||
|
||||
func get_offset() -> Vector3:
|
||||
return offset
|
||||
|
||||
# Get the shake value at a given time
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
return _calc_value(fmod(t, 1.0), result)
|
||||
|
||||
# Calculate the shake value
|
||||
func _calc_value(t: float, result: Vector3) -> Vector3:
|
||||
if duration > 0:
|
||||
t /= duration
|
||||
if (start_percent != 0 && start_percent > t) || (end_percent != 1 && end_percent < t):
|
||||
result = Vector3.ZERO
|
||||
else:
|
||||
result = result * amplitude + offset
|
||||
result *= (ease(t, fade_in) if abs(fade_in) > 0.0001 else 1.0) * (ease(1.0 - t, fade_out) if abs(fade_out) > 0.0001 else 1.0)
|
||||
return result
|
||||
1
addons/shaker/data/Vector3/BaseShakerType3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/BaseShakerType3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://0tu2q57qqu4s
|
||||
103
addons/shaker/data/Vector3/ShakerPreset3D.gd
Normal file
103
addons/shaker/data/Vector3/ShakerPreset3D.gd
Normal file
@@ -0,0 +1,103 @@
|
||||
@tool
|
||||
@icon("res://addons/shaker/assets/ShakerPreset3D.svg")
|
||||
class_name ShakerPreset3D
|
||||
extends ShakerPresetBase
|
||||
|
||||
# Shake type arrays for each category
|
||||
@export var PositionShake: Array[ShakerTypeBase3D]:
|
||||
set = set_position_shake,
|
||||
get = get_position_shake
|
||||
|
||||
@export var RotationShake: Array[ShakerTypeBase3D]:
|
||||
set = set_rotation_shake,
|
||||
get = get_rotation_shake
|
||||
|
||||
@export var ScaleShake: Array[ShakerTypeBase3D]:
|
||||
set = set_scale_shake,
|
||||
get = get_scale_shake
|
||||
|
||||
# Custom setter and getter functions
|
||||
func set_position_shake(value: Array[ShakerTypeBase3D]) -> void:
|
||||
for _shake_type in _array_difference(PositionShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
_shake_type.property_changed.connect(_change_graph_category.bind(0))
|
||||
PositionShake = value
|
||||
if Graph != null:
|
||||
Graph.select_category(0)
|
||||
Graph._on_fit_button_clicked()
|
||||
_on_property_changed("PositionShake")
|
||||
|
||||
func get_position_shake() -> Array[ShakerTypeBase3D]:
|
||||
return PositionShake
|
||||
|
||||
func set_rotation_shake(value: Array[ShakerTypeBase3D]) -> void:
|
||||
for _shake_type in _array_difference(RotationShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
_shake_type.property_changed.connect(_change_graph_category.bind(1))
|
||||
RotationShake = value
|
||||
if Graph != null:
|
||||
Graph.select_category(1)
|
||||
Graph._on_fit_button_clicked()
|
||||
_on_property_changed("RotationShake")
|
||||
|
||||
func get_rotation_shake() -> Array[ShakerTypeBase3D]:
|
||||
return RotationShake
|
||||
|
||||
func set_scale_shake(value: Array[ShakerTypeBase3D]) -> void:
|
||||
for _shake_type in _array_difference(ScaleShake, value):
|
||||
if _shake_type != null:
|
||||
_shake_type.property_changed.connect(_on_property_changed)
|
||||
_shake_type.property_changed.connect(_change_graph_category.bind(2))
|
||||
ScaleShake = value
|
||||
if Graph != null:
|
||||
Graph.select_category(2)
|
||||
Graph._on_fit_button_clicked()
|
||||
_on_property_changed("ScaleShake")
|
||||
|
||||
func get_scale_shake() -> Array[ShakerTypeBase3D]:
|
||||
return ScaleShake
|
||||
|
||||
# Get the shake value for a given time and category
|
||||
func get_value(t: float, _category: Categories = Categories.POSITION) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
var selected_category: Array[ShakerTypeBase3D] = [PositionShake, RotationShake, ScaleShake][_category]
|
||||
for shake_type in selected_category:
|
||||
if shake_type != null:
|
||||
shake_type.duration = component_duration
|
||||
var _shake_result: Vector3 = shake_type.get_value(t)
|
||||
match shake_type.BlendingMode:
|
||||
shake_type.BlendingModes.Add:
|
||||
result += _shake_result
|
||||
shake_type.BlendingModes.Multiply:
|
||||
result *= _shake_result
|
||||
shake_type.BlendingModes.Subtract:
|
||||
result -= _shake_result
|
||||
shake_type.BlendingModes.Max:
|
||||
result.x = max(result.x, _shake_result.x)
|
||||
result.y = max(result.y, _shake_result.y)
|
||||
result.z = max(result.z, _shake_result.z)
|
||||
shake_type.BlendingModes.Min:
|
||||
result.x = min(result.x, _shake_result.x)
|
||||
result.y = min(result.y, _shake_result.y)
|
||||
result.z = min(result.z, _shake_result.z)
|
||||
shake_type.BlendingModes.Average:
|
||||
result = (result + _shake_result) * 0.5
|
||||
shake_type.BlendingModes.Override:
|
||||
result = _shake_result
|
||||
return result
|
||||
|
||||
func _change_graph_category(_name:String, _category_index:int) -> void:
|
||||
if Graph:
|
||||
Graph.category_button.select(_category_index)
|
||||
Graph.category_button.item_selected.emit(_category_index)
|
||||
|
||||
func get_shakes_by_category(category:Categories) -> Array:
|
||||
if category == Categories.POSITION:
|
||||
return PositionShake
|
||||
elif category == Categories.ROTATION:
|
||||
return RotationShake
|
||||
elif category == Categories.SCALE:
|
||||
return ScaleShake
|
||||
return [null]
|
||||
1
addons/shaker/data/Vector3/ShakerPreset3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerPreset3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://mlwdmecg12xd
|
||||
49
addons/shaker/data/Vector3/ShakerTypeAudioBus3D.gd
Normal file
49
addons/shaker/data/Vector3/ShakerTypeAudioBus3D.gd
Normal file
@@ -0,0 +1,49 @@
|
||||
@tool
|
||||
class_name ShakerTypeAudioBus3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
@export var bus_name:String = "Master":
|
||||
set = set_bus_name,
|
||||
get = get_bus_name
|
||||
@export var min_frequence:Vector3 = Vector3(20, 20, 20)
|
||||
@export var max_frequence:Vector3 = Vector3(20000, 20000, 20000)
|
||||
|
||||
var bus_index:int = 0
|
||||
var effect:AudioEffectSpectrumAnalyzerInstance
|
||||
|
||||
func _init():
|
||||
_update_bus_index()
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result:Vector3 = Vector3.ZERO
|
||||
if effect:
|
||||
var mag_x:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence.x, max_frequence.x, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
var mag_y:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence.y, max_frequence.y, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
var mag_z:Vector2 = effect.get_magnitude_for_frequency_range(min_frequence.z, max_frequence.z, AudioEffectSpectrumAnalyzerInstance.MAGNITUDE_MAX)
|
||||
result.x = mag_x.length()
|
||||
result.y = mag_y.length()
|
||||
result.z = mag_y.length()
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_bus_name(value: String) -> void:
|
||||
bus_name = value
|
||||
_update_bus_index()
|
||||
_on_property_changed("bus_name")
|
||||
|
||||
func get_bus_name() -> String:
|
||||
return bus_name
|
||||
|
||||
func _update_bus_index() -> void:
|
||||
bus_index = AudioServer.get_bus_index(bus_name)
|
||||
if bus_index > -1:
|
||||
for e in AudioServer.get_bus_effect_count(bus_index):
|
||||
var _effect:AudioEffect = AudioServer.get_bus_effect(bus_index, e)
|
||||
if _effect is AudioEffectSpectrumAnalyzer:
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, e, 0)
|
||||
break;
|
||||
if effect == null:
|
||||
AudioServer.add_bus_effect(bus_index, AudioEffectSpectrumAnalyzer.new(), 0)
|
||||
effect = AudioServer.get_bus_effect_instance(bus_index, 0)
|
||||
else:
|
||||
push_error("Error: Bus '" + bus_name + "' not found!")
|
||||
effect = null
|
||||
1
addons/shaker/data/Vector3/ShakerTypeAudioBus3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeAudioBus3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cdne0sspxhssj
|
||||
46
addons/shaker/data/Vector3/ShakerTypeBrownianShake3D.gd
Normal file
46
addons/shaker/data/Vector3/ShakerTypeBrownianShake3D.gd
Normal file
@@ -0,0 +1,46 @@
|
||||
@tool
|
||||
class_name ShakerTypeBrownianShake3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
@export var roughness: Vector3 = Vector3.ONE * 1.0:
|
||||
set = set_roughness,
|
||||
get = get_roughness
|
||||
|
||||
@export var persistence: Vector3 = Vector3.ONE * 0.5:
|
||||
set = set_persistence,
|
||||
get = get_persistence
|
||||
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
var _last_pos: Vector3 = Vector3.ZERO
|
||||
|
||||
func _init() -> void:
|
||||
property_changed.connect(_property_changed)
|
||||
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
result.x = (_last_pos.x + _generator.randf_range(-roughness.x, roughness.x))
|
||||
result.y = (_last_pos.y + _generator.randf_range(-roughness.y, roughness.y))
|
||||
result.z = (_last_pos.z + _generator.randf_range(-roughness.z, roughness.z))
|
||||
result = _calc_value(t, result)
|
||||
|
||||
_last_pos.x = lerpf(_last_pos.x, result.x, 1.0 - persistence.x)
|
||||
_last_pos.y = lerpf(_last_pos.y, result.y, 1.0 - persistence.y)
|
||||
_last_pos.z = lerpf(_last_pos.z, result.z, 1.0 - persistence.z)
|
||||
return _last_pos
|
||||
|
||||
func _property_changed(name: StringName) -> void:
|
||||
_last_pos = Vector3.ZERO
|
||||
|
||||
func set_roughness(value: Vector3) -> void:
|
||||
roughness = value
|
||||
_on_property_changed("roughness")
|
||||
|
||||
func get_roughness() -> Vector3:
|
||||
return roughness
|
||||
|
||||
func set_persistence(value: Vector3) -> void:
|
||||
persistence = value.clamp(Vector3.ZERO, Vector3.ONE)
|
||||
_on_property_changed("persistence")
|
||||
|
||||
func get_persistence() -> Vector3:
|
||||
return persistence
|
||||
@@ -0,0 +1 @@
|
||||
uid://ddk408cg8156q
|
||||
78
addons/shaker/data/Vector3/ShakerTypeCurve3D.gd
Normal file
78
addons/shaker/data/Vector3/ShakerTypeCurve3D.gd
Normal file
@@ -0,0 +1,78 @@
|
||||
@tool
|
||||
class_name ShakerTypeCurve3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
@export var curve_x: Curve:
|
||||
set = set_curve_x,
|
||||
get = get_curve_x
|
||||
|
||||
@export var curve_y: Curve:
|
||||
set = set_curve_y,
|
||||
get = get_curve_y
|
||||
|
||||
@export var curve_z: Curve:
|
||||
set = set_curve_z,
|
||||
get = get_curve_z
|
||||
|
||||
@export var loop: bool = true:
|
||||
set = set_loop,
|
||||
get = get_loop
|
||||
|
||||
func _curve_changed() -> void:
|
||||
_on_property_changed("curve_")
|
||||
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
if loop && t > 1.0:
|
||||
t = fmod(t, 1.0)
|
||||
if curve_x:
|
||||
result.x = curve_x.sample(t)
|
||||
if curve_y:
|
||||
result.y = curve_y.sample(t)
|
||||
if curve_z:
|
||||
result.z = curve_z.sample(t)
|
||||
|
||||
return _calc_value(t, result)
|
||||
|
||||
func set_curve_x(value: Curve) -> void:
|
||||
if curve_x:
|
||||
curve_x.changed.disconnect(_curve_changed)
|
||||
curve_x = value
|
||||
if curve_x:
|
||||
curve_x.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
|
||||
func get_curve_x() -> Curve:
|
||||
return curve_x
|
||||
|
||||
func set_curve_y(value: Curve) -> void:
|
||||
if curve_y:
|
||||
curve_y.changed.disconnect(_curve_changed)
|
||||
curve_y = value
|
||||
if curve_y:
|
||||
curve_y.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
|
||||
func get_curve_y() -> Curve:
|
||||
return curve_y
|
||||
|
||||
func set_curve_z(value: Curve) -> void:
|
||||
if curve_z:
|
||||
curve_z.changed.disconnect(_curve_changed)
|
||||
curve_z = value
|
||||
if curve_z:
|
||||
curve_z.changed.connect(_curve_changed)
|
||||
else:
|
||||
_curve_changed()
|
||||
|
||||
func get_curve_z() -> Curve:
|
||||
return curve_z
|
||||
|
||||
func set_loop(value: bool) -> void:
|
||||
loop = value
|
||||
_on_property_changed("loop")
|
||||
|
||||
func get_loop() -> bool:
|
||||
return loop
|
||||
1
addons/shaker/data/Vector3/ShakerTypeCurve3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeCurve3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://biqfuixncau4j
|
||||
34
addons/shaker/data/Vector3/ShakerTypeNoiseShake3D.gd
Normal file
34
addons/shaker/data/Vector3/ShakerTypeNoiseShake3D.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
@tool
|
||||
class_name ShakerTypeNoiseShake3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
@export var noise_texture: NoiseTexture3D = NoiseTexture3D.new():
|
||||
set = set_noise_texture,
|
||||
get = get_noise_texture
|
||||
|
||||
func _init() -> void:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
if noise_texture && noise_texture.noise:
|
||||
var noise_size: Vector3 = Vector3(noise_texture.width, noise_texture.height, noise_texture.depth)
|
||||
var noise_offset: Vector3 = t * noise_size
|
||||
result.x = noise_texture.noise.get_noise_3d(noise_offset.x, 0.0, 0.0)
|
||||
result.y = noise_texture.noise.get_noise_3d(0.0, noise_offset.y, 0.0)
|
||||
result.z = noise_texture.noise.get_noise_3d(0.0, 0.0, noise_offset.z)
|
||||
result *= 2.0
|
||||
return _calc_value(t, result)
|
||||
|
||||
func _on_noise_changed() -> void:
|
||||
_on_property_changed("noise_texture")
|
||||
|
||||
func set_noise_texture(value: NoiseTexture3D) -> void:
|
||||
if noise_texture:
|
||||
noise_texture.changed.disconnect(_on_noise_changed)
|
||||
noise_texture = value
|
||||
if noise_texture:
|
||||
noise_texture.changed.connect(_on_noise_changed)
|
||||
|
||||
func get_noise_texture() -> NoiseTexture3D:
|
||||
return noise_texture
|
||||
1
addons/shaker/data/Vector3/ShakerTypeNoiseShake3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeNoiseShake3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ptaespkh1sk2
|
||||
32
addons/shaker/data/Vector3/ShakerTypeRandom3D.gd
Normal file
32
addons/shaker/data/Vector3/ShakerTypeRandom3D.gd
Normal file
@@ -0,0 +1,32 @@
|
||||
@tool
|
||||
class_name ShakerTypeRandom3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
## The seed for the random number generator.
|
||||
@export var seed: int = 0:
|
||||
set = set_seed
|
||||
|
||||
## The random number generator instance.
|
||||
var _generator: RandomNumberGenerator = RandomNumberGenerator.new()
|
||||
|
||||
## Initializes the shake type with the given seed.
|
||||
func _init() -> void:
|
||||
set_seed(seed)
|
||||
|
||||
## Calculates a random value for each axis at time t.
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
result.x = _generator.randf_range(-1.0, 1.0)
|
||||
result.y = _generator.randf_range(-1.0, 1.0)
|
||||
result.z = _generator.randf_range(-1.0, 1.0)
|
||||
return _calc_value(t, result)
|
||||
|
||||
## Sets the seed for the random number generator.
|
||||
func set_seed(value: int) -> void:
|
||||
seed = value
|
||||
_generator.seed = seed
|
||||
_on_property_changed("seed")
|
||||
|
||||
## Gets the current seed of the random number generator.
|
||||
func get_seed() -> int:
|
||||
return seed
|
||||
1
addons/shaker/data/Vector3/ShakerTypeRandom3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeRandom3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://jyrxhux22cdm
|
||||
43
addons/shaker/data/Vector3/ShakerTypeSawtoothWave3D.gd
Normal file
43
addons/shaker/data/Vector3/ShakerTypeSawtoothWave3D.gd
Normal file
@@ -0,0 +1,43 @@
|
||||
@tool
|
||||
class_name ShakerTypeSawtoothWave3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
## The frequency of the sawtooth wave for each axis.
|
||||
@export var frequency: Vector3 = Vector3.ONE * 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The asymmetry of the sawtooth wave for each axis (0 to 1).
|
||||
@export var asymmetry: Vector3 = Vector3.ONE * 0.5:
|
||||
set = set_asymmetry
|
||||
|
||||
## Sets the frequency of the sawtooth wave.
|
||||
func set_frequency(value: Vector3) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the sawtooth wave.
|
||||
func get_frequency() -> Vector3:
|
||||
return frequency
|
||||
|
||||
## Sets the asymmetry of the sawtooth wave.
|
||||
func set_asymmetry(value: Vector3) -> void:
|
||||
asymmetry = value.clamp(Vector3.ZERO, Vector3.ONE)
|
||||
_on_property_changed("asymmetry")
|
||||
|
||||
## Gets the asymmetry of the sawtooth wave.
|
||||
func get_asymmetry() -> Vector3:
|
||||
return asymmetry
|
||||
|
||||
## Calculates the value of the sawtooth wave at time t.
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
var _real_time: float = fmod(t, 1.0) if t > 1.0 else t
|
||||
var wave: Vector3 = (_real_time * frequency).posmod(1.0)
|
||||
|
||||
wave.x = wave.x / asymmetry.x if wave.x < asymmetry.x else (1.0 - wave.x) / (1.0 - asymmetry.x)
|
||||
wave.y = wave.y / asymmetry.y if wave.y < asymmetry.y else (1.0 - wave.y) / (1.0 - asymmetry.y)
|
||||
wave.z = wave.z / asymmetry.z if wave.z < asymmetry.z else (1.0 - wave.z) / (1.0 - asymmetry.z)
|
||||
result = wave
|
||||
result = _calc_value(t, result)
|
||||
result = (result - amplitude * 0.5) * 2.0
|
||||
return result
|
||||
@@ -0,0 +1 @@
|
||||
uid://dpoggf3psdkci
|
||||
34
addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd
Normal file
34
addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd
Normal file
@@ -0,0 +1,34 @@
|
||||
@tool
|
||||
class_name ShakerTypeSineWave3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
@export_group("Sinewave Properties")
|
||||
@export var frequency: Vector3 = Vector3.ONE:
|
||||
set = set_frequency,
|
||||
get = get_frequency
|
||||
|
||||
@export var phase: Vector3 = Vector3.ONE:
|
||||
set = set_phase,
|
||||
get = get_phase
|
||||
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
var _real_time: float = fmod(t, 1.0) if t > 1.0 else t
|
||||
result.x = sin(t * frequency.x * TAU + phase.x)
|
||||
result.y = sin(t * frequency.y * TAU + phase.y + PI/2)
|
||||
result.z = sin(t * frequency.z * TAU + phase.z + PI/4)
|
||||
return _calc_value(_real_time, result)
|
||||
|
||||
func set_frequency(value: Vector3) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
func get_frequency() -> Vector3:
|
||||
return frequency
|
||||
|
||||
func set_phase(value: Vector3) -> void:
|
||||
phase = value
|
||||
_on_property_changed("phase")
|
||||
|
||||
func get_phase() -> Vector3:
|
||||
return phase
|
||||
1
addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://sih7vd0uinav
|
||||
37
addons/shaker/data/Vector3/ShakerTypeSquareWave3D.gd
Normal file
37
addons/shaker/data/Vector3/ShakerTypeSquareWave3D.gd
Normal file
@@ -0,0 +1,37 @@
|
||||
@tool
|
||||
class_name ShakerTypeSquareWave3D
|
||||
extends ShakerTypeBase3D
|
||||
|
||||
## The frequency of the square wave for each axis.
|
||||
@export var frequency: Vector3 = Vector3.ONE * 5.0:
|
||||
set = set_frequency
|
||||
|
||||
## The duty cycle of the square wave for each axis (0 to 1).
|
||||
@export var duty_cycle: Vector3 = Vector3.ONE * 0.5:
|
||||
set = set_duty_cycle
|
||||
|
||||
## Sets the frequency of the square wave.
|
||||
func set_frequency(value: Vector3) -> void:
|
||||
frequency = value
|
||||
_on_property_changed("frequency")
|
||||
|
||||
## Gets the frequency of the square wave.
|
||||
func get_frequency() -> Vector3:
|
||||
return frequency
|
||||
|
||||
## Sets the duty cycle of the square wave.
|
||||
func set_duty_cycle(value: Vector3) -> void:
|
||||
duty_cycle = value.clamp(Vector3.ZERO, Vector3.ONE)
|
||||
_on_property_changed("duty_cycle")
|
||||
|
||||
## Gets the duty cycle of the square wave.
|
||||
func get_duty_cycle() -> Vector3:
|
||||
return duty_cycle
|
||||
|
||||
## Calculates the value of the square wave at time t.
|
||||
func get_value(t: float) -> Vector3:
|
||||
var result: Vector3 = Vector3.ZERO
|
||||
result.x = 1.0 if fmod(t * frequency.x, 1.0) < duty_cycle.x else -1.0
|
||||
result.y = 1.0 if fmod(t * frequency.y, 1.0) < duty_cycle.y else -1.0
|
||||
result.z = 1.0 if fmod(t * frequency.z, 1.0) < duty_cycle.z else -1.0
|
||||
return _calc_value(t, result)
|
||||
1
addons/shaker/data/Vector3/ShakerTypeSquareWave3D.gd.uid
Normal file
1
addons/shaker/data/Vector3/ShakerTypeSquareWave3D.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://drpiei33e2en
|
||||
90
addons/shaker/data/resources/box_opening3D.tres
Normal file
90
addons/shaker/data/resources/box_opening3D.tres
Normal file
@@ -0,0 +1,90 @@
|
||||
[gd_resource type="Resource" script_class="ShakerPreset3D" load_steps=13 format=3 uid="uid://cqfe3012jylqs"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeCurve3D.gd" id="2_020y4"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeRandom3D.gd" id="3_6s2h2"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerPreset3D.gd" id="4_ko4ur"]
|
||||
|
||||
[sub_resource type="Curve" id="Curve_csfne"]
|
||||
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.429245, 0), 0.0, 0.0, 0, 0, Vector2(0.457547, 1), 0.0, 0.0, 0, 0, Vector2(0.787736, 1), 0.0, 0.0, 0, 0, Vector2(0.985849, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||
point_count = 6
|
||||
|
||||
[sub_resource type="Resource" id="Resource_n7d86"]
|
||||
script = ExtResource("2_020y4")
|
||||
curve_y = SubResource("Curve_csfne")
|
||||
loop = true
|
||||
amplitude = Vector3(1, 1, 1)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_c2tfw"]
|
||||
script = ExtResource("3_6s2h2")
|
||||
seed = 0
|
||||
amplitude = Vector3(0.25, 0.25, 0.25)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 5.42787
|
||||
start_percent = 0.0
|
||||
end_percent = 0.59
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Curve" id="Curve_ioyrx"]
|
||||
_data = [Vector2(0.501572, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0]
|
||||
point_count = 2
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1e44d"]
|
||||
script = ExtResource("2_020y4")
|
||||
curve_y = SubResource("Curve_ioyrx")
|
||||
loop = true
|
||||
amplitude = Vector3(2, 2, 2)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Curve" id="Curve_01cbm"]
|
||||
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.0613208, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.143082, 0), 0.0, 0.0, 0, 0, Vector2(0.215409, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.275157, 0), 0.0, 0.0, 0, 0, Vector2(0.429245, 0), 0.0, 0.0, 0, 0, Vector2(0.463836, 1), 0.0, 0.0, 0, 0, Vector2(0.905204, 1), 0.35252, 0.35252, 0, 0, Vector2(0.957249, 0.482796), 0.0, 0.0, 0, 0, Vector2(0.99999, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||
point_count = 11
|
||||
|
||||
[sub_resource type="Curve" id="Curve_uayq1"]
|
||||
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.0613208, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.143082, 0), 0.0, 0.0, 0, 0, Vector2(0.215409, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.275157, 0), 0.0, 0.0, 0, 0, Vector2(0.429245, 0), 0.0, 0.0, 0, 0, Vector2(0.463836, 1), 0.0, 0.0, 0, 0, Vector2(0.905204, 1), 0.35252, 0.35252, 0, 0, Vector2(0.957249, 0.482796), 0.0, 0.0, 0, 0, Vector2(0.99999, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||
point_count = 11
|
||||
|
||||
[sub_resource type="Curve" id="Curve_b6gtf"]
|
||||
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.0613208, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.143082, 0), 0.0, 0.0, 0, 0, Vector2(0.215409, 0.20904), 0.0, 0.0, 0, 0, Vector2(0.275157, 0), 0.0, 0.0, 0, 0, Vector2(0.429245, 0), 0.0, 0.0, 0, 0, Vector2(0.463836, 1), 0.0, 0.0, 0, 0, Vector2(0.905204, 1), 0.35252, 0.35252, 0, 0, Vector2(0.957249, 0.482796), 0.0, 0.0, 0, 0, Vector2(0.99999, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
|
||||
point_count = 11
|
||||
|
||||
[sub_resource type="Resource" id="Resource_011mv"]
|
||||
script = ExtResource("2_020y4")
|
||||
curve_x = SubResource("Curve_01cbm")
|
||||
curve_y = SubResource("Curve_uayq1")
|
||||
curve_z = SubResource("Curve_b6gtf")
|
||||
loop = true
|
||||
amplitude = Vector3(0.5, 0.5, 0.5)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[resource]
|
||||
script = ExtResource("4_ko4ur")
|
||||
PositionShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_n7d86")])
|
||||
RotationShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_c2tfw"), SubResource("Resource_1e44d")])
|
||||
ScaleShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_011mv")])
|
||||
bake_internal = 64
|
||||
__follow_timeline = true
|
||||
55
addons/shaker/data/resources/shaker_earthquake3D.tres
Normal file
55
addons/shaker/data/resources/shaker_earthquake3D.tres
Normal file
@@ -0,0 +1,55 @@
|
||||
[gd_resource type="Resource" script_class="ShakerPreset3D" load_steps=8 format=3 uid="uid://cvklw5ika1tao"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/BaseShakerType3D.gd" id="1_d2tua"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd" id="2_pfinc"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeRandom3D.gd" id="3_ghpi8"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerPreset3D.gd" id="4_trx4m"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pq027"]
|
||||
script = ExtResource("2_pfinc")
|
||||
frequency = Vector3(10, 10, 1)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.25, 0.2, 0)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 1e-05
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_won02"]
|
||||
script = ExtResource("3_ghpi8")
|
||||
seed = 0
|
||||
amplitude = Vector3(0.25, 0.25, 0)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.633041
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_twjh4"]
|
||||
script = ExtResource("2_pfinc")
|
||||
frequency = Vector3(1, 1, 1)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.025, 0, 0.025)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[resource]
|
||||
script = ExtResource("4_trx4m")
|
||||
PositionShake = Array[ExtResource("1_d2tua")]([SubResource("Resource_pq027"), SubResource("Resource_won02")])
|
||||
RotationShake = Array[ExtResource("1_d2tua")]([SubResource("Resource_twjh4")])
|
||||
ScaleShake = Array[ExtResource("1_d2tua")]([])
|
||||
bake_internal = 64
|
||||
__follow_timeline = false
|
||||
55
addons/shaker/data/resources/shaker_head_blob3D.tres
Normal file
55
addons/shaker/data/resources/shaker_head_blob3D.tres
Normal file
@@ -0,0 +1,55 @@
|
||||
[gd_resource type="Resource" script_class="ShakerPreset3D" load_steps=7 format=3 uid="uid://bgwupdyecxqic"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://cqhisip66ngbl" path="res://ShakerDemoScenes/HeadBobWalking.tres" id="2_abfix"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd" id="2_lj1xu"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerPreset3D.gd" id="3_1llgx"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_hui0g"]
|
||||
script = ExtResource("2_lj1xu")
|
||||
frequency = Vector3(0.75, 1, 1)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.04, 0.08, 0)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_usaqk"]
|
||||
script = ExtResource("2_lj1xu")
|
||||
frequency = Vector3(1, 1, 1)
|
||||
phase = Vector3(1.5, 1, 1)
|
||||
amplitude = Vector3(0.02, 0, 0)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_sxvgt"]
|
||||
script = ExtResource("2_lj1xu")
|
||||
frequency = Vector3(0.5, 1, 0.25)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.02, 0, 0.008)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 0.0
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_1llgx")
|
||||
PositionShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_hui0g"), SubResource("Resource_usaqk")])
|
||||
RotationShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_sxvgt"), ExtResource("2_abfix")])
|
||||
ScaleShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([])
|
||||
bake_internal = 64
|
||||
__follow_timeline = false
|
||||
40
addons/shaker/data/resources/strong_shake3D.tres
Normal file
40
addons/shaker/data/resources/strong_shake3D.tres
Normal file
@@ -0,0 +1,40 @@
|
||||
[gd_resource type="Resource" script_class="ShakerPreset3D" load_steps=5 format=3 uid="uid://dakufr1eoowxf"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerTypeSineWave3D.gd" id="2_dydew"]
|
||||
[ext_resource type="Script" path="res://addons/shaker/data/Vector3/ShakerPreset3D.gd" id="3_1oh1n"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rqq58"]
|
||||
script = ExtResource("2_dydew")
|
||||
frequency = Vector3(7.065, 1, 1)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.5, 0.5, 0)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 2.36259
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4yuof"]
|
||||
script = ExtResource("2_dydew")
|
||||
frequency = Vector3(2.94, 1.125, 1)
|
||||
phase = Vector3(1, 1, 1)
|
||||
amplitude = Vector3(0.053, 0.05, 0.1)
|
||||
offset = Vector3(0, 0, 0)
|
||||
BlendingMode = 0
|
||||
fade_in = 0.0
|
||||
fade_out = 2.36259
|
||||
start_percent = 0.0
|
||||
end_percent = 1.0
|
||||
_temp_graph = false
|
||||
bake_internal = 64
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_1oh1n")
|
||||
PositionShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_rqq58")])
|
||||
RotationShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([SubResource("Resource_4yuof")])
|
||||
ScaleShake = Array[Resource("res://addons/shaker/data/Vector3/BaseShakerType3D.gd")]([])
|
||||
bake_internal = 64
|
||||
__follow_timeline = false
|
||||
Reference in New Issue
Block a user