rj-action-library/Runtime/Physics/Wind/WindManager.cs

106 lines
2.7 KiB
C#
Raw Normal View History

2025-10-24 11:38:51 +00:00
using Godot;
namespace Rokojori
{
[Tool]
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/WindManager.svg") ]
public partial class WindManager:Node
{
[Export]
public WindManagerData data;
2025-12-11 14:47:57 +00:00
[Export]
public Action onWindChange;
[Export]
public Action onWindDirectionChange;
[Export]
public Action onWindSpeedChange;
float _currentKMH = 0;
Vector2 _currentDirection = Vector2.Zero;
2025-10-24 11:38:51 +00:00
public override void _Process( double delta )
{
var rm = Unique<RenderingManager>.Get();
if ( data == null || rm == null )
{
return;
}
2025-12-10 14:17:07 +00:00
UpdatePosition( rm, (float) delta, data.globalWindPositionClosePropertyName, data.closeMultiplier );
UpdatePosition( rm, (float) delta, data.globalWindPositionFarPropertyName, data.farMultiplier );
2025-10-24 11:38:51 +00:00
UpdateDirection( rm, (float) delta );
UpdateSpeed( rm, (float) delta );
2025-12-11 14:47:57 +00:00
var changed = false;
if ( _currentKMH != data.windSpeed.GetKMH() )
{
changed = true;
onWindSpeedChange?.Trigger();
_currentKMH = data.windSpeed.GetKMH();
}
if ( _currentDirection != data.windDirection )
{
changed = true;
onWindDirectionChange?.Trigger();
_currentDirection = data.windDirection;
}
if ( changed )
{
onWindChange?.Trigger();
}
2025-10-24 11:38:51 +00:00
}
2025-12-10 14:17:07 +00:00
void UpdatePosition( RenderingManager rm, float delta, ShaderPropertyName positionName, float multiplier )
2025-10-24 11:38:51 +00:00
{
2025-12-10 14:17:07 +00:00
var windPositionProperty = rm.data.GetGlobalPropertyByName( positionName );
2025-10-24 11:38:51 +00:00
if ( windPositionProperty == null )
{
return;
}
var positionProperty = (Vector2Property) windPositionProperty;
var position = positionProperty.value;
2025-12-10 14:17:07 +00:00
position += multiplier * -data.windSpeed.GetNormalizedWindSpeedOffset( delta, data.minimumScrollSpeedKMH, data.maximumScrollSpeedKMH ) * data.windDirection.Normalized();
2025-10-24 11:38:51 +00:00
positionProperty.value = position;
}
void UpdateDirection( RenderingManager rm, float delta )
{
var windDirectionProperty = rm.data.GetGlobalPropertyByName( data.globalWindDirectionPropertyName );
if ( windDirectionProperty == null )
{
return;
}
var directionProperty = (Vector2Property) windDirectionProperty;
directionProperty.value = data.windDirection.Normalized();
}
void UpdateSpeed( RenderingManager rm, float delta )
{
var windSpeedProperty = rm.data.GetGlobalPropertyByName( data.globalWindSpeeedPropertyName );
if ( windSpeedProperty == null )
{
return;
}
var speedProperty = (FloatProperty) windSpeedProperty;
speedProperty.value = data.windSpeed.GetKMH();
}
}
}