2020-01-29 17:04:04 +01:00
|
|
|
# Blends multiple steering behaviors into one, and returns a weighted
|
|
|
|
# acceleration from their calculations.
|
|
|
|
#
|
|
|
|
# Stores the behaviors internally as dictionaries of the form
|
|
|
|
# {
|
|
|
|
# behavior : GSTSteeringBehavior,
|
|
|
|
# weight : float
|
|
|
|
# }
|
2020-01-29 05:56:10 +01:00
|
|
|
class_name GSTBlend
|
|
|
|
extends GSTSteeringBehavior
|
2019-12-21 03:32:21 +01:00
|
|
|
|
|
|
|
|
2020-01-16 09:44:44 +01:00
|
|
|
var _behaviors := []
|
|
|
|
var _accel := GSTTargetAcceleration.new()
|
2019-12-21 03:32:21 +01:00
|
|
|
|
|
|
|
|
|
|
|
func _init(agent: GSTSteeringAgent).(agent) -> void:
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2020-01-29 17:04:04 +01:00
|
|
|
# Appends a behavior to the internal array along with its `weight`.
|
2019-12-21 03:32:21 +01:00
|
|
|
func add(behavior: GSTSteeringBehavior, weight: float) -> void:
|
|
|
|
behavior.agent = agent
|
2019-12-23 17:38:27 +01:00
|
|
|
_behaviors.append({behavior = behavior, weight = weight})
|
2019-12-21 03:32:21 +01:00
|
|
|
|
|
|
|
|
2020-01-29 17:04:04 +01:00
|
|
|
# Returns the behavior at the specified `index`, or an empty `Dictionary` if
|
|
|
|
# none was found.
|
2019-12-23 17:38:27 +01:00
|
|
|
func get_behavior_at(index: int) -> Dictionary:
|
2019-12-21 03:32:21 +01:00
|
|
|
if _behaviors.size() > index:
|
|
|
|
return _behaviors[index]
|
|
|
|
printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size()))
|
2019-12-23 17:38:27 +01:00
|
|
|
return {}
|
2019-12-21 03:32:21 +01:00
|
|
|
|
|
|
|
|
2020-02-06 20:46:21 +01:00
|
|
|
func _calculate_steering(blended_accel: GSTTargetAcceleration) -> void:
|
2019-12-21 03:32:21 +01:00
|
|
|
blended_accel.set_zero()
|
2020-01-29 17:04:04 +01:00
|
|
|
|
2019-12-21 03:32:21 +01:00
|
|
|
for i in range(_behaviors.size()):
|
2019-12-23 17:38:27 +01:00
|
|
|
var bw: Dictionary = _behaviors[i]
|
2019-12-21 03:32:21 +01:00
|
|
|
bw.behavior.calculate_steering(_accel)
|
2020-01-29 17:04:04 +01:00
|
|
|
|
2019-12-21 03:32:21 +01:00
|
|
|
blended_accel.add_scaled_accel(_accel, bw.weight)
|
2020-01-29 17:04:04 +01:00
|
|
|
|
2020-01-22 17:55:49 +01:00
|
|
|
blended_accel.linear = GSTUtils.clampedv3(blended_accel.linear, agent.linear_acceleration_max)
|
|
|
|
blended_accel.angular = clamp(
|
|
|
|
blended_accel.angular,
|
|
|
|
-agent.angular_acceleration_max,
|
|
|
|
agent.angular_acceleration_max
|
|
|
|
)
|