using ImpactCFX;
using ImpactCFX.Pooling;

//Uses the ImpactPooledEffectProcessor as a base for handling most of the implementation.
public class ExampleEffectProcessor : ImpactPooledEffectProcessor<ExampleEffectAuthoring, ExampleEffectData, ExampleEffectResult, ExampleEffectPool, ExampleEffectPooledObject>
{
    //Return an instance using the convenience method from ExampleEffectAuthoring.
    protected override ExampleEffectData getEffectForPooledEffect(ExampleEffectAuthoring effectAuthoring)
    {
        return effectAuthoring.GetEffectData();
    }

    //Return a new ImpactEffectProcessorJob<ExampleEffectData, ExampleEffectResult> instance.
    //This is only needed so that Burst knows to compile the generic job with these type arguments.
    protected override ImpactEffectProcessorJob<ExampleEffectData, ExampleEffectResult> getEffectProcessorJobBase()
    {
        return new ImpactEffectProcessorJob<ExampleEffectData, ExampleEffectResult>();
    }

    //Similar to above, this is only needed so that Burst knows to compile the generic job with these type arguments.
    protected override ObjectPoolJob<ExampleEffectResult> getObjectPoolJobBase()
    {
        return new ObjectPoolJob<ExampleEffectResult>();
    }

    //Process the effect result using the given pooled object instance
    public override void PlayPooledEffect(ExampleEffectResult effectResult, ExampleEffectPooledObject pooledObject, CollisionResultData collisionResultData)
    {
        //IsUpdate tells us if the effect is a new effect or an update of an existing effect.
        if (effectResult.IsUpdate)
            pooledObject.UpdateActiveEffect(effectResult.ValueResult, collisionResultData.Point);
        else
            pooledObject.PlayNewEffect(effectResult.ValueResult, collisionResultData.Point);
    }
}