Created
March 18, 2011 07:38
-
-
Save z0w0/875742 to your computer and use it in GitHub Desktop.
A python program for converting 3d wavefront models (.obj) to Blockland brick files (.blb). @blockland.us
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
OBJ2BLB by Zack0Wack0 | |
zack0wack0.com | |
""" | |
import sys,decimal | |
vertices = [] | |
normals = [] | |
uvs = [] | |
topquads = [] | |
bottomquads = [] | |
northquads = [] | |
westquads = [] | |
southquads = [] | |
eastquads = [] | |
omniquads = [] | |
facecount = 0 | |
def join(list,delim): | |
string = None | |
for obj in list: | |
if string == None: | |
string = obj | |
else: | |
string = string + delim + obj | |
return string | |
def read(file): | |
input = open(file,"r") | |
for line in input.readlines(): | |
line = line.strip() | |
if not line: | |
continue | |
if line[0] == "#": | |
continue | |
tokens = line.split() | |
if not tokens: | |
continue | |
if tokens[0] == "v": | |
vert = [tokens[1:][0],tokens[1:][2],str(decimal.Decimal(tokens[1:][1]) * 3)] | |
vertices.append(vert) | |
continue | |
if tokens[0] == "vn": | |
normals.append(tokens[1:]) | |
continue | |
if tokens[0] == "vt": | |
uvs.append(tokens[1:]) | |
continue | |
if tokens[0] == "f": | |
face = tokens[1:] | |
facefix = [] | |
count = -1 | |
for token in face: | |
count = count + 1 | |
facefix.append(face[count].split("/")) | |
face = facefix | |
if len(face) == 3: | |
face.append(face[0]) | |
if len(face) >= 3: | |
if normals[int(face[0][2])-1][2] == "1": | |
topquads.append(face) | |
elif normals[int(face[0][2])-1][2] == "-1": | |
bottomquads.append(face) | |
elif normals[int(face[0][2])-1][1] == "1": | |
northquads.append(face) | |
elif normals[int(face[0][2])-1][0] == "1": | |
eastquads.append(face) | |
elif normals[int(face[0][2])-1][1] == "-1": | |
southquads.append(face) | |
elif normals[int(face[0][2])-1][0] == "-1": | |
westquads.append(face) | |
else: | |
omniquads.append(face) | |
else: | |
omniquads.append(face) | |
continue | |
input.close() | |
def write(file): | |
output = open(file + ".blb","w") | |
output.write("? ? ? (INSERT OVERALL SIZE)\nSPECIAL\n\n? (INSERT BRICK GRID)\n\n? (INSERT COLLISION DATA)\n\nCOVERAGE: //TBNESW\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n") | |
output.write("----------------top quads:\n" + str(len(topquads)) + "\n\n") | |
for face in topquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------bottom quads:\n" + str(len(bottomquads)) + "\n\n") | |
for face in bottomquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------north quads:\n" + str(len(northquads)) + "\n\n") | |
for face in northquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------west quads:\n" + str(len(westquads)) + "\n\n") | |
for face in westquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------south quads:\n" + str(len(southquads)) + "\n\n") | |
for face in southquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------east quads:\n" + str(len(eastquads)) + "\n\n") | |
for face in eastquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
output.write("----------------omni quads:\n" + str(len(omniquads)) + "\n\n") | |
for face in omniquads: | |
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n") | |
if len(face[0]) >= 1: | |
if vertices[int(face[0][0])-1] != None: | |
output.write(join(vertices[int(face[0][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[1][0])-1] != None: | |
output.write(join(vertices[int(face[1][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[2][0])-1] != None: | |
output.write(join(vertices[int(face[2][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if vertices[int(face[3][0])-1] != None: | |
output.write(join(vertices[int(face[3][0])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("UV COORDS:\n") | |
if len(face[0]) >= 2: | |
if uvs[int(face[0][1])-1] != None: | |
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[1][1])-1] != None: | |
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[2][1])-1] != None: | |
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if uvs[int(face[3][1])-1] != None: | |
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n") | |
output.write("NORMALS:\n") | |
if len(face[0]) >= 3: | |
if normals[int(face[0][2])-1] != None: | |
output.write(join(normals[int(face[0][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[1][2])-1] != None: | |
output.write(join(normals[int(face[1][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[2][2])-1] != None: | |
output.write(join(normals[int(face[2][2])-1]," ") + "\n") | |
else: | |
output.write("? ? ?\n") | |
if normals[int(face[3][2])-1] != None: | |
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n") | |
else: | |
output.write("? ? ?\n\n") | |
else: | |
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n") | |
read(sys.argv[1]) | |
write(sys.argv[1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment