Blobby/src/Environment/ShaderGrass.gd
Jakob Feldmann fb325601aa New gras texture and polygons, camera changes
The levels have to conform to some criteria to fit into the frame.
They have to have the right size, the zoom and
limits do not work for every size >:
2022-11-07 22:56:14 +01:00

77 lines
2.8 KiB
GDScript

extends Node2D
onready var blobby = get_node("%Blobby")
var last_distance: Vector2 = Vector2(100,100)
# TODO Incorporate other enteties and highlight mass differences
var time = 0
var radius = 15
var v_radius = 15
var draft_radius = 20
var interact_power = 0.04
var rand = rand_range(1,1.2)
var displacement_coeff: Vector2 = Vector2(1.0,0)
var saved_displacement
var is_idle_swinging
var start_swing_time
var begin_idle
func _ready():
# TODO This could probably fuck something up later? For other randomness based events
randomize()
func _physics_process(delta: float) -> void:
var distance: float = abs(global_position.x - blobby.global_position.x + 6)
var v_distance: float = abs(global_position.y - blobby.global_position.y + 11)
var blobby_vel = (last_distance.x - distance)/delta
var blobby_v_vel = (last_distance.y - v_distance)/delta
var direction: Vector2 = Vector2(sign(global_position.x - blobby.global_position.x + 6),0)
# TODO This only gets more and more unreadable *facepalm*
var power = smoothstep(radius, 0, distance)
var v_power = smoothstep(v_radius, 0, v_distance)
var draft_power = smoothstep(draft_radius, radius, distance)
if (distance >= radius && distance <= draft_radius && blobby_vel < -0.1 && v_distance < 14):
displacement_coeff += direction * (draft_power/radius) * blobby_vel * interact_power
saved_displacement = displacement_coeff.x
is_idle_swinging = false
$Timer.stop()
# TODO v_distance could be a problem for upside down stuff
elif (distance < radius && distance > 1 && blobby_vel != 0 && v_distance < 14 && blobby_v_vel ==0):
displacement_coeff += direction * power/radius * 0.3 * blobby_vel * interact_power
displacement_coeff += direction * power * 2 * interact_power
saved_displacement = displacement_coeff.x
is_idle_swinging = false
$Timer.stop()
elif (v_distance < v_radius && distance < radius && blobby_v_vel != 0):
displacement_coeff += direction * v_power/v_radius * blobby_v_vel * interact_power
saved_displacement = displacement_coeff.x
is_idle_swinging = false
$Timer.stop()
else:
if(abs(displacement_coeff.x) > 0.1 && !is_idle_swinging || !$Timer.is_stopped()):
if($Timer.is_stopped()):
saved_displacement = displacement_coeff.x
$Timer.start()
var t = $Timer.get_wait_time() - $Timer.get_time_left()
displacement_coeff.x = saved_displacement * exp(-0.66 * t) * cos(t * 3.0 * rand)
start_swing_time = time
begin_idle = true
else:
$Timer.stop()
is_idle_swinging = true
var start = displacement_coeff.x if begin_idle else 0.0
displacement_coeff.x = start * exp(-0.2 * (time-start_swing_time)) + 0.3 * -sin(2.0*(time - start_swing_time))
begin_idle = false
for polygon in get_children():
if polygon is Polygon2D:
polygon.material.set_shader_param("displacement_coefficient_x", displacement_coeff.x)
last_distance = Vector2(distance, v_distance)
time += delta