using Godot; using System.Collections.Generic; using Rokojori.Extensions; namespace Rokojori; [Tool] [GlobalClass ] public partial class EmberVFXData:ParticleVFXData { public static readonly CachedResource EmberExplodeMaterial = new CachedResource( "res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Shared/ProcessMaterials/Ember-Explode.material" ); public static readonly CachedResource EmberCircleMaterial = new CachedResource( "res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Embers/Ember Circle.material" ); public static readonly CachedResource QuadMesh = new CachedResource( "res://addons/rokojori_action_library/Runtime/VFX/ParticleVFX/Shared/Passes/Quad Draw Pass.tres" ); public static readonly CachedResource GradientDefault = new CachedResource( " 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(); particles.DrawPass1 = QuadMesh.Get(); playParticles = vfx.GetOrCreateChild(); 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 }