Calling clone() in ParticleSystem breaks getCustomEffect calls

There seems to be an issue from 4.2.1 to 5.x with ParticleSystem.clone().

        var custom = { ...this._customWrappers };
        if (engine.createEffectForParticles) {
            if (this.customShader != null) {
                program = this.customShader;
                var defines: string = (program.shaderOptions.defines.length > 0) ? program.shaderOptions.defines.join("\n") : "";
                // this line. createEffectForParticles returns an Effect
                custom[0] = engine.createEffectForParticles(program.shaderPath.fragmentElement, program.shaderOptions.uniforms, program.shaderOptions.samplers, defines);
        result.customShader = program;
        result._customWrappers = custom;

It is setting custom[0] to an Effect object, where before the clone it would have been a DrawWrapper object. This means that any calls to getCustomEffect will return undefined:

public getCustomEffect(blendMode: number = 0): Nullable<Effect> {
    return this._customWrappers[blendMode]?.effect ?? this._customWrappers[0]!.effect;

because now this._customWrappers[blendMode] IS the effect.


cc @Evgeni_Popov to see if he has some time to look at it

@brittany can you repro in the PG directly maybe?

Here is a playground:


Thanks for the repro, here’s the fix:


Thank you so much for the quick fix! :tada:

1 Like