rokojori_action_library/Runtime/VFX/ParticleVFX/Embers/EmberVFXData.cs

110 lines
3.4 KiB
C#
Raw Normal View History

2026-10-05 19:25:04 +00:00
using Godot;
using System.Collections.Generic;
using Rokojori.Extensions;
namespace Rokojori;
[Tool]
[GlobalClass ]
public partial class EmberVFXData:ParticleVFXData
{
public static readonly CachedResource<ParticleProcessMaterial> EmberExplodeMaterial = new CachedResource<ParticleProcessMaterial>(
"res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Shared/ProcessMaterials/Ember-Explode.material"
);
public static readonly CachedResource<ShaderMaterial> EmberCircleMaterial = new CachedResource<ShaderMaterial>(
"res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Embers/Ember Circle.material"
);
public static readonly CachedResource<QuadMesh> QuadMesh = new CachedResource<QuadMesh>(
"res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Shared/Passes/Quad Draw Pass.tres"
);
public static readonly CachedResource<Gradient> GradientDefault = new CachedResource<Gradient>(
" res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Shared/Gradient-Default.tres"
);
public EmberVFXPreset preset;
public GpuParticles3D particles;
public PlayParticles playParticles;
public ParticleProcessMaterial processMaterial;
public Material material;
public void Assign( ParticleVFX vfx )
{
vfx._SetParticlesVFXData( this );
particles = vfx.GetOrCreateChild<GpuParticles3D>();
particles.DrawPass1 = QuadMesh.Get();
playParticles = vfx.GetOrCreateChild<PlayParticles>();
playParticles.particles3D = particles;
playParticles.usePooling = preset.usePooling;
processMaterial = EmberExplodeMaterial.GetDuplicate();
material = EmberCircleMaterial.GetDuplicate();
RJLog.Log( material, EmberCircleMaterial.GetDuplicate() );
particles.ProcessMaterial = processMaterial;
particles.MaterialOverride = material;
UpdateSettings( vfx );
}
public void Play( ParticleVFX vfx )
{
playParticles.Trigger();
}
public static FloatPropertyName meshScale = FloatPropertyName.Create( "meshScale" );
public void UpdateSettings( ParticleVFX vfx )
{
if ( preset == null || processMaterial == null )
{
return;
}
UpdateCoreSettings( preset, particles );
processMaterial.Color = preset.color * preset.colorIntensity;
var rampTexture = processMaterial.ColorRamp as GradientTexture1D;
if ( rampTexture == null )
{
rampTexture = new GradientTexture1D();
processMaterial.ColorRamp = rampTexture;
}
rampTexture.Gradient = preset.gradient ?? GradientDefault.Get();
preset.movement?.UpdateSettings( processMaterial, vfx );
preset.volume?.UpdateSettings( processMaterial, vfx );
meshScale.Set( material, preset.meshScale );
// processMaterial.ScaleMin = preset.meshScale;
// processMaterial.ScaleMax = preset.meshScale;
// processMaterial.InitialVelocityMin = preset.minVelocity + preset.velocityOffset;
// processMaterial.InitialVelocityMax = preset.maxVelocity + preset.velocityOffset;
// processMaterial.Gravity = preset.gravityDirection * preset.gravityMultiplier;
// processMaterial.DampingMin = preset.minDamping + preset.dampingOffset;
// processMaterial.DampingMax = preset.maxDamping + preset.dampingOffset;
}
#if TOOLS
public void DrawGizmo( ParticleVFX vfx, EditorNode3DGizmoPlugin gizmoPlugin, EditorNode3DGizmo gizmo )
{
preset.volume?.DrawGizmo( vfx, gizmoPlugin, gizmo );
}
#endif
}