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(ShaderPath); // MaterialOverride = shaderMaterial; // } // // private void ApplyTexture() // { // var shaderMaterial = MaterialOverride as ShaderMaterial; // // shaderMaterial.SetShaderParameter("sprite_texture", this.SpriteFrames.GetFrameTexture(Animation, Frame)); // } }