moraepado/LieDownBeforeSleep/sounder.gd

79 lines
2.4 KiB
GDScript

extends RigidBody
export (String, MULTILINE) var patch = ""
export (float, 0, 100) var audible_range_max = 10.0
export (float, 1, 12) var preset = 1
var _my_patch = "user://LieDownBeforeSleep/sounder-node.pd"
var _my_id = 0
func set_param(param):
Global._gdpd.start_message(param.size()+1)
Global._gdpd.add_symbol("param")
for i in range(param.size()):
Global._gdpd.add_float(param[i])
Global._gdpd.finish_list("fromGodot" + String(_my_id))
func set_preset(prs):
preset = prs
Global._gdpd.start_message(2)
Global._gdpd.add_symbol("preset")
Global._gdpd.add_float(prs)
Global._gdpd.finish_list("fromGodot" + String(_my_id))
func set_color(color):
$MeshInstance.material_override = SpatialMaterial.new()
$MeshInstance.material_override.albedo_color = color
func relocate(center, radius_range):
# relocate randomly into a circular zone
var rr = radius_range[1] - radius_range[0]
var displacement = polar2cartesian(randf()*rr+radius_range[0], randf()*2*PI)
var loc = center + displacement
look_at_from_position(Vector3(loc.x, randf()*2 + 1, loc.y), Vector3.FORWARD, Vector3.UP)
func _ready():
# save patch
# prepare directory
var patch_name = _my_patch.split("/")[-1]
var patch_dir = _my_patch.trim_suffix(patch_name)
var dir = Directory.new()
dir.make_dir_recursive(patch_dir)
# save to file
var file = File.new()
file.open(_my_patch, File.WRITE)
file.store_string(patch)
file.close()
# load patch
_my_id = Global.load_patch(ProjectSettings.globalize_path(_my_patch))
# listen 'player_transform_updated' event
Events.connect("player_transform_updated", self, "_on_Events_player_transform_updated")
# send 'preset'
set_preset(preset)
func _on_Events_player_transform_updated(playerpos, playerheading):
var mypos = get_global_translation()
var mypos2d = Vector2(mypos.x, mypos.z)
var playerpos2d = Vector2(playerpos.x, playerpos.z)
# calculate distance
var distance = mypos.distance_to(playerpos)
# calculate angle
var angle = fmod(fmod(playerpos2d.angle_to_point(mypos2d) + playerheading - PI/2, PI*2) + PI*2, PI*2)
if angle > PI:
angle = angle - PI*2
# calculate gain
var gain = max(1 - distance/audible_range_max, 0)
# send to the patch
Global._gdpd.start_message(3)
Global._gdpd.add_symbol("panvol")
Global._gdpd.add_float(gain)
Global._gdpd.add_float(angle)
Global._gdpd.finish_list("fromGodot" + String(_my_id))
func _exit_tree():
Global.close_patch(_my_id)
pass