So I am using ArrayMeshes to procedurally generate terrain. I am trying to add LOD support, and I am compiling the index arrays and passing them in like so:
'

	surfaceArray[(int)Mesh.ArrayType.Vertex] 	= vertices.ToArray();
	surfaceArray[(int)Mesh.ArrayType.Normal] 	= normals.ToArray();
	surfaceArray[(int)Mesh.ArrayType.TexUV] 	= uvs.ToArray();
	surfaceArray[(int)Mesh.ArrayType.Index]		= indexesFull.ToArray();
	surfaceArray[(int)Mesh.ArrayType.TexUV2] 	= uv2s.ToArray();

	lodDictionary.Clear();
	if(indexesHalf.Count < indexesFull.Count)
		lodDictionary.Add(1,indexesHalf.ToArray());
	if(indexesMin.Count < indexesHalf.Count)
		lodDictionary.Add(2,indexesMin.ToArray());
	
	arrayMesh.ClearBlendShapes();
	arrayMesh.ClearSurfaces();
	arrayMesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, surfaceArray, null, lodDictionary);
	arrayMesh.RegenNormalMaps();

'
Which doesn't cause any errors, but it also doesn't seem to do anything either. That is the meshes always seem to use the full detail triangle indexes. I am checking to make sure there are fewer indexes in the LOD arrays because the way I have it working not all meshes benefit from this (sometimes they have the same number for more than one or all of the index arrays), and I am verifying that many of the meshes do have fewer triangles and do pass in these arrays. But these meshes don't show any change based on camera distance.

So I'm wondering two things: What is the floating point index in the dictionary really supposed to mean? The documentation says "key is roughly proportional to the distance at which the LOD stats being used" but I'm using very low numbers to test it and I'm not seeing any changes anywhere. Is there something else I need to be doing to make this work?

I think you should make sure you have Mesh LOD working at all and then move from there. See if the demo project can help you with that.

I spent some time looking over the demo project you linked and I'm not really sure how it's supposed to help me out here. The room that uses LODs is being loaded from a file. Any information on those LODs is buried in there. I'm using an ArrayMesh I'm compiling myself. Literally the only code exposed here is pressing the L key to toggle the Viewport's MeshLodThreshold property.

To clarify, the other levers I have identified that I have to pull are the Viewport's "MeshLodThreshold" property and the MeshInstance3D's "lodBias" property.

The LodBias property is supposed to force the lowest level of detail at 0, so I'm setting LodBias to 0 on my MeshInstances as an experiment (and it's still using the higher detail indexes). Similarly, a high MeshLodThreshold value is supposed to force a lower level of detail, so I'm setting that to 1000, which also isn't having any impact.

In addition to visual inspection, RenderingInfo is reporting the exact same number of primatives when I toggle LOD on and off on the Viewport.

I have gone through and manually applied my lower detail index arrays as the primary index array for the ArrayMesh (not using LODs) and have confirmed that they are set up as intended.

I feel like there must be some top level property or Camera property that I'm missing here but I don't see anything in the documentation.