rokojori_action_library/Runtime/VFX/FlareVFX/FlareVFX.cs

110 lines
2.1 KiB
C#
Raw Normal View History

2026-01-27 06:57:54 +00:00
using Godot;
using System.Collections.Generic;
namespace Rokojori
2026-02-06 08:59:59 +00:00
{
2026-01-27 06:57:54 +00:00
[Tool]
2026-02-06 08:59:59 +00:00
[GlobalClass, Icon("res://addons/rokojori_action_library/Icons/FlareVFX.svg") ]
2026-01-27 06:57:54 +00:00
public partial class FlareVFX:Node3D
{
[Export]
2026-02-06 08:59:59 +00:00
public FlarePreset preset;
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
public Node3D GetContainer()
{
return this;
}
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
#if TOOLS
2026-01-27 06:57:54 +00:00
[Export]
2026-02-06 08:59:59 +00:00
public bool editMode = false;
public override void _Process( double delta )
2026-01-27 06:57:54 +00:00
{
2026-02-06 08:59:59 +00:00
if ( editMode )
{
UpdateFlare();
}
2026-01-27 06:57:54 +00:00
}
2026-02-06 08:59:59 +00:00
#endif
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
List<FlareLayer.Data> _layers = [];
2026-01-27 06:57:54 +00:00
void UpdateFlare()
{
2026-02-06 08:59:59 +00:00
if ( preset == null )
2026-01-27 06:57:54 +00:00
{
2026-02-06 08:59:59 +00:00
return;
2026-01-27 06:57:54 +00:00
}
2026-02-06 08:59:59 +00:00
var numLayers = preset.layers.NonNullCount();
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
if ( _layers == null || _layers.Count != numLayers )
{
_layers = [];
var meshInstances = this.GetDirectChildren<MeshInstance3D>();
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
if ( meshInstances.Count != numLayers )
2026-01-27 06:57:54 +00:00
{
2026-02-06 08:59:59 +00:00
this.DestroyChildren();
meshInstances = [];
var mIndex = 0;
for ( int i = 0; i < preset.layers.Length; i++ )
2026-01-27 06:57:54 +00:00
{
2026-02-06 08:59:59 +00:00
if ( preset.layers[ i ] == null )
{
continue;
}
var mi = this.CreateChild<MeshInstance3D>( "Layer " + i + " " + preset.layers[ i ].layerName );
meshInstances.Add( mi );
mIndex++;
2026-01-27 06:57:54 +00:00
}
2026-02-06 08:59:59 +00:00
}
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
for ( int i = 0; i < preset.layers.Length; i++ )
{
if ( preset.layers[ i ] == null )
{
_layers.Add( null );
continue;
}
var layer = preset.layers[ i ].Create( this );
_layers.Add( layer );
layer.meshInstance = meshInstances[ i ];
2026-01-27 06:57:54 +00:00
}
2026-02-06 08:59:59 +00:00
}
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
var hasSolo = _layers.Find( l => l != null && l.layer.solo ) != null ;
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
_layers.ForEach(
l =>
{
if ( l == null )
{
return;
}
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
var isHidden = l.layer.hide || hasSolo && ! l.layer.solo;
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
l.meshInstance.SetVisibility( ! isHidden );
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
if ( isHidden )
{
return;
}
2026-01-27 06:57:54 +00:00
2026-02-06 08:59:59 +00:00
l.Update();
}
);
2026-01-27 06:57:54 +00:00
}
}
}