blender to C++ exporter for vertices and normals of triangulated mesh for CULL_FACE

Modified so that the front-sides are directed in their normals.
(faces's normal. not vertex's normal)

import bpy

def cross(u, v):
    return [u[1]*v[2]-u[2]*v[1], u[2]*v[0]-u[0]*v[2], u[1]*v[2]-u[2]*v[1]]
    
def dot(u, v):
    return u[0]*v[0]+u[1]*v[1]+u[2]*v[2]
    
def diff(u, v):
    return [u[0]-v[0], u[1]-v[1], u[2]-v[2]]

ao = bpy.context.active_object

lineNum = 0
f = open("Obj.cpp", "w")

# vertices
lineNum = 0
i = 0
l = []
f.write("GLfloat Obj::vtx_src[] = {\n")
for v in ao.data.vertices:
    i += 1
    n = v.normal
    f.write("%f, %f, %f,\n"% (v.co.x, v.co.y, v.co.z))
    if i%10 == 0:
        f.write("// line %d\n" %i)
        
f.write("};\n\n")

# normals
lineNum = 0
i = 0
l = []
f.write("GLfloat Obj::nml_src[] = {\n")
for v in ao.data.vertices:
    i += 1
    n = v.normal
    f.write("%f, %f, %f,\n"% (n.x, n.y, n.z))
    if i%10 == 0:
        f.write("// line %d\n" %i)
        
f.write("};\n\n")

#indices
lineNum = 0
i = 0
f.write("GLushort Obj::idx_src[] = {\n")
for p in ao.data.polygons:
    l = []
    n = p.normal
    for ek in p.edge_keys:
        for v in ek:
            if v.numerator not in l:
                l.append(v.numerator)
    vh = []
    for id in l:
        vh.append(ao.data.vertices[id].co)
    vv = cross(diff(vh[1], vh[0]), diff(vh[2],vh[0]))
    if dot(n, vv) < 0.0:
        l[1], l[2] = l[2], l[1]
    f.write("%d, %d, %d,\t"% (l[0], l[1], l[2]))
    i += 1
    if i%4 == 0:
        f.write("\n") 
        lineNum += 1
        if lineNum%10 == 0:
            f.write("// line %d\n" %lineNum)
        
f.write("};\n")

f.close()