Although a glDrawMultiElementsEXT would be nice I would be happy if there were just two different glShadeModel functions, one for colors and one for normals, which I can’t see why that would be difficult to implement.
When I use glDrawElements with GL_FLAT shading and the texture mapping I still have to play with the arrays a bit to make sure that the last index for each face doesn’t point to the same vertex (or normal) position otherwise the normal for one of the faces will be wrong.
If they do happen to collide then I either reorder the vertices for that triangle so they don’t clash or duplicate that vertex.
An example would be:
Triangle 1 (45,56,78)
Triangle 2 (56,90,78)
Now with this example the normal used is the one at position 78 but this is used for both triangles. To solve this I either reorder one of the triangles, e.g.
Triangle 1 (45,56,78)
Triangle 2 (78,56,90)
Now the normals are from different vertex positions so no clash or I just duplicate a vertex and make the second triangle point to the new vertex.
The former can be quite complex on a large mesh since changing one face can impact on neighbouring faces. The latter involves extra vertices but when used in combination with the former I have found very few to be duplicate.
So essentially, I have GL_FLAT for normals and GL_SMOOTH for the texture coordinates.
All I need is GL_FLAT for the normals and GL_SMOOTH for the colours and replace my texture coordinates with colour information.
As for the point about not needing performance - it couldn’t be farther from the truth. I agree with your conclusions where PCs are concerned because people can change their graphics cards every 6 months.
However, we work with people on Sun and SGI workstations which, due to their cost, can’t be changed so regularly. If we take, for example, an SGI Power Indigo2 with Impact graphics. The rendering rate for this graphics card is very high but the low-end version doesn’t have texture-mapping in hardware so I can go from rendering speeds of millions of triangles per second to watching each triangle be drawn slowly just by enabling texture mapping.