Okay, it seems like the winding order for the side faces might be incorrect, causing them to be culled (not rendered) when viewed from the outside. Let's reverse the order of vertices for the side triangles.
You're right, my apologies. The winding order for the side faces was still incorrect. Let's explicitly reverse the order of the vertices for the two triangles that make up each side quad.
Okay, I understand. The issue is that the vertical side faces of adjacent hexagons don't connect when the hexagons are at different heights, leaving gaps.
To fix this, instead of drawing vertical sides straight down, we need to create "skirt" faces that connect the top edge of one hexagon to the corresponding top edge of its neighbor. This will fill the gaps between hexagons of different heights.
This requires a two-pass approach: first, calculate and store the height of all hexagon centers, and second, generate the geometry, using the stored heights to find neighbor heights and create the connecting skirt faces.