There are several things that can keep Geoms from being combined together.
Most commonly, it’s the render state. Geoms that have a different render state cannot be merged. (This is for the simple reason that each Geom is a single call. Panda has to change the render state, render the Geom, change the render state, render the next Geom, and so on.) So if some of your Geoms have a TransparencyAttrib and some do not, they will be kept separate. Also, if some of them have texture A applied, and some have texture B applied, they will be kept separate.
Also, Geoms with a different vertex format cannot be combined. So if some of your polygons have normals and some don’t, for instance, they will be kept separate. Similarly for named texture coordinates.
Also, Geoms cannot contain more than a certain number of vertices. This limit is determined by your graphics card. There is one limit to the total number of vertices in the GeomVertexData, and a separate limit to the total number of vertices referenced by each Geom. So if you have many thousands of vertices here, Panda may need to separate them into different Geoms just to satisfy the limits of your graphics card.
Finally, a single Geom cannot contain combinations of points, lines, and polygons; each Geom must be all points, all lines, or all polygons.
If you’re not sure which case is causing your Geoms to be kept separate here, you can examine your Geoms one at a time, like this, after flatten:
gnp = root.find('**/model/+GeomNode')
gn = gnp.node()
for i in range(gn.getNumGeoms()):
print "Geom %s:" % (i)
There is also a possibility that the ModelRoot and/or the Character node are interfering with the flattening (that’s what a ModelRoot means–“don’t flatten this node”). I don’t think they’re supposed to prevent Geoms from being combined, though, so that’s probably not the problem, but it might be worth doing a find to the Geom node and trying another flattenStrong() from there just to prove it.