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.

1 Like

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: https://playground.babylonjs.com/#6G59MM#7

2 Likes

Thanks for the repro, here’s the fix:

3 Likes

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

1 Like