I think I found a bug in how godot reads Y values passed through shader parameters

Godot 4.3

So I’ve got an issue. Right now I have a y velocity passing into a shader’s speed parameter and for some reason it’s getting faster every time I call it. I checked the y velocity and it stays consistent, the variable value stays consistent, and the shader parameter stays consistent as well. Strangely enough the x value doesn’t do this. It doesn’t get any faster so I’m thinking maybe it’s the rate of change? At this point I’m throwing in the towel and asking for any help.

extends Node2D
@onready var main_sprite = %Sprites_Animations
@onready var player = get_node("../")
@onready var cape = %Cape
@onready var player_states = %PlayerStateMachine
var flap_speed

func _ready():
		cape.offset.x = 3.535
		cape.offset.y = 1.015

func _process(delta: float) -> void:
	if main_sprite.flip_h == false:
		cape.flip_h = true
		if player_states.active_state != player_states.states["AirState"]:
			cape.offset.x = -2.13
			cape.offset.y = 2

	if main_sprite.flip_h == true:
		cape.flip_h = false
		if player_states.active_state != player_states.states["AirState"]:
			cape.offset.x = 2.13
			cape.offset.y = 2



func _physics_process(delta):
	flap_speed = player.velocity.y + player.velocity.x


	#print(player.direction_access)
	#print(player.recorded_direct)
	#print(player.is_on_floor())
	#print(player_states.active_state)
	#print(player.velocity.y)
	#print(cape.rotation_degrees)
	print(flap_speed)
	#print(	cape.material.get_shader_parameter("xspeed"))
	#print(player.gravity)

	var elapsed = .5

	#print(elapsed)

	if player.direction_access == 0 and player_states.active_state == player_states.states["IdleState"]:
		sway_idle()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(0),  elapsed)
		elapsed += delta
	if player.direction_access == 1 and player_states.active_state == player_states.states["RunState"]:
		sway_run()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(17),  elapsed)
		elapsed += delta
	if player.direction_access == -1 and player_states.active_state == player_states.states["RunState"]:
		sway_run()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(-17),  elapsed)
		elapsed += delta

	if player_states.active_state == player_states.states["GrapplingState"]:
		sway_grapple()

		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(0),  elapsed)
		elapsed += delta

	if player.direction_access == 1 and player_states.active_state == player_states.states["AirStrafeState"] and player.velocity.y < 708:
		sway_air_strafe()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(53), elapsed)
		elapsed += delta


	if player.direction_access == -1 and player_states.active_state == player_states.states["AirStrafeState"] and player.velocity.y < 708:
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(-53), elapsed)
		elapsed += delta
		sway_air_strafe()


	if cape.flip_h == true and player_states.active_state == player_states.states["AirState"] and player.velocity.y < 708:
		sway_air_state_rise()
		#print(cape.material.get_shader_parameter("xspeed"))
		cape.offset.x = -3.6
		cape.offset.y = 3
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(17), elapsed)
		elapsed += delta

	if cape.flip_h == false and player_states.active_state == player_states.states["AirState"] and player.velocity.y < 708:
		sway_air_state_rise()
		#print(cape.material.get_shader_parameter("xspeed"))
		cape.offset.x = 3.6
		cape.offset.y = 3
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(-17), elapsed)
		elapsed += delta



	if player.velocity.y > 708 and cape.flip_h == false:
		sway_air_state_fall()
		cape.offset.x = 3.035
		cape.offset.y = 4.14
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(-127.1), elapsed)
		elapsed += delta


	if player.velocity.y > 708 and cape.flip_h == true:
		sway_air_state_fall()
		cape.offset.x = -3.04
		cape.offset.y = 5.17
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(116.4), elapsed)
		elapsed += delta


	if cape.flip_h == true and player_states.active_state == player_states.states["ShoulderCheckState"]:
		sway_shoulder_check()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(53), elapsed)
		elapsed += delta
		cape.offset.x = -2.7

	if cape.flip_h == false and player_states.active_state == player_states.states["ShoulderCheckState"]:
		sway_shoulder_check()
		cape.rotation = lerp_angle(deg_to_rad(cape.rotation_degrees), deg_to_rad(-53), elapsed)
		elapsed += delta
		cape.offset.x = 4.1
		cape.offset.y = 0

func sway_run():
		cape.material.set_shader_parameter("risenfall", 0)
		cape.material.set_shader_parameter("yspeed", 0)
		cape.material.set_shader_parameter("ywave", 0)
		cape.material.set_shader_parameter("sway", 1)
		cape.material.set_shader_parameter("xspeed", flap_speed/10)
		cape.material.set_shader_parameter("xwave", 5)

func sway_idle():
		cape.material.set_shader_parameter("risenfall", 0)
		cape.material.set_shader_parameter("yspeed", 0)
		cape.material.set_shader_parameter("ywave", 0)
		cape.material.set_shader_parameter("sway", 0.5)
		cape.material.set_shader_parameter("xspeed",2)
		cape.material.set_shader_parameter("xwave", 5)

func sway_grapple():
	cape.material.set_shader_parameter("risenfall", 0)
	cape.material.set_shader_parameter("yspeed", 0)
	cape.material.set_shader_parameter("ywave", 0)
	cape.material.set_shader_parameter("sway", 1)
	cape.material.set_shader_parameter("xspeed", flap_speed/200)
	cape.material.set_shader_parameter("xwave", 10)

func sway_air_strafe():
	cape.material.set_shader_parameter("risenfall", 0)
	cape.material.set_shader_parameter("yspeed", 0)
	cape.material.set_shader_parameter("ywave", 0)
	cape.material.set_shader_parameter("sway", 1)
	cape.material.set_shader_parameter("xspeed", flap_speed/200)
	cape.material.set_shader_parameter("xwave", 10)

func sway_air_state_fall():
	cape.material.set_shader_parameter("risenfall", 0)
	cape.material.set_shader_parameter("yspeed", 0)
	cape.material.set_shader_parameter("ywave", 0)
	cape.material.set_shader_parameter("sway", 3)
	cape.material.set_shader_parameter("xspeed", flap_speed/500)
	cape.material.set_shader_parameter("xwave", 10)

func sway_air_state_rise():
	cape.material.set_shader_parameter("risenfall", 0)
	cape.material.set_shader_parameter("yspeed", 0)
	cape.material.set_shader_parameter("ywave", 0)
	cape.material.set_shader_parameter("sway", 1.5)
	cape.material.set_shader_parameter("xspeed", flap_speed/500)
	cape.material.set_shader_parameter("xwave", 10)

func sway_shoulder_check():
	cape.material.set_shader_parameter("risenfall", 0)
	cape.material.set_shader_parameter("yspeed", 0)
	cape.material.set_shader_parameter("ywave", 0)
	cape.material.set_shader_parameter("sway", 1.3)
	cape.material.set_shader_parameter("xspeed", flap_speed)
	cape.material.set_shader_parameter("xwave", 20) 

Make sure to paste with formatting, could you point out which set_shader_parameter is causing you issues? And paste the shader code? Is your Player a RigidBody?

Player is a Character Body, the parameter that is giving me issues is xspeed. Sorry about how weird it looks this is my first post so things area gonna be a little messy, here’s the shader code that is on the Sprite2D:

uniform float risenfall = 0;
uniform float yspeed = 0;
uniform float ywave = 0;
uniform float sway = 0;
uniform float xspeed = 0;
uniform float xwave= 0;
void vertex(){
	VERTEX.y += risenfall * sin((ywave * UV.x) + yspeed * TIME);
	VERTEX.x += sway * sin((xwave * UV.y) + xspeed* TIME);
}

xspeed is set proportional to flap_speed which is set by the player’s velocity. So getting to the root of this, how is your player’s velocity set? Why do you not expect it to be increasing?

It’s increasing every time I jump. So I jump, it gets a little faster, I jump again it gets even faster until every time I jump no matter how long in between it’s ridiculously fast. Oh, it also gets faster if I just sit there and do nothing at all. What do you mean how is my player’s velocity set? It changes by -= 600 every time and then gravity pulls it down with +=30 and when it is on the ground it is set to 0