Skip to content

File parser.py

File List > gldemo > parser.py

Go to the documentation of this file

# Hacked together obj parser


import sys

triangles = []
mats = []
result = ""
triangles.append([(0,0,0),(0,0,0),(0,0,0),(0,0,0)])
#triangles.append([(100,100,800),(80,150,200),(200,200,1),(255,255,255)]);

global_verts = []
global_normals = []

objects = []

num_normals = 0
with open(sys.argv[1], 'r') as f:
    print("// Parsing " + sys.argv[1] + " for obj data")
    currentMat = ""
    for line in f:
        splitLine = line.rstrip().replace("  ", " ").split(' ')

        if splitLine[0] == 'o':
            objects.append({"name":splitLine[1], "vert_indices":[], "normal_indices":[]})
            # print("New object being parsed: name = " + splitLine[1])

        if splitLine[0] == 'v':
            for member in splitLine:
                if member.isspace():
                    splitLine.remove(member)
            global_verts.append((float(splitLine[1]),float(splitLine[2]), float(splitLine[3])))
        if splitLine[0] == 'vn':
            global_normals.append((float(splitLine[1]),float(splitLine[2]), float(splitLine[3])))
            num_normals += 1
        if splitLine[0] == 'f':

            v0_idx = int(splitLine[1].split('/')[0])-1
            v1_idx = int(splitLine[2].split('/')[0])-1
            v2_idx = int(splitLine[3].split('/')[0])-1

            objects[-1]["vert_indices"].append((v0_idx, v1_idx, v2_idx))

            # Get indices of vertex normals
            n0_idx = int(splitLine[1].split('/')[2])-1
            n1_idx = int(splitLine[2].split('/')[2])-1
            n2_idx = int(splitLine[3].split('/')[2])-1

            objects[-1]["normal_indices"].append((n0_idx, n1_idx, n2_idx))




print("// Autogenerated by parser.py")
print("// Total objects: " + str(len(objects)) + "\n")

print("#ifndef MODEL_HH")
print("#define MODEL_HH")
print("#if defined(_WIN32) || defined(_WIN64)")
print("#include ")
print("#endif")

print("#include ")

for obj in objects:
    print("static constexpr int " + (obj["name"].replace('.', '').capitalize()) + "_NUM_TRIANGLES = " + str(len(obj["vert_indices"])) + ";")
    print("static constexpr int " + (obj["name"].replace('.', '').capitalize()) + "_NUM_NORMALS = " + str(len(obj["normal_indices"])) + ";")
    print("static GLfloat " + obj["name"].replace('.', '') + "_vertex_data[] = {")
    for tri in obj["vert_indices"]:
        for vert_idx in tri:
            vertex = global_verts[vert_idx]
            print("\t" + str(vertex).strip("()") + ",")
    print("};")

    print("static GLfloat " + obj["name"].replace('.', '') + "_normal_data[] = {")
    for tri in obj["normal_indices"]:
        for norm_idx in tri:
            normal = global_normals[norm_idx]
            print("\t" + str(normal).strip("()") + ",")
    print("};")

print("#endif")

"""
index = 0
for facegroup in faces:
    print("// Material group " + str(index) + ", " + str(len(facegroup)) + " faces in group");
    print("var " + sys.argv[2] + "_group" + str(index) + "_poly_data = [")
    index += 1
    for face in facegroup[:-1]:
        print("\t" + str(face).strip("()") + ",")
    print("\t" + str(facegroup[-1]).strip("()"))
    print("];\n")

print("// Parsed " + str(len(faces)) + " material groups end autogenerated section")

"""