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")
"""