@Override
    public RenderingResult render(Plugin plugin, ActiveObjectSystem objectSystem, FireworkObject object) {

        // Determine whether the different effects should be spawned
        double objectVelocity = object.getVelocity().length();
        boolean spawnNoTrailObjects = !object.hasSpeedBasedFrequency() || RenderingUtils.checkSpeedBasedFrequency(object.getLifetime(), objectVelocity, 0.5F);
        boolean spawnTrailObjects = !object.hasSpeedBasedFrequency() || RenderingUtils.checkSpeedBasedFrequency(object.getLifetime(), objectVelocity, 0.75F);

        // Collect all effects that are spawned this round
        Collection<FireworkEffectDefinition> spawnEffects = new ArrayList<FireworkEffectDefinition>();
        for (FireworkEffectDefinition effect : object.getEffects()) {
            if (!effect.hasTrail() && spawnNoTrailObjects || effect.hasTrail() && spawnTrailObjects) {
                spawnEffects.add(effect);
            }
        }

        // Check whether at least one effect would be spawned this round
        if (spawnEffects.isEmpty()) {
            return RenderingResult.NOTHING;
        }

        // Actually spawn all effects for this round
        spawn(plugin, objectSystem, object, spawnEffects);

        return RenderingResult.NOTHING;
    }