def populate_all(
    factory_class: type,
    cameras: list[bpy.types.Object],
    dist_cull=200,
    vis_cull=0,
    cache_system=None,
    **kwargs,
):
    """
    Find all collections that may have been produced by factory_class, and update them

    dist_cull: the max dist away from the camera to still populate assets
    vis_cull: the max dist outside of the view frustrum to still populate assets

    """

    results = []
    for col in bpy.data.collections:
        if not (match := re.fullmatch("placeholders:((.*)\((\d*)\))", col.name)):
            continue
        full_repr, classname, fac_seed = match.groups()

        if classname != factory_class.__name__:
            continue

        asset_target_col = butil.get_collection(f"unique_assets:{full_repr}")
        asset_target_col.hide_viewport = False

        if len(asset_target_col.objects) > 0:
            logger.info(
                f"Skipping populating {col.name=} since {asset_target_col.name=} is already populated"
            )
            continue

        fac_inst = factory_class(int(fac_seed), **kwargs)

        new_assets, pholders = populate_collection(
            fac_inst,
            placeholder_col=col,
            cameras=cameras,
            asset_target_col=asset_target_col,
            dist_cull=dist_cull,
            vis_cull=vis_cull,
            cache_system=cache_system,
        )
        results.append((fac_seed, pholders, new_assets))

    return results

    Find all collections that may have been produced by factory_class, and update them

    dist_cull: the max dist away from the camera to still populate assets
    vis_cull: the max dist outside of the view frustrum to still populate assets

    
infinigen/core/placement/placement.py