# Export-template reproducer: no maps, models, assets or network required. extends Node var held: Array[ParticleProcessMaterial] = [] func _ready() -> void: call_deferred("run") func run() -> void: var mode := OS.get_environment("MT_PARTICLE_EXIT_CASE") for i in 8: make_particle(mode, i) for i in 5: await get_tree().process_frame held.clear() for i in 5: await get_tree().process_frame print("PARTICLE_EXIT PASS case=", mode) get_tree().quit() func make_particle(mode: String, index: int) -> void: if mode == "empty": return var material := ParticleProcessMaterial.new() if mode in ["gravity", "scale", "shape", "held", "restored"]: if mode == "gravity": material.gravity = Vector3(0, -1, 0) if mode == "scale": material.scale_min = 0.5 if mode in ["shape", "held", "restored"]: material.emission_shape = index % 3 material.get_rid() if mode == "restored": material.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_POINT material.get_rid() if mode == "held": held.append(material) return if mode == "primed": material.get_rid() if mode != "default": material.gravity = Vector3(0, -1, 0) material.emission_shape = index % 3 material.scale_min = 0.5 material.get_rid() if mode == "emitter": var emitter := GPUParticles3D.new() emitter.emitting = false emitter.process_material = material add_child(emitter) emitter.free()