MeshFilter swap does not work with static mesh

I'm trying to combine mesh filter LODs with Umbra culling.

The LOD is a script that swaps sharedMesh based on camera distance, i.e. very basic:

/////////////////////////////////////////////////

if( (transform.position - campos).sqrMagnitude <
        distance * distance )
    {
        // use high LOD
        if( meshFilter.sharedMesh != highLod )
            meshFilter.sharedMesh = highLod;
    }
    else
    {
        // use low LOD
        if( meshFilter.sharedMesh != lowLod )
            meshFilter.sharedMesh = lowLod;
    }

/////////////////////////////////////////////////

This works perfectly when the mesh is not static, however as soon as the mesh is set to static for culling calculation, it stops working. By not working, I mean that the hundreds of instances of the mesh's transforms are reset and all are placed at 0,0,0.

How can I properly combine mesh LOD with culling?

If you're swapping a mesh then it isn't really static. When you mark objects static you "make a promise" to Unity that your object will be STATIC, i.e. you won't move them around and so on, then Unity can precompute some things (like apply transform to the mesh).

I don't think you need make objects static in order to have culling. Culling works in any way. IIRC, depending on Static Unity does static or dynamic batching.

I changed the code to enable / disable the renderer rather than swap out the mesh.

I can now set the object to static and use culling with no problems.

I have a parent with two gameobjects, (hi and low poly versions), I then place the LOD script on the parent and assign the hi / low versions, set to static then save as prefab.

Script:

/////////////////////////////////////////////////

    var highLod : GameObject;
    var lowLod : GameObject;
    var distance = 10.0;

    function Update ()
    {
        var campos = Camera.main.transform.position;
        if( (transform.position - campos).sqrMagnitude <
            distance * distance )
        {
            // use high LOD
            if( highLod.renderer.enabled == false){
                lowLod.renderer.enabled = false;
                highLod.renderer.enabled = true;
            }
        }
        else
        {
            // use low LOD
            if( highLod.renderer.enabled == true){
                highLod.renderer.enabled = false;
                lowLod.renderer.enabled = true;
            }
        }
    }

/////////////////////////////////////////////////