cirnogodot/Scripts/Components/Actors/3D/AnimatedShaderSprite3D.cs
2025-06-26 14:03:36 +02:00

84 lines
No EOL
2.1 KiB
C#

using Godot;
namespace Cirno.Scripts.Components.Actors._3D;
[Tool]
public partial class AnimatedShaderSprite3D : AnimatedSprite3D
{
private bool _isConnected = false;
private ShaderMaterial _shaderMaterial;
public override void _Ready()
{
base._Ready();
ConnectSignals();
_shaderMaterial = (ShaderMaterial)MaterialOverride;
}
private void ConnectSignals()
{
if (_isConnected)
{
return;
}
_isConnected = true;
FrameChanged += HandleFrameChanged;
}
protected void HandleFrameChanged()
{
_shaderMaterial.SetShaderParameter("tex", SpriteFrames.GetFrameTexture(Animation, Frame));
}
protected override void Dispose(bool disposing)
{
DisconnectSignals();
base.Dispose(disposing);
}
private void DisconnectSignals()
{
if (!_isConnected)
{
return;
}
FrameChanged -= HandleFrameChanged;
}
// public override void _Process(double delta)
// {
// ((ShaderMaterial)MaterialOverride).SetShaderParameter("albedo_texture", SpriteFrames.GetFrameTexture(Animation, Frame));
//
// ((ShaderMaterial)MaterialOverride).SetShaderParameter("billboard_mode", (int)this.GetBillboardMode());
// }
// [Export(PropertyHint.File)] public string ShaderPath { get; private set; }
//
// public override void _Ready()
// {
// if (MaterialOverride is null)
// {
// ApplyMaterialOverride();
// }
//
// ApplyTexture();
// //texture_changed.connect(_apply_texture)
// }
//
// private void ApplyMaterialOverride()
// {
// var shaderMaterial = new ShaderMaterial();
// shaderMaterial.Shader = GD.Load<Shader>(ShaderPath);
// MaterialOverride = shaderMaterial;
// }
//
// private void ApplyTexture()
// {
// var shaderMaterial = MaterialOverride as ShaderMaterial;
//
// shaderMaterial.SetShaderParameter("sprite_texture", this.SpriteFrames.GetFrameTexture(Animation, Frame));
// }
}